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.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:key in the response is shown once. Store it in a secret manager, not in a config file you commit.
Recommended scope sets
Grant the smallest set that does the job.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_runcan only read runs owned by the same user. An agent cannot poll someone else’srun_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
- Connect your client — where the key goes in each client
- Authentication and API keys — the full platform scope catalog
- Credits and usage — what each authorized call costs