Skip to content

Commit 2c52cc6

Browse files
docs: Add MCP SDK v1.25.1 documentation
Document the MCP SDK upgrade from v1.23.0 to v1.25.1 with the following updates: - Add new section on using MCP SDK directly without Agents SDK - Document the new mcp-server example using WebStandardStreamableHTTPServerTransport - Add documentation for new WorkerTransport options: - onsessionclosed callback for session cleanup - eventStore for connection resumability support - retryInterval for SSE polling behavior control Related to cloudflare/agents#752 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 4337e31 commit 2c52cc6

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed

src/content/docs/agents/model-context-protocol/mcp-handler-api.mdx

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,99 @@ const handler = createMcpHandler(server, { transport });
115115

116116
</TypeScriptExample>
117117

118+
#### sessionIdGenerator
119+
120+
A function that generates a unique session ID for each transport connection. Return `undefined` to disable session management and run in stateless mode.
121+
122+
**Default:** Generates a cryptographically secure random UUID
123+
124+
#### enableJsonResponse
125+
126+
Enable traditional Request/Response mode, disabling streaming. When enabled, responses are returned as JSON instead of using Server-Sent Events.
127+
128+
**Default:** `false`
129+
130+
#### onsessioninitialized
131+
132+
Callback fired when a new session is initialized. Receives the session ID as a parameter.
133+
134+
<TypeScriptExample>
135+
136+
```ts
137+
const handler = createMcpHandler(server, {
138+
onsessioninitialized: (sessionId) => {
139+
console.log(`New session started: ${sessionId}`);
140+
},
141+
});
142+
```
143+
144+
</TypeScriptExample>
145+
146+
#### onsessionclosed
147+
148+
Callback fired when a session is closed via DELETE request. Receives the session ID as a parameter.
149+
150+
<TypeScriptExample>
151+
152+
```ts
153+
const handler = createMcpHandler(server, {
154+
onsessionclosed: (sessionId) => {
155+
console.log(`Session closed: ${sessionId}`);
156+
},
157+
});
158+
```
159+
160+
</TypeScriptExample>
161+
162+
#### eventStore
163+
164+
Event store for resumability support. When provided, enables clients to reconnect and resume messages using Last-Event-ID. This allows clients to recover from connection interruptions without losing messages.
165+
166+
<TypeScriptExample>
167+
168+
```ts
169+
import { createMcpHandler, type EventStore } from "agents/mcp";
170+
171+
const eventStore: EventStore = {
172+
storeEvent: async (streamId, message) => {
173+
// Store event and return unique event ID
174+
const eventId = crypto.randomUUID();
175+
await myStorage.put(`event:${eventId}`, { streamId, message });
176+
return eventId;
177+
},
178+
replayEventsAfter: async (lastEventId, sender) => {
179+
// Replay events after the given event ID
180+
const events = await myStorage.getEventsAfter(lastEventId);
181+
for (const { eventId, message } of events) {
182+
await sender.send(eventId, message);
183+
}
184+
return streamId;
185+
},
186+
getStreamIdForEventId: async (eventId) => {
187+
const event = await myStorage.get(`event:${eventId}`);
188+
return event?.streamId;
189+
},
190+
};
191+
192+
const handler = createMcpHandler(server, { eventStore });
193+
```
194+
195+
</TypeScriptExample>
196+
197+
#### retryInterval
198+
199+
Retry interval in milliseconds to suggest to clients in SSE retry field. Controls client reconnection timing for polling behavior.
200+
201+
<TypeScriptExample>
202+
203+
```ts
204+
const handler = createMcpHandler(server, {
205+
retryInterval: 5000, // Suggest clients retry every 5 seconds
206+
});
207+
```
208+
209+
</TypeScriptExample>
210+
118211
## Stateless MCP Servers
119212

120213
Many MCP Servers are stateless, meaning they don't maintain any session state between requests. The `createMcpHandler` function is a lightweight alternative to the `McpAgent` class that can be used to serve an MCP server straight from a Worker. View the [complete example on GitHub](https://github.com/cloudflare/agents/tree/main/examples/mcp-worker).

src/content/docs/agents/model-context-protocol/transport.mdx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,56 @@ If you have an existing MCP server using the `McpAgent` class:
150150
- **Using state?** Use `createMcpHandler` with a `WorkerTransport` inside an [Agent](/agents/) class. See [Stateful MCP Servers](/agents/model-context-protocol/mcp-handler-api#stateful-mcp-servers) for details.
151151
- **Need SSE support?** Continue using `McpAgent` with `serveSSE()` for legacy client compatibility. See the [McpAgent API reference](/agents/model-context-protocol/mcp-agent-api/).
152152

153+
## Using MCP SDK directly (without Agents SDK)
154+
155+
For the simplest possible MCP server setup, you can use the `@modelcontextprotocol/sdk` package directly without the Agents SDK. This approach uses `WebStandardStreamableHTTPServerTransport` which works natively on Cloudflare Workers.
156+
157+
View the [complete example on GitHub](https://github.com/cloudflare/agents/tree/main/examples/mcp-server).
158+
159+
<TypeScriptExample>
160+
161+
```ts
162+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
163+
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
164+
import { z } from "zod";
165+
166+
const server = new McpServer({
167+
name: "Hello MCP Server",
168+
version: "1.0.0",
169+
});
170+
171+
server.registerTool(
172+
"hello",
173+
{
174+
description: "Returns a greeting message",
175+
inputSchema: { name: z.string().optional() },
176+
},
177+
async ({ name }) => {
178+
return {
179+
content: [
180+
{
181+
text: `Hello, ${name ?? "World"}!`,
182+
type: "text",
183+
},
184+
],
185+
};
186+
},
187+
);
188+
189+
const transport = new WebStandardStreamableHTTPServerTransport();
190+
server.connect(transport);
191+
192+
export default {
193+
fetch: async (request: Request, _env: Env, _ctx: ExecutionContext) => {
194+
return transport.handleRequest(request);
195+
},
196+
};
197+
```
198+
199+
</TypeScriptExample>
200+
201+
This approach creates a stateless MCP server without session management. Each request is handled independently. If you need to add state management or use advanced features like elicitation, use an [Agent](/agents/) class with the [Agents SDK](/agents/) instead.
202+
153203
### Testing with MCP clients
154204

155205
You can test your MCP server using an MCP client that supports remote connections, or use [`mcp-remote`](https://www.npmjs.com/package/mcp-remote), an adapter that lets MCP clients that only support local connections work with remote MCP servers.

0 commit comments

Comments
 (0)