The simplest way to run a stateless MCP server on Cloudflare Workers. Uses createMcpHandler from the Agents SDK to handle all MCP protocol details in one line.
createMcpHandler— the Agents SDK helper that wraps anMcpServerinto a Worker-compatible fetch handler- Minimal setup — define tools on an
McpServer, pass it tocreateMcpHandler, done - Stateless — no Durable Objects, no persistent state, each request is independent
npm install
npm run devOpen the browser to see the built-in tool tester, or connect with the MCP Inspector at http://localhost:5173/mcp.
import { createMcpHandler } from "agents/mcp";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
function createServer() {
const server = new McpServer({ name: "Hello MCP Server", version: "1.0.0" });
server.registerTool(
"hello",
{
description: "Returns a greeting",
inputSchema: { name: z.string().optional() }
},
async ({ name }) => ({
content: [{ type: "text", text: `Hello, ${name ?? "World"}!` }]
})
);
return server;
}
export default {
fetch: async (request, env, ctx) => {
const server = createServer();
return createMcpHandler(server)(request, env, ctx);
}
};mcp— stateful MCP server withMcpAgentand Durable Objectsmcp-worker-authenticated— adding OAuth authenticationmcp-client— connecting to MCP servers as a client