56 lines
1.7 KiB
JavaScript
56 lines
1.7 KiB
JavaScript
#!/usr/bin/env node
|
|
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 { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
|
|
const endpoint = new URL(process.env.VOIDBOT_MCP_HTTP_URL ?? "http://127.0.0.1:17875/mcp");
|
|
let cachedTools;
|
|
|
|
const server = new Server(
|
|
{ name: "voidbot-transport-bridge", version: "1.0.0" },
|
|
{ capabilities: { tools: {} } },
|
|
);
|
|
|
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
try {
|
|
cachedTools = await withDaemon((client) => client.listTools());
|
|
return cachedTools;
|
|
} catch (error) {
|
|
if (cachedTools) {
|
|
return cachedTools;
|
|
}
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
try {
|
|
return await withDaemon((client) => client.callTool(request.params));
|
|
} catch (error) {
|
|
return {
|
|
isError: true,
|
|
content: [{
|
|
type: "text",
|
|
text: `VoidBot daemon is temporarily unavailable: ${describeError(error)}`,
|
|
}],
|
|
};
|
|
}
|
|
});
|
|
|
|
async function withDaemon(operation) {
|
|
const client = new Client({ name: "voidbot-transport-bridge-upstream", version: "1.0.0" });
|
|
try {
|
|
await client.connect(new StreamableHTTPClientTransport(endpoint));
|
|
return await operation(client);
|
|
} finally {
|
|
await client.close().catch(() => undefined);
|
|
}
|
|
}
|
|
|
|
function describeError(error) {
|
|
return error instanceof Error ? error.message : String(error);
|
|
}
|
|
|
|
await server.connect(new StdioServerTransport());
|