Authorization header: OAuth 2.1 with Dynamic Client Registration (DCR) for human users connecting from MCP clients, and API key JWTs for programmatic integrations. Pick whichever matches your use case.
Whichever method you use, the server enforces your existing Attention permissions. The MCP layer cannot grant access beyond what your user or API key already has.
For Claude.ai users (OAuth)
When you add the Attention connector to Claude (or any MCP-compatible client that supports DCR), the client registers itself with Attention and walks you through an OAuth consent flow.Add the connector
In Claude.ai go to Settings → Connectors → Add custom connector and enter
https://api.attention.tech/mcp. Skip this step if Attention is already in the connector directory.Authorize
The client redirects you to Attention’s login page. Sign in with Google, SSO, or email/password — whichever method your org uses. After login, you’ll see a consent screen showing the scopes Claude is requesting (
mcp:read, mcp:write).create_team, delete_user) only succeed if your account has the admin role.
What the assistant can access
The MCP server enforces the same authorization rules as the Attention app:- Calls and transcripts — only calls your account can see in the app are returned by
search_calls/get_call_details. - Teams, users, scorecards, labels, etc. — read access scoped to your organization; some tools narrow further based on team membership.
- Write operations — require the
mcp:writescope plus, for most tools, the admin role.
Revoking access
For developers (API keys and Anthropic Messages API)
If you’re building an integration that calls the MCP server directly — from a backend service, a CI pipeline, or the Anthropic Messages API — use an API key instead of OAuth.Create an API key
You can create keys from the Attention app under Settings → API Keys, or programmatically via thecreate_api_key MCP tool itself once you have any other admin-authenticated session:
- Org-level keys (
org_level: true) — full org access, no user binding. Best for backend integrations. - User-level keys (
org_level: false) — scoped to the authenticated user, with that user’s roles and team memberships.
Use an API key
Send the key as a Bearer token on theAuthorization header:
api-version: apiv2 claim. The server detects this claim with a zero-cost base64 peek before validating, so API key requests do not pay the OAuth-validation overhead.
Use the MCP server from the Anthropic Messages API
To let Claude call Attention tools inside an Anthropic Messages API request, declare the MCP server in themcp_servers array. The authorization_token is your Attention API key (or a user OAuth access token):
Scopes
The server defines two scopes. OAuth tokens carry the scopes granted at consent time; API keys have implicit access to both scopes within their organization.| Scope | Required for |
|---|---|
mcp:read | Every read tool — get_me, search_calls, list_*, get_*, ask_attention, etc. |
mcp:write | Every mutating tool — create_*, update_*, delete_*, archive_*, snippet creation, etc. |
mcp:write tools additionally require the admin role on your user — see each tool’s reference page for the exact requirement. Tools that explicitly require user-level authentication (not org-level keys) are flagged on their reference pages and include invite_user, update_invitation, delete_invitation, delete_user, and the super agent tools.
If a tool call fails due to insufficient scope or role, the response contains a structured error such as insufficient_scope, admin_required, or user_required.
Rate limits
The MCP server applies a multi-window rate limiter on every authenticated request. Limits are tracked per identity in this priority order:user-{user_id}— for OAuth tokens and user-level API keys.org-{org_id}— for org-level API keys.ip-{client_ip}— fallback if neither user nor org could be resolved.
429 Too Many Requests with:
- A
Retry-Afterheader (seconds until the relevant window resets). - A JSON body of the form
{"error":"rate limit exceeded","retry_after":"N s","limit_type":"second|hour|day"}.
Error responses
Authentication failures return401 Unauthorized with a WWW-Authenticate: Bearer resource_metadata="..." header pointing to the well-known resource metadata document. The JSON body distinguishes:
invalid_tokenwith description"The access token has expired..."— use your refresh token (OAuth) or rotate the API key.invalid_tokenwith description"The access token is invalid."— re-authenticate from scratch.unauthorizedwith description"missing or invalid Authorization header"— no Bearer token was sent.
200 OK with a structured CallToolResult containing an error message — they are application-level errors, not transport errors.