WIP. A little custom music server
at main 57 lines 1.4 kB view raw
1import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; 2 3import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js"; 5 6export async function handleMcpRequest(request: Request, server: McpServer): Promise<Response> { 7 try { 8 const jsonRpcRequest = (await request.json()) as JSONRPCMessage; 9 10 const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); 11 12 let responseData: JSONRPCMessage | null = null; 13 14 clientTransport.onmessage = (message: JSONRPCMessage) => { 15 responseData = message; 16 }; 17 18 await server.connect(serverTransport); 19 20 await clientTransport.start(); 21 await serverTransport.start(); 22 23 await clientTransport.send(jsonRpcRequest); 24 25 await new Promise((resolve) => setTimeout(resolve, 10)); 26 27 await clientTransport.close(); 28 await serverTransport.close(); 29 30 return Response.json(responseData, { 31 headers: { 32 "Content-Type": "application/json", 33 }, 34 }); 35 } catch (error) { 36 console.error("MCP handler error:", error); 37 38 // Return a JSON-RPC error response 39 return Response.json( 40 { 41 jsonrpc: "2.0", 42 error: { 43 code: -32603, 44 message: "Internal server error", 45 data: error instanceof Error ? error.message : String(error), 46 }, 47 id: null, 48 }, 49 { 50 status: 500, 51 headers: { 52 "Content-Type": "application/json", 53 }, 54 }, 55 ); 56 } 57}