staff-mcp 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +178 -49
- package/README_zh.md +176 -47
- package/dist/src/data/HttpDataSession.d.ts +22 -0
- package/dist/src/data/HttpDataSession.js +925 -0
- package/dist/src/data/HttpDataSession.js.map +1 -0
- package/dist/src/data/node.d.ts +4 -0
- package/dist/src/data/node.js +93 -0
- package/dist/src/data/node.js.map +1 -0
- package/dist/src/data/types.d.ts +54 -0
- package/dist/src/data/types.js +2 -0
- package/dist/src/data/types.js.map +1 -0
- package/dist/src/data-stdio-docker.d.ts +10 -0
- package/dist/src/data-stdio-docker.js +140 -0
- package/dist/src/data-stdio-docker.js.map +1 -0
- package/dist/src/docker-proxy.d.ts +6 -1
- package/dist/src/docker-proxy.js +324 -147
- package/dist/src/docker-proxy.js.map +1 -1
- package/dist/src/extensions/apps.d.ts +12 -0
- package/dist/src/extensions/apps.js +85 -0
- package/dist/src/extensions/apps.js.map +1 -0
- package/dist/src/extensions/config.d.ts +27 -0
- package/dist/src/extensions/config.js +91 -0
- package/dist/src/extensions/config.js.map +1 -0
- package/dist/src/extensions/protocol.d.ts +35 -0
- package/dist/src/extensions/protocol.js +47 -0
- package/dist/src/extensions/protocol.js.map +1 -0
- package/dist/src/extensions/runtime.d.ts +16 -0
- package/dist/src/extensions/runtime.js +266 -0
- package/dist/src/extensions/runtime.js.map +1 -0
- package/dist/src/file-manager/extension.d.ts +21 -0
- package/dist/src/file-manager/extension.js +514 -0
- package/dist/src/file-manager/extension.js.map +1 -0
- package/dist/src/file-manager/file-core.d.ts +128 -0
- package/dist/src/file-manager/file-core.js +750 -0
- package/dist/src/file-manager/file-core.js.map +1 -0
- package/dist/src/file-manager/transfers.d.ts +423 -0
- package/dist/src/file-manager/transfers.js +540 -0
- package/dist/src/file-manager/transfers.js.map +1 -0
- package/dist/src/file-manager/ui/index.html +81 -0
- package/dist/src/index.js +289 -128
- package/dist/src/index.js.map +1 -1
- package/dist/src/lsp/manager.d.ts +2 -0
- package/dist/src/lsp/manager.js +22 -10
- package/dist/src/lsp/manager.js.map +1 -1
- package/dist/src/reverse/SseTransport.d.ts +34 -0
- package/dist/src/reverse/SseTransport.js +215 -0
- package/dist/src/reverse/SseTransport.js.map +1 -0
- package/dist/src/reverse/http.d.ts +7 -0
- package/dist/src/reverse/http.js +85 -0
- package/dist/src/reverse/http.js.map +1 -0
- package/dist/src/server.d.ts +4 -2
- package/dist/src/server.js +80 -18
- package/dist/src/server.js.map +1 -1
- package/dist/src/terminal/extension.d.ts +4 -0
- package/dist/src/terminal/extension.js +108 -0
- package/dist/src/terminal/extension.js.map +1 -0
- package/dist/src/terminal/pty.d.ts +14 -0
- package/dist/src/terminal/pty.js +121 -0
- package/dist/src/terminal/pty.js.map +1 -0
- package/dist/src/terminal/session.d.ts +136 -0
- package/dist/src/terminal/session.js +422 -0
- package/dist/src/terminal/session.js.map +1 -0
- package/dist/src/terminal/ui/index.html +183 -0
- package/dist/src/tools/file-tools.d.ts +2 -1
- package/dist/src/tools/file-tools.js +19 -7
- package/dist/src/tools/file-tools.js.map +1 -1
- package/dist/src/tools/mcp-client-tools.js +244 -104
- package/dist/src/tools/mcp-client-tools.js.map +1 -1
- package/dist/src/tools/shell-tools.js +1 -1
- package/dist/src/tools/shell-tools.js.map +1 -1
- package/dist/src/tools/skills.js +26 -1
- package/dist/src/tools/skills.js.map +1 -1
- package/dist/src/tools/system-tools.d.ts +9 -3
- package/dist/src/tools/system-tools.js +31 -48
- package/dist/src/tools/system-tools.js.map +1 -1
- package/dist/src/transports/http.d.ts +16 -2
- package/dist/src/transports/http.js +261 -59
- package/dist/src/transports/http.js.map +1 -1
- package/dist/src/transports/reverse.d.ts +23 -19
- package/dist/src/transports/reverse.js +130 -74
- package/dist/src/transports/reverse.js.map +1 -1
- package/dist/src/transports/stdio.d.ts +6 -2
- package/dist/src/transports/stdio.js +131 -19
- package/dist/src/transports/stdio.js.map +1 -1
- package/dist/src/utils/proxy.d.ts +3 -3
- package/dist/src/utils/proxy.js +84 -62
- package/dist/src/utils/proxy.js.map +1 -1
- package/dist/src/utils/server-activity.d.ts +6 -0
- package/dist/src/utils/server-activity.js +46 -0
- package/dist/src/utils/server-activity.js.map +1 -0
- package/dist/src/utils/server-lifecycle.d.ts +5 -0
- package/dist/src/utils/server-lifecycle.js +51 -0
- package/dist/src/utils/server-lifecycle.js.map +1 -0
- package/docs/file-manager.md +179 -0
- package/docs/terminal.md +66 -0
- package/package.json +40 -19
- package/dist/src/transports/fte-lifecycle.d.ts +0 -13
- package/dist/src/transports/fte-lifecycle.js +0 -76
- package/dist/src/transports/fte-lifecycle.js.map +0 -1
- package/dist/tests/docker-proxy.test.d.ts +0 -1
- package/dist/tests/docker-proxy.test.js +0 -395
- package/dist/tests/docker-proxy.test.js.map +0 -1
- package/dist/tests/file-write-queue.test.d.ts +0 -1
- package/dist/tests/file-write-queue.test.js +0 -105
- package/dist/tests/file-write-queue.test.js.map +0 -1
- package/dist/tests/fte-lifecycle.test.d.ts +0 -1
- package/dist/tests/fte-lifecycle.test.js +0 -118
- package/dist/tests/fte-lifecycle.test.js.map +0 -1
- package/dist/tests/lsp-client.test.d.ts +0 -1
- package/dist/tests/lsp-client.test.js +0 -52
- package/dist/tests/lsp-client.test.js.map +0 -1
- package/dist/tests/package-info.test.d.ts +0 -1
- package/dist/tests/package-info.test.js +0 -54
- package/dist/tests/package-info.test.js.map +0 -1
- package/dist/tests/proxy-no-proxy.test.d.ts +0 -1
- package/dist/tests/proxy-no-proxy.test.js +0 -156
- package/dist/tests/proxy-no-proxy.test.js.map +0 -1
- package/dist/tests/proxy.test.d.ts +0 -1
- package/dist/tests/proxy.test.js +0 -89
- package/dist/tests/proxy.test.js.map +0 -1
- package/dist/tests/reverse-reconnect.test.d.ts +0 -1
- package/dist/tests/reverse-reconnect.test.js +0 -89
- package/dist/tests/reverse-reconnect.test.js.map +0 -1
- package/dist/tests/security.test.d.ts +0 -1
- package/dist/tests/security.test.js +0 -21
- package/dist/tests/security.test.js.map +0 -1
- package/dist/tests/shell-tools.test.d.ts +0 -1
- package/dist/tests/shell-tools.test.js +0 -113
- package/dist/tests/shell-tools.test.js.map +0 -1
- package/dist/tests/test_files/test.d.ts +0 -1
- package/dist/tests/test_files/test.js +0 -4
- package/dist/tests/test_files/test.js.map +0 -1
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { test } from "node:test";
|
|
3
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
-
import { FteServer } from "mcp-fte";
|
|
5
|
-
import { installFteTransportLifecycle } from "../src/transports/fte-lifecycle.js";
|
|
6
|
-
class TestTransport {
|
|
7
|
-
startFailure;
|
|
8
|
-
closeBeforeReject;
|
|
9
|
-
closeGate;
|
|
10
|
-
onclose;
|
|
11
|
-
onerror;
|
|
12
|
-
onmessage;
|
|
13
|
-
closeCalls = 0;
|
|
14
|
-
constructor(startFailure, closeBeforeReject = false, closeGate) {
|
|
15
|
-
this.startFailure = startFailure;
|
|
16
|
-
this.closeBeforeReject = closeBeforeReject;
|
|
17
|
-
this.closeGate = closeGate;
|
|
18
|
-
}
|
|
19
|
-
async start() {
|
|
20
|
-
if (this.startFailure) {
|
|
21
|
-
if (this.closeBeforeReject)
|
|
22
|
-
this.onclose?.();
|
|
23
|
-
throw this.startFailure;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async send() { }
|
|
27
|
-
async close() {
|
|
28
|
-
this.closeCalls++;
|
|
29
|
-
this.onclose?.();
|
|
30
|
-
this.closeGate?.started();
|
|
31
|
-
await this.closeGate?.wait;
|
|
32
|
-
}
|
|
33
|
-
disconnect() {
|
|
34
|
-
this.onclose?.();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function createServer(cleanupCounter) {
|
|
38
|
-
const server = new McpServer({ name: "fte-lifecycle-test", version: "1.0.0" });
|
|
39
|
-
installFteTransportLifecycle(server, [], (transport, config) => {
|
|
40
|
-
const wrapped = FteServer.wrapTransport(transport, config);
|
|
41
|
-
const close = wrapped.close.bind(wrapped);
|
|
42
|
-
wrapped.close = async () => {
|
|
43
|
-
cleanupCounter.value++;
|
|
44
|
-
await close();
|
|
45
|
-
};
|
|
46
|
-
return wrapped;
|
|
47
|
-
});
|
|
48
|
-
return server;
|
|
49
|
-
}
|
|
50
|
-
async function flushCleanup() {
|
|
51
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
52
|
-
}
|
|
53
|
-
test("self-closing reverse transports dispose the FTE wrapper exactly once and allow reconnect", async () => {
|
|
54
|
-
const cleanupCounter = { value: 0 };
|
|
55
|
-
const server = createServer(cleanupCounter);
|
|
56
|
-
const first = new TestTransport();
|
|
57
|
-
await server.connect(first);
|
|
58
|
-
assert.equal(server.isConnected(), true);
|
|
59
|
-
first.disconnect();
|
|
60
|
-
await flushCleanup();
|
|
61
|
-
assert.equal(server.isConnected(), false);
|
|
62
|
-
assert.equal(cleanupCounter.value, 1);
|
|
63
|
-
const second = new TestTransport();
|
|
64
|
-
await server.connect(second);
|
|
65
|
-
assert.equal(server.isConnected(), true);
|
|
66
|
-
await server.close();
|
|
67
|
-
await flushCleanup();
|
|
68
|
-
assert.equal(server.isConnected(), false);
|
|
69
|
-
assert.equal(cleanupCounter.value, 2);
|
|
70
|
-
});
|
|
71
|
-
test("failed starts clean up FTE state even when the transport does not emit onclose", async () => {
|
|
72
|
-
const cleanupCounter = { value: 0 };
|
|
73
|
-
const server = createServer(cleanupCounter);
|
|
74
|
-
const failed = new TestTransport(new Error("connect failed"), false);
|
|
75
|
-
await assert.rejects(server.connect(failed), /connect failed/);
|
|
76
|
-
await flushCleanup();
|
|
77
|
-
assert.equal(server.isConnected(), false);
|
|
78
|
-
assert.equal(cleanupCounter.value, 1);
|
|
79
|
-
const next = new TestTransport();
|
|
80
|
-
await server.connect(next);
|
|
81
|
-
assert.equal(server.isConnected(), true);
|
|
82
|
-
await server.close();
|
|
83
|
-
});
|
|
84
|
-
test("failed starts that already emitted onclose still clean up only once", async () => {
|
|
85
|
-
const cleanupCounter = { value: 0 };
|
|
86
|
-
const server = createServer(cleanupCounter);
|
|
87
|
-
const failed = new TestTransport(new Error("closed while connecting"), true);
|
|
88
|
-
await assert.rejects(server.connect(failed), /closed while connecting/);
|
|
89
|
-
await flushCleanup();
|
|
90
|
-
assert.equal(server.isConnected(), false);
|
|
91
|
-
assert.equal(cleanupCounter.value, 1);
|
|
92
|
-
});
|
|
93
|
-
test("stale failed-transport cleanup cannot detach a newer connection", async () => {
|
|
94
|
-
const cleanupCounter = { value: 0 };
|
|
95
|
-
const server = createServer(cleanupCounter);
|
|
96
|
-
let markCloseStarted;
|
|
97
|
-
const closeStarted = new Promise((resolve) => {
|
|
98
|
-
markCloseStarted = resolve;
|
|
99
|
-
});
|
|
100
|
-
let releaseClose;
|
|
101
|
-
const closeWait = new Promise((resolve) => {
|
|
102
|
-
releaseClose = resolve;
|
|
103
|
-
});
|
|
104
|
-
const failed = new TestTransport(new Error("first connect failed"), false, { started: markCloseStarted, wait: closeWait });
|
|
105
|
-
const firstConnect = server.connect(failed);
|
|
106
|
-
await closeStarted;
|
|
107
|
-
// The first delegate has synchronously fired onclose, so Protocol is free to
|
|
108
|
-
// bind a replacement while the old FTE close remains asynchronously pending.
|
|
109
|
-
const replacement = new TestTransport();
|
|
110
|
-
await server.connect(replacement);
|
|
111
|
-
assert.equal(server.isConnected(), true);
|
|
112
|
-
releaseClose();
|
|
113
|
-
await assert.rejects(firstConnect, /first connect failed/);
|
|
114
|
-
assert.equal(server.isConnected(), true);
|
|
115
|
-
assert.equal(server.server.transport !== undefined, true);
|
|
116
|
-
await server.close();
|
|
117
|
-
});
|
|
118
|
-
//# sourceMappingURL=fte-lifecycle.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fte-lifecycle.test.js","sourceRoot":"","sources":["../../tests/fte-lifecycle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
-
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
-
async function run() {
|
|
4
|
-
console.log("Starting full LSP suite test via MCP...");
|
|
5
|
-
const transport = new StdioClientTransport({
|
|
6
|
-
command: "npx",
|
|
7
|
-
args: ["tsx", "src/index.ts", "--enable-lsp"]
|
|
8
|
-
});
|
|
9
|
-
const client = new Client({ name: "test-client", version: "1.0.0" }, { capabilities: {} });
|
|
10
|
-
await client.connect(transport);
|
|
11
|
-
console.log("Connected to MCP server");
|
|
12
|
-
const filesToTest = [
|
|
13
|
-
{ path: "tests/test_files/test.ts", line: 1, character: 8, label: "TypeScript" },
|
|
14
|
-
{ path: "tests/test_files/test.py", line: 1, character: 6, label: "Python" },
|
|
15
|
-
{ path: "tests/test_files/test.sh", line: 2, character: 2, label: "Bash" }
|
|
16
|
-
];
|
|
17
|
-
for (const file of filesToTest) {
|
|
18
|
-
try {
|
|
19
|
-
console.log(`\n================ Testing ${file.label} ================`);
|
|
20
|
-
console.log("Testing get_diagnostics...");
|
|
21
|
-
const diags = await client.callTool({
|
|
22
|
-
name: "get_diagnostics",
|
|
23
|
-
arguments: { path: file.path }
|
|
24
|
-
});
|
|
25
|
-
console.log(`Diagnostics:`, Array.isArray(diags.content) ? diags.content[0].text : "None");
|
|
26
|
-
console.log("Testing hover...");
|
|
27
|
-
const hoverInfo = await client.callTool({
|
|
28
|
-
name: "hover",
|
|
29
|
-
arguments: { path: file.path, line: file.line, character: file.character }
|
|
30
|
-
});
|
|
31
|
-
console.log("Hover output snippet:", JSON.stringify(hoverInfo).substring(0, 100) + "...");
|
|
32
|
-
console.log("Testing get_document_symbols...");
|
|
33
|
-
const symbols = await client.callTool({
|
|
34
|
-
name: "get_document_symbols",
|
|
35
|
-
arguments: { path: file.path }
|
|
36
|
-
});
|
|
37
|
-
console.log("Symbols snippet:", JSON.stringify(symbols).substring(0, 150));
|
|
38
|
-
}
|
|
39
|
-
catch (err) {
|
|
40
|
-
console.error(`Tool call failed for ${file.label}:`, err.message);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Close the transport so the spawned server process is terminated
|
|
44
|
-
// instead of leaking as an orphan (which also hangs `npm test`).
|
|
45
|
-
await client.close();
|
|
46
|
-
process.exit(0);
|
|
47
|
-
}
|
|
48
|
-
run().catch(async (err) => {
|
|
49
|
-
console.error(err);
|
|
50
|
-
process.exit(1);
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=lsp-client.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lsp-client.test.js","sourceRoot":"","sources":["../../tests/lsp-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { execFile } from "node:child_process";
|
|
3
|
-
import * as fs from "node:fs";
|
|
4
|
-
import * as path from "node:path";
|
|
5
|
-
import { pathToFileURL } from "node:url";
|
|
6
|
-
import { promisify } from "node:util";
|
|
7
|
-
import { test } from "node:test";
|
|
8
|
-
import { findPackageRoot, readPackageVersion, STAFF_MCP_PACKAGE_ROOT, STAFF_MCP_VERSION, } from "../src/package-info.js";
|
|
9
|
-
const execFileAsync = promisify(execFile);
|
|
10
|
-
test("runtime package metadata comes from the staff-mcp package.json", () => {
|
|
11
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(STAFF_MCP_PACKAGE_ROOT, "package.json"), "utf8"));
|
|
12
|
-
assert.equal(packageJson.name, "staff-mcp");
|
|
13
|
-
assert.equal(STAFF_MCP_VERSION, packageJson.version);
|
|
14
|
-
assert.equal(readPackageVersion(STAFF_MCP_PACKAGE_ROOT), packageJson.version);
|
|
15
|
-
assert.equal(findPackageRoot(path.join(STAFF_MCP_PACKAGE_ROOT, "src", "tools")), STAFF_MCP_PACKAGE_ROOT);
|
|
16
|
-
});
|
|
17
|
-
test("CLI --version reports the package version", async () => {
|
|
18
|
-
const cliPath = path.join(STAFF_MCP_PACKAGE_ROOT, "dist", "src", "index.js");
|
|
19
|
-
const { stdout } = await execFileAsync(process.execPath, [cliPath, "--version"], {
|
|
20
|
-
cwd: STAFF_MCP_PACKAGE_ROOT,
|
|
21
|
-
});
|
|
22
|
-
assert.equal(stdout.trim(), STAFF_MCP_VERSION);
|
|
23
|
-
});
|
|
24
|
-
test("MCP initialize response advertises the package version", async () => {
|
|
25
|
-
const serverUrl = pathToFileURL(path.join(STAFF_MCP_PACKAGE_ROOT, "dist", "src", "server.js")).href;
|
|
26
|
-
const packageInfoUrl = pathToFileURL(path.join(STAFF_MCP_PACKAGE_ROOT, "dist", "src", "package-info.js")).href;
|
|
27
|
-
const script = `
|
|
28
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
29
|
-
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
30
|
-
import { createServerFactory } from ${JSON.stringify(serverUrl)};
|
|
31
|
-
import { STAFF_MCP_VERSION } from ${JSON.stringify(packageInfoUrl)};
|
|
32
|
-
|
|
33
|
-
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
34
|
-
const server = createServerFactory(
|
|
35
|
-
"staff-mcp",
|
|
36
|
-
STAFF_MCP_VERSION,
|
|
37
|
-
process.cwd(),
|
|
38
|
-
[],
|
|
39
|
-
"default",
|
|
40
|
-
5,
|
|
41
|
-
false
|
|
42
|
-
)();
|
|
43
|
-
const client = new Client({ name: "version-test", version: "0.0.0" }, { capabilities: {} });
|
|
44
|
-
await Promise.all([server.connect(serverTransport), client.connect(clientTransport)]);
|
|
45
|
-
console.log(JSON.stringify(client.getServerVersion()));
|
|
46
|
-
process.exit(0);
|
|
47
|
-
`;
|
|
48
|
-
const { stdout } = await execFileAsync(process.execPath, ["--input-type=module", "--eval", script], { cwd: STAFF_MCP_PACKAGE_ROOT, timeout: 10_000 });
|
|
49
|
-
const outputLines = stdout.trim().split("\n");
|
|
50
|
-
const serverVersion = JSON.parse(outputLines.at(-1));
|
|
51
|
-
assert.equal(serverVersion.name, "staff-mcp");
|
|
52
|
-
assert.equal(serverVersion.version, STAFF_MCP_VERSION);
|
|
53
|
-
});
|
|
54
|
-
//# sourceMappingURL=package-info.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-info.test.js","sourceRoot":"","sources":["../../tests/package-info.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { test, after } from "node:test";
|
|
3
|
-
import http from "node:http";
|
|
4
|
-
import net from "node:net";
|
|
5
|
-
import { fetch } from "undici";
|
|
6
|
-
import { EnvProxyDispatcher, matchesNoProxy, parseNoProxy, selectProxyForOrigin, } from "../src/utils/proxy.js";
|
|
7
|
-
// ------------------------------------------------------------
|
|
8
|
-
// Pure matcher tests
|
|
9
|
-
// ------------------------------------------------------------
|
|
10
|
-
function m(noProxy, host, port = 80) {
|
|
11
|
-
return matchesNoProxy(host, port, parseNoProxy(noProxy));
|
|
12
|
-
}
|
|
13
|
-
test("NO_PROXY wildcard bypasses everything", () => {
|
|
14
|
-
assert.equal(m("*", "anything.example.com", 443), true);
|
|
15
|
-
assert.equal(m("*,proxy.internal", "proxy.internal"), true);
|
|
16
|
-
});
|
|
17
|
-
test("NO_PROXY exact hosts and case-insensitivity", () => {
|
|
18
|
-
assert.equal(m("172.25.44.201", "172.25.44.201"), true);
|
|
19
|
-
assert.equal(m("172.25.44.201", "172.25.44.202"), false);
|
|
20
|
-
assert.equal(m("EXAMPLE.com", "example.COM"), true);
|
|
21
|
-
assert.equal(m("example.com.", "example.com"), true); // FQDN trailing dot
|
|
22
|
-
assert.equal(m("example.com", "example.com."), true);
|
|
23
|
-
});
|
|
24
|
-
test("NO_PROXY domain suffixes (leading dot, star, bare domain)", () => {
|
|
25
|
-
assert.equal(m(".example.com", "www.example.com"), true);
|
|
26
|
-
assert.equal(m(".example.com", "example.com"), true);
|
|
27
|
-
assert.equal(m("*.example.com", "a.b.example.com"), true);
|
|
28
|
-
// bare domain covers subdomains too (curl/wget semantics)
|
|
29
|
-
assert.equal(m("example.com", "www.example.com"), true);
|
|
30
|
-
assert.equal(m("example.com", "notexample.com"), false);
|
|
31
|
-
assert.equal(m("ample.com", "example.com"), false);
|
|
32
|
-
});
|
|
33
|
-
test("NO_PROXY port qualifier restricts the entry to that port", () => {
|
|
34
|
-
assert.equal(m("example.com:8080", "example.com", 8080), true);
|
|
35
|
-
assert.equal(m("example.com:8080", "example.com", 80), false);
|
|
36
|
-
assert.equal(m("10.0.0.0/8:8080", "10.1.2.3", 8080), true);
|
|
37
|
-
assert.equal(m("10.0.0.0/8:8080", "10.1.2.3", 80), false);
|
|
38
|
-
});
|
|
39
|
-
test("NO_PROXY IPv4 CIDR ranges", () => {
|
|
40
|
-
// the corporate container case: 172.16.0.0/12 covers 172.16.0.0 - 172.31.255.255
|
|
41
|
-
assert.equal(m("172.16.0.0/12", "172.25.44.201"), true);
|
|
42
|
-
assert.equal(m("172.16.0.0/12", "172.31.255.254"), true);
|
|
43
|
-
assert.equal(m("172.16.0.0/12", "172.32.0.1"), false);
|
|
44
|
-
assert.equal(m("172.16.0.0/12", "10.0.0.1"), false);
|
|
45
|
-
assert.equal(m("10.0.0.0/8", "10.3.0.4"), true);
|
|
46
|
-
assert.equal(m("192.168.0.0/16", "192.168.1.1"), true);
|
|
47
|
-
assert.equal(m("192.168.0.0/16", "192.167.1.1"), false);
|
|
48
|
-
// boundary prefix lengths
|
|
49
|
-
assert.equal(m("0.0.0.0/0", "203.0.113.9"), true);
|
|
50
|
-
assert.equal(m("10.1.2.3/32", "10.1.2.3"), true);
|
|
51
|
-
assert.equal(m("10.1.2.3/32", "10.1.2.4"), false);
|
|
52
|
-
// hostnames never match IP CIDRs
|
|
53
|
-
assert.equal(m("10.0.0.0/8", "host.example.com"), false);
|
|
54
|
-
});
|
|
55
|
-
test("NO_PROXY IPv6 literals and CIDR ranges", () => {
|
|
56
|
-
assert.equal(m("::1", "::1"), true);
|
|
57
|
-
assert.equal(m("::1", "[::1]"), true);
|
|
58
|
-
assert.equal(m("[::1]", "::1"), true);
|
|
59
|
-
assert.equal(m("fd00::/8", "fd12::3456"), true);
|
|
60
|
-
assert.equal(m("fd00::/8", "fe80::1"), false);
|
|
61
|
-
assert.equal(m("fe80::/10", "fe80::1%eth0"), true); // zone id tolerated
|
|
62
|
-
// embedded IPv4 tail
|
|
63
|
-
assert.equal(m("::ffff:10.0.0.0/104", "::ffff:10.1.2.3"), true);
|
|
64
|
-
});
|
|
65
|
-
test("NO_PROXY invalid entries never match and never throw", () => {
|
|
66
|
-
assert.equal(m("10.0.0.0/33", "10.1.2.3"), false);
|
|
67
|
-
assert.equal(m("garbage///", "garbage"), false);
|
|
68
|
-
assert.equal(m("", "anything"), false);
|
|
69
|
-
assert.doesNotThrow(() => parseNoProxy(":::,,,[/8,"));
|
|
70
|
-
});
|
|
71
|
-
test("selectProxyForOrigin routing decisions", () => {
|
|
72
|
-
const cfg = { httpProxy: "http://proxy:10808", httpsProxy: "http://sproxy:10809" };
|
|
73
|
-
// CIDR bypass — the exact regression scenario from the field report
|
|
74
|
-
assert.equal(selectProxyForOrigin("http://172.25.44.201/api/mcp/reverse/sse", {
|
|
75
|
-
httpProxy: "http://172.25.44.201:10808",
|
|
76
|
-
noProxy: "localhost,127.0.0.1,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8",
|
|
77
|
-
}), null);
|
|
78
|
-
// not covered by NO_PROXY → use the per-protocol proxy
|
|
79
|
-
assert.equal(selectProxyForOrigin("http://8.8.8.8/x", { ...cfg, noProxy: "172.16.0.0/12" }), "http://proxy:10808");
|
|
80
|
-
assert.equal(selectProxyForOrigin("https://8.8.8.8/x", { ...cfg, noProxy: "" }), "http://sproxy:10809");
|
|
81
|
-
// https falls back to HTTP_PROXY when HTTPS_PROXY is unset (undici semantics)
|
|
82
|
-
assert.equal(selectProxyForOrigin("https://8.8.8.8/x", { httpProxy: "http://proxy:10808" }), "http://proxy:10808");
|
|
83
|
-
// http never uses HTTPS_PROXY
|
|
84
|
-
assert.equal(selectProxyForOrigin("http://8.8.8.8/x", { httpsProxy: "http://sproxy:10809" }), null);
|
|
85
|
-
// default ports participate in port-qualified NO_PROXY entries
|
|
86
|
-
assert.equal(selectProxyForOrigin("http://example.com/path", { httpProxy: "http://p:1", noProxy: "example.com:80" }), null);
|
|
87
|
-
assert.equal(selectProxyForOrigin("http://example.com:8080/path", { httpProxy: "http://p:1", noProxy: "example.com:80" }), "http://p:1");
|
|
88
|
-
// non-http protocols and garbage go direct
|
|
89
|
-
assert.equal(selectProxyForOrigin("ws://example.com/x", cfg), null);
|
|
90
|
-
assert.equal(selectProxyForOrigin("not a url", cfg), null);
|
|
91
|
-
});
|
|
92
|
-
async function startTargetServer() {
|
|
93
|
-
const server = http.createServer((req, res) => {
|
|
94
|
-
res.writeHead(200, { "content-type": "text/plain" });
|
|
95
|
-
res.end("target-ok");
|
|
96
|
-
});
|
|
97
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
98
|
-
const { port } = server.address();
|
|
99
|
-
return {
|
|
100
|
-
url: `http://127.0.0.1:${port}`,
|
|
101
|
-
close: () => new Promise((resolve) => server.close(() => resolve())),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/** Minimal HTTP proxy that handles CONNECT tunnels and counts them. */
|
|
105
|
-
async function startConnectProxy() {
|
|
106
|
-
let hits = 0;
|
|
107
|
-
const server = http.createServer((req, res) => {
|
|
108
|
-
res.writeHead(418);
|
|
109
|
-
res.end("unexpected plain proxy request");
|
|
110
|
-
});
|
|
111
|
-
server.on("connect", (req, socket, head) => {
|
|
112
|
-
hits++;
|
|
113
|
-
const [host, portStr] = (req.url ?? "").split(":");
|
|
114
|
-
const upstream = net.connect(Number(portStr), host, () => {
|
|
115
|
-
socket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
|
|
116
|
-
if (head?.length)
|
|
117
|
-
upstream.write(head);
|
|
118
|
-
upstream.pipe(socket);
|
|
119
|
-
socket.pipe(upstream);
|
|
120
|
-
});
|
|
121
|
-
upstream.on("error", () => socket.end());
|
|
122
|
-
socket.on("error", () => upstream.destroy());
|
|
123
|
-
});
|
|
124
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
125
|
-
const { port } = server.address();
|
|
126
|
-
return {
|
|
127
|
-
url: `http://127.0.0.1:${port}`,
|
|
128
|
-
hits: () => hits,
|
|
129
|
-
close: () => new Promise((resolve) => server.close(() => resolve())),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
const cleanups = [];
|
|
133
|
-
after(async () => {
|
|
134
|
-
for (const cleanup of cleanups.splice(0))
|
|
135
|
-
await cleanup();
|
|
136
|
-
});
|
|
137
|
-
test("EnvProxyDispatcher bypasses NO_PROXY CIDR targets, proxies the rest", async () => {
|
|
138
|
-
const target = await startTargetServer();
|
|
139
|
-
const proxy = await startConnectProxy();
|
|
140
|
-
cleanups.push(target.close, proxy.close);
|
|
141
|
-
// 1) target inside NO_PROXY range → direct, proxy untouched
|
|
142
|
-
const bypass = new EnvProxyDispatcher({ httpProxy: proxy.url, noProxy: "127.0.0.0/8" });
|
|
143
|
-
cleanups.push(() => bypass.close());
|
|
144
|
-
const res1 = await fetch(`${target.url}/ping`, { dispatcher: bypass });
|
|
145
|
-
assert.equal(res1.status, 200);
|
|
146
|
-
assert.equal(await res1.text(), "target-ok");
|
|
147
|
-
assert.equal(proxy.hits(), 0, "proxy must not be consulted for NO_PROXY targets");
|
|
148
|
-
// 2) target outside NO_PROXY range → CONNECT through the proxy
|
|
149
|
-
const proxied = new EnvProxyDispatcher({ httpProxy: proxy.url, noProxy: "10.0.0.0/8" });
|
|
150
|
-
cleanups.push(() => proxied.close());
|
|
151
|
-
const res2 = await fetch(`${target.url}/ping`, { dispatcher: proxied });
|
|
152
|
-
assert.equal(res2.status, 200);
|
|
153
|
-
assert.equal(await res2.text(), "target-ok");
|
|
154
|
-
assert.ok(proxy.hits() >= 1, "request should have been tunneled through the proxy");
|
|
155
|
-
});
|
|
156
|
-
//# sourceMappingURL=proxy-no-proxy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-no-proxy.test.js","sourceRoot":"","sources":["../../tests/proxy-no-proxy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/tests/proxy.test.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { test } from "node:test";
|
|
3
|
-
import { Agent, ProxyAgent, getGlobalDispatcher, setGlobalDispatcher, } from "undici";
|
|
4
|
-
import { EnvProxyDispatcher, configureGlobalProxy, hasProxyEnv, maskProxyUrl, } from "../src/utils/proxy.js";
|
|
5
|
-
const PROXY_ENV_KEYS = [
|
|
6
|
-
"HTTP_PROXY",
|
|
7
|
-
"http_proxy",
|
|
8
|
-
"HTTPS_PROXY",
|
|
9
|
-
"https_proxy",
|
|
10
|
-
"NO_PROXY",
|
|
11
|
-
"no_proxy",
|
|
12
|
-
];
|
|
13
|
-
/** Run fn with all proxy-related env vars removed, then restore them. */
|
|
14
|
-
function withCleanProxyEnv(fn) {
|
|
15
|
-
const saved = new Map();
|
|
16
|
-
for (const key of PROXY_ENV_KEYS) {
|
|
17
|
-
saved.set(key, process.env[key]);
|
|
18
|
-
delete process.env[key];
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
return fn();
|
|
22
|
-
}
|
|
23
|
-
finally {
|
|
24
|
-
for (const [key, value] of saved) {
|
|
25
|
-
if (value === undefined)
|
|
26
|
-
delete process.env[key];
|
|
27
|
-
else
|
|
28
|
-
process.env[key] = value;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function restoreDefaultDispatcher() {
|
|
33
|
-
setGlobalDispatcher(new Agent());
|
|
34
|
-
}
|
|
35
|
-
test("maskProxyUrl redacts credentials", () => {
|
|
36
|
-
assert.equal(maskProxyUrl("http://user:secret@proxy.example.com:8080"), "http://***:***@proxy.example.com:8080/");
|
|
37
|
-
assert.equal(maskProxyUrl("http://proxy.example.com:8080"), "http://proxy.example.com:8080/");
|
|
38
|
-
assert.equal(maskProxyUrl("not a url"), "<invalid proxy URL>");
|
|
39
|
-
});
|
|
40
|
-
test("hasProxyEnv detects uppercase and lowercase variables", () => {
|
|
41
|
-
assert.equal(hasProxyEnv({}), false);
|
|
42
|
-
assert.equal(hasProxyEnv({ HTTP_PROXY: "http://127.0.0.1:8080" }), true);
|
|
43
|
-
assert.equal(hasProxyEnv({ https_proxy: "http://127.0.0.1:8080" }), true);
|
|
44
|
-
assert.equal(hasProxyEnv({ NO_PROXY: "localhost" }), false);
|
|
45
|
-
});
|
|
46
|
-
test("explicit --proxy installs a ProxyAgent for all traffic", () => withCleanProxyEnv(() => {
|
|
47
|
-
try {
|
|
48
|
-
assert.equal(configureGlobalProxy("http://127.0.0.1:8080"), true);
|
|
49
|
-
assert.ok(getGlobalDispatcher() instanceof ProxyAgent);
|
|
50
|
-
}
|
|
51
|
-
finally {
|
|
52
|
-
restoreDefaultDispatcher();
|
|
53
|
-
}
|
|
54
|
-
}));
|
|
55
|
-
test("proxy env vars install an EnvProxyDispatcher", () => withCleanProxyEnv(() => {
|
|
56
|
-
process.env.HTTPS_PROXY = "http://127.0.0.1:8080";
|
|
57
|
-
try {
|
|
58
|
-
assert.equal(configureGlobalProxy(), true);
|
|
59
|
-
assert.ok(getGlobalDispatcher() instanceof EnvProxyDispatcher);
|
|
60
|
-
}
|
|
61
|
-
finally {
|
|
62
|
-
restoreDefaultDispatcher();
|
|
63
|
-
}
|
|
64
|
-
}));
|
|
65
|
-
test("explicit --proxy wins over env vars", () => withCleanProxyEnv(() => {
|
|
66
|
-
process.env.HTTPS_PROXY = "http://127.0.0.1:8080";
|
|
67
|
-
try {
|
|
68
|
-
assert.equal(configureGlobalProxy("http://127.0.0.1:9090"), true);
|
|
69
|
-
assert.ok(getGlobalDispatcher() instanceof ProxyAgent);
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
restoreDefaultDispatcher();
|
|
73
|
-
}
|
|
74
|
-
}));
|
|
75
|
-
test("no proxy configuration leaves the default dispatcher untouched", () => withCleanProxyEnv(() => {
|
|
76
|
-
restoreDefaultDispatcher();
|
|
77
|
-
const before = getGlobalDispatcher();
|
|
78
|
-
assert.equal(configureGlobalProxy(), false);
|
|
79
|
-
assert.equal(getGlobalDispatcher(), before);
|
|
80
|
-
}));
|
|
81
|
-
test("an invalid explicit proxy does not throw and reports failure", () => withCleanProxyEnv(() => {
|
|
82
|
-
restoreDefaultDispatcher();
|
|
83
|
-
// ProxyAgent constructor accepts arbitrary strings; verify the call
|
|
84
|
-
// path is resilient either way and never crashes startup.
|
|
85
|
-
const result = configureGlobalProxy("://invalid");
|
|
86
|
-
assert.equal(typeof result, "boolean");
|
|
87
|
-
restoreDefaultDispatcher();
|
|
88
|
-
}));
|
|
89
|
-
//# sourceMappingURL=proxy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.test.js","sourceRoot":"","sources":["../../tests/proxy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { createServer as createNetServer } from "node:net";
|
|
3
|
-
import { test } from "node:test";
|
|
4
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
5
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
-
import { SSEAcceptor } from "mcp-reverse";
|
|
7
|
-
import { installFteTransportLifecycle } from "../src/transports/fte-lifecycle.js";
|
|
8
|
-
import { startReverseServer } from "../src/transports/reverse.js";
|
|
9
|
-
const noopLogger = {
|
|
10
|
-
debug: () => { },
|
|
11
|
-
info: () => { },
|
|
12
|
-
warn: () => { },
|
|
13
|
-
error: () => { },
|
|
14
|
-
};
|
|
15
|
-
async function freePort() {
|
|
16
|
-
const server = createNetServer();
|
|
17
|
-
await new Promise((resolve, reject) => {
|
|
18
|
-
server.once("error", reject);
|
|
19
|
-
server.listen(0, "127.0.0.1", resolve);
|
|
20
|
-
});
|
|
21
|
-
const address = server.address();
|
|
22
|
-
if (!address || typeof address === "string")
|
|
23
|
-
throw new Error("Could not allocate port");
|
|
24
|
-
await new Promise((resolve) => server.close(() => resolve()));
|
|
25
|
-
return address.port;
|
|
26
|
-
}
|
|
27
|
-
async function waitFor(predicate, timeout = 10_000) {
|
|
28
|
-
const deadline = Date.now() + timeout;
|
|
29
|
-
while (!predicate()) {
|
|
30
|
-
if (Date.now() >= deadline)
|
|
31
|
-
throw new Error("Timed out waiting for condition");
|
|
32
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
test("staff reverse mode reconnects through a gateway restart with FTE wrapping enabled", async () => {
|
|
36
|
-
const port = await freePort();
|
|
37
|
-
const serverName = "staff-restart-test";
|
|
38
|
-
const token = "staff-restart-token";
|
|
39
|
-
const gatewayClients = [];
|
|
40
|
-
const createAcceptor = () => {
|
|
41
|
-
const acceptor = new SSEAcceptor({
|
|
42
|
-
port,
|
|
43
|
-
host: "127.0.0.1",
|
|
44
|
-
authTokens: { [serverName]: token },
|
|
45
|
-
heartbeat: { enabled: false },
|
|
46
|
-
sessionTimeout: 5_000,
|
|
47
|
-
}, noopLogger);
|
|
48
|
-
acceptor.onConnection(async (connection) => {
|
|
49
|
-
const gatewayClient = new Client({ name: "gateway-test", version: "1.0.0" });
|
|
50
|
-
gatewayClients.push(gatewayClient);
|
|
51
|
-
await gatewayClient.connect(connection.transport);
|
|
52
|
-
});
|
|
53
|
-
return acceptor;
|
|
54
|
-
};
|
|
55
|
-
let acceptor = createAcceptor();
|
|
56
|
-
await acceptor.start();
|
|
57
|
-
const mcpServer = new McpServer({ name: serverName, version: "1.0.0" });
|
|
58
|
-
installFteTransportLifecycle(mcpServer, []);
|
|
59
|
-
const reverseClient = await startReverseServer(mcpServer, `http://127.0.0.1:${port}/mcp-reverse`, token, serverName, {
|
|
60
|
-
connectTimeout: 500,
|
|
61
|
-
reconnect: {
|
|
62
|
-
initialDelay: 10,
|
|
63
|
-
maxDelay: 20,
|
|
64
|
-
multiplier: 1,
|
|
65
|
-
jitter: false,
|
|
66
|
-
maxRetries: 0,
|
|
67
|
-
},
|
|
68
|
-
logger: noopLogger,
|
|
69
|
-
});
|
|
70
|
-
try {
|
|
71
|
-
await waitFor(() => gatewayClients.length === 1 && gatewayClients[0].getServerVersion() !== undefined);
|
|
72
|
-
assert.equal(acceptor.sessionCount, 1);
|
|
73
|
-
await acceptor.close();
|
|
74
|
-
await waitFor(() => !mcpServer.isConnected());
|
|
75
|
-
// Leave the gateway down long enough for at least one failed attempt.
|
|
76
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
77
|
-
acceptor = createAcceptor();
|
|
78
|
-
await acceptor.start();
|
|
79
|
-
await waitFor(() => gatewayClients.length >= 2 && gatewayClients[1].getServerVersion() !== undefined);
|
|
80
|
-
assert.equal(acceptor.sessionCount, 1);
|
|
81
|
-
assert.equal(mcpServer.isConnected(), true);
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
await reverseClient.stop();
|
|
85
|
-
await Promise.allSettled(gatewayClients.map((client) => client.close()));
|
|
86
|
-
await acceptor.close();
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
//# sourceMappingURL=reverse-reconnect.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-reconnect.test.js","sourceRoot":"","sources":["../../tests/reverse-reconnect.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|