edge.libx.js 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -186,8 +186,8 @@ class MCPAdapter {
186
186
  }
187
187
  const fullUrl = `http://localhost${url}`;
188
188
  const requestInit = { method };
189
- if (args.body && ['POST', 'PUT', 'PATCH'].includes(method)) {
190
- requestInit.body = JSON.stringify(args.body);
189
+ if (['POST', 'PUT', 'PATCH'].includes(method)) {
190
+ requestInit.body = JSON.stringify(args.body || {});
191
191
  requestInit.headers = { 'Content-Type': 'application/json' };
192
192
  }
193
193
  const request = new Request(fullUrl, requestInit);
@@ -1 +1 @@
1
- {"version":3,"file":"MCPAdapter.js","sourceRoot":"","sources":["../../src/modules/MCPAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { RouterType, IRequest } from 'itty-router';\n\nexport interface MCPOptions {\n\tname?: string;\n\tversion?: string;\n}\n\ninterface ToolMeta {\n\tdescription?: string;\n\tparams?: Record<string, { description?: string; type?: string }>;\n}\n\ninterface ToolDefinition {\n\tname: string;\n\tdescription: string;\n\tinputSchema: {\n\t\ttype: 'object';\n\t\tproperties: Record<string, any>;\n\t\trequired: string[];\n\t};\n}\n\ninterface JsonRpcRequest {\n\tjsonrpc: '2.0';\n\tid?: string | number;\n\tmethod: string;\n\tparams?: any;\n}\n\nexport class MCPAdapter {\n\tprivate router: RouterType<any, any[], any>;\n\tprivate base: string;\n\tprivate fetchHandler: (request: IRequest, ctx?: any) => Promise<Response>;\n\tprivate serverName: string;\n\tprivate serverVersion: string;\n\tprivate mcpMeta: Map<string, ToolMeta>;\n\n\tconstructor(\n\t\trouter: RouterType<any, any[], any>,\n\t\tbase: string,\n\t\tfetchHandler: (request: IRequest, ctx?: any) => Promise<Response>,\n\t\tmcpMeta: Map<string, ToolMeta>,\n\t\toptions?: MCPOptions,\n\t) {\n\t\tthis.router = router;\n\t\tthis.base = base;\n\t\tthis.fetchHandler = fetchHandler;\n\t\tthis.mcpMeta = mcpMeta;\n\t\tthis.serverName = options?.name ?? 'MCP Server';\n\t\tthis.serverVersion = options?.version ?? '1.0.0';\n\t}\n\n\tpublic toolNameFromRoute(method: string, path: string): string {\n\t\tlet name = path;\n\t\t// Strip base path\n\t\tif (this.base && name.startsWith(this.base)) {\n\t\t\tname = name.slice(this.base.length);\n\t\t}\n\t\t// Remove leading slash\n\t\tname = name.replace(/^\\//, '');\n\t\t// Replace :param with \"by_param\"\n\t\tname = name.replace(/:(\\w+)/g, 'by_$1');\n\t\t// Replace slashes with underscores\n\t\tname = name.replace(/\\//g, '_');\n\t\t// Prepend method\n\t\tname = `${method.toLowerCase()}_${name}`;\n\t\t// Clean up double underscores\n\t\tname = name.replace(/_+/g, '_').replace(/_$/, '');\n\t\treturn name;\n\t}\n\n\tpublic inferQueryParams(handlers: Function[]): string[] {\n\t\tconst params = new Set<string>();\n\t\tfor (const handler of handlers) {\n\t\t\ttry {\n\t\t\t\tconst src = handler.toString();\n\t\t\t\t// Match req.query.paramName, request.query.paramName, query.paramName\n\t\t\t\tconst dotPattern = /(?:req(?:uest)?\\.)?query\\.(\\w+)/g;\n\t\t\t\tlet match: RegExpExecArray | null;\n\t\t\t\twhile ((match = dotPattern.exec(src)) !== null) {\n\t\t\t\t\tparams.add(match[1]);\n\t\t\t\t}\n\t\t\t\t// Match req.query['paramName'] or req.query[\"paramName\"]\n\t\t\t\tconst bracketPattern = /(?:req(?:uest)?\\.)?query\\[['\"](\\w+)['\"]\\]/g;\n\t\t\t\twhile ((match = bracketPattern.exec(src)) !== null) {\n\t\t\t\t\tparams.add(match[1]);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// handler.toString() may fail for native code\n\t\t\t}\n\t\t}\n\t\treturn Array.from(params);\n\t}\n\n\tpublic introspectRoutes(): ToolDefinition[] {\n\t\tconst routes: any[] = (this.router as any).routes ?? [];\n\t\tconst tools: ToolDefinition[] = [];\n\n\t\tfor (const route of routes) {\n\t\t\t// itty-router v5 stores routes as [method, regex, handlers[], path]\n\t\t\tconst [method, , handlers, originalPath] = route;\n\n\t\t\t// Skip wildcard catch-alls and OPTIONS\n\t\t\tif (!originalPath || originalPath === '*' || originalPath.endsWith('/*')) continue;\n\t\t\tif (method === 'OPTIONS' || method === 'ALL') continue;\n\n\t\t\tconst toolName = this.toolNameFromRoute(method, originalPath);\n\t\t\tconst metaKey = `${method}:${originalPath}`;\n\t\t\tconst meta = this.mcpMeta.get(metaKey);\n\n\t\t\tconst properties: Record<string, any> = {};\n\t\t\tconst required: string[] = [];\n\n\t\t\t// Extract path params\n\t\t\tconst paramPattern = /:(\\w+)/g;\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = paramPattern.exec(originalPath)) !== null) {\n\t\t\t\tconst paramName = match[1];\n\t\t\t\tproperties[paramName] = {\n\t\t\t\t\ttype: meta?.params?.[paramName]?.type ?? 'string',\n\t\t\t\t\t...(meta?.params?.[paramName]?.description && { description: meta.params[paramName].description }),\n\t\t\t\t};\n\t\t\t\trequired.push(paramName);\n\t\t\t}\n\n\t\t\t// POST/PUT/PATCH get a body property\n\t\t\tif (['POST', 'PUT', 'PATCH'].includes(method)) {\n\t\t\t\tproperties['body'] = {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tdescription: meta?.params?.['body']?.description ?? 'Request body',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Infer query params for GET/DELETE\n\t\t\tif (['GET', 'DELETE'].includes(method)) {\n\t\t\t\tconst queryParams = this.inferQueryParams(handlers);\n\t\t\t\tfor (const qp of queryParams) {\n\t\t\t\t\tif (!properties[qp]) {\n\t\t\t\t\t\tproperties[qp] = {\n\t\t\t\t\t\t\ttype: meta?.params?.[qp]?.type ?? 'string',\n\t\t\t\t\t\t\t...(meta?.params?.[qp]?.description && { description: meta.params[qp].description }),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst description = meta?.description ?? `${method} ${originalPath}`;\n\n\t\t\ttools.push({\n\t\t\t\tname: toolName,\n\t\t\t\tdescription,\n\t\t\t\tinputSchema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties,\n\t\t\t\t\trequired,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn tools;\n\t}\n\n\tprivate findRoute(toolName: string): { method: string; path: string; handlers: Function[] } | null {\n\t\tconst routes: any[] = (this.router as any).routes ?? [];\n\t\tfor (const route of routes) {\n\t\t\tconst [method, , handlers, originalPath] = route;\n\t\t\tif (!originalPath || originalPath === '*' || originalPath.endsWith('/*')) continue;\n\t\t\tif (method === 'OPTIONS' || method === 'ALL') continue;\n\t\t\tif (this.toolNameFromRoute(method, originalPath) === toolName) {\n\t\t\t\treturn { method, path: originalPath, handlers };\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic async callTool(name: string, args: Record<string, any> = {}): Promise<any> {\n\t\tconst route = this.findRoute(name);\n\t\tif (!route) {\n\t\t\treturn { isError: true, content: [{ type: 'text', text: `Unknown tool: ${name}` }] };\n\t\t}\n\n\t\tconst { method, path } = route;\n\n\t\t// Build URL with path params substituted\n\t\tlet url = path;\n\t\tconst pathParamPattern = /:(\\w+)/g;\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = pathParamPattern.exec(path)) !== null) {\n\t\t\tconst paramName = match[1];\n\t\t\tif (args[paramName] != null) {\n\t\t\t\turl = url.replace(`:${paramName}`, encodeURIComponent(String(args[paramName])));\n\t\t\t}\n\t\t}\n\n\t\t// Build query string for non-path, non-body params\n\t\tconst pathParams = new Set<string>();\n\t\tconst ppPattern = /:(\\w+)/g;\n\t\tlet m: RegExpExecArray | null;\n\t\twhile ((m = ppPattern.exec(path)) !== null) pathParams.add(m[1]);\n\n\t\tconst queryParams: string[] = [];\n\t\tfor (const [key, value] of Object.entries(args)) {\n\t\t\tif (key === 'body' || pathParams.has(key)) continue;\n\t\t\tqueryParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n\t\t}\n\t\tif (queryParams.length > 0) {\n\t\t\turl += '?' + queryParams.join('&');\n\t\t}\n\n\t\tconst fullUrl = `http://localhost${url}`;\n\t\tconst requestInit: RequestInit = { method };\n\t\tif (args.body && ['POST', 'PUT', 'PATCH'].includes(method)) {\n\t\t\trequestInit.body = JSON.stringify(args.body);\n\t\t\trequestInit.headers = { 'Content-Type': 'application/json' };\n\t\t}\n\n\t\tconst request = new Request(fullUrl, requestInit);\n\n\t\ttry {\n\t\t\tconst response = await this.fetchHandler(request as any);\n\t\t\tconst text = await response.text();\n\t\t\tlet content: any;\n\t\t\ttry {\n\t\t\t\tcontent = JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\tcontent = text;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: 'text', text: typeof content === 'string' ? content : JSON.stringify(content) }],\n\t\t\t};\n\t\t} catch (err: any) {\n\t\t\treturn {\n\t\t\t\tisError: true,\n\t\t\t\tcontent: [{ type: 'text', text: err?.message ?? String(err) }],\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic async handleJsonRpc(message: JsonRpcRequest): Promise<any> {\n\t\tconst { method, id, params } = message;\n\n\t\tswitch (method) {\n\t\t\tcase 'initialize':\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tprotocolVersion: '2024-11-05',\n\t\t\t\t\t\tcapabilities: { tools: { listChanged: true } },\n\t\t\t\t\t\tserverInfo: { name: this.serverName, version: this.serverVersion },\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\tcase 'notifications/initialized':\n\t\t\t\t// No response needed for notifications\n\t\t\t\treturn null;\n\n\t\t\tcase 'tools/list':\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\tresult: { tools: this.introspectRoutes() },\n\t\t\t\t};\n\n\t\t\tcase 'tools/call': {\n\t\t\t\tconst result = await this.callTool(params?.name, params?.arguments ?? {});\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\tresult,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\terror: { code: -32601, message: `Method not found: ${method}` },\n\t\t\t\t};\n\t\t}\n\t}\n\n\tpublic httpHandler = async (request: Request): Promise<Response> => {\n\t\tif (request.method === 'GET') {\n\t\t\t// SSE endpoint for server-sent events (Streamable HTTP)\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tconst encoder = new TextEncoder();\n\t\t\t\t\tcontroller.enqueue(encoder.encode(`event: endpoint\\ndata: /mcp\\n\\n`));\n\t\t\t\t\t// Keep connection open - client will close\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'text/event-stream',\n\t\t\t\t\t'Cache-Control': 'no-cache',\n\t\t\t\t\t'Connection': 'keep-alive',\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// POST: JSON-RPC request\n\t\ttry {\n\t\t\tconst body = await request.json() as JsonRpcRequest;\n\t\t\tconst result = await this.handleJsonRpc(body);\n\t\t\tif (result === null) {\n\t\t\t\treturn new Response(null, { status: 204 });\n\t\t\t}\n\t\t\treturn new Response(JSON.stringify(result), {\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t} catch (err: any) {\n\t\t\treturn new Response(JSON.stringify({\n\t\t\t\tjsonrpc: '2.0',\n\t\t\t\tid: null,\n\t\t\t\terror: { code: -32700, message: 'Parse error' },\n\t\t\t}), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t}\n\t};\n\n\tpublic async serveStdio(): Promise<void> {\n\t\tconst stdin = (globalThis as any).process.stdin;\n\t\tconst stdout = (globalThis as any).process.stdout;\n\n\t\tstdin.setEncoding('utf8');\n\n\t\tlet buffer = '';\n\t\tstdin.on('data', async (chunk: string) => {\n\t\t\tbuffer += chunk;\n\t\t\t// Process complete lines\n\t\t\tconst lines = buffer.split('\\n');\n\t\t\tbuffer = lines.pop() ?? '';\n\n\t\t\tfor (const line of lines) {\n\t\t\t\tconst trimmed = line.trim();\n\t\t\t\tif (!trimmed) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst message = JSON.parse(trimmed) as JsonRpcRequest;\n\t\t\t\t\tconst result = await this.handleJsonRpc(message);\n\t\t\t\t\tif (result !== null) {\n\t\t\t\t\t\tstdout.write(JSON.stringify(result) + '\\n');\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tstdout.write(JSON.stringify({\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\terror: { code: -32700, message: 'Parse error' },\n\t\t\t\t\t}) + '\\n');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"MCPAdapter.js","sourceRoot":"","sources":["../../src/modules/MCPAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { RouterType, IRequest } from 'itty-router';\n\nexport interface MCPOptions {\n\tname?: string;\n\tversion?: string;\n}\n\ninterface ToolMeta {\n\tdescription?: string;\n\tparams?: Record<string, { description?: string; type?: string }>;\n}\n\ninterface ToolDefinition {\n\tname: string;\n\tdescription: string;\n\tinputSchema: {\n\t\ttype: 'object';\n\t\tproperties: Record<string, any>;\n\t\trequired: string[];\n\t};\n}\n\ninterface JsonRpcRequest {\n\tjsonrpc: '2.0';\n\tid?: string | number;\n\tmethod: string;\n\tparams?: any;\n}\n\nexport class MCPAdapter {\n\tprivate router: RouterType<any, any[], any>;\n\tprivate base: string;\n\tprivate fetchHandler: (request: IRequest, ctx?: any) => Promise<Response>;\n\tprivate serverName: string;\n\tprivate serverVersion: string;\n\tprivate mcpMeta: Map<string, ToolMeta>;\n\n\tconstructor(\n\t\trouter: RouterType<any, any[], any>,\n\t\tbase: string,\n\t\tfetchHandler: (request: IRequest, ctx?: any) => Promise<Response>,\n\t\tmcpMeta: Map<string, ToolMeta>,\n\t\toptions?: MCPOptions,\n\t) {\n\t\tthis.router = router;\n\t\tthis.base = base;\n\t\tthis.fetchHandler = fetchHandler;\n\t\tthis.mcpMeta = mcpMeta;\n\t\tthis.serverName = options?.name ?? 'MCP Server';\n\t\tthis.serverVersion = options?.version ?? '1.0.0';\n\t}\n\n\tpublic toolNameFromRoute(method: string, path: string): string {\n\t\tlet name = path;\n\t\t// Strip base path\n\t\tif (this.base && name.startsWith(this.base)) {\n\t\t\tname = name.slice(this.base.length);\n\t\t}\n\t\t// Remove leading slash\n\t\tname = name.replace(/^\\//, '');\n\t\t// Replace :param with \"by_param\"\n\t\tname = name.replace(/:(\\w+)/g, 'by_$1');\n\t\t// Replace slashes with underscores\n\t\tname = name.replace(/\\//g, '_');\n\t\t// Prepend method\n\t\tname = `${method.toLowerCase()}_${name}`;\n\t\t// Clean up double underscores\n\t\tname = name.replace(/_+/g, '_').replace(/_$/, '');\n\t\treturn name;\n\t}\n\n\tpublic inferQueryParams(handlers: Function[]): string[] {\n\t\tconst params = new Set<string>();\n\t\tfor (const handler of handlers) {\n\t\t\ttry {\n\t\t\t\tconst src = handler.toString();\n\t\t\t\t// Match req.query.paramName, request.query.paramName, query.paramName\n\t\t\t\tconst dotPattern = /(?:req(?:uest)?\\.)?query\\.(\\w+)/g;\n\t\t\t\tlet match: RegExpExecArray | null;\n\t\t\t\twhile ((match = dotPattern.exec(src)) !== null) {\n\t\t\t\t\tparams.add(match[1]);\n\t\t\t\t}\n\t\t\t\t// Match req.query['paramName'] or req.query[\"paramName\"]\n\t\t\t\tconst bracketPattern = /(?:req(?:uest)?\\.)?query\\[['\"](\\w+)['\"]\\]/g;\n\t\t\t\twhile ((match = bracketPattern.exec(src)) !== null) {\n\t\t\t\t\tparams.add(match[1]);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// handler.toString() may fail for native code\n\t\t\t}\n\t\t}\n\t\treturn Array.from(params);\n\t}\n\n\tpublic introspectRoutes(): ToolDefinition[] {\n\t\tconst routes: any[] = (this.router as any).routes ?? [];\n\t\tconst tools: ToolDefinition[] = [];\n\n\t\tfor (const route of routes) {\n\t\t\t// itty-router v5 stores routes as [method, regex, handlers[], path]\n\t\t\tconst [method, , handlers, originalPath] = route;\n\n\t\t\t// Skip wildcard catch-alls and OPTIONS\n\t\t\tif (!originalPath || originalPath === '*' || originalPath.endsWith('/*')) continue;\n\t\t\tif (method === 'OPTIONS' || method === 'ALL') continue;\n\n\t\t\tconst toolName = this.toolNameFromRoute(method, originalPath);\n\t\t\tconst metaKey = `${method}:${originalPath}`;\n\t\t\tconst meta = this.mcpMeta.get(metaKey);\n\n\t\t\tconst properties: Record<string, any> = {};\n\t\t\tconst required: string[] = [];\n\n\t\t\t// Extract path params\n\t\t\tconst paramPattern = /:(\\w+)/g;\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = paramPattern.exec(originalPath)) !== null) {\n\t\t\t\tconst paramName = match[1];\n\t\t\t\tproperties[paramName] = {\n\t\t\t\t\ttype: meta?.params?.[paramName]?.type ?? 'string',\n\t\t\t\t\t...(meta?.params?.[paramName]?.description && { description: meta.params[paramName].description }),\n\t\t\t\t};\n\t\t\t\trequired.push(paramName);\n\t\t\t}\n\n\t\t\t// POST/PUT/PATCH get a body property\n\t\t\tif (['POST', 'PUT', 'PATCH'].includes(method)) {\n\t\t\t\tproperties['body'] = {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tdescription: meta?.params?.['body']?.description ?? 'Request body',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Infer query params for GET/DELETE\n\t\t\tif (['GET', 'DELETE'].includes(method)) {\n\t\t\t\tconst queryParams = this.inferQueryParams(handlers);\n\t\t\t\tfor (const qp of queryParams) {\n\t\t\t\t\tif (!properties[qp]) {\n\t\t\t\t\t\tproperties[qp] = {\n\t\t\t\t\t\t\ttype: meta?.params?.[qp]?.type ?? 'string',\n\t\t\t\t\t\t\t...(meta?.params?.[qp]?.description && { description: meta.params[qp].description }),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst description = meta?.description ?? `${method} ${originalPath}`;\n\n\t\t\ttools.push({\n\t\t\t\tname: toolName,\n\t\t\t\tdescription,\n\t\t\t\tinputSchema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties,\n\t\t\t\t\trequired,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn tools;\n\t}\n\n\tprivate findRoute(toolName: string): { method: string; path: string; handlers: Function[] } | null {\n\t\tconst routes: any[] = (this.router as any).routes ?? [];\n\t\tfor (const route of routes) {\n\t\t\tconst [method, , handlers, originalPath] = route;\n\t\t\tif (!originalPath || originalPath === '*' || originalPath.endsWith('/*')) continue;\n\t\t\tif (method === 'OPTIONS' || method === 'ALL') continue;\n\t\t\tif (this.toolNameFromRoute(method, originalPath) === toolName) {\n\t\t\t\treturn { method, path: originalPath, handlers };\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic async callTool(name: string, args: Record<string, any> = {}): Promise<any> {\n\t\tconst route = this.findRoute(name);\n\t\tif (!route) {\n\t\t\treturn { isError: true, content: [{ type: 'text', text: `Unknown tool: ${name}` }] };\n\t\t}\n\n\t\tconst { method, path } = route;\n\n\t\t// Build URL with path params substituted\n\t\tlet url = path;\n\t\tconst pathParamPattern = /:(\\w+)/g;\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = pathParamPattern.exec(path)) !== null) {\n\t\t\tconst paramName = match[1];\n\t\t\tif (args[paramName] != null) {\n\t\t\t\turl = url.replace(`:${paramName}`, encodeURIComponent(String(args[paramName])));\n\t\t\t}\n\t\t}\n\n\t\t// Build query string for non-path, non-body params\n\t\tconst pathParams = new Set<string>();\n\t\tconst ppPattern = /:(\\w+)/g;\n\t\tlet m: RegExpExecArray | null;\n\t\twhile ((m = ppPattern.exec(path)) !== null) pathParams.add(m[1]);\n\n\t\tconst queryParams: string[] = [];\n\t\tfor (const [key, value] of Object.entries(args)) {\n\t\t\tif (key === 'body' || pathParams.has(key)) continue;\n\t\t\tqueryParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n\t\t}\n\t\tif (queryParams.length > 0) {\n\t\t\turl += '?' + queryParams.join('&');\n\t\t}\n\n\t\tconst fullUrl = `http://localhost${url}`;\n\t\tconst requestInit: RequestInit = { method };\n\t\tif (['POST', 'PUT', 'PATCH'].includes(method)) {\n\t\t\trequestInit.body = JSON.stringify(args.body || {});\n\t\t\trequestInit.headers = { 'Content-Type': 'application/json' };\n\t\t}\n\n\t\tconst request = new Request(fullUrl, requestInit);\n\n\t\ttry {\n\t\t\tconst response = await this.fetchHandler(request as any);\n\t\t\tconst text = await response.text();\n\t\t\tlet content: any;\n\t\t\ttry {\n\t\t\t\tcontent = JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\tcontent = text;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: 'text', text: typeof content === 'string' ? content : JSON.stringify(content) }],\n\t\t\t};\n\t\t} catch (err: any) {\n\t\t\treturn {\n\t\t\t\tisError: true,\n\t\t\t\tcontent: [{ type: 'text', text: err?.message ?? String(err) }],\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic async handleJsonRpc(message: JsonRpcRequest): Promise<any> {\n\t\tconst { method, id, params } = message;\n\n\t\tswitch (method) {\n\t\t\tcase 'initialize':\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tprotocolVersion: '2024-11-05',\n\t\t\t\t\t\tcapabilities: { tools: { listChanged: true } },\n\t\t\t\t\t\tserverInfo: { name: this.serverName, version: this.serverVersion },\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\tcase 'notifications/initialized':\n\t\t\t\t// No response needed for notifications\n\t\t\t\treturn null;\n\n\t\t\tcase 'tools/list':\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\tresult: { tools: this.introspectRoutes() },\n\t\t\t\t};\n\n\t\t\tcase 'tools/call': {\n\t\t\t\tconst result = await this.callTool(params?.name, params?.arguments ?? {});\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\tresult,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid,\n\t\t\t\t\terror: { code: -32601, message: `Method not found: ${method}` },\n\t\t\t\t};\n\t\t}\n\t}\n\n\tpublic httpHandler = async (request: Request): Promise<Response> => {\n\t\tif (request.method === 'GET') {\n\t\t\t// SSE endpoint for server-sent events (Streamable HTTP)\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tconst encoder = new TextEncoder();\n\t\t\t\t\tcontroller.enqueue(encoder.encode(`event: endpoint\\ndata: /mcp\\n\\n`));\n\t\t\t\t\t// Keep connection open - client will close\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'text/event-stream',\n\t\t\t\t\t'Cache-Control': 'no-cache',\n\t\t\t\t\t'Connection': 'keep-alive',\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// POST: JSON-RPC request\n\t\ttry {\n\t\t\tconst body = await request.json() as JsonRpcRequest;\n\t\t\tconst result = await this.handleJsonRpc(body);\n\t\t\tif (result === null) {\n\t\t\t\treturn new Response(null, { status: 204 });\n\t\t\t}\n\t\t\treturn new Response(JSON.stringify(result), {\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t} catch (err: any) {\n\t\t\treturn new Response(JSON.stringify({\n\t\t\t\tjsonrpc: '2.0',\n\t\t\t\tid: null,\n\t\t\t\terror: { code: -32700, message: 'Parse error' },\n\t\t\t}), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t}\n\t};\n\n\tpublic async serveStdio(): Promise<void> {\n\t\tconst stdin = (globalThis as any).process.stdin;\n\t\tconst stdout = (globalThis as any).process.stdout;\n\n\t\tstdin.setEncoding('utf8');\n\n\t\tlet buffer = '';\n\t\tstdin.on('data', async (chunk: string) => {\n\t\t\tbuffer += chunk;\n\t\t\t// Process complete lines\n\t\t\tconst lines = buffer.split('\\n');\n\t\t\tbuffer = lines.pop() ?? '';\n\n\t\t\tfor (const line of lines) {\n\t\t\t\tconst trimmed = line.trim();\n\t\t\t\tif (!trimmed) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst message = JSON.parse(trimmed) as JsonRpcRequest;\n\t\t\t\t\tconst result = await this.handleJsonRpc(message);\n\t\t\t\t\tif (result !== null) {\n\t\t\t\t\t\tstdout.write(JSON.stringify(result) + '\\n');\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tstdout.write(JSON.stringify({\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\terror: { code: -32700, message: 'Parse error' },\n\t\t\t\t\t}) + '\\n');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edge.libx.js",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "main": "build/main.js",
5
5
  "license": "MIT",
6
6
  "author": "Elya Livshitz",
@@ -209,8 +209,8 @@ export class MCPAdapter {
209
209
 
210
210
  const fullUrl = `http://localhost${url}`;
211
211
  const requestInit: RequestInit = { method };
212
- if (args.body && ['POST', 'PUT', 'PATCH'].includes(method)) {
213
- requestInit.body = JSON.stringify(args.body);
212
+ if (['POST', 'PUT', 'PATCH'].includes(method)) {
213
+ requestInit.body = JSON.stringify(args.body || {});
214
214
  requestInit.headers = { 'Content-Type': 'application/json' };
215
215
  }
216
216