> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trycontinuum.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Server reference

> The protocol details of the Continuum MCP server: endpoints, transport, sign-in, sessions, brand scope, confirmations, result codes, limits, and jobs.

This page is for developers, admins, and anyone building an agent on Continuum. You don't need any of it to use Continuum from Claude or ChatGPT; [Connect your assistant](https://docs.trycontinuum.ai/quickstart.md#connect-your-assistant) is enough. For the tools themselves, see the [tool reference](https://docs.trycontinuum.ai/mcp/tools.md).

## Endpoints

| Endpoint | Use it for |
| - | - |
| `https://api.trycontinuum.ai/mcp` | Claude, Claude Code, Cursor, VS Code, Codex, and every other MCP client. |
| `https://api.trycontinuum.ai/mcp/chatgpt` | ChatGPT. Same tools and sign-in. Long results come back as a one-line summary, with the full data in `structuredContent`, and images aren't inlined. |

The server identifies itself as `continuum-mcp`.

## Transport

Continuum speaks **Streamable HTTP**.

| Request | What it does |
| - | - |
| `POST` | Sends JSON-RPC messages. Responses are plain JSON. |
| `GET` | Opens a server-sent events stream for notifications, such as progress and tool-list changes. A comment is sent every 15 seconds to keep it open, and a dropped stream can resume with `Last-Event-Id`. |
| `DELETE` | Ends the session. |

## Sessions

* The server returns an `Mcp-Session-Id` on `initialize`. Send it on every later request.
* A request without a session ID that isn't an `initialize` gets `400`.
* A session with no activity and no open stream for 60 minutes is closed. If a request returns `404` with "Session expired or unknown", send `initialize` again.
* The server's `instructions` on `initialize` include a short guide for the assistant and the starting brand's published [pipelines](https://docs.trycontinuum.ai/canvas/pipelines.md).
* The tool list changes with your access, and the server sends `notifications/tools/list_changed` when it does.

## Authentication

Sign-in is **OAuth 2.1**. There are no API keys.

| Detail | Value |
| - | - |
| Flow | Authorization code with PKCE (`S256`). Clients are public; there's no client secret. |
| Client registration | Dynamic client registration, so clients register themselves. |
| Discovery | A `401` carries `WWW-Authenticate: Bearer realm="continuum-mcp", resource_metadata="…"`. Metadata is at `/.well-known/oauth-protected-resource/mcp` (or `…/mcp/chatgpt`) and `/.well-known/oauth-authorization-server`. |
| Token | Sent as `Authorization: Bearer <token>`. Clients refresh it on their own. |
| Consent | The person signs in to Continuum, picks a brand, and chooses **Allow access** or **Deny**. |

What a token can do comes from the person's brands and [roles](https://docs.trycontinuum.ai/settings/roles.md), not from OAuth scopes. Each person sees and revokes their connections under **Settings → Connections**.

## Brand scope

Every call works on one brand.

* A session starts on the brand the person last chose in their assistant, otherwise their active brand in the app, otherwise the first brand they can reach.
* `brands_select` switches the brand for the rest of the session. `brands_list` shows the choices.
* To act on another brand for one call, set `_meta.brand_id`. Access is still checked.
* Every result includes `_brandContext`, with the brand and a link to its Planner.

## Roles

| Role | Can call |
| - | - |
| **Viewer** | Reads: analytics, the brand book, the Library, the calendar, Forge, trends, and competitors. Asking Jaina or the Organic agent (`agent_ask`) needs Operator. |
| **Operator** | Reads, plus writes: drafts, publishing, the canvas, pipelines, video edits, ads, and Paid optimization approvals. |
| **Admin**, **Owner** | Everything an Operator can, plus final Forge renders. |

A tool whose reads need a connection, such as Meta, appears only when a brand you can reach has that connection.

## Confirmations

Publishing, ad and budget changes, live creative swaps, final Forge renders, and most deletions take two calls:

**1. Preview**

The first call returns a preview, a `confirm_token` (`tok_…`), and its `expires_at`. Nothing has happened yet. Tools that take a `mode` input use `mode: "preview"` for this call.

**2. Confirm**

After the person says yes, repeat the call with the **same arguments** and the `confirm_token` (and `mode: "confirm"` where the tool takes a `mode`).

| Detail | Behavior |
| - | - |
| Lifetime | Set per action and returned as `expires_at`: 10 minutes for ad changes and bulk calendar status changes, 15 minutes for a post approved for publishing, 30 minutes for a `content_reference` remake, 24 hours for a proposed week plan, 5 minutes for the rest. |
| Single use | Each token works once. |
| Bound | Tied to the person, the brand, and the exact arguments. Changed arguments return `VALIDATION_ERROR`. |
| Missing or expired | Returns `CONFIRMATION_REQUIRED`. Preview again. |
| Admin approval | Activating ads, raising a budget past the brand's spend limit (by default, more than 30% at once), or any write on a brand with an approval chain returns `APPROVAL_REQUIRED`. An Admin or Owner grants that exact token with `mcp_approval_grant {"token": "…"}` (`mcp_approvals_list` shows what's waiting); then confirm as usual. |

