Skip to main content
Glama
sieteunoseis

mcp-cisco-support

Comprehensive Bug and Lifecycle Analysis

comprehensive_analysis

Analyze Cisco products by searching bug databases and lifecycle information to identify known issues, EoL status, and provide actionable recommendations for troubleshooting and planning.

Instructions

BEST FOR DETAILED ANALYSIS: Combines bug database search with web search guidance for EoL information. Provides complete product analysis including known issues, lifecycle status, and actionable recommendations. Ideal for failover issues, configuration problems, and product reliability concerns.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
product_identifierYesProduct name, model, or ID to analyze (e.g., ISR4431/K9, Cisco ASR 1000)
software_versionNoSoftware version to analyze (e.g., 17.09.06, 15.1(4)M)
analysis_focusNoFocus of the analysiscomprehensive
include_web_search_guidanceNoInclude web search queries and strategies for additional research

Implementation Reference

  • Primary handler function that executes the comprehensive_analysis tool. Orchestrates multiple internal tool calls (progressive_bug_search, multi_severity_search, product series searches), performs product name resolution, generates web search guidance for lifecycle info, and compiles recommendations based on findings.
    private async executeComprehensiveAnalysis(args: ToolArgs, meta?: { progressToken?: string }): Promise<BugApiResponse> {
      const productIdentifier = args.product_identifier as string;
      const softwareVersion = args.software_version as string;
      const analysisFocus = (args.analysis_focus as string) || 'comprehensive';
      const includeWebSearchGuidance = (args.include_web_search_guidance as boolean) !== false;
    
      logger.info('Starting comprehensive analysis', { productIdentifier, softwareVersion, analysisFocus });
      
      // Convert full product names to searchable terms for bug database
      let searchableProductTerm = productIdentifier;
      let productSeries = null;
      
      // Check if we can get the product series for this identifier
      productSeries = WebSearchHelper.getProductSeries(productIdentifier);
      
      if (productIdentifier.toLowerCase().includes('cisco') && productIdentifier.length > 20) {
        // This looks like a full product name, try to extract the series
        if (productIdentifier.toLowerCase().includes('4000 series') || productIdentifier.toLowerCase().includes('4431') || productIdentifier.toLowerCase().includes('4451')) {
          productSeries = 'Cisco 4000 Series Integrated Services Routers';
          searchableProductTerm = 'ISR4431';
        } else if (productIdentifier.toLowerCase().includes('catalyst 9200') || productIdentifier.toLowerCase().includes('9200 series')) {
          productSeries = 'Cisco Catalyst 9200 Series';
          searchableProductTerm = 'C9200';
        } else if (productIdentifier.toLowerCase().includes('asr 1000') || productIdentifier.toLowerCase().includes('1000 series')) {
          productSeries = 'Cisco ASR 1000 Series';
          searchableProductTerm = 'ASR1000';
        } else {
          // Extract model numbers or use keyword search approach
          const modelMatch = productIdentifier.match(/(\w+\d+)/);
          if (modelMatch) {
            searchableProductTerm = modelMatch[1];
          }
        }
        logger.info('Processed product identifier', { 
          original: productIdentifier, 
          searchable: searchableProductTerm,
          productSeries: productSeries 
        });
      }
      
      const analysis = {
        product: productIdentifier,
        searchable_product_term: searchableProductTerm,
        version: softwareVersion,
        focus: analysisFocus,
        bug_analysis: null as any,
        product_resolution: null as any,
        web_search_guidance: null as any,
        recommendations: [] as string[],
        search_strategy_used: [] as string[]
      };
      
      // Step 1: Product name resolution
      const { sendProgress } = await import('../mcp-server.js');
      const totalSteps = 5;
      sendProgress(meta?.progressToken, 0, totalSteps);
    
      try {
        analysis.product_resolution = await WebSearchHelper.resolveProductName(productIdentifier);
        analysis.search_strategy_used.push('Product ID resolution via known mappings and patterns');
      } catch (error) {
        logger.error('Product resolution failed', { error });
      }
    
      // Step 2: Bug database analysis
      sendProgress(meta?.progressToken, 1, totalSteps);
    
      try {
        let searchQuery = searchableProductTerm;
        if (softwareVersion) {
          searchQuery += ` ${softwareVersion}`;
        }
    
        analysis.search_strategy_used.push('Progressive bug search with version normalization and product name conversion');
        analysis.bug_analysis = await this.executeProgressiveSearch({
          primary_search_term: searchableProductTerm,
          version: softwareVersion,
          severity_range: analysisFocus === 'security' ? 'high' : 'medium'
        });
        
        // Add product series search if we have that information and a software version
        sendProgress(meta?.progressToken, 2, totalSteps);
    
        if (productSeries && softwareVersion) {
          analysis.search_strategy_used.push('Product series search with full product name and Cisco API version format');
          try {
            // Convert version to Cisco API format (17.09.06 -> 17.9.6)
            const ciscoFormattedVersion = WebSearchHelper.formatVersionForCiscoAPI(softwareVersion);
            const productSeriesResult = await this.executeTool('search_bugs_by_product_series_affected', {
              product_series: productSeries,
              affected_releases: ciscoFormattedVersion
            });
            
            if (productSeriesResult.bugs && analysis.bug_analysis.bugs) {
              const combinedBugs = [...analysis.bug_analysis.bugs, ...productSeriesResult.bugs];
              const uniqueBugs = combinedBugs.filter((bug, index, self) => 
                index === self.findIndex(b => b.bug_id === bug.bug_id)
              );
              analysis.bug_analysis.bugs = uniqueBugs;
              analysis.bug_analysis.total_results = uniqueBugs.length;
              logger.info('Combined product series search results', { 
                addedBugs: productSeriesResult.bugs.length,
                totalUnique: uniqueBugs.length 
              });
            }
          } catch (error) {
            logger.warn('Product series search failed', { productSeries, softwareVersion, error });
          }
        }
    
        // Add multi-severity search for critical analysis
        sendProgress(meta?.progressToken, 3, totalSteps);
    
        if (analysisFocus === 'security' || analysisFocus === 'comprehensive') {
          analysis.search_strategy_used.push('Multi-severity search for complete coverage');
          const multiSevResult = await this.executeMultiSeveritySearch({
            search_term: searchQuery,
            search_type: 'keyword',
            max_severity: 3
          });
          
          // Combine results
          if (multiSevResult.bugs && analysis.bug_analysis.bugs) {
            const combinedBugs = [...analysis.bug_analysis.bugs, ...multiSevResult.bugs];
            const uniqueBugs = combinedBugs.filter((bug, index, self) => 
              index === self.findIndex(b => b.bug_id === bug.bug_id)
            );
            analysis.bug_analysis.bugs = uniqueBugs;
            analysis.bug_analysis.total_results = uniqueBugs.length;
          }
        }
      } catch (error) {
        logger.error('Bug analysis failed in comprehensive analysis', { error });
        analysis.bug_analysis = { error: error instanceof Error ? error.message : 'Unknown error' };
      }
    
      // Step 3: Generate web search guidance
      sendProgress(meta?.progressToken, 4, totalSteps);
    
      if (includeWebSearchGuidance) {
        try {
          analysis.web_search_guidance = {
            lifecycle_queries: WebSearchHelper.generateLifecycleSearchQueries(productIdentifier, softwareVersion),
            product_info: analysis.product_resolution,
            recommended_searches: []
          };
    
          // Add context-specific web search guidance
          if (analysisFocus === 'incident_response') {
            const incidentStrategy = WebSearchHelper.generateIncidentSearchStrategy(
              productIdentifier, 
              softwareVersion
            );
            analysis.web_search_guidance.incident_strategy = incidentStrategy;
          }
    
          // Add general research recommendations
          analysis.web_search_guidance.recommended_searches = [
            `"${productIdentifier}" release notes site:cisco.com`,
            `"${productIdentifier}" field notices site:cisco.com`,
            `"${productIdentifier}" security advisories site:cisco.com`
          ];
    
          if (softwareVersion) {
            analysis.web_search_guidance.recommended_searches.push(
              `"${softwareVersion}" bugs fixes site:cisco.com`,
              `"${softwareVersion}" known issues site:cisco.com`
            );
          }
    
          analysis.search_strategy_used.push('Web search guidance generation for external research');
        } catch (error) {
          logger.error('Web search guidance generation failed', { error });
        }
      }
      
      // Step 4: Generate recommendations based on findings
      if (analysis.bug_analysis && analysis.bug_analysis.bugs) {
        const bugCount = analysis.bug_analysis.bugs.length;
        const openBugs = analysis.bug_analysis.bugs.filter((b: any) => b.status === 'O').length;
        const criticalBugs = analysis.bug_analysis.bugs.filter((b: any) => ['1', '2'].includes(b.severity)).length;
        
        if (criticalBugs > 0) {
          analysis.recommendations.push(`⚠️ Found ${criticalBugs} critical/high severity bugs - review immediately`);
        }
        
        if (openBugs > 0) {
          analysis.recommendations.push(`📋 ${openBugs} open bugs found - check for workarounds and fixes`);
        }
        
        if (bugCount === 0) {
          analysis.recommendations.push('✅ No bugs found with current search criteria - consider broader search');
        }
        
        // Product resolution recommendations
        if (analysis.product_resolution?.fullName) {
          analysis.recommendations.push(`🔗 Product resolved: ${analysis.product_resolution.fullName}`);
          if (analysis.product_resolution.modelUrl) {
            analysis.recommendations.push(`📖 Official documentation: ${analysis.product_resolution.modelUrl}`);
          }
        }
        
        // Web search recommendations
        if (includeWebSearchGuidance && analysis.web_search_guidance) {
          analysis.recommendations.push('🌐 Use provided web search queries for additional research');
          analysis.recommendations.push('🔍 Check Cisco.com for latest field notices and security advisories');
        }
        
        // Version-specific recommendations
        if (softwareVersion) {
          analysis.recommendations.push('📅 Verify end-of-life status using provided lifecycle search queries');
          analysis.recommendations.push('⬆️ Review newer software versions for bug fixes and security updates');
        }
      }
      
      // Return the analysis as a bug response with metadata
      return {
        bugs: analysis.bug_analysis?.bugs || [],
        total_results: analysis.bug_analysis?.bugs?.length || 0,
        page_index: 1,
        comprehensive_analysis: analysis
      };
    }
  • Input schema and metadata definition for the comprehensive_analysis tool within BugApi.getTools().
    {
      name: 'comprehensive_analysis',
      title: 'Comprehensive Bug and Lifecycle Analysis',
      description: 'BEST FOR DETAILED ANALYSIS: Combines bug database search with web search guidance for EoL information. Provides complete product analysis including known issues, lifecycle status, and actionable recommendations. Ideal for failover issues, configuration problems, and product reliability concerns.',
      inputSchema: {
        type: 'object',
        properties: {
          product_identifier: {
            type: 'string',
            description: 'Product name, model, or ID to analyze (e.g., ISR4431/K9, Cisco ASR 1000)'
          },
          software_version: {
            type: 'string',
            description: 'Software version to analyze (e.g., 17.09.06, 15.1(4)M)'
          },
          analysis_focus: {
            type: 'string',
            description: 'Focus of the analysis',
            enum: ['security', 'stability', 'lifecycle', 'upgrade_planning', 'incident_response', 'comprehensive'],
            default: 'comprehensive'
          },
          include_web_search_guidance: {
            type: 'boolean',
            description: 'Include web search queries and strategies for additional research',
            default: true
          }
        },
        required: ['product_identifier']
      }
  • EnhancedAnalysisApi explicitly registers comprehensive_analysis as one of its exposed tools by filtering from parent BugApi tools.
    const enhancedAnalysisToolNames = [
      'smart_search_strategy',
      'progressive_bug_search', 
      'multi_severity_search',
      'comprehensive_analysis',
      'compare_software_versions',
      'product_name_resolver'
    ];
    
    return allBugTools.filter(tool => enhancedAnalysisToolNames.includes(tool.name));
  • ApiRegistry instantiates EnhancedAnalysisApi, which exposes the comprehensive_analysis tool to the MCP server.
    this.apis.set('enhanced_analysis', new EnhancedAnalysisApi());
    this.apis.set('smart_bonding', new SmartBondingApi() as any); // Cast needed due to different base class
  • Dispatch in BugApi.executeTool that routes comprehensive_analysis calls to the main handler method.
    case 'comprehensive_analysis':
      return this.executeComprehensiveAnalysis(processedArgs, meta);
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses the tool's behavioral approach ('combines bug database search with web search guidance') and output scope ('complete product analysis including known issues, lifecycle status, and actionable recommendations'). However, it doesn't mention performance characteristics, rate limits, authentication requirements, or what constitutes 'complete' analysis.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with front-loaded value proposition ('BEST FOR DETAILED ANALYSIS') followed by functional description and usage guidance. All three sentences earn their place by providing distinct information about capabilities, output, and ideal use cases. Could be slightly more concise by combining some elements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with no annotations and no output schema, the description provides good functional context but lacks details about output format, error conditions, or behavioral constraints. It adequately covers what the tool does and when to use it, but doesn't fully compensate for the missing structured information about how it behaves and what it returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description doesn't add specific parameter semantics beyond what's in the schema. It mentions 'product analysis' which aligns with product_identifier, and 'lifecycle status' which relates to analysis_focus options, but doesn't provide additional context about parameter usage or interactions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('combines bug database search with web search guidance') and resources ('EoL information, product analysis'). It distinguishes from siblings by emphasizing comprehensive analysis combining multiple data sources, unlike single-function tools like get_bug_details or search_bugs_by_keyword.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('Ideal for failover issues, configuration problems, and product reliability concerns') and distinguishes from alternatives by positioning as 'BEST FOR DETAILED ANALYSIS' that combines multiple approaches. The description provides clear context for when this comprehensive tool is preferred over more focused sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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