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 CHANGED
@@ -1,3 +1,144 @@
1
- # Temporary Holding Version
1
+ # HackerOne MCP Server
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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 {};