mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-02-06 13:33:11 +00:00
fix: update integration tests to use valid tools after v2.25.0 removal
Replaced all references to removed tools in integration tests: - list_nodes -> search_nodes - get_database_statistics -> tools_documentation - list_ai_tools -> search_nodes/tools_documentation - list_tasks -> tools_documentation - get_node_as_tool_info -> removed test section Updated test files: - tests/integration/mcp-protocol/basic-connection.test.ts - tests/integration/mcp-protocol/performance.test.ts - tests/integration/mcp-protocol/session-management.test.ts - tests/integration/mcp-protocol/test-helpers.ts - tests/integration/mcp-protocol/tool-invocation.test.ts - tests/integration/telemetry/mcp-telemetry.test.ts - tests/unit/mcp/disabled-tools.test.ts - tests/unit/mcp/tools-documentation.test.ts Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -30,66 +30,6 @@ describe('MCP Tool Invocation', () => {
|
||||
});
|
||||
|
||||
describe('Node Discovery Tools', () => {
|
||||
describe('list_nodes', () => {
|
||||
it('should list nodes with default parameters', async () => {
|
||||
const response = await client.callTool({ name: 'list_nodes', arguments: {} });
|
||||
|
||||
expect((response as any).content).toHaveLength(1);
|
||||
expect((response as any).content[0].type).toBe('text');
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
// The result is an object with nodes array and totalCount
|
||||
expect(result).toHaveProperty('nodes');
|
||||
expect(result).toHaveProperty('totalCount');
|
||||
|
||||
const nodes = result.nodes;
|
||||
expect(Array.isArray(nodes)).toBe(true);
|
||||
expect(nodes.length).toBeGreaterThan(0);
|
||||
|
||||
// Check node structure
|
||||
const firstNode = nodes[0];
|
||||
expect(firstNode).toHaveProperty('nodeType');
|
||||
expect(firstNode).toHaveProperty('displayName');
|
||||
expect(firstNode).toHaveProperty('category');
|
||||
});
|
||||
|
||||
it('should filter nodes by category', async () => {
|
||||
const response = await client.callTool({ name: 'list_nodes', arguments: {
|
||||
category: 'trigger'
|
||||
}});
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
const nodes = result.nodes;
|
||||
expect(nodes.length).toBeGreaterThan(0);
|
||||
nodes.forEach((node: any) => {
|
||||
expect(node.category).toBe('trigger');
|
||||
});
|
||||
});
|
||||
|
||||
it('should limit results', async () => {
|
||||
const response = await client.callTool({ name: 'list_nodes', arguments: {
|
||||
limit: 5
|
||||
}});
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
const nodes = result.nodes;
|
||||
expect(nodes).toHaveLength(5);
|
||||
});
|
||||
|
||||
it('should filter by package', async () => {
|
||||
const response = await client.callTool({ name: 'list_nodes', arguments: {
|
||||
package: 'n8n-nodes-base'
|
||||
}});
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
const nodes = result.nodes;
|
||||
expect(nodes.length).toBeGreaterThan(0);
|
||||
nodes.forEach((node: any) => {
|
||||
expect(node.package).toBe('n8n-nodes-base');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('search_nodes', () => {
|
||||
it('should search nodes by keyword', async () => {
|
||||
const response = await client.callTool({ name: 'search_nodes', arguments: {
|
||||
@@ -427,85 +367,8 @@ describe('MCP Tool Invocation', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('AI Tools', () => {
|
||||
describe('list_ai_tools', () => {
|
||||
it('should list AI-capable nodes', async () => {
|
||||
const response = await client.callTool({ name: 'list_ai_tools', arguments: {} });
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
expect(result).toHaveProperty('tools');
|
||||
const aiTools = result.tools;
|
||||
expect(Array.isArray(aiTools)).toBe(true);
|
||||
expect(aiTools.length).toBeGreaterThan(0);
|
||||
|
||||
// All should have nodeType and displayName
|
||||
aiTools.forEach((tool: any) => {
|
||||
expect(tool).toHaveProperty('nodeType');
|
||||
expect(tool).toHaveProperty('displayName');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('get_node_as_tool_info', () => {
|
||||
it('should provide AI tool usage information', async () => {
|
||||
const response = await client.callTool({ name: 'get_node_as_tool_info', arguments: {
|
||||
nodeType: 'nodes-base.slack'
|
||||
}});
|
||||
|
||||
const info = JSON.parse(((response as any).content[0]).text);
|
||||
expect(info).toHaveProperty('nodeType');
|
||||
expect(info).toHaveProperty('isMarkedAsAITool');
|
||||
expect(info).toHaveProperty('aiToolCapabilities');
|
||||
expect(info.aiToolCapabilities).toHaveProperty('commonUseCases');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Task Templates', () => {
|
||||
// get_node_for_task was removed in v2.15.0
|
||||
// Use search_nodes({ includeExamples: true }) instead for real-world examples
|
||||
|
||||
describe('list_tasks', () => {
|
||||
it('should list all available tasks', async () => {
|
||||
const response = await client.callTool({ name: 'list_tasks', arguments: {} });
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
expect(result).toHaveProperty('totalTasks');
|
||||
expect(result).toHaveProperty('categories');
|
||||
expect(result.totalTasks).toBeGreaterThan(0);
|
||||
|
||||
// Check categories structure
|
||||
const categories = result.categories;
|
||||
expect(typeof categories).toBe('object');
|
||||
|
||||
// Check at least one category has tasks
|
||||
const hasTasksInCategories = Object.values(categories).some((tasks: any) =>
|
||||
Array.isArray(tasks) && tasks.length > 0
|
||||
);
|
||||
expect(hasTasksInCategories).toBe(true);
|
||||
});
|
||||
|
||||
it('should filter by category', async () => {
|
||||
const response = await client.callTool({ name: 'list_tasks', arguments: {
|
||||
category: 'HTTP/API'
|
||||
}});
|
||||
|
||||
const result = JSON.parse(((response as any).content[0]).text);
|
||||
expect(result).toHaveProperty('category', 'HTTP/API');
|
||||
expect(result).toHaveProperty('tasks');
|
||||
|
||||
const httpTasks = result.tasks;
|
||||
expect(Array.isArray(httpTasks)).toBe(true);
|
||||
expect(httpTasks.length).toBeGreaterThan(0);
|
||||
|
||||
httpTasks.forEach((task: any) => {
|
||||
expect(task).toHaveProperty('task');
|
||||
expect(task).toHaveProperty('description');
|
||||
expect(task).toHaveProperty('nodeType');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
// AI Tools section removed - list_ai_tools and get_node_as_tool_info were removed in v2.25.0
|
||||
// Use search_nodes with query for finding AI-capable nodes
|
||||
|
||||
describe('Complex Tool Interactions', () => {
|
||||
it('should handle tool chaining', async () => {
|
||||
@@ -526,20 +389,20 @@ describe('MCP Tool Invocation', () => {
|
||||
});
|
||||
|
||||
it('should handle parallel tool calls', async () => {
|
||||
const tools = [
|
||||
'list_nodes',
|
||||
'get_database_statistics',
|
||||
'list_ai_tools',
|
||||
'list_tasks'
|
||||
const toolCalls = [
|
||||
{ name: 'search_nodes', arguments: { query: 'http' } },
|
||||
{ name: 'tools_documentation', arguments: {} },
|
||||
{ name: 'get_node', arguments: { nodeType: 'nodes-base.httpRequest' } },
|
||||
{ name: 'search_nodes', arguments: { query: 'webhook' } }
|
||||
];
|
||||
|
||||
const promises = tools.map(tool =>
|
||||
client.callTool({ name: tool as any, arguments: {} })
|
||||
const promises = toolCalls.map(call =>
|
||||
client.callTool(call)
|
||||
);
|
||||
|
||||
const responses = await Promise.all(promises);
|
||||
|
||||
expect(responses).toHaveLength(tools.length);
|
||||
|
||||
expect(responses).toHaveLength(toolCalls.length);
|
||||
responses.forEach(response => {
|
||||
expect(response.content).toHaveLength(1);
|
||||
expect(((response as any).content[0]).type).toBe('text');
|
||||
|
||||
Reference in New Issue
Block a user