n8n
Version:
n8n Workflow Automation Tool
133 lines • 4.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MCP_BASE_OAUTH2_CREDENTIAL_NAME = exports.MCP_REGISTRY_BASE_NODE_NAME = exports.LANGCHAIN_PACKAGE_NAME = exports.MCP_REGISTRY_PACKAGE_NAME = void 0;
exports.serverToCredentialDescription = serverToCredentialDescription;
exports.serverToNodeDescription = serverToNodeDescription;
const change_case_1 = require("change-case");
exports.MCP_REGISTRY_PACKAGE_NAME = '@n8n/mcp-registry';
exports.LANGCHAIN_PACKAGE_NAME = '@n8n/n8n-nodes-langchain';
exports.MCP_REGISTRY_BASE_NODE_NAME = 'mcpRegistryClientTool';
exports.MCP_BASE_OAUTH2_CREDENTIAL_NAME = 'mcpOAuth2Api';
function getMcpRegistryNodeTypeName(server) {
return (0, change_case_1.camelCase)(server.slug);
}
function getMcpRegistryCredentialTypeName(server) {
return `${(0, change_case_1.camelCase)(server.slug)}McpOAuth2Api`;
}
function serverToOAuth2CredentialDescription(server) {
const remote = pickRemote(server);
if (!remote)
return null;
return {
name: getMcpRegistryCredentialTypeName(server),
extends: [exports.MCP_BASE_OAUTH2_CREDENTIAL_NAME],
icon: `node:${exports.MCP_REGISTRY_PACKAGE_NAME}.${getMcpRegistryNodeTypeName(server)}`,
displayName: `${server.title} MCP OAuth2`,
properties: [
{
displayName: 'Use Dynamic Client Registration',
name: 'useDynamicClientRegistration',
type: 'hidden',
default: true,
},
{
displayName: 'Server URL',
name: 'serverUrl',
type: 'hidden',
default: remote.endpointUrl,
},
{
displayName: 'Allowed HTTP Request Domains',
name: 'allowedHttpRequestDomains',
type: 'hidden',
default: 'none',
},
],
};
}
function getNodeDescriptionCredentials(server) {
switch (server.authType) {
case 'oauth2':
return [{ name: getMcpRegistryCredentialTypeName(server), required: true }];
default:
return [];
}
}
function pickRemote(server) {
const streamable = server.remotes.find((r) => r.type === 'streamable-http');
if (streamable)
return { transport: 'httpStreamable', endpointUrl: streamable.url };
const sse = server.remotes.find((r) => r.type === 'sse');
if (sse)
return { transport: 'sse', endpointUrl: sse.url };
return null;
}
const ICON_MIME_PREFERENCE = [
'image/svg+xml',
'image/webp',
'image/png',
'image/jpeg',
'image/jpg',
];
function preferredIcon(icons) {
for (const mimeType of ICON_MIME_PREFERENCE) {
const match = icons.find((icon) => icon.mimeType === mimeType);
if (match)
return match;
}
return icons[0];
}
function pickIconUrl(icons) {
const light = preferredIcon(icons.filter((icon) => icon.theme === 'light'));
const dark = preferredIcon(icons.filter((icon) => icon.theme === 'dark'));
if (light && dark)
return { light: light.src, dark: dark.src };
return preferredIcon(icons)?.src;
}
function withRemoteDefaults(properties, transport, endpointUrl) {
return properties.map((prop) => {
if (prop.name === 'endpointUrl')
return { ...prop, default: endpointUrl };
if (prop.name === 'serverTransport')
return { ...prop, default: transport };
return prop;
});
}
function serverToCredentialDescription(server) {
switch (server.authType) {
case 'oauth2':
return serverToOAuth2CredentialDescription(server);
default:
return null;
}
}
function serverToNodeDescription(server, baseDescription) {
if (server.authType !== 'oauth2')
return null;
const remote = pickRemote(server);
if (!remote)
return null;
const displayName = `${server.title} MCP`;
const description = structuredClone(baseDescription);
if (server.status === 'deprecated') {
description.hidden = true;
}
else {
delete description.hidden;
}
description.displayName = displayName;
description.name = (0, change_case_1.camelCase)(server.slug);
description.iconUrl = pickIconUrl(server.icons);
description.description = server.description;
description.defaults = { name: displayName };
description.credentials = getNodeDescriptionCredentials(server);
if (description.codex) {
description.codex.alias?.push(server.title, displayName);
if (server.websiteUrl) {
description.codex.resources = { primaryDocumentation: [{ url: server.websiteUrl }] };
}
}
description.properties = withRemoteDefaults(description.properties, remote.transport, remote.endpointUrl);
return description;
}
//# sourceMappingURL=node-description-transform.js.map