{"openapi":"3.1.0","info":{"title":"Morgen (BYOK) API","version":"0.1.0","description":"Morgen (BYOK) lets an AI assistant read your own Morgen data through the Morgen API with a key you supply (Morgen API key (plan with API access)). Read-only: 6 tools (list_calendars, list_events, list_tasks, get_task, list_tags, get_tag). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever sent to api.morgen.so. Unofficial...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-morgen.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-morgen/docs"},"termsOfService":"https://connectorbay.com/byok-morgen/terms"},"servers":[{"url":"https://byok-morgen.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-morgen/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_calendars":{"post":{"operationId":"list_calendars","summary":"List every calendar across the calendar accounts connected to Morgen, with account id, provider, name, colour and your a","description":"List every calendar across the calendar accounts connected to Morgen, with account id, provider, name, colour and your access rights. Costs 10 of the 300 rate-limit points per 15 minutes. Use for \"Which calendars do I have connected in Morgen\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_calendarsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_events":{"post":{"operationId":"list_events","summary":"List events of calendars that belong to ONE account in a time window (at most 6 months); recurring events are expanded. ","description":"List events of calendars that belong to ONE account in a time window (at most 6 months); recurring events are expanded. Get account and calendar ids from list_calendars. Costs 10 of the 300 rate-limit points per 15 minutes. Use for \"What meetings do I have between 1 and 8 November in Morgen\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Calendar account id (accountId from list_calendars).","maxLength":200,"title":"Account Id","type":"string"},"calendar_ids":{"description":"Comma-separated calendar ids, all from the same account.","maxLength":200,"title":"Calendar Ids","type":"string"},"start":{"description":"Window start, ISO 8601, for example 2026-11-01T00:00:00Z.","maxLength":200,"title":"Start","type":"string"},"end":{"description":"Window end, ISO 8601, later than start and at most 6 months after it.","maxLength":200,"title":"End","type":"string"}},"required":["account_id","calendar_ids","start","end"],"title":"list_eventsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tasks":{"post":{"operationId":"list_tasks","summary":"List your open Morgen tasks with title, due date, priority and progress, optionally only those changed after a time. Com","description":"List your open Morgen tasks with title, due date, priority and progress, optionally only those changed after a time. Completed tasks are not listed. Costs 10 of the 300 rate-limit points per 15 minutes. Use for \"What open tasks do I have in Morgen\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many tasks to return (1 to 100). Morgen returns only 1 if this is left out, so it defaults to 50 here.","title":"Limit"},"updated_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only tasks created or updated after this ISO 8601 time.","title":"Updated After"}},"title":"list_tasksArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_task":{"post":{"operationId":"get_task","summary":"Get one Morgen task by id. An unknown id gives an empty task, and a deleted task is returned with deleted set to true. U","description":"Get one Morgen task by id. An unknown id gives an empty task, and a deleted task is returned with deleted set to true. Use for \"Show the Morgen task with a given id\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Morgen task id (from list_tasks).","maxLength":200,"title":"Id","type":"string"}},"required":["id"],"title":"get_taskArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tags":{"post":{"operationId":"list_tags","summary":"List your Morgen tags (id, name, colour) used to classify events and tasks. Use for \"Which tags do I use in Morgen\".","description":"List your Morgen tags (id, name, colour) used to classify events and tasks. Use for \"Which tags do I use in Morgen\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Maximum number of tags to return.","title":"Limit"}},"title":"list_tagsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_tag":{"post":{"operationId":"get_tag","summary":"Get one Morgen tag's name and colour by id. Use for \"What is the Morgen tag with a given id\".","description":"Get one Morgen tag's name and colour by id. Use for \"What is the Morgen tag with a given id\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Tag id (UUID, from list_tags).","maxLength":200,"title":"Id","type":"string"}},"required":["id"],"title":"get_tagArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}