Files
n8n-mcp/docs/MCP_TECHNICAL_DECISIONS.md
czlonkowski 1884d5babf feat: implement AI-optimized MCP tools with 95% size reduction
- Add get_node_essentials tool for 10-20 essential properties only
- Add search_node_properties for targeted property search
- Add get_node_for_task with 14 pre-configured templates
- Add validate_node_config for comprehensive validation
- Add get_property_dependencies for visibility analysis
- Implement PropertyFilter service with curated essentials
- Implement ExampleGenerator with working examples
- Implement TaskTemplates for common workflows
- Implement ConfigValidator with security checks
- Implement PropertyDependencies for dependency analysis
- Enhance property descriptions to 100% coverage
- Add version information to essentials response
- Update documentation with new tools

Response sizes reduced from 100KB+ to <5KB for better AI agent usability.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-16 12:37:45 +02:00

7.7 KiB

MCP Implementation Technical Decisions

Architecture Decisions

1. Incremental Enhancement vs. Complete Rewrite

Decision: Incremental enhancement with backward compatibility

Rationale:

  • Minimizes risk and allows testing at each stage
  • Existing tools continue to work during migration
  • Can deliver value immediately without waiting for full implementation
  • Easier rollback if issues arise

Implementation:

  • New tools alongside existing ones (get_node_essentials + get_node_info)
  • Feature flags for gradual rollout
  • Shared service layer for data access

2. Data Storage Strategy

Decision: Hybrid approach - start with JSON parsing, migrate to relational structure

Phase 1 (Immediate):

  • Parse existing JSON property schemas on-demand
  • Cache parsed results in memory
  • Store essential property lists in configuration files

Phase 2 (Month 2):

  • Migrate to property-level relational tables
  • Maintain JSON schemas for backward compatibility
  • Use materialized views for performance

Rationale:

  • Delivers immediate improvements without database changes
  • Allows time to design optimal schema
  • Provides fallback during migration

3. Property Categorization

Decision: Multi-dimensional categorization

Categories:

  1. By Importance: required > essential > common > advanced
  2. By Function: authentication, request, response, processing, output
  3. By Complexity: basic, intermediate, expert
  4. By Usage: always, frequent, occasional, rare

Implementation:

interface PropertyMetadata {
  importance: 'required' | 'essential' | 'common' | 'advanced';
  category: 'auth' | 'request' | 'response' | 'processing' | 'output';
  complexity: 'basic' | 'intermediate' | 'expert';
  usageFrequency: number; // 0-100
}

4. Property Deduplication Strategy

Decision: Single source of truth with condition variants

Approach:

  • Each property appears once in the data model
  • Conditions stored as metadata
  • Runtime resolution based on current configuration

Example:

{
  name: "httpMethod",
  type: "dynamic",
  baseType: "select",
  variants: [
    {
      condition: { multipleMethods: false },
      config: { multiple: false, default: "GET" }
    },
    {
      condition: { multipleMethods: true },
      config: { multiple: true, default: ["GET", "POST"] }
    }
  ]
}

5. API Response Optimization

Decision: Progressive disclosure with explicit detail levels

Levels:

  1. Minimal: Just enough to identify and use (1-2KB)
  2. Essential: Common use cases covered (5KB)
  3. Standard: Full functional details (20KB)
  4. Complete: Everything including metadata (100KB+)

Implementation:

interface NodeInfoRequest {
  nodeType: string;
  level: 'minimal' | 'essential' | 'standard' | 'complete';
  include?: ('examples' | 'documentation' | 'source')[];
  propertyFilter?: {
    categories?: string[];
    importance?: string[];
  };
}

6. Caching Strategy

Decision: Multi-layer caching with TTL

Layers:

  1. Request Cache: 5-minute TTL for identical requests
  2. Parsed Property Cache: 1-hour TTL for parsed structures
  3. Essential Properties: Pre-computed at startup
  4. Database Query Cache: 30-minute TTL for complex queries

Implementation:

