Scopes
Step-up means the scope is not requested on the initial connect. When a
tool that needs it is called, the server answers
403 with
error="insufficient_scope" and scope="<name>" in the WWW-Authenticate
header. MCP hosts treat that as a signal to re-run consent for the one extra
scope and retry.
conversations:read unlocks list_conversations
(rooms and pods by name; never a room’s messages). pods:read and
conversations:write are part of the advertised catalogue, but no tool
currently exposed on the MCP server requires them. They are reserved for
tools that are not yet shipped. Granting them today has no effect.Workspace access
A token names exactly one workspace. Every tool acts in that workspace and only that workspace; a document or conversation id from another workspace behaves exactly like an id that does not exist. The active workspace is chosen on the consent screen. A token without one, or for a workspace the person is not a member of, gets a tool error naming the fix; see Workspace errors. To act in a different workspace, re-authenticate the connection and choose the other workspace on consent.Document roles
Documents, pages and tables (“artifacts”) each have a scope and a set of roles. The token’s person holds one effective role per artifact, resolved by the same rules the web app uses.list_documents and read_comments report your role on each artifact so an
agent can decide what to attempt before it tries.
Refusals
Refusals use the app’s own wording and never reveal whether an artifact exists: an artifact you cannot see isArtifact not found, a viewer’s write
is This document is read-only for you, a commenter’s edit is You can comment on this document but not edit it. The full table is in
Permission refusals.
What an agent can never do
There is deliberately no share, grant, move, link, restore or delete tool. An agent connected over MCP can never widen who sees an artifact, and cannot restore an earlier version; those stay human actions in the app.How sign-in works
Sidecars uses OAuth 2.1 with the MCP authorization flow. There are no personal access tokens and no static bearer keys.- The MCP server is the resource server. It advertises its authorization
server at
/.well-known/oauth-protected-resource/mcp. - The host registers itself dynamically (Dynamic Client Registration or Client ID Metadata Documents), runs PKCE, and exchanges a code for a JWT access token.
- Every request carries
Authorization: Bearer <token>. The server verifies the signature, issuer, expiry and, when present, audience. Opaque tokens are refused. - A presented-but-invalid token is refused on every method, including public ones, so a stale credential fails immediately rather than at first use.
sub), the active workspace (org_id), the
OAuth client that obtained the token (client_id), the granted scopes and a
24-hour expiry.
Auditing and attribution
- Every tool call is recorded in the workspace’s agent activity history (tool name, argument digest, sizes, latency, outcome). Arguments themselves are not stored.
- Everything an agent writes lands as you, via the host. Version rows,
comments and cards show a “via” badge such as “Thomas · via Claude Code”.
The host name is the host’s own claim (its
User-Agentproduct token); the verified fact behind the badge is the OAuth client id. - Every document and page write checkpoints first. Checkpoints are undoable
in the app for a short period and restorable for longer; named versions
are kept indefinitely. See
get_document_versions.