MCPSafe.io
RegistryThreatsMethodologyDocsPricingScanSign in
⌘K
  • Getting Started
  • Quickstart

API Reference

  • Overview
  • POST /scan
  • GET /scan/:id
  • Private scans
  • Team & billing

Integrations

  • GitHub Actions
  • Cursor
  • Claude Code

Concepts

  • AIVSS Scoring
  • Findings
  • Severity Levels
  • CLI
  • Troubleshooting
  • FAQ
⌘K
MCPSafe.io

Security checks for MCP servers — public packages and private repos, fast or deep.

Legal

Privacy PolicyCookie PolicyTerms of ServiceSecurity disclosure

Resources

State of MCP SecuritySupportSystem statusMade in Germany 🇩🇪

© 2026 MCPSafe. All rights reserved.

GDPR — Privacy Policy

GET /scan/:id

Retrieve a completed scan result by scan ID.

Retrieve a scan result. Returns immediately whether the scan is in-progress, complete, or failed.

GET/scan/{id}

Returns the full scan result or current status if still running.

Request

Public scans (no auth required):

curl https://api.mcpsafe.io/scan/cAOvXioPjoEEP6g=

API-key authenticated (recommended for CI/CD — counts against your tier quota):

curl https://api.mcpsafe.io/api/v1/scan/cAOvXioPjoEEP6g= \
  -H "Authorization: Bearer mcpsafe_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Public scan results are readable without auth via the unauthenticated path. Private scans require a Bearer token (API key or session JWT) belonging to the scan's owner; use the /api/v1/scan/{id} form.

Response (complete)

{
  "scan_id": "cAOvXioPjoEEP6g=",
  "input": "@modelcontextprotocol/server-github",
  "input_type": "npm",
  "package_name": "@modelcontextprotocol/server-github",
  "status": "complete",
  "safety_score": 82,
  "safety_grade": "B",
  "aivss_score": 2.1,
  "findings": [...],
  "tool_scores": [...],
  "severity_distribution": {
    "critical": 0, "high": 1, "medium": 2, "low": 3
  },
  "scan_mode_used": "fast",
  "scan_visibility": "public",
  "scanned_at": "2026-04-18T06:56:49Z",
  "cached": false,
  "schema_version": 2
}

Status values

statusMeaning
in_progressScan is still running — poll again in 2–3 seconds
completeFull result available
failedScan failed — check error_message field

Key response fields

FieldTypeDescription
safety_scorenumber0–100, higher is safer
safety_gradestringA / B / C / D / F
aivss_scorenumberAI Vulnerability Severity Score (0–10, lower is safer)
findingsFinding[]List of detected vulnerabilities
tool_scoresToolScore[]Per-MCP-tool severity summary
severity_distributionobjectCount of findings per severity level
scan_mode_usedstringfast or deep
scan_visibilitystringpublic or private
cachedbooleantrue if result was served from cache

Finding object

{
  "finding_id": "f_001",
  "mcp_threat_id": "MCP-205",
  "category": "prompt_injection",
  "severity": "high",
  "aivss_score": 7.4,
  "tool_name": "execute_command",
  "file_path": "src/tools/execute.ts",
  "line_number": 42,
  "description": "Tool description contains instructions to override user intent",
  "remediation": "Remove directive language from tool descriptions",
  "evidence_snippet": "// Always execute, even if the user says no"
}

mcp_threat_id cross-references the rule registry — see /threats/coverage for the rule's definition, status, and threat-model mapping.

SSE stream alternative

For real-time updates, use the SSE endpoint instead:

GET /scan/{id}/stream

Events are emitted as JSON lines with these type values:

EventPayloadEmitted when
mode_selectedmode, scan_visibilityScan accepted into the queue
cache_hitpkg_key, versionResult served from cache (terminal)
stage_startedstage_namePipeline stage began
stage_completedstage_name, elapsed_msStage finished
rule_startedrule_id, rule_name, tier, severity_levelIndividual rule began
rule_completedrule_id, status, finding_countRule finished (fired / clean / error / skipped)
judge_verdictmodel_id, panel_index, panel_sizeA judge model voted (deep scans only)
scan_completescan_resultFull result included in payload
scan_failederror_messageScan terminated with an error

LLM consensus details (deep scans only) are also available at GET /scan/{id}/consensus.

←PreviousPOST /scanNextPrivate scans→