UNPKG

genkitx-mcp

Version:

A Genkit plugin that provides interoperability between Genkit and Model Context Protocol (MCP). Both client and server use cases are supported.

1 lines 4.4 kB
{"version":3,"sources":["../../src/client/tools.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js' with { 'resolution-mode': 'import' };\nimport type {\n CallToolResult,\n Tool,\n} from '@modelcontextprotocol/sdk/types.js' with { 'resolution-mode': 'import' };\nimport { Genkit, z } from 'genkit';\nimport { logger } from 'genkit/logging';\nimport type { McpClientOptions } from '../index.js';\n\nconst toText = (c: CallToolResult['content']) =>\n c.map((p) => p.text || '').join('');\n\nfunction processResult(result: CallToolResult) {\n if (result.isError) return { error: toText(result.content) };\n if (result.content.every((c) => !!c.text)) {\n const text = toText(result.content);\n if (text.trim().startsWith('{') || text.trim().startsWith('[')) {\n try {\n return JSON.parse(text);\n } catch (e) {\n return text;\n }\n }\n return text;\n }\n if (result.content.length === 1) return result.content[0];\n return result;\n}\n\nfunction registerTool(\n ai: Genkit,\n client: Client,\n tool: Tool,\n params: McpClientOptions\n) {\n logger.debug(\n `[@genkit-ai/mcp] Registering MCP tool ${params.name}/${tool.name}`\n );\n ai.defineTool(\n {\n name: `${params.name}/${tool.name}`,\n description: tool.description || '',\n inputJsonSchema: tool.inputSchema,\n outputSchema: z.any(),\n },\n async (args) => {\n logger.debug(\n `[@genkit-ai/mcp] Calling MCP tool ${params.name}/${tool.name} with arguments`,\n JSON.stringify(args)\n );\n const result = await client.callTool({\n name: tool.name,\n arguments: args,\n });\n logger.debug(\n `MCP tool ${tool.name} result:`,\n JSON.stringify(result, null, 2)\n );\n if (params.rawToolResponses) return result;\n return processResult(result as CallToolResult);\n }\n );\n}\n\n/**\n * Lookup all tools available in the server and register each as a Genkit tool.\n */\nexport async function registerAllTools(\n ai: Genkit,\n client: Client,\n params: McpClientOptions\n): Promise<void> {\n let cursor: string | undefined;\n while (true) {\n const { nextCursor, tools } = await client.listTools({ cursor });\n tools.forEach((t) => registerTool(ai, client, t, params));\n cursor = nextCursor;\n if (!cursor) break;\n }\n}\n"],"mappings":";;;AAqBA,SAAiB,SAAS;AAC1B,SAAS,cAAc;AAGvB,MAAM,SAAS,CAAC,MACd,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE;AAEpC,SAAS,cAAc,QAAwB;AAC7C,MAAI,OAAO,QAAS,QAAO,EAAE,OAAO,OAAO,OAAO,OAAO,EAAE;AAC3D,MAAI,OAAO,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG;AACzC,UAAM,OAAO,OAAO,OAAO,OAAO;AAClC,QAAI,KAAK,KAAK,EAAE,WAAW,GAAG,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AAC9D,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,SAAS,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ,WAAW,EAAG,QAAO,OAAO,QAAQ,CAAC;AACxD,SAAO;AACT;AAEA,SAAS,aACP,IACA,QACA,MACA,QACA;AACA,SAAO;AAAA,IACL,yCAAyC,OAAO,IAAI,IAAI,KAAK,IAAI;AAAA,EACnE;AACA,KAAG;AAAA,IACD;AAAA,MACE,MAAM,GAAG,OAAO,IAAI,IAAI,KAAK,IAAI;AAAA,MACjC,aAAa,KAAK,eAAe;AAAA,MACjC,iBAAiB,KAAK;AAAA,MACtB,cAAc,EAAE,IAAI;AAAA,IACtB;AAAA,IACA,CAAO,SAAS;AACd,aAAO;AAAA,QACL,qCAAqC,OAAO,IAAI,IAAI,KAAK,IAAI;AAAA,QAC7D,KAAK,UAAU,IAAI;AAAA,MACrB;AACA,YAAM,SAAS,MAAM,OAAO,SAAS;AAAA,QACnC,MAAM,KAAK;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AACD,aAAO;AAAA,QACL,YAAY,KAAK,IAAI;AAAA,QACrB,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MAChC;AACA,UAAI,OAAO,iBAAkB,QAAO;AACpC,aAAO,cAAc,MAAwB;AAAA,IAC/C;AAAA,EACF;AACF;AAKA,SAAsB,iBACpB,IACA,QACA,QACe;AAAA;AACf,QAAI;AACJ,WAAO,MAAM;AACX,YAAM,EAAE,YAAY,MAAM,IAAI,MAAM,OAAO,UAAU,EAAE,OAAO,CAAC;AAC/D,YAAM,QAAQ,CAAC,MAAM,aAAa,IAAI,QAAQ,GAAG,MAAM,CAAC;AACxD,eAAS;AACT,UAAI,CAAC,OAAQ;AAAA,IACf;AAAA,EACF;AAAA;","names":[]}