Get started
Connect Claude
The relay speaks standard MCP over Streamable HTTP, so anything that can add an MCP server can talk to your phone. Claude's own clients connect with just the URL.
claude.ai and Claude Desktop#
- Add a custom connector. Settings → Connectors → Add custom connector. Name it after the phone and paste
https://phonebridge.co/mcpas the URL. Leave the client id and secret empty; the relay registers the client itself. - Allow. A PhoneBridge page opens. Sign in if you are not already, choose the phone, press Allow. You are sent back and the connector shows as connected.
- Enable it in a chat from the tools menu, then ask something. The first call lists the tools and Claude takes it from there.
The connection is an OAuth 2.1 grant bound to that one phone. It renews itself in the background; revoke it from the dashboard or from Claude's connector settings.
Claude Code#
claude mcp add --transport http phone https://phonebridge.co/mcp
claude # then type /mcp and authenticate when prompted
Claude Code opens the same consent page in your browser. To skip the browser, for example on a server, use an API key from the dashboard instead:
claude mcp add --transport http phone https://phonebridge.co/mcp \
--header "X-Api-Key: pb_…"
The dashboard prints this exact command, with the key filled in, when you create one.
Any other MCP client#
- Endpoint
https://phonebridge.co/mcp, MCP Streamable HTTP- Auth
- OAuth 2.1 with discovery at
/.well-known/oauth-authorization-server, orX-Api-Key: <key>, orAuthorization: Bearer <key> - Protocol revisions
2026-07-28(stateless) and2025-11-25,2025-06-18,2025-03-26(sessions,Mcp-Session-Id, GET SSE)- Notifications
- Device events are fanned out to open SSE streams on a best-effort basis; the reliable path is the
wait_for_eventstool
MCP Inspector, Cursor, Zed and any SDK client work unchanged. See the protocol page for timeouts, error codes and what the relay rewrites.
Reacting to the phone#
Claude does not get interrupted when a text arrives; it has to ask. The pattern is a loop on wait_for_events, which blocks for up to ten minutes and returns the moment something happens:
Watch my phone. Call wait_for_events in a loop. When a text arrives from someone
in my contacts, summarise it for me. If a call comes in while I'm in this meeting,
reject it and text the caller that I'll call back in an hour.
Incoming message bodies and caller names are third-party content. The tool descriptions mark them untrusted, and Claude is instructed never to act on an instruction found inside a message without asking you. More on untrusted content.
Several phones, several clients#
Keys and OAuth grants are per phone, so a client that should reach two phones needs two server entries. Any number of clients can share one phone; the relay multiplexes them onto the phone's single socket and keeps their requests apart.