Files
n8n-mcp/docs/MCP_IMPLEMENTATION_STRATEGY.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

13 KiB

MCP Tools Implementation Strategy

Executive Summary

This document outlines a comprehensive strategy to transform the n8n MCP from a documentation server into an AI-optimized workflow configuration assistant. The core issue is that get_node_info returns 100KB+ of unstructured JSON, making it nearly impossible for AI agents to efficiently build n8n workflows. Our strategy introduces new tools and restructures data to reduce complexity by 95% while maintaining full functionality.

Current State Analysis

Problems

  1. Data Overload: HTTP Request node returns 200+ properties when only 5-10 are needed
  2. Poor Structure: Properties stored as monolithic JSON blobs, not queryable
  3. Duplicate Properties: Same property appears 3-4 times with different conditions
  4. Complex Nesting: Properties buried in collections within collections
  5. No Prioritization: Essential properties mixed with rarely-used advanced options

Impact

  • AI agents waste 90% of tokens parsing irrelevant data
  • High error rates due to confusion with duplicate properties
  • 5-10 minutes to configure a simple node (should be <1 minute)
  • Poor developer experience leads to workflow building failures

Implementation Strategy Overview

Design Principles

  1. Progressive Disclosure: Start with essentials, add complexity only when needed
  2. Task-Oriented: Focus on what users want to do, not technical details
  3. Backward Compatible: Keep existing tools, add new optimized ones
  4. Incremental Deployment: Each phase delivers value independently
  5. AI-First Design: Optimize for token efficiency and clarity

Three-Phase Approach

Phase 1: Quick Wins (Week 1-2)

  • Implement without database changes
  • Filter existing data for essentials
  • Add common examples

Phase 2: Enhanced Capabilities (Week 3-4)

  • Parse property structures
  • Build search and validation
  • Create task templates

Phase 3: Full Optimization (Month 2)

  • Database schema migration
  • Property deduplication
  • Dependency tracking

Phase 1: Quick Wins Implementation

1.1 get_node_essentials Tool

Purpose: Return only the 10-20 properties needed for 90% of use cases

Implementation:

interface GetNodeEssentialsInput {
  nodeType: string;
}

interface GetNodeEssentialsOutput {
  nodeType: string;
  displayName: string;
  description: string;
  requiredProperties: PropertyInfo[];
  commonProperties: PropertyInfo[];
  examples: {
    minimal: object;
    common: object;
  };
}

interface PropertyInfo {
  name: string;
  type: string;
  description: string;
  default?: any;
  options?: string[];
  placeholder?: string;
}

Technical Approach:

  1. Create curated lists of essential properties for top 20 nodes
  2. Parse existing property schema to extract required fields
  3. Filter properties based on usage frequency
  4. Return simplified structure without nested collections

Example Output:

{
  "nodeType": "nodes-base.httpRequest",
  "displayName": "HTTP Request",
  "requiredProperties": [{
    "name": "url",
    "type": "string",
    "description": "The URL to make the request to",
    "placeholder": "https://api.example.com/endpoint"
  }],
  "commonProperties": [
    {
      "name": "method",
      "type": "options",
      "options": ["GET", "POST", "PUT", "DELETE"],
      "default": "GET"
    },
    {
      "name": "authentication",
      "type": "options",
      "options": ["none", "basicAuth", "bearerToken"],
      "default": "none"
    }
  ],
  "examples": {
    "minimal": { "url": "https://api.example.com/data" },
    "common": {
      "method": "POST",
      "url": "https://api.example.com/create",
      "sendBody": true,
      "contentType": "json",
      "jsonBody": "{ \"name\": \"example\" }"
    }
  }
}

1.2 Enhanced Tool Descriptions

Update all existing tool descriptions based on testing feedback to be more concise and action-oriented.

1.3 Common Examples Database

Create JSON configuration examples for the top 20 most-used nodes, stored in src/data/node-examples.json.

Phase 2: Enhanced Capabilities

2.1 search_node_properties Tool

Purpose: Find specific properties within a node without parsing everything

Implementation:

interface SearchNodePropertiesInput {
  nodeType: string;
  query: string;  // Keyword to search for
  category?: 'authentication' | 'request' | 'response' | 'advanced';
}

interface SearchNodePropertiesOutput {
  query: string;
  matches: PropertyMatch[];
  totalMatches: number;
}

