fix: synchronize tool documentation with v2.26.0 tool consolidation (v2.26.2) (#442)

* fix: synchronize tool documentation with v2.26.0 tool consolidation (v2.26.2)

- Delete 23 obsolete documentation files for removed tools
- Create consolidated documentation for get_node, validate_node, n8n_executions
- Update search_templates with all searchModes
- Update n8n_get_workflow with all modes
- Fix stale relatedTools references
- Update tools-documentation.ts overview to reflect 19 consolidated tools

Conceived by Romuald Członkowski - www.aiadvisors.pl/en

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

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: address code review - fix remaining stale tool references

- Fix relatedTools in system/tools-documentation.ts (get_node_for_task → search_templates)
- Fix relatedTools in validation/validate-workflow.ts (remove references to removed tools)
- Fix relatedTools in n8n-autofix-workflow.ts (remove references to removed tools)
- Update tools-n8n-friendly.ts with consolidated tools (validate_node, get_node, search_templates)

Conceived by Romuald Członkowski - www.aiadvisors.pl/en

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

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: address final code review - fix remaining stale references

- Fix ai-agents-guide.ts: get_node_essentials → get_node, remove list_ai_tools
- Fix get-template.ts: list_node_templates → search_templates, remove get_templates_for_task
- Fix n8n-list-workflows.ts: n8n_get_workflow_minimal → n8n_get_workflow, n8n_list_executions → n8n_executions
- Fix n8n-trigger-webhook-workflow.ts: n8n_get_execution/n8n_list_executions → n8n_executions
- Fix n8n-delete-workflow.ts: n8n_get_workflow_minimal → n8n_get_workflow, n8n_delete_execution → n8n_executions
- Fix CHANGELOG date typo: 2025-01-25 → 2025-11-25

Conceived by Romuald Członkowski - www.aiadvisors.pl/en

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

Co-Authored-By: Claude <noreply@anthropic.com>

* test: adjust comprehensive docs threshold after tool consolidation

Reduce expected character count from 5000 to 4000 in tool-invocation.test.ts
to account for reduced documentation after v2.26.0 tool consolidation
(31→19 tools, actual output is ~4645 chars).

Conceived by Romuald Członkowski - www.aiadvisors.pl/en

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Romuald Członkowski
2025-11-25 21:28:11 +01:00
committed by GitHub
parent c974947c84
commit 1be06c217f
48 changed files with 530 additions and 2091 deletions

View File

@@ -4,12 +4,12 @@ export const getTemplateDoc: ToolDocumentation = {
name: 'get_template',
category: 'templates',
essentials: {
description: 'Get complete workflow JSON by ID. Ready to import. IDs from list_node_templates or search_templates.',
description: 'Get complete workflow JSON by ID. Ready to import. IDs from search_templates.',
keyParameters: ['templateId'],
example: 'get_template({templateId: 1234})',
performance: 'Fast (<100ms) - single database lookup',
tips: [
'Get template IDs from list_node_templates or search_templates first',
'Get template IDs from search_templates first',
'Returns complete workflow JSON ready for import into n8n',
'Includes all nodes, connections, and settings'
]
@@ -20,7 +20,7 @@ export const getTemplateDoc: ToolDocumentation = {
templateId: {
type: 'number',
required: true,
description: 'The numeric ID of the template to retrieve. Get IDs from list_node_templates or search_templates'
description: 'The numeric ID of the template to retrieve. Get IDs from search_templates'
}
},
returns: `Returns an object containing:
@@ -69,6 +69,6 @@ export const getTemplateDoc: ToolDocumentation = {
'Not all templates work with all n8n versions',
'Template may reference external services you don\'t have access to'
],
relatedTools: ['list_node_templates', 'search_templates', 'get_templates_for_task', 'n8n_create_workflow']
relatedTools: ['search_templates', 'n8n_create_workflow']
}
};

View File

@@ -1,74 +0,0 @@
import { ToolDocumentation } from '../types';
export const getTemplatesForTaskDoc: ToolDocumentation = {
name: 'get_templates_for_task',
category: 'templates',
essentials: {
description: 'Curated templates by task: ai_automation, data_sync, webhooks, email, slack, data_transform, files, scheduling, api, database.',
keyParameters: ['task'],
example: 'get_templates_for_task({task: "slack_integration"})',
performance: 'Fast (<100ms) - pre-categorized results',
tips: [
'Returns hand-picked templates for specific automation tasks',
'Available tasks: ai_automation, data_sync, webhook_processing, email_automation, slack_integration, etc.',
'Templates are curated for quality and relevance'
]
},
full: {
description: `Retrieves curated workflow templates for specific automation tasks. This tool provides hand-picked templates organized by common use cases, making it easy to find the right workflow for your needs. Each task category contains the most popular and effective templates for that particular automation scenario.`,
parameters: {
task: {
type: 'string',
required: true,
description: 'The type of task to get templates for. Options: ai_automation, data_sync, webhook_processing, email_automation, slack_integration, data_transformation, file_processing, scheduling, api_integration, database_operations'
}
},
returns: `Returns an object containing:
- task: The requested task type
- templates: Array of curated templates
- id: Template ID
- name: Template name
- description: What the workflow does
- author: Creator information
- nodes: Array of node types used
- views: Popularity metric
- created: Creation date
- url: Link to template
- totalFound: Number of templates in this category
- availableTasks: List of all task categories (if no templates found)`,
examples: [
'get_templates_for_task({task: "slack_integration"}) - Get Slack automation workflows',
'get_templates_for_task({task: "ai_automation"}) - Get AI-powered workflows',
'get_templates_for_task({task: "data_sync"}) - Get data synchronization workflows',
'get_templates_for_task({task: "webhook_processing"}) - Get webhook handler workflows',
'get_templates_for_task({task: "email_automation"}) - Get email automation workflows'
],
useCases: [
'Find workflows for specific business needs',
'Discover best practices for common automations',
'Get started quickly with pre-built solutions',
'Learn patterns for specific integration types',
'Browse curated collections of quality workflows'
],
performance: `Excellent performance with pre-categorized templates:
- Query time: <10ms (indexed by task)
- No filtering needed (pre-curated)
- Returns 5-20 templates per category
- Total response time: <100ms`,
bestPractices: [
'Start with task-based search for faster results',
'Review multiple templates to find best patterns',
'Check template age for most current approaches',
'Combine templates from same category for complex workflows',
'Use returned node lists to understand requirements'
],
pitfalls: [
'Not all tasks have many templates available',
'Task categories are predefined - no custom categories',
'Some templates may overlap between categories',
'Curation is subjective - browse all results',
'Templates may need updates for latest n8n features'
],
relatedTools: ['search_templates', 'list_node_templates', 'get_template', 'list_tasks']
}
};

View File

@@ -1,6 +1,2 @@
export { listTasksDoc } from './list-tasks';
export { listNodeTemplatesDoc } from './list-node-templates';
export { getTemplateDoc } from './get-template';
export { searchTemplatesDoc } from './search-templates';
export { searchTemplatesByMetadataDoc } from './search-templates-by-metadata';
export { getTemplatesForTaskDoc } from './get-templates-for-task';

View File

@@ -1,78 +0,0 @@
import { ToolDocumentation } from '../types';
export const listNodeTemplatesDoc: ToolDocumentation = {
name: 'list_node_templates',
category: 'templates',
essentials: {
description: 'Find templates using specific nodes. 399 community workflows. Use FULL types: "n8n-nodes-base.httpRequest".',
keyParameters: ['nodeTypes', 'limit'],
example: 'list_node_templates({nodeTypes: ["n8n-nodes-base.slack"]})',
performance: 'Fast (<100ms) - indexed node search',
tips: [
'Must use FULL node type with package prefix: "n8n-nodes-base.slack"',
'Can search for multiple nodes to find workflows using all of them',
'Returns templates sorted by popularity (view count)'
]
},
full: {
description: `Finds workflow templates that use specific n8n nodes. This is the best way to discover how particular nodes are used in real workflows. Search the community library of 399+ templates by specifying which nodes you want to see in action. Templates are sorted by popularity to show the most useful examples first.`,
parameters: {
nodeTypes: {
type: 'array',
required: true,
description: 'Array of node types to search for. Must use full type names with package prefix (e.g., ["n8n-nodes-base.httpRequest", "n8n-nodes-base.openAi"])'
},
limit: {
type: 'number',
required: false,
description: 'Maximum number of templates to return. Default 10, max 100'
}
},
returns: `Returns an object containing:
- templates: Array of matching templates
- id: Template ID for retrieval
- name: Template name
- description: What the workflow does
- author: Creator details (name, username, verified)
- nodes: Complete list of nodes used
- views: View count (popularity metric)
- created: Creation date
- url: Link to template on n8n.io
- totalFound: Total number of matching templates
- tip: Usage hints if no results`,
examples: [
'list_node_templates({nodeTypes: ["n8n-nodes-base.slack"]}) - Find all Slack workflows',
'list_node_templates({nodeTypes: ["n8n-nodes-base.httpRequest", "n8n-nodes-base.postgres"]}) - Find workflows using both HTTP and Postgres',
'list_node_templates({nodeTypes: ["@n8n/n8n-nodes-langchain.openAi"], limit: 20}) - Find AI workflows with OpenAI',
'list_node_templates({nodeTypes: ["n8n-nodes-base.webhook", "n8n-nodes-base.respondToWebhook"]}) - Find webhook examples'
],
useCases: [
'Learn how to use specific nodes through examples',
'Find workflows combining particular integrations',
'Discover patterns for node combinations',
'See real-world usage of complex nodes',
'Find templates for your exact tech stack'
],
performance: `Optimized for node-based searches:
- Indexed by node type for fast lookups
- Query time: <50ms for single node
- Multiple nodes: <100ms (uses AND logic)
- Returns pre-sorted by popularity
- No full-text search needed`,
bestPractices: [
'Always use full node type with package prefix',
'Search for core nodes that define the workflow purpose',
'Start with single node searches, then refine',
'Check node types with list_nodes if unsure of names',
'Review multiple templates to learn different approaches'
],
pitfalls: [
'Node types must match exactly - no partial matches',
'Package prefix required: "slack" won\'t work, use "n8n-nodes-base.slack"',
'Some nodes have version numbers: "n8n-nodes-base.httpRequestV3"',
'Templates may use old node versions not in current n8n',
'AND logic means all specified nodes must be present'
],
relatedTools: ['get_template', 'search_templates', 'get_templates_for_task', 'list_nodes']
}
};

View File

@@ -1,46 +0,0 @@
import { ToolDocumentation } from '../types';
export const listTasksDoc: ToolDocumentation = {
name: 'list_tasks',
category: 'templates',
essentials: {
description: 'List task templates by category: HTTP/API, Webhooks, Database, AI, Data Processing, Communication.',
keyParameters: ['category'],
example: 'list_tasks({category: "HTTP/API"})',
performance: 'Instant',
tips: [
'Categories: HTTP/API, Webhooks, Database, AI',
'Shows pre-configured node settings',
'Use get_node_for_task for details'
]
},
full: {
description: 'Lists available task templates organized by category. Each task represents a common automation pattern with pre-configured node settings. Categories include HTTP/API, Webhooks, Database, AI, Data Processing, and Communication.',
parameters: {
category: { type: 'string', description: 'Filter by category (optional)' }
},
returns: 'Array of tasks with name, category, description, nodeType',
examples: [
'list_tasks() - Get all task templates',
'list_tasks({category: "Database"}) - Database-related tasks',
'list_tasks({category: "AI"}) - AI automation tasks'
],
useCases: [
'Discover common automation patterns',
'Find pre-configured solutions',
'Learn node usage patterns',
'Quick workflow setup'
],
performance: 'Instant - Static task list',
bestPractices: [
'Browse all categories first',
'Use get_node_for_task for config',
'Combine multiple tasks in workflows'
],
pitfalls: [
'Tasks are templates, customize as needed',
'Not all nodes have task templates'
],
relatedTools: ['get_node_for_task', 'search_templates', 'get_templates_for_task']
}
};

View File

@@ -1,118 +0,0 @@
import { ToolDocumentation } from '../types';
export const searchTemplatesByMetadataDoc: ToolDocumentation = {
name: 'search_templates_by_metadata',
category: 'templates',
essentials: {
description: 'Search templates using AI-generated metadata filters. Find templates by complexity, setup time, required services, or target audience. Enables smart template discovery beyond simple text search.',
keyParameters: ['category', 'complexity', 'maxSetupMinutes', 'targetAudience'],
example: 'search_templates_by_metadata({complexity: "simple", maxSetupMinutes: 30})',
performance: 'Fast (<100ms) - JSON extraction queries',
tips: [
'All filters are optional - combine them for precise results',
'Use getAvailableCategories() to see valid category values',
'Complexity levels: simple, medium, complex',
'Setup time is in minutes (5-480 range)'
]
},
full: {
description: `Advanced template search using AI-generated metadata. Each template has been analyzed by GPT-4 to extract structured information about its purpose, complexity, setup requirements, and target users. This enables intelligent filtering beyond simple keyword matching, helping you find templates that match your specific needs, skill level, and available time.`,
parameters: {
category: {
type: 'string',
required: false,
description: 'Filter by category like "automation", "integration", "data processing", "communication". Use template service getAvailableCategories() for full list.'
},
complexity: {
type: 'string (enum)',
required: false,
description: 'Filter by implementation complexity: "simple" (beginner-friendly), "medium" (some experience needed), or "complex" (advanced features)'
},
maxSetupMinutes: {
type: 'number',
required: false,
description: 'Maximum acceptable setup time in minutes (5-480). Find templates you can implement within your time budget.'
},
minSetupMinutes: {
type: 'number',
required: false,
description: 'Minimum setup time in minutes (5-480). Find more substantial templates that offer comprehensive solutions.'
},
requiredService: {
type: 'string',
required: false,
description: 'Filter by required external service like "openai", "slack", "google", "shopify". Ensures you have necessary accounts/APIs.'
},
targetAudience: {
type: 'string',
required: false,
description: 'Filter by intended users: "developers", "marketers", "analysts", "operations", "sales". Find templates for your role.'
},
limit: {
type: 'number',
required: false,
description: 'Maximum results to return. Default 20, max 100.'
},
offset: {
type: 'number',
required: false,
description: 'Pagination offset for results. Default 0.'
}
},
returns: `Returns an object containing:
- items: Array of matching templates with full metadata
- id: Template ID
- name: Template name
- description: Purpose and functionality
- author: Creator details
- nodes: Array of nodes used
- views: Popularity count
- metadata: AI-generated structured data
- categories: Primary use categories
- complexity: Difficulty level
- use_cases: Specific applications
- estimated_setup_minutes: Time to implement
- required_services: External dependencies
- key_features: Main capabilities
- target_audience: Intended users
- total: Total matching templates
- filters: Applied filter criteria
- filterSummary: Human-readable filter description
- availableCategories: Suggested categories if no results
- availableAudiences: Suggested audiences if no results
- tip: Contextual guidance`,
examples: [
'search_templates_by_metadata({complexity: "simple"}) - Find beginner-friendly templates',
'search_templates_by_metadata({category: "automation", maxSetupMinutes: 30}) - Quick automation templates',
'search_templates_by_metadata({targetAudience: "marketers"}) - Marketing-focused workflows',
'search_templates_by_metadata({requiredService: "openai", complexity: "medium"}) - AI templates with moderate complexity',
'search_templates_by_metadata({minSetupMinutes: 60, category: "integration"}) - Comprehensive integration solutions'
],
useCases: [
'Finding beginner-friendly templates by setting complexity:"simple"',
'Discovering templates you can implement quickly with maxSetupMinutes:30',
'Finding role-specific workflows with targetAudience filter',
'Identifying templates that need specific APIs with requiredService filter',
'Combining multiple filters for precise template discovery'
],
performance: 'Fast (<100ms) - Uses SQLite JSON extraction on pre-generated metadata. 97.5% coverage (2,534/2,598 templates).',
bestPractices: [
'Start with broad filters and narrow down based on results',
'Use getAvailableCategories() to discover valid category values',
'Combine complexity and setup time for skill-appropriate templates',
'Check required services before selecting templates to ensure you have necessary accounts'
],
pitfalls: [
'Not all templates have metadata (97.5% coverage)',
'Setup time estimates assume basic n8n familiarity',
'Categories/audiences use partial matching - be specific',
'Metadata is AI-generated and may occasionally be imprecise'
],
relatedTools: [
'list_templates',
'search_templates',
'list_node_templates',
'get_templates_for_task'
]
}
};

View File

@@ -4,86 +4,140 @@ export const searchTemplatesDoc: ToolDocumentation = {
name: 'search_templates',
category: 'templates',
essentials: {
description: 'Search templates by name/description keywords. NOT for node types! For nodes use list_node_templates. Example: "chatbot".',
keyParameters: ['query', 'limit', 'fields'],
example: 'search_templates({query: "chatbot", fields: ["id", "name"]})',
description: 'Unified template search with multiple modes: keyword search, by node types, by task type, or by metadata. 2,700+ templates available.',
keyParameters: ['searchMode', 'query', 'nodeTypes', 'task', 'limit'],
example: 'search_templates({searchMode: "by_task", task: "webhook_processing"})',
performance: 'Fast (<100ms) - FTS5 full-text search',
tips: [
'Searches template names and descriptions, NOT node types',
'Use keywords like "automation", "sync", "notification"',
'For node-specific search, use list_node_templates instead',
'Use fields parameter to get only specific data (reduces response by 70-90%)'
'searchMode="keyword" (default): Search by name/description',
'searchMode="by_nodes": Find templates using specific nodes',
'searchMode="by_task": Get curated templates for common tasks',
'searchMode="by_metadata": Filter by complexity, services, audience'
]
},
full: {
description: `Performs full-text search across workflow template names and descriptions. This tool is ideal for finding workflows based on their purpose or functionality rather than specific nodes used. It searches through the community library of 399+ templates using SQLite FTS5 for fast, fuzzy matching.`,
description: `Unified template search tool with four search modes. Replaces search_templates, list_node_templates, search_templates_by_metadata, and get_templates_for_task.
**Search Modes:**
- keyword (default): Full-text search across template names and descriptions
- by_nodes: Find templates that use specific node types
- by_task: Get curated templates for predefined task categories
- by_metadata: Filter by complexity, setup time, required services, or target audience
**Available Task Types (for searchMode="by_task"):**
ai_automation, data_sync, webhook_processing, email_automation, slack_integration, data_transformation, file_processing, scheduling, api_integration, database_operations`,
parameters: {
searchMode: {
type: 'string',
required: false,
description: 'Search mode: "keyword" (default), "by_nodes", "by_task", "by_metadata"'
},
query: {
type: 'string',
required: true,
description: 'Search query for template names/descriptions. NOT for node types! Examples: "chatbot", "automation", "social media", "webhook". For node-based search use list_node_templates instead.'
required: false,
description: 'For searchMode=keyword: Search keywords (e.g., "chatbot", "automation")'
},
nodeTypes: {
type: 'array',
required: false,
description: 'For searchMode=by_nodes: Array of node types (e.g., ["n8n-nodes-base.httpRequest", "n8n-nodes-base.slack"])'
},
task: {
type: 'string',
required: false,
description: 'For searchMode=by_task: Task type (ai_automation, data_sync, webhook_processing, email_automation, slack_integration, data_transformation, file_processing, scheduling, api_integration, database_operations)'
},
complexity: {
type: 'string',
required: false,
description: 'For searchMode=by_metadata: Filter by complexity ("simple", "medium", "complex")'
},
maxSetupMinutes: {
type: 'number',
required: false,
description: 'For searchMode=by_metadata: Maximum setup time in minutes (5-480)'
},
minSetupMinutes: {
type: 'number',
required: false,
description: 'For searchMode=by_metadata: Minimum setup time in minutes (5-480)'
},
requiredService: {
type: 'string',
required: false,
description: 'For searchMode=by_metadata: Filter by required service (e.g., "openai", "slack", "google")'
},
targetAudience: {
type: 'string',
required: false,
description: 'For searchMode=by_metadata: Filter by target audience (e.g., "developers", "marketers")'
},
category: {
type: 'string',
required: false,
description: 'For searchMode=by_metadata: Filter by category (e.g., "automation", "integration")'
},
fields: {
type: 'array',
required: false,
description: 'Fields to include in response. Options: "id", "name", "description", "author", "nodes", "views", "created", "url", "metadata". Default: all fields. Example: ["id", "name"] for minimal response.'
description: 'For searchMode=keyword: Fields to include (id, name, description, author, nodes, views, created, url, metadata)'
},
limit: {
type: 'number',
required: false,
description: 'Maximum number of results. Default 20, max 100'
description: 'Maximum results (default 20, max 100)'
},
offset: {
type: 'number',
required: false,
description: 'Pagination offset (default 0)'
}
},
returns: `Returns an object containing:
- templates: Array of matching templates sorted by relevance
- id: Template ID for retrieval
- name: Template name (with match highlights)
- templates: Array of matching templates
- id: Template ID for get_template()
- name: Template name
- description: What the workflow does
- author: Creator information
- nodes: Array of all nodes used
- nodes: Array of node types used
- views: Popularity metric
- created: Creation date
- url: Link to template
- relevanceScore: Search match score
- metadata: AI-generated metadata (complexity, services, etc.)
- totalFound: Total matching templates
- searchQuery: The processed search query
- tip: Helpful hints if no results`,
- searchMode: The mode used`,
examples: [
'search_templates({query: "chatbot"}) - Find chatbot and conversational AI workflows',
'search_templates({query: "email notification"}) - Find email alert workflows',
'search_templates({query: "data sync"}) - Find data synchronization workflows',
'search_templates({query: "webhook automation", limit: 30}) - Find webhook-based automations',
'search_templates({query: "social media scheduler"}) - Find social posting workflows',
'search_templates({query: "slack", fields: ["id", "name"]}) - Get only IDs and names of Slack templates',
'search_templates({query: "automation", fields: ["id", "name", "description"]}) - Get minimal info for automation templates'
'// Keyword search (default)\nsearch_templates({query: "chatbot"})',
'// Find templates using specific nodes\nsearch_templates({searchMode: "by_nodes", nodeTypes: ["n8n-nodes-base.httpRequest", "n8n-nodes-base.slack"]})',
'// Get templates for a task type\nsearch_templates({searchMode: "by_task", task: "webhook_processing"})',
'// Filter by metadata\nsearch_templates({searchMode: "by_metadata", complexity: "simple", requiredService: "openai"})',
'// Combine metadata filters\nsearch_templates({searchMode: "by_metadata", maxSetupMinutes: 30, targetAudience: "developers"})'
],
useCases: [
'Find workflows by business purpose',
'Discover automations for specific use cases',
'Search by workflow functionality',
'Find templates by problem they solve',
'Explore workflows by industry or domain'
'Find workflows by business purpose (keyword search)',
'Find templates using specific integrations (by_nodes)',
'Get pre-built solutions for common tasks (by_task)',
'Filter by complexity for team skill level (by_metadata)',
'Find templates requiring specific services (by_metadata)'
],
performance: `Excellent performance with FTS5 indexing:
- Full-text search: <50ms for most queries
- Fuzzy matching enabled for typos
- Relevance-based sorting included
- Searches both title and description
- Returns highlighted matches`,
performance: `Fast performance across all modes:
- keyword: <50ms with FTS5 indexing
- by_nodes: <100ms with indexed lookups
- by_task: <50ms from curated cache
- by_metadata: <100ms with filtered queries`,
bestPractices: [
'Use descriptive keywords about the workflow purpose',
'Try multiple related terms if first search has few results',
'Combine terms for more specific results',
'Check both name and description in results',
'Use quotes for exact phrase matching'
'Use searchMode="by_task" for common automation patterns',
'Use searchMode="by_nodes" when you know which integrations you need',
'Use searchMode="keyword" for general discovery',
'Combine by_metadata filters for precise matching',
'Use get_template(id) to get the full workflow JSON'
],
pitfalls: [
'Does NOT search by node types - use list_node_templates',
'Search is case-insensitive but not semantic',
'Very specific terms may return no results',
'Descriptions may be brief - check full template',
'Relevance scoring may not match your expectations'
'searchMode="keyword" searches names/descriptions, not node types',
'by_nodes requires full node type with prefix (n8n-nodes-base.xxx)',
'by_metadata filters may return fewer results',
'Not all templates have complete metadata'
],
relatedTools: ['list_node_templates', 'get_templates_for_task', 'get_template', 'search_nodes']
relatedTools: ['get_template', 'search_nodes', 'validate_workflow']
}
};