hackerone-mcp
Provides read-only tools to interact with a HackerOne researcher account, including listing programs, scopes, reports, earnings, searching disclosed reports, and drafting bug reports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hackerone-mcp List my top 3 programs by total bounty"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hackerone-mcp
A local, read-only MCP server that connects your HackerOne researcher account to Claude Desktop and Claude Code. It helps you find the best targets, analyze program scopes, review your reports/earnings, and draft bug reports (which you submit yourself — the server never writes to your account).
How it works
Claude Desktop or Claude Code spawns this server as a local subprocess and talks to it over stdio using the Model Context Protocol. Every tool is read-only. The server reaches HackerOne over two separate paths: your private account data through the authenticated official API, and public disclosed-report data through an unauthenticated public endpoint (so your account is never involved in those requests).
┌──────────────────┐ ┌──────────────────┐
│ Claude Desktop │ │ Claude Code │
└────────┬─────────┘ └────────┬─────────┘
└───────────┬───────────────┘
│ MCP over stdio
│ (launches: python -m hackerone_mcp)
▼
┌───────────────────────────────────────────────────────────────────── ┐
│ hackerone-mcp (local server) │
│ │
│ server.py ── FastMCP tools │
│ │ programs · scopes · count/filter · rank · weaknesses │
│ │ my_reports · earnings · draft_report · raw_get │
│ │ search_disclosed_reports · list_cwe_types · directory │
│ │ │
│ ├── config.py ◄──────── .env (H1_ENV_FILE: H1_USERNAME / TOKEN) │
│ │ │
│ └── tools.py ── orchestrates each request │
│ │ │
│ ├── cache.py ......... disk cache (1h TTL) — hit? return │
│ │ │
│ ├── analysis.py ...... rank / filter / summarize ┐ │
│ ├── hacktivity.py .... build query / project │ pure │
│ │ (no I/O) ┘ funcs │
│ │ │
│ ├── client.py ........ httpx + HTTP Basic auth ─────────┐ │
│ │ (GET only, 429 retry) │ │
│ └── graphql_client.py httpx POST, NO auth ──────────┐ │ │
│ (read queries only) │ │ │
└────────────────────────────────────────────────────────────-----│--│--┘
│ │
authenticated, read-only GET (HTTPS) ────────┼──┘
your account data │
▼
┌──────────────────────────────┐
│ api.hackerone.com/v1 │
│ /hackers/programs … │
└──────────────────────────────┘
unauthenticated, read-only POST (HTTPS)
public disclosed reports │
▼
┌──────────────────────────────┐
│ hackerone.com/graphql │
│ (public hacktivity) │
└──────────────────────────────┘Two flows, one pattern: Claude calls a tool → tools.py checks cache.py →
on a miss it hits the right backend → a pure function (analysis.py /
hacktivity.py) shapes the result → it goes back up to Claude.
Account path (your programs, scopes, reports, earnings):
client.pymakes an authenticated read-only GET toapi.hackerone.com/v1. Your token never leaves your machine except as the Basic-auth header.Public path (disclosed-report / CWE / directory search):
graphql_client.pymakes an unauthenticated read-only POST tohackerone.com/graphql— no token or cookie is ever attached, so these requests carry no account risk.
Related MCP server: HackerOne MCP Server
Requirements
Python 3.10+ (tested on 3.13)
A HackerOne API token: hackerone.com → Settings → API Token. Use the narrowest read scope available.
Install
git clone <this repo> hackerone-mcp
cd hackerone-mcp
python -m pip install -e .Configure credentials
Set two environment variables (these go in your MCP client config below):
H1_USERNAME— your HackerOne usernameH1_API_TOKEN— the API token you generated
Optional: H1_CACHE_DIR, H1_CACHE_TTL (seconds, default 3600).
Verify your token works:
H1_USERNAME=you H1_API_TOKEN=xxxx python -m hackerone_mcp --check-authOn Windows PowerShell:
$env:H1_USERNAME="you"; $env:H1_API_TOKEN="xxxx"; python -m hackerone_mcp --check-authExpected: OK: authenticated as you. N program(s) accessible.
Connect to Claude Desktop
Edit claude_desktop_config.json
(Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"hackerone": {
"command": "python",
"args": ["-m", "hackerone_mcp"],
"env": {
"H1_USERNAME": "your_username",
"H1_API_TOKEN": "your_api_token"
}
}
}
}Restart Claude Desktop.
Connect to Claude Code
claude mcp add hackerone --env H1_USERNAME=your_username --env H1_API_TOKEN=your_api_token -- python -m hackerone_mcpOr add an .mcp.json entry with the same command/args/env.
Tools
list_programs— programs your account can access (compact=truefor a small handle/name/bounty/state listing; the full list is several MB)count_programs— totals only: program count, bounty programs, VDPs, and a submission-state breakdown (use this for "how many ..." questions)get_program— full policy/details for a handleget_program_scopes— structured scopes, summarized in/out of scopeget_program_weaknesses— the CWE/weakness types a program tracksfilter_programs— compact list filtered by offers_bounties / submission_state / bookmarked (e.g. all VDPs)list_my_reports— your own submitted reports (compact; useget_reportfor full detail)search_scopes— search assets across your programs (limitfor a quick scan)rank_programs— rank programs for hunting (bounties, scope, severity;limitfor a quick scan)get_balance,list_earnings— your paymentsget_report— read a report by iddraft_report— format a report in markdown (you submit it yourself)raw_get— authenticated read-only GET against any v1 API pathsearch_disclosed_reports— search PUBLIC disclosed reports by keyword / severity / CWE / CVE / program;sort("relevance"/"recent", default relevance for keyword searches) andsince/until(YYYY-MM-DD) date boundslist_cwe_types— valid CWE names for thecwefiltersearch_directory— search the public program directory by name
Note:
search_scopesandrank_programsscan every program you can access (one API call per program on a cold cache — potentially hundreds). Results are cached for an hour, so the first call is slow and later calls are fast. Passlimit(e.g. 50) for a quick partial scan, orrefresh=trueto bypass the cache.
Security
Your API token is stored in plaintext in the client config file. Protect that file (restrict permissions), use a narrow-scope token, and revoke/rotate it from HackerOne if it is ever exposed. This server makes only read-only requests (authenticated GETs to the official API, plus unauthenticated read-only GraphQL POSTs to the public hacktivity endpoint) — it cannot submit, edit, or delete anything on your account.
Public hacktivity search (Part 2)
search_disclosed_reports, list_cwe_types, and search_directory read
HackerOne's public disclosed-report data through its undocumented GraphQL
endpoint, unauthenticated — no token or cookie is sent, so these calls carry
no risk to your account. They are read-only (the server never sends mutations).
Because the endpoint is undocumented, the baked-in queries can break if HackerOne
changes its schema. The exact queries were captured on 2026-06-28 and saved to
docs/superpowers/reference/hackerone-graphql-captures-2026-06-28.json; re-capture
from a browser and update graphql_client.py if a hacktivity tool stops working.
Development
python -m pip install -e ".[dev]"
python -m pytest -vAvailable Tools
17 toolscount_programsA
Count programs without listing them: total, bounty programs, VDPs (offers_bounties=false), and a breakdown by submission_state. One cheap API call, tiny response — use this for 'how many ...' questions.
Inputs: refresh.
draft_reportC
Format a HackerOne-style report in markdown for you to submit yourself.
Inputs: asset (required), steps (required), title (required), impact (required), +2 more.
filter_programsB
List programs matching filters, compactly. Examples: all VDPs (offers_bounties=false), all bounty programs (offers_bounties=true), only open programs (submission_state="open"), your bookmarked programs (bookmarked=true). Omitted filters are not applied.
Inputs: refresh, bookmarked, offers_bounties, submission_state.
get_balanceA
Read your current HackerOne balance.
Inputs: no named parameters.
get_programA
Get full policy/details for a program by its handle.
Inputs: handle (required).
get_program_scopesC
Get structured scopes for a program, summarized in/out of scope.
Inputs: handle (required), refresh.
get_program_weaknessesA
List the weaknesses (CWE types) a program tracks: name, external_id (e.g. CWE-79), and description.
Inputs: handle (required).
get_reportB
Read a specific report by its id.
Inputs: report_id (required).
list_cwe_typesB
List valid CWE/weakness names usable as the cwe filter in
search_disclosed_reports.
Inputs: refresh.
list_earningsB
List your HackerOne earnings.
Inputs: no named parameters.
list_my_reportsA
List your own submitted reports (compact: id, title, state, dates). Use get_report(id) for the full detail of one report.
Inputs: no named parameters.
list_programsA
List all HackerOne programs your account can access.
The full list is large; pass compact=true to get just
handle/name/offers_bounties/submission_state/state per program, which
stays well under the response size limit. For just totals, use
count_programs instead.
Inputs: compact, refresh.
rank_programsA
Rank your programs by attractiveness (bounties, scope breadth, severity).
Scans every program you can access, which on a cold cache means one API
call per program and can be slow/rate-limited. Pass limit (e.g. 50) to
rank only the first N programs for a quick result.
Inputs: limit, refresh.
raw_getA
Authenticated read-only GET against any HackerOne v1 path, for reads not covered by a dedicated tool. Pass a RELATIVE path (no host).
Known read endpoints: hackers/programs hackers/programs/{handle} hackers/programs/{handle}/structured_scopes hackers/programs/{handle}/weaknesses hackers/me/reports hackers/reports/{id} hackers/payments/balance hackers/payments/earnings
Inputs: path (required), params.
search_directoryA
Search HackerOne's public program directory by name/handle term. Returns up to 10 matches (name, handle).
Inputs: term, refresh.
search_disclosed_reportsA
Search HackerOne's PUBLIC disclosed reports (hacktivity). Filters:
free-text query; severity (critical/high/medium/low); cwe
(vuln-class name, e.g. "Cross-site Scripting (XSS)"); cve
(e.g. CVE-2024-1234); program (a team handle, e.g. "curl").
sort is "relevance" or "recent" (default: relevance when a free-text
query is given, else recent). since/until bound results by
disclosable-activity date as YYYY-MM-DD. Use size/from_ to page.
Returns {total_count, results[...]}.
Inputs: cve, cwe, size, sort, +7 more.
search_scopesA
Search assets across your programs by keyword and optional asset_type.
Scans every program you can access, which on a cold cache means one API
call per program and can be slow/rate-limited. Pass limit (e.g. 50) to
scan only the first N programs for a quick result.
Inputs: query (required), limit, refresh, asset_type.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 17 tools
Most tools have distinct purposes, with clear boundaries between listing programs, filtering, searching, and getting details. However, `list_programs`, `filter_programs`, and `search_directory` could cause minor confusion, and `raw_get` overlaps with any read operation.
All tools follow a consistent `verb_noun` snake_case pattern (e.g., `count_programs`, `get_program`, `search_disclosed_reports`). Even `raw_get` fits the pattern as an adjective-verb combination.
17 tools cover the HackerOne domain well—program management, report viewing, earnings, and search—without being excessive. Each tool serves a clear purpose within the read-only scope.
The tool surface is read-only, lacking any write operations (e.g., submitting reports, updating programs, or managing account settings). `draft_report` prepares a report for manual submission, but there is no tool to actually submit it, creating a dead end.
Maintenance
Related MCP Connectors
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
MCP Server for Web2MD — convert URLs to Markdown from Claude Desktop, Cursor, etc.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Zotero MCP server for Claude and ChatGPT: search, citations, safe writes, PDF passages and pages.
Related MCP Servers
- FlicenseAqualityDmaintenanceA read-only MCP server that exposes your iMessage data to Claude Code and Claude Desktop, with automatic contact name resolution.3-
- AlicenseBqualityDmaintenanceEnables MCP clients like Claude and Codex to interact with HackerOne's API to list and get reports, programs, and scopes.2124 npm3MIT
- AlicenseAqualityDmaintenanceMCP server that connects Claude to Dependency-Track for natural language vulnerability triage, analysis, and management.14MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for the IssueHunt bug bounty platform. Enables LLMs like Claude to interact with IssueHunt to list organizations, programs, and vulnerability reports, as well as perform triage actions.-