mcp-server-do
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-server-dostart SSE transport for MCP server"
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.
SSE + MCP Server + Durable Objects
A SSE Transport layer that works with
@modelcontextprotocol/typescript-sdk(/src/sse.ts)A MCP Server as a Durable Object (
/src/mcp-server-do.ts)Steps to run it end-to-end
Run it
Clone this repo
npm installnpm startto start the DO (athttp://localhost:8787)npx @modelcontextprotocol/inspectorto run the MCP inspectorOpen the inspector, enter
http://localhost:8787/sse
You should see:
Related MCP server: MCP Access OAuth Server
Details
I took this example from @modelcontextprotocol/typescript-sdk:
import express from "express";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
const server = new McpServer({
name: "example-server",
version: "1.0.0"
});
// ... set up server resources, tools, and prompts ...
const app = express();
app.get("/sse", async (req, res) => {
const transport = new SSEServerTransport("/messages", res);
await server.connect(transport);
});
app.post("/messages", async (req, res) => {
// Note: to support multiple simultaneous connections, these messages will
// need to be routed to a specific matching transport. (This logic isn't
// implemented here, for simplicity.)
await transport.handlePostMessage(req, res);
});
app.listen(3001);...and implemented the same thing in Durable Objects. But first needed a transport layer that worked on Workers.
Following sse.ts from @modelcontextprotocol/typescript-sdk, I made one, trying to mirror the shape of the existing one. Some pretty fundamental assumptions baked into the SDK around its use of node:http that leak out beyond the SSE transport through its input types — but really the only meaningful interface change is that handlePostMessage takes a request and returns a response. Seems like there's probably a clever way somehow to upstream?
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloudflare Workers MCP server: ai-agent-scratchpad
Cloudflare Workers MCP server: agent-memory
Cloudflare Workers MCP server: code-explainer
Cloudflare Workers MCP server: ai-model-router
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA remote MCP server implementation for Cloudflare that uses server-sent events (SSE) to enable Model Control Protocol communication.1-
- FlicenseNot gradedqualityCmaintenanceA Cloudflare Workers-based MCP server that enables secure remote connections using built-in OAuth authentication via Cloudflare Access. It provides identity-based access control for MCP tools and supports persistent state management through Durable Objects and SSE.-
- FlicenseNot gradedqualityDmaintenanceDeploy a remote MCP server on Cloudflare Workers without authentication, allowing you to create custom tools accessible via SSE.-
- FlicenseNot gradedqualityCmaintenanceEnables running a remote MCP server on Cloudflare Workers with OAuth login, allowing AI clients like Claude to interact with tools via SSE.15-