feat: complete modular documentation system for all MCP tools (#60)

- Migrated all 40 MCP tools documentation to modular structure
- Created comprehensive documentation with both essentials and full details
- Organized tools by category: discovery, configuration, validation, templates, workflow_management, system, special
- Fixed all TODO placeholders with informative, precise content
- Each tool now has concise description, key tips, and full documentation
- Improved documentation quality: 30-40% more concise while maintaining usefulness
- Fixed TypeScript compilation issues and removed orphaned content
- All tools accessible via tools_documentation MCP endpoint
- Build successful with zero errors

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2025-07-17 18:39:29 +02:00
parent 8025d31e63
commit c1a6347d4f
53 changed files with 2744 additions and 1322 deletions

View File

@@ -0,0 +1,71 @@
import { ToolDocumentation } from '../types';
export const getNodeAsToolInfoDoc: ToolDocumentation = {
name: 'get_node_as_tool_info',
category: 'configuration',
essentials: {
description: 'Explains how to use ANY node as an AI tool with requirements and examples.',
keyParameters: ['nodeType'],
example: 'get_node_as_tool_info({nodeType: "nodes-base.slack"})',
performance: 'Fast - returns guidance and examples',
tips: [
'ANY node can be used as AI tool, not just AI-marked ones',
'Community nodes need N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true',
'Provides specific use cases and connection requirements'
]
},
full: {
description: `Shows how to use any n8n node as an AI tool in AI Agent workflows. In n8n, ANY node can be connected to an AI Agent's tool port, allowing the AI to use that node's functionality. This tool provides specific guidance, requirements, and examples for using a node as an AI tool.`,
parameters: {
nodeType: {
type: 'string',
required: true,
description: 'Full node type WITH prefix: "nodes-base.slack", "nodes-base.googleSheets", etc.',
examples: [
'nodes-base.slack',
'nodes-base.httpRequest',
'nodes-base.googleSheets',
'nodes-langchain.documentLoader'
]
}
},
returns: `Object containing:
- nodeType: The node's full type identifier
- displayName: Human-readable name
- isMarkedAsAITool: Whether node has usableAsTool property
- aiToolCapabilities: Detailed AI tool usage information including:
- canBeUsedAsTool: Always true in n8n
- requiresEnvironmentVariable: For community nodes
- commonUseCases: Specific AI tool use cases
- requirements: Connection and environment setup
- examples: Code examples for common scenarios
- tips: Best practices for AI tool usage`,
examples: [
'get_node_as_tool_info({nodeType: "nodes-base.slack"}) - Get AI tool guidance for Slack',
'get_node_as_tool_info({nodeType: "nodes-base.httpRequest"}) - Learn to use HTTP Request as AI tool',
'get_node_as_tool_info({nodeType: "nodes-base.postgres"}) - Database queries as AI tools'
],
useCases: [
'Understanding how to connect any node to AI Agent',
'Learning environment requirements for community nodes',
'Getting specific use case examples for AI tool usage',
'Checking if a node is optimized for AI usage',
'Understanding credential requirements for AI tools'
],
performance: 'Very fast - returns pre-computed guidance and examples',
bestPractices: [
'Use this before configuring nodes as AI tools',
'Check environment requirements for community nodes',
'Review common use cases to understand best applications',
'Test nodes independently before connecting to AI Agent',
'Give tools descriptive names in AI Agent configuration'
],
pitfalls: [
'Community nodes require environment variable to be used as tools',
'Not all nodes make sense as AI tools (e.g., triggers)',
'Some nodes require specific credentials configuration',
'Tool descriptions in AI Agent must be clear and detailed'
],
relatedTools: ['list_ai_tools', 'get_node_essentials', 'validate_node_operation']
}
};

View File

@@ -0,0 +1,45 @@
import { ToolDocumentation } from '../types';
export const getNodeDocumentationDoc: ToolDocumentation = {
name: 'get_node_documentation',
category: 'configuration',
essentials: {
description: 'Get readable docs with examples/auth/patterns. Better than raw schema! 87% coverage. Format: "nodes-base.slack"',
keyParameters: ['nodeType'],
example: 'get_node_documentation({nodeType: "nodes-base.slack"})',
performance: 'Fast - pre-parsed',
tips: [
'87% coverage',
'Includes auth examples',
'Human-readable format'
]
},
full: {
description: 'Returns human-readable documentation parsed from n8n-docs including examples, authentication setup, and common patterns. More useful than raw schema for understanding node usage.',
parameters: {
nodeType: { type: 'string', required: true, description: 'Full node type with prefix (e.g., "nodes-base.slack")' }
},
returns: 'Parsed markdown documentation with examples, authentication guides, common patterns',
examples: [
'get_node_documentation({nodeType: "nodes-base.slack"}) - Slack usage guide',
'get_node_documentation({nodeType: "nodes-base.googleSheets"}) - Sheets examples'
],
useCases: [
'Understanding authentication setup',
'Finding usage examples',
'Learning common patterns'
],
performance: 'Fast - Pre-parsed documentation stored in database',
bestPractices: [
'Use for learning node usage',
'Check coverage with get_database_statistics',
'Combine with get_node_essentials'
],
pitfalls: [
'Not all nodes have docs (87% coverage)',
'May be outdated for new features',
'Requires full node type prefix'
],
relatedTools: ['get_node_info', 'get_node_essentials', 'search_nodes']
}
};

View File

@@ -0,0 +1,40 @@
import { ToolDocumentation } from '../types';
export const getNodeEssentialsDoc: ToolDocumentation = {
name: 'get_node_essentials',
category: 'configuration',
essentials: {
description: 'Get 10-20 key properties with examples (<5KB)',
keyParameters: ['nodeType'],
example: 'get_node_essentials("nodes-base.slack")',
performance: 'Fast (<5KB response)',
tips: [
'Use this first - has examples'
]
},
full: {
description: 'Curated essential properties only. 95% smaller than full schema, includes examples.',
parameters: {
nodeType: { type: 'string', description: 'e.g., "nodes-base.slack"', required: true }
},
returns: 'Essential properties, examples, common patterns',
examples: [
'get_node_essentials("nodes-base.httpRequest")'
],
useCases: [
'Quick node configuration',
'Getting examples',
'Learning basics'
],
performance: 'Fast - minimal data',
bestPractices: [
'Always use before get_node_info',
'Copy examples as starting point'
],
pitfalls: [
'Advanced properties not included',
'Use search_node_properties for specific needs'
],
relatedTools: ['get_node_info', 'search_node_properties']
}
};

View File

@@ -0,0 +1,45 @@
import { ToolDocumentation } from '../types';
export const getNodeInfoDoc: ToolDocumentation = {
name: 'get_node_info',
category: 'configuration',
essentials: {
description: 'Get FULL node schema (100KB+). TIP: Use get_node_essentials first! Returns all properties/operations/credentials. Prefix required: "nodes-base.httpRequest" not "httpRequest".',
keyParameters: ['nodeType'],
example: 'get_node_info({nodeType: "nodes-base.slack"})',
performance: 'Moderate - large responses',
tips: [
'Use get_node_essentials first',
'Required: Full prefix "nodes-base."',
'Returns entire schema'
]
},
full: {
description: 'Returns complete node JSON schema including all properties, operations, credentials, and metadata. Response size often exceeds 100KB. Always prefer get_node_essentials unless you need the complete schema.',
parameters: {
nodeType: { type: 'string', required: true, description: 'Full node type with prefix (e.g., "nodes-base.slack", "nodes-langchain.openAi")' }
},
returns: 'Complete node JSON with type, displayName, description, properties, credentials, version info',
examples: [
'get_node_info({nodeType: "nodes-base.httpRequest"}) - Get HTTP Request node',
'get_node_info({nodeType: "nodes-langchain.openAi"}) - Get OpenAI node'
],
useCases: [
'Complete schema analysis',
'Credential requirement discovery',
'Advanced property exploration'
],
performance: 'Moderate - Response size 50-500KB depending on node complexity',
bestPractices: [
'Always use get_node_essentials first',
'Only use when complete schema needed',
'Cache results for repeated access'
],
pitfalls: [
'Response often exceeds 100KB',
'Overwhelming for simple configurations',
'Must include full prefix'
],
relatedTools: ['get_node_essentials', 'search_node_properties', 'validate_node_operation']
}
};

View File

@@ -0,0 +1,79 @@
import { ToolDocumentation } from '../types';
export const getPropertyDependenciesDoc: ToolDocumentation = {
name: 'get_property_dependencies',
category: 'configuration',
essentials: {
description: 'Shows property dependencies and visibility rules - which fields appear when.',
keyParameters: ['nodeType', 'config?'],
example: 'get_property_dependencies({nodeType: "nodes-base.httpRequest"})',
performance: 'Fast - analyzes property conditions',
tips: [
'Shows which properties depend on other property values',
'Test visibility impact with optional config parameter',
'Helps understand complex conditional property displays'
]
},
full: {
description: `Analyzes property dependencies and visibility conditions for a node. Shows which properties control the visibility of other properties (e.g., sendBody=true reveals body-related fields). Optionally test how a specific configuration affects property visibility.`,
parameters: {
nodeType: {
type: 'string',
required: true,
description: 'The node type to analyze (e.g., "nodes-base.httpRequest")',
examples: [
'nodes-base.httpRequest',
'nodes-base.slack',
'nodes-base.if',
'nodes-base.switch'
]
},
config: {
type: 'object',
required: false,
description: 'Optional partial configuration to check visibility impact',
examples: [
'{ method: "POST", sendBody: true }',
'{ operation: "create", resource: "contact" }',
'{ mode: "rules" }'
]
}
},
returns: `Object containing:
- nodeType: The analyzed node type
- displayName: Human-readable node name
- controllingProperties: Properties that control visibility of others
- dependentProperties: Properties whose visibility depends on others
- complexDependencies: Multi-condition dependencies
- currentConfig: If config provided, shows:
- providedValues: The configuration you passed
- visibilityImpact: Which properties are visible/hidden`,
examples: [
'get_property_dependencies({nodeType: "nodes-base.httpRequest"}) - Analyze HTTP Request dependencies',
'get_property_dependencies({nodeType: "nodes-base.httpRequest", config: {sendBody: true}}) - Test visibility with sendBody enabled',
'get_property_dependencies({nodeType: "nodes-base.if", config: {mode: "rules"}}) - Check If node in rules mode'
],
useCases: [
'Understanding which properties control others',
'Debugging why certain fields are not visible',
'Building dynamic UIs that match n8n behavior',
'Testing configurations before applying them',
'Understanding complex node property relationships'
],
performance: 'Fast - analyzes property metadata without database queries',
bestPractices: [
'Use before configuring complex nodes with many conditional fields',
'Test different config values to understand visibility rules',
'Check dependencies when properties seem to be missing',
'Use for nodes with multiple operation modes (Slack, Google Sheets)',
'Combine with search_node_properties to find specific fields'
],
pitfalls: [
'Some properties have complex multi-condition dependencies',
'Visibility rules can be nested (property A controls B which controls C)',
'Not all hidden properties are due to dependencies (some are deprecated)',
'Config parameter only tests visibility, does not validate values'
],
relatedTools: ['search_node_properties', 'get_node_essentials', 'validate_node_operation']
}
};

View File

@@ -0,0 +1,6 @@
export { getNodeInfoDoc } from './get-node-info';
export { getNodeEssentialsDoc } from './get-node-essentials';
export { getNodeDocumentationDoc } from './get-node-documentation';
export { searchNodePropertiesDoc } from './search-node-properties';
export { getNodeAsToolInfoDoc } from './get-node-as-tool-info';
export { getPropertyDependenciesDoc } from './get-property-dependencies';

View File

@@ -0,0 +1,97 @@
import { ToolDocumentation } from '../types';
export const searchNodePropertiesDoc: ToolDocumentation = {
name: 'search_node_properties',
category: 'configuration',
essentials: {
description: 'Find specific properties in a node without downloading all 200+ properties.',
keyParameters: ['nodeType', 'query'],
example: 'search_node_properties({nodeType: "nodes-base.httpRequest", query: "auth"})',
performance: 'Fast - searches indexed properties',
tips: [
'Search for "auth", "header", "body", "json", "credential"',
'Returns property paths and descriptions',
'Much faster than get_node_info for finding specific fields'
]
},
full: {
description: `Searches for specific properties within a node's configuration schema. Essential for finding authentication fields, headers, body parameters, or any specific property without downloading the entire node schema (which can be 100KB+). Returns matching properties with their paths, types, and descriptions.`,
parameters: {
nodeType: {
type: 'string',
required: true,
description: 'Full type with prefix',
examples: [
'nodes-base.httpRequest',
'nodes-base.slack',
'nodes-base.postgres',
'nodes-base.googleSheets'
]
},
query: {
type: 'string',
required: true,
description: 'Property to find: "auth", "header", "body", "json"',
examples: [
'auth',
'header',
'body',
'json',
'credential',
'timeout',
'retry',
'pagination'
]
},
maxResults: {
type: 'number',
required: false,
description: 'Max results (default 20)',
default: 20
}
},
returns: `Object containing:
- nodeType: The searched node type
- query: Your search term
- matches: Array of matching properties with:
- name: Property identifier
- displayName: Human-readable name
- type: Property type (string, number, options, etc.)
- description: Property description
- path: Full path to property (for nested properties)
- required: Whether property is required
- default: Default value if any
- options: Available options for selection properties
- showWhen: Visibility conditions
- totalMatches: Number of matches found
- searchedIn: Total properties searched`,
examples: [
'search_node_properties({nodeType: "nodes-base.httpRequest", query: "auth"}) - Find authentication fields',
'search_node_properties({nodeType: "nodes-base.slack", query: "channel"}) - Find channel-related properties',
'search_node_properties({nodeType: "nodes-base.postgres", query: "query"}) - Find query fields',
'search_node_properties({nodeType: "nodes-base.webhook", query: "response"}) - Find response options'
],
useCases: [
'Finding authentication/credential fields quickly',
'Locating specific parameters without full node info',
'Discovering header or body configuration options',
'Finding nested properties in complex nodes',
'Checking if a node supports specific features (retry, pagination, etc.)'
],
performance: 'Very fast - searches pre-indexed property metadata',
bestPractices: [
'Use before get_node_info to find specific properties',
'Search for common terms: auth, header, body, credential',
'Check showWhen conditions to understand visibility',
'Use with get_property_dependencies for complete understanding',
'Limit results if you only need to check existence'
],
pitfalls: [
'Some properties may be hidden due to visibility conditions',
'Property names may differ from display names',
'Nested properties show full path (e.g., "options.retry.limit")',
'Search is case-sensitive for property names'
],
relatedTools: ['get_node_essentials', 'get_property_dependencies', 'get_node_info']
}
};