hackerone-mcp-server 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -2
- package/dist/h1client.d.ts +219 -0
- package/dist/h1client.js +960 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +551 -0
- package/package.json +32 -4
package/README.md
CHANGED
|
@@ -1,3 +1,144 @@
|
|
|
1
|
-
#
|
|
1
|
+
# HackerOne MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Unofficial MCP server that gives Codex, Claude Code, or any MCP client full access to your HackerOne reports, programs, earnings, and scope data via the HackerOne API — including submitting reports and responding to triage.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
Install Node.js and npm, then use the published [hackerone-mcp-server package](https://www.npmjs.com/package/hackerone-mcp-server) through `npx`.
|
|
8
|
+
|
|
9
|
+
### 1. Get your HackerOne API token
|
|
10
|
+
|
|
11
|
+
Go to **HackerOne > Settings > API Token** and generate one.
|
|
12
|
+
|
|
13
|
+
### 2. Add to your MCP client
|
|
14
|
+
|
|
15
|
+
Replace `your-username` and `your-api-token` below with your HackerOne credentials.
|
|
16
|
+
|
|
17
|
+
#### Codex
|
|
18
|
+
|
|
19
|
+
```toml
|
|
20
|
+
[mcp_servers.hackerone]
|
|
21
|
+
command = "npx"
|
|
22
|
+
args = ["-y", "hackerone-mcp-server@latest"]
|
|
23
|
+
startup_timeout_sec = 60
|
|
24
|
+
env = { "H1_USERNAME" = "your-username", "H1_API_TOKEN" = "your-api-token" }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
#### Claude Code
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"hackerone": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "hackerone-mcp-server@latest"],
|
|
35
|
+
"env": {
|
|
36
|
+
"H1_USERNAME": "your-username",
|
|
37
|
+
"H1_API_TOKEN": "your-api-token"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Build from source
|
|
45
|
+
|
|
46
|
+
For local development:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/11philip22/hackerone-mcp-server.git
|
|
50
|
+
cd hackerone-mcp-server
|
|
51
|
+
npm install
|
|
52
|
+
npm run build
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Run `npm test` to build and run the fixture tests. Tests use Node's experimental module mocking and require Node.js 22.3+ (or 20.18+ on the Node 20 release line).
|
|
56
|
+
|
|
57
|
+
To use your local build, set the MCP command to `node` and its arguments to `["/absolute/path/to/hackerone-mcp-server/dist/index.js"]`, keeping the same environment variables.
|
|
58
|
+
|
|
59
|
+
## Tools
|
|
60
|
+
|
|
61
|
+
### Read
|
|
62
|
+
|
|
63
|
+
| Tool | Description |
|
|
64
|
+
|------|-------------|
|
|
65
|
+
| `search_reports` | Search and filter your reports by keyword, program, severity, or state |
|
|
66
|
+
| `get_report` | Get full report details including CVSS vector, bounty amounts, and attachments |
|
|
67
|
+
| `get_report_with_conversation` | Get a report with its triage conversation thread |
|
|
68
|
+
| `get_report_activities` | Get activity timeline (comments, state changes, bounties) |
|
|
69
|
+
| `list_programs` | List all bug bounty programs you have access to (auto-paginates) |
|
|
70
|
+
| `get_program_details` | Get single program info: policy, response times, metrics |
|
|
71
|
+
| `get_program_signal_requirements` | Get a public program's minimum past-year signal threshold and whether requirements are enabled |
|
|
72
|
+
| `get_program_rewards` | Get a public program's currency, severity payout ranges, reward groups, and each group's scope assets |
|
|
73
|
+
| `get_program_scope` | Get all in-scope assets for a program (auto-paginates) |
|
|
74
|
+
| `get_program_weaknesses` | Get accepted CWE/weakness types for a program (auto-paginates) |
|
|
75
|
+
| `get_earnings` | Get your bounty earnings history (amounts, dates, programs) |
|
|
76
|
+
| `get_hacker_profile` | Get your reputation, signal, impact, and rank |
|
|
77
|
+
| `get_balance` | Get your current unpaid bounty balance |
|
|
78
|
+
| `analyze_report_patterns` | Analyze your hunting patterns (severity distribution, top programs, weakness types) |
|
|
79
|
+
| `search_disclosed_reports` | Search publicly disclosed reports on hacktivity — great for recon and learning |
|
|
80
|
+
|
|
81
|
+
### Write
|
|
82
|
+
|
|
83
|
+
| Tool | Description |
|
|
84
|
+
|------|-------------|
|
|
85
|
+
| `submit_report` | Submit a new vulnerability report to a program |
|
|
86
|
+
| `add_comment` | Add a comment to an existing report (respond to triage) |
|
|
87
|
+
| `close_report` | Withdraw/close one of your own reports |
|
|
88
|
+
|
|
89
|
+
## Usage Examples
|
|
90
|
+
|
|
91
|
+
**Submit a report directly:**
|
|
92
|
+
```
|
|
93
|
+
Submit this SSRF finding to the uber program with critical severity. Here's my writeup: [paste]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Respond to triage:**
|
|
97
|
+
```
|
|
98
|
+
Add a comment to report #2345678: "Here's the updated PoC with the new endpoint..."
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Draft a report matching your style:**
|
|
102
|
+
```
|
|
103
|
+
Find my resolved critical reports and use the same structure to draft a new report for this SSRF I found.
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Learn from triage conversations:**
|
|
107
|
+
```
|
|
108
|
+
Show me the triage conversation on report #2345678. What questions did they ask?
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Research what gets paid:**
|
|
112
|
+
```
|
|
113
|
+
Search disclosed reports on the uber program for SSRF — what did they pay?
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Check program details before hunting:**
|
|
117
|
+
```
|
|
118
|
+
Show me the uber program details — what are their response times?
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Check your stats:**
|
|
122
|
+
```
|
|
123
|
+
Show my hacker profile — what's my current reputation and signal?
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Check a program's signal requirement:**
|
|
127
|
+
```
|
|
128
|
+
What signal do I need to submit reports to the uber program?
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Compare rewards by asset group:**
|
|
132
|
+
```
|
|
133
|
+
Show TikTok's reward groups, severity payout ranges, and which Android apps and websites belong to each group. Flag any unavailable data.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Track earnings:**
|
|
137
|
+
```
|
|
138
|
+
Show my recent bounty earnings and current balance
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Analyze patterns:**
|
|
142
|
+
```
|
|
143
|
+
Analyze my report patterns — what severity gets resolved most?
|
|
144
|
+
```
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
export interface SearchReportsOpts {
|
|
2
|
+
query?: string;
|
|
3
|
+
program?: string;
|
|
4
|
+
severity?: string;
|
|
5
|
+
state?: string;
|
|
6
|
+
page_size?: number;
|
|
7
|
+
page_number?: number;
|
|
8
|
+
sort?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function searchReports(opts?: SearchReportsOpts): Promise<{
|
|
11
|
+
id: any;
|
|
12
|
+
title: any;
|
|
13
|
+
state: any;
|
|
14
|
+
substate: any;
|
|
15
|
+
severity: any;
|
|
16
|
+
created_at: any;
|
|
17
|
+
disclosed_at: any;
|
|
18
|
+
bounty_awarded_at: any;
|
|
19
|
+
bounty_amount: any;
|
|
20
|
+
bounty_bonus: any;
|
|
21
|
+
weakness: any;
|
|
22
|
+
program: any;
|
|
23
|
+
}[]>;
|
|
24
|
+
export declare function getReport(reportId: string): Promise<{
|
|
25
|
+
id: any;
|
|
26
|
+
title: any;
|
|
27
|
+
state: any;
|
|
28
|
+
created_at: any;
|
|
29
|
+
closed_at: any;
|
|
30
|
+
triaged_at: any;
|
|
31
|
+
bounty_awarded_at: any;
|
|
32
|
+
disclosed_at: any;
|
|
33
|
+
severity: any;
|
|
34
|
+
cvss_score: any;
|
|
35
|
+
cvss_vector: {
|
|
36
|
+
attack_vector: any;
|
|
37
|
+
attack_complexity: any;
|
|
38
|
+
privileges_required: any;
|
|
39
|
+
user_interaction: any;
|
|
40
|
+
scope: any;
|
|
41
|
+
confidentiality: any;
|
|
42
|
+
integrity: any;
|
|
43
|
+
availability: any;
|
|
44
|
+
} | null;
|
|
45
|
+
bounty_amount: any;
|
|
46
|
+
bounty_bonus: any;
|
|
47
|
+
vulnerability_information: any;
|
|
48
|
+
impact: any;
|
|
49
|
+
weakness: any;
|
|
50
|
+
weakness_id: any;
|
|
51
|
+
program: any;
|
|
52
|
+
structured_scope: any;
|
|
53
|
+
structured_scope_type: any;
|
|
54
|
+
attachments: any;
|
|
55
|
+
}>;
|
|
56
|
+
export declare function getReportActivities(reportId: string, _pageSize?: number): Promise<any>;
|
|
57
|
+
export declare function listPrograms(pageSize?: number): Promise<{
|
|
58
|
+
id: any;
|
|
59
|
+
handle: any;
|
|
60
|
+
name: any;
|
|
61
|
+
offers_bounties: any;
|
|
62
|
+
state: any;
|
|
63
|
+
started_accepting_at: any;
|
|
64
|
+
submission_state: any;
|
|
65
|
+
}[]>;
|
|
66
|
+
export declare function getProgramDetails(handle: string): Promise<{
|
|
67
|
+
id: string;
|
|
68
|
+
handle: any;
|
|
69
|
+
name: any;
|
|
70
|
+
url: any;
|
|
71
|
+
offers_bounties: any;
|
|
72
|
+
state: any;
|
|
73
|
+
submission_state: any;
|
|
74
|
+
started_accepting_at: any;
|
|
75
|
+
policy: any;
|
|
76
|
+
response_efficiency_percentage: any;
|
|
77
|
+
average_time_to_first_program_response: any;
|
|
78
|
+
average_time_to_report_resolved: any;
|
|
79
|
+
average_time_to_bounty_awarded: any;
|
|
80
|
+
allow_bounty_splitting: any;
|
|
81
|
+
bookmarked: any;
|
|
82
|
+
}>;
|
|
83
|
+
export declare function getProgramSignalRequirements(handle: string): Promise<any>;
|
|
84
|
+
type RewardAvailability = "available" | "partial" | "unavailable";
|
|
85
|
+
type RewardSeverity = "low" | "medium" | "high" | "critical";
|
|
86
|
+
interface RewardAsset {
|
|
87
|
+
id: string;
|
|
88
|
+
asset_identifier: string;
|
|
89
|
+
asset_type: string | null;
|
|
90
|
+
eligible_for_submission: boolean | null;
|
|
91
|
+
eligible_for_bounty: boolean | null;
|
|
92
|
+
}
|
|
93
|
+
interface RewardGroup {
|
|
94
|
+
id: string;
|
|
95
|
+
name: string | null;
|
|
96
|
+
description: string | null;
|
|
97
|
+
scope_kind: "all_assets" | "asset" | "reward_group" | null;
|
|
98
|
+
use_range: boolean | null;
|
|
99
|
+
rewards: Record<RewardSeverity, {
|
|
100
|
+
label: string | null;
|
|
101
|
+
minimum: number | null;
|
|
102
|
+
maximum: number | null;
|
|
103
|
+
}>;
|
|
104
|
+
assets: RewardAsset[] | null;
|
|
105
|
+
assets_availability: RewardAvailability;
|
|
106
|
+
}
|
|
107
|
+
export interface ProgramRewards {
|
|
108
|
+
handle: string;
|
|
109
|
+
currency: string | null;
|
|
110
|
+
source: string;
|
|
111
|
+
program_url: string;
|
|
112
|
+
format: "legacy" | "scope_and_rewards" | null;
|
|
113
|
+
description: string | null;
|
|
114
|
+
availability: RewardAvailability;
|
|
115
|
+
issues: {
|
|
116
|
+
code: string;
|
|
117
|
+
group_id: string | null;
|
|
118
|
+
message: string;
|
|
119
|
+
}[];
|
|
120
|
+
groups: RewardGroup[] | null;
|
|
121
|
+
}
|
|
122
|
+
export declare function getProgramRewards(handle: string): Promise<ProgramRewards>;
|
|
123
|
+
export declare function getProgramScope(handle: string, pageSize?: number): Promise<{
|
|
124
|
+
id: any;
|
|
125
|
+
asset_type: any;
|
|
126
|
+
asset_identifier: any;
|
|
127
|
+
eligible_for_bounty: any;
|
|
128
|
+
eligible_for_submission: any;
|
|
129
|
+
instruction: any;
|
|
130
|
+
max_severity: any;
|
|
131
|
+
created_at: any;
|
|
132
|
+
}[]>;
|
|
133
|
+
export declare function getProgramWeaknesses(handle: string, pageSize?: number): Promise<{
|
|
134
|
+
id: any;
|
|
135
|
+
name: any;
|
|
136
|
+
description: any;
|
|
137
|
+
external_id: any;
|
|
138
|
+
}[]>;
|
|
139
|
+
export declare function getEarnings(pageSize?: number): Promise<any>;
|
|
140
|
+
export declare function getHackerProfile(): Promise<{
|
|
141
|
+
id: any;
|
|
142
|
+
username: any;
|
|
143
|
+
name: any;
|
|
144
|
+
bio: any;
|
|
145
|
+
reputation: any;
|
|
146
|
+
signal: any;
|
|
147
|
+
impact: any;
|
|
148
|
+
rank: any;
|
|
149
|
+
created_at: any;
|
|
150
|
+
hackerone_triager: any;
|
|
151
|
+
source: string;
|
|
152
|
+
unavailable_reason: string | null;
|
|
153
|
+
}>;
|
|
154
|
+
export declare function getBalance(): Promise<any>;
|
|
155
|
+
export declare function getReportSummary(reportId: string): Promise<{
|
|
156
|
+
conversation: any;
|
|
157
|
+
id: any;
|
|
158
|
+
title: any;
|
|
159
|
+
state: any;
|
|
160
|
+
created_at: any;
|
|
161
|
+
closed_at: any;
|
|
162
|
+
triaged_at: any;
|
|
163
|
+
bounty_awarded_at: any;
|
|
164
|
+
disclosed_at: any;
|
|
165
|
+
severity: any;
|
|
166
|
+
cvss_score: any;
|
|
167
|
+
cvss_vector: {
|
|
168
|
+
attack_vector: any;
|
|
169
|
+
attack_complexity: any;
|
|
170
|
+
privileges_required: any;
|
|
171
|
+
user_interaction: any;
|
|
172
|
+
scope: any;
|
|
173
|
+
confidentiality: any;
|
|
174
|
+
integrity: any;
|
|
175
|
+
availability: any;
|
|
176
|
+
} | null;
|
|
177
|
+
bounty_amount: any;
|
|
178
|
+
bounty_bonus: any;
|
|
179
|
+
vulnerability_information: any;
|
|
180
|
+
impact: any;
|
|
181
|
+
weakness: any;
|
|
182
|
+
weakness_id: any;
|
|
183
|
+
program: any;
|
|
184
|
+
structured_scope: any;
|
|
185
|
+
structured_scope_type: any;
|
|
186
|
+
attachments: any;
|
|
187
|
+
}>;
|
|
188
|
+
export declare function submitReport(opts: {
|
|
189
|
+
program_handle: string;
|
|
190
|
+
title: string;
|
|
191
|
+
vulnerability_information: string;
|
|
192
|
+
impact?: string;
|
|
193
|
+
severity_rating?: string;
|
|
194
|
+
weakness_id?: string;
|
|
195
|
+
structured_scope_id?: string;
|
|
196
|
+
}): Promise<{
|
|
197
|
+
id: any;
|
|
198
|
+
title: any;
|
|
199
|
+
state: any;
|
|
200
|
+
url: string;
|
|
201
|
+
}>;
|
|
202
|
+
export declare function addComment(reportId: string, message: string, internal?: boolean): Promise<{
|
|
203
|
+
id: any;
|
|
204
|
+
type: any;
|
|
205
|
+
message: any;
|
|
206
|
+
created_at: any;
|
|
207
|
+
}>;
|
|
208
|
+
export declare function closeReport(reportId: string, message?: string): Promise<{
|
|
209
|
+
id: any;
|
|
210
|
+
type: any;
|
|
211
|
+
message: any;
|
|
212
|
+
created_at: any;
|
|
213
|
+
}>;
|
|
214
|
+
export declare function searchDisclosedReports(opts: {
|
|
215
|
+
program?: string;
|
|
216
|
+
query?: string;
|
|
217
|
+
page_size?: number;
|
|
218
|
+
}): Promise<any>;
|
|
219
|
+
export {};
|