- Updated n8n from 1.100.1 to 1.101.1 - Updated n8n-core from 1.99.0 to 1.100.0 - Updated n8n-workflow from 1.97.0 to 1.98.0 - Updated @n8n/n8n-nodes-langchain from 1.99.0 to 1.100.1 - Rebuilt node database with 528 nodes - All validation tests passing - Bumped version to 2.7.12 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
136 lines
4.7 KiB
JavaScript
136 lines
4.7 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import { N8NDocumentationMCPServer } from '../src/mcp/server';
|
|
|
|
interface SearchTestCase {
|
|
query: string;
|
|
expectedTop: string[];
|
|
description: string;
|
|
}
|
|
|
|
async function testSearchImprovements() {
|
|
console.log('Testing search improvements...\n');
|
|
|
|
const server = new N8NDocumentationMCPServer();
|
|
|
|
// Wait for initialization
|
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
|
|
const testCases: SearchTestCase[] = [
|
|
{
|
|
query: 'webhook',
|
|
expectedTop: ['nodes-base.webhook'],
|
|
description: 'Primary webhook node should appear first'
|
|
},
|
|
{
|
|
query: 'http',
|
|
expectedTop: ['nodes-base.httpRequest'],
|
|
description: 'HTTP Request node should appear first'
|
|
},
|
|
{
|
|
query: 'http call',
|
|
expectedTop: ['nodes-base.httpRequest'],
|
|
description: 'HTTP Request node should appear first for "http call"'
|
|
},
|
|
{
|
|
query: 'slack',
|
|
expectedTop: ['nodes-base.slack'],
|
|
description: 'Slack node should appear first'
|
|
},
|
|
{
|
|
query: 'email',
|
|
expectedTop: ['nodes-base.emailSend', 'nodes-base.gmail', 'nodes-base.emailReadImap'],
|
|
description: 'Email-related nodes should appear first'
|
|
},
|
|
{
|
|
query: 'http request',
|
|
expectedTop: ['nodes-base.httpRequest'],
|
|
description: 'HTTP Request node should appear first for exact name'
|
|
}
|
|
];
|
|
|
|
let passedTests = 0;
|
|
let failedTests = 0;
|
|
|
|
for (const testCase of testCases) {
|
|
try {
|
|
console.log(`\nTest: ${testCase.description}`);
|
|
console.log(`Query: "${testCase.query}"`);
|
|
|
|
const results = await server.executeTool('search_nodes', {
|
|
query: testCase.query,
|
|
limit: 10
|
|
});
|
|
|
|
if (!results.results || results.results.length === 0) {
|
|
console.log('❌ No results found');
|
|
failedTests++;
|
|
continue;
|
|
}
|
|
|
|
console.log(`Found ${results.results.length} results`);
|
|
console.log('Top 5 results:');
|
|
|
|
const top5 = results.results.slice(0, 5);
|
|
top5.forEach((node: any, index: number) => {
|
|
const isExpected = testCase.expectedTop.includes(node.nodeType);
|
|
const marker = index === 0 && isExpected ? '✅' : index === 0 && !isExpected ? '❌' : '';
|
|
console.log(` ${index + 1}. ${node.nodeType} - ${node.displayName} ${marker}`);
|
|
});
|
|
|
|
// Check if any expected node appears in top position
|
|
const firstResult = results.results[0];
|
|
if (testCase.expectedTop.includes(firstResult.nodeType)) {
|
|
console.log('✅ Test passed: Expected node found at top position');
|
|
passedTests++;
|
|
} else {
|
|
console.log('❌ Test failed: Expected nodes not at top position');
|
|
console.log(` Expected one of: ${testCase.expectedTop.join(', ')}`);
|
|
console.log(` Got: ${firstResult.nodeType}`);
|
|
failedTests++;
|
|
}
|
|
|
|
} catch (error) {
|
|
console.log(`❌ Test failed with error: ${error}`);
|
|
failedTests++;
|
|
}
|
|
}
|
|
|
|
console.log('\n' + '='.repeat(50));
|
|
console.log(`Test Summary: ${passedTests} passed, ${failedTests} failed`);
|
|
console.log('='.repeat(50));
|
|
|
|
// Test the old problematic queries to ensure improvement
|
|
console.log('\n\nTesting Original Problem Scenarios:');
|
|
console.log('=====================================\n');
|
|
|
|
// Test webhook query that was problematic
|
|
console.log('1. Testing "webhook" query (was returning service-specific webhooks first):');
|
|
const webhookResult = await server.executeTool('search_nodes', { query: 'webhook', limit: 10 });
|
|
const webhookFirst = webhookResult.results[0];
|
|
if (webhookFirst.nodeType === 'nodes-base.webhook') {
|
|
console.log(' ✅ SUCCESS: Primary Webhook node now appears first!');
|
|
} else {
|
|
console.log(` ❌ FAILED: Got ${webhookFirst.nodeType} instead of nodes-base.webhook`);
|
|
console.log(` First 3 results: ${webhookResult.results.slice(0, 3).map((r: any) => r.nodeType).join(', ')}`);
|
|
}
|
|
|
|
// Test http call query
|
|
console.log('\n2. Testing "http call" query (was not finding HTTP Request easily):');
|
|
const httpCallResult = await server.executeTool('search_nodes', { query: 'http call', limit: 10 });
|
|
const httpCallFirst = httpCallResult.results[0];
|
|
if (httpCallFirst.nodeType === 'nodes-base.httpRequest') {
|
|
console.log(' ✅ SUCCESS: HTTP Request node now appears first!');
|
|
} else {
|
|
console.log(` ❌ FAILED: Got ${httpCallFirst.nodeType} instead of nodes-base.httpRequest`);
|
|
console.log(` First 3 results: ${httpCallResult.results.slice(0, 3).map((r: any) => r.nodeType).join(', ')}`);
|
|
}
|
|
|
|
process.exit(failedTests > 0 ? 1 : 0);
|
|
}
|
|
|
|
// Run tests
|
|
testSearchImprovements().catch(error => {
|
|
console.error('Test execution failed:', error);
|
|
process.exit(1);
|
|
}); |