mcp-bridge-cf
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-bridge-cfwhat tools are available?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Bridge — Dynamic Tool Gateway
A generic bridge between any MCP client and any tool provider via Cloudflare Workers Durable Objects. Each room gets an isolated Durable Object instance. Tool providers connect via WebSocket, MCP clients connect via Streamable HTTP. Tools are registered dynamically and discovered automatically.
How It Works
┌─────────────────┐ WebSocket ┌──────────────────────┐ HTTP/SSE ┌──────────────┐
│ Tool Provider │ ───────────→ │ Cloudflare Worker │ ──────────→ │ MCP Client │
│ (Extension, │ │ (Durable Object) │ │ (VS Code, │
│ App, Script) │ register │ │ tools/list │ Claude, │
│ │ tools │ dynamic registry │ tools/call │ Cursor) │
│ execute │─────────────→│ + bridge │───────────→│ │
│ tools │←─────────────│ forward calls │←───────────│ AI agent │
│ │ callTool │ │ │ │
└─────────────────┘ └──────────────────────┘ └──────────────┘Related MCP server: toolhive-mcp
Quick Start
1. Deploy
git clone https://github.com/kelvinzer0/mcp-bridge-cf
cd mcp-bridge-cf
npm install
npx wrangler login
npm run deploy2. Create a Room
curl https://mcp-bridge.<subdomain>.workers.dev/newResponse:
{
"room": "ab1fe4c7",
"extension_url": "https://mcp-bridge.<subdomain>.workers.dev/ws/extension?room=ab1fe4c7",
"mcp_url": "https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7",
"health_url": "https://mcp-bridge.<subdomain>.workers.dev/health?room=ab1fe4c7"
}3. Connect Tool Provider
const { extension_url } = await fetch("https://mcp-bridge.<subdomain>.workers.dev/new").then(r => r.json())
const ws = new WebSocket(extension_url)
// Register tools
ws.send(JSON.stringify({
type: "registerTools",
tools: [{ name: "my_tool", description: "...", inputSchema: { ... } }]
}))
// Handle tool calls
ws.onmessage = (event) => {
const msg = JSON.parse(event.data)
if (msg.type === "callTool") {
const result = executeTool(msg.name, msg.params)
ws.send(JSON.stringify({ type: "toolResult", callId: msg.callId, result }))
}
}4. Connect MCP Client
Use the mcp_url from step 2. Setup per client:
OpenCode (opencode.json):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"browser-bridge": {
"type": "remote",
"url": "https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7",
"enabled": true
}
}
}Claude Desktop — Settings → Connectors → Add remote server URL:
https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7Or claude_desktop_config.json:
{
"mcpServers": {
"browser-bridge": {
"command": "npx",
"args": ["mcp-remote", "https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7"]
}
}
}Cursor (~/.cursor/mcp.json):
{
"mcpServers": {
"browser-bridge": {
"url": "https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7"
}
}
}OpenClaw:
openclaw mcp add browser-bridge --url "https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7"Or openclaw.json:
{
"mcp": {
"servers": {
"browser-bridge": {
"transport": "sse",
"url": "https://mcp-bridge.<subdomain>.workers.dev/mcp?room=ab1fe4c7"
}
}
}
}Protocol
Tool Provider → Bridge (WebSocket)
Message | Description |
| Register tools |
| Unregister tools |
| Return tool result |
| Ping response |
Bridge → Tool Provider (WebSocket)
Message | Description |
| Execute tool |
| Keepalive |
MCP Client → Bridge (Streamable HTTP)
Standard MCP protocol on /mcp?room=<id>:
POST /mcp?room=<id>— JSON-RPC (initialize, tools/list, tools/call)GET /mcp?room=<id>— SSE stream
Endpoints
Endpoint | Protocol | Description |
| HTTP GET | Generate new room |
| WebSocket | Tool provider connects here |
| Streamable HTTP | MCP client connects here |
| HTTP GET | Room status + tool list |
Example: Browser Extension
See extension-example/ for a Chrome extension that:
Connects to a room via WebSocket
Detects page context (GitHub, Gmail, Notion, etc.)
Registers context-specific tools dynamically
Executes tools in the page DOM
Development
npm run dev # Local dev with wrangler
npm run typecheckSecurity
For production use, add OAuth:
import OAuthProvider from "@cloudflare/workers-oauth-provider"
export default new OAuthProvider({
apiRoute: "/mcp",
apiHandler: ...,
})License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloudflare Workers MCP server: ai-gateway
Cloudflare Workers MCP server: ai-model-router
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Cloudflare Workers MCP server: ai-agent-scratchpad
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceA Cloudflare Workers-based MCP server that enables AI models to use custom tools without requiring authentication.-
- AlicenseNot gradedqualityCmaintenanceA hosted HTTP MCP server for Cloudflare Workers that exposes a bundle of tools via a remote /mcp endpoint, enabling Claude-compatible clients to connect without a local server.5 npm1BSD Zero Clause
- FlicenseNot gradedqualityCmaintenanceBridges MCP for XiaoZhi AI agent using Cloudflare Workers + Durable Objects, maintaining persistent WebSocket connection and enabling custom tool execution.-
- AlicenseNot gradedqualityBmaintenanceDeployable stateless remote MCP server on Cloudflare Workers without auth, with support for registering custom tools and connecting to MCP clients.10 npmMIT