class CacheManager {
  private requestCache = new LRUCache<string, any>({ ttl: 5 * 60 * 1000 });
  private propertyCache = new LRUCache<string, ParsedProperty[]>({ ttl: 60 * 60 * 1000 });
  private essentialsCache = new Map<string, NodeEssentials>();
}

7. Error Handling Philosophy

Decision: Graceful degradation with helpful fallbacks

Principles:

  • Never return empty responses if data exists
  • Provide partial data rather than errors
  • Include suggestions for fixing issues
  • Log errors but don't expose internals

Example:

try {
  return getOptimizedResponse(nodeType);
} catch (error) {
  logger.warn(`Failed to optimize response for ${nodeType}, falling back`);
  return {
    ...getBasicResponse(nodeType),
    _warning: "Using simplified response due to processing error"
  };
}

8. Search Implementation

Decision: Multi-strategy search with ranking

Strategies:

  1. Exact match: Property name exact match (weight: 10)
  2. Prefix match: Property name starts with query (weight: 8)
  3. Contains match: Property name contains query (weight: 5)
  4. Description match: Description contains query (weight: 3)
  5. Fuzzy match: Levenshtein distance < 2 (weight: 1)

Ranking factors:

  • Match quality
  • Property importance
  • Usage frequency
  • Position in hierarchy

9. Task Template Design

Decision: Declarative templates with validation

Structure:

interface TaskTemplate {
  id: string;
  name: string;
  description: string;
  category: string;
  difficulty: 'beginner' | 'intermediate' | 'advanced';
  
  // What this task accomplishes
  objectives: string[];
  
  // Required configuration
  nodeType: string;
  configuration: object;
  
  // User inputs needed
  inputs: Array<{
    property: string;
    description: string;
    example?: any;
    validation?: string; // Regex or function name
  }>;
  
  // Additional options
  enhancements: Array<{
    property: string;
    description: string;
    when?: string; // Condition for relevance
  }>;
  
  // Success criteria
  validation: {
    required: string[];
    warnings: Array<{
      condition: string;
      message: string;
    }>;
  };
}

10. Performance Targets

Decision: Strict performance budgets

Targets:

  • get_node_essentials: <50ms response time
  • search_node_properties: <100ms for 1000 properties
  • validate_node_config: <20ms
  • Memory overhead: <100MB for full cache
  • Startup time: <5s including cache warming

Monitoring:

class PerformanceMonitor {
  private metrics = new Map<string, number[]>();
  
  track(operation: string, duration: number) {
    if (duration > PERFORMANCE_BUDGETS[operation]) {
      logger.warn(`Performance budget exceeded: ${operation} took ${duration}ms`);
    }
  }
}

Security Considerations

1. Input Validation

  • Sanitize all user inputs
  • Validate node types against whitelist
  • Limit response sizes
  • Rate limiting for expensive operations

2. Data Privacy

  • No sensitive data in responses
  • Redact credentials from examples
  • Anonymize usage metrics
  • Clear audit logging

Migration Strategy

Phase 1: Shadow Mode

  • New tools run alongside old ones
  • Metrics collection to validate improvements
  • A/B testing with subset of users

Phase 2: Gradual Rollout

  • Feature flags for new tools
  • Progressive user migration
  • Monitoring and rollback capability

Phase 3: Deprecation

  • Mark old tools as deprecated
  • 3-month transition period
  • Migration guides and tooling

Future Considerations

1. AI Model Integration

  • Property embeddings for semantic search
  • ML-based property importance ranking
  • Automated example generation
  • Predictive configuration

2. Workflow Analysis

  • Learn from successful workflows
  • Identify common patterns
  • Suggest optimal configurations
  • Error pattern detection

3. Real-time Assistance

  • WebSocket support for interactive configuration
  • Progressive property revelation
  • Context-aware suggestions
  • Collaborative editing support

Conclusion

These technical decisions prioritize:

  1. Immediate value delivery through incremental improvements
  2. AI-first design optimizing for token efficiency
  3. Performance with strict budgets and caching
  4. Reliability through graceful degradation
  5. Future flexibility with extensible architecture

The implementation follows a pragmatic approach that delivers quick wins while building toward a comprehensive solution.