Skip to main content
Glama

search_templates

Search n8n workflow templates by keyword, node types, tasks, or metadata filters to find automation solutions for specific needs.

Instructions

Search templates with multiple modes. Use searchMode='keyword' for text search, 'by_nodes' to find templates using specific nodes, 'by_task' for curated task-based templates, 'by_metadata' for filtering by complexity/setup time/services.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
searchModeNoSearch mode. keyword=text search (default), by_nodes=find by node types, by_task=curated task templates, by_metadata=filter by complexity/serviceskeyword
queryNoFor searchMode=keyword: search keyword (e.g., "chatbot")
fieldsNoFor searchMode=keyword: fields to include in response. Default: all fields.
nodeTypesNoFor searchMode=by_nodes: array of node types (e.g., ["n8n-nodes-base.httpRequest", "n8n-nodes-base.slack"])
taskNoFor searchMode=by_task: the type of task
categoryNoFor searchMode=by_metadata: filter by category (e.g., "automation", "integration")
complexityNoFor searchMode=by_metadata: filter by complexity level
maxSetupMinutesNoFor searchMode=by_metadata: maximum setup time in minutes
minSetupMinutesNoFor searchMode=by_metadata: minimum setup time in minutes
requiredServiceNoFor searchMode=by_metadata: filter by required service (e.g., "openai", "slack")
targetAudienceNoFor searchMode=by_metadata: filter by target audience (e.g., "developers", "marketers")
limitNoMaximum number of results. Default 20.
offsetNoPagination offset. Default 0.