Forge uses its own pair: `render_preview` or `scene_fill` returns a `confirmationToken`, and `render_confirm` or `scene_render` redeems it. Forge `set_delete` is the one deletion with no preview: it deletes immediately, so call it only after an explicit yes. The [tool reference](https://docs.trycontinuum.ai/mcp/tools.md) lists each tool's confirmation behavior.

Clients that support elicitation may also show a confirmation dialog for ad changes. See [You stay in control](https://docs.trycontinuum.ai/mcp/control.md) for the full list of what waits and what happens right away.

## Results that ask for something

These come back as normal results, not errors. Each tells the assistant what to do next.

| Status | Meaning | Next step |
| - | - | - |
| `needs_brand` | No brand is active. | `brands_select` |
| `needs_integration` | The brand needs a connection, named in `platform`. | `integrations_connect` returns a single-use link that works for 10 minutes. |
| `needs_reauth` | A connection has lapsed. Reads still work; writes don't. | Reconnect with the link in `fix`. |
| `needs_role` | The person's role is below `required_role`. | Ask an Admin or Owner. |
| `needs_account` | Several accounts match. | Pick one from `accounts_list`. |
| `needs_workspace`, `needs_open_canvas` | The canvas has to be open in Continuum. | Open `open_url`, then retry. |
| `needs_correction` | A question went to the wrong agent. | Ask the `suggested_target`. |

## Errors

Errors set `isError: true`. `structuredContent` holds `{ ok: false, code, message, details }`.

| Code | Meaning |
| - | - |
| `UNAUTHENTICATED` | The token is missing or invalid. |
| `SESSION_NOT_INITIALIZED` | Send `initialize` first. |
| `BRAND_NOT_SELECTED` | No brand is active. Tools that are always listed report the same thing as the `needs_brand` status; either way, call `brands_select`. |
| `PERMISSION_DENIED`, `BRAND_FORBIDDEN`, `ACCOUNT_FORBIDDEN` | The person can't reach that brand, account, or action. |
| `VALIDATION_ERROR` | The inputs are wrong, or they changed since a preview. |
| `CONFIRMATION_REQUIRED`, `APPROVAL_REQUIRED` | See [Confirmations](#confirmations). |
| `INTEGRATION_REQUIRED`, `INTEGRATION_DISCONNECTED` | Connect or reconnect the platform. |
| `RATE_LIMITED` | Wait `details.retry_after_seconds`. See [Limits](#limits). |
| `NOT_FOUND` | The item doesn't exist, or the brand can't see it. |
| `CONFLICT`, `IDEMPOTENCY_CONFLICT` | The item changed, or a repeated request didn't match the first. |
| `MEDIA_INVALID` | The file can't be used. |
| `VOICE_VIOLATION` | The copy breaks the brand voice. |
| `META_API_ERROR`, `UPSTREAM_ERROR` | Meta or another service returned an error. |
| `JOB_PENDING` | The job is still running. |
| `INTERNAL` | Something went wrong on our side. Contact support if it repeats. |

## Limits

Limits protect your budget and your connected accounts. `RATE_LIMITED` includes `retry_after_seconds`, and per-tool limits also include `tool`, `budget`, and `window_seconds`.

| Limit | Current value | Per |
| - | - | - |
| Calls, all tools | 600 a minute | Person and brand |
| Canvas runs (`studio_workflow`) | 10 an hour | Brand |
| Trend discovery | 10 an hour | Brand |
| Connection links | 10 an hour | Person |
| Meta ad changes (`paid_manage`) | 60 an hour | Brand |
| Publishing / approvals / deletions (`content_create`) | 30 / 60 / 30 an hour | Brand |
| Calendar changes / week plans (`planner_manage`) | 120 / 20 an hour | Brand |
| Pipeline runs | 10 per call | Call |

## Jobs

Reports, agent answers, and generations run as jobs and return a `job_id`.

* `jobs_status` takes only `job_id` and returns `pending`, `running`, `completed`, `failed`, or `cancelled`. Leave a few seconds between checks rather than polling in a tight loop. For an agent answer, `result.status` is `completed` (it wrote a draft or plan) or `needs_followup` (text only).
* Pass `_meta.progressToken` on the call to receive `notifications/progress`.
* Pipeline runs report through `pipeline_run_status`: `queued`, `running`, `completed`, `refused`, `failed`, or `indeterminate`.

## Prompts

| Prompt | Arguments, all optional |
| - | - |
| `analytics-weekly-review` | `date_window` |
| `analytics-top-and-bottom-posts` | `platform`, `metric`, `date_window` |
| `analytics-top-and-bottom-ads` | `platform`, `kpi`, `date_window` |

## Activity log

Every tool call is logged with the tool, action, status (`ok`, `error`, `denied`, or `rate_limited`), duration, brand, and client. Arguments are stored only as a fingerprint, never in full. Each person sees their own calls under **Settings → Activity**, filtered by status, client, or tool.

## What's next

* [Tool reference](https://docs.trycontinuum.ai/mcp/tools.md): Every tool, its inputs, examples, and errors.
* [Agent brief](https://docs.trycontinuum.ai/mcp/agent-brief.md): How an assistant should use these tools well.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.