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 CHANGED
@@ -1,3 +1,150 @@
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
+ > **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>;