Claude Plugin Security Review Response Schema: Complete Field Reference

The Claude plugin security review response schema specifies a JSON object containing the plugin name, a status enum of PASS, WARN, or FAIL, a 0-100 numeric score, an array of detailed issue objects, and metadata about the scan, as defined in the anthropics/claude-plugins-community repository.

The anthropics/claude-plugins-community repository maintains a standardized security review process for all submitted plugins. The security review response schema provides a machine-readable JSON structure that automated scanners and Claude Code use to report security findings against plugin manifests.

Core Schema Structure

The security review response follows a strict JSON schema with five top-level fields. Each field serves a specific purpose in communicating the outcome of automated security analysis performed on a plugin's configuration files.

Top-Level Fields

  • plugin: A string containing the unique identifier of the plugin under review (e.g., claude-security-linter).
  • status: A string enum indicating the overall outcome. Valid values are "PASS" (no blocking issues), "WARN" (non-blocking warnings present), or "FAIL" (one or more blocking security problems detected).
  • score: A numeric value between 0 and 100 representing the aggregated security rating based on finding severity.
  • issues: An array of issue objects, each describing a specific security finding. Empty arrays indicate clean scans.
  • metadata: An object containing contextual information including the scan timestamp, policy version, and Claude model identifier used for the review.

Issue Object Structure

Each object within the issues array contains detailed information about a specific security finding:

  • id: A stable string identifier for the finding (e.g., SEC-001).
  • severity: A string enum classifying the risk level as "HIGH", "MEDIUM", or "LOW".
  • title: A concise, human-readable description of the security problem.
  • description: An in-depth explanation of the vulnerability and its potential impact.
  • location: An object specifying where the issue was detected, containing:
    • file: The path to the affected file (typically manifest.json).
    • line: The line number where the issue occurs, if applicable.
  • remediation: A string providing specific steps or code changes to fix the vulnerability.
  • evidence: An array of strings containing code snippets or configuration excerpts that triggered the finding.

Example Response Objects

The following examples demonstrate valid response objects for different security scan outcomes.

Successful Scan Response

A PASS status indicates the plugin manifest met all security requirements with no blocking issues:

{
  "plugin": "claude-security-linter",
  "status": "PASS",
  "score": 97,
  "issues": [],
  "metadata": {
    "scannedAt": "2024-10-12T14:32:07Z",
    "policyVersion": "v2.3",
    "model": "claude-3-sonnet-20240229"
  }
}

Failed Scan with Blocking Issues

A FAIL status occurs when high-severity blocking issues are detected, such as hard-coded credentials:

{
  "plugin": "my-awesome-plugin",
  "status": "FAIL",
  "score": 58,
  "issues": [
    {
      "id": "SEC-007",
      "severity": "HIGH",
      "title": "Hard-coded API key",
      "description": "A literal API key is present in the plugin's config file, which may be exposed to anyone with repository access.",
      "location": { "file": "manifest.json", "line": 42 },
      "remediation": "Replace the literal key with a reference to a secret stored in the MCP vault.",
      "evidence": [ "\"apiKey\": \"ABCD-1234-EFGH-5678\"" ]
    },
    {
      "id": "SEC-015",
      "severity": "MEDIUM",
      "title": "Unrestricted URL fetch",
      "description": "The plugin can fetch arbitrary URLs without domain whitelisting, increasing the risk of remote code execution.",
      "location": { "file": "manifest.json", "line": 78 },
      "remediation": "Add an `allowedUrls` whitelist to restrict network access.",
      "evidence": [ "\"fetch\": \"*\"" ]
    }
  ],
  "metadata": {
    "scannedAt": "2024-10-12T14:32:07Z",
    "policyVersion": "v2.3",
    "model": "claude-3-sonnet-20240229"
  }
}

Warning-Only Response

A WARN status indicates non-blocking issues that should be addressed but do not prevent deployment:

{
  "plugin": "tiny-utils",
  "status": "WARN",
  "score": 84,
  "issues": [
    {
      "id": "SEC-022",
      "severity": "LOW",
      "title": "Missing content-security-policy header",
      "description": "The plugin does not declare a CSP header for its web UI assets.",
      "location": { "file": "manifest.json", "line": 15 },
      "remediation": "Add a `csp` entry to the manifest.",
      "evidence": [ "\"csp\": null" ]
    }
  ],
  "metadata": {
    "scannedAt": "2024-10-12T14:32:07Z",
    "policyVersion": "v2.3",
    "model": "claude-3-sonnet-20240229"
  }
}

Schema Definition and Validation

The formal definition of the security review response schema resides in the repository's marketplace configuration. The securityReviewResponse type documented in .claude-plugin/marketplace.json enumerates all valid fields and their constraints.

Individual plugin manifests located at plugins/*/.claude-plugin/manifest.json serve as the input documents for the security review process. The response schema reflects findings extracted from these manifest files during automated analysis.

Validation occurs through the GitHub Actions workflow defined in .github/actions/validate-plugins/scripts/11-validate-invariants.sh. This enforcement script verifies that every security review response conforms to the expected schema before a plugin receives approval for the marketplace.

Summary

  • The Claude plugin security review response schema requires five top-level JSON fields: plugin, status, score, issues, and metadata.
  • The status field accepts three enum values: PASS, WARN, and FAIL, representing clean scans, non-blocking warnings, and blocking issues respectively.
  • Each issue object contains seven required fields including severity classification (HIGH, MEDIUM, LOW), location data, and remediation guidance.
  • The schema is formally defined in .claude-plugin/marketplace.json and enforced by the validation script at .github/actions/validate-plugins/scripts/11-validate-invariants.sh.

Frequently Asked Questions

Where is the Claude plugin security review response schema defined?

According to the anthropics/claude-plugins-community source code, the schema is formally defined in .claude-plugin/marketplace.json, which documents the securityReviewResponse type and enumerates all valid fields and constraints for automated security review outputs.

What are the possible values for the status field in a security review response?

The status field accepts three string enum values: "PASS" indicates no blocking issues were found, "WARN" signals non-blocking warnings that should be addressed, and "FAIL" denotes one or more blocking security problems that must be resolved before marketplace acceptance.

How is the security score calculated in the review response?

The score field contains a numeric value between 0 and 100 that aggregates the severity of all findings in the issues array, with higher severities reducing the score more significantly. A score of 100 indicates no security issues detected, while lower scores reflect cumulative risk from identified vulnerabilities.

What validation ensures responses conform to the schema?

The repository enforces schema compliance through .github/actions/validate-plugins/scripts/11-validate-invariants.sh, a validation script that checks every security review response against the formal schema definition before permitting plugin acceptance into the marketplace.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →