fix: Skip AI tool generation for community trigger nodes (#29453)

This commit is contained in:
Michael Kret
2026-05-05 07:50:52 +00:00
committed by GitHub
parent c6cbc49016
commit c724dace38
2 changed files with 55 additions and 1 deletions
@@ -625,6 +625,57 @@ describe('CommunityNodeTypesService', () => {
expect(result.find((n) => n.name === 'n8n-nodes-test3.test3Tool')).toBeUndefined();
});
it('should not create AI tool version for nodes with trigger group', async () => {
const mockNodeTypes = [
{
name: 'n8n-nodes-wcrm.wCRMTrigger',
packageName: 'n8n-nodes-wcrm',
nodeDescription: {
name: 'n8n-nodes-wcrm.wCRMTrigger',
displayName: 'wCRM Trigger',
group: ['trigger'],
inputs: [],
outputs: ['main'],
usableAsTool: true,
},
},
];
(getCommunityNodeTypes as jest.Mock).mockResolvedValueOnce(mockNodeTypes);
const result = await service.getCommunityNodeTypes();
expect(result.length).toBe(1); // only original, no tool version
expect(result.find((n) => n.name === 'n8n-nodes-wcrm.wCRMTriggerTool')).toBeUndefined();
});
it('should create AI tool version for nodes with "trigger" in the name but not in the group', async () => {
// e.g. a node for the trigger.dev service — name contains "trigger" but it's not a trigger node
const mockNodeTypes = [
{
name: 'n8n-nodes-triggerdev.triggerDevAction',
packageName: 'n8n-nodes-triggerdev',
nodeDescription: {
name: 'n8n-nodes-triggerdev.triggerDevAction',
displayName: 'Trigger.dev Action',
group: [],
inputs: ['main'],
outputs: ['main'],
usableAsTool: true,
},
},
];
(getCommunityNodeTypes as jest.Mock).mockResolvedValueOnce(mockNodeTypes);
const result = await service.getCommunityNodeTypes();
expect(result.length).toBe(2); // original + tool version
expect(
result.find((n) => n.name === 'n8n-nodes-triggerdev.triggerDevActionTool'),
).toBeDefined();
});
it('should not mutate original node type when creating tool version', async () => {
const mockNodeTypes = [
{
@@ -148,7 +148,10 @@ export class CommunityNodeTypesService {
private createAiTools() {
const usableAsTools = Array.from(this.communityNodeTypes.values()).filter(
(nodeType) => nodeType.nodeDescription.usableAsTool && !isToolType(nodeType.name),
(nodeType) =>
nodeType.nodeDescription.usableAsTool &&
!isToolType(nodeType.name) &&
!nodeType.nodeDescription.group?.includes('trigger'),
);
const forbiddenCategories = ['Recommended Tools'];
for (const nodeType of usableAsTools) {