Skip to main content
The MCP server authenticates with the same Titan API keys as the rest of the platform. There is no separate agent login and no OAuth flow—one key, sent as a bearer token.

Two layers of authorization

Every call passes two checks:
1

Connection check

The /mcp endpoint verifies the key is valid and carries at least one mcp:* scope. A key with no MCP scope cannot connect at all.
2

Per-tool check

Each tool then verifies its own scope. A key scoped only to mcp:search connects fine, but calling titan_fetch returns forbidden.
This is deliberate. It lets you issue a narrow key to an agent that should only ever search, without trusting the agent to restrain itself.

Scope per tool

Any agent that starts a run should also carry mcp:runs:read. Without it, a run that exceeds the synchronous wait window returns a run_id the agent cannot poll.

Create a key

Create keys with a JWT from an authenticated session:
The key in the response is shown once. Store it in a secret manager, not in a config file you commit. Grant the smallest set that does the job.
Scopes are fixed when a key is created and cannot be widened afterwards. To change what an agent can do, create a new key and revoke the old one.

Key handling

Ownership and isolation

The key identifies a Titan user, and every downstream call inherits that identity:
  • Runs are created under your account and count against your credits.
  • titan_get_run can only read runs owned by the same user. An agent cannot poll someone else’s run_id.
  • Results, datasets, and exports enforce the same ownership as the Task Service API.

Auth errors

Full error semantics are in Errors and warnings.

Next steps