Skip to main content
Glama

search_bugs_by_keyword

Search for Cisco bugs using specific keywords in descriptions or headlines. Filter results by severity, status, or modified date. Ideal for general troubleshooting and symptom-based searches. Use multi_severity_search for broader severity queries.

Instructions

Search for bugs using keywords in descriptions and headlines. Use this when searching by general terms, symptoms, or when product-specific tools are not applicable. IMPORTANT: severity parameter returns ONLY that specific level. For "severity 3 or higher" searches, use multi_severity_search tool instead.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
keywordYesKeywords to search for
modified_dateNoLast modified date filter. Values: 1=Last Week, 2=Last 30 Days, 3=Last 6 Months, 4=Last Year, 5=All. Default: 5 (All)5
page_indexNoPage number (10 results per page)
severityNoBug severity filter. Returns bugs with ONLY the specified severity level. Values: 1=Severity 1 (highest), 2=Severity 2, 3=Severity 3, 4=Severity 4, 5=Severity 5, 6=Severity 6 (lowest). For "severity 3 or higher" bugs, use multi_severity_search tool which handles multiple separate API calls.
sort_byNoSort order for results. Default: modified_date (recent first)
statusNoBug status filter. IMPORTANT: Only ONE status allowed per search. Values: O=Open, F=Fixed, T=Terminated. Do NOT use comma-separated values like "O,F".

