n8n-nodes-explorium
Version:
Explorium MCP node for n8n
94 lines • 3.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertJsonSchemaToZod = exports.connectMcpClient = exports.mcpToolToDynamicTool = exports.createCallTool = exports.getErrorDescriptionFromToolCall = exports.getAllTools = void 0;
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
const sse_js_1 = require("@modelcontextprotocol/sdk/client/sse.js");
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
const json_schema_to_zod_1 = require("@n8n/json-schema-to-zod");
const tools_1 = require("@langchain/core/tools");
const n8n_workflow_1 = require("n8n-workflow");
async function getAllTools(client, cursor) {
const { tools, nextCursor } = await client.listTools({ cursor });
if (nextCursor) {
return tools.concat(await getAllTools(client, nextCursor));
}
return tools;
}
exports.getAllTools = getAllTools;
const getErrorDescriptionFromToolCall = (result) => {
var _a;
if (result && typeof result === 'object') {
const typedResult = result;
if ('content' in typedResult && Array.isArray(typedResult.content)) {
const errorMessage = (_a = typedResult.content.find((content) => content && typeof content === 'object' && typeof content.text === 'string')) === null || _a === void 0 ? void 0 : _a.text;
return errorMessage;
}
else if ('toolResult' in typedResult && typeof typedResult.toolResult === 'string') {
return typedResult.toolResult;
}
if ('message' in typedResult && typeof typedResult.message === 'string') {
return typedResult.message;
}
}
return undefined;
};
exports.getErrorDescriptionFromToolCall = getErrorDescriptionFromToolCall;
const createCallTool = (name, client, onError) => async (args) => {
try {
const result = await client.callTool({ name, arguments: args }, types_js_1.CompatibilityCallToolResultSchema);
if (result.isError) {
return onError((0, exports.getErrorDescriptionFromToolCall)(result));
}
if (result.toolResult !== undefined) {
return result.toolResult;
}
if (result.content !== undefined) {
return result.content;
}
return result;
}
catch (error) {
return onError((0, exports.getErrorDescriptionFromToolCall)(error));
}
};
exports.createCallTool = createCallTool;
function mcpToolToDynamicTool(tool, onCallTool) {
var _a;
return new tools_1.DynamicStructuredTool({
name: tool.name,
description: (_a = tool.description) !== null && _a !== void 0 ? _a : '',
schema: convertJsonSchemaToZod(tool.inputSchema),
func: onCallTool,
metadata: { isFromToolkit: true },
});
}
exports.mcpToolToDynamicTool = mcpToolToDynamicTool;
async function connectMcpClient({ headers, sseEndpoint, name, version, }) {
try {
const endpoint = new URL(sseEndpoint);
const transport = new sse_js_1.SSEClientTransport(endpoint, {
eventSourceInit: {
fetch: async (url, init) => await fetch(url, {
...init,
headers: {
...headers,
Accept: 'text/event-stream',
},
}),
},
requestInit: { headers },
});
const client = new index_js_1.Client({ name, version: version.toString() }, { capabilities: { tools: {} } });
await client.connect(transport);
return (0, n8n_workflow_1.createResultOk)(client);
}
catch (error) {
return (0, n8n_workflow_1.createResultError)({ type: 'connection', error });
}
}
exports.connectMcpClient = connectMcpClient;
function convertJsonSchemaToZod(schema) {
return (0, json_schema_to_zod_1.jsonSchemaToZod)(schema);
}
exports.convertJsonSchemaToZod = convertJsonSchemaToZod;
//# sourceMappingURL=utils.js.map