@integsec/agentic-pentest-proxy 0.2.5 → 0.2.7
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/LICENSE +201 -0
- package/README.md +85 -717
- package/dist/bin/integsec-agentic-pentest-manifest.d.ts +3 -0
- package/dist/bin/integsec-agentic-pentest-manifest.d.ts.map +1 -0
- package/dist/bin/integsec-agentic-pentest-manifest.js +180 -0
- package/dist/bin/integsec-agentic-pentest-manifest.js.map +1 -0
- package/dist/bin/integsec-agentic-pentest-proxy.d.ts +1 -1
- package/dist/bin/integsec-agentic-pentest-proxy.d.ts.map +1 -1
- package/dist/bin/integsec-agentic-pentest-proxy.js +32 -4
- package/dist/bin/integsec-agentic-pentest-proxy.js.map +1 -1
- package/dist/bin/integsec-agentic-pentest-setup.d.ts +3 -0
- package/dist/bin/integsec-agentic-pentest-setup.d.ts.map +1 -0
- package/dist/bin/integsec-agentic-pentest-setup.js +92 -0
- package/dist/bin/integsec-agentic-pentest-setup.js.map +1 -0
- package/dist/src/audit/azure-monitor.d.ts +2 -2
- package/dist/src/audit/azure-monitor.d.ts.map +1 -1
- package/dist/src/audit/azure-monitor.js +8 -5
- package/dist/src/audit/azure-monitor.js.map +1 -1
- package/dist/src/audit/cloudwatch.d.ts.map +1 -1
- package/dist/src/audit/cloudwatch.js.map +1 -1
- package/dist/src/audit/gcp-logging.d.ts.map +1 -1
- package/dist/src/audit/gcp-logging.js +6 -7
- package/dist/src/audit/gcp-logging.js.map +1 -1
- package/dist/src/audit/index.d.ts +7 -0
- package/dist/src/audit/index.d.ts.map +1 -1
- package/dist/src/audit/index.js +11 -1
- package/dist/src/audit/index.js.map +1 -1
- package/dist/src/audit/local.d.ts.map +1 -1
- package/dist/src/audit/local.js +2 -1
- package/dist/src/audit/local.js.map +1 -1
- package/dist/src/builder/dry-run.d.ts +12 -0
- package/dist/src/builder/dry-run.d.ts.map +1 -0
- package/dist/src/builder/dry-run.js +103 -0
- package/dist/src/builder/dry-run.js.map +1 -0
- package/dist/src/builder/manifest-writer.d.ts +7 -0
- package/dist/src/builder/manifest-writer.d.ts.map +1 -0
- package/dist/src/builder/manifest-writer.js +17 -0
- package/dist/src/builder/manifest-writer.js.map +1 -0
- package/dist/src/builder/review-display.d.ts +10 -0
- package/dist/src/builder/review-display.d.ts.map +1 -0
- package/dist/src/builder/review-display.js +55 -0
- package/dist/src/builder/review-display.js.map +1 -0
- package/dist/src/builder/smart-validator.d.ts +39 -0
- package/dist/src/builder/smart-validator.d.ts.map +1 -0
- package/dist/src/builder/smart-validator.js +157 -0
- package/dist/src/builder/smart-validator.js.map +1 -0
- package/dist/src/builder/steps/domains.d.ts +10 -0
- package/dist/src/builder/steps/domains.d.ts.map +1 -0
- package/dist/src/builder/steps/domains.js +71 -0
- package/dist/src/builder/steps/domains.js.map +1 -0
- package/dist/src/builder/steps/engagement-info.d.ts +17 -0
- package/dist/src/builder/steps/engagement-info.d.ts.map +1 -0
- package/dist/src/builder/steps/engagement-info.js +49 -0
- package/dist/src/builder/steps/engagement-info.js.map +1 -0
- package/dist/src/builder/steps/engagement-window.d.ts +15 -0
- package/dist/src/builder/steps/engagement-window.d.ts.map +1 -0
- package/dist/src/builder/steps/engagement-window.js +57 -0
- package/dist/src/builder/steps/engagement-window.js.map +1 -0
- package/dist/src/builder/steps/exclusions.d.ts +13 -0
- package/dist/src/builder/steps/exclusions.d.ts.map +1 -0
- package/dist/src/builder/steps/exclusions.js +57 -0
- package/dist/src/builder/steps/exclusions.js.map +1 -0
- package/dist/src/builder/steps/ip-ranges.d.ts +10 -0
- package/dist/src/builder/steps/ip-ranges.d.ts.map +1 -0
- package/dist/src/builder/steps/ip-ranges.js +64 -0
- package/dist/src/builder/steps/ip-ranges.js.map +1 -0
- package/dist/src/builder/steps/review.d.ts +10 -0
- package/dist/src/builder/steps/review.d.ts.map +1 -0
- package/dist/src/builder/steps/review.js +29 -0
- package/dist/src/builder/steps/review.js.map +1 -0
- package/dist/src/builder/steps/techniques.d.ts +13 -0
- package/dist/src/builder/steps/techniques.d.ts.map +1 -0
- package/dist/src/builder/steps/techniques.js +68 -0
- package/dist/src/builder/steps/techniques.js.map +1 -0
- package/dist/src/builder/steps/urls-and-cloud.d.ts +15 -0
- package/dist/src/builder/steps/urls-and-cloud.d.ts.map +1 -0
- package/dist/src/builder/steps/urls-and-cloud.js +53 -0
- package/dist/src/builder/steps/urls-and-cloud.js.map +1 -0
- package/dist/src/builder/web/api.d.ts +9 -0
- package/dist/src/builder/web/api.d.ts.map +1 -0
- package/dist/src/builder/web/api.js +40 -0
- package/dist/src/builder/web/api.js.map +1 -0
- package/dist/src/builder/web/client-form.html +222 -0
- package/dist/src/builder/web/server.d.ts +14 -0
- package/dist/src/builder/web/server.d.ts.map +1 -0
- package/dist/src/builder/web/server.js +85 -0
- package/dist/src/builder/web/server.js.map +1 -0
- package/dist/src/builder/wizard.d.ts +9 -0
- package/dist/src/builder/wizard.d.ts.map +1 -0
- package/dist/src/builder/wizard.js +49 -0
- package/dist/src/builder/wizard.js.map +1 -0
- package/dist/src/config.d.ts +11 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +33 -3
- package/dist/src/config.js.map +1 -1
- package/dist/src/dns-resolver.d.ts +10 -1
- package/dist/src/dns-resolver.d.ts.map +1 -1
- package/dist/src/dns-resolver.js +41 -3
- package/dist/src/dns-resolver.js.map +1 -1
- package/dist/src/extractor.d.ts +12 -0
- package/dist/src/extractor.d.ts.map +1 -1
- package/dist/src/extractor.js +386 -0
- package/dist/src/extractor.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/ip-matcher.d.ts +23 -0
- package/dist/src/ip-matcher.d.ts.map +1 -1
- package/dist/src/ip-matcher.js +96 -23
- package/dist/src/ip-matcher.js.map +1 -1
- package/dist/src/manifest-schema.d.ts +12 -62
- package/dist/src/manifest-schema.d.ts.map +1 -1
- package/dist/src/manifest.d.ts +6 -0
- package/dist/src/manifest.d.ts.map +1 -1
- package/dist/src/manifest.js +21 -6
- package/dist/src/manifest.js.map +1 -1
- package/dist/src/proxy.d.ts +19 -4
- package/dist/src/proxy.d.ts.map +1 -1
- package/dist/src/proxy.js +111 -33
- package/dist/src/proxy.js.map +1 -1
- package/dist/src/safe-filename.d.ts +3 -0
- package/dist/src/safe-filename.d.ts.map +1 -0
- package/dist/src/safe-filename.js +8 -0
- package/dist/src/safe-filename.js.map +1 -0
- package/dist/src/sanitizer.d.ts.map +1 -1
- package/dist/src/sanitizer.js +36 -10
- package/dist/src/sanitizer.js.map +1 -1
- package/dist/src/technique-checker.d.ts +14 -0
- package/dist/src/technique-checker.d.ts.map +1 -1
- package/dist/src/technique-checker.js +123 -2
- package/dist/src/technique-checker.js.map +1 -1
- package/dist/src/transports/http.d.ts +6 -2
- package/dist/src/transports/http.d.ts.map +1 -1
- package/dist/src/transports/http.js +101 -13
- package/dist/src/transports/http.js.map +1 -1
- package/dist/src/transports/sse.d.ts +1 -1
- package/dist/src/transports/sse.d.ts.map +1 -1
- package/dist/src/transports/sse.js +28 -18
- package/dist/src/transports/sse.js.map +1 -1
- package/dist/src/transports/stdio.d.ts +2 -2
- package/dist/src/transports/stdio.d.ts.map +1 -1
- package/dist/src/transports/stdio.js +77 -48
- package/dist/src/transports/stdio.js.map +1 -1
- package/dist/src/tui/audit-tailer.d.ts.map +1 -1
- package/dist/src/tui/audit-tailer.js +2 -1
- package/dist/src/tui/audit-tailer.js.map +1 -1
- package/dist/src/tui/useAuditWatcher.d.ts.map +1 -1
- package/dist/src/tui/useAuditWatcher.js +2 -1
- package/dist/src/tui/useAuditWatcher.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/validator.d.ts +19 -28
- package/dist/src/validator.d.ts.map +1 -1
- package/dist/src/validator.js +315 -113
- package/dist/src/validator.js.map +1 -1
- package/examples/claude-desktop-burp-config.json +5 -7
- package/examples/claude-desktop-config.json +3 -4
- package/examples/scope-manifest.json +11 -11
- package/package.json +33 -13
- package/scripts/postinstall.cjs +14 -0
- package/examples/scope-test-integsec.json +0 -32
package/README.md
CHANGED
|
@@ -1,756 +1,124 @@
|
|
|
1
|
-
# IntegSec Agentic Pentest
|
|
1
|
+
# IntegSec Agentic Pentest Proxy
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An MCP proxy that checks tool calls against a pentest scope manifest before forwarding them to your MCP tools. It blocks calls it can identify as outside the targets, techniques, or time window you approved, and records decisions in a local audit log.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Requires Node.js 22 or newer.** The proxy supports stdio tools, SSE upstreams such as Burp Suite, and HTTP upstreams.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Quick start: add an MCP tool
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
+------------+ JSON-RPC +---------------------+ JSON-RPC +----------------+
|
|
11
|
-
| AI Agent | ----------> | IntegSec Agentic | ----------> | Upstream MCP |
|
|
12
|
-
| (Claude) | <---------- | Pentest MCP Proxy | <---------- | (TurboPentest) |
|
|
13
|
-
+------------+ allow/block | (validate + audit) | forwarded +----------------+
|
|
14
|
-
+---------------------+
|
|
15
|
-
|
|
|
16
|
-
v
|
|
17
|
-
+-----------+
|
|
18
|
-
| Audit Log |
|
|
19
|
-
| (JSONL / |
|
|
20
|
-
| Cloud) |
|
|
21
|
-
+-----------+
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
> **Using AI agents for pentesting?** [TurboPentest](https://turbopentest.com) delivers agentic penetration testing powered by Claude — 15 orchestrated security tools, OWASP Top 10 coverage, results in under 4 hours, blockchain-attested reports. Starting at $99/domain. Pair it with this proxy for scope-safe autonomous testing.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Table of Contents
|
|
29
|
-
|
|
30
|
-
- [Why This Exists](#why-this-exists)
|
|
31
|
-
- [Features](#features)
|
|
32
|
-
- [Quick Start](#quick-start)
|
|
33
|
-
- [Installation](#installation)
|
|
34
|
-
- [Configuration](#configuration)
|
|
35
|
-
- [Scope Manifest](#scope-manifest)
|
|
36
|
-
- [Environment Variables](#environment-variables)
|
|
37
|
-
- [Technique Mappings](#technique-mappings)
|
|
38
|
-
- [Usage](#usage)
|
|
39
|
-
- [CLI](#cli)
|
|
40
|
-
- [Claude Desktop Integration](#claude-desktop-integration)
|
|
41
|
-
- [Claude Code Integration](#claude-code-integration)
|
|
42
|
-
- [Docker](#docker)
|
|
43
|
-
- [HTTP Mode](#http-mode)
|
|
44
|
-
- [TUI Monitor](#tui-monitor)
|
|
45
|
-
- [How Validation Works](#how-validation-works)
|
|
46
|
-
- [Audit Logging](#audit-logging)
|
|
47
|
-
- [Examples](#examples)
|
|
48
|
-
- [Contributing](#contributing)
|
|
49
|
-
- [Architecture](#architecture)
|
|
50
|
-
- [Development Setup](#development-setup)
|
|
51
|
-
- [Project Structure](#project-structure)
|
|
52
|
-
- [Testing](#testing)
|
|
53
|
-
- [Adding a New Audit Backend](#adding-a-new-audit-backend)
|
|
54
|
-
- [Adding Tool Extraction Support](#adding-tool-extraction-support)
|
|
55
|
-
- [Code Style](#code-style)
|
|
56
|
-
- [Roadmap](#roadmap)
|
|
57
|
-
- [About IntegSec](#about-integsec)
|
|
58
|
-
- [License](#license)
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Why This Exists
|
|
63
|
-
|
|
64
|
-
AI agents equipped with offensive security tools (nmap, sqlmap, Metasploit, etc.) can cause serious harm if they stray outside an authorized engagement scope. A misconfigured prompt or hallucinated target can turn a legitimate pentest into an unauthorized attack.
|
|
65
|
-
|
|
66
|
-
The IntegSec Agentic Pentest MCP Proxy solves this by enforcing scope at the protocol layer — not at the prompt layer. Every tool invocation is validated against a cryptographically-loadable scope manifest before it reaches the upstream MCP server. If the target, technique, or timing is wrong, the call is blocked and logged.
|
|
67
|
-
|
|
68
|
-
**No prompt engineering. No honor system. Enforcement.**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Features
|
|
74
|
-
|
|
75
|
-
- **8-step validation pipeline** — technique check, time window, target extraction, DNS resolution, exclusion check, authorization check, default deny
|
|
76
|
-
- **Fail-closed design** — DNS failures, unknown targets, and expired windows all result in blocks
|
|
77
|
-
- **19 tool extractors + smart fallback** — built-in parameter extraction for nmap, sqlmap, burp, curl, metasploit, nuclei, gobuster, ffuf, nikto, and more, with generic fallback for unknown tools
|
|
78
|
-
- **Wildcard domain matching** — `*.acme.com` matches `app.acme.com` but not `deep.sub.acme.com`
|
|
79
|
-
- **CIDR + IPv6 support** — authorize by IP range, detect RFC-1918 private ranges and cloud metadata endpoints
|
|
80
|
-
- **DNS caching with TTL** — parallel A+AAAA resolution with in-flight deduplication
|
|
81
|
-
- **Technique blocking** — categorize tools into `dos`, `destructive`, `social_engineering`, etc., with custom mappings
|
|
82
|
-
- **Parameter sanitization** — passwords, tokens, API keys, and secrets are redacted before logging
|
|
83
|
-
- **Multi-backend audit logging** — local JSONL, AWS CloudWatch, Azure Monitor, GCP Cloud Logging
|
|
84
|
-
- **Two transport modes** — stdio (child process) and HTTP (reverse proxy)
|
|
85
|
-
- **Cloud-native manifest loading** — load scope from file, env var, AWS Secrets Manager, Azure Key Vault, or GCP Secret Manager
|
|
86
|
-
- **Docker-ready** — multi-stage build, runs as non-root user
|
|
87
|
-
- **Zero runtime config files** — everything via environment variables
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Quick Start
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
# Install
|
|
95
|
-
npm install -g @integsec/agentic-pentest-proxy
|
|
96
|
-
|
|
97
|
-
# Create a scope manifest
|
|
98
|
-
cat > scope.json << 'EOF'
|
|
99
|
-
{
|
|
100
|
-
"engagement_id": "ENG-2025-0042",
|
|
101
|
-
"client": "Acme Corp",
|
|
102
|
-
"operator": "operator@yourfirm.com",
|
|
103
|
-
"authorized_targets": {
|
|
104
|
-
"ip_ranges": ["10.10.10.0/24"],
|
|
105
|
-
"domains": ["*.acme.com"],
|
|
106
|
-
"urls": [],
|
|
107
|
-
"cloud_accounts": []
|
|
108
|
-
},
|
|
109
|
-
"excluded_targets": ["hr.acme.com"],
|
|
110
|
-
"authorized_techniques": ["recon", "web_app"],
|
|
111
|
-
"excluded_techniques": ["dos", "destructive", "social_engineering"],
|
|
112
|
-
"engagement_window": {
|
|
113
|
-
"start": "2026-03-27T08:00:00Z",
|
|
114
|
-
"end": "2026-04-10T17:00:00Z"
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
EOF
|
|
118
|
-
|
|
119
|
-
# Run the proxy (stdio mode, wrapping TurboPentest MCP)
|
|
120
|
-
SCOPE_MANIFEST_PATH=./scope.json \
|
|
121
|
-
UPSTREAM_MCP_COMMAND=npx \
|
|
122
|
-
UPSTREAM_MCP_ARGS="-y,@turbopentest/mcp-server" \
|
|
123
|
-
integsec-agentic-pentest-proxy
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
The proxy will intercept all tool calls, validate targets against scope.json, and log decisions to `./audit/`.
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Installation
|
|
131
|
-
|
|
132
|
-
### npm (global)
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
npm install -g @integsec/agentic-pentest-proxy
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### npm (project-local)
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
npm install @integsec/agentic-pentest-proxy
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### From source
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
git clone https://github.com/integsec/agentic-pentest-mcp-proxy.git
|
|
148
|
-
cd agentic-pentest-mcp-proxy
|
|
149
|
-
npm install
|
|
150
|
-
npm run build
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Docker
|
|
154
|
-
|
|
155
|
-
```bash
|
|
156
|
-
docker build -t integsec-agentic-pentest-proxy .
|
|
157
|
-
docker run --rm \
|
|
158
|
-
-e SCOPE_MANIFEST_PATH=/scope.json \
|
|
159
|
-
-e MCP_TRANSPORT=sse \
|
|
160
|
-
-e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
|
|
161
|
-
-e PROXY_PORT=9090 \
|
|
162
|
-
-v ./scope.json:/scope.json:ro \
|
|
163
|
-
-p 9090:9090 \
|
|
164
|
-
integsec-agentic-pentest-proxy
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Configuration
|
|
170
|
-
|
|
171
|
-
### Scope Manifest
|
|
172
|
-
|
|
173
|
-
The scope manifest defines the boundaries of a penetration testing engagement. It is validated against a strict Zod schema on load.
|
|
174
|
-
|
|
175
|
-
```jsonc
|
|
176
|
-
{
|
|
177
|
-
// Unique engagement identifier — used in audit log filenames
|
|
178
|
-
"engagement_id": "ENG-2025-0142",
|
|
179
|
-
|
|
180
|
-
// Client and operator for audit attribution
|
|
181
|
-
"client": "Acme Corp",
|
|
182
|
-
"operator": "operator@integsec.com",
|
|
183
|
-
|
|
184
|
-
// What the AI agent IS allowed to target
|
|
185
|
-
"authorized_targets": {
|
|
186
|
-
"ip_ranges": ["10.10.10.0/24", "203.0.113.0/28"],
|
|
187
|
-
"domains": ["*.acme.com", "acme-staging.example.com"],
|
|
188
|
-
"urls": ["https://app.acme.com", "https://api.acme.com"],
|
|
189
|
-
"cloud_accounts": ["aws:123456789012"]
|
|
190
|
-
},
|
|
191
|
-
|
|
192
|
-
// Override: these are NEVER allowed even if they match above
|
|
193
|
-
"excluded_targets": ["203.0.113.5", "hr.acme.com"],
|
|
194
|
-
|
|
195
|
-
// Technique categories (for reference / future enforcement)
|
|
196
|
-
"authorized_techniques": ["recon", "web_app", "api_testing"],
|
|
197
|
-
|
|
198
|
-
// Tool categories that are always blocked
|
|
199
|
-
"excluded_techniques": ["dos", "destructive", "social_engineering"],
|
|
200
|
-
|
|
201
|
-
// Time window — calls outside this range are blocked
|
|
202
|
-
"engagement_window": {
|
|
203
|
-
"start": "2026-03-26T08:00:00Z",
|
|
204
|
-
"end": "2026-04-09T17:00:00Z"
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**Loading priority:** The proxy checks these sources in order and uses the first one found:
|
|
210
|
-
|
|
211
|
-
1. `SCOPE_MANIFEST_JSON` — inline JSON in env var
|
|
212
|
-
2. `SCOPE_MANIFEST_PATH` — path to a local JSON file
|
|
213
|
-
3. `SCOPE_MANIFEST_SECRET_ARN` — AWS Secrets Manager
|
|
214
|
-
4. `SCOPE_MANIFEST_KEYVAULT_URI` — Azure Key Vault
|
|
215
|
-
5. `SCOPE_MANIFEST_GCP_SECRET` — GCP Secret Manager
|
|
216
|
-
|
|
217
|
-
### Environment Variables
|
|
218
|
-
|
|
219
|
-
| Variable | Default | Description |
|
|
220
|
-
|----------|---------|-------------|
|
|
221
|
-
| **Manifest (one required)** | | |
|
|
222
|
-
| `SCOPE_MANIFEST_PATH` | — | Path to scope manifest JSON file |
|
|
223
|
-
| `SCOPE_MANIFEST_JSON` | — | Inline scope manifest JSON string |
|
|
224
|
-
| `SCOPE_MANIFEST_SECRET_ARN` | — | AWS Secrets Manager ARN |
|
|
225
|
-
| `SCOPE_MANIFEST_KEYVAULT_URI` | — | Azure Key Vault secret URI |
|
|
226
|
-
| `SCOPE_MANIFEST_GCP_SECRET` | — | GCP Secret Manager resource name |
|
|
227
|
-
| **Transport** | | |
|
|
228
|
-
| `MCP_TRANSPORT` | `stdio` | Transport mode: `stdio` or `sse` |
|
|
229
|
-
| `UPSTREAM_MCP_COMMAND` | — | Command to spawn upstream MCP (stdio mode) |
|
|
230
|
-
| `UPSTREAM_MCP_ARGS` | — | Comma-separated args for upstream command |
|
|
231
|
-
| `UPSTREAM_MCP_URL` | — | Upstream MCP HTTP URL (HTTP mode) |
|
|
232
|
-
| `PROXY_PORT` | `9090` | HTTP listen port (HTTP mode) |
|
|
233
|
-
| **Audit** | | |
|
|
234
|
-
| `AUDIT_LOG_PATH` | `./audit/` | Directory for local JSONL audit logs |
|
|
235
|
-
| `AWS_LOG_GROUP` | — | AWS CloudWatch log group name |
|
|
236
|
-
| `AWS_REGION` | — | AWS region for CloudWatch |
|
|
237
|
-
| `AZURE_LOG_WORKSPACE_ID` | — | Azure Log Analytics workspace ID |
|
|
238
|
-
| `AZURE_DCR_IMMUTABLE_ID` | — | Azure Data Collection Rule immutable ID |
|
|
239
|
-
| `AZURE_DCR_STREAM_NAME` | `Custom-MCPProxyAudit_CL` | Azure DCR stream name |
|
|
240
|
-
| `GOOGLE_CLOUD_PROJECT` | — | GCP project ID for Cloud Logging |
|
|
241
|
-
| **Tuning** | | |
|
|
242
|
-
| `TECHNIQUE_MAP_PATH` | — | Path to custom technique mappings JSON |
|
|
243
|
-
| `DNS_CACHE_TTL` | `60` | DNS cache TTL in seconds |
|
|
244
|
-
| `LOG_LEVEL` | `INFO` | Log verbosity |
|
|
245
|
-
| `PROXY_VERSION` | `0.1.0` | Version string in audit entries |
|
|
246
|
-
|
|
247
|
-
See [`.env.example`](.env.example) for a complete template.
|
|
248
|
-
|
|
249
|
-
### Technique Mappings
|
|
250
|
-
|
|
251
|
-
The proxy ships with built-in technique categories (`dos`, `destructive`, `social_engineering`). You can extend these with a custom mapping file:
|
|
252
|
-
|
|
253
|
-
```json
|
|
254
|
-
{
|
|
255
|
-
"wireless": {
|
|
256
|
-
"exact": ["aircrack-ng", "wifite", "kismet"],
|
|
257
|
-
"patterns": ["wifi", "wireless"]
|
|
258
|
-
},
|
|
259
|
-
"physical": {
|
|
260
|
-
"exact": ["lockpick_sim"],
|
|
261
|
-
"patterns": ["physical"]
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
Point `TECHNIQUE_MAP_PATH` at this file. Custom mappings are merged with built-in ones — they don't replace them.
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Usage
|
|
271
|
-
|
|
272
|
-
### CLI
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
# stdio mode — wrap any MCP server
|
|
276
|
-
SCOPE_MANIFEST_PATH=./scope.json \
|
|
277
|
-
UPSTREAM_MCP_COMMAND=npx \
|
|
278
|
-
UPSTREAM_MCP_ARGS="-y,@turbopentest/mcp-server" \
|
|
279
|
-
integsec-agentic-pentest-proxy
|
|
280
|
-
|
|
281
|
-
# HTTP mode — reverse proxy to a running MCP server
|
|
282
|
-
SCOPE_MANIFEST_PATH=./scope.json \
|
|
283
|
-
MCP_TRANSPORT=sse \
|
|
284
|
-
UPSTREAM_MCP_URL=http://localhost:8080 \
|
|
285
|
-
PROXY_PORT=9090 \
|
|
286
|
-
integsec-agentic-pentest-proxy
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### Claude Desktop Integration
|
|
290
|
-
|
|
291
|
-
Add to your Claude Desktop `claude_desktop_config.json`:
|
|
292
|
-
|
|
293
|
-
```json
|
|
294
|
-
{
|
|
295
|
-
"mcpServers": {
|
|
296
|
-
"turbopentest-scoped": {
|
|
297
|
-
"command": "npx",
|
|
298
|
-
"args": ["-y", "@integsec/agentic-pentest-proxy"],
|
|
299
|
-
"env": {
|
|
300
|
-
"SCOPE_MANIFEST_PATH": "/path/to/scope.json",
|
|
301
|
-
"MCP_TRANSPORT": "stdio",
|
|
302
|
-
"UPSTREAM_MCP_COMMAND": "npx",
|
|
303
|
-
"UPSTREAM_MCP_ARGS": "-y,@turbopentest/mcp-server",
|
|
304
|
-
"AUDIT_LOG_PATH": "./audit/"
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
### Claude Code Integration
|
|
312
|
-
|
|
313
|
-
Add to your `.mcp.json` or project settings:
|
|
314
|
-
|
|
315
|
-
```json
|
|
316
|
-
{
|
|
317
|
-
"mcpServers": {
|
|
318
|
-
"turbopentest-scoped": {
|
|
319
|
-
"command": "npx",
|
|
320
|
-
"args": ["-y", "@integsec/agentic-pentest-proxy"],
|
|
321
|
-
"env": {
|
|
322
|
-
"SCOPE_MANIFEST_PATH": "./scope.json",
|
|
323
|
-
"UPSTREAM_MCP_COMMAND": "npx",
|
|
324
|
-
"UPSTREAM_MCP_ARGS": "-y,@turbopentest/mcp-server"
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
### Docker
|
|
332
|
-
|
|
333
|
-
```bash
|
|
334
|
-
# HTTP mode
|
|
335
|
-
docker run --rm \
|
|
336
|
-
-e SCOPE_MANIFEST_PATH=/scope.json \
|
|
337
|
-
-e MCP_TRANSPORT=sse \
|
|
338
|
-
-e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
|
|
339
|
-
-e PROXY_PORT=9090 \
|
|
340
|
-
-v ./scope.json:/scope.json:ro \
|
|
341
|
-
-v ./audit:/app/audit \
|
|
342
|
-
-p 9090:9090 \
|
|
343
|
-
integsec-agentic-pentest-proxy
|
|
344
|
-
|
|
345
|
-
# With AWS CloudWatch
|
|
346
|
-
docker run --rm \
|
|
347
|
-
-e SCOPE_MANIFEST_SECRET_ARN=arn:aws:secretsmanager:us-east-1:123456789012:secret:scope \
|
|
348
|
-
-e MCP_TRANSPORT=sse \
|
|
349
|
-
-e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
|
|
350
|
-
-e AWS_LOG_GROUP=/integsec/mcp-proxy \
|
|
351
|
-
-e AWS_REGION=us-east-1 \
|
|
352
|
-
-p 9090:9090 \
|
|
353
|
-
integsec-agentic-pentest-proxy
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
## TUI Monitor
|
|
359
|
-
|
|
360
|
-
A real-time terminal dashboard for monitoring proxy decisions as they happen.
|
|
361
|
-
|
|
362
|
-
```bash
|
|
363
|
-
# Monitor the default audit directory
|
|
364
|
-
integsec-agentic-pentest-tui
|
|
365
|
-
|
|
366
|
-
# Monitor a specific directory
|
|
367
|
-
integsec-agentic-pentest-tui --audit-path /path/to/audit
|
|
9
|
+
1. Install the proxy:
|
|
368
10
|
|
|
369
|
-
|
|
370
|
-
integsec
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
The TUI displays three panels:
|
|
374
|
-
|
|
375
|
-
- **Engagement Header** — engagement ID, client, operator
|
|
376
|
-
- **Stats Panel** — running allowed/blocked counts, top targets, top tools
|
|
377
|
-
- **Live Feed** — color-coded scrolling decision feed (green = allowed, red = blocked)
|
|
378
|
-
|
|
379
|
-
Run the TUI in a separate terminal while the proxy is active (via Claude Desktop, Claude Code, or CLI). It tails the audit JSONL files and updates in real time.
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## How Validation Works
|
|
384
|
-
|
|
385
|
-
Every `tools/call` JSON-RPC message passes through an 8-step validation pipeline:
|
|
386
|
-
|
|
387
|
-
```
|
|
388
|
-
1. TECHNIQUE CHECK ──▶ Is the tool in an excluded_techniques category?
|
|
389
|
-
│ YES → BLOCKED_TECHNIQUE
|
|
390
|
-
▼
|
|
391
|
-
2. TIME WINDOW ──────▶ Is current time within engagement_window?
|
|
392
|
-
│ NO → BLOCKED_OUTSIDE_WINDOW
|
|
393
|
-
▼
|
|
394
|
-
3. TARGET EXTRACTION ▶ Extract hostname/IP from tool parameters
|
|
395
|
-
│ (19 tool-specific extractors + fallback params)
|
|
396
|
-
▼
|
|
397
|
-
4. NO TARGET? ───────▶ No target-like parameter found?
|
|
398
|
-
│ YES → ALLOWED_NO_TARGET
|
|
399
|
-
▼
|
|
400
|
-
5. DNS RESOLUTION ───▶ Resolve hostname to A + AAAA records
|
|
401
|
-
│ NXDOMAIN → BLOCKED_DNS_FAILED
|
|
402
|
-
▼
|
|
403
|
-
6. EXCLUSION CHECK ──▶ Does target match excluded_targets?
|
|
404
|
-
│ YES → BLOCKED_EXCLUDED_TARGET
|
|
405
|
-
▼
|
|
406
|
-
7. AUTHORIZATION ────▶ Does target match authorized_targets?
|
|
407
|
-
│ YES → ALLOWED
|
|
408
|
-
▼
|
|
409
|
-
8. DEFAULT DENY ─────▶ BLOCKED_NOT_IN_SCOPE
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
**Key design decisions:**
|
|
413
|
-
- **Exclusions beat authorizations.** If `hr.acme.com` is in `excluded_targets`, it's blocked even if `*.acme.com` is authorized.
|
|
414
|
-
- **DNS failures are blocks.** If the proxy can't resolve a hostname, it won't forward the call. Fail closed.
|
|
415
|
-
- **Private IPs require explicit authorization.** RFC-1918 ranges and cloud metadata endpoints (169.254.169.254) are only allowed if they appear in `authorized_targets.ip_ranges`.
|
|
416
|
-
- **No target = allowed.** Tools that don't operate on network targets (e.g., `list_tools`, `get_version`) pass through.
|
|
417
|
-
|
|
418
|
-
---
|
|
419
|
-
|
|
420
|
-
## Audit Logging
|
|
421
|
-
|
|
422
|
-
Every validation decision produces an audit entry:
|
|
423
|
-
|
|
424
|
-
```json
|
|
425
|
-
{
|
|
426
|
-
"timestamp": "2026-03-27T14:32:01.000Z",
|
|
427
|
-
"engagement_id": "ENG-2025-0142",
|
|
428
|
-
"client": "Acme Corp",
|
|
429
|
-
"operator": "operator@integsec.com",
|
|
430
|
-
"tool_name": "nmap_scan",
|
|
431
|
-
"tool_parameters": { "target": "10.10.10.5", "flags": "[REDACTED]" },
|
|
432
|
-
"extracted_target": "10.10.10.5",
|
|
433
|
-
"resolved_ips": ["10.10.10.5"],
|
|
434
|
-
"decision": "ALLOWED",
|
|
435
|
-
"decision_reason": "Target 10.10.10.5 matches authorized IP range 10.10.10.0/24",
|
|
436
|
-
"matched_scope_item": "10.10.10.0/24",
|
|
437
|
-
"duration_ms": 2,
|
|
438
|
-
"proxy_version": "0.1.0"
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### Backends
|
|
443
|
-
|
|
444
|
-
| Backend | Config | Format |
|
|
445
|
-
|---------|--------|--------|
|
|
446
|
-
| **Local** (always active) | `AUDIT_LOG_PATH` | JSONL files: `{engagement_id}.jsonl` |
|
|
447
|
-
| **AWS CloudWatch** | `AWS_LOG_GROUP` + `AWS_REGION` | Log events in `{engagement_id}/{date}` stream |
|
|
448
|
-
| **Azure Monitor** | `AZURE_LOG_WORKSPACE_ID` + `AZURE_DCR_IMMUTABLE_ID` | Logs Ingestion API via Data Collection Rules |
|
|
449
|
-
| **GCP Cloud Logging** | `GOOGLE_CLOUD_PROJECT` | Cloud Logging entries with severity mapping |
|
|
450
|
-
|
|
451
|
-
Multiple backends can be active simultaneously. Entries are buffered and flushed every 5 seconds. Backend failures are isolated — a CloudWatch error won't affect local logging.
|
|
452
|
-
|
|
453
|
-
### Decision Types
|
|
454
|
-
|
|
455
|
-
| Decision | Meaning |
|
|
456
|
-
|----------|---------|
|
|
457
|
-
| `ALLOWED` | Target matches an authorized scope item |
|
|
458
|
-
| `ALLOWED_NO_TARGET` | Tool has no network target parameter |
|
|
459
|
-
| `BLOCKED_TECHNIQUE` | Tool belongs to an excluded technique category |
|
|
460
|
-
| `BLOCKED_OUTSIDE_WINDOW` | Current time is outside the engagement window |
|
|
461
|
-
| `BLOCKED_EXCLUDED_TARGET` | Target is explicitly excluded |
|
|
462
|
-
| `BLOCKED_NOT_IN_SCOPE` | Target doesn't match any authorized scope item |
|
|
463
|
-
| `BLOCKED_DNS_FAILED` | DNS resolution returned no addresses |
|
|
464
|
-
|
|
465
|
-
---
|
|
466
|
-
|
|
467
|
-
## Examples
|
|
468
|
-
|
|
469
|
-
See the [`examples/`](examples/) directory for:
|
|
470
|
-
|
|
471
|
-
- **[`scope-manifest.json`](examples/scope-manifest.json)** — a real-world scope manifest
|
|
472
|
-
- **[`claude-desktop-config.json`](examples/claude-desktop-config.json)** — Claude Desktop integration config
|
|
473
|
-
- **[`technique-map.json`](examples/technique-map.json)** — custom technique category mappings
|
|
474
|
-
|
|
475
|
-
---
|
|
476
|
-
|
|
477
|
-
## Contributing
|
|
478
|
-
|
|
479
|
-
Contributions are welcome. The IntegSec Agentic Pentest MCP Proxy is an open-source project under the MIT license.
|
|
480
|
-
|
|
481
|
-
### Architecture
|
|
482
|
-
|
|
483
|
-
```
|
|
484
|
-
bin/
|
|
485
|
-
integsec-agentic-pentest-proxy.ts CLI entry point — loads config, manifest, starts transport
|
|
486
|
-
|
|
487
|
-
src/
|
|
488
|
-
proxy.ts ScopeEnforcementProxy — core orchestrator
|
|
489
|
-
validator.ts ScopeValidator — 8-step validation pipeline
|
|
490
|
-
extractor.ts Target extraction from tool parameters (19 tools + fallback)
|
|
491
|
-
domain-matcher.ts Wildcard and exact domain matching
|
|
492
|
-
ip-matcher.ts CIDR matching, RFC-1918 detection
|
|
493
|
-
dns-resolver.ts Caching DNS resolver with deduplication
|
|
494
|
-
technique-checker.ts Tool → technique category mapping
|
|
495
|
-
sanitizer.ts Parameter redaction for audit logs
|
|
496
|
-
manifest.ts Manifest loading (file, env, AWS, Azure, GCP)
|
|
497
|
-
manifest-schema.ts Zod schema for scope manifest
|
|
498
|
-
config.ts Environment variable loader
|
|
499
|
-
types.ts TypeScript type definitions
|
|
500
|
-
|
|
501
|
-
audit/
|
|
502
|
-
index.ts AuditLogger facade — manages multiple backends
|
|
503
|
-
local.ts Local JSONL file logger
|
|
504
|
-
cloudwatch.ts AWS CloudWatch backend
|
|
505
|
-
azure-monitor.ts Azure Monitor backend
|
|
506
|
-
gcp-logging.ts GCP Cloud Logging backend
|
|
507
|
-
|
|
508
|
-
transports/
|
|
509
|
-
stdio.ts stdio transport — spawns upstream as child process
|
|
510
|
-
http.ts HTTP reverse proxy transport
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
### Development Setup
|
|
514
|
-
|
|
515
|
-
```bash
|
|
516
|
-
# Clone the repo
|
|
517
|
-
git clone https://github.com/integsec/agentic-pentest-mcp-proxy.git
|
|
518
|
-
cd agentic-pentest-mcp-proxy
|
|
519
|
-
|
|
520
|
-
# Install dependencies
|
|
521
|
-
npm install
|
|
522
|
-
|
|
523
|
-
# Build
|
|
524
|
-
npm run build
|
|
525
|
-
|
|
526
|
-
# Run tests
|
|
527
|
-
npm test
|
|
528
|
-
|
|
529
|
-
# Watch mode (rebuild on change)
|
|
530
|
-
npm run dev
|
|
531
|
-
|
|
532
|
-
# Type check without emitting
|
|
533
|
-
npm run lint
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
**Requirements:**
|
|
537
|
-
- Node.js >= 20.0.0
|
|
538
|
-
- npm >= 9
|
|
539
|
-
|
|
540
|
-
### Project Structure
|
|
541
|
-
|
|
542
|
-
The codebase follows these principles:
|
|
543
|
-
|
|
544
|
-
- **Pure TypeScript, ES modules** — no CommonJS, no bundler
|
|
545
|
-
- **Zod for runtime validation** — all external data is schema-validated
|
|
546
|
-
- **Fail-closed security** — when in doubt, block
|
|
547
|
-
- **Isolated backends** — failures in one audit backend never affect others
|
|
548
|
-
- **No classes where functions suffice** — classes only for stateful components (DnsResolver, AuditLogger, ScopeEnforcementProxy)
|
|
549
|
-
- **No external HTTP framework** — uses Node.js built-in `http` module for the HTTP transport
|
|
550
|
-
|
|
551
|
-
### Testing
|
|
552
|
-
|
|
553
|
-
Tests use [Vitest](https://vitest.dev/) and are organized into unit and integration suites.
|
|
554
|
-
|
|
555
|
-
```bash
|
|
556
|
-
# Run all tests
|
|
557
|
-
npm test
|
|
558
|
-
|
|
559
|
-
# Run tests in watch mode
|
|
560
|
-
npm run test:watch
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g @integsec/agentic-pentest-proxy
|
|
13
|
+
```
|
|
561
14
|
|
|
562
|
-
|
|
563
|
-
npx vitest run tests/unit/validator.test.ts
|
|
564
|
-
```
|
|
15
|
+
2. Create a scope manifest with the guided wizard:
|
|
565
16
|
|
|
566
|
-
|
|
17
|
+
```bash
|
|
18
|
+
integsec-agentic-pentest-manifest new -o scope.json
|
|
19
|
+
```
|
|
567
20
|
|
|
568
|
-
|
|
569
|
-
tests/
|
|
570
|
-
unit/
|
|
571
|
-
validator.test.ts Validation pipeline (comprehensive)
|
|
572
|
-
extractor.test.ts Target extraction for 19 tools + fallback
|
|
573
|
-
domain-matcher.test.ts Domain pattern matching
|
|
574
|
-
ip-matcher.test.ts CIDR and private IP detection
|
|
575
|
-
dns-resolver.test.ts DNS caching and deduplication
|
|
576
|
-
manifest-schema.test.ts Scope manifest schema validation
|
|
577
|
-
manifest.test.ts Manifest loading from all sources
|
|
578
|
-
technique-checker.test.ts Technique categorization
|
|
579
|
-
sanitizer.test.ts Parameter redaction
|
|
580
|
-
audit-local.test.ts Local audit file writing
|
|
581
|
-
smoke.test.ts Module import sanity check
|
|
582
|
-
integration/
|
|
583
|
-
proxy.test.ts Full message flow through proxy
|
|
584
|
-
fixtures/
|
|
585
|
-
scope-valid.json Valid scope manifest
|
|
586
|
-
scope-expired.json Expired scope manifest
|
|
587
|
-
tool-calls.json Sample JSON-RPC messages
|
|
588
|
-
```
|
|
21
|
+
Set the real engagement targets and time window. Review the generated file with the engagement owner before using it.
|
|
589
22
|
|
|
590
|
-
**
|
|
591
|
-
- Every new module should have a corresponding test file in `tests/unit/`
|
|
592
|
-
- Use the fixtures in `tests/fixtures/` for scope manifests and tool call payloads
|
|
593
|
-
- Mock DNS and cloud SDKs in unit tests; integration tests use the full proxy
|
|
594
|
-
- Aim for edge cases: invalid inputs, boundary conditions, Unicode domains, IPv6, etc.
|
|
23
|
+
3. Generate a client entry for **each** MCP tool. Put the tool's normal launch command after `--`:
|
|
595
24
|
|
|
596
|
-
|
|
25
|
+
```bash
|
|
26
|
+
integsec-agentic-pentest-setup --name scanner-scoped --manifest ./scope.json -- npx -y @example/scanner-mcp
|
|
27
|
+
```
|
|
597
28
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
29
|
+
Replace `npx -y @example/scanner-mcp` with the command from your tool's own setup instructions. The command prints an `mcpServers` entry. Paste that entry into your MCP client's configuration and restart the client. To add another tool, run setup again with a new `--name`, then add its entry under the same `mcpServers` object.
|
|
30
|
+
|
|
31
|
+
For example, the generated entry has this shape (the setup command fills in your actual manifest and audit paths):
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"mcpServers": {
|
|
36
|
+
"scanner-scoped": {
|
|
37
|
+
"command": "integsec-agentic-pentest-proxy",
|
|
38
|
+
"env": {
|
|
39
|
+
"SCOPE_MANIFEST_PATH": "/path/to/scope.json",
|
|
40
|
+
"MCP_TRANSPORT": "stdio",
|
|
41
|
+
"AUDIT_LOG_PATH": "/path/to/audit",
|
|
42
|
+
"UPSTREAM_MCP_COMMAND": "npx",
|
|
43
|
+
"UPSTREAM_MCP_ARGS_JSON": "[\"-y\",\"@example/scanner-mcp\"]"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
603
47
|
}
|
|
604
48
|
```
|
|
605
|
-
2. Add it to the AuditLogger in `bin/integsec-agentic-pentest-proxy.ts` when the relevant env vars are set.
|
|
606
|
-
3. Add a unit test in `tests/unit/audit-your-backend.test.ts`.
|
|
607
|
-
4. Document the env vars in this README and `.env.example`.
|
|
608
|
-
|
|
609
|
-
### Adding Tool Extraction Support
|
|
610
|
-
|
|
611
|
-
To add target extraction for a new tool, edit `src/extractor.ts`:
|
|
612
|
-
|
|
613
|
-
1. Add the tool name to the `TOOL_MAPPINGS` array with its target parameter name(s).
|
|
614
|
-
2. If the tool uses a non-standard parameter format, add a case to the extraction logic.
|
|
615
|
-
3. Add test cases in `tests/unit/extractor.test.ts`.
|
|
616
|
-
|
|
617
|
-
### Code Style
|
|
618
|
-
|
|
619
|
-
- TypeScript strict mode
|
|
620
|
-
- No `any` types — use `unknown` and narrow
|
|
621
|
-
- Explicit return types on exported functions
|
|
622
|
-
- No default exports — use named exports
|
|
623
|
-
- Keep functions small and focused
|
|
624
|
-
- Security-sensitive code gets extra test coverage
|
|
625
|
-
|
|
626
|
-
---
|
|
627
|
-
|
|
628
|
-
## Roadmap
|
|
629
49
|
|
|
630
|
-
|
|
50
|
+
Use the `mcpServers` block in Claude Desktop's MCP configuration or in your Claude Code project's `.mcp.json`. Other MCP clients may label the server settings differently; use the generated command and environment variables in their equivalent fields. The proxy starts when the client launches the tool.
|
|
631
51
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
- [ ] **Signed scope manifests** — Ed25519 signatures on manifests to prevent tampering, with key pinning
|
|
635
|
-
- [ ] **Manifest hot-reload** — watch manifest file for changes and reload without restart
|
|
636
|
-
- [ ] **Scope manifest v2 schema** — add per-tool overrides, port ranges, protocol restrictions, and path-level URL scoping
|
|
637
|
-
- [ ] **Rate limiting** — per-tool and per-target rate limits to prevent runaway agents
|
|
638
|
-
- [ ] **Metrics endpoint** — Prometheus `/metrics` with counters for allowed/blocked decisions, latency histograms
|
|
639
|
-
- [ ] **WebSocket transport** — support MCP over WebSocket for persistent connections
|
|
640
|
-
- [ ] **Plugin system for validators** — allow custom validation steps via a plugin interface
|
|
52
|
+
4. Watch decisions in another terminal:
|
|
641
53
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
54
|
+
```bash
|
|
55
|
+
integsec-agentic-pentest-tui --audit-path ./audit
|
|
56
|
+
```
|
|
645
57
|
|
|
646
|
-
|
|
647
|
-
- [ ] **Request modification** — edit tool parameters before forwarding (e.g., add `--safe-mode` flags, restrict scan intensity)
|
|
648
|
-
- [ ] **Response modification** — filter or transform upstream responses before they reach the AI agent
|
|
649
|
-
- [ ] **Replay engine** — capture and replay tool call sequences for testing and training
|
|
650
|
-
- [ ] **Match & replace rules** — regex-based rules to automatically rewrite parameters (e.g., replace hostnames, inject headers)
|
|
651
|
-
- [ ] **Breakpoints** — conditional breakpoints on tool name, target, technique, or parameter patterns
|
|
652
|
-
- [ ] **Interception history** — searchable log of all intercepted, modified, forwarded, and dropped messages
|
|
653
|
-
- [ ] **Scope diff viewer** — visual diff showing what the agent requested vs. what was actually forwarded
|
|
654
|
-
- [ ] **Redirection engine** — reroute tool calls to alternative targets (e.g., redirect production targets to staging, honeypots, or simulation environments)
|
|
655
|
-
- [ ] **Upstream multiplexing** — forward a single tool call to multiple upstream servers simultaneously for comparison or redundancy
|
|
58
|
+
Setup prints the exact audit path to use. If your shell is in another directory, use that printed path. For a one-off TUI without a global install:
|
|
656
59
|
|
|
657
|
-
|
|
60
|
+
```bash
|
|
61
|
+
npm exec --yes --package=@integsec/agentic-pentest-proxy -- integsec-agentic-pentest-tui --audit-path ./audit
|
|
62
|
+
```
|
|
658
63
|
|
|
659
|
-
|
|
64
|
+
The TUI reads local audit files; it does not start the proxy. [See TUI screenshots](docs/tui.md).
|
|
660
65
|
|
|
661
|
-
|
|
662
|
-
- [ ] **Scope summary panel** — display active engagement info, authorized targets, and time window countdown
|
|
663
|
-
- [ ] **Audit log viewer** — browse and filter audit entries with keyboard navigation
|
|
664
|
-
- [ ] **Intercept queue** — review, approve, modify, or drop pending intercepted tool calls from the TUI
|
|
665
|
-
- [ ] **Target heatmap** — ASCII visualization of which targets are being hit and how often
|
|
666
|
-
- [ ] **Technique breakdown** — live stats on tool categories being used
|
|
667
|
-
- [ ] **Session management** — start, pause, resume, and terminate proxy sessions
|
|
668
|
-
- [ ] **Keyboard shortcuts** — vim-style bindings for rapid navigation
|
|
669
|
-
- [ ] **Multi-pane layout** — configurable split views (decisions + audit + intercept queue)
|
|
670
|
-
- [ ] **Dark/light themes** — because terminal aesthetics matter
|
|
66
|
+

|
|
671
67
|
|
|
672
|
-
|
|
68
|
+
## Other MCP tool types
|
|
673
69
|
|
|
674
|
-
|
|
70
|
+
| Tool connection | What to do |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| **stdio** tool launched by a command | Use the setup command above with `-- <command> [args...]`. |
|
|
73
|
+
| **SSE** upstream already listening, such as Burp Suite | Use `integsec-agentic-pentest-setup --name burp-scoped --manifest ./scope.json --sse http://127.0.0.1:9876`. |
|
|
74
|
+
| **HTTP** upstream | Run the proxy as an HTTP service and point your MCP client at it. [HTTP and Docker guide](docs/integrations.md#http-and-docker). |
|
|
675
75
|
|
|
676
|
-
|
|
677
|
-
- [ ] **Scope manifest editor** — visual editor with validation, preview, and version history
|
|
678
|
-
- [ ] **Audit explorer** — filterable, sortable table of all audit entries with export (CSV, JSON)
|
|
679
|
-
- [ ] **Intercept workspace** — browser-based intercept, modify, and forward interface with syntax highlighting
|
|
680
|
-
- [ ] **Request/response inspector** — detailed view of tool call parameters, extracted targets, DNS results, and validation steps
|
|
681
|
-
- [ ] **Engagement timeline** — chronological visualization of all tool calls with scope boundary overlay
|
|
682
|
-
- [ ] **Team collaboration** — multi-user access with role-based permissions (operator, reviewer, read-only)
|
|
683
|
-
- [ ] **Engagement management** — create, clone, archive, and compare scope manifests across engagements
|
|
684
|
-
- [ ] **Alert rules** — configurable notifications (email, Slack, webhook) on scope violations or anomalous patterns
|
|
685
|
-
- [ ] **Report generation** — exportable engagement summary with decision statistics, target coverage, and compliance evidence
|
|
686
|
-
- [ ] **API** — REST/GraphQL API for programmatic access to all GUI features
|
|
76
|
+
Use one generated client entry per upstream tool. A single scope manifest can be shared by several entries; each call still gets checked. [More client examples](docs/integrations.md).
|
|
687
77
|
|
|
688
|
-
|
|
78
|
+
## What gets checked
|
|
689
79
|
|
|
690
|
-
|
|
80
|
+
The proxy checks MCP `tools/call` arguments it can inspect. It blocks unknown target-bearing arguments, out-of-scope targets, explicit exclusions, restricted techniques, expired engagement windows, and free-form commands by default. DNS names authorized through IP ranges must resolve entirely inside the allowed ranges. Local JSONL auditing is always on; cloud logging is optional.
|
|
691
81
|
|
|
692
|
-
|
|
693
|
-
- [ ] **Scope profiles** — each server publishes a scope profile declaring what targets/techniques it can affect
|
|
694
|
-
- [ ] **One-click install** — install and configure MCP servers with automatic scope proxy wrapping
|
|
695
|
-
- [ ] **Compatibility matrix** — which servers work with which AI agents (Claude, GPT, local LLMs)
|
|
696
|
-
- [ ] **Community submissions** — submit and review MCP servers with quality ratings and security audits
|
|
697
|
-
- [ ] **Technique taxonomy** — standardized technique categories (aligned with MITRE ATT&CK) for cross-server filtering
|
|
698
|
-
- [ ] **Composite workflows** — chain multiple MCP servers into multi-stage attack workflows with per-stage scope constraints
|
|
699
|
-
- [ ] **Sandboxed preview** — try MCP servers against a built-in vulnerable target before deploying
|
|
700
|
-
- [ ] **License and compliance metadata** — track licensing, data handling, and compliance requirements per server
|
|
701
|
-
- [ ] **Version management** — pin server versions, get update notifications, and review changelogs
|
|
82
|
+
The proxy cannot control destinations selected inside an upstream tool, HTTP redirects, targets read from files or encoded payloads, DNS changes after validation, or traffic that bypasses MCP. Use network egress controls and review each upstream tool's schema before relying on the proxy for an engagement. [Security model](docs/security.md).
|
|
702
83
|
|
|
703
|
-
|
|
84
|
+
## Install and release options
|
|
704
85
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
- [ ] **Engagement templates** — pre-built scope manifests for common engagement types (web app, internal network, cloud, API)
|
|
712
|
-
- [ ] **SDK / library mode** — import scope validation as a library into custom agent frameworks without running a proxy
|
|
713
|
-
- [ ] **CI/CD integration** — validate scope manifests in CI pipelines, run automated scope compliance checks
|
|
86
|
+
| Option | Command or image |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| Global npm install | `npm install -g @integsec/agentic-pentest-proxy` |
|
|
89
|
+
| Project install | `npm install @integsec/agentic-pentest-proxy` |
|
|
90
|
+
| GHCR image | `ghcr.io/integsec/agentic-pentest-proxy:latest` |
|
|
91
|
+
| Docker Hub image | `integsec/agentic-pentest-mcp-proxy:latest` |
|
|
714
92
|
|
|
715
|
-
|
|
93
|
+
The npm package includes the proxy, manifest builder, setup helper, and TUI executables. To see the optional install welcome banner, add `--foreground-scripts`; npm hides package install-script output by default. You can always run `integsec-agentic-pentest-proxy --help` for the same next steps. The welcome script does not access the network or modify files.
|
|
716
94
|
|
|
717
|
-
|
|
718
|
-
- **Hardware security module (HSM) support** — store manifest signing keys in HSMs
|
|
719
|
-
- **Air-gapped mode** — offline operation with pre-loaded manifests and local-only audit
|
|
720
|
-
- **Agent scoring** — track per-agent compliance rates and generate trust scores over time
|
|
95
|
+
Google Cloud logging and Secret Manager SDKs are opt-in to keep the default install lean and free of their deprecated transitive package. If you use either GCP backend, install the SDKs alongside the proxy:
|
|
721
96
|
|
|
722
|
-
|
|
97
|
+
```bash
|
|
98
|
+
npm install -g @integsec/agentic-pentest-proxy @google-cloud/logging @google-cloud/secret-manager
|
|
99
|
+
```
|
|
723
100
|
|
|
724
|
-
|
|
101
|
+
AWS and Azure SDKs are included as optional dependencies. See [configuration and cloud setup](docs/configuration.md) for the required environment variables and Docker notes.
|
|
102
|
+
If you use GCP and are upgrading from 0.2.6, install the GCP SDKs before restarting the proxy; it now reports a missing Cloud Logging SDK at startup.
|
|
725
103
|
|
|
726
|
-
|
|
104
|
+
## Troubleshooting
|
|
727
105
|
|
|
728
|
-
|
|
106
|
+
| Symptom | Check |
|
|
107
|
+
| --- | --- |
|
|
108
|
+
| Tool does not appear in your MCP client | Paste the generated entry inside one `mcpServers` object, restart the client, and confirm the client can run `integsec-agentic-pentest-proxy`. |
|
|
109
|
+
| TUI shows no decisions | Start a tool call, then use the exact audit path printed by setup. The TUI and client may have different working directories. |
|
|
110
|
+
| Call is blocked | Check the decision and reason in the TUI or audit JSONL. Confirm the target, exclusions, technique, and window in your manifest. |
|
|
111
|
+
| GCP backend says its SDK is missing | Install the two GCP packages shown above alongside the proxy. |
|
|
112
|
+
| Need all CLI options | Run `integsec-agentic-pentest-proxy --help`, `integsec-agentic-pentest-setup --help`, `integsec-agentic-pentest-manifest --help`, or `integsec-agentic-pentest-tui --help`. |
|
|
729
113
|
|
|
730
|
-
|
|
731
|
-
- **[Adversary Simulation & Red Teaming](https://integsec.com/redteaming)** — real-world attack simulations to evaluate your security posture
|
|
732
|
-
- **LLM Red Teaming** — security testing for AI/LLM applications
|
|
733
|
-
- **OWASP Reviews** — structured assessments aligned with OWASP Testing Guides
|
|
734
|
-
- **Offensive Cybersecurity Training** — level up your team's security skills
|
|
735
|
-
|
|
736
|
-
### TurboPentest
|
|
737
|
-
|
|
738
|
-
**[TurboPentest](https://turbopentest.com)** is our agentic penetration testing platform. Paladin AI agents powered by Claude orchestrate 15 professional security tools — Nmap, OWASP ZAP, Nuclei, Nikto, Subfinder, FFUF, OpenVAS, Semgrep, and more — to deliver comprehensive security assessments in under 4 hours.
|
|
114
|
+
## Reference
|
|
739
115
|
|
|
740
|
-
-
|
|
741
|
-
-
|
|
742
|
-
-
|
|
743
|
-
-
|
|
744
|
-
-
|
|
745
|
-
|
|
746
|
-
> **Need human expertise + AI speed?** [Contact IntegSec](https://integsec.com) for expert-led pentesting backed by the same AI agents that power TurboPentest.
|
|
747
|
-
|
|
748
|
-
---
|
|
116
|
+
- [Configuration and manifest fields](docs/configuration.md)
|
|
117
|
+
- [Client integrations, HTTP, and Docker](docs/integrations.md)
|
|
118
|
+
- [TUI usage and screenshots](docs/tui.md)
|
|
119
|
+
- [Security model and limitations](docs/security.md)
|
|
120
|
+
- [Contributing and development](docs/development.md)
|
|
749
121
|
|
|
750
122
|
## License
|
|
751
123
|
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
---
|
|
755
|
-
|
|
756
|
-
Built by **[IntegSec](https://integsec.com)** | **[TurboPentest](https://turbopentest.com)** | [GitHub](https://github.com/integsec) | [Twitter](https://x.com/integ_sec)
|
|
124
|
+
Apache-2.0. See [LICENSE](LICENSE).
|