The endpoint
Every Exponential instance exposes a streamable-HTTP MCP server at:
https://app.exponential.at/api/mcpSelf-hosting? It's the same path on your instance: https://your-instance/api/mcp. There is no separate /sse variant; modern clients speak streamable HTTP directly.
Authentication
OAuth for interactive clients
Point a client at the endpoint with no credentials and it registers itself (dynamic client registration) and sends you to your browser to approve. The consent screen is a scope picker: grant the client everything, specific teams, or specific boards. The token it receives is confined to exactly that grant. A client with no grant gets nothing. Re-running consent updates the grant, so you can widen or narrow access later.
API keys for headless use
Scripts and CI use a personal API key instead. Generate one under Settings → API keys in the web app and send it as a bearer token:
Authorization: Bearer expu_...API keys act as you, with your full membership. Guard them accordingly.
Client setup
Claude (Desktop & claude.ai)
Settings → Connectors → Add custom connector, paste the endpoint URL, and hit Connect. Your browser opens for OAuth and the scope picker. Works the same in the Claude desktop app and on claude.ai.
mcp-remote (see "Other clients" below).ChatGPT
On chatgpt.com, enable Settings → Apps & Connectors → Advanced settings → Developer mode (Plus/Pro/Business; the menu naming varies while the feature is in beta). Then Create connector, paste the MCP URL, and choose OAuth as the authentication. Write-capable tools ask for confirmation per call.
Claude Code
claude mcp add --transport http --scope user exponential https://app.exponential.at/api/mcpThen run /mcp in a session to sign in via OAuth. For headless use, attach an API key instead:
claude mcp add --transport http --scope user exponential https://app.exponential.at/api/mcp \
--header "Authorization: Bearer expu_..."A configured header disables the OAuth fallback. In .mcp.json form, the server entry needs "type": "http".
Codex CLI
codex mcp add exponential --url https://app.exponential.at/api/mcp
codex mcp login exponentialOr configure it in config.toml, with an API key via an environment variable:
[mcp_servers.exponential]
url = "https://app.exponential.at/api/mcp"
bearer_token_env_var = "EXPONENTIAL_API_KEY"Cursor
Add the server to ~/.cursor/mcp.json (or a project's .cursor/mcp.json):
{
"mcpServers": {
"exponential": {
"url": "https://app.exponential.at/api/mcp"
}
}
}Click Connect next to the server in Cursor's MCP list to run the OAuth flow. For API keys, add a headers object with the Authorization header instead.
Other clients
Most MCP clients accept the generic mcpServers JSON shown above. VS Code (Copilot) uses a top-level servers key with "type": "http" per server. Clients that only speak stdio can bridge:
npx mcp-remote https://app.exponential.at/api/mcpTool reference
What a connected client can do, grouped by area. Every call is confined to the OAuth grant's scope (or the API key's membership).
Teams
exponential_teams_list: List the teams you belong to.exponential_teams_get: Get a single team by id.exponential_teams_create: Create a new team you own.exponential_teams_update: Rename a team or change its icon (owner only).
Boards
exponential_boards_list: List boards in one team or across all your teams.exponential_boards_get: Get a single board.exponential_boards_create: Create a board (optionally repo-backed).exponential_boards_update: Update name, color, or icon.exponential_boards_delete: Move a board to the 48-hour trash (owner only).exponential_boards_set_repository: Point a board at a different registered repository.
Issues
exponential_issues_list: List and filter issues by board, status, priority, assignee, due dates, or title search.exponential_issues_get: Get one issue with labels and recent comments, by UUID or identifier ("EXP-42").exponential_issues_create: Create an issue.exponential_issues_update: Update an issue's fields. Pass only what changes.exponential_issues_delete: Permanently delete an issue and everything attached to it.exponential_issues_update_status: Set status during a coding run (PR events move it to the team's configured statuses).exponential_pr_open: Open + link the pull request server-side for one issue, or a whole batch via issueIds + head.exponential_pr_merge: Squash-merge an issue's linked PR (or a whole batch) through the GitHub App. No gh, no token.exponential_pr_retarget: Repoint an open PR's base branch, the fix for a stacked PR whose parent already merged.exponential_issues_pr_files: List the linked PR's changed files with patches and add/delete counts.
Labels & issue labels
exponential_labels_list: List a team's labels.exponential_labels_get: Get a label by id.exponential_labels_create: Create a label.exponential_labels_update: Rename or recolor a label.exponential_labels_delete: Delete a label.exponential_issue_labels_add: Attach a label to an issue.exponential_issue_labels_remove: Detach a label from an issue.
Comments
exponential_comments_list: List an issue's comments, oldest first.exponential_comments_create: Post a comment as the connected user.exponential_comments_update: Edit your own comment.exponential_comments_delete: Delete a comment.
Subscriptions & notifications
exponential_issues_subscribe: Subscribe to an issue's notifications.exponential_issues_unsubscribe: Unsubscribe (and suppress auto-resubscribe).exponential_notifications_list: List your notifications, newest first.exponential_notifications_mark_read: Mark one notification read, or all of them.
Members & invites
exponential_members_list: List a team's members (useful to resolve an assigneeId).exponential_invites_create: Create an invite link (owner only).exponential_invites_list: List pending invites.exponential_invites_revoke: Revoke a pending invite (owner only).
Repositories & branch diff
exponential_repositories_list: List a team's registered repositories and the boards they back.exponential_repositories_add: Register a GitHub repository ("owner/name") with a team.exponential_repositories_branch_diff: Diff an issue's branch against the repo's default branch.
Actions
exponential_actions_list: List a team's actions, the reusable AI prompts members run on their own desktop.exponential_actions_create: Create an action with markdown instructions and an optional repository (owner only).exponential_actions_update: Update an action (owner only).exponential_actions_delete: Delete an action (owner only).
Attachments
exponential_attachments_get: Fetch an image attachment so the client can view it.exponential_attachments_upload: Upload an image and get its embeddable markdown form back.exponential_attachments_delete: Delete an attachment; embeds in descriptions and comments are rewritten in the same transaction.
Recipes
File a bug with labels, from chat
"File a bug on the app board: it drops drag events on narrow viewports. Priority high, label it bug." The client chains exponential_boards_list → exponential_issues_create → exponential_labels_list → exponential_issue_labels_add, and answers with the new identifier.
Check a PR's files from chat
"What does EXP-42's PR actually change?" The client calls exponential_issues_pr_files, which returns the changed files with patches, so the model can summarize the diff, flag a risky change, or compare it against the issue's acceptance criteria.
One combined PR for several issues
An agent that fixed several issues on one pushed branch opens a single PR for all of them: exponential_pr_open with issueIds (the batch) and head (the pushed branch). Every listed issue links to the PR and moves to In Review; merging completes them all. This is exactly what a batch coding run does.