UNPKG

opencontrol

Version:

89 lines (88 loc) 2.42 kB
// src/mcp.ts import { CallToolRequestSchema, InitializeRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"; import { z } from "zod"; import { zodToJsonSchema } from "zod-to-json-schema"; var RequestSchema = z.union([ InitializeRequestSchema, ListToolsRequestSchema, CallToolRequestSchema ]); function createMcp(input) { return { async process(message) { const parsed = RequestSchema.parse(message); const result = await (async () => { if (parsed.method === "initialize") return { protocolVersion: "2024-11-05", capabilities: { tools: {} }, serverInfo: { name: "opencontrol", version: "0.0.1" } }; if (parsed.method === "tools/list") { return { tools: input.tools.map((tool) => ({ name: tool.name, inputSchema: zodToJsonSchema(tool.args || z.object({}), "args").definitions["args"], description: tool.description })) }; } if (parsed.method === "tools/call") { const tool = input.tools.find((tool2) => tool2.name === parsed.params.name); if (!tool) throw new Error("tool not found"); let args = parsed.params.arguments; if (tool.args) { const validated = await tool.args["~standard"].validate(args); if (validated.issues) { return { isError: true, content: [ { type: "text", text: JSON.stringify(validated.issues) } ] }; } args = validated.value; } return tool.run(args).catch((error) => ({ isError: true, content: [ { type: "text", text: error.message } ] })).then((result2) => ({ content: [ { type: "text", text: JSON.stringify(result2, null, 2) } ] })); } throw new Error("not implemented"); })(); return { jsonrpc: "2.0", id: message.id, result }; } }; } export { createMcp };