Auth context shape
When the server accepts your connection, it resolves a context that looks like:Permissions
Every key carries a scope list, chosen when you mint it:read is the default. Calling a write tool with a read-only key returns a 403 with Insufficient scope — the check runs before the tool’s own logic, so nothing is written and no lookup happens.
A key cannot do more than the person who created it. Creating a key with write needs the member, admin or owner role on the brand. A viewer’s key is read-only, and that is checked on every call, so a key loses write as soon as its creator becomes a viewer.
Give an integration the narrowest scope that does its job. An agent that reports on visibility does not need write, and a read-only key cannot archive your tracked questions, launch paid ads or spend plan capacity if it leaks.
Keys created before permissions were enforced carry
read + write, because that is the access they have actually had. Check the Permissions column in Settings → API Keys and re-mint any that should be read-only.Transport options
stdio (self-hosted development)
Runs the MCP server as a local process against your own Citable database. It needs the same database credentials as the Citable backend, so it is not a way to connect to Citable’s hosted service. For that, use Streamable HTTP with an API key, including from Claude Desktop through themcp-remote bridge (see the overview).
Brand and user come from environment variables:
Streamable HTTP (remote agents)
Used by hosted agents and remote integrations. Auth is an API key in theAuthorization header:
(brand, user, api_key) tuple. The resolved API key id is recorded on the auth context so every write is traceable back to a specific key.
API key lifecycle
Create API keys in the Citable web app under Settings → API Keys. Each key:- Belongs to one user (the creator) and one brand
- Can be revoked anytime — revoked keys fail auth immediately
- Stops working when its creator is removed from the brand or the brand is deleted
- Records
last_used_aton every successful call
Rate limits
Calls are limited to 60 per minute per API key (requests that arrive before auth resolves are bucketed by client IP instead). The limit is currently flat — it does not vary by plan tier, and it counts reads and writes together. Response headers tell you where you stand:RateLimit-Reset is seconds until the window rolls over. Exceeding the limit returns a JSON-RPC error with Rate limit exceeded. If you need a higher limit for a specific integration, get in touch from your account.
Rate limiting is throughput protection, not an authorization control. Use the
read scope to stop an integration from writing.