MCP server
Overdeck serves a Model Context Protocol (MCP) server, so another tool (Claude Desktop, another agent harness, a chat bot) can list conversations, read one, send a message, start a conversation or a worker, and answer prompts that wait on you. It reaches this machine’s Overdeck only. This is separate from the Channels bridge (overdeck-bridge), which delivers
messages into one running agent. The MCP server is a control surface for
outside tools.
Every tool calls an existing dashboard route with the token the client
presents, so a tool can do only what that token’s scopes allow on that route.
There is no second path to any operation.
Tools
No tool pairs devices, creates or revokes tokens, reads or writes settings, or
touches the session vault.
When a token lacks a scope, the tool returns an error such as
HTTP 403: insufficient_scope (missingScope: approve).
Over HTTP
Open Settings → Anywhere on this machine and choose Copy MCP URL. The dialog:- Asks for a name, the address the client will use, and whether to allow answering questions and approving permissions.
- Creates an MCP access token and copies the URL,
<address>/mcp, to the clipboard. - Shows the URL, the
Authorization: Bearer odk_…header and a ready client config, each with a Copy button. The token is shown once.
https:// one selected. When there is none, the dialog
offers this browser’s address, which works only on this machine. Add a
reachable address (for example a Tailscale address) under Settings → Anywhere
first.
The token is never part of the URL. Proxy and access logs record URLs, so the
token travels only in the Authorization header. Every common MCP client
accepts a header. With Claude Code:
mcp.json-style config:
POST /mcp gets its own server and one JSON
answer; there is no session and no event stream. GET /mcp and DELETE /mcp
answer 405. Only a browser on this machine can create the token; a paired
device’s browser sees “Only a browser on this machine can create MCP tokens.”
/mcp is served by the production dashboard (pan up) and its reachable
addresses. The Vite dev server (pan dev) does not proxy it.
Over stdio
pan mcp serve serves the same tools over stdin and stdout. It reads the token
from the OVERDECK_MCP_TOKEN environment variable only, because a command-line
flag would show in ps. Create a token first:
admin. Its stdout carries only JSON-RPC; every message goes to stderr.
A Claude Desktop config:
Scopes and the approve scope
An MCP token is an ordinary access token. Copy MCP URL gives itread:state,
read:conversations and operate by default. operate covers tell and the
two start tools.
The box Allow answering questions and approving permissions adds
approve. It is off by default, and only approve or admin satisfies it.
approve lets the token answer blocking prompts: the answer_question and
answer_permission tools, and the dashboard routes for pane-choice menus, pi
asks, Codex approvals and plan approvals. See Remote access
for the full scope table.
MCP never accepts an admin token, the machine’s internal token or the
dashboard’s own session. Both transports refuse them.
Revoking
Revoke an MCP token under Settings → Anywhere → Access tokens, under Settings → Access Tokens, or withpan token revoke <id>. A token revoked
through the dashboard fails its next request at once. A token revoked by
another process (for example pan token revoke while the dashboard is
unreachable) fails within 5 seconds, when the dashboard rereads its token list.
This machine only
list_machines returns this machine. machine on start_conversation and
start_worker accepts nothing, auto, this machine’s label, or its
environment id; all of them run here. Any other value returns an error that
names this machine.