API & MCP

Read-only, no auth, CORS enabled (*), soft-limited to 120 requests / minute / client. Responses are cached 60s. Disclosure endpoints return factual metadata + a short excerpt and a link to the canonical source — never the full researcher-authored body.

REST endpoints

MethodPathPurpose
GET/api/reportsSearch disclosures (filters + sort + paging)
GET/api/reports/{id}One record by id
GET/api/knowledgeFull-text search of the knowledge base
GET/api/knowledge/{id}One passage by id
GET/api/knowledge/sourcesEvery document (source, category, passage count) — powers /kb
GET/api/statsAggregate stats + facets
GET/api/tagsVulnerability-class taxonomy (reports + knowledge counts)
GET/POST/api/mcpModel Context Protocol (Streamable HTTP)

GET /api/reports

Query parameters:

ParamTypeNotes
qstringFull-text (title, program, weakness, reporter, excerpt). Prefix match on last term.
platformstringHackerOne · Bugcrowd · Code4rena · Immunefi · Intigriti · YesWeHack
severitystringCritical · High · Medium · Low · None · Informational
classstringWeakness / vulnerability class
program, researcher, kindstringExact (case-insensitive)
tagstringVulnerability-class slug (ssrf, xss, idor, rce, auth, …) — see /api/tags
kevbool1 = only reports referencing a CVE in CISA’s Known Exploited Vulnerabilities catalogue
yearintDisclosure year
sortstringrelevance (default with q) · date · bounty · votes · cvss · epss (most likely exploited) · alpha
limitint1–120, default 25
offsetintPagination; response carries next_offset

Example:

curl "https://YOUR-DOMAIN/api/reports?q=ssrf+aws+metadata&severity=High&sort=bounty&limit=5"

Response shape:

{
  "query": { "q": "ssrf aws metadata", "severity": "High", ... },
  "total": 42,
  "count": 5,
  "limit": 5,
  "offset": 0,
  "next_offset": 5,
  "results": [
    {
      "id": "h1-1087489",
      "platform": "HackerOne",
      "title": "…",
      "program": "…",
      "severity": "High",
      "cvss": 8.6,
  "kev": true,
  "epss": 0.94021,
  "epssPct": 0.99,
  "cwe": ["CWE-918"],
  "nvdCvss": 9.1,
  "analysis": {
    "classes": [{ "slug": "ssrf", "label": "Server-Side Request Forgery (SSRF)" }],
    "mechanism": "The server fetches a URL built from unvalidated user input, letting an attacker reach internal services or cloud metadata endpoints.",
    "cwe": ["CWE-918"],
    "owasp": ["OWASP API Security Top 10 API7:2023 SSRF"]
  },
      "weakness": "Server-Side Request Forgery (SSRF)",
      "bounty": 4000,
      "votes": 57,
      "reporter": "…",
      "cves": ["CVE-2023-…"],
      "disclosed_at": "2023-05-01",
      "source_url": "https://hackerone.com/reports/1087489",
      "snippet": "…short excerpt…",
      "license": "Public disclosure — metadata & excerpt only",
      "attribution": "…"
    }
  ]
}

Every record carries analysis — a rule-based technical summary (vulnerability class, mechanism sentence, CWE, OWASP reference) derived only from the weakness/title/excerpt already shown, never the full report. /api/reports/{id} additionally embeds cveDetails: per-CVE intel merged from NVD (CWE, CVSS vector, description, references) and CISA KEV (exploited status, due date, vendor/product, known ransomware use).

GET /api/knowledge

Full-text search of permissively-licensed material (OWASP WSTG / Cheat Sheets / API Security, PayloadsAllTheThings, HowToHunt, CISA KEV). Full passages are returned with id (for /api/knowledge/{id} and the web UI’s /knowledge/{id} page), license and attribution.

curl "https://YOUR-DOMAIN/api/knowledge?q=jwt+none+algorithm&k=5"
curl "https://YOUR-DOMAIN/api/knowledge/42"          # one passage
curl "https://YOUR-DOMAIN/api/knowledge/sources"     # every document, for browsing

Vulnerability-class tags

Every report is auto-tagged with a shared vulnerability-class taxonomy (~33 classes: ssrf, xss, idor, rce, auth, jwt, …) derived from its weakness, title and excerpt. The same tags annotate the knowledge base, so a class links disclosures to the methodology that explains them.

curl "https://YOUR-DOMAIN/api/tags"                       # taxonomy + counts
curl "https://YOUR-DOMAIN/api/reports?tag=ssrf&sort=bounty"  # reports of a class

MCP server (public)

The archive is exposed as a Model Context Protocol server over Streamable HTTP, so any MCP-capable client (Claude, Cursor, Claude Code, VS Code) can query it as a tool. Endpoint:

https://YOUR-DOMAIN/api/mcp

Tools:

ToolArgsReturns
search_disclosuresq, platform?, severity?, program?, year?, tag?, sort?, limit?disclosure metadata + excerpt + source_url
get_reportidone record (incl. tags)
search_knowledgeq, k?knowledge passages + attribution
list_tagstaxonomy with reports/knowledge counts
knowledge_for_tagtag, k?methodology/payloads for a vuln class
archive_statsaggregate stats

Add to a client config (e.g. Claude Code / Cursor mcp.json):

{
  "mcpServers": {
    "security-archive": {
      "type": "http",
      "url": "https://YOUR-DOMAIN/api/mcp"
    }
  }
}

Or from the CLI: claude mcp add --transport http security-archive https://YOUR-DOMAIN/api/mcp

Attribution & licensing

Code is MIT. Knowledge passages keep their upstream license (share-alike for OWASP CC BY-SA). Disclosure records are factual metadata + short excerpts linking to the canonical source. Respect each platform's and researcher's rights when reusing.