mcp-server-do
If you are the rightful owner of mcp-server-do and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
This document provides an overview and setup instructions for a Model Context Protocol (MCP) server using Server-Sent Events (SSE) and Durable Objects.
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 install
npm start
to start the DO (athttp://localhost:8787
)npx @modelcontextprotocol/inspector
to run the MCP inspector- Open the inspector, enter
http://localhost:8787/sse
You should see:
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?