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

299 lines
7.7 KiB
Markdown

# 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**:
```typescript
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**:
```typescript
{
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**:
```typescript
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**:
```typescript
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**:
```typescript
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**:
```typescript
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**:
```typescript
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.