Major features implemented: - SQLite storage service with FTS5 for fast node search - Database rebuild mechanism for bulk node extraction - MCP tools: search_nodes, extract_all_nodes, get_node_statistics - Production Docker deployment with persistent storage - Management scripts for database operations - Comprehensive test suite for all functionality Database capabilities: - Stores node source code and metadata - Full-text search by node name or content - No versioning (stores latest only as per requirements) - Supports complete database rebuilds - ~4.5MB database with 500+ nodes indexed Production features: - Automated deployment script - Docker Compose production configuration - Database initialization on first run - Volume persistence for data - Management utilities for operations Documentation: - Updated README with complete instructions - Production deployment guide - Clear troubleshooting section - API reference for all new tools 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
104 lines
2.9 KiB
JavaScript
Executable File
104 lines
2.9 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Test MCP Server extraction functionality
|
|
* Simulates an MCP client calling the get_node_source_code tool
|
|
*/
|
|
|
|
const { spawn } = require('child_process');
|
|
const path = require('path');
|
|
|
|
// MCP request to get AI Agent node source code
|
|
const mcpRequest = {
|
|
jsonrpc: '2.0',
|
|
id: 1,
|
|
method: 'tools/call',
|
|
params: {
|
|
name: 'get_node_source_code',
|
|
arguments: {
|
|
nodeType: '@n8n/n8n-nodes-langchain.Agent',
|
|
includeCredentials: true
|
|
}
|
|
}
|
|
};
|
|
|
|
async function testMCPExtraction() {
|
|
console.log('=== MCP Server Node Extraction Test ===\n');
|
|
console.log('Starting MCP server...');
|
|
|
|
// Start the MCP server
|
|
const serverPath = path.join(__dirname, '../dist/index.js');
|
|
const server = spawn('node', [serverPath], {
|
|
env: {
|
|
...process.env,
|
|
MCP_SERVER_PORT: '3000',
|
|
MCP_SERVER_HOST: '0.0.0.0',
|
|
N8N_API_URL: 'http://n8n:5678',
|
|
N8N_API_KEY: 'test-api-key',
|
|
MCP_AUTH_TOKEN: 'test-token',
|
|
LOG_LEVEL: 'info'
|
|
},
|
|
stdio: ['pipe', 'pipe', 'pipe']
|
|
});
|
|
|
|
let responseBuffer = '';
|
|
let errorBuffer = '';
|
|
|
|
server.stdout.on('data', (data) => {
|
|
responseBuffer += data.toString();
|
|
});
|
|
|
|
server.stderr.on('data', (data) => {
|
|
errorBuffer += data.toString();
|
|
});
|
|
|
|
// Give server time to start
|
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
|
|
console.log('Sending MCP request...');
|
|
console.log(JSON.stringify(mcpRequest, null, 2));
|
|
|
|
// Send the request via stdin (MCP uses stdio transport)
|
|
server.stdin.write(JSON.stringify(mcpRequest) + '\n');
|
|
|
|
// Wait for response
|
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
|
|
// Kill the server
|
|
server.kill();
|
|
|
|
console.log('\n=== Server Output ===');
|
|
console.log(responseBuffer);
|
|
|
|
if (errorBuffer) {
|
|
console.log('\n=== Server Errors ===');
|
|
console.log(errorBuffer);
|
|
}
|
|
|
|
// Try to parse any JSON responses
|
|
const lines = responseBuffer.split('\n').filter(line => line.trim());
|
|
for (const line of lines) {
|
|
try {
|
|
const data = JSON.parse(line);
|
|
if (data.id === 1 && data.result) {
|
|
console.log('\n✅ MCP Response received!');
|
|
console.log(`Node type: ${data.result.nodeType}`);
|
|
console.log(`Source code length: ${data.result.sourceCode ? data.result.sourceCode.length : 0} characters`);
|
|
console.log(`Location: ${data.result.location}`);
|
|
console.log(`Has credentials: ${data.result.credentialCode ? 'Yes' : 'No'}`);
|
|
console.log(`Has package info: ${data.result.packageInfo ? 'Yes' : 'No'}`);
|
|
|
|
if (data.result.sourceCode) {
|
|
console.log('\nFirst 300 characters of extracted code:');
|
|
console.log('='.repeat(60));
|
|
console.log(data.result.sourceCode.substring(0, 300) + '...');
|
|
console.log('='.repeat(60));
|
|
}
|
|
}
|
|
} catch (e) {
|
|
// Not JSON, skip
|
|
}
|
|
}
|
|
}
|
|
|
|
testMCPExtraction().catch(console.error); |