@integsec/agentic-pentest-proxy 0.2.4 → 0.2.5
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/dist/bin/integsec-agentic-pentest-proxy.js +8 -0
- package/dist/bin/integsec-agentic-pentest-proxy.js.map +1 -1
- package/dist/src/transports/sse.d.ts +13 -0
- package/dist/src/transports/sse.d.ts.map +1 -0
- package/dist/src/transports/sse.js +151 -0
- package/dist/src/transports/sse.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ import { loadManifest } from "../src/manifest.js";
|
|
|
4
4
|
import { ScopeEnforcementProxy } from "../src/proxy.js";
|
|
5
5
|
import { runStdioProxy } from "../src/transports/stdio.js";
|
|
6
6
|
import { runHttpProxy } from "../src/transports/http.js";
|
|
7
|
+
import { runSseProxy } from "../src/transports/sse.js";
|
|
7
8
|
import { CloudWatchAuditLogger } from "../src/audit/cloudwatch.js";
|
|
8
9
|
import { AzureMonitorAuditLogger } from "../src/audit/azure-monitor.js";
|
|
9
10
|
import { GcpAuditLogger } from "../src/audit/gcp-logging.js";
|
|
@@ -36,6 +37,13 @@ async function main() {
|
|
|
36
37
|
}
|
|
37
38
|
await runStdioProxy(proxy, config.upstreamMcpCommand, config.upstreamMcpArgs);
|
|
38
39
|
}
|
|
40
|
+
else if (config.transport === "sse") {
|
|
41
|
+
if (!config.upstreamMcpUrl) {
|
|
42
|
+
console.error("[integsec-agentic-pentest-proxy] ERROR: UPSTREAM_MCP_URL is required for SSE transport");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
await runSseProxy(proxy, config.upstreamMcpUrl);
|
|
46
|
+
}
|
|
39
47
|
else {
|
|
40
48
|
if (!config.upstreamMcpUrl) {
|
|
41
49
|
console.error("[integsec-agentic-pentest-proxy] ERROR: UPSTREAM_MCP_URL is required for HTTP transport");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integsec-agentic-pentest-proxy.js","sourceRoot":"","sources":["../../bin/integsec-agentic-pentest-proxy.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,OAAO,CAAC,KAAK,CAAC,gEAAgE,QAAQ,CAAC,aAAa,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7H,OAAO,CAAC,KAAK,CAAC,4CAA4C,QAAQ,CAAC,iBAAiB,CAAC,KAAK,OAAO,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;IACnI,OAAO,CAAC,KAAK,CAAC,+CAA+C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAEjF,MAAM,KAAK,GAAG,IAAI,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;IAE3C,mCAAmC;IACnC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,WAAW,CAAC,UAAU,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,KAAK,CAAC,gEAAgE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC7D,WAAW,CAAC,UAAU,CACpB,IAAI,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAC/G,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,WAAW,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;YAC9G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;YACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,iDAAiD,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"integsec-agentic-pentest-proxy.js","sourceRoot":"","sources":["../../bin/integsec-agentic-pentest-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ScopeEnforcementProxy } from "../proxy.js";
|
|
2
|
+
/**
|
|
3
|
+
* SSE transport — connects to an upstream MCP server via SSE protocol.
|
|
4
|
+
*
|
|
5
|
+
* MCP SSE protocol:
|
|
6
|
+
* 1. GET <upstream> → SSE stream, first event is "endpoint" with sessionId
|
|
7
|
+
* 2. POST <upstream><sessionId> with JSON-RPC body → sends messages
|
|
8
|
+
* 3. Responses arrive on the SSE stream as "message" events
|
|
9
|
+
*
|
|
10
|
+
* Agent communicates with us via stdio (stdin/stdout).
|
|
11
|
+
*/
|
|
12
|
+
export declare function runSseProxy(proxy: ScopeEnforcementProxy, upstreamUrl: string): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/transports/sse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,qBAAqB,EAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAqJf"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { createInterface } from "readline";
|
|
2
|
+
/**
|
|
3
|
+
* SSE transport — connects to an upstream MCP server via SSE protocol.
|
|
4
|
+
*
|
|
5
|
+
* MCP SSE protocol:
|
|
6
|
+
* 1. GET <upstream> → SSE stream, first event is "endpoint" with sessionId
|
|
7
|
+
* 2. POST <upstream><sessionId> with JSON-RPC body → sends messages
|
|
8
|
+
* 3. Responses arrive on the SSE stream as "message" events
|
|
9
|
+
*
|
|
10
|
+
* Agent communicates with us via stdio (stdin/stdout).
|
|
11
|
+
*/
|
|
12
|
+
export async function runSseProxy(proxy, upstreamUrl) {
|
|
13
|
+
const auditLogger = proxy.getAuditLogger();
|
|
14
|
+
auditLogger.start();
|
|
15
|
+
const TAG = "[integsec-agentic-pentest-proxy]";
|
|
16
|
+
// Step 1: Connect to SSE endpoint and get session ID
|
|
17
|
+
console.error(`${TAG} Connecting to upstream SSE at ${upstreamUrl}...`);
|
|
18
|
+
let sessionEndpoint;
|
|
19
|
+
let sseAbortController = new AbortController();
|
|
20
|
+
async function connectSse() {
|
|
21
|
+
return new Promise(async (resolve, reject) => {
|
|
22
|
+
try {
|
|
23
|
+
const resp = await fetch(upstreamUrl, {
|
|
24
|
+
headers: { Accept: "text/event-stream" },
|
|
25
|
+
signal: sseAbortController.signal,
|
|
26
|
+
});
|
|
27
|
+
if (!resp.ok) {
|
|
28
|
+
reject(new Error(`SSE connection failed: ${resp.status} ${resp.statusText}`));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!resp.body) {
|
|
32
|
+
reject(new Error("SSE response has no body"));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const reader = resp.body.getReader();
|
|
36
|
+
const decoder = new TextDecoder();
|
|
37
|
+
let buffer = "";
|
|
38
|
+
let currentEvent = "";
|
|
39
|
+
let resolved = false;
|
|
40
|
+
// Read SSE stream in background
|
|
41
|
+
(async () => {
|
|
42
|
+
try {
|
|
43
|
+
while (true) {
|
|
44
|
+
const { done, value } = await reader.read();
|
|
45
|
+
if (done)
|
|
46
|
+
break;
|
|
47
|
+
buffer += decoder.decode(value, { stream: true });
|
|
48
|
+
const lines = buffer.split("\n");
|
|
49
|
+
buffer = lines.pop() ?? "";
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
if (line.startsWith("event: ")) {
|
|
52
|
+
currentEvent = line.slice(7).trim();
|
|
53
|
+
}
|
|
54
|
+
else if (line.startsWith("data: ")) {
|
|
55
|
+
const data = line.slice(6);
|
|
56
|
+
if (currentEvent === "endpoint" && !resolved) {
|
|
57
|
+
// data is like "?sessionId=xxx"
|
|
58
|
+
resolved = true;
|
|
59
|
+
resolve(data);
|
|
60
|
+
}
|
|
61
|
+
else if (currentEvent === "message") {
|
|
62
|
+
// JSON-RPC response from upstream — forward to agent via stdout
|
|
63
|
+
// Capture server name from initialize response
|
|
64
|
+
if (!proxy.getServerName()) {
|
|
65
|
+
try {
|
|
66
|
+
const msg = JSON.parse(data);
|
|
67
|
+
const name = msg?.result?.serverInfo?.name;
|
|
68
|
+
if (name && typeof name === "string") {
|
|
69
|
+
proxy.setServerName(name);
|
|
70
|
+
console.error(`${TAG} Upstream server: ${name}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Not parseable — ignore
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
process.stdout.write(data + "\n");
|
|
78
|
+
}
|
|
79
|
+
currentEvent = "";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err.name !== "AbortError") {
|
|
86
|
+
console.error(`${TAG} SSE stream error: ${err.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
reject(err);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
sessionEndpoint = await connectSse();
|
|
98
|
+
console.error(`${TAG} SSE connected, session: ${sessionEndpoint}`);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
console.error(`${TAG} Failed to connect to SSE upstream: ${err.message}`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// Step 2: Read agent messages from stdin, validate, POST to upstream
|
|
105
|
+
const postUrl = new URL(sessionEndpoint, upstreamUrl).toString();
|
|
106
|
+
console.error(`${TAG} POST endpoint: ${postUrl}`);
|
|
107
|
+
const agentInput = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
108
|
+
agentInput.on("line", async (line) => {
|
|
109
|
+
try {
|
|
110
|
+
const message = JSON.parse(line);
|
|
111
|
+
const { forward, response } = await proxy.handleMessage(message);
|
|
112
|
+
if (!forward && response) {
|
|
113
|
+
// Blocked — return error to agent
|
|
114
|
+
process.stdout.write(JSON.stringify(response) + "\n");
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Forward to upstream via HTTP POST
|
|
118
|
+
const resp = await fetch(postUrl, {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: { "Content-Type": "application/json" },
|
|
121
|
+
body: line,
|
|
122
|
+
});
|
|
123
|
+
if (!resp.ok) {
|
|
124
|
+
console.error(`${TAG} Upstream POST failed: ${resp.status} ${resp.statusText}`);
|
|
125
|
+
}
|
|
126
|
+
// Response comes back via SSE stream, not the POST response
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
// Malformed JSON or network error — try to forward anyway
|
|
130
|
+
try {
|
|
131
|
+
await fetch(postUrl, {
|
|
132
|
+
method: "POST",
|
|
133
|
+
headers: { "Content-Type": "application/json" },
|
|
134
|
+
body: line,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
console.error(`${TAG} Failed to forward message: ${err.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Cleanup
|
|
143
|
+
const cleanup = async () => {
|
|
144
|
+
sseAbortController.abort();
|
|
145
|
+
await auditLogger.stop();
|
|
146
|
+
process.exit(0);
|
|
147
|
+
};
|
|
148
|
+
process.on("SIGINT", cleanup);
|
|
149
|
+
process.on("SIGTERM", cleanup);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/transports/sse.ts"],"names":[],"mappings":"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"}
|