@integsec/agentic-pentest-proxy 0.2.4 → 0.2.6

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.
Files changed (146) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +250 -54
  3. package/dist/bin/integsec-agentic-pentest-manifest.d.ts +3 -0
  4. package/dist/bin/integsec-agentic-pentest-manifest.d.ts.map +1 -0
  5. package/dist/bin/integsec-agentic-pentest-manifest.js +180 -0
  6. package/dist/bin/integsec-agentic-pentest-manifest.js.map +1 -0
  7. package/dist/bin/integsec-agentic-pentest-proxy.d.ts +1 -1
  8. package/dist/bin/integsec-agentic-pentest-proxy.d.ts.map +1 -1
  9. package/dist/bin/integsec-agentic-pentest-proxy.js +16 -4
  10. package/dist/bin/integsec-agentic-pentest-proxy.js.map +1 -1
  11. package/dist/src/audit/azure-monitor.d.ts +2 -2
  12. package/dist/src/audit/azure-monitor.d.ts.map +1 -1
  13. package/dist/src/audit/azure-monitor.js +8 -5
  14. package/dist/src/audit/azure-monitor.js.map +1 -1
  15. package/dist/src/audit/cloudwatch.d.ts.map +1 -1
  16. package/dist/src/audit/cloudwatch.js.map +1 -1
  17. package/dist/src/audit/gcp-logging.d.ts.map +1 -1
  18. package/dist/src/audit/gcp-logging.js +4 -6
  19. package/dist/src/audit/gcp-logging.js.map +1 -1
  20. package/dist/src/audit/index.d.ts +7 -0
  21. package/dist/src/audit/index.d.ts.map +1 -1
  22. package/dist/src/audit/index.js +11 -1
  23. package/dist/src/audit/index.js.map +1 -1
  24. package/dist/src/audit/local.d.ts.map +1 -1
  25. package/dist/src/audit/local.js +2 -1
  26. package/dist/src/audit/local.js.map +1 -1
  27. package/dist/src/builder/dry-run.d.ts +12 -0
  28. package/dist/src/builder/dry-run.d.ts.map +1 -0
  29. package/dist/src/builder/dry-run.js +103 -0
  30. package/dist/src/builder/dry-run.js.map +1 -0
  31. package/dist/src/builder/manifest-writer.d.ts +7 -0
  32. package/dist/src/builder/manifest-writer.d.ts.map +1 -0
  33. package/dist/src/builder/manifest-writer.js +17 -0
  34. package/dist/src/builder/manifest-writer.js.map +1 -0
  35. package/dist/src/builder/review-display.d.ts +10 -0
  36. package/dist/src/builder/review-display.d.ts.map +1 -0
  37. package/dist/src/builder/review-display.js +55 -0
  38. package/dist/src/builder/review-display.js.map +1 -0
  39. package/dist/src/builder/smart-validator.d.ts +39 -0
  40. package/dist/src/builder/smart-validator.d.ts.map +1 -0
  41. package/dist/src/builder/smart-validator.js +157 -0
  42. package/dist/src/builder/smart-validator.js.map +1 -0
  43. package/dist/src/builder/steps/domains.d.ts +10 -0
  44. package/dist/src/builder/steps/domains.d.ts.map +1 -0
  45. package/dist/src/builder/steps/domains.js +71 -0
  46. package/dist/src/builder/steps/domains.js.map +1 -0
  47. package/dist/src/builder/steps/engagement-info.d.ts +17 -0
  48. package/dist/src/builder/steps/engagement-info.d.ts.map +1 -0
  49. package/dist/src/builder/steps/engagement-info.js +49 -0
  50. package/dist/src/builder/steps/engagement-info.js.map +1 -0
  51. package/dist/src/builder/steps/engagement-window.d.ts +15 -0
  52. package/dist/src/builder/steps/engagement-window.d.ts.map +1 -0
  53. package/dist/src/builder/steps/engagement-window.js +57 -0
  54. package/dist/src/builder/steps/engagement-window.js.map +1 -0
  55. package/dist/src/builder/steps/exclusions.d.ts +13 -0
  56. package/dist/src/builder/steps/exclusions.d.ts.map +1 -0
  57. package/dist/src/builder/steps/exclusions.js +57 -0
  58. package/dist/src/builder/steps/exclusions.js.map +1 -0
  59. package/dist/src/builder/steps/ip-ranges.d.ts +10 -0
  60. package/dist/src/builder/steps/ip-ranges.d.ts.map +1 -0
  61. package/dist/src/builder/steps/ip-ranges.js +64 -0
  62. package/dist/src/builder/steps/ip-ranges.js.map +1 -0
  63. package/dist/src/builder/steps/review.d.ts +10 -0
  64. package/dist/src/builder/steps/review.d.ts.map +1 -0
  65. package/dist/src/builder/steps/review.js +29 -0
  66. package/dist/src/builder/steps/review.js.map +1 -0
  67. package/dist/src/builder/steps/techniques.d.ts +13 -0
  68. package/dist/src/builder/steps/techniques.d.ts.map +1 -0
  69. package/dist/src/builder/steps/techniques.js +68 -0
  70. package/dist/src/builder/steps/techniques.js.map +1 -0
  71. package/dist/src/builder/steps/urls-and-cloud.d.ts +15 -0
  72. package/dist/src/builder/steps/urls-and-cloud.d.ts.map +1 -0
  73. package/dist/src/builder/steps/urls-and-cloud.js +53 -0
  74. package/dist/src/builder/steps/urls-and-cloud.js.map +1 -0
  75. package/dist/src/builder/web/api.d.ts +9 -0
  76. package/dist/src/builder/web/api.d.ts.map +1 -0
  77. package/dist/src/builder/web/api.js +40 -0
  78. package/dist/src/builder/web/api.js.map +1 -0
  79. package/dist/src/builder/web/client-form.html +222 -0
  80. package/dist/src/builder/web/server.d.ts +14 -0
  81. package/dist/src/builder/web/server.d.ts.map +1 -0
  82. package/dist/src/builder/web/server.js +85 -0
  83. package/dist/src/builder/web/server.js.map +1 -0
  84. package/dist/src/builder/wizard.d.ts +9 -0
  85. package/dist/src/builder/wizard.d.ts.map +1 -0
  86. package/dist/src/builder/wizard.js +49 -0
  87. package/dist/src/builder/wizard.js.map +1 -0
  88. package/dist/src/config.d.ts +11 -1
  89. package/dist/src/config.d.ts.map +1 -1
  90. package/dist/src/config.js +15 -2
  91. package/dist/src/config.js.map +1 -1
  92. package/dist/src/dns-resolver.d.ts +10 -1
  93. package/dist/src/dns-resolver.d.ts.map +1 -1
  94. package/dist/src/dns-resolver.js +41 -3
  95. package/dist/src/dns-resolver.js.map +1 -1
  96. package/dist/src/extractor.d.ts +12 -0
  97. package/dist/src/extractor.d.ts.map +1 -1
  98. package/dist/src/extractor.js +386 -0
  99. package/dist/src/extractor.js.map +1 -1
  100. package/dist/src/index.d.ts +1 -1
  101. package/dist/src/index.js +1 -1
  102. package/dist/src/ip-matcher.d.ts +23 -0
  103. package/dist/src/ip-matcher.d.ts.map +1 -1
  104. package/dist/src/ip-matcher.js +96 -23
  105. package/dist/src/ip-matcher.js.map +1 -1
  106. package/dist/src/manifest-schema.d.ts +12 -62
  107. package/dist/src/manifest-schema.d.ts.map +1 -1
  108. package/dist/src/manifest.d.ts +6 -0
  109. package/dist/src/manifest.d.ts.map +1 -1
  110. package/dist/src/manifest.js +21 -6
  111. package/dist/src/manifest.js.map +1 -1
  112. package/dist/src/proxy.d.ts +19 -4
  113. package/dist/src/proxy.d.ts.map +1 -1
  114. package/dist/src/proxy.js +111 -33
  115. package/dist/src/proxy.js.map +1 -1
  116. package/dist/src/safe-filename.d.ts +3 -0
  117. package/dist/src/safe-filename.d.ts.map +1 -0
  118. package/dist/src/safe-filename.js +8 -0
  119. package/dist/src/safe-filename.js.map +1 -0
  120. package/dist/src/sanitizer.d.ts.map +1 -1
  121. package/dist/src/sanitizer.js +36 -10
  122. package/dist/src/sanitizer.js.map +1 -1
  123. package/dist/src/technique-checker.d.ts +14 -0
  124. package/dist/src/technique-checker.d.ts.map +1 -1
  125. package/dist/src/technique-checker.js +123 -2
  126. package/dist/src/technique-checker.js.map +1 -1
  127. package/dist/src/transports/http.d.ts +6 -2
  128. package/dist/src/transports/http.d.ts.map +1 -1
  129. package/dist/src/transports/http.js +101 -13
  130. package/dist/src/transports/http.js.map +1 -1
  131. package/dist/src/transports/sse.d.ts +13 -0
  132. package/dist/src/transports/sse.d.ts.map +1 -0
  133. package/dist/src/transports/sse.js +161 -0
  134. package/dist/src/transports/sse.js.map +1 -0
  135. package/dist/src/transports/stdio.d.ts +2 -2
  136. package/dist/src/transports/stdio.d.ts.map +1 -1
  137. package/dist/src/transports/stdio.js +77 -48
  138. package/dist/src/transports/stdio.js.map +1 -1
  139. package/dist/src/types.d.ts +1 -1
  140. package/dist/src/types.d.ts.map +1 -1
  141. package/dist/src/validator.d.ts +19 -28
  142. package/dist/src/validator.d.ts.map +1 -1
  143. package/dist/src/validator.js +315 -113
  144. package/dist/src/validator.js.map +1 -1
  145. package/examples/claude-desktop-burp-config.json +6 -6
  146. package/package.json +21 -11
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # IntegSec Agentic Pentest MCP Proxy
1
+ # IntegSec Agentic Pentest Proxy
2
2
 
