hackerone-mcp-server 0.0.0-stage → 1.0.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 +149 -2
- package/dist/h1client.d.ts +179 -0
- package/dist/h1client.js +701 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +532 -0
- package/package.json +28 -4
package/README.md
CHANGED
|
@@ -1,3 +1,150 @@
|
|
|
1
|
-
#
|
|
1
|
+
# HackerOne MCP Server
|
|
2
2
|
|
|
3
|
-
This
|
|
3
|
+
> **Disclaimer:** This is an unofficial, community-built project. It is not affiliated with, endorsed by, or maintained by HackerOne. "HackerOne" is a trademark of HackerOne, Inc. This project integrates with their publicly documented [Hacker API](https://api.hackerone.com/hacker-resources/) and uses the website's public GraphQL API for program signal requirements.
|
|
4
|
+
|
|
5
|
+
MCP server that gives 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.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
### 1. Get your HackerOne API token
|
|
10
|
+
|
|
11
|
+
Go to **HackerOne > Settings > API Token** and generate one.
|
|
12
|
+
|
|
13
|
+
### 2. Install and build
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/Sicks3c/hackerone-mcp-server.git
|
|
17
|
+
cd hackerone-mcp-server
|
|
18
|
+
npm install
|
|
19
|
+
npm run build
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 3. Add to Claude Code
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
claude mcp add hackerone \
|
|
26
|
+
-e H1_USERNAME=your-username \
|
|
27
|
+
-e H1_API_TOKEN=your-api-token \
|
|
28
|
+
-s user \
|
|
29
|
+
-- node /path/to/hackerone-mcp-server/dist/index.js
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or add manually to `~/.claude.json`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"hackerone": {
|
|
38
|
+
"command": "node",
|
|
39
|
+
"args": ["/path/to/hackerone-mcp-server/dist/index.js"],
|
|
40
|
+
"env": {
|
|
41
|
+
"H1_USERNAME": "your-username",
|
|
42
|
+
"H1_API_TOKEN": "your-api-token"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 4. Verify
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
claude
|
|
53
|
+
> /mcp
|
|
54
|
+
# You should see "hackerone" listed with 17 tools
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Tools
|
|
58
|
+
|
|
59
|
+
### Read
|
|
60
|
+
|
|
61
|
+
| Tool | Description |
|
|
62
|
+
|------|-------------|
|
|
63
|
+
| `search_reports` | Search and filter your reports by keyword, program, severity, or state |
|
|
64
|
+
| `get_report` | Get full report details including CVSS vector, bounty amounts, and attachments |
|
|
65
|
+
| `get_report_with_conversation` | Get a report with its triage conversation thread |
|
|
66
|
+
| `get_report_activities` | Get activity timeline (comments, state changes, bounties) |
|
|
67
|
+
| `list_programs` | List all bug bounty programs you have access to (auto-paginates) |
|
|
68
|
+
| `get_program_details` | Get single program info: policy, response times, metrics |
|
|
69
|
+
| `get_program_signal_requirements` | Get a public program's minimum past-year signal threshold and whether requirements are enabled |
|
|
70
|
+
| `get_program_scope` | Get all in-scope assets for a program (auto-paginates) |
|
|
71
|
+
| `get_program_weaknesses` | Get accepted CWE/weakness types for a program (auto-paginates) |
|
|
72
|
+
| `get_earnings` | Get your bounty earnings history (amounts, dates, programs) |
|
|
73
|
+
| `get_hacker_profile` | Get your reputation, signal, impact, and rank |
|
|
74
|
+
| `get_balance` | Get your current unpaid bounty balance |
|
|
75
|
+
| `analyze_report_patterns` | Analyze your hunting patterns (severity distribution, top programs, weakness types) |
|
|
76
|
+
| `search_disclosed_reports` | Search publicly disclosed reports on hacktivity — great for recon and learning |
|
|
77
|
+
|
|
78
|
+
### Write
|
|
79
|
+
|
|
80
|
+
| Tool | Description |
|
|
81
|
+
|------|-------------|
|
|
82
|
+
| `submit_report` | Submit a new vulnerability report to a program |
|
|
83
|
+
| `add_comment` | Add a comment to an existing report (respond to triage) |
|
|
84
|
+
| `close_report` | Withdraw/close one of your own reports |
|
|
85
|
+
|
|
86
|
+
## Usage Examples
|
|
87
|
+
|
|
88
|
+
**Submit a report directly:**
|
|
89
|
+
```
|
|
90
|
+
Submit this SSRF finding to the uber program with critical severity. Here's my writeup: [paste]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Respond to triage:**
|
|
94
|
+
```
|
|
95
|
+
Add a comment to report #2345678: "Here's the updated PoC with the new endpoint..."
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Draft a report matching your style:**
|
|
99
|
+
```
|
|
100
|
+
Find my resolved critical reports and use the same structure to draft a new report for this SSRF I found.
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Learn from triage conversations:**
|
|
104
|
+
```
|
|
105
|
+
Show me the triage conversation on report #2345678. What questions did they ask?
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Research what gets paid:**
|
|
109
|
+
```
|
|
110
|
+
Search disclosed reports on the uber program for SSRF — what did they pay?
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Check program details before hunting:**
|
|
114
|
+
```
|
|
115
|
+
Show me the uber program details — what are their response times?
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Check your stats:**
|
|
119
|
+
```
|
|
120
|
+
Show my hacker profile — what's my current reputation and signal?
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Check a program's signal requirement:**
|
|
124
|
+
```
|
|
125
|
+
What signal do I need to submit reports to the uber program?
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Track earnings:**
|
|
129
|
+
```
|
|
130
|
+
Show my recent bounty earnings and current balance
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Analyze patterns:**
|
|
134
|
+
```
|
|
135
|
+
Analyze my report patterns — what severity gets resolved most?
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## How It Works
|
|
139
|
+
|
|
140
|
+
- Connects to the [HackerOne Hacker API v1](https://api.hackerone.com/hacker-resources/) using your personal API token
|
|
141
|
+
- Runs locally over stdio — your credentials never leave your machine
|
|
142
|
+
- Supports both read and write operations (submit reports, add comments, close reports)
|
|
143
|
+
- Auto-paginates programs, scope, and weakness endpoints so nothing gets silently truncated
|
|
144
|
+
- Uses server-side API filters where available (program, severity, state) for faster searches
|
|
145
|
+
- Built-in retry with exponential backoff for rate limit handling
|
|
146
|
+
- 60-second response cache to reduce redundant API calls
|
|
147
|
+
|
|
148
|
+
## License
|
|
149
|
+
|
|
150
|
+
MIT
|
|
@@ -0,0 +1,179 @@
|
|
|
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
|
+
export declare function getProgramScope(handle: string, pageSize?: number): Promise<{
|
|
85
|
+
id: any;
|
|
86
|
+
asset_type: any;
|
|
87
|
+
asset_identifier: any;
|
|
88
|
+
eligible_for_bounty: any;
|
|
89
|
+
eligible_for_submission: any;
|
|
90
|
+
instruction: any;
|
|
91
|
+
max_severity: any;
|
|
92
|
+
created_at: any;
|
|
93
|
+
}[]>;
|
|
94
|
+
export declare function getProgramWeaknesses(handle: string, pageSize?: number): Promise<{
|
|
95
|
+
id: any;
|
|
96
|
+
name: any;
|
|
97
|
+
description: any;
|
|
98
|
+
external_id: any;
|
|
99
|
+
}[]>;
|
|
100
|
+
export declare function getEarnings(pageSize?: number): Promise<any>;
|
|
101
|
+
export declare function getHackerProfile(): Promise<{
|
|
102
|
+
id: any;
|
|
103
|
+
username: any;
|
|
104
|
+
name: any;
|
|
105
|
+
bio: any;
|
|
106
|
+
reputation: any;
|
|
107
|
+
signal: any;
|
|
108
|
+
impact: any;
|
|
109
|
+
rank: any;
|
|
110
|
+
created_at: any;
|
|
111
|
+
hackerone_triager: any;
|
|
112
|
+
source: string;
|
|
113
|
+
unavailable_reason: string | null;
|
|
114
|
+
}>;
|
|
115
|
+
export declare function getBalance(): Promise<any>;
|
|
116
|
+
export declare function getReportSummary(reportId: string): Promise<{
|
|
117
|
+
conversation: any;
|
|
118
|
+
id: any;
|
|
119
|
+
title: any;
|
|
120
|
+
state: any;
|
|
121
|
+
created_at: any;
|
|
122
|
+
closed_at: any;
|
|
123
|
+
triaged_at: any;
|
|
124
|
+
bounty_awarded_at: any;
|
|
125
|
+
disclosed_at: any;
|
|
126
|
+
severity: any;
|
|
127
|
+
cvss_score: any;
|
|
128
|
+
cvss_vector: {
|
|
129
|
+
attack_vector: any;
|
|
130
|
+
attack_complexity: any;
|
|
131
|
+
privileges_required: any;
|
|
132
|
+
user_interaction: any;
|
|
133
|
+
scope: any;
|
|
134
|
+
confidentiality: any;
|
|
135
|
+
integrity: any;
|
|
136
|
+
availability: any;
|
|
137
|
+
} | null;
|
|
138
|
+
bounty_amount: any;
|
|
139
|
+
bounty_bonus: any;
|
|
140
|
+
vulnerability_information: any;
|
|
141
|
+
impact: any;
|
|
142
|
+
weakness: any;
|
|
143
|
+
weakness_id: any;
|
|
144
|
+
program: any;
|
|
145
|
+
structured_scope: any;
|
|
146
|
+
structured_scope_type: any;
|
|
147
|
+
attachments: any;
|
|
148
|
+
}>;
|
|
149
|
+
export declare function submitReport(opts: {
|
|
150
|
+
program_handle: string;
|
|
151
|
+
title: string;
|
|
152
|
+
vulnerability_information: string;
|
|
153
|
+
impact?: string;
|
|
154
|
+
severity_rating?: string;
|
|
155
|
+
weakness_id?: string;
|
|
156
|
+
structured_scope_id?: string;
|
|
157
|
+
}): Promise<{
|
|
158
|
+
id: any;
|
|
159
|
+
title: any;
|
|
160
|
+
state: any;
|
|
161
|
+
url: string;
|
|
162
|
+
}>;
|
|
163
|
+
export declare function addComment(reportId: string, message: string, internal?: boolean): Promise<{
|
|
164
|
+
id: any;
|
|
165
|
+
type: any;
|
|
166
|
+
message: any;
|
|
167
|
+
created_at: any;
|
|
168
|
+
}>;
|
|
169
|
+
export declare function closeReport(reportId: string, message?: string): Promise<{
|
|
170
|
+
id: any;
|
|
171
|
+
type: any;
|
|
172
|
+
message: any;
|
|
173
|
+
created_at: any;
|
|
174
|
+
}>;
|
|
175
|
+
export declare function searchDisclosedReports(opts: {
|
|
176
|
+
program?: string;
|
|
177
|
+
query?: string;
|
|
178
|
+
page_size?: number;
|
|
179
|
+
}): Promise<any>;
|