Files
forma-engine/server/stdio.ts
T

56 lines
2.0 KiB
TypeScript

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),
),
);