genkitx-mcp
Version:
A Genkit plugin that provides interoperability between Genkit and Model Context Protocol (MCP). Both client and server use cases are supported.
61 lines • 1.73 kB
JavaScript
import { z } from "genkit";
import { logger } from "genkit/logging";
const toText = (c) => c.map((p) => p.text || "").join("");
function processResult(result) {
if (result.isError) return { error: toText(result.content) };
if (result.content.every((c) => !!c.text)) {
const text = toText(result.content);
if (text.trim().startsWith("{") || text.trim().startsWith("[")) {
try {
return JSON.parse(text);
} catch (e) {
return text;
}
}
return text;
}
if (result.content.length === 1) return result.content[0];
return result;
}
function registerTool(ai, client, tool, params) {
logger.debug(
`[@genkit-ai/mcp] Registering MCP tool ${params.name}/${tool.name}`
);
ai.defineTool(
{
name: `${params.name}/${tool.name}`,
description: tool.description || "",
inputJsonSchema: tool.inputSchema,
outputSchema: z.any()
},
async (args) => {
logger.debug(
`[@genkit-ai/mcp] Calling MCP tool ${params.name}/${tool.name} with arguments`,
JSON.stringify(args)
);
const result = await client.callTool({
name: tool.name,
arguments: args
});
logger.debug(
`MCP tool ${tool.name} result:`,
JSON.stringify(result, null, 2)
);
if (params.rawToolResponses) return result;
return processResult(result);
}
);
}
async function registerAllTools(ai, client, params) {
let cursor;
while (true) {
const { nextCursor, tools } = await client.listTools({ cursor });
tools.forEach((t) => registerTool(ai, client, t, params));
cursor = nextCursor;
if (!cursor) break;
}
}
export {
registerAllTools
};
//# sourceMappingURL=tools.mjs.map