From df8051b975778a17381bf32d093bc1f29bd47e85 Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Thu, 10 Oct 2024 09:13:19 -0700 Subject: [PATCH] use proxy function --- server/src/index.ts | 81 ++++++------------------------------------ server/src/mcpProxy.ts | 30 ++++++++++++++++ 2 files changed, 40 insertions(+), 71 deletions(-) create mode 100644 server/src/mcpProxy.ts diff --git a/server/src/index.ts b/server/src/index.ts index 547c483..902ee03 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -3,22 +3,9 @@ import cors from "cors"; import { Server } from "mcp-typescript/server/index.js"; import { SSEServerTransport } from "mcp-typescript/server/sse.js"; import express from "express"; -import { - CallToolRequestSchema, - GetPromptRequestSchema, - ListPromptsRequestSchema, - ListResourcesRequestSchema, - ListToolsRequestSchema, - ReadResourceRequestSchema, - ListResourcesResultSchema, - ReadResourceResultSchema, - ListPromptsResultSchema, - GetPromptResultSchema, - ListToolsResultSchema, - CallToolResultSchema, -} from "mcp-typescript/types.js"; import { Client } from "mcp-typescript/client/index.js"; import { StdioClientTransport } from "mcp-typescript/client/stdio.js"; +import mcpProxy from "./mcpProxy.js"; const app = express(); app.use(cors()); @@ -47,65 +34,17 @@ app.get("/sse", async (req, res) => { await mcpClient.close(); }; - server.setRequestHandler(ListResourcesRequestSchema, () => - mcpClient.request( - { - method: "resources/list", - }, - ListResourcesResultSchema, - ), - ); - - server.setRequestHandler(ReadResourceRequestSchema, (params) => - mcpClient.request( - { - method: "resources/read", - params: params.params, - }, - ReadResourceResultSchema, - ), - ); - - server.setRequestHandler(ListPromptsRequestSchema, () => - mcpClient.request( - { - method: "prompts/list", - }, - ListPromptsResultSchema, - ), - ); - - server.setRequestHandler(GetPromptRequestSchema, (params) => { - return mcpClient.request( - { - method: "prompts/get", - params: params.params, - }, - GetPromptResultSchema, - ); - }); - - server.setRequestHandler(ListToolsRequestSchema, () => - mcpClient.request( - { - method: "tools/list", - }, - ListToolsResultSchema, - ), - ); - - server.setRequestHandler(CallToolRequestSchema, (params) => - mcpClient.request( - { - method: "tools/call", - params: params.params, - }, - CallToolResultSchema, - ), - ); - await webAppTransport.connectSSE(req, res); await server.connect(webAppTransport); + + mcpProxy({ + transportToClient: webAppTransport, + transportToServer: backingServerTransport, + onerror: (error) => { + console.error(error); + server.close(); + }, + }); }); app.post("/message", async (req, res) => { diff --git a/server/src/mcpProxy.ts b/server/src/mcpProxy.ts new file mode 100644 index 0000000..e6c4124 --- /dev/null +++ b/server/src/mcpProxy.ts @@ -0,0 +1,30 @@ +import { Transport } from "mcp-typescript/shared/transport.js"; + +export default function mcpProxy({ + transportToClient, + transportToServer, + onerror, +}: { + transportToClient: Transport; + transportToServer: Transport; + onerror: (error: Error) => void; +}) { + transportToClient.onmessage = (message) => { + transportToServer.send(message).catch(onerror); + }; + + transportToServer.onmessage = (message) => { + transportToClient.send(message).catch(onerror); + }; + + transportToClient.onclose = () => { + transportToServer.close().catch(onerror); + }; + + transportToServer.onclose = () => { + transportToClient.close().catch(onerror); + }; + + transportToClient.onerror = onerror; + transportToServer.onerror = onerror; +}