Skip to main content
Glama

generate_remediation

Provides actionable remediation guidance for security findings to address vulnerabilities and ensure compliance with industry standards.

Instructions

Generate actionable remediation advice for findings

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
findingIdsNoIDs of findings to generate remediation for

Implementation Reference

  • Tool registration including name, description, and input schema in the ListTools response.
    {
      name: 'generate_remediation',
      description: 'Generate actionable remediation advice for findings',
      inputSchema: {
        type: 'object',
        properties: {
          findingIds: {
            type: 'array',
            items: { type: 'string' },
            description: 'IDs of findings to generate remediation for'
          },
        },
        required: [],
      },
    },
  • The main handler function for the 'generate_remediation' tool, which delegates to RemediationAdvisor.
    private async handleGenerateRemediation(_args: any): Promise<any> {
      // Get recent scan results or specific findings
      // For demo, we'll generate advice for sample findings
      const sampleFindings = [
        {
          id: 'sample_001',
          type: 'dependency',
          severity: 'high' as const,
          title: 'Vulnerable dependency: lodash@4.17.19',
          description: 'Known security vulnerability CVE-2021-23337',
          location: { file: 'package.json' },
          cve: 'CVE-2021-23337',
        },
      ];
    
      const plan = await this.remediationAdvisor.generateRemediationPlan(sampleFindings);
      const markdown = this.remediationAdvisor.generateMarkdownReport(plan);
    
      return {
        status: 'success',
        remediations: plan.remediations.length,
        summary: plan.summary,
        report: markdown,
      };
    }
  • Core implementation of remediation plan generation, called by the tool handler.
    async generateRemediationPlan(findings: Finding[]): Promise<RemediationPlan> {
      const remediations: RemediationAdvice[] = [];
      
      for (const finding of findings) {
        const advice = await this.generateRemediationAdvice(finding);
        remediations.push(advice);
      }
    
      // Categorize by priority
      const prioritizedActions = {
        immediate: remediations.filter(r => r.priority === 'immediate'),
        high: remediations.filter(r => r.priority === 'high'),
        medium: remediations.filter(r => r.priority === 'medium'),
        low: remediations.filter(r => r.priority === 'low'),
      };
    
      // Calculate summary
      const autoFixable = remediations.filter(r => r.effort === 'trivial').length;
      const immediateActions = prioritizedActions.immediate.length;
      const totalEffort = this.calculateTotalEffort(remediations);
    
      return {
        findings,
        remediations,
        summary: {
          totalFindings: findings.length,
          autoFixable,
          immediateActions,
          estimatedEffort: totalEffort,
        },
        prioritizedActions,
      };
    }
  • Type definition for the RemediationPlan output structure.
    export interface RemediationPlan {
      findings: Finding[];
      remediations: RemediationAdvice[];
      summary: {
        totalFindings: number;
        autoFixable: number;
        immediateActions: number;
        estimatedEffort: string;
      };
      prioritizedActions: {
        immediate: RemediationAdvice[];
        high: RemediationAdvice[];
        medium: RemediationAdvice[];
        low: RemediationAdvice[];
      };
    }
  • Helper function that generates detailed remediation advice for individual findings.
    private async generateRemediationAdvice(finding: Finding): Promise<RemediationAdvice> {
      // Determine remediation type based on finding
      const remediationType = this.determineRemediationType(finding);
      const baseRemediation = this.remediationDatabase.get(remediationType);
    
      // Determine priority based on severity
      const priority = this.determinePriority(finding);
    
      // Build customized advice
      const advice: RemediationAdvice = {
        findingId: finding.id,
        priority,
        effort: baseRemediation?.effort || this.estimateEffort(finding),
        automaticFix: baseRemediation?.automaticFix,
        manualSteps: baseRemediation?.manualSteps,
        codeExample: baseRemediation?.codeExample,
        references: baseRemediation?.references || this.getDefaultReferences(finding.type),
        estimatedTime: baseRemediation?.estimatedTime || this.estimateTime(finding),
        tools: baseRemediation?.tools,
        preventionTips: this.generatePreventionTips(finding),
      };
    
      // Customize advice based on specific finding details
      if (finding.type === 'dependency' && finding.cve) {
        advice.automaticFix = `Update to version that patches ${finding.cve}`;
        advice.references = [
          `https://nvd.nist.gov/vuln/detail/${finding.cve}`,
          ...advice.references || [],
        ];
      }
    
      if (finding.type === 'secret') {
        advice.priority = 'immediate'; // Secrets are always immediate priority
        advice.manualSteps = [
          `Immediately rotate the exposed ${this.identifySecretType(finding.title)}`,
          ...advice.manualSteps || [],
        ];
      }
    
      return advice;
    }

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/NeoTecDigital/mcp_shamash'

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