@n8n/ai-utilities 0.35.3 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
1
  export { getProviderPrefix, splitModelId } from './model-id';
2
2
  export { getNativeWebSearchProviderTools, hasNativeWebSearchProvider, isNativeWebSearchRequested, } from './native-web-search-provider-tools';
3
3
  export { applyNativeWebSearchDefaultOn, reconcileNativeWebSearch, rejectIfDynamicSelectorUsesFromAi, rejectIfEmptyInstructions, rejectIfUnsupportedNativeWebSearch, type AgentConfigValidationMessages, } from './config-normalization';
4
+ export { classifyMcpTool, compileMcpToolPermissions, resolveMcpToolPermission, type CompiledMcpToolPermissions, type McpToolAnnotations, type McpToolDescriptor, } from './mcp-tool-permissions';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.rejectIfUnsupportedNativeWebSearch = exports.rejectIfEmptyInstructions = exports.rejectIfDynamicSelectorUsesFromAi = exports.reconcileNativeWebSearch = exports.applyNativeWebSearchDefaultOn = exports.isNativeWebSearchRequested = exports.hasNativeWebSearchProvider = exports.getNativeWebSearchProviderTools = exports.splitModelId = exports.getProviderPrefix = void 0;
3
+ exports.resolveMcpToolPermission = exports.compileMcpToolPermissions = exports.classifyMcpTool = exports.rejectIfUnsupportedNativeWebSearch = exports.rejectIfEmptyInstructions = exports.rejectIfDynamicSelectorUsesFromAi = exports.reconcileNativeWebSearch = exports.applyNativeWebSearchDefaultOn = exports.isNativeWebSearchRequested = exports.hasNativeWebSearchProvider = exports.getNativeWebSearchProviderTools = exports.splitModelId = exports.getProviderPrefix = void 0;
4
4
  var model_id_1 = require("./model-id");
5
5
  Object.defineProperty(exports, "getProviderPrefix", { enumerable: true, get: function () { return model_id_1.getProviderPrefix; } });
6
6
  Object.defineProperty(exports, "splitModelId", { enumerable: true, get: function () { return model_id_1.splitModelId; } });
