search_patterns
Find relevant design patterns by keyword or semantic search to solve programming challenges and implement effective software solutions.
Instructions
Search patterns by keyword or semantic similarity
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Search query | |
| searchType | No | hybrid |
Implementation Reference
- src/mcp-server.ts:350-379 (handler)Primary handler for the 'search_patterns' tool. Processes input arguments, performs semantic search using SemanticSearchService, formats results as markdown text content, and returns MCP-compatible response.private async handleSearchPatterns(args: any): Promise<any> { const query = { text: args.query, filters: args.filters || {}, options: { limit: args.limit || 10, includeMetadata: true, }, }; const results = await this.semanticSearch.search(query); return { content: [ { type: 'text', text: `Search results for "${args.query}":\n\n` + results .map( (result, index) => `${index + 1}. **${result.pattern.name}** (${result.pattern.category})\n` + ` Score: ${(result.score * 100).toFixed(1)}%\n` + ` Description: ${result.pattern.description}\n` ) .join('\n'), }, ], }; }
- src/mcp-server.ts:186-206 (registration)Tool registration in the list_tools response, defining the name, description, and input schema for 'search_patterns'.name: 'search_patterns', description: 'Search patterns by keyword or semantic similarity', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query', }, searchType: { type: 'string', enum: ['keyword', 'semantic', 'hybrid'], default: 'hybrid', }, limit: { type: 'number', default: 10, }, }, required: ['query'], },
- src/lib/mcp-tools.ts:1016-1068 (handler)Alternative/complementary handler in MCPToolsHandler class supporting keyword, semantic, and hybrid search modes via adapters.private async handleSearchPatterns(args: any): Promise<any> { // Validate input if (!args.query || typeof args.query !== 'string' || args.query.length < 2) { throw new Error('Query must be at least 2 characters long'); } const searchType = args.search_type || 'hybrid'; const limit = Math.min(args.limit || 10, 50); try { let results: any[]; if (searchType === 'semantic') { // Use semantic search results = await this.config.semanticSearch.search(args.query, { limit, filters: args.category_filter ? { categories: [args.category_filter] } : undefined, }); } else if (searchType === 'keyword') { // Use keyword search results = await this.config.databaseManager.searchPatterns(args.query, { limit, filters: args.category_filter ? { categories: [args.category_filter] } : undefined, }); } else { // Hybrid search const semanticResults = await this.config.semanticSearch.search(args.query, { limit: Math.ceil(limit / 2), filters: args.category_filter ? { categories: [args.category_filter] } : undefined, }); const keywordResults = await this.config.databaseManager.searchPatterns(args.query, { limit: Math.ceil(limit / 2), filters: args.category_filter ? { categories: [args.category_filter] } : undefined, }); // Merge and deduplicate results results = this.mergeSearchResults(semanticResults, keywordResults, limit); } return { patterns: results, total_results: results.length, search_type: searchType, limit, timestamp: new Date().toISOString(), }; } catch (error) { throw new Error( `Pattern search failed: ${error instanceof Error ? error.message : String(error)}` ); } }
- src/lib/mcp-tools.ts:524-557 (registration)Tool registration in MCPToolsHandler.getTools(), including detailed input schema with validation constraints.name: 'search_patterns', description: 'Search patterns using keyword or semantic search', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query', minLength: 2, maxLength: 500, }, search_type: { type: 'string', description: 'Type of search to perform', enum: ['keyword', 'semantic', 'hybrid'], default: 'hybrid', }, category_filter: { type: 'array', items: { type: 'string', }, description: 'Filter by pattern categories', }, limit: { type: 'number', description: 'Maximum number of results', minimum: 1, maximum: 50, default: 10, }, }, required: ['query'], },
- Database helper method for keyword-based pattern search using SQL LIKE queries.async searchPatterns(query: string): Promise<Pattern[]> { const searchTerm = `%${query}%`; const sql = ` SELECT * FROM patterns WHERE name LIKE ? OR description LIKE ? OR tags LIKE ? ORDER BY name `; return this.db.query<Pattern>(sql, [searchTerm, searchTerm, searchTerm]); }