Implementation Reference

  • Tool schema definition including input validation and description
    name: 'search_bugs_by_keyword', title: 'Search Bugs by Keyword', description: 'Search for bugs using keywords in descriptions and headlines. Use this when searching by general terms, symptoms, or when product-specific tools are not applicable. IMPORTANT: severity parameter returns ONLY that specific level. For "severity 3 or higher" searches, use multi_severity_search tool instead. NOTE: Do NOT use product IDs (like ISR4431/K9) as keywords - use search_bugs_by_product_id instead.', inputSchema: { type: 'object', properties: { keyword: { type: 'string', description: 'Keywords to search for (general terms, symptoms, error messages - NOT product IDs)' }, page_index: { type: 'integer', default: 1, description: 'Page number (10 results per page)' }, status: { type: 'string', description: 'Bug status filter. IMPORTANT: Only ONE status allowed per search. Values: O=Open, F=Fixed, T=Terminated. Do NOT use comma-separated values like "O,F".', enum: ['O', 'F', 'T'] }, severity: { type: 'string', description: 'Bug severity filter. Returns bugs with ONLY the specified severity level. Values: 1=Severity 1 (highest), 2=Severity 2, 3=Severity 3, 4=Severity 4, 5=Severity 5, 6=Severity 6 (lowest). For "severity 3 or higher" bugs, use multi_severity_search tool which handles multiple separate API calls.', enum: ['1', '2', '3', '4', '5', '6'] }, modified_date: { type: 'string', description: 'Last modified date filter. Values: 1=Last Week, 2=Last 30 Days, 3=Last 6 Months, 4=Last Year, 5=All. Default: 5 (All)', enum: ['1', '2', '3', '4', '5'], default: '5' }, sort_by: { type: 'string', description: 'Sort order for results. Default: modified_date (recent first)', enum: ['status', 'modified_date', 'severity', 'support_case_count', 'modified_date_earliest'] }, }, required: ['keyword'] } },
  • Main handler function executeTool that dispatches to Cisco Bug Search API endpoint based on tool name. For search_bugs_by_keyword, sets endpoint `/bugs/keyword/{keyword}` and executes HTTP request via makeApiCall.
    async executeTool(name: string, args: ToolArgs, meta?: { progressToken?: string }): Promise<BugApiResponse> { const { processedArgs } = this.validateTool(name, args); // Normalize version strings to remove leading zeros (17.09.06 -> 17.9.6) // This ensures Cisco API compatibility across all tools if (processedArgs.software_releases) { processedArgs.software_releases = this.normalizeVersionString(processedArgs.software_releases as string); } if (processedArgs.affected_releases) { processedArgs.affected_releases = this.normalizeVersionString(processedArgs.affected_releases as string); } if (processedArgs.fixed_releases) { processedArgs.fixed_releases = this.normalizeVersionString(processedArgs.fixed_releases as string); } if (processedArgs.version) { processedArgs.version = this.normalizeVersionString(processedArgs.version as string); } // Build API parameters const apiParams = this.buildStandardParams(processedArgs); let endpoint: string; switch (name) { case 'get_bug_details': endpoint = `/bugs/bug_ids/${encodeURIComponent(processedArgs.bug_ids)}`; break; case 'search_bugs_by_keyword': endpoint = `/bugs/keyword/${encodeURIComponent(processedArgs.keyword)}`; break; case 'search_bugs_by_product_id': // Ensure forward slashes are properly encoded for product IDs like ISR4431-V/K9 const encodedBasePid = encodeURIComponent(processedArgs.base_pid).replace(/\//g, '%2F'); endpoint = `/bugs/products/product_id/${encodedBasePid}`; break; case 'search_bugs_by_product_and_release': // Ensure forward slashes are properly encoded for product IDs like ISR4431-V/K9 const encodedBasePidForRelease = encodeURIComponent(processedArgs.base_pid).replace(/\//g, '%2F'); endpoint = `/bugs/products/product_id/${encodedBasePidForRelease}/software_releases/${encodeURIComponent(processedArgs.software_releases)}`; break; case 'search_bugs_by_product_series_affected': endpoint = `/bugs/product_series/${encodeURIComponent(processedArgs.product_series)}/affected_releases/${encodeURIComponent(processedArgs.affected_releases)}`; break; case 'search_bugs_by_product_series_fixed': endpoint = `/bugs/product_series/${encodeURIComponent(processedArgs.product_series)}/fixed_in_releases/${encodeURIComponent(processedArgs.fixed_releases)}`; logger.info('Product series fixed endpoint', { product_series: processedArgs.product_series, fixed_releases: processedArgs.fixed_releases, endpoint, fullUrl: `${this.baseUrl}${endpoint}` }); break; case 'search_bugs_by_product_name_affected': endpoint = `/bugs/products/product_name/${encodeURIComponent(processedArgs.product_name)}/affected_releases/${encodeURIComponent(processedArgs.affected_releases)}`; break; case 'search_bugs_by_product_name_fixed': endpoint = `/bugs/products/product_name/${encodeURIComponent(processedArgs.product_name)}/fixed_in_releases/${encodeURIComponent(processedArgs.fixed_releases)}`; break; // Enhanced search tools case 'smart_search_strategy': return this.generateSearchStrategy(processedArgs); case 'progressive_bug_search': return this.executeProgressiveSearch(processedArgs, meta); case 'multi_severity_search': return this.executeMultiSeveritySearch(processedArgs, meta); case 'comprehensive_analysis': return this.executeComprehensiveAnalysis(processedArgs, meta); case 'compare_software_versions': return this.executeCompareSoftwareVersions(processedArgs, meta); case 'product_name_resolver': return this.executeProductNameResolver(processedArgs); default: throw new Error(`Tool implementation not found: ${name}`); } return await this.makeApiCall(endpoint, apiParams) as BugApiResponse; }
  • ApiRegistry initializes BugApi instance and registers it under 'bug' key, making its tools (including search_bugs_by_keyword) available
    private initializeApis(): void { // Initialize implemented APIs this.apis.set('bug', new BugApi()); this.apis.set('case', new CaseApi()); this.apis.set('eox', new EoxApi()); this.apis.set('psirt', new PsirtApi()); this.apis.set('product', new ProductApi()); this.apis.set('software', new SoftwareApi()); this.apis.set('serial', new SerialApi()); this.apis.set('rma', new RmaApi()); this.apis.set('enhanced_analysis', new EnhancedAnalysisApi()); this.apis.set('smart_bonding', new SmartBondingApi() as any); // Cast needed due to different base class }
  • MCP server registers listTools handler that returns all available tools from ApiRegistry, including search_bugs_by_keyword from BugApi
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: apiRegistry.getAvailableTools(), }; });
  • MCP server registers callTool handler that routes tool execution to ApiRegistry.executeTool, which dispatches to BugApi.executeTool for search_bugs_by_keyword
    server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; const meta = request.params._meta as { progressToken?: string } | undefined; try { logger.info('Tool call started', { name, args, hasProgressToken: !!meta?.progressToken }); const { result, apiName } = await apiRegistry.executeTool(name, args || {}, meta); logger.info('Tool call completed', { name, apiName, resultCount: ('bugs' in result && Array.isArray(result.bugs)) ? result.bugs.length : ('cases' in result && Array.isArray(result.cases)) ? result.cases.length : ('EOXRecord' in result && Array.isArray(result.EOXRecord)) ? result.EOXRecord.length : 0 }); const content: TextContent = { type: 'text', text: formatResults(result, apiName, name, args || {}) }; return { content: [content], isError: false, }; } catch (error) { logger.error('Tool call failed', { name, error: error instanceof Error ? error.message : error }); // Provide helpful error messages for common issues let errorMessage = error instanceof Error ? error.message : 'Unknown error'; if (errorMessage.includes('Unknown tool')) { errorMessage += '\n\nℹ️ Currently available tools:\n' + apiRegistry.getAvailableTools().map(t => `• ${t.name}: ${t.description}`).join('\n'); errorMessage += `\n\nℹ️ Enabled APIs: ${ENABLED_APIS.join(', ')}`; } if (errorMessage.includes('Tool implementation not found')) { errorMessage += '\n\nℹ️ This tool may require an API that is not yet implemented or enabled.'; errorMessage += `\nCurrently enabled APIs: ${ENABLED_APIS.join(', ')}`; errorMessage += `\nTo enable more APIs, set SUPPORT_API environment variable (e.g., SUPPORT_API=bug,case)`; } const errorContent: TextContent = { type: 'text', text: `Error: ${errorMessage}` }; return { content: [errorContent], isError: true, }; } });

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/sieteunoseis/mcp-cisco-support'

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