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:
https://mcp.batondeck.com/mcpFirst 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 plugin (recommended)
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-marketplaceBatonDeck 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/mcpCursor — 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.
