import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js"; import { readFile } from "node:fs/promises"; import path from "node:path"; const value = (f: string) => { const i = process.argv.indexOf(f); return i >= 0 ? process.argv[i + 1] : undefined; }; const projectDir = path.resolve(value("--project") || "projects/MyGame"), endpoint = value("--url") || "http://127.0.0.1:4318/mcp", token = process.env.FORMA_MCP_TOKEN || (await readFile(path.join(projectDir, ".mcp-token"), "utf8")).trim(); const client = new Client({ name: "forma-stdio-bridge", version: "0.3.0" }); await client.connect( new StreamableHTTPClientTransport(new URL(endpoint), { requestInit: { headers: { Authorization: "Bearer " + token } }, }), ); const server = new Server( { name: "forma-engine", version: "0.3.0" }, { capabilities: { tools: {}, resources: {}, prompts: {} } }, ); server.setRequestHandler(ListToolsRequestSchema, () => client.listTools()); server.setRequestHandler(CallToolRequestSchema, (r) => client.callTool(r.params), ); server.setRequestHandler(ListResourcesRequestSchema, () => client.listResources(), ); server.setRequestHandler(ReadResourceRequestSchema, (r) => client.readResource(r.params), ); server.setRequestHandler(ListPromptsRequestSchema, () => client.listPrompts()); server.setRequestHandler(GetPromptRequestSchema, (r) => client.getPrompt(r.params), ); await server.connect(new StdioServerTransport()); process.once( "SIGINT", () => void Promise.all([client.close(), server.close()]).then(() => process.exit(0), ), );