MCP & API

Connect Claude, ChatGPT, Cursor, or any MCP client to your issues: file bugs from chat, triage from your editor, script your board.

The endpoint

Every Exponential instance exposes a streamable-HTTP MCP server at:

text
https://app.exponential.at/api/mcp

Self-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:

text
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.

Connectors dial from Anthropic's cloudClaude's connectors connect server-side, so a self-hosted instance must be reachable from the internet. A LAN-only instance won't work here. Connectors are OAuth-only; to use an API key instead, bridge through 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

shell
claude mcp add --transport http --scope user exponential https://app.exponential.at/api/mcp

Then run /mcp in a session to sign in via OAuth. For headless use, attach an API key instead:

shell
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

shell
codex mcp add exponential --url https://app.exponential.at/api/mcp
codex mcp login exponential

Or configure it in config.toml, with an API key via an environment variable:

toml
[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):

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:

shell
npx mcp-remote https://app.exponential.at/api/mcp

Tool 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.