h1-mcp
Read-only integration with the HackerOne Hacker API. Provides tools to list and inspect bug bounty programs (policy, metadata), retrieve structured scopes and scope exclusions, check whether a host/URL/IP/CIDR is in scope (with wildcard, domain, URL, IP and CIDR matching plus exclusions as caveats), search disclosed reports via Lucene queries or per program for deduplication and prior art, and list the user's own submitted reports with state, severity and bounty.
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., "@h1-mcp is api.acme.com in scope for the acme program? any exclusions I should know about?"
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.
h1-mcp
A small, read-only Model Context Protocol server for the HackerOne Hacker API. Use it from Claude Code, Codex and opencode to pull program policy, structured scope, scope exclusions, hacktivity (dedup / prior art) and your own reports straight into the model.
Deliberately eight terse tools — every tool schema is a permanent context cost, so the surface stays small and the output is compact JSON.
Read-only by design: it only ever issues
GETrequests. It cannot submit or modify anything.
What you get
Tool | What it does |
| Programs your token can see. Filter by bounty eligibility, submission state or name. |
| Program metadata + policy; optionally include scopes and/or exclusions in one call. |
| In-scope assets: identifier, type, bounty eligibility, max severity. |
| Report categories the program excludes from rewards. |
| Is this host/URL/IP/CIDR in scope? Matches wildcards, domains, URLs, IPs and CIDRs. |
| Disclosed reports by Lucene query (dedup and prior art). |
| Disclosed reports for one program. |
| Your own submitted reports (state, severity, bounty). |
Why this over the stock API wrapper:
list_programsso the agent can discover handles instead of being told them.check_in_scope— a real wildcard/domain/URL/IP/CIDR matcher with exclusions as caveats.Batched context —
get_program(with_scopes=True, with_exclusions=True)in one round-trip.Polite client —
Retry-After-aware backoff on429/5xx, automatic pagination, typed models.
Related MCP server: HackerOne MCP Server
Requirements
Python 3.11+
uv (recommended) or pipx/pip
A HackerOne account with an API token: https://hackerone.com/settings/api_token/edit
Install
1. Install the server
uv tool install git+https://github.com/gabdevele/h1-mcpThis puts an h1-mcp executable on your PATH (~/.local/bin). Make sure that directory is on
PATH (it usually is).
pipx install git+https://github.com/gabdevele/h1-mcpuvx --from git+https://github.com/gabdevele/h1-mcp h1-mcp --helph1-mcp falls back to this form automatically when it is not installed, so the generated client
configs work either way.
2. Store your credentials (once)
h1-mcp init
# HackerOne username: your-handle
# HackerOne API token: ****This writes ~/.config/h1-mcp/env with mode 0600. Credentials live in one place, so no client
config ever embeds a secret. You can also override the path with H1_MCP_ENV, or just export
H1_USERNAME / H1_API_TOKEN.
3. Verify
h1-mcp doctor
# OK - authenticated. Example program visible: security4. Register the server in your client
h1-mcp install --client all # claude + codex + opencode
# or individually
h1-mcp install --client claude
h1-mcp install --client codex
h1-mcp install --client opencodeinstall uses each client's own CLI where possible, and prints a snippet when it cannot. To just
see the config without writing anything:
h1-mcp config --client allRestart the client afterwards.
Client setup (manual)
opencode
Add to ~/.config/opencode/opencode.jsonc:
{
"mcp": {
"hackerone": {
"type": "local",
"command": ["h1-mcp"],
"enabled": true
}
}
}Claude Code
claude mcp add hackerone -s user -- h1-mcp
claude mcp listOr add this to .mcp.json / ~/.claude.json:
{
"mcpServers": {
"hackerone": { "command": "h1-mcp", "args": [] }
}
}Codex
codex mcp add hackerone -- h1-mcp
codex mcp listOr in ~/.codex/config.toml:
[mcp_servers.hackerone]
command = "h1-mcp"
args = []Any other MCP client
It is a plain stdio server: run h1-mcp (no arguments). Credentials are read from the environment
or ~/.config/h1-mcp/env, so nothing else needs configuring.
Usage
Once registered, just talk to your agent. Examples:
“List programs that offer bounties and mention their max severity in scope.”
“Is
api.acme.comin scope for theacmeprogram? Any exclusions I should worry about?”“Summarize the
acmepolicy and list the top 10 in-scope assets.”“Find disclosed XSS reports for
acmefrom the last year.”“Show my reports that are still
new.”
You can also drive it directly:
h1-mcp serve # run the stdio server (what the clients call)
h1-mcp doctor # check credentials + connectivity
h1-mcp --versionConfiguration
Env var | Default | Purpose |
| – | HackerOne username (wins over the file). |
| – | HackerOne API token. |
|
| Path to the shared credentials file. |
|
| Directory for the default file. |
Resolution order: process environment → H1_MCP_ENV file → ./.env.
Security notes
h1-mcp initwrites the credentials file as0600..envand*.envare git-ignored; never commit tokens.The server is read-only and only sends the token to
api.hackerone.comover HTTPS.
Development
git clone https://github.com/gabdevele/h1-mcp
cd h1-mcp
uv sync --extra dev
uv run pytest
uv run ruff check src tests
uv run h1-mcp doctorLayout:
src/h1_mcp/
client.py # HackerOne Hacker API client (retries, pagination, typed models)
models.py # pydantic response models
scope.py # pure in-scope matcher (wildcard/domain/URL/IP/CIDR)
server.py # the MCP server + 8 tools
config.py # credential loading/storage
cli.py # serve / init / doctor / install / config
tests/ # unit tests for scope, client and server (no network)License
MIT — see LICENSE.
Available Tools
8 toolscheck_in_scopeA
Decide whether an asset (host, URL, IP or CIDR entry) is covered by a program's structured scope. Returns every matching scope entry plus the program's exclusions as caveats.
Inputs: asset (required), handle (required). Returns: result
get_programB
Program metadata and policy (truncated). Set flags to also include structured scope and/or scope exclusions in one call.
Inputs: handle (required), with_scopes, with_exclusions. Returns: result
get_scope_exclusionsC
Report categories the program excludes from rewards (out-of-scope classes).
Inputs: handle (required). Returns: result
get_structured_scopesC
In-scope assets for a program: identifier, type, bounty eligibility and max severity.
Inputs: handle (required). Returns: result
hacktivity_searchB
Search disclosed reports (dedup / prior art). query uses HackerOne Lucene syntax, e.g.
team:security AND cwe:"CWE-79". sort defaults to newest, e.g. -disclosed_at.
Inputs: query (required), page, sort, limit. Returns: result
list_programsA
List HackerOne programs you can access. Filter by bounty eligibility, submission state or a handle/name substring. Returns handles to feed the other tools.
Inputs: page, limit, query, offers_bounties, +1 more. Returns: result
my_reportsB
Your own submitted reports (state, severity, bounty). Pass report_id for one report.
Inputs: page, limit, report_id. Returns: result
search_disclosed_reportsC
Disclosed reports for one program (dedup scoped to the program you are hunting).
Inputs: handle (required), limit, query. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
There is meaningful overlap: get_program can optionally return structured scope and exclusions, duplicating get_structured_scopes and get_scope_exclusions, and hacktivity_search vs search_disclosed_reports both search disclosed reports. Descriptions clarify scope (global Lucene vs per-program) and intent, but an agent can reasonably hesitate between the program-metadata tool with flags and the dedicated scope tools.
Most tools use a readable snake_case verb_noun pattern (list_programs, get_program, get_structured_scopes, check_in_scope). However hacktivity_search reverses the order compared to search_disclosed_reports, and my_reports is a possessive noun rather than a verb, creating mixed conventions.
Eight tools is a well-sized surface for the HackerOne domain, comfortably within the 3-15 range. There is slight redundancy because get_structured_scopes and get_scope_exclusions overlap with get_program's flags, so not every tool strictly earns an independent place.
The set covers program discovery, policy/scope lookup, scope checking, disclosed-report research, and a user's own reports—core hunting workflows. Gaps are minor for a read-oriented server: no report submission, no direct get-by-ID for disclosed reports, and program policy is noted as truncated.
Related MCP Connectors
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Read-only access to InfluSense influencer discovery, ratings, watchlists, and reports via MCP.
Read-only access to your Infrly services, deploys, logs, metrics and billing.
Read-only MCP security data: check catalogue, public scan status and your own scan reports.
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides read-only access to HackerOne reports, program scopes, and bounty earnings through the HackerOne API. It enables users to analyze hunting patterns, check asset eligibility, and retrieve report details or triage conversations via natural language.967 npm43-
- AlicenseBqualityDmaintenanceEnables MCP clients like Claude and Codex to interact with HackerOne's API to list and get reports, programs, and scopes.2124 npm3MIT
- AlicenseNot gradedqualityBmaintenanceEnables read-only access to Product Hunt data, including launches, post details, comments, topic search, and user profiles, through MCP tools over Streamable HTTP.MIT
- FlicenseBqualityCmaintenanceEnables read-only interaction with HackerOne, providing tools for searching and analyzing reports, exploring programs and scope, accessing earnings, and retrieving public disclosures.25-