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-mcpis 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: appstoreconnect-codex-mcp
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asset | Yes | ||
| handle | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It helpfully discloses the response shape ('every matching scope entry plus the program's exclusions as caveats'), which tells the agent exclusions arrive as caveats rather than verdicts. However, it says nothing about auth requirements, rate limits, or how a non-matching asset is represented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the decision purpose front-loaded and the return behavior second. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return values is a bonus rather than a necessity, and the description still notes the caveats structure. The main gap is the undocumented 'handle' parameter, which the description does not resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters. The description compensates partially by defining the accepted 'asset' forms (host, URL, IP, CIDR), but the 'handle' parameter is left entirely unexplained in both schema and description, so the agent must guess what identifies the program.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Decide whether an asset ... is covered by a program's structured scope') and enumerates the accepted asset forms (host, URL, IP, CIDR). This distinguishes it from siblings like get_structured_scopes or get_scope_exclusions, which list rather than evaluate a specific asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies the usage scenario (evaluating one asset against a program's scope), but there is no explicit when-to-use or when-not-to-use guidance relative to siblings such as get_structured_scopes or get_scope_exclusions. The agent must infer that this is the per-asset membership check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_programB
Program metadata and policy (truncated). Set flags to also include structured scope and/or scope exclusions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| with_scopes | No | ||
| with_exclusions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose a real trait — that program metadata is truncated — and explains the flag-driven consolidation behavior. But it says nothing about permissions, whether the caller must be a program member, rate limits, or what the truncation means for completeness, leaving notable gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler, and the resource statement is front-loaded before the flag guidance. The cryptic "(truncated)" marker is the only element that costs clarity without adding meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the flag consolidation guidance is a useful addition. Still, with no annotations, an unexplained required handle parameter at 0% schema coverage, and an ambiguous truncation note, the description is only adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does clarify with_scopes and with_exclusions (include structured scope and/or scope exclusions) and that they can be combined in one call, which is genuinely more than the bare titles offer. The required handle parameter — the sole identifier and the key to the whole call — is left entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (program metadata and policy) but uses no verb and never states that it returns data for the single program named by the handle parameter. The parenthetical "(truncated)" is ambiguous — it could mean the tool's output is truncated or that the description itself was cut off, which muddies the stated purpose. It only weakly differentiates from siblings get_structured_scopes and get_scope_exclusions by noting that their data can be pulled "in one call."
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence implies a usage pattern: set with_scopes/with_exclusions to fold the sibling tools' data into a single call, which is a soft alternative to calling get_structured_scopes or get_scope_exclusions separately. However, it never says when to use this tool versus those siblings, and there are no exclusions or prerequisites (e.g., authentication, program membership).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scope_exclusionsC
Report categories the program excludes from rewards (out-of-scope classes).
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read-only lookup but says nothing about permissions, whether results are program-specific, rate limits, or freshness. With an output schema present, return-shape disclosure is not required, but the remaining behavioral context is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The parenthetical clarifying 'out-of-scope classes' is the only elaboration, and it earns its place; nothing is wasted, though there is very little content overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter and a present output schema, the definition is nearly sufficient: it says what is returned. However, it omits what 'handle' identifies and how this list differs from the scope data returned by get_structured_scopes, leaving a genuine routing gap for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole parameter 'handle' is never mentioned in the description. The agent must infer that handle means a program handle and how it relates to the exclusions returned. The description does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: categories excluded from rewards (out-of-scope classes). The verb 'Report' is slightly odd for a getter, and it does not explicitly distinguish itself from nearby siblings like get_structured_scopes or check_in_scope, but the purpose is clear and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternative. An agent reading this cannot tell whether to call it instead of get_structured_scopes or check_in_scope, which is exactly the confusion this tool needs to resolve.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_structured_scopesC
In-scope assets for a program: identifier, type, bounty eligibility and max severity.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return fields (identifier, type, bounty eligibility, max severity), which is mild content transparency, but says nothing about permissions, auth, pagination, or whether the list is complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with the core resource, so it is not verbose. But it is a sentence fragment rather than a structured statement, and the terse field list substitutes for real explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description omits the required handle argument, prerequisites, and any routing guidance. For a program-scoped read tool with no annotations, this leaves too much to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter (handle) with 0% schema description coverage, and the description never mentions it. The agent must guess that 'handle' is the program identifier referenced by 'a program' in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (in-scope assets for a program) and the fields returned, so an agent can infer it retrieves scopes. However it is a noun phrase with no verb, and it never distinguishes itself from siblings like check_in_scope or get_scope_exclusions, which sound equally scope-related.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus check_in_scope, get_scope_exclusions, or get_program. The word 'program' implies a program handle is needed, but no prerequisite or context is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| sort | No | ||
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it discloses nothing about auth/permission requirements, rate limits, pagination behavior, or result scope. The only behavioral hint is that sort defaults to newest, which is arguably parameter semantics rather than behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler, and the core purpose is front-loaded ahead of the syntax detail. Efficient and well-ordered, though the syntax example could arguably be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, which the description correctly omits. But for a 4-parameter, zero-coverage, unannotated tool it leaves page/limit semantics and sibling differentiation uncovered, making it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does add real value for `query` (HackerOne Lucene syntax with a concrete example) and `sort` (default and example '-disclosed_at'). However, `page` and `limit` are left completely undocumented, so half the parameters remain opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search') and resource ('disclosed reports'), and the parenthetical '(dedup / prior art)' clarifies the intent. It does not, however, differentiate from the near-identical sibling search_disclosed_reports, leaving the agent to guess which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '(dedup / prior art)' note implies the use case for this tool, but there is no explicit when-to-use, when-not, or mention of the overlapping sibling search_disclosed_reports. Usage must be inferred rather than read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| query | No | ||
| offers_bounties | No | ||
| submission_state | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. 'List' and 'programs you can access' imply a permission-scoped read, but the description says nothing about pagination behavior, rate limits, or the result shape beyond handles. Adequate but thin for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then filters, then the return-value purpose. No redundant or wasted phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the description correctly points to handles as the takeaway. The remaining gap is undocumented pagination parameters and the absence of any behavioral notes for a tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does so only partially: it explains query (handle/name substring), offers_bounties (bounty eligibility) and submission_state, but says nothing about the page and limit pagination parameters the schema exposes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List HackerOne programs') and adds scope ('you can access'), which lets an agent distinguish it from the singular get_program sibling. It does not explicitly name or contrast with siblings, but the list-vs-get distinction is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: filter by bounty eligibility, submission state, or a handle/name substring, and the closing line 'Returns handles to feed the other tools' signals the downstream workflow. No explicit when-not or alternative-tool routing, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_reportsB
Your own submitted reports (state, severity, bounty). Pass report_id for one report.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| report_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only discloses that results are scoped to the caller's own reports. It says nothing about auth requirements, whether the list is paginated or bounded, or how state/severity/bounty are represented, leaving the agent to infer behavior from the schema defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and followed by the alternate mode. There is no filler, though it is arguably terse to the point of under-specifying pagination.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is not strictly needed, and the description does hint at returned fields. For a simple read tool this is close to adequate, but with zero schema coverage and no annotations, the absence of any pagination or auth context leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only explains `report_id` (selects a single report). The `page` and `limit` parameters are entirely undocumented in both schema and description, so an agent gets no guidance on pagination semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource — the caller's own submitted reports — and even lists the salient fields (state, severity, bounty), which separates it from sibling listing tools like search_disclosed_reports or hacktivity_search. It stops short of explicitly naming those siblings, so the distinction is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one clear mode switch — 'Pass `report_id` for one report' — which tells the agent how to go from list to single-item retrieval. However, it never says when to prefer this over the sibling discovery tools or what happens when no report_id is supplied, so usage remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_disclosed_reportsC
Disclosed reports for one program (dedup scoped to the program you are hunting).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| handle | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses one trait, program-scoped deduplication, but says nothing about permissions/auth, rate limits, pagination, or result ordering for a search endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single compact sentence with no waste, and the scoping constraint is front-loaded. The terseness crosses into under-specification, but it is not verbose or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, but with no annotations and 0% parameter documentation, the agent is missing essential invocation context such as query semantics, default result size, and how this differs from hacktivity_search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across three parameters. The description implies the program handle is required ('one program') but adds no meaning for 'query' or 'limit', leaving two of three parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('disclosed reports') and scopes it to a single program, which separates it from hacktivity_search and my_reports. However, it is a noun phrase with no verb, and 'search' is only inferable from the tool name, so the action itself is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical hints that results are deduplicated within the program being hunted, giving a fragment of context, but there is no explicit when-to-use guidance and no mention of the obvious alternative hacktivity_search for broader disclosure browsing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
check_in_scope - First observed
get_program - First observed
get_scope_exclusions - First observed
get_structured_scopes - First observed
hacktivity_search - First observed
list_programs - First observed
my_reports - First observed
search_disclosed_reports
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.
Maintenance
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 CodeMouse accounts, repositories, and AI pull-request reviews.
Read-only public CVE records, capability metadata, and agent instructions from Hacker Bob.
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.941-
- AlicenseNot gradedqualityCmaintenanceEnables read-only interaction with App Store Connect via MCP tools, including listing apps, versions, builds, and review submissions, with compliance boundaries and no write operations by default.MIT
- AlicenseBqualityDmaintenanceEnables MCP clients like Claude and Codex to interact with HackerOne's API to list and get reports, programs, and scopes.2121 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