WIP. A little custom music server
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}