UNPKG

n8n

Version:

n8n Workflow Automation Tool

155 lines • 6.01 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.mapApprovalToSdk = mapApprovalToSdk; exports.createAuthFetch = createAuthFetch; exports.buildMcpClientForServer = buildMcpClientForServer; const ai_utilities_1 = require("@n8n/ai-utilities"); const n8n_workflow_1 = require("n8n-workflow"); function mapApprovalToSdk(approval) { if (!approval) return undefined; if (approval.mode === 'global') return true; return approval.tools; } function isTokenData(tokenData) { return (typeof tokenData === 'object' && tokenData !== null && 'access_token' in tokenData && typeof tokenData.access_token === 'string'); } async function deriveAuthHeaders(server, credentialProvider) { if (server.authentication === 'none' || !server.credential) return {}; const resolved = await credentialProvider.resolve(server.credential).catch(() => null); if (!resolved) return {}; if ((0, n8n_workflow_1.isMcpOAuth2Authentication)(server.authentication)) { const tokenData = resolved.oauthTokenData; if (!isTokenData(tokenData)) return {}; return { Authorization: `Bearer ${tokenData.access_token}`, }; } switch (server.authentication) { case 'bearerAuth': { const token = typeof resolved.token === 'string' ? resolved.token : ''; return token ? { Authorization: `Bearer ${token}` } : {}; } case 'headerAuth': { const name = typeof resolved.name === 'string' ? resolved.name : ''; const value = typeof resolved.value === 'string' ? resolved.value : ''; return name && value ? { [name]: value } : {}; } case 'multipleHeadersAuth': { const headers = resolved.headers; if (!headers || typeof headers !== 'object' || !('values' in headers) || !Array.isArray(headers.values)) { return {}; } const values = headers.values; const out = {}; for (const entry of values) { if (typeof entry.name === 'string' && typeof entry.value === 'string') { out[entry.name] = entry.value; } } return out; } default: return {}; } } function headersToRecord(headers) { if (!headers) return {}; if (headers instanceof Headers) return Object.fromEntries(headers.entries()); if (Array.isArray(headers)) return Object.fromEntries(headers); return headers; } function createAuthFetch({ initialHeaders, onUnauthorized, }) { let headers = initialHeaders; return async (input, init) => { const response = await (0, ai_utilities_1.proxyFetch)(input, { ...init, headers: { ...headersToRecord(init?.headers), ...headers }, }); if (response.status !== 401 || !onUnauthorized) return response; const refreshed = await onUnauthorized(); if (!refreshed) return response; headers = refreshed; return await (0, ai_utilities_1.proxyFetch)(input, { ...init, headers: { ...headersToRecord(init?.headers), ...headers }, }); }; } async function buildMcpClientForServer(server, deps) { const { credentialProvider, oauthService, projectId } = deps; const { McpClient } = await Promise.resolve().then(() => __importStar(require('@n8n/agents'))); const initialHeaders = await deriveAuthHeaders(server, credentialProvider); const onUnauthorized = (0, n8n_workflow_1.isMcpOAuth2Authentication)(server.authentication) && server.credential ? async () => { const credentialId = server.credential; if (!credentialId) return null; return await oauthService .refreshOAuth2CredentialById(credentialId, projectId) .catch(() => null); } : undefined; const authFetch = createAuthFetch({ initialHeaders, onUnauthorized }); const sdkServerConfig = { name: server.name, url: server.url, transport: server.transport, fetch: authFetch, toolFilter: server.toolFilter, requireApproval: mapApprovalToSdk(server.approval), ...(server.connectionTimeoutMs !== undefined && { connectionTimeoutMs: server.connectionTimeoutMs, }), }; return new McpClient([sdkServerConfig]); } //# sourceMappingURL=mcp-client-factory.js.map