Skip to content

Commit 57091cf

Browse files
committed
Refactor to reuse MCP server setup for both /sse and /mcp
1 parent 91724b8 commit 57091cf

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed
Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
21
import { createMcpHandler, McpAgent } from 'agents/mcp'
32

43
import { getEnv } from '@repo/mcp-common/src/env'
@@ -11,12 +10,7 @@ import type { Env } from './docs-vectorize.context'
1110

1211
const env = getEnv<Env>()
1312

14-
// The docs MCP server isn't stateful, so we don't have state/props
15-
export type Props = never
16-
17-
export type State = never
18-
19-
export class CloudflareDocumentationMCP extends McpAgent<Env, State, Props> {
13+
export class CloudflareDocumentationMCP extends McpAgent<Env, never, never> {
2014
_server: CloudflareMCPServer | undefined
2115
set server(server: CloudflareMCPServer) {
2216
this._server = server
@@ -25,7 +19,6 @@ export class CloudflareDocumentationMCP extends McpAgent<Env, State, Props> {
2519
if (!this._server) {
2620
throw new Error('Tried to access server before it was initialized')
2721
}
28-
2922
return this._server
3023
}
3124

@@ -37,43 +30,47 @@ export class CloudflareDocumentationMCP extends McpAgent<Env, State, Props> {
3730
}
3831

3932
async init() {
40-
const sentry = initSentry(env, this.ctx)
41-
42-
this.server = new CloudflareMCPServer({
43-
wae: env.MCP_METRICS,
44-
serverInfo: {
45-
name: env.MCP_SERVER_NAME,
46-
version: env.MCP_SERVER_VERSION,
47-
},
48-
sentry,
49-
})
50-
51-
registerDocsTools(this.server, this.env)
52-
registerPrompts(this.server)
33+
this.server = createMcpServer(env, this.ctx)
5334
}
5435
}
5536

5637
const sseHandler = CloudflareDocumentationMCP.serveSSE('/sse')
5738

58-
const statelessServer = new McpServer({
59-
name: env.MCP_SERVER_NAME,
60-
version: env.MCP_SERVER_VERSION,
61-
})
62-
63-
registerDocsTools(statelessServer, env)
64-
registerPrompts(statelessServer)
65-
66-
const mcpHandler = createMcpHandler(statelessServer)
67-
6839
export default {
69-
fetch: async (req: Request, env: unknown, ctx: ExecutionContext) => {
40+
fetch: async (req: Request, env: Env, ctx: ExecutionContext) => {
7041
const url = new URL(req.url)
7142
if (url.pathname === '/sse' || url.pathname === '/sse/message') {
7243
return sseHandler.fetch(req, env, ctx)
7344
}
7445
if (url.pathname === '/mcp') {
46+
const server = createMcpServer(env, ctx, req)
47+
const mcpHandler = createMcpHandler(server)
7548
return mcpHandler(req, env, ctx)
7649
}
7750
return new Response('Not found', { status: 404 })
7851
},
7952
}
53+
54+
function createMcpServer(
55+
env: Env,
56+
ctx: {
57+
waitUntil: ExecutionContext['waitUntil']
58+
},
59+
req?: Request
60+
) {
61+
const sentry = initSentry(env, ctx, req)
62+
63+
const server = new CloudflareMCPServer({
64+
wae: env.MCP_METRICS,
65+
serverInfo: {
66+
name: env.MCP_SERVER_NAME,
67+
version: env.MCP_SERVER_VERSION,
68+
},
69+
sentry,
70+
})
71+
72+
registerDocsTools(server, env)
73+
registerPrompts(server)
74+
75+
return server
76+
}

apps/docs-vectorize/wrangler.jsonc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"compatibility_date": "2025-03-10",
99
"compatibility_flags": ["nodejs_compat"],
1010
"name": "mcp-cloudflare-docs-vectorize-dev",
11+
"minify": true,
1112
"migrations": [
1213
{
1314
"new_sqlite_classes": ["CloudflareDocumentationMCP"],

0 commit comments

Comments
 (0)