@@ -14,4 +14,8 @@ Object.defineProperty(exports, "reconcileNativeWebSearch", { enumerable: true, g
14
14
  Object.defineProperty(exports, "rejectIfDynamicSelectorUsesFromAi", { enumerable: true, get: function () { return config_normalization_1.rejectIfDynamicSelectorUsesFromAi; } });
15
15
  Object.defineProperty(exports, "rejectIfEmptyInstructions", { enumerable: true, get: function () { return config_normalization_1.rejectIfEmptyInstructions; } });
16
16
  Object.defineProperty(exports, "rejectIfUnsupportedNativeWebSearch", { enumerable: true, get: function () { return config_normalization_1.rejectIfUnsupportedNativeWebSearch; } });
17
+ var mcp_tool_permissions_1 = require("./mcp-tool-permissions");
18
+ Object.defineProperty(exports, "classifyMcpTool", { enumerable: true, get: function () { return mcp_tool_permissions_1.classifyMcpTool; } });
19
+ Object.defineProperty(exports, "compileMcpToolPermissions", { enumerable: true, get: function () { return mcp_tool_permissions_1.compileMcpToolPermissions; } });
20
+ Object.defineProperty(exports, "resolveMcpToolPermission", { enumerable: true, get: function () { return mcp_tool_permissions_1.resolveMcpToolPermission; } });
17
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent-config/index.ts"],"names":[],"mappings":";;;AAAA,uCAA6D;AAApD,6GAAA,iBAAiB,OAAA;AAAE,wGAAA,YAAY,OAAA;AACxC,uFAI4C;AAH3C,mJAAA,+BAA+B,OAAA;AAC/B,8IAAA,0BAA0B,OAAA;AAC1B,8IAAA,0BAA0B,OAAA;AAE3B,+DAOgC;AAN/B,qIAAA,6BAA6B,OAAA;AAC7B,gIAAA,wBAAwB,OAAA;AACxB,yIAAA,iCAAiC,OAAA;AACjC,iIAAA,yBAAyB,OAAA;AACzB,0IAAA,kCAAkC,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent-config/index.ts"],"names":[],"mappings":";;;AAAA,uCAA6D;AAApD,6GAAA,iBAAiB,OAAA;AAAE,wGAAA,YAAY,OAAA;AACxC,uFAI4C;AAH3C,mJAAA,+BAA+B,OAAA;AAC/B,8IAAA,0BAA0B,OAAA;AAC1B,8IAAA,0BAA0B,OAAA;AAE3B,+DAOgC;AAN/B,qIAAA,6BAA6B,OAAA;AAC7B,gIAAA,wBAAwB,OAAA;AACxB,yIAAA,iCAAiC,OAAA;AACjC,iIAAA,yBAAyB,OAAA;AACzB,0IAAA,kCAAkC,OAAA;AAGnC,+DAOgC;AAN/B,uHAAA,eAAe,OAAA;AACf,iIAAA,yBAAyB,OAAA;AACzB,gIAAA,wBAAwB,OAAA"}
@@ -0,0 +1,21 @@
1
+ import type { McpToolCategory, McpToolPermission, McpToolPermissions } from '@n8n/api-types';
2
+ export interface McpToolAnnotations {
3
+ readOnlyHint?: boolean;
4
+ destructiveHint?: boolean;
5
+ idempotentHint?: boolean;
6
+ openWorldHint?: boolean;
7
+ }
8
+ export interface McpToolDescriptor {
9
+ name: string;
10
+ annotations?: McpToolAnnotations;
11
+ }
12
+ export interface CompiledMcpToolPermissions {
13
+ toolFilter?: {
14
+ mode: 'exclude';
15
+ tools: string[];
16
+ };
17
+ requireApproval?: boolean | string[];
18
+ }
19
+ export declare function classifyMcpTool(tool: McpToolDescriptor): McpToolCategory;
20
+ export declare function resolveMcpToolPermission(policy: McpToolPermissions, tool: McpToolDescriptor): McpToolPermission;
21
+ export declare function compileMcpToolPermissions(policy: McpToolPermissions, tools: McpToolDescriptor[]): CompiledMcpToolPermissions;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classifyMcpTool = classifyMcpTool;
4
+ exports.resolveMcpToolPermission = resolveMcpToolPermission;
5
+ exports.compileMcpToolPermissions = compileMcpToolPermissions;
6
+ const READ_SEGMENTS = new Set([
7
+ 'describe',
8
+ 'fetch',
9
+ 'find',
10
+ 'get',
11
+ 'inspect',
12
+ 'list',
13
+ 'lookup',
14
+ 'preview',
15
+ 'query',
16
+ 'read',
17
+ 'retrieve',
18
+ 'search',
19
+ ]);
20
+ const WRITE_SEGMENTS = new Set([
21
+ 'add',
22
+ 'append',
23
+ 'archive',
24
+ 'cancel',
25
+ 'create',
26
+ 'delete',
27
+ 'disable',
28
+ 'edit',
29
+ 'enable',
30
+ 'execute',
31
+ 'import',
32
+ 'insert',
33
+ 'invite',
34
+ 'move',
35
+ 'publish',
36
+ 'remove',
37
+ 'rename',
38
+ 'restore',
39
+ 'revoke',
40
+ 'run',
41
+ 'send',
42
+ 'set',
43
+ 'submit',
44
+ 'trigger',
45
+ 'update',
46
+ 'upload',
47
+ 'write',
48
+ ]);
49
+ function toolNameSegments(name) {
50
+ return name
51
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
52
+ .toLowerCase()
53
+ .split(/[^a-z0-9]+/)
54
+ .filter((segment) => segment.length > 0);
55
+ }
56
+ function classifyMcpTool(tool) {
57
+ const segments = toolNameSegments(tool.name);
58
+ const hasWriteName = segments.some((segment) => WRITE_SEGMENTS.has(segment));
59
+ if (tool.annotations?.readOnlyHint === false || tool.annotations?.destructiveHint === true) {
60
+ return 'write';
61
+ }
62
+ if (tool.annotations?.readOnlyHint === true) {
63
+ return 'read';
64
+ }
65
+ if (hasWriteName)
66
+ return 'write';
67
+ return segments.some((segment) => READ_SEGMENTS.has(segment)) ? 'read' : 'write';
68
+ }
69
+ function resolveMcpToolPermission(policy, tool) {
70
+ if (policy.tools && Object.hasOwn(policy.tools, tool.name)) {
71
+ return policy.tools[tool.name];
72
+ }
73
+ return policy.categories[classifyMcpTool(tool)];
74
+ }
75
+ function compileMcpToolPermissions(policy, tools) {
76
+ const blockedTools = [];
77
+ const approvalTools = [];
78
+ for (const tool of tools) {
79
+ const permission = resolveMcpToolPermission(policy, tool);
80
+ if (permission === 'blocked') {
81
+ blockedTools.push(tool.name);
82
+ continue;
83
+ }
84
+ if (permission === 'require_approval')
85
+ approvalTools.push(tool.name);
86
+ }
87
+ return {
88
+ toolFilter: { mode: 'exclude', tools: blockedTools },
89
+ requireApproval: approvalTools,
90
+ };
91
+ }
92
+ //# sourceMappingURL=mcp-tool-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-permissions.js","sourceRoot":"","sources":["../../../src/agent-config/mcp-tool-permissions.ts"],"names":[],"mappings":";;;;;AAmBA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC7B,UAAU;IACV,OAAO;IACP,MAAM;IACN,KAAK;IACL,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,UAAU;IACV,QAAQ;CACR,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,KAAK;IACL,MAAM;IACN,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;CACP,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,IAAY;IACrC,OAAO,IAAI;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,yBAAgC,IAAuB;IACtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7E,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,KAAK,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,eAAe,KAAK,IAAI,EAAE,CAAC;QAC5F,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAI,YAAY;QAAE,OAAO,OAAO,CAAC;IAEjC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAClF,CAAC;AAED,kCACC,MAA0B,EAC1B,IAAuB;IAEvB,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,mCACC,MAA0B,EAC1B,KAA0B;IAE1B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,SAAS;QACV,CAAC;QAED,IAAI,UAAU,KAAK,kBAAkB;YAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACN,UAAU,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;QAC7D,eAAe,EAAE,aAAa;KAC9B,CAAC;AACH,CAAC"}