Implementation Reference

  • Primary input/output schema definition for the search_templates MCP tool, including all parameters and validation rules.
    { name: 'search_templates', description: `Search templates with multiple modes. Use searchMode='keyword' for text search, 'by_nodes' to find templates using specific nodes, 'by_task' for curated task-based templates, 'by_metadata' for filtering by complexity/setup time/services.`, inputSchema: { type: 'object', properties: { searchMode: { type: 'string', enum: ['keyword', 'by_nodes', 'by_task', 'by_metadata'], description: 'Search mode. keyword=text search (default), by_nodes=find by node types, by_task=curated task templates, by_metadata=filter by complexity/services', default: 'keyword', }, query: { type: 'string', description: 'For searchMode=keyword: search keyword (e.g., "chatbot")', }, fields: { type: 'array', items: { type: 'string', enum: ['id', 'name', 'description', 'author', 'nodes', 'views', 'created', 'url', 'metadata'], }, description: 'For searchMode=keyword: fields to include in response. Default: all fields.', }, nodeTypes: { type: 'array', items: { type: 'string' }, description: 'For searchMode=by_nodes: array of node types (e.g., ["n8n-nodes-base.httpRequest", "n8n-nodes-base.slack"])', }, task: { type: 'string', enum: [ 'ai_automation', 'data_sync', 'webhook_processing', 'email_automation', 'slack_integration', 'data_transformation', 'file_processing', 'scheduling', 'api_integration', 'database_operations' ], description: 'For searchMode=by_task: the type of task', }, category: { type: 'string', description: 'For searchMode=by_metadata: filter by category (e.g., "automation", "integration")', }, complexity: { type: 'string', enum: ['simple', 'medium', 'complex'], description: 'For searchMode=by_metadata: filter by complexity level', }, maxSetupMinutes: { type: 'number', description: 'For searchMode=by_metadata: maximum setup time in minutes', minimum: 5, maximum: 480, }, minSetupMinutes: { type: 'number', description: 'For searchMode=by_metadata: minimum setup time in minutes', minimum: 5, maximum: 480, }, requiredService: { type: 'string', description: 'For searchMode=by_metadata: filter by required service (e.g., "openai", "slack")', }, targetAudience: { type: 'string', description: 'For searchMode=by_metadata: filter by target audience (e.g., "developers", "marketers")', }, limit: { type: 'number', description: 'Maximum number of results. Default 20.', default: 20, minimum: 1, maximum: 100, }, offset: { type: 'number', description: 'Pagination offset. Default 0.', default: 0, minimum: 0, }, }, }, },
  • Detailed documentation object for search_templates tool, used by tools_documentation tool to provide usage examples and parameter descriptions.
    import { ToolDocumentation } from '../types'; export const searchTemplatesDoc: ToolDocumentation = { name: 'search_templates', category: 'templates', essentials: { 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: [ '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: `**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: 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: 'For searchMode=keyword: Fields to include (id, name, description, author, nodes, views, created, url, metadata)' }, limit: { type: 'number', required: false, 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 - id: Template ID for get_template() - 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 - metadata: AI-generated metadata (complexity, services, etc.) - totalFound: Total matching templates - searchMode: The mode used`, examples: [ '// 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 (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: `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 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: [ '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: ['get_template', 'search_nodes', 'validate_workflow'] } };
  • Core handler logic for keyword-based template search, delegating to repository and formatting results with pagination.
    async searchTemplates(query, limit = 20, offset = 0, fields) { const templates = this.repository.searchTemplates(query, limit, offset); const total = this.repository.getSearchCount(query); const items = fields ? templates.map(t => this.formatTemplateWithFields(t, fields)) : templates.map(t => this.formatTemplateInfo(t)); return { items, total, limit, offset, hasMore: offset + limit < total }; }
  • Fallback LIKE-based search implementation for templates when FTS5 is unavailable.
    searchTemplatesLIKE(query, limit = 20, offset = 0) { const likeQuery = `%${query}%`; logger_1.logger.debug(`Using LIKE search with pattern: ${likeQuery}`); const results = this.db.prepare(` SELECT * FROM templates WHERE name LIKE ? OR description LIKE ? ORDER BY views DESC, created_at DESC LIMIT ? OFFSET ? `).all(likeQuery, likeQuery, limit, offset); logger_1.logger.debug(`LIKE search returned ${results.length} results`); return results.map(t => this.decompressWorkflow(t)); }
  • Advanced metadata-based search using JSON queries on template metadata, with optimization for ordering and pagination.
    searchTemplatesByMetadata(filters, limit = 20, offset = 0) { const startTime = Date.now(); const { conditions, params } = this.buildMetadataFilterConditions(filters); const idsQuery = ` SELECT id FROM templates WHERE ${conditions.join(' AND ')} ORDER BY views DESC, created_at DESC, id ASC LIMIT ? OFFSET ? `; params.push(limit, offset); const ids = this.db.prepare(idsQuery).all(...params); const phase1Time = Date.now() - startTime; if (ids.length === 0) { logger_1.logger.debug('Metadata search found 0 results', { filters, phase1Ms: phase1Time }); return []; } const idValues = ids.map(r => r.id).filter(id => typeof id === 'number' && id > 0 && Number.isInteger(id)); if (idValues.length === 0) { logger_1.logger.warn('No valid IDs after filtering', { filters, originalCount: ids.length }); return []; } if (idValues.length !== ids.length) { logger_1.logger.warn('Some IDs were filtered out as invalid', { original: ids.length, valid: idValues.length, filtered: ids.length - idValues.length }); } const phase2Start = Date.now(); const orderedQuery = ` WITH ordered_ids(id, sort_order) AS ( VALUES ${idValues.map((id, idx) => `(${id}, ${idx})`).join(', ')} ) SELECT t.* FROM templates t INNER JOIN ordered_ids o ON t.id = o.id ORDER BY o.sort_order `; const results = this.db.prepare(orderedQuery).all(); const phase2Time = Date.now() - phase2Start; logger_1.logger.debug(`Metadata search found ${results.length} results`, { filters, count: results.length, phase1Ms: phase1Time, phase2Ms: phase2Time, totalMs: Date.now() - startTime, optimization: 'two-phase-with-ordering' }); return results.map(t => this.decompressWorkflow(t)); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/czlonkowski/n8n-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server