Files
n8n-mcp/tests/test-enhanced-integration.js
czlonkowski 3d7fdeba02 feat: Complete overhaul to enhanced documentation-only MCP server
- Removed all workflow execution capabilities per user requirements
- Implemented enhanced documentation extraction with operations and API mappings
- Fixed credential code extraction for all nodes
- Fixed package info extraction (name and version)
- Enhanced operations parser to handle n8n markdown format
- Fixed documentation search to prioritize app nodes over trigger nodes
- Comprehensive test coverage for Slack node extraction
- All node information now includes:
  - Complete operations list (42 for Slack)
  - API method mappings with documentation URLs
  - Source code and credential definitions
  - Package metadata
  - Related resources and templates

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-08 11:07:51 +00:00

163 lines
5.7 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
const { DocumentationFetcher } = require('../dist/utils/documentation-fetcher');
const { NodeDocumentationService } = require('../dist/services/node-documentation-service');
async function testEnhancedIntegration() {
console.log('🧪 Testing Enhanced Documentation Integration...\n');
// Test 1: DocumentationFetcher backward compatibility
console.log('1⃣ Testing DocumentationFetcher backward compatibility...');
const docFetcher = new DocumentationFetcher();
try {
// Test getNodeDocumentation (backward compatible method)
const simpleDoc = await docFetcher.getNodeDocumentation('n8n-nodes-base.slack');
if (simpleDoc) {
console.log(' ✅ Simple documentation format works');
console.log(` - Has markdown: ${!!simpleDoc.markdown}`);
console.log(` - Has URL: ${!!simpleDoc.url}`);
console.log(` - Has examples: ${simpleDoc.examples?.length || 0}`);
}
// Test getEnhancedNodeDocumentation (new method)
const enhancedDoc = await docFetcher.getEnhancedNodeDocumentation('n8n-nodes-base.slack');
if (enhancedDoc) {
console.log(' ✅ Enhanced documentation format works');
console.log(` - Title: ${enhancedDoc.title || 'N/A'}`);
console.log(` - Operations: ${enhancedDoc.operations?.length || 0}`);
console.log(` - API Methods: ${enhancedDoc.apiMethods?.length || 0}`);
console.log(` - Examples: ${enhancedDoc.examples?.length || 0}`);
console.log(` - Templates: ${enhancedDoc.templates?.length || 0}`);
console.log(` - Related Resources: ${enhancedDoc.relatedResources?.length || 0}`);
}
} catch (error) {
console.error(' ❌ DocumentationFetcher test failed:', error.message);
}
// Test 2: NodeDocumentationService with enhanced fields
console.log('\n2⃣ Testing NodeDocumentationService enhanced schema...');
const docService = new NodeDocumentationService('data/test-enhanced-docs.db');
try {
// Store a test node with enhanced documentation
const testNode = {
nodeType: 'test.enhanced-node',
name: 'enhanced-node',
displayName: 'Enhanced Test Node',
description: 'A test node with enhanced documentation',
sourceCode: 'const testCode = "example";',
packageName: 'test-package',
documentation: '# Test Documentation',
documentationUrl: 'https://example.com/docs',
documentationTitle: 'Enhanced Test Node Documentation',
operations: [
{
resource: 'Message',
operation: 'Send',
description: 'Send a message'
}
],
apiMethods: [
{
resource: 'Message',
operation: 'Send',
apiMethod: 'chat.postMessage',
apiUrl: 'https://api.slack.com/methods/chat.postMessage'
}
],
documentationExamples: [
{
title: 'Send Message Example',
type: 'json',
code: '{"text": "Hello World"}'
}
],
templates: [
{
name: 'Basic Message Template',
description: 'Simple message sending template'
}
],
relatedResources: [
{
title: 'API Documentation',
url: 'https://api.slack.com',
type: 'api'
}
],
requiredScopes: ['chat:write'],
hasCredentials: true,
isTrigger: false,
isWebhook: false
};
await docService.storeNode(testNode);
console.log(' ✅ Stored node with enhanced documentation');
// Retrieve and verify
const retrieved = await docService.getNodeInfo('test.enhanced-node');
if (retrieved) {
console.log(' ✅ Retrieved node with enhanced fields:');
console.log(` - Has operations: ${!!retrieved.operations}`);
console.log(` - Has API methods: ${!!retrieved.apiMethods}`);
console.log(` - Has documentation examples: ${!!retrieved.documentationExamples}`);
console.log(` - Has templates: ${!!retrieved.templates}`);
console.log(` - Has related resources: ${!!retrieved.relatedResources}`);
console.log(` - Has required scopes: ${!!retrieved.requiredScopes}`);
}
// Test search
const searchResults = await docService.searchNodes({ query: 'enhanced' });
console.log(` ✅ Search found ${searchResults.length} results`);
} catch (error) {
console.error(' ❌ NodeDocumentationService test failed:', error.message);
} finally {
docService.close();
}
// Test 3: MCP Server integration
console.log('\n3⃣ Testing MCP Server integration...');
try {
const { N8NMCPServer } = require('../dist/mcp/server');
console.log(' ✅ MCP Server loads with enhanced documentation support');
// Check if new tools are available
const { n8nTools } = require('../dist/mcp/tools');
const enhancedTools = [
'get_node_documentation',
'search_node_documentation',
'get_node_operations',
'get_node_examples'
];
const hasAllTools = enhancedTools.every(toolName =>
n8nTools.some(tool => tool.name === toolName)
);
if (hasAllTools) {
console.log(' ✅ All enhanced documentation tools are available');
enhancedTools.forEach(toolName => {
const tool = n8nTools.find(t => t.name === toolName);
console.log(` - ${toolName}: ${tool.description}`);
});
} else {
console.log(' ⚠️ Some enhanced tools are missing');
}
} catch (error) {
console.error(' ❌ MCP Server integration test failed:', error.message);
}
console.log('\n✨ Enhanced documentation integration tests completed!');
// Cleanup
await docFetcher.cleanup();
}
// Run tests
testEnhancedIntegration().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});