@mcp-b/webmcp-local-relay connects WebMCP tools running in browser tabs to desktop MCP clients (Claude Desktop, Cursor, Claude Code, Windsurf) via a localhost WebSocket relay and stdio transport.
Architecture
For a conceptual discussion of transports and bridges, see Transports and Bridges.
Installation
Add this JSON block to your MCP client configuration:.mcpb bundle file is available from GitHub Releases for Claude Desktop (double-click to install).
Minimal example
CLI options
Static management tools
The relay always exposes four management tools:Dynamic tool registration
Tools registered on webpages are forwarded to the MCP server as first-class tools. Tool names are sanitized to the character set[a-zA-Z0-9_].
When multiple tabs register a tool with the same name, a short tab-ID suffix disambiguates them:
Tools appear and disappear as tabs open, reload, and close.
Browser embed
Add a script tag to expose a page’s WebMCP tools to the relay:document.modelContext, they are picked up automatically.
Embed attributes
Custom relay port:
localhost. Tools are discovered via document.modelContext (or navigator.modelContextTesting as fallback) and forwarded to the relay.
Elicitation support
When the page’s model context exposesdocument.modelContext.elicitInput, the embed installs an elicitation bridge. Elicitation requests from browser tool handlers are forwarded through the relay widget iframe to the local relay server, which then forwards them to the connected MCP client (for example, Claude Code). Responses travel the same path back to the originating tool. The bridge is installed automatically before each tool invocation and only when elicitInput is present.
Reconnection and client mode
The widget reconnects automatically using exponential backoff (1.5x multiplier) from500ms up to 3000ms, stopping after 100 attempts.
Port range discovery and browser probing: The server tries ports 9333–9348 instead of failing on a single port. The chosen port is persisted to ~/.webmcp/relay-port.json for stable restarts. The widget probes the port range sequentially with a state machine (connected → retry-same-endpoint → rediscover) and caches discovered endpoints in sessionStorage.
Subprotocol handshake: WebSocket connections negotiate webmcp.v1 as the primary subprotocol and webmcp-discovery.v1 for discovery probes. On connect, the server sends a server-hello message containing the relay’s identity: instanceId, host, port, and optional label, workspace, and relayId. The browser responds with a hello message carrying tabId, origin, title, and url. The server completes the handshake with hello/accepted.
Heartbeat: The relay server pings connected sources every 15 seconds. Connections are closed after 25 seconds with no response, enabling fast rediscovery after ungraceful relay shutdowns.
Multi-relay selection: Use data-relay-id and data-relay-workspace embed attributes to filter relays during discovery. Only relays whose server-hello identity matches the configured filters are accepted.
When a second relay instance starts and the port is in use (EADDRINUSE), it falls back to client mode. In client mode the relay connects as a WebSocket client to the existing server relay and proxies tool operations through it. If the server relay stops, the client promotes itself back to server mode after a reconnection cycle. This lets multiple MCP clients share the same browser connections.
Runtime compatibility
The relay supports pages using:@mcp-b/global(recommended)@mcp-b/webmcp-polyfillwithnavigator.modelContextTesting
document.modelContext.listTools + callTool when present, and falls back to navigator.modelContextTesting.listTools + executeTool.
Security
- Binds to
127.0.0.1by default (loopback only). - Default
allowedOriginsis*, permitting any browser page to connect. Use--widget-originto restrict which host page origins can register tools. --widget-originvalidates the host page origin reported in the browserhellomessage, not the iframe origin.- Any local process can connect regardless of origin restrictions.
Exported API
The package exports the following for programmatic use:
Tool definition utilities from
./protocol:
Message schema types and Zod schemas for the browser-relay protocol:
Troubleshooting
Related
- Connect Desktop Agents with Local Relay (how-to guide)
- Desktop Agent Relay (tutorial)
- @mcp-b/global (runtime reference)
- Transports and Bridges (explanation)
