1- import { McpAgent } from 'agents/mcp'
1+ import { createMcpHandler , McpAgent } from 'agents/mcp'
22
3- import { createApiHandler } from '@repo/mcp-common/src/api-handler'
43import { getEnv } from '@repo/mcp-common/src/env'
54import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
65import { initSentry } from '@repo/mcp-common/src/sentry'
@@ -11,12 +10,7 @@ import type { Env } from './docs-vectorize.context'
1110
1211const 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,20 +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 , this . env )
52- registerPrompts ( this )
33+ this . server = createMcpServer ( env , this . ctx )
5334 }
5435}
5536
56- export default createApiHandler ( CloudflareDocumentationMCP )
37+ const sseHandler = CloudflareDocumentationMCP . serveSSE ( '/sse' )
38+
39+ export default {
40+ fetch : async ( req : Request , env : Env , ctx : ExecutionContext ) => {
41+ const url = new URL ( req . url )
42+ if ( url . pathname === '/sse' || url . pathname === '/sse/message' ) {
43+ return sseHandler . fetch ( req , env , ctx )
44+ }
45+ if ( url . pathname === '/mcp' ) {
46+ const server = createMcpServer ( env , ctx , req )
47+ const mcpHandler = createMcpHandler ( server )
48+ return mcpHandler ( req , env , ctx )
49+ }
50+ return new Response ( 'Not found' , { status : 404 } )
51+ } ,
52+ }
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+ }
0 commit comments