3
3
  **Scope enforcement proxy for AI-driven penetration testing.**
4
4
 
5
- The IntegSec Agentic Pentest MCP Proxy sits between an AI agent (Claude, GPT, etc.) and an MCP tool server ([TurboPentest](https://turbopentest.com), Nuclei MCP, etc.), intercepting every tool call and validating it against a scope manifest before it reaches the upstream server. Out-of-scope targets, banned techniques, and expired engagement windows are blocked in real time with a full audit trail.
5
+ The IntegSec Agentic Pentest MCP Proxy sits between an AI agent (Claude, GPT, etc.) and an MCP tool server ([TurboPentest](https://turbopentest.com), Nuclei MCP, etc.), checking MCP `tools/call` requests against a scope manifest before forwarding them. It blocks targets, techniques, and engagement times it can identify as unauthorized and writes audit decisions locally.
6
6
 
7
7
  Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testing and threat simulation for modern organizations moving at AI speed.
8
8
 
@@ -21,14 +21,16 @@ Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testin
21
21
  +-----------+
22
22
  ```
23
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.
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. Use this proxy with MCP servers like Burp Suite, Kali MCP, Nmap, and more for scope-safe autonomous testing.
25
25
 
26
26
  ---
27
27
 
28
28
  ## Table of Contents
29
29
 
30
30
  - [Why This Exists](#why-this-exists)
31
+ - [Security Boundaries](#security-boundaries)
31
32
  - [Features](#features)
33
+ - [Supported MCP Servers](#supported-mcp-servers)
32
34
  - [Quick Start](#quick-start)
33
35
  - [Installation](#installation)
34
36
  - [Configuration](#configuration)
@@ -39,12 +41,14 @@ Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testin
39
41
  - [CLI](#cli)
40
42
  - [Claude Desktop Integration](#claude-desktop-integration)
41
43
  - [Claude Code Integration](#claude-code-integration)
44
+ - [Burp Suite Integration](#burp-suite-integration)
42
45
  - [Docker](#docker)
43
46
  - [HTTP Mode](#http-mode)
44
47
  - [TUI Monitor](#tui-monitor)
45
48
  - [How Validation Works](#how-validation-works)
46
49
  - [Audit Logging](#audit-logging)
47
50
  - [Examples](#examples)
51
+ - [Manifest Builder](#manifest-builder)
48
52
  - [Contributing](#contributing)
49
53
  - [Architecture](#architecture)
50
54
  - [Development Setup](#development-setup)
@@ -63,17 +67,24 @@ Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testin
63
67
 
64
68
  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
69
 
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.
70
+ The IntegSec Agentic Pentest MCP Proxy enforces scope at the protocol layer. Every tool invocation is checked against a scope manifest before it reaches the upstream MCP server. If the target, technique, or timing is wrong, the call is blocked and logged.
67
71
 
68
72
  **No prompt engineering. No honor system. Enforcement.**
69
73
 
74
+ ## Security Boundaries
75
+
76
+ The proxy checks the arguments it can see in MCP `tools/call` requests. It cannot control destinations chosen inside an upstream tool, HTTP redirects, DNS changes between validation and execution, targets read from files or encoded payloads, or traffic that bypasses MCP. Use network egress controls and review each upstream tool's schema before relying on this proxy for an engagement. Keep free-form commands disabled with the default `ALLOW_UNSTRUCTURED_COMMANDS=false`.
77
+
78
+ Cloud logging failures do not stop tool calls. Monitor the writable local audit directory and alert on logging errors. For remote HTTP clients, place the proxy behind TLS and set `PROXY_AUTH_TOKEN`.
79
+
70
80
 
71
81
  ---
72
82
 
73
83
  ## Features
74
84
 
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
85
+ - **Multi-stage validation pipeline** — request shape, technique, time window, target extraction, CIDR containment, DNS resolution, exclusion, authorization, default deny
86
+ - **Every target checked** — arrays, comma/space-separated lists, nested option objects, and `host:port` values are checked; free-form commands are blocked by default
87
+ - **Fail-closed design** — DNS failures, malformed requests, unparseable JSON, internal errors and expired windows all result in blocks; JSON-RPC batches are checked element by element
77
88
  - **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
89
  - **Wildcard domain matching** — `*.acme.com` matches `app.acme.com` but not `deep.sub.acme.com`
79
90
  - **CIDR + IPv6 support** — authorize by IP range, detect RFC-1918 private ranges and cloud metadata endpoints
@@ -81,13 +92,61 @@ The IntegSec Agentic Pentest MCP Proxy solves this by enforcing scope at the pro
81
92
  - **Technique blocking** — categorize tools into `dos`, `destructive`, `social_engineering`, etc., with custom mappings
82
93
  - **Parameter sanitization** — passwords, tokens, API keys, and secrets are redacted before logging
83
94
  - **Multi-backend audit logging** — local JSONL, AWS CloudWatch, Azure Monitor, GCP Cloud Logging
84
- - **Two transport modes** — stdio (child process) and HTTP (reverse proxy)
95
+ - **Three transport modes** — stdio (child process), SSE (stdio-to-SSE bridge, e.g. Burp) and HTTP (reverse proxy)
85
96
  - **Cloud-native manifest loading** — load scope from file, env var, AWS Secrets Manager, Azure Key Vault, or GCP Secret Manager
86
97
  - **Docker-ready** — multi-stage build, runs as non-root user
87
98
  - **Zero runtime config files** — everything via environment variables
88
99
 
89
100
  ---
90
101
 
102
+ ## Supported MCP Servers
103
+
104
+ Built-in target extraction and technique categorization for the following tools and MCP servers. Unlisted tools still receive scope enforcement via the generic parameter fallback (`target`, `url`, `host`, `domain`, etc.).
105
+
106
+ ### Subdomain Enumeration
107
+ [amass](https://github.com/owasp-amass/amass) · [alterx](https://github.com/projectdiscovery/alterx) · [assetfinder](https://github.com/tomnomnom/assetfinder) · [subfinder](https://github.com/projectdiscovery/subfinder) · [shuffledns](https://github.com/projectdiscovery/shuffledns) · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
108
+
109
+ ### DNS & Certificate
110
+ [dnsx](https://github.com/projectdiscovery/dnsx) · [cero](https://github.com/glebarez/cero) · [crtsh](https://crt.sh) · [Shodan MCP](https://github.com/BurtTheCoder/mcp-shodan) (BurtTheCoder) · [Shodan MCP](https://github.com/Vorota-ai/shodan-mcp) (Vorota-ai)
111
+
112
+ ### HTTP Probing
113
+ [httpx](https://github.com/projectdiscovery/httpx) · [katana](https://github.com/projectdiscovery/katana) · [gowitness](https://github.com/sensepost/gowitness) · [Burp Suite MCP](https://github.com/PortSwigger/mcp-server) · [Postman MCP](https://github.com/postmanlabs/postman-mcp-server)
114
+
115
+ ### Port Scanning
116
+ [nmap](https://github.com/nmap/nmap) · [nmap_scan](https://github.com/nmap/nmap) · [masscan](https://github.com/robertdavidgraham/masscan) · [Nmap MCP Server](https://github.com/mohdhaji87/nmap-mcp-server) · [Awesome Kali MCP Servers](https://github.com/ccq1/awsome_kali_MCPServers) · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
117
+
118
+ ### Web App Testing
119
+ [nuclei](https://github.com/projectdiscovery/nuclei) · [ffuf](https://github.com/ffuf/ffuf) · [gobuster](https://github.com/OJ/gobuster) · [dirb](https://sourceforge.net/projects/dirb) · [arjun](https://github.com/s0md3v/Arjun) · [sqlmap](https://github.com/sqlmapproject/sqlmap) · [dalfox](https://github.com/hahwul/dalfox) · [smuggler](https://github.com/defparam/smuggler) · [nikto](https://github.com/sullo/nikto) · [wpscan](https://github.com/wpscanteam/wpscan) · [nessus](https://www.tenable.com/products/nessus) · [zap](https://github.com/zaproxy/zaproxy) · [burpsuite](https://portswigger.net/burp) · [burp_scan](https://portswigger.net/burp) · [burp_active_scan](https://portswigger.net/burp) · [Burp Suite MCP](https://github.com/PortSwigger/mcp-server) (PortSwigger) · [Acunetix MCP](https://github.com/therealcoiffeur/MCPwnetix) · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp) · **Next.js Scanner** · **Unified All-in-One MCP**
120
+
121
+ ### SSL/TLS & Headers
122
+ **SSLScan MCP** · **HTTP Headers** (Custom MCP) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
123
+
124
+ ### OSINT & Threat Intel
125
+ [uncover](https://github.com/projectdiscovery/uncover) · [waybackurls](https://github.com/tomnomnom/waybackurls) · [shodan](https://www.shodan.io) · [virustotal](https://www.virustotal.com) · [bloodhound](https://github.com/BloodHoundAD/BloodHound) · [notify](https://github.com/projectdiscovery/notify) · [Shodan MCP](https://github.com/BurtTheCoder/mcp-shodan) (BurtTheCoder) · [Shodan MCP](https://github.com/Vorota-ai/shodan-mcp) (Vorota-ai) · [WireMCP](https://github.com/0xKoda/WireMCP) · [VirusTotal MCP](https://github.com/BurtTheCoder/mcp-virustotal)
126
+
127
+ ### Exploitation
128
+ [metasploit](https://github.com/rapid7/metasploit-framework) · [`msf_*`](https://github.com/rapid7/metasploit-framework) · [hydra](https://github.com/vanhauser-thc/thc-hydra) · [hashcat](https://github.com/hashcat/hashcat) · **CrackMapExec MCP** · **Commix MCP** · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
129
+
130
+ ### Cloud Security
131
+ [prowler](https://github.com/prowler-cloud/prowler) · [scoutsuite](https://github.com/nccgroup/ScoutSuite)
132
+
133
+ ### Container & IaC
134
+ [trivy](https://github.com/aquasecurity/trivy) · [checkov](https://github.com/bridgecrewio/checkov)
135
+
136
+ ### Kubernetes
137
+ [kube-hunter](https://github.com/aquasecurity/kube-hunter) · [kubeaudit](https://github.com/Shopify/kubeaudit) · [kube-bench](https://github.com/aquasecurity/kube-bench)
138
+
139
+ ### Code Security
140
+ [Semgrep MCP](https://github.com/semgrep/mcp) · [Gitleaks MCP](https://github.com/FuzzingLabs/mcp-security-hub)
141
+
142
+ ### Reverse Engineering
143
+ [Ghidra MCP](https://github.com/LaurieWired/GhidraMCP)
144
+
145
+ ### Mobile Security
146
+ [MobSF MCP](https://github.com/pullkitsan/mobsf-mcp-server)
147
+
148
+ ---
149
+
91
150
  ## Quick Start
92
151
 
93
152
  ```bash
@@ -144,8 +203,8 @@ npm install @integsec/agentic-pentest-proxy
144
203
  ### From source
145
204
 
146
205
  ```bash
147
- git clone https://github.com/integsec/agentic-pentest-mcp-proxy.git
148
- cd agentic-pentest-mcp-proxy
206
+ git clone https://github.com/IntegSec/agentic-pentest-proxy.git
207
+ cd agentic-pentest-proxy
149
208
  npm install
150
209
  npm run build
151
210
  ```
@@ -156,9 +215,10 @@ npm run build
156
215
  docker build -t integsec-agentic-pentest-proxy .
157
216
  docker run --rm \
158
217
  -e SCOPE_MANIFEST_PATH=/scope.json \
159
- -e MCP_TRANSPORT=sse \
218
+ -e MCP_TRANSPORT=http \
160
219
  -e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
161
220
  -e PROXY_PORT=9090 \
221
+ -e PROXY_AUTH_TOKEN \
162
222
  -v ./scope.json:/scope.json:ro \
163
223
  -p 9090:9090 \
164
224
  integsec-agentic-pentest-proxy
@@ -185,17 +245,22 @@ The scope manifest defines the boundaries of a penetration testing engagement. I
185
245
  "authorized_targets": {
186
246
  "ip_ranges": ["10.10.10.0/24", "203.0.113.0/28"],
187
247
  "domains": ["*.acme.com", "acme-staging.example.com"],
248
+ // Authorizes the URL's scheme, host, port and path prefix
188
249
  "urls": ["https://app.acme.com", "https://api.acme.com"],
250
+ // Matched against account parameters of cloud audit tools (prowler, scoutsuite)
189
251
  "cloud_accounts": ["aws:123456789012"]
190
252
  },
191
253
 
192
- // Override: these are NEVER allowed even if they match above
254
+ // Override: these are NEVER allowed even if they match above.
255
+ // Accepts IPs, CIDRs ("203.0.113.0/30"), hostnames, wildcards ("*.hr.acme.com",
256
+ // any depth) and URLs (compared by hostname).
193
257
  "excluded_targets": ["203.0.113.5", "hr.acme.com"],
194
258
 
195
- // Technique categories (for reference / future enforcement)
196
- "authorized_techniques": ["recon", "web_app", "api_testing"],
259
+ // Allowed technique categories. When non-empty, a tool in any OTHER known
260
+ // category is blocked. Uncategorized tools are unaffected. [] = no restriction.
261
+ "authorized_techniques": ["recon", "web_app"],
197
262
 
198
- // Tool categories that are always blocked
263
+ // Tool categories that are always blocked (wins over authorized_techniques)
199
264
  "excluded_techniques": ["dos", "destructive", "social_engineering"],
200
265
 
201
266
  // Time window — calls outside this range are blocked
@@ -225,16 +290,20 @@ The scope manifest defines the boundaries of a penetration testing engagement. I
225
290
  | `SCOPE_MANIFEST_KEYVAULT_URI` | — | Azure Key Vault secret URI |
226
291
  | `SCOPE_MANIFEST_GCP_SECRET` | — | GCP Secret Manager resource name |
227
292
  | **Transport** | | |
228
- | `MCP_TRANSPORT` | `stdio` | Transport mode: `stdio` or `sse` |
293
+ | `MCP_TRANSPORT` | `stdio` | `stdio` (spawn upstream), `sse` (agent on stdio, upstream over SSE — e.g. Burp) or `http` (listen on `PROXY_HOST:PROXY_PORT`, reverse-proxy to upstream). Anything else is a startup error |
229
294
  | `UPSTREAM_MCP_COMMAND` | — | Command to spawn upstream MCP (stdio mode) |
230
295
  | `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) |
296
+ | `UPSTREAM_STARTUP_DELAY_MS` | `0` | stdio mode: hold messages until the upstream prints or this delay passes. Only needed for bridges that drop early messages |
297
+ | `UPSTREAM_MCP_URL` | — | Upstream MCP URL (`sse` and `http` modes) |
298
+ | `PROXY_PORT` | `9090` | Listen port (`http` mode) |
299
+ | `PROXY_HOST` | `127.0.0.1` | Listen address (`http` mode). The Docker image sets `0.0.0.0` |
300
+ | `PROXY_AUTH_TOKEN` | — | Required for non-loopback HTTP. Clients send it in `X-Proxy-Token`; use TLS termination for remote clients |
301
+ | `ALLOW_UNSTRUCTURED_COMMANDS` | `false` | Explicitly opt in to heuristic inspection of free-form command and argument fields; unsafe for strict scope enforcement |
233
302
  | **Audit** | | |
234
303
  | `AUDIT_LOG_PATH` | `./audit/` | Directory for local JSONL audit logs |
235
304
  | `AWS_LOG_GROUP` | — | AWS CloudWatch log group name |
236
305
  | `AWS_REGION` | — | AWS region for CloudWatch |
237
- | `AZURE_LOG_WORKSPACE_ID` | — | Azure Log Analytics workspace ID |
306
+ | `AZURE_LOG_INGESTION_ENDPOINT` | — | DCR or DCE Logs Ingestion endpoint URL |
238
307
  | `AZURE_DCR_IMMUTABLE_ID` | — | Azure Data Collection Rule immutable ID |
239
308
  | `AZURE_DCR_STREAM_NAME` | `Custom-MCPProxyAudit_CL` | Azure DCR stream name |
240
309
  | `GOOGLE_CLOUD_PROJECT` | — | GCP project ID for Cloud Logging |
@@ -242,13 +311,17 @@ The scope manifest defines the boundaries of a penetration testing engagement. I
242
311
  | `TECHNIQUE_MAP_PATH` | — | Path to custom technique mappings JSON |
243
312
  | `DNS_CACHE_TTL` | `60` | DNS cache TTL in seconds |
244
313
  | `LOG_LEVEL` | `INFO` | Log verbosity |
245
- | `PROXY_VERSION` | `0.1.0` | Version string in audit entries |
314
+ | `PROXY_VERSION` | `0.2.6` | Version string in audit entries |
246
315
 
247
316
  See [`.env.example`](.env.example) for a complete template.
248
317
 
249
318
  ### Technique Mappings
250
319
 
251
- The proxy ships with built-in technique categories (`dos`, `destructive`, `social_engineering`). You can extend these with a custom mapping file:
320
+ The proxy ships with built-in technique categories: `dos`, `destructive`, `social_engineering`, `recon`, `web_app`, `exploitation` and `cloud_audit` (see `src/technique-checker.ts` for the tool lists). Use these names in `authorized_techniques` / `excluded_techniques`.
321
+
322
+ `exact` entries match the whole tool name. `patterns` containing a separator (`nmap_`, `msf_`) match as substrings; purely alphanumeric patterns match whole words of the tool name or the end of a word (`dos` matches `dos_attack` and `ddos` but not `get_dossier`). All matching is case-insensitive.
323
+
324
+ You can extend these with a custom mapping file:
252
325
 
253
326
  ```json
254
327
  {
@@ -263,7 +336,7 @@ The proxy ships with built-in technique categories (`dos`, `destructive`, `socia
263
336
  }
264
337
  ```
265
338
 
266
- Point `TECHNIQUE_MAP_PATH` at this file. Custom mappings are merged with built-in ones — they don't replace them.
339
+ Point `TECHNIQUE_MAP_PATH` at this file. Custom mappings are merged with built-in ones — they don't replace them. A missing or malformed file stops the proxy at startup rather than silently dropping your blocks.
267
340
 
268
341
  ---
269
342
 
@@ -278,14 +351,22 @@ UPSTREAM_MCP_COMMAND=npx \
278
351
  UPSTREAM_MCP_ARGS="-y,@turbopentest/mcp-server" \
279
352
  integsec-agentic-pentest-proxy
280
353
 
281
- # HTTP mode — reverse proxy to a running MCP server
354
+ # HTTP mode — reverse proxy to a running MCP server (listens on 127.0.0.1:9090)
282
355
  SCOPE_MANIFEST_PATH=./scope.json \
283
- MCP_TRANSPORT=sse \
356
+ MCP_TRANSPORT=http \
284
357
  UPSTREAM_MCP_URL=http://localhost:8080 \
285
358
  PROXY_PORT=9090 \
286
359
  integsec-agentic-pentest-proxy
360
+
361
+ # SSE mode — agent talks stdio, proxy connects to an SSE upstream (no listening port)
362
+ SCOPE_MANIFEST_PATH=./scope.json \
363
+ MCP_TRANSPORT=sse \
364
+ UPSTREAM_MCP_URL=http://127.0.0.1:9876 \
365
+ integsec-agentic-pentest-proxy
287
366
  ```
288
367
 
368
+ In HTTP mode, point your MCP client at the proxy using the same path it would use on the upstream (e.g. `http://127.0.0.1:9090/mcp`). For a non-loopback listener, set `PROXY_AUTH_TOKEN` and configure the client to send `X-Proxy-Token`. Terminate TLS before the proxy when clients connect over a network.
369
+
289
370
  ### Claude Desktop Integration
290
371
 
291
372
  Add to your Claude Desktop `claude_desktop_config.json`:
@@ -328,15 +409,42 @@ Add to your `.mcp.json` or project settings:
328
409
  }
329
410
  ```
330
411
 
412
+ ### Burp Suite Integration
413
+
414
+ The proxy connects directly to Burp Suite's MCP extension via SSE — no Java bridge jar needed.
415
+
416
+ 1. Open Burp Suite Pro and enable the MCP extension (listening on port 9876)
417
+ 2. Add to your `claude_desktop_config.json`:
418
+
419
+ ```json
420
+ {
421
+ "mcpServers": {
422
+ "burp-scoped": {
423
+ "command": "integsec-agentic-pentest-proxy",
424
+ "args": [],
425
+ "env": {
426
+ "SCOPE_MANIFEST_PATH": "/path/to/scope.json",
427
+ "MCP_TRANSPORT": "sse",
428
+ "UPSTREAM_MCP_URL": "http://127.0.0.1:9876",
429
+ "AUDIT_LOG_PATH": "/path/to/audit"
430
+ }
431
+ }
432
+ }
433
+ }
434
+ ```
435
+
436
+ The proxy validates `targetHostname` in Burp's `send_http1_request`, `send_http2_request`, `create_repeater_tab`, and `send_to_intruder` tools — blocking requests to out-of-scope targets.
437
+
331
438
  ### Docker
332
439
 
333
440
  ```bash
334
- # HTTP mode
441
+ # HTTP mode (the image sets PROXY_HOST=0.0.0.0 so the published port is reachable)
335
442
  docker run --rm \
336
443
  -e SCOPE_MANIFEST_PATH=/scope.json \
337
- -e MCP_TRANSPORT=sse \
444
+ -e MCP_TRANSPORT=http \
338
445
  -e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
339
446
  -e PROXY_PORT=9090 \
447
+ -e PROXY_AUTH_TOKEN \
340
448
  -v ./scope.json:/scope.json:ro \
341
449
  -v ./audit:/app/audit \
342
450
  -p 9090:9090 \
@@ -345,10 +453,11 @@ docker run --rm \
345
453
  # With AWS CloudWatch
346
454
  docker run --rm \
347
455
  -e SCOPE_MANIFEST_SECRET_ARN=arn:aws:secretsmanager:us-east-1:123456789012:secret:scope \
348
- -e MCP_TRANSPORT=sse \
456
+ -e MCP_TRANSPORT=http \
349
457
  -e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
350
458
  -e AWS_LOG_GROUP=/integsec/mcp-proxy \
351
459
  -e AWS_REGION=us-east-1 \
460
+ -e PROXY_AUTH_TOKEN \
352
461
  -p 9090:9090 \
353
462
  integsec-agentic-pentest-proxy
354
463
  ```
@@ -382,38 +491,58 @@ Run the TUI in a separate terminal while the proxy is active (via Claude Desktop
382
491
 
383
492
  ## How Validation Works
384
493
 
385
- Every `tools/call` JSON-RPC message passes through an 8-step validation pipeline:
494
+ Every `tools/call` JSON-RPC message (including each element of a JSON-RPC batch) passes through this pipeline:
386
495
 
387
496
  ```
388
- 1. TECHNIQUE CHECK ──▶ Is the tool in an excluded_techniques category?
497
+ 0. REQUEST SHAPE ────▶ Tool name a string? Arguments a JSON object?
498
+ │ NO → BLOCKED_INVALID_REQUEST
499
+ ▼
500
+ 1. TECHNIQUE CHECK ──▶ Tool in an excluded_techniques category, or in a known
501
+ │ category missing from a non-empty authorized_techniques?
389
502
  │ YES → BLOCKED_TECHNIQUE
390
503
  ▼
391
504
  2. TIME WINDOW ──────▶ Is current time within engagement_window?
392
505
  │ NO → BLOCKED_OUTSIDE_WINDOW
393
506
  ▼
394
- 3. TARGET EXTRACTION ▶ Extract hostname/IP from tool parameters
395
- │ (19 tool-specific extractors + fallback params)
507
+ COMMAND CHECK ─────▶ Free-form command fields present without opt-in?
508
+ │ YES → BLOCKED_UNINSPECTABLE_COMMAND
509
+ ▼
510
+ 3. TARGET EXTRACTION ▶ Extract EVERY hostname/IP/CIDR from the parameters
511
+ │ (tool mappings + fallback names, arrays, lists,
512
+ │ nested objects)
513
+ ▼
514
+ 4. NO TARGET? ───────▶ No target found?
515
+ │ YES → ALLOWED_NO_TARGET only for explicitly safe local tools
516
+ │ otherwise → BLOCKED_INVALID_REQUEST
396
517
  ▼
397
- 4. NO TARGET? ───────▶ No target-like parameter found?
398
- │ YES → ALLOWED_NO_TARGET
518
+ For each target — any block blocks the whole call:
519
+ 5. CLOUD ACCOUNT ────▶ Matches authorized cloud_accounts? → ALLOWED
520
+ 6. CIDR TARGET ──────▶ Overlaps an exclusion → BLOCKED_EXCLUDED_TARGET
521
+ │ Fully inside an authorized range → ALLOWED
522
+ │ Otherwise → BLOCKED_NOT_IN_SCOPE
399
523
  ▼
400
- 5. DNS RESOLUTION ───▶ Resolve hostname to A + AAAA records
401
- │ NXDOMAIN → BLOCKED_DNS_FAILED
524
+ 7. DNS RESOLUTION ───▶ A + AAAA, falling back to the OS resolver
525
+ │ No addresses → BLOCKED_DNS_FAILED
402
526
  ▼
403
- 6. EXCLUSION CHECK ──▶ Does target match excluded_targets?
527
+ 8. EXCLUSION CHECK ──▶ Host or any resolved IP matches excluded_targets?
404
528
  │ YES → BLOCKED_EXCLUDED_TARGET
405
529
  ▼
406
- 7. AUTHORIZATION ────▶ Does target match authorized_targets?
407
- │ YES → ALLOWED
530
+ 9. AUTHORIZATION ────▶ Host matches a domain, IP range or URL prefix?
531
+ │ resolves to loopback/link-local/metadata not in
532
+ │ ip_ranges → BLOCKED_RESTRICTED_IP, else ALLOWED
533
+ │ Resolved IP in an authorized ip_range? → ALLOWED
408
534
  ▼
409
- 8. DEFAULT DENY ─────▶ BLOCKED_NOT_IN_SCOPE
535
+ 10. DEFAULT DENY ────▶ BLOCKED_NOT_IN_SCOPE
410
536
  ```
411
537
 
412
538
  **Key design decisions:**
413
- - **Exclusions beat authorizations.** If `hr.acme.com` is in `excluded_targets`, it's blocked even if `*.acme.com` is authorized.
539
+ - **Every target must pass.** `targets: ["10.10.10.5", "8.8.8.8"]` is blocked because of the second element.
540
+ - **Exclusions beat authorizations.** If `hr.acme.com` is in `excluded_targets`, it's blocked even if `*.acme.com` is authorized — with or without a trailing dot, in any letter case. A CIDR target that *contains* an excluded IP is blocked.
414
541
  - **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.
542
+ - **Restricted addresses require explicit authorization.** An authorized domain that resolves to loopback, link-local or a cloud metadata endpoint (169.254.169.254) is blocked unless that IP appears in `authorized_targets.ip_ranges`. Private RFC-1918 addresses reached through an authorized domain are allowed (internal engagements); reached directly, they need an `ip_ranges` entry like any other IP.
543
+ - **Unparseable input is never forwarded.** Invalid JSON gets a JSON-RPC parse error (`-32700`) instead of being passed to an upstream whose parser may be more lenient.
544
+ - **Batches are all-or-nothing.** If any tool call in a JSON-RPC batch is blocked, the whole batch is rejected with one error per request.
545
+ - **No target is denied by default.** Only the explicitly listed local tools (`whoami`, `date`, `ls`, `list_tools`, `get_version`, `list_pentests`) may pass without a target. Free-form command fields are blocked unless `ALLOW_UNSTRUCTURED_COMMANDS=true` is set; that opt-in relies on incomplete heuristic extraction and is unsuitable when the proxy is the only scope control.
417
546
 
418
547
  ---
419
548
 
@@ -435,7 +564,7 @@ Every validation decision produces an audit entry:
435
564
  "decision_reason": "Target 10.10.10.5 matches authorized IP range 10.10.10.0/24",
436
565
  "matched_scope_item": "10.10.10.0/24",
437
566
  "duration_ms": 2,
438
- "proxy_version": "0.1.0"
567
+ "proxy_version": "0.2.6"
439
568
  }
440
569
  ```
441
570
 
@@ -445,22 +574,26 @@ Every validation decision produces an audit entry:
445
574
  |---------|--------|--------|
446
575
  | **Local** (always active) | `AUDIT_LOG_PATH` | JSONL files: `{engagement_id}.jsonl` |
447
576
  | **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 |
577
+ | **Azure Monitor** | `AZURE_LOG_INGESTION_ENDPOINT` + `AZURE_DCR_IMMUTABLE_ID` | Logs Ingestion API via Data Collection Rules |
449
578
  | **GCP Cloud Logging** | `GOOGLE_CLOUD_PROJECT` | Cloud Logging entries with severity mapping |
450
579
 
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.
580
+ Multiple backends can be active simultaneously. The local JSONL entry is written to disk before the call is forwarded, so the local trail survives an abrupt kill. Cloud backends are buffered and flushed every 5 seconds. Backend failures are isolated — a CloudWatch error won't affect local logging.
452
581
 
453
582
  ### Decision Types
454
583
 
455
584
  | Decision | Meaning |
456
585
  |----------|---------|
457
586
  | `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 |
587
+ | `ALLOWED_NO_TARGET` | Tool is on the explicit targetless local-tool list |
588
+ | `BLOCKED_TECHNIQUE` | Tool belongs to an excluded technique category, or a known category not in `authorized_techniques` |
460
589
  | `BLOCKED_OUTSIDE_WINDOW` | Current time is outside the engagement window |
461
- | `BLOCKED_EXCLUDED_TARGET` | Target is explicitly excluded |
590
+ | `BLOCKED_EXCLUDED_TARGET` | Target (or a range containing it) is explicitly excluded |
462
591
  | `BLOCKED_NOT_IN_SCOPE` | Target doesn't match any authorized scope item |
463
592
  | `BLOCKED_DNS_FAILED` | DNS resolution returned no addresses |
593
+ | `BLOCKED_RESTRICTED_IP` | Authorized hostname resolves to loopback/link-local/cloud metadata not listed in `ip_ranges` |
594
+ | `BLOCKED_INVALID_REQUEST` | Tool name or arguments malformed — cannot be validated |
595
+ | `BLOCKED_UNINSPECTABLE_COMMAND` | Free-form command or argument field cannot be reliably scoped |
596
+ | `BLOCKED_INTERNAL_ERROR` | Validation threw unexpectedly — failed closed |
464
597
 
465
598
  ---
466
599
 
@@ -474,9 +607,72 @@ See the [`examples/`](examples/) directory for:
474
607
 
475
608
  ---
476
609
 
610
+ ## Manifest Builder
611
+
612
+ Build scope manifests interactively with smart validation, or share a web form with clients for scope intake.
613
+
614
+ ### Quick Start
615
+
616
+ ```bash
617
+ # Create a new manifest interactively
618
+ integsec-agentic-pentest-manifest new
619
+
620
+ # Create from a template
621
+ integsec-agentic-pentest-manifest new --from template.json -o scope.json
622
+
623
+ # Edit an existing manifest
624
+ integsec-agentic-pentest-manifest edit scope.json
625
+
626
+ # Review a client submission
627
+ integsec-agentic-pentest-manifest review submission.pending.json
628
+ ```
629
+
630
+ ### Client Intake (Web Form)
631
+
632
+ Share a web-based form with clients so they can define their own scope:
633
+
634
+ ```bash
635
+ # Local only (default — localhost:9471)
636
+ integsec-agentic-pentest-manifest serve --template engagement-template.json
637
+
638
+ # Network-accessible (TLS required)
639
+ integsec-agentic-pentest-manifest serve \
640
+ --host 0.0.0.0 \
641
+ --tls-cert ./certs/server.pem \
642
+ --tls-key ./certs/server-key.pem \
643
+ --template engagement-template.json
644
+ ```
645
+
646
+ **Workflow:**
647
+ 1. Operator creates a template with engagement info, time window, and technique restrictions
648
+ 2. Operator runs `serve` and shares the URL with the client
649
+ 3. Client fills in their targets (domains, IPs, exclusions) via the web form
650
+ 4. Client submits — saved as `.pending.json`
651
+ 5. Operator reviews: `integsec-agentic-pentest-manifest review submission.pending.json`
652
+ 6. Operator approves, edits, or rejects
653
+
654
+ **Security:** The web server binds to `127.0.0.1` by default. Exposing on `0.0.0.0` requires `--tls-cert` and `--tls-key` — the server refuses to start over plaintext on non-localhost interfaces.
655
+
656
+ ### Smart Validation
657
+
658
+ The builder validates your manifest as you build it:
659
+
660
+ - **Format checks** — valid CIDRs, ISO 8601 dates, non-empty required fields
661
+ - **Live DNS resolution** — resolves domains and shows their IPs
662
+ - **Overlap detection** — warns when domains resolve to IPs already covered by CIDR ranges
663
+ - **Broad range warnings** — flags CIDR ranges wider than /16
664
+ - **Wildcard/apex prompts** — suggests adding `acme.com` when `*.acme.com` is entered
665
+ - **Exclusion checks** — warns if an excluded target isn't within any authorized range
666
+
667
+ ### Dry-Run Preview
668
+
669
+ Before saving, the builder runs synthetic tool calls against your manifest to preview what the proxy will allow and block. This catches scope misconfigurations before an engagement starts.
670
+
671
+ ---
672
+
477
673
  ## Contributing
478
674
 
479
- Contributions are welcome. The IntegSec Agentic Pentest MCP Proxy is an open-source project under the MIT license.
675
+ Contributions are welcome. The IntegSec Agentic Pentest MCP Proxy is an open-source project under the Apache 2.0 license.
480
676
 
481
677
  ### Architecture
482
678
 
@@ -486,7 +682,7 @@ bin/
486
682
 
487
683
  src/
488
684
  proxy.ts ScopeEnforcementProxy — core orchestrator
489
- validator.ts ScopeValidator — 8-step validation pipeline
685
+ validator.ts ScopeValidator — validation pipeline
490
686
  extractor.ts Target extraction from tool parameters (19 tools + fallback)
491
687
  domain-matcher.ts Wildcard and exact domain matching
492
688
  ip-matcher.ts CIDR matching, RFC-1918 detection
@@ -514,8 +710,8 @@ src/
514
710
 
515
711
  ```bash
516
712
  # Clone the repo
517
- git clone https://github.com/integsec/agentic-pentest-mcp-proxy.git
518
- cd agentic-pentest-mcp-proxy
713
+ git clone https://github.com/IntegSec/agentic-pentest-proxy.git
714
+ cd agentic-pentest-proxy
519
715
 
520
716
  # Install dependencies
521
717
  npm install
@@ -534,7 +730,7 @@ npm run lint
534
730
  ```
535
731
 
536
732
  **Requirements:**
537
- - Node.js >= 20.0.0
733
+ - Node.js >= 22.0.0
538
734
  - npm >= 9
539
735
 
540
736
  ### Project Structure
@@ -633,7 +829,7 @@ The following is the planned development roadmap for the IntegSec Agentic Pentes
633
829
 
634
830
  - [ ] **Signed scope manifests** — Ed25519 signatures on manifests to prevent tampering, with key pinning
635
831
  - [ ] **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
832
+ - [ ] **Scope manifest v2 schema** — add per-tool overrides, port ranges, and protocol restrictions
637
833
  - [ ] **Rate limiting** — per-tool and per-target rate limits to prevent runaway agents
638
834
  - [ ] **Metrics endpoint** — Prometheus `/metrics` with counters for allowed/blocked decisions, latency histograms
639
835
  - [ ] **WebSocket transport** — support MCP over WebSocket for persistent connections
@@ -749,7 +945,7 @@ The following is the planned development roadmap for the IntegSec Agentic Pentes
749
945
 
750
946
  ## License
751
947
 
752
- MIT License. See [LICENSE](LICENSE) for details.
948
+ Apache 2.0 License. See [LICENSE](LICENSE) for details.
753
949
 
754
950
  ---
755
951
 
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=integsec-agentic-pentest-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integsec-agentic-pentest-manifest.d.ts","sourceRoot":"","sources":["../../bin/integsec-agentic-pentest-manifest.tsx"],"names":[],"mappings":""}