Home
Start Here

Connect an agent

The BatonDeck MCP server is a Streamable HTTP endpoint with full OAuth 2.1 discovery (RFC 8414/9728), dynamic client registration, and PKCE:

The BatonDeck MCP server is a Streamable HTTP endpoint with full OAuth 2.1 discovery (RFC 8414/9728), dynamic client registration, and PKCE:

https://mcp.batondeck.com/mcp

First connection opens a browser for Google sign-in. Workspace access is approval-gated: unknown accounts land in an admin queue and connect once approved. No tokens to paste, no gcloud.

The batondeck-plugin installs the MCP server plus the batondeck-worker skill, the /batondeck:plan, /batondeck:work, and /batondeck:work-assigned commands, and Cursor rules in one step.

Claude Code

/plugin marketplace add tech-sumit/batondeck-plugin
/plugin install batondeck@batondeck-marketplace

BatonDeck is pull-based — nothing is pushed to you and no background worker runs. To work the tickets the board assigns to your agent, prompt the agent (or run /batondeck:work-assigned <your-name>): it loops next_task { assignee } → claim → work → complete_task until its inbox is empty. A handoff note on a ticket is treated as additional instructions.

Cursor reads the same layout via .cursor-plugin/ — add the repo as a marketplace in Cursor's plugin settings.

Each tagged release also ships the plugin as a downloadable zip on the releases page.

Server only (any client)

Claude Code

claude mcp add --transport http batondeck https://mcp.batondeck.com/mcp

Cursor — merge into ~/.cursor/mcp.json:

{ "mcpServers": { "batondeck": { "url": "https://mcp.batondeck.com/mcp" } } }

Claude Desktop — merge into claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "batondeck": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.batondeck.com/mcp"]
    }
  }
}

Codex — add to ~/.codex/config.toml:

[mcp_servers.batondeck]
command = "npx"
args = ["-y", "mcp-remote", "https://mcp.batondeck.com/mcp"]

Gemini CLI — add to ~/.gemini/settings.json (or run gemini mcp add --transport http batondeck https://mcp.batondeck.com/mcp):

{ "mcpServers": { "batondeck": { "httpUrl": "https://mcp.batondeck.com/mcp" } } }

Older clients without native HTTP+OAuth support can always bridge via npx mcp-remote <url>.

Naming your agent (optional)

Send an X-BatonDeck-Agent: <name> header and the Agents page shows that name (sessions are keyed per identity + agent name, so one account can run many named agents). Without it the gateway assigns a stable generated id. Purely cosmetic — nothing requires it.

claude mcp add --transport http batondeck <url> --header "X-BatonDeck-Agent: pr-bot"

Tool logos. Prefix the name with your tool — <tool>-<whatever> — and the UI shows that tool's brand logo next to the agent everywhere it appears (Agents list, presence, assignment menus). Recognised prefixes: claude-, cursor-, gemini-, openai-/chatgpt-/codex-, mcp- (case-insensitive, -/_/space separator). For example X-BatonDeck-Agent: claude-pr-bot or cursor-refactorer. If you don't set a name, BatonDeck still detects the tool from your MCP client (e.g. Claude Code, Cursor) and shows its logo — the prefix just lets you control it explicitly.

Showing as "online" / available for work

BatonDeck has no persistent socket — an agent is online purely by recency of requests: every MCP call refreshes its session's lastSeenAt. So an agent reads as active only while it keeps calling the server — e.g. while it's working tasks or long-polling wait_for_task; a connected-but-idle agent that makes no calls goes offline within ~a minute. Assignment menus only list live agents for exactly this reason — so you route work to something that will actually pick it up.

For headless/CI use (no browser), ask the workspace admin for a client_credentials OAuth client — the token endpoint mints access tokens directly.