{"openapi":"3.1.0","info":{"title":"OghmaNotes Agent Action Guide","version":"2026-07-20","summary":"Structured public and authenticated action contracts for agents helping humans use OghmaNotes.","description":"Agents must obtain explicit human confirmation before registering accounts, submitting contact forms, sending messages, importing data, or querying authenticated study material.","contact":{"email":"contact@oghmanotes.ie","url":"https://oghmanotes.ie/contact"}},"servers":[{"url":"https://oghmanotes.ie"}],"externalDocs":{"description":"Canonical Markdown agent profile","url":"https://oghmanotes.ie/ai.md"},"paths":{"/info":{"get":{"summary":"Compact human and agent-readable product profile","description":"Returns HTML by default. Returns compact Markdown when Accept includes text/markdown or when format=md is supplied.","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["md","markdown"]}}],"responses":{"200":{"description":"Compact profile as HTML or Markdown","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getInfo","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/info.md":{"get":{"summary":"Compact Markdown product and agent factsheet","responses":{"200":{"description":"Compact Markdown profile","content":{"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getInfoMd","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/ai":{"get":{"summary":"Human and agent-readable AI profile","description":"Returns HTML by default. Returns Markdown when Accept includes text/markdown or when format=md is supplied.","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["md","markdown"]}}],"responses":{"200":{"description":"AI profile as HTML or Markdown","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getAi","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/ai.md":{"get":{"summary":"Canonical Markdown AI and agent profile","responses":{"200":{"description":"Markdown profile","content":{"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getAiMd","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/llms.txt":{"get":{"summary":"Compact LLM index","responses":{"200":{"description":"Compact plain-text profile","content":{"text/plain":{"schema":{"type":"string"}}}}},"operationId":"getLlmsTxt","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/llms-full.txt":{"get":{"summary":"Full plain-text agent profile","responses":{"200":{"description":"Full plain-text profile","content":{"text/plain":{"schema":{"type":"string"}}}}},"operationId":"getLlmsFullTxt","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/agents.md":{"get":{"summary":"Full Markdown agent action guide","responses":{"200":{"description":"Full Markdown profile with action guidance","content":{"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getAgentsMd","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/faq.md":{"get":{"summary":"FAQ-only Markdown","responses":{"200":{"description":"Markdown FAQ","content":{"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getFaqMd","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/pricing.md":{"get":{"summary":"Pricing-only Markdown","responses":{"200":{"description":"Markdown pricing summary","content":{"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getPricingMd","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/auth.md":{"get":{"summary":"auth.md new-user registration instructions","description":"Agent registration instructions. This v1 flow never issues an API credential or private-data access.","responses":{"200":{"description":"auth.md instructions","content":{"text/markdown":{"schema":{"type":"string"}}}}},"operationId":"getAuthMd","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/agent/identity":{"post":{"summary":"Start an agent-initiated new-user registration","description":"Creates a 15-minute claim for an email that does not already have an OghmaNotes account. The user must complete password creation and email verification in the browser. No access token is issued.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","login_hint"],"properties":{"type":{"type":"string","enum":["service_auth"]},"login_hint":{"type":"string","format":"email","maxLength":255}}}}}},"responses":{"201":{"description":"Claim URI and user code returned"},"400":{"description":"Invalid registration request"},"409":{"description":"Existing account or pending claim"},"429":{"description":"Rate limited"}},"operationId":"postAgentIdentity","tags":["Auth"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","x-human-confirmation-required":true}},"/agent/identity/claim":{"post":{"summary":"Poll an agent registration claim","description":"Reports pending, registered, or verified status. It never returns an API credential.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["claim_token"],"properties":{"claim_token":{"type":"string","minLength":64,"maxLength":64}}}}}},"responses":{"200":{"description":"Current claim status"},"400":{"description":"Invalid or expired claim"},"429":{"description":"Rate limited"}},"operationId":"postAgentIdentityClaim","tags":["Auth"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/agent/identity/claim/complete":{"post":{"summary":"Complete an agent registration claim with OAuth","description":"Requires an Auth.js browser session whose provider-verified email matches the new-user claim. It never returns an API credential.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["claim_token","user_code"],"properties":{"claim_token":{"type":"string","minLength":64,"maxLength":64},"user_code":{"type":"string","pattern":"^[0-9]{6}$"}}}}}},"responses":{"200":{"description":"Registration verified"},"400":{"description":"Mismatched or expired claim"},"401":{"description":"OAuth browser session required"},"429":{"description":"Rate limited"}},"operationId":"postAgentIdentityClaimComplete","tags":["Auth"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/agent-sitemap.xml":{"get":{"summary":"Sitemap for machine-readable resources","responses":{"200":{"description":"XML sitemap for agent and LLM resources","content":{"application/xml":{"schema":{"type":"string"}}}}},"operationId":"getAgentSitemapXml","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/agent-api.json":{"get":{"summary":"Structured agent API document","description":"OpenAPI-style endpoint guide for agents helping users navigate and operate OghmaNotes.","responses":{"200":{"description":"Structured API document","content":{"application/json":{"schema":{"type":"object"}}}}},"operationId":"getAgentJson","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/openapi.json":{"get":{"summary":"Standard OpenAPI alias","description":"Same structured endpoint guide as /agent-api.json, exposed under a conventional OpenAPI URL.","responses":{"200":{"description":"Structured API document","content":{"application/json":{"schema":{"type":"object"}}}}},"operationId":"getOpenapiJson","tags":["Discovery"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/api/auth/register":{"post":{"summary":"Create a user account","description":"Creates an account and requires email verification. Agents should prefer the browser-visible registration flow and must not store user passwords.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email","maxLength":255},"password":{"type":"string","minLength":8,"maxLength":128}}}}}},"responses":{"201":{"description":"Account created; email verification required","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"requiresVerification":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Validation failed"},"409":{"description":"User already exists"},"429":{"description":"Rate limited"}},"operationId":"postAuthRegister","tags":["Auth"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","x-human-confirmation-required":true}},"/api/auth/login":{"post":{"summary":"Create an authenticated session","description":"Signs in a verified user and sets session cookies. Agents should use a user-controlled browser session rather than requesting credentials in chat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email","maxLength":255},"password":{"type":"string","maxLength":128},"rememberMe":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Authenticated session created"},"401":{"description":"Invalid email or password"},"403":{"description":"Email verification required or inactive account"},"429":{"description":"Rate limited or account temporarily locked"}},"operationId":"postAuthLogin","tags":["Auth"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}},"/api/chat":{"post":{"summary":"Ask an authenticated study question","description":"Requires an authenticated session cookie. Agents must get confirmation before sending private study material or questions on behalf of a user.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","maxLength":2000},"stream":{"type":"boolean","default":false},"useRag":{"type":"boolean","default":true},"noteId":{"type":"string"},"noteTitle":{"type":"string"},"noteIds":{"type":"array","items":{"type":"string"}},"folderIds":{"type":"array","items":{"type":"string"}},"sessionId":{"type":"string"},"history":{"type":"array","items":{"type":"object"}}}}}}},"responses":{"200":{"description":"Chat answer as JSON or server-sent events when stream=true"},"400":{"description":"Missing or too-long message"},"401":{"description":"Unauthorized"},"429":{"description":"Rate limited"}},"operationId":"postChat","tags":["Chat"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/notes":{"get":{"summary":"List authenticated user's notes","description":"Requires a signed-in session. Supports optional field selection and pagination.","parameters":[{"name":"fields","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated response fields."},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Array of notes and folders"},"401":{"description":"Unauthorized"}},"operationId":"getNotes","tags":["Notes"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true},"post":{"summary":"Create a note or folder","description":"Requires a signed-in session. Agents should ask before creating content for a user.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":500},"content":{"type":"string"},"isFolder":{"type":"boolean"},"is_folder":{"type":"boolean"},"pid":{"type":"string","description":"Optional parent folder note ID."}}}}}},"responses":{"201":{"description":"Created note or folder"},"400":{"description":"Validation failed"},"401":{"description":"Unauthorized"}},"operationId":"postNotes","tags":["Notes"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/notes/{id}":{"get":{"summary":"Read one note","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"fields","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Note object"},"400":{"description":"Invalid note ID"},"401":{"description":"Unauthorized"},"404":{"description":"Note not found"}},"operationId":"getNotesId","tags":["Notes"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true},"patch":{"summary":"Update one note","description":"Requires a signed-in session. Updating content can refresh the note's search index.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":500},"content":{"type":"string"}}}}}},"responses":{"200":{"description":"Updated note object"},"400":{"description":"Validation failed"},"401":{"description":"Unauthorized"},"404":{"description":"Note not found"}},"operationId":"patchNotesId","tags":["Notes"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true},"delete":{"summary":"Soft-delete one note","description":"Requires a signed-in session and explicit human confirmation.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Deleted: { success: true }"},"400":{"description":"Invalid note ID"},"401":{"description":"Unauthorized"},"404":{"description":"Note not found"}},"operationId":"deleteNotesId","tags":["Notes"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/search":{"get":{"summary":"Search notes","description":"Requires a signed-in session. Searches notes by keyword or semantic mode.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","enum":["keyword","semantic"]}},{"name":"course","in":"query","required":false,"schema":{"type":"string"}},{"name":"exclude","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated note IDs to exclude in semantic mode."}],"responses":{"200":{"description":"Search results"},"400":{"description":"Invalid mode"},"401":{"description":"Unauthorized"}},"operationId":"getSearch","tags":["Search"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true}},"/api/global-search":{"get":{"summary":"Search notes, chats, and quiz courses","description":"Requires a signed-in session. Empty or short queries return recent items.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"Grouped results under notes, chats, and quizzes"},"401":{"description":"Unauthorized"},"429":{"description":"Rate limited"}},"operationId":"getGlobalSearch","tags":["Search"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true}},"/api/tree/children":{"get":{"summary":"List note tree children","description":"Requires a signed-in session. Use no parent_id for root children.","parameters":[{"name":"parent_id","in":"query","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Folder children"},"400":{"description":"Invalid parent_id"},"401":{"description":"Unauthorized"}},"operationId":"getTreeChildren","tags":["Notes"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true}},"/api/canvas/connect":{"get":{"summary":"Read Canvas connection state and visible courses","description":"Requires a signed-in session. Responses are no-store because they reflect private Canvas state.","responses":{"200":{"description":"Canvas connection state"},"401":{"description":"Unauthorized"}},"operationId":"getCanvasConnect","tags":["Canvas"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true},"post":{"summary":"Connect Canvas","description":"Requires a signed-in session. Agents must not ask users to paste Canvas tokens into chat; prefer the browser-visible settings flow.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain","token"],"properties":{"domain":{"type":"string","pattern":"^[\\w-]+\\.instructure\\.com$"},"token":{"type":"string","maxLength":4096}}}}}},"responses":{"200":{"description":"Canvas connected"},"400":{"description":"Invalid token or domain"},"401":{"description":"Unauthorized"},"429":{"description":"Rate limited"}},"operationId":"postCanvasConnect","tags":["Canvas"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true},"delete":{"summary":"Disconnect Canvas","description":"Requires a signed-in session and explicit human confirmation.","responses":{"200":{"description":"Canvas disconnected"},"401":{"description":"Unauthorized"}},"operationId":"deleteCanvasConnect","tags":["Canvas"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/canvas/sync":{"get":{"summary":"Check Canvas sync availability","responses":{"200":{"description":"Sync availability and active job state"},"401":{"description":"Unauthorized"}},"operationId":"getCanvasSync","tags":["Canvas"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true},"post":{"summary":"Queue a Canvas sync job","description":"Requires a signed-in session and explicit human confirmation because it imports private course material.","responses":{"200":{"description":"Queued job or reason sync was unavailable"},"401":{"description":"Unauthorized"}},"operationId":"postCanvasSync","tags":["Canvas"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/canvas/status":{"get":{"summary":"Read Canvas import progress","responses":{"200":{"description":"Active job, progress, issues, and recent logs"},"401":{"description":"Unauthorized"}},"operationId":"getCanvasStatus","tags":["Canvas"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true}},"/api/assignments":{"get":{"summary":"List assignments","description":"Requires a signed-in session. Supports status, course, archive, and time-window filters.","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"course","in":"query","required":false,"schema":{"type":"string"}},{"name":"all","in":"query","required":false,"schema":{"type":"string","enum":["1"]}},{"name":"includeArchived","in":"query","required":false,"schema":{"type":"string","enum":["1"]}},{"name":"windowDays","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":730}}],"responses":{"200":{"description":"Assignments"},"401":{"description":"Unauthorized"}},"operationId":"getAssignments","tags":["Assignments"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true},"post":{"summary":"Create a manual assignment","description":"Requires a signed-in session and explicit human confirmation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"course_name":{"type":"string"},"course_color":{"type":"string"},"due_at":{"type":"string","format":"date-time"},"estimated_hours":{"type":"number"}}}}}},"responses":{"201":{"description":"Created assignment"},"400":{"description":"Title is required"},"401":{"description":"Unauthorized"}},"operationId":"postAssignments","tags":["Assignments"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/calendar/token":{"get":{"summary":"Read private iCal subscription token","description":"Requires a signed-in session. Treat this token as private because it grants calendar feed access.","responses":{"200":{"description":"Current calendar export token"},"401":{"description":"Unauthorized"}},"operationId":"getCalendarToken","tags":["Calendar"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-private-data":true},"post":{"summary":"Rotate private iCal subscription token","description":"Requires a signed-in session and explicit human confirmation because old calendar URLs stop working.","responses":{"200":{"description":"New calendar export token"},"401":{"description":"Unauthorized"}},"operationId":"postCalendarToken","tags":["Calendar"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"sessionCookie":[]}],"x-human-confirmation-required":true,"x-private-data":true}},"/api/mcp/canvas":{"post":{"summary":"Internal Canvas MCP bridge","description":"Internal streamable HTTP MCP endpoint for Canvas tools. Requires an internal bearer token minted by OghmaNotes; it is not a public end-user MCP endpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"MCP JSON response"},"401":{"description":"Missing or invalid internal MCP token"},"403":{"description":"Canvas account not connected"},"500":{"description":"Canvas MCP request failed"}},"operationId":"postMcpCanvas","tags":["MCP"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions.","security":[{"internalMcpBearer":[]}],"x-internal-only":true,"x-private-data":true}},"/contact":{"get":{"summary":"Contact form for beta, support, billing, and pilots","description":"There is no first-party public contact POST API documented for agents. Agents should use the visible form with confirmation or draft an email to contact@oghmanotes.ie.","responses":{"200":{"description":"Contact page","content":{"text/html":{"schema":{"type":"string"}}}}},"operationId":"getContact","tags":["Contact"],"x-agent-guidance":"Prefer the browser-visible UI for credentials. Ask for explicit human confirmation before sensitive writes or private-data actions."}}},"tags":[{"name":"Discovery","description":"Public discovery and AI-readable resources."},{"name":"Auth","description":"Account creation and browser-session authentication."},{"name":"Notes","description":"Authenticated note and tree operations."},{"name":"Search","description":"Authenticated keyword, semantic, and global search."},{"name":"Chat","description":"Authenticated cited study chat over private material."},{"name":"Canvas","description":"Authenticated Canvas connection, sync, and import status."},{"name":"Assignments","description":"Authenticated coursework and manual assignment operations."},{"name":"Calendar","description":"Authenticated private iCal subscription token operations."},{"name":"MCP","description":"Internal MCP bridge endpoints."},{"name":"Contact","description":"Public contact routes."}],"components":{"securitySchemes":{"sessionCookie":{"type":"apiKey","in":"cookie","name":"session","description":"Authenticated browser session cookie. Auth.js session cookies may also be accepted by the app."},"internalMcpBearer":{"type":"http","scheme":"bearer","description":"Internal bearer token minted by OghmaNotes for the Canvas MCP bridge."}}}}