Skip to main content
Glama
apolosan

Design Patterns MCP Server

by apolosan

search_patterns

Find design patterns by keyword or semantic similarity to solve programming problems. Search across 200+ patterns using natural language queries.

Instructions

Search patterns by keyword or semantic similarity

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
searchTypeNohybrid
limitNo

Implementation Reference

  • Registration of the 'search_patterns' tool in the MCP server's tool list, including description and input schema
      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'],
      },
    },
  • Handler function for executing the search_patterns tool: validates input, performs semantic search via SemanticSearchService, and formats results as text response
    private async handleSearchPatterns(args: unknown): Promise<CallToolResult> {
      const validatedArgs = InputValidator.validateSearchPatternsArgs(args);
      const query = {
        text: validatedArgs.query,
        filters: {},
        options: {
          limit: validatedArgs.limit,
          includeMetadata: true,
        },
      };
    
      const results = await this.semanticSearch.search(query);
    
      return {
        content: [
          {
            type: 'text',
            text:
              `Search results for "${validatedArgs.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'),
          },
        ],
      };
    }
  • TypeScript interface definition and type guard for SearchPatternsArgs used in tool input validation
    export interface SearchPatternsArgs {
      query: string;
      search_type?: 'keyword' | 'semantic' | 'hybrid';
      category_filter?: string[];
      limit?: number;
    }
    
    export function isSearchPatternsArgs(args: unknown): args is SearchPatternsArgs {
      if (typeof args !== 'object' || args === null) return false;
      const a = args as Record<string, unknown>;
      return typeof a.query === 'string' &&
        (a.search_type === undefined || ['keyword', 'semantic', 'hybrid'].includes(a.search_type as string)) &&
        (a.category_filter === undefined || Array.isArray(a.category_filter)) &&
        (a.limit === undefined || typeof a.limit === 'number');
    }
  • Tool dispatch case in MCPToolsHandler.handleToolCall that routes to handler
    case 'search_patterns':
      if (!isSearchPatternsArgs(args)) {
        throw new Error('Invalid arguments for search_patterns tool');
      }
      return await this.handleSearchPatterns(args);
  • Comprehensive hybrid search handler supporting keyword, semantic, and hybrid search modes with result merging (alternative implementation in lib)
    private async handleSearchPatterns(args: SearchPatternsArgs): Promise<Record<string, unknown>> {
      // 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: SearchResult[];
    
        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)}`
        );
      }
    }

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/apolosan/design_patterns_mcp'

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