interface PropertyMatch {
  name: string;
  type: string;
  path: string;  // Dot notation path
  description: string;
  visibleWhen?: Record<string, any>;
  category: string;
}

Technical Approach:

  1. Parse property schema recursively
  2. Build searchable index of all properties
  3. Include visibility conditions
  4. Return flattened results with paths

2.2 get_node_for_task Tool

Purpose: Return pre-configured property sets for common tasks

Implementation:

interface GetNodeForTaskInput {
  task: string;  // e.g., "post_json_request", "call_api_with_auth"
  nodeType?: string;  // Optional, can infer from task
}

interface GetNodeForTaskOutput {
  task: string;
  description: string;
  nodeType: string;
  configuration: object;
  userMustProvide: Array<{
    property: string;
    description: string;
  }>;
  optionalEnhancements: Array<{
    property: string;
    description: string;
  }>;
}

Task Templates (stored in src/data/task-templates.json):

  • get_api_data - Simple GET request
  • post_json_request - POST with JSON body
  • call_api_with_auth - Authenticated API call
  • webhook_receiver - Accept incoming webhooks
  • database_query - Query a database
  • send_email - Send an email
  • process_file - Read and process files

2.3 validate_node_config Tool

Purpose: Validate configurations before use, catch errors early

Implementation:

interface ValidateNodeConfigInput {
  nodeType: string;
  config: object;
}

interface ValidateNodeConfigOutput {
  valid: boolean;
  errors: ValidationError[];
  warnings: ValidationWarning[];
  suggestions: string[];
  hiddenProperties: string[];  // Properties not visible with current config
  autofix?: object;  // Suggested fixes
}

Validation Rules:

  1. Check required properties
  2. Validate property types
  3. Check property dependencies
  4. Suggest common missing configurations
  5. Warn about potential issues

2.4 Property Parsing Service

Create src/services/property-parser.ts to:

  1. Parse nested property structures
  2. Flatten collections to dot notation
  3. Extract visibility conditions
  4. Categorize properties (essential/common/advanced)
  5. Build property dependency graph

Phase 3: Full Optimization

3.1 Database Schema Migration

New Tables:

-- Property-level storage
CREATE TABLE node_properties_v2 (
  id INTEGER PRIMARY KEY,
  node_type TEXT NOT NULL,
  property_name TEXT NOT NULL,
  property_path TEXT NOT NULL,  -- Dot notation path
  property_type TEXT NOT NULL,
  is_required BOOLEAN DEFAULT 0,
  is_essential BOOLEAN DEFAULT 0,
  is_common BOOLEAN DEFAULT 0,
  category TEXT,  -- authentication, request, response, advanced
  parent_property TEXT,
  display_conditions TEXT,  -- JSON conditions
  description TEXT,
  default_value TEXT,
  options TEXT,  -- JSON array for select fields
  placeholder TEXT,
  usage_frequency INTEGER DEFAULT 0,
  UNIQUE(node_type, property_path)
);

-- Task templates
CREATE TABLE task_templates (
  id INTEGER PRIMARY KEY,
  task_name TEXT UNIQUE NOT NULL,
  description TEXT,
  node_type TEXT NOT NULL,
  configuration TEXT NOT NULL,  -- JSON
  user_must_provide TEXT,  -- JSON array
  optional_enhancements TEXT  -- JSON array
);

-- Property dependencies
CREATE TABLE property_dependencies (
  id INTEGER PRIMARY KEY,
  node_type TEXT NOT NULL,
  property_name TEXT NOT NULL,
  depends_on_property TEXT NOT NULL,
  depends_on_value TEXT,
  dependency_type TEXT  -- enables, requires, conflicts
);

-- Common examples
CREATE TABLE node_examples (
  id INTEGER PRIMARY KEY,
  node_type TEXT NOT NULL,
  example_name TEXT NOT NULL,
  description TEXT,
  configuration TEXT NOT NULL,  -- JSON
  category TEXT,
  UNIQUE(node_type, example_name)
);

3.2 Migration Process

  1. Data Extraction Script (scripts/migrate-properties.ts):

    • Parse existing property schemas
    • Extract individual properties with metadata
    • Deduplicate properties with conditions
    • Populate new tables
  2. Backward Compatibility:

    • Keep existing tables and tools
    • Add feature flag for new tools
    • Gradual migration over 2 weeks

3.3 Advanced Tools

get_property_dependencies:

interface GetPropertyDependenciesInput {
  nodeType: string;
  property: string;
}

