feat: implement MCP v2 improvements - simple MVP fixes
Based on Claude Desktop evaluation feedback, implemented minimal fixes: ## Day 1 - Deploy & Debug - Added /version and /test-tools endpoints for deployment verification - Added debug logging to list_nodes and list_ai_tools - Fixed version display in health and initialization responses ## Day 2 - Core Fixes - Fixed multi-word search to handle phrases like "send slack message" - Added property deduplication to eliminate duplicate webhook/email properties - Fixed package name mismatch to handle both formats (@n8n/ prefix variations) ## Day 3 - Polish & Test - Added simple in-memory cache with 1-hour TTL for essentials - Added documentation fallback when nodes lack documentation - All features tested and verified working Total code changes: ~62 lines as planned No overengineering, just simple focused fixes 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -176,23 +176,45 @@ export class PropertyFilter {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Deduplicate properties based on name and display conditions
|
||||
*/
|
||||
static deduplicateProperties(properties: any[]): any[] {
|
||||
const seen = new Map<string, any>();
|
||||
|
||||
return properties.filter(prop => {
|
||||
// Create unique key from name + conditions
|
||||
const conditions = JSON.stringify(prop.displayOptions || {});
|
||||
const key = `${prop.name}_${conditions}`;
|
||||
|
||||
if (seen.has(key)) {
|
||||
return false; // Skip duplicate
|
||||
}
|
||||
|
||||
seen.set(key, prop);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get essential properties for a node type
|
||||
*/
|
||||
static getEssentials(allProperties: any[], nodeType: string): FilteredProperties {
|
||||
// Deduplicate first
|
||||
const uniqueProperties = this.deduplicateProperties(allProperties);
|
||||
const config = this.ESSENTIAL_PROPERTIES[nodeType];
|
||||
|
||||
if (!config) {
|
||||
// Fallback for unconfigured nodes
|
||||
return this.inferEssentials(allProperties);
|
||||
return this.inferEssentials(uniqueProperties);
|
||||
}
|
||||
|
||||
// Extract required properties
|
||||
const required = this.extractProperties(allProperties, config.required, true);
|
||||
const required = this.extractProperties(uniqueProperties, config.required, true);
|
||||
|
||||
// Extract common properties (excluding any already in required)
|
||||
const requiredNames = new Set(required.map(p => p.name));
|
||||
const common = this.extractProperties(allProperties, config.common, false)
|
||||
const common = this.extractProperties(uniqueProperties, config.common, false)
|
||||
.filter(p => !requiredNames.has(p.name));
|
||||
|
||||
return { required, common };
|
||||
|
||||
Reference in New Issue
Block a user