56 lines
2.0 KiB
TypeScript
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),
|
|
),
|
|
);
|