interface GetPropertyDependenciesOutput {
  property: string;
  requires: Record<string, any>;
  enables: string[];
  conflicts: string[];
  requiredChain: string[];  // Step-by-step to enable
  alternatives: Array<{
    description: string;
    properties: object;
  }>;
}

get_node_compatibility:

// Check which nodes work well together
interface GetNodeCompatibilityInput {
  sourceNode: string;
  targetNode: string;
}

Implementation Timeline

Week 1: Foundation

  • Implement get_node_essentials with hardcoded essentials
  • Create examples database for top 10 nodes
  • Deploy updated tool descriptions
  • Test with HTTP Request and Webhook nodes

Week 2: Expand Coverage

  • Add essentials for 20 more nodes
  • Implement basic property search
  • Create 5 task templates
  • Add validation for common errors

Week 3: Enhanced Features

  • Build property parser service
  • Implement get_node_for_task
  • Add validate_node_config
  • Create property categorization

Week 4: Testing & Refinement

  • Load test with complex nodes
  • Refine essential property lists
  • Add more task templates
  • Gather user feedback

Month 2: Full Migration

  • Design new database schema
  • Build migration scripts
  • Implement property deduplication
  • Add dependency tracking
  • Deploy progressively

Testing Strategy

Unit Tests

  • Property parser accuracy
  • Essential property extraction
  • Validation rule correctness
  • Task template validity

Integration Tests

  • Tool response times (<100ms)
  • Data size reduction (>90%)
  • Backward compatibility
  • Error handling

User Testing

  • Time to configure nodes
  • Error rates
  • Task completion success
  • AI agent performance

Success Metrics

Metric Current Target Measurement
Average properties returned 200+ 15 get_node_essentials response
Response size 100KB+ <5KB JSON byte count
Time to configure node 5-10 min <1 min User testing
Configuration errors 40% <10% Validation logs
AI token usage High -75% Token counter
Tool calls per task 5-10 2-3 Usage analytics

Risk Mitigation

Technical Risks

  1. Property Parsing Complexity

    • Mitigation: Start with simple nodes, handle edge cases gradually
    • Fallback: Return original schema if parsing fails
  2. Performance Impact

    • Mitigation: Cache parsed properties, use indexes
    • Monitor: Response times, add performance tests
  3. Data Quality

    • Mitigation: Validate all transformations
    • Test: Compare outputs with original data

Compatibility Risks

  1. Breaking Changes

    • Mitigation: New tools alongside old ones
    • Deprecation: 3-month warning period
  2. Schema Evolution

    • Mitigation: Version property schemas
    • Handle: Multiple n8n versions

Configuration Management

Essential Properties Lists

Store in src/data/essential-properties.json:

{
  "nodes-base.httpRequest": {
    "required": ["url"],
    "common": ["method", "authentication", "sendBody", "contentType"],
    "categories": {
      "authentication": ["authentication", "genericAuthType", "nodeCredentialType"],
      "request": ["sendBody", "contentType", "jsonBody", "bodyParameters"],
      "headers": ["sendHeaders", "headerParameters"],
      "advanced": ["options.timeout", "options.proxy", "options.redirect"]
    }
  }
}

Feature Flags

const FEATURES = {
  USE_NODE_ESSENTIALS: process.env.USE_NODE_ESSENTIALS !== 'false',
  ENABLE_PROPERTY_SEARCH: process.env.ENABLE_PROPERTY_SEARCH === 'true',
  USE_NEW_SCHEMA: process.env.USE_NEW_SCHEMA === 'true'
};

Next Steps

  1. Immediate Actions:

    • Create essential properties list for HTTP Request node
    • Implement get_node_essentials tool
    • Test with real AI agents
    • Gather feedback
  2. Week 1 Deliverables:

    • Working get_node_essentials for top 10 nodes
    • Basic examples database
    • Performance benchmarks
    • User feedback collection
  3. Success Criteria:

    • 90% reduction in data size
    • 75% reduction in configuration time
    • Positive AI agent feedback
    • No regression in functionality

Conclusion

This implementation strategy transforms the n8n MCP from a complex documentation server into an AI-friendly configuration assistant. By focusing on progressive disclosure and task-oriented access patterns, we can reduce complexity by 95% while actually improving functionality. The phased approach ensures we deliver value quickly while building toward a fully optimized solution.

The key insight: AI agents need just enough information at the right time, not everything at once. This strategy delivers exactly that.