@turbopentest/mcp-server 0.1.8 → 0.2.1
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 +117 -106
- package/dist/prompts/analyze-findings.d.ts +2 -0
- package/dist/prompts/analyze-findings.js +56 -0
- package/dist/prompts/analyze-findings.js.map +1 -0
- package/dist/prompts/compare-pentests.d.ts +2 -0
- package/dist/prompts/compare-pentests.js +57 -0
- package/dist/prompts/compare-pentests.js.map +1 -0
- package/dist/prompts/run-pentest.d.ts +2 -0
- package/dist/prompts/run-pentest.js +42 -0
- package/dist/prompts/run-pentest.js.map +1 -0
- package/dist/prompts/security-posture.d.ts +2 -0
- package/dist/prompts/security-posture.js +49 -0
- package/dist/prompts/security-posture.js.map +1 -0
- package/dist/server.js +11 -1
- package/dist/server.js.map +1 -1
- package/package.json +46 -46
package/README.md
CHANGED
|
@@ -1,106 +1,117 @@
|
|
|
1
|
-
# @turbopentest/mcp-server
|
|
2
|
-
|
|
3
|
-
MCP server for [TurboPentest](https://turbopentest.com) — run AI-powered penetration tests and review findings from your coding assistant.
|
|
4
|
-
|
|
5
|
-
## Setup
|
|
6
|
-
|
|
7
|
-
### 1. Get your API key
|
|
8
|
-
|
|
9
|
-
Create an API key at [turbopentest.com/settings/api-keys](https://turbopentest.com/settings/api-keys).
|
|
10
|
-
|
|
11
|
-
### 2. Add to your MCP client
|
|
12
|
-
|
|
13
|
-
**Claude Desktop** (`claude_desktop_config.json`):
|
|
14
|
-
|
|
15
|
-
```json
|
|
16
|
-
{
|
|
17
|
-
"mcpServers": {
|
|
18
|
-
"turbopentest": {
|
|
19
|
-
"command": "npx",
|
|
20
|
-
"args": ["@turbopentest/mcp-server"],
|
|
21
|
-
"env": {
|
|
22
|
-
"TURBOPENTEST_API_KEY": "tp_live_..."
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
**Claude Code** (`.mcp.json` in your project root):
|
|
30
|
-
|
|
31
|
-
```json
|
|
32
|
-
{
|
|
33
|
-
"mcpServers": {
|
|
34
|
-
"turbopentest": {
|
|
35
|
-
"command": "npx",
|
|
36
|
-
"args": ["@turbopentest/mcp-server"],
|
|
37
|
-
"env": {
|
|
38
|
-
"TURBOPENTEST_API_KEY": "tp_live_..."
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
**Cursor** (Settings > MCP Servers > Add):
|
|
46
|
-
|
|
47
|
-
```json
|
|
48
|
-
{
|
|
49
|
-
"command": "npx",
|
|
50
|
-
"args": ["@turbopentest/mcp-server"],
|
|
51
|
-
"env": {
|
|
52
|
-
"TURBOPENTEST_API_KEY": "tp_live_..."
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Tools
|
|
58
|
-
|
|
59
|
-
| Tool
|
|
60
|
-
|
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
|
|
70
|
-
##
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
1
|
+
# @turbopentest/mcp-server
|
|
2
|
+
|
|
3
|
+
MCP server for [TurboPentest](https://turbopentest.com) — run AI-powered penetration tests and review findings from your coding assistant.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
### 1. Get your API key
|
|
8
|
+
|
|
9
|
+
Create an API key at [turbopentest.com/settings/api-keys](https://turbopentest.com/settings/api-keys).
|
|
10
|
+
|
|
11
|
+
### 2. Add to your MCP client
|
|
12
|
+
|
|
13
|
+
**Claude Desktop** (`claude_desktop_config.json`):
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"mcpServers": {
|
|
18
|
+
"turbopentest": {
|
|
19
|
+
"command": "npx",
|
|
20
|
+
"args": ["@turbopentest/mcp-server"],
|
|
21
|
+
"env": {
|
|
22
|
+
"TURBOPENTEST_API_KEY": "tp_live_..."
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Claude Code** (`.mcp.json` in your project root):
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"turbopentest": {
|
|
35
|
+
"command": "npx",
|
|
36
|
+
"args": ["@turbopentest/mcp-server"],
|
|
37
|
+
"env": {
|
|
38
|
+
"TURBOPENTEST_API_KEY": "tp_live_..."
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Cursor** (Settings > MCP Servers > Add):
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"command": "npx",
|
|
50
|
+
"args": ["@turbopentest/mcp-server"],
|
|
51
|
+
"env": {
|
|
52
|
+
"TURBOPENTEST_API_KEY": "tp_live_..."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Tools
|
|
58
|
+
|
|
59
|
+
| Tool | Description |
|
|
60
|
+
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
61
|
+
| `start_pentest` | Launch a pentest against a verified domain. Supports recon/standard/deep/blitz tiers and optional GitHub repo for white-box scanning. |
|
|
62
|
+
| `get_pentest` | Get full scan details: status, progress, findings summary, executive summary, attack surface map, STRIDE threat model. |
|
|
63
|
+
| `list_pentests` | List all your pentests with status and finding counts. Filter by status, limit results. |
|
|
64
|
+
| `get_findings` | Get structured vulnerability findings with severity, CVSS, CWE, PoC, remediation, and retest commands. Filter by severity. |
|
|
65
|
+
| `download_report` | Download a pentest report as markdown (best for AI), JSON, or PDF. |
|
|
66
|
+
| `get_credits` | Check your credit balance and available scan tiers with pricing. |
|
|
67
|
+
| `verify_attestation` | Verify a blockchain-anchored pentest attestation by hash (public, no API key required). |
|
|
68
|
+
| `list_domains` | List your verified domains and their verification status. |
|
|
69
|
+
|
|
70
|
+
## Prompts
|
|
71
|
+
|
|
72
|
+
Built-in prompts for common workflows. Your AI assistant can use these to guide multi-step operations.
|
|
73
|
+
|
|
74
|
+
| Prompt | Description |
|
|
75
|
+
| ------------------- | ------------------------------------------------------------------------------------------------ |
|
|
76
|
+
| `analyze_findings` | Deep-dive analysis of a pentest's findings with prioritized remediation plan |
|
|
77
|
+
| `compare_pentests` | Diff two pentests to track what's new, fixed, and persistent across tests |
|
|
78
|
+
| `run_pentest` | Guided full-lifecycle pentest: domain check, credit verification, launch, monitoring, and summary |
|
|
79
|
+
| `security_posture` | Executive summary of overall security posture across all recent pentests |
|
|
80
|
+
|
|
81
|
+
## Scan Tiers
|
|
82
|
+
|
|
83
|
+
| Tier | Agents | Duration | Price |
|
|
84
|
+
| -------- | ------ | -------- | ----- |
|
|
85
|
+
| Recon | 1 | 30 min | $49 |
|
|
86
|
+
| Standard | 4 | 1 hour | $99 |
|
|
87
|
+
| Deep | 10 | 2 hours | $299 |
|
|
88
|
+
| Blitz | 20 | 4 hours | $699 |
|
|
89
|
+
|
|
90
|
+
## Example
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
You: "Run a pentest on staging.example.com"
|
|
94
|
+
Claude: Calls start_pentest → "Started pentest tp_abc123, 4 agents, ~1 hour"
|
|
95
|
+
|
|
96
|
+
You: "How's it going?"
|
|
97
|
+
Claude: Calls get_pentest → "60% complete, 3 findings so far (1 high, 2 medium)"
|
|
98
|
+
|
|
99
|
+
You: "Show me the high severity findings"
|
|
100
|
+
Claude: Calls get_findings(severity: "high") → Shows SQL injection details with PoC and remediation
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Configuration
|
|
104
|
+
|
|
105
|
+
| Environment Variable | Description | Default |
|
|
106
|
+
| ---------------------- | ------------------------------------ | ------------------------------ |
|
|
107
|
+
| `TURBOPENTEST_API_KEY` | Your TurboPentest API key (required) | — |
|
|
108
|
+
| `TURBOPENTEST_API_URL` | Custom API base URL (for testing) | `https://turbopentest.com/api` |
|
|
109
|
+
|
|
110
|
+
## Requirements
|
|
111
|
+
|
|
112
|
+
- Node.js 18+
|
|
113
|
+
- A [TurboPentest](https://turbopentest.com) account with API access
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
MIT
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const argsSchema = {
|
|
3
|
+
pentest_id: z.string().describe("The pentest ID (UUID) to analyze"),
|
|
4
|
+
};
|
|
5
|
+
export function registerAnalyzeFindings(server) {
|
|
6
|
+
server.registerPrompt("analyze_findings", {
|
|
7
|
+
title: "Analyze Findings",
|
|
8
|
+
description: "Deep-dive analysis of a pentest's findings with prioritized remediation plan",
|
|
9
|
+
argsSchema,
|
|
10
|
+
}, async ({ pentest_id }) => ({
|
|
11
|
+
messages: [
|
|
12
|
+
{
|
|
13
|
+
role: "user",
|
|
14
|
+
content: {
|
|
15
|
+
type: "text",
|
|
16
|
+
text: `You are a security analyst producing a prioritized remediation plan for pentest ${pentest_id}.
|
|
17
|
+
|
|
18
|
+
Follow these steps:
|
|
19
|
+
|
|
20
|
+
1. **Get pentest context** - Call turbopentest_get_pentest with pentest_id="${pentest_id}". Note the target URL, executive summary, attack surface, and STRIDE threat model. If the pentest is not complete, tell the user and stop.
|
|
21
|
+
|
|
22
|
+
2. **Gather all findings** - Call turbopentest_get_findings with pentest_id="${pentest_id}" for each severity level separately:
|
|
23
|
+
- First with severity="critical"
|
|
24
|
+
- Then severity="high"
|
|
25
|
+
- Then severity="medium"
|
|
26
|
+
- Then severity="low"
|
|
27
|
+
This ensures you see all findings even if there are many.
|
|
28
|
+
|
|
29
|
+
3. **Produce a prioritized remediation plan** organized as follows:
|
|
30
|
+
|
|
31
|
+
**Executive Summary** - One paragraph overview of the security posture.
|
|
32
|
+
|
|
33
|
+
**Critical & High Priority** - For each critical/high finding:
|
|
34
|
+
- Title and affected URL
|
|
35
|
+
- Why it matters (business impact)
|
|
36
|
+
- Specific remediation steps
|
|
37
|
+
- Retest command to verify the fix
|
|
38
|
+
- Estimated effort (quick fix / moderate / significant)
|
|
39
|
+
|
|
40
|
+
**Quick Wins** - Findings that are easy to fix regardless of severity. Look for:
|
|
41
|
+
- Missing security headers
|
|
42
|
+
- Outdated software versions
|
|
43
|
+
- Default credentials
|
|
44
|
+
- Information disclosure
|
|
45
|
+
|
|
46
|
+
**Medium & Low Priority** - Grouped summary with remediation themes rather than individual findings.
|
|
47
|
+
|
|
48
|
+
**Recommended Fix Order** - Numbered list of what to fix first, considering both severity and effort. Prioritize: critical issues, then quick wins, then high-effort items.
|
|
49
|
+
|
|
50
|
+
Present the plan in clean markdown with clear sections.`,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=analyze-findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-findings.js","sourceRoot":"","sources":["../../src/prompts/analyze-findings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG;IACjB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACpE,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,8EAA8E;QAC3F,UAAU;KACX,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QACzB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,mFAAmF,UAAU;;;;8EAIjC,UAAU;;+EAET,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;wDA4BjC;iBAC7C;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const argsSchema = {
|
|
3
|
+
baseline_id: z.string().describe("The earlier pentest ID (UUID) to use as baseline"),
|
|
4
|
+
current_id: z.string().describe("The later pentest ID (UUID) to compare against baseline"),
|
|
5
|
+
};
|
|
6
|
+
export function registerComparePentests(server) {
|
|
7
|
+
server.registerPrompt("compare_pentests", {
|
|
8
|
+
title: "Compare Pentests",
|
|
9
|
+
description: "Diff two pentests to track what's new, fixed, and persistent across tests",
|
|
10
|
+
argsSchema,
|
|
11
|
+
}, async ({ baseline_id, current_id }) => ({
|
|
12
|
+
messages: [
|
|
13
|
+
{
|
|
14
|
+
role: "user",
|
|
15
|
+
content: {
|
|
16
|
+
type: "text",
|
|
17
|
+
text: `You are comparing two penetration tests to track security posture changes.
|
|
18
|
+
|
|
19
|
+
- Baseline (earlier): ${baseline_id}
|
|
20
|
+
- Current (later): ${current_id}
|
|
21
|
+
|
|
22
|
+
Follow these steps:
|
|
23
|
+
|
|
24
|
+
1. **Get both pentests** - Call turbopentest_get_pentest for "${baseline_id}" and "${current_id}". Verify both are complete. Note their target URLs and completion dates.
|
|
25
|
+
|
|
26
|
+
2. **Get all findings** - Call turbopentest_get_findings for both pentest IDs.
|
|
27
|
+
|
|
28
|
+
3. **Compare findings** - Match findings between the two tests:
|
|
29
|
+
- Match by fingerprint first (exact match on the fingerprint field)
|
|
30
|
+
- If a finding has no fingerprint (null), fall back to matching by title
|
|
31
|
+
- Categorize each finding as:
|
|
32
|
+
- **New** - in current but not in baseline (regression)
|
|
33
|
+
- **Fixed** - in baseline but not in current (improvement)
|
|
34
|
+
- **Persistent** - in both tests (unresolved)
|
|
35
|
+
|
|
36
|
+
4. **Present the comparison** in this format:
|
|
37
|
+
|
|
38
|
+
**Summary**
|
|
39
|
+
- Baseline: [target] tested on [date], [N] findings
|
|
40
|
+
- Current: [target] tested on [date], [N] findings
|
|
41
|
+
- Trend: Improving / Declining / Stable
|
|
42
|
+
|
|
43
|
+
**Fixed (improvements)** - List each with severity and title. Celebrate these.
|
|
44
|
+
|
|
45
|
+
**New (regressions)** - List each with severity, title, and remediation. Flag these as needing attention.
|
|
46
|
+
|
|
47
|
+
**Persistent (unresolved)** - List each with severity and title. Note how long they've been open.
|
|
48
|
+
|
|
49
|
+
**Severity Trend** - Table comparing critical/high/medium/low/info counts between baseline and current.
|
|
50
|
+
|
|
51
|
+
**Recommendation** - One paragraph on overall trajectory and top priority actions.`,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=compare-pentests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-pentests.js","sourceRoot":"","sources":["../../src/prompts/compare-pentests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACpF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAC3F,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,2EAA2E;QACxF,UAAU;KACX,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QACtC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;wBAEM,WAAW;qBACd,UAAU;;;;gEAIiC,WAAW,UAAU,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;sFA2BT;iBAC3E;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const argsSchema = {
|
|
3
|
+
target_url: z.string().describe("The target URL to test (must be a verified domain)"),
|
|
4
|
+
tier: z
|
|
5
|
+
.enum(["recon", "standard", "deep", "blitz"])
|
|
6
|
+
.default("standard")
|
|
7
|
+
.describe("Tier: recon (1 agent, 30min), standard (4 agents, 1hr), deep (10 agents, 2hr), blitz (20 agents, 4hr)"),
|
|
8
|
+
};
|
|
9
|
+
export function registerRunPentest(server) {
|
|
10
|
+
server.registerPrompt("run_pentest", {
|
|
11
|
+
title: "Run Pentest",
|
|
12
|
+
description: "Guided full-lifecycle pentest: domain check, credit verification, launch, monitoring, and findings summary",
|
|
13
|
+
argsSchema,
|
|
14
|
+
}, async ({ target_url, tier }) => ({
|
|
15
|
+
messages: [
|
|
16
|
+
{
|
|
17
|
+
role: "user",
|
|
18
|
+
content: {
|
|
19
|
+
type: "text",
|
|
20
|
+
text: `You are helping a security engineer run a penetration test against ${target_url} using the "${tier}" tier.
|
|
21
|
+
|
|
22
|
+
Follow these steps in order:
|
|
23
|
+
|
|
24
|
+
1. **Verify the domain** - Call turbopentest_list_domains and check that the domain for ${target_url} appears and is verified. If not, tell the user they need to verify the domain first at https://turbopentest.com/domains.
|
|
25
|
+
|
|
26
|
+
2. **Check credits** - Call turbopentest_get_credits and confirm the user has at least one "${tier}" credit available. If not, tell them their current balance and suggest alternatives.
|
|
27
|
+
|
|
28
|
+
3. **Launch the pentest** - Call turbopentest_start_pentest with target_url="${target_url}" and tier="${tier}". Note the pentest ID from the response.
|
|
29
|
+
|
|
30
|
+
4. **Monitor progress** - Call turbopentest_get_pentest with the pentest ID to check status. If status is "scanning", report the progress percentage and which tools are running, then wait 30 seconds and check again. Repeat until status is "complete" or "failed". Do not poll more than 240 times (2 hours max).
|
|
31
|
+
|
|
32
|
+
5. **Summarize findings** - Once complete, call turbopentest_get_findings with the pentest ID. Present a severity breakdown (critical/high/medium/low/info counts) and list the top findings with their titles, severity, and remediation advice.
|
|
33
|
+
|
|
34
|
+
6. **Offer the report** - Ask the user if they'd like to download the full report. If yes, call turbopentest_download_report with their preferred format (markdown is best for reading here, json for structured data, pdf for sharing).
|
|
35
|
+
|
|
36
|
+
If any step fails, explain the error clearly and suggest how to resolve it.`,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=run-pentest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-pentest.js","sourceRoot":"","sources":["../../src/prompts/run-pentest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG;IACjB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IACrF,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SAC5C,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CACP,uGAAuG,CACxG;CACJ,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,cAAc,CACnB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,4GAA4G;QAC9G,UAAU;KACX,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,sEAAsE,UAAU,eAAe,IAAI;;;;0FAI3B,UAAU;;8FAEN,IAAI;;+EAEnB,UAAU,eAAe,IAAI;;;;;;;;4EAQhC;iBACjE;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function registerSecurityPosture(server) {
|
|
2
|
+
server.registerPrompt("security_posture", {
|
|
3
|
+
title: "Security Posture",
|
|
4
|
+
description: "Executive summary of overall security posture across all recent pentests",
|
|
5
|
+
}, async () => ({
|
|
6
|
+
messages: [
|
|
7
|
+
{
|
|
8
|
+
role: "user",
|
|
9
|
+
content: {
|
|
10
|
+
type: "text",
|
|
11
|
+
text: `You are producing an executive security posture report for this user's organization.
|
|
12
|
+
|
|
13
|
+
Follow these steps:
|
|
14
|
+
|
|
15
|
+
1. **Get recent pentests** - Call turbopentest_list_pentests with limit=20. Note how many are complete vs in-progress.
|
|
16
|
+
|
|
17
|
+
2. **Gather findings for recent completed tests** - For the 5 most recently completed pentests, call turbopentest_get_findings for each. This caps API calls while giving a representative view.
|
|
18
|
+
|
|
19
|
+
3. **Produce an executive summary** with these sections:
|
|
20
|
+
|
|
21
|
+
**Overview**
|
|
22
|
+
- Total pentests run (from the list)
|
|
23
|
+
- Targets tested (unique URLs)
|
|
24
|
+
- Date range covered
|
|
25
|
+
|
|
26
|
+
**Vulnerability Summary**
|
|
27
|
+
- Total findings by severity across all 5 analyzed tests
|
|
28
|
+
- Most common vulnerability types (group by title similarity)
|
|
29
|
+
- Average findings per test
|
|
30
|
+
|
|
31
|
+
**Highest Risk Targets**
|
|
32
|
+
- Which targets have the most critical/high findings
|
|
33
|
+
- Any targets with unresolved critical issues
|
|
34
|
+
|
|
35
|
+
**Trends** (if multiple tests exist for the same target)
|
|
36
|
+
- Is the finding count going up or down?
|
|
37
|
+
- Are critical issues being resolved?
|
|
38
|
+
|
|
39
|
+
**Top 3 Recommended Actions**
|
|
40
|
+
- Specific, actionable items based on the findings
|
|
41
|
+
- Prioritize by impact and prevalence
|
|
42
|
+
|
|
43
|
+
Present this as a clean executive briefing suitable for sharing with leadership. Use bullet points and tables where appropriate.`,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=security-posture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-posture.js","sourceRoot":"","sources":["../../src/prompts/security-posture.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,0EAA0E;KACxF,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iIAgC+G;iBACtH;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -7,11 +7,16 @@ import { registerDownloadReport } from "./tools/download-report.js";
|
|
|
7
7
|
import { registerGetCredits } from "./tools/get-credits.js";
|
|
8
8
|
import { registerVerifyAttestation } from "./tools/verify-attestation.js";
|
|
9
9
|
import { registerListDomains } from "./tools/list-domains.js";
|
|
10
|
+
import { registerAnalyzeFindings } from "./prompts/analyze-findings.js";
|
|
11
|
+
import { registerComparePentests } from "./prompts/compare-pentests.js";
|
|
12
|
+
import { registerRunPentest } from "./prompts/run-pentest.js";
|
|
13
|
+
import { registerSecurityPosture } from "./prompts/security-posture.js";
|
|
10
14
|
export function createServer(client) {
|
|
11
15
|
const server = new McpServer({
|
|
12
16
|
name: "turbopentest",
|
|
13
|
-
version: "0.
|
|
17
|
+
version: "0.2.0",
|
|
14
18
|
});
|
|
19
|
+
// Tools
|
|
15
20
|
registerStartPentest(server, client);
|
|
16
21
|
registerGetPentest(server, client);
|
|
17
22
|
registerListPentests(server, client);
|
|
@@ -20,6 +25,11 @@ export function createServer(client) {
|
|
|
20
25
|
registerGetCredits(server, client);
|
|
21
26
|
registerVerifyAttestation(server, client);
|
|
22
27
|
registerListDomains(server, client);
|
|
28
|
+
// Prompts
|
|
29
|
+
registerAnalyzeFindings(server);
|
|
30
|
+
registerComparePentests(server);
|
|
31
|
+
registerRunPentest(server);
|
|
32
|
+
registerSecurityPosture(server);
|
|
23
33
|
return server;
|
|
24
34
|
}
|
|
25
35
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,QAAQ;IACR,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,UAAU;IACV,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@turbopentest/mcp-server",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "MCP server for TurboPentest — AI-powered penetration testing from your coding assistant",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"turbopentest-mcp": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist"
|
|
12
|
-
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"dev": "tsx src/index.ts",
|
|
16
|
-
"prepublishOnly": "npm run build"
|
|
17
|
-
},
|
|
18
|
-
"keywords": [
|
|
19
|
-
"mcp",
|
|
20
|
-
"model-context-protocol",
|
|
21
|
-
"pentest",
|
|
22
|
-
"security",
|
|
23
|
-
"turbopentest",
|
|
24
|
-
"ai"
|
|
25
|
-
],
|
|
26
|
-
"author": "IntegSec Inc.",
|
|
27
|
-
"license": "MIT",
|
|
28
|
-
"mcpName": "io.github.integsec/turbopentest",
|
|
29
|
-
"repository": {
|
|
30
|
-
"type": "git",
|
|
31
|
-
"url": "https://github.com/integsec/turbopentest-mcp.git"
|
|
32
|
-
},
|
|
33
|
-
"homepage": "https://turbopentest.com",
|
|
34
|
-
"engines": {
|
|
35
|
-
"node": ">=18.0.0"
|
|
36
|
-
},
|
|
37
|
-
"dependencies": {
|
|
38
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
39
|
-
"zod": "^4.3.6"
|
|
40
|
-
},
|
|
41
|
-
"devDependencies": {
|
|
42
|
-
"@types/node": "^25.3.5",
|
|
43
|
-
"tsx": "^4.19.0",
|
|
44
|
-
"typescript": "^5.7.0"
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@turbopentest/mcp-server",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "MCP server for TurboPentest — AI-powered penetration testing from your coding assistant",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"turbopentest-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsx src/index.ts",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"model-context-protocol",
|
|
21
|
+
"pentest",
|
|
22
|
+
"security",
|
|
23
|
+
"turbopentest",
|
|
24
|
+
"ai"
|
|
25
|
+
],
|
|
26
|
+
"author": "IntegSec Inc.",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"mcpName": "io.github.integsec/turbopentest",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/integsec/turbopentest-mcp.git"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://turbopentest.com",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
39
|
+
"zod": "^4.3.6"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^25.3.5",
|
|
43
|
+
"tsx": "^4.19.0",
|
|
44
|
+
"typescript": "^5.7.0"
|
|
45
|
+
}
|
|
46
|
+
}
|