staff-mcp 1.3.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 +152 -55
- package/README_zh.md +155 -53
- 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 +276 -131
- package/dist/src/index.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 +243 -103
- 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/transports/http.d.ts +15 -2
- package/dist/src/transports/http.js +244 -65
- 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 +5 -2
- package/dist/src/transports/stdio.js +130 -20
- package/dist/src/transports/stdio.js.map +1 -1
- package/dist/src/utils/proxy.d.ts +2 -2
- 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 +28 -6
- 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
|
@@ -1,78 +1,134 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
debug: debugEnabled
|
|
21
|
-
? (message, ...args) => console.error(`[staff-mcp][reverse][debug] ${message}`, ...args)
|
|
22
|
-
: () => { },
|
|
23
|
-
info: (message, ...args) => console.error(`[staff-mcp][reverse][info] ${message}`, ...args),
|
|
24
|
-
warn: (message, ...args) => console.error(`[staff-mcp][reverse][warn] ${message}`, ...args),
|
|
25
|
-
error: (message, ...args) => console.error(`[staff-mcp][reverse][error] ${message}`, ...args),
|
|
1
|
+
import { performance } from 'node:perf_hooks';
|
|
2
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
3
|
+
import { configureExtensionData } from '../extensions/runtime.js';
|
|
4
|
+
import { HttpDataSession } from '../data/HttpDataSession.js';
|
|
5
|
+
import { ReverseSseTransport } from '../reverse/SseTransport.js';
|
|
6
|
+
import { createReverseHttp, reverseProxyUrl, validateReverseUrl, } from '../reverse/http.js';
|
|
7
|
+
export { reverseProxyUrl, validateReverseUrl } from '../reverse/http.js';
|
|
8
|
+
/** New HTTP pool, SDK transport and data resources per attempt; never replay requests or input. */
|
|
9
|
+
export async function startReverseServer(serverFactory, value, token, name, options = {}) {
|
|
10
|
+
const url = validateReverseUrl(value);
|
|
11
|
+
const proxy = reverseProxyUrl(url, options.proxy);
|
|
12
|
+
if (!token || /\s/.test(token) || token.length > 4096)
|
|
13
|
+
throw new Error('Invalid reverse token.');
|
|
14
|
+
if (!name || name.length > 512 || /[\u0000-\u001f\u007f]/.test(name))
|
|
15
|
+
throw new Error('Invalid reverse server name.');
|
|
16
|
+
const log = options.logger ?? {
|
|
17
|
+
info: (message) => console.error(`[staff-mcp][reverse] ${message}`),
|
|
18
|
+
warn: (message) => console.error(`[staff-mcp][reverse] ${message}`),
|
|
19
|
+
error: (message) => console.error(`[staff-mcp][reverse] ${message}`),
|
|
26
20
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
21
|
+
if (url.protocol === 'http:')
|
|
22
|
+
log.warn('Explicit HTTP reverse control uses plaintext; use HTTPS on untrusted networks.');
|
|
23
|
+
const abort = new AbortController();
|
|
24
|
+
let active;
|
|
25
|
+
let backoff = options.reconnect?.initialDelay ?? 1000;
|
|
26
|
+
const run = async () => {
|
|
27
|
+
while (!abort.signal.aborted) {
|
|
28
|
+
let server;
|
|
29
|
+
let initializedAt;
|
|
30
|
+
let previousInitialized;
|
|
31
|
+
let initializationTimer;
|
|
32
|
+
const attempt = new AbortController();
|
|
33
|
+
const stopped = () => {
|
|
34
|
+
attempt.abort();
|
|
35
|
+
void active?.close();
|
|
36
|
+
};
|
|
37
|
+
abort.signal.addEventListener('abort', stopped, { once: true });
|
|
38
|
+
const http = createReverseHttp(url, proxy, attempt.signal);
|
|
39
|
+
const transport = new ReverseSseTransport(url, { Authorization: `Bearer ${token}`, 'X-MCP-Server-Name': name }, http.fetch, options.connectTimeout, options.heartbeat?.readTimeout);
|
|
40
|
+
active = transport;
|
|
41
|
+
try {
|
|
42
|
+
server = serverFactory();
|
|
43
|
+
configureExtensionData(server, (binding, accept, signal, origin, supportsPurpose) => {
|
|
44
|
+
if (origin !== undefined)
|
|
45
|
+
throw new Error('Reverse data does not accept an advertised origin');
|
|
46
|
+
const sessionId = transport.sessionId;
|
|
47
|
+
if (!sessionId ||
|
|
48
|
+
attempt.signal.aborted ||
|
|
49
|
+
signal.aborted)
|
|
50
|
+
throw new Error('Reverse data control session unavailable');
|
|
51
|
+
const expected = new URL(url.href);
|
|
52
|
+
expected.pathname =
|
|
53
|
+
url.pathname.replace(/\/$/, '') +
|
|
54
|
+
'/data/' +
|
|
55
|
+
sessionId;
|
|
56
|
+
return {
|
|
57
|
+
session: new HttpDataSession({
|
|
58
|
+
role: 'remote',
|
|
59
|
+
binding,
|
|
60
|
+
accept,
|
|
61
|
+
supportsPurpose,
|
|
62
|
+
fetch: http.fetch,
|
|
63
|
+
validateEndpoint: (endpoint) => {
|
|
64
|
+
if (endpoint.origin !== expected.origin ||
|
|
65
|
+
endpoint.pathname !==
|
|
66
|
+
expected.pathname ||
|
|
67
|
+
endpoint.username ||
|
|
68
|
+
endpoint.password ||
|
|
69
|
+
endpoint.search ||
|
|
70
|
+
endpoint.hash)
|
|
71
|
+
throw new Error('Reverse data endpoint rejected');
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
previousInitialized = server.server.oninitialized;
|
|
77
|
+
server.server.oninitialized = () => {
|
|
78
|
+
previousInitialized?.();
|
|
79
|
+
initializedAt = performance.now();
|
|
80
|
+
clearTimeout(initializationTimer);
|
|
81
|
+
log.info('MCP initialized on a new SSE session.');
|
|
82
|
+
};
|
|
83
|
+
await server.connect(transport);
|
|
84
|
+
// start() completes once the SSE endpoint is admitted; only then start the initialization deadline.
|
|
85
|
+
if (initializedAt === undefined) {
|
|
86
|
+
initializationTimer = setTimeout(() => {
|
|
87
|
+
void transport.close();
|
|
88
|
+
}, options.initializationTimeout ?? 15000);
|
|
89
|
+
initializationTimer.unref();
|
|
90
|
+
}
|
|
91
|
+
await transport.closed;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
if (!abort.signal.aborted)
|
|
95
|
+
log.warn('Connection attempt ended before readiness or control connection closed.');
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
clearTimeout(initializationTimer);
|
|
99
|
+
await transport.close().catch(() => { });
|
|
100
|
+
attempt.abort();
|
|
101
|
+
await http.close().catch(() => { });
|
|
102
|
+
abort.signal.removeEventListener('abort', stopped);
|
|
103
|
+
await server?.close();
|
|
104
|
+
if (server)
|
|
105
|
+
server.server.oninitialized = previousInitialized;
|
|
106
|
+
active = undefined;
|
|
107
|
+
}
|
|
108
|
+
if (abort.signal.aborted || options.reconnect?.enabled === false)
|
|
109
|
+
break;
|
|
110
|
+
if (initializedAt !== undefined &&
|
|
111
|
+
performance.now() - initializedAt >=
|
|
112
|
+
(options.reconnect?.stableConnectionMs ?? 30000))
|
|
113
|
+
backoff = options.reconnect?.initialDelay ?? 1000;
|
|
114
|
+
log.info('Disconnected; retrying with a new session and no replay.');
|
|
115
|
+
try {
|
|
116
|
+
await delay(backoff, undefined, { signal: abort.signal });
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
backoff = Math.min(options.reconnect?.maxDelay ?? 30000, backoff * 2);
|
|
67
122
|
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
123
|
+
};
|
|
124
|
+
const closed = run();
|
|
125
|
+
return {
|
|
126
|
+
closed,
|
|
127
|
+
stop: async () => {
|
|
128
|
+
abort.abort();
|
|
129
|
+
await active?.close().catch(() => { });
|
|
130
|
+
await closed;
|
|
131
|
+
},
|
|
132
|
+
};
|
|
77
133
|
}
|
|
78
134
|
//# sourceMappingURL=reverse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../../src/transports/reverse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../../src/transports/reverse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACH,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAwBzE,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,aAA8B,EAC9B,KAAa,EACb,KAAa,EACb,IAAY,EACZ,UAAgC,EAAE;IAElC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QACjD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI;QAC1B,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC;QACpD,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC;QACpD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CACvB,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC;KACvD,CAAC;IACF,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;QACxB,GAAG,CAAC,IAAI,CACJ,gFAAgF,CACnF,CAAC;IACN,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,MAAuC,CAAC;IAE5C,IAAI,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,IAAI,IAAI,CAAC;IACtD,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,MAA6B,CAAC;YAClC,IAAI,aAAiC,CAAC;YACtC,IAAI,mBAA6C,CAAC;YAClD,IAAI,mBAA+C,CAAC;YACpD,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,GAAG,EAAE;gBACjB,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,MAAM,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,mBAAmB,CACrC,GAAG,EACH,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAC/D,IAAI,CAAC,KAAK,EACV,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,SAAS,EAAE,WAAW,CACjC,CAAC;YACF,MAAM,GAAG,SAAS,CAAC;YACnB,IAAI,CAAC;gBACD,MAAM,GAAG,aAAa,EAAE,CAAC;gBACzB,sBAAsB,CAClB,MAAM,EACN,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE;oBACjD,IAAI,MAAM,KAAK,SAAS;wBACpB,MAAM,IAAI,KAAK,CACX,mDAAmD,CACtD,CAAC;oBACN,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;oBACtC,IACI,CAAC,SAAS;wBACV,OAAO,CAAC,MAAM,CAAC,OAAO;wBACtB,MAAM,CAAC,OAAO;wBAEd,MAAM,IAAI,KAAK,CACX,0CAA0C,CAC7C,CAAC;oBACN,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACnC,QAAQ,CAAC,QAAQ;wBACb,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;4BAC/B,QAAQ;4BACR,SAAS,CAAC;oBACd,OAAO;wBACH,OAAO,EAAE,IAAI,eAAe,CAAC;4BACzB,IAAI,EAAE,QAAQ;4BACd,OAAO;4BACP,MAAM;4BACN,eAAe;4BACf,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;gCAC3B,IACI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;oCACnC,QAAQ,CAAC,QAAQ;wCACb,QAAQ,CAAC,QAAQ;oCACrB,QAAQ,CAAC,QAAQ;oCACjB,QAAQ,CAAC,QAAQ;oCACjB,QAAQ,CAAC,MAAM;oCACf,QAAQ,CAAC,IAAI;oCAEb,MAAM,IAAI,KAAK,CACX,gCAAgC,CACnC,CAAC;4BACV,CAAC;yBACJ,CAAC;qBACL,CAAC;gBACN,CAAC,CACJ,CAAC;gBACF,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;gBAClD,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,GAAG,EAAE;oBAC/B,mBAAmB,EAAE,EAAE,CAAC;oBACxB,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;oBAClC,YAAY,CAAC,mBAAmB,CAAC,CAAC;oBAClC,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBACtD,CAAC,CAAC;gBACF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,oGAAoG;gBACpG,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBAC9B,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;wBAClC,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;oBAC3B,CAAC,EAAE,OAAO,CAAC,qBAAqB,IAAI,KAAK,CAAC,CAAC;oBAC3C,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBAChC,CAAC;gBACD,MAAM,SAAS,CAAC,MAAM,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;oBACrB,GAAG,CAAC,IAAI,CACJ,yEAAyE,CAC5E,CAAC;YACV,CAAC;oBAAS,CAAC;gBACP,YAAY,CAAC,mBAAmB,CAAC,CAAC;gBAClC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACnC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;gBACtB,IAAI,MAAM;oBAAE,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,mBAAmB,CAAC;gBAC9D,MAAM,GAAG,SAAS,CAAC;YACvB,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,OAAO,KAAK,KAAK;gBAC5D,MAAM;YACV,IACI,aAAa,KAAK,SAAS;gBAC3B,WAAW,CAAC,GAAG,EAAE,GAAG,aAAa;oBAC7B,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,IAAI,KAAK,CAAC;gBAEpD,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,IAAI,IAAI,CAAC;YACtD,GAAG,CAAC,IAAI,CACJ,0DAA0D,CAC7D,CAAC;YACF,IAAI,CAAC;gBACD,MAAM,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM;YACV,CAAC;YACD,OAAO,GAAG,IAAI,CAAC,GAAG,CACd,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,KAAK,EACpC,OAAO,GAAG,CAAC,CACd,CAAC;QACN,CAAC;IACL,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC;IACrB,OAAO;QACH,MAAM;QACN,IAAI,EAAE,KAAK,IAAI,EAAE;YACb,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,MAAM,MAAM,CAAC;QACjB,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { McpServer } from
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
export declare function redirectStdioLogsToStderr(): void;
|
|
3
|
-
export declare function startStdioServer(server: McpServer): Promise<
|
|
3
|
+
export declare function startStdioServer(server: McpServer): Promise<{
|
|
4
|
+
stop: () => Promise<void>;
|
|
5
|
+
closed: Promise<void>;
|
|
6
|
+
}>;
|
|
@@ -1,31 +1,141 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { HttpDataSession } from '../data/HttpDataSession.js';
|
|
4
|
+
import { handleNodeRequest } from '../data/node.js';
|
|
5
|
+
import { readDockerDataBaseUrl } from '../data-stdio-docker.js';
|
|
6
|
+
import { configureExtensionData } from '../extensions/runtime.js';
|
|
7
|
+
import { extensionError } from '../extensions/protocol.js';
|
|
2
8
|
export function redirectStdioLogsToStderr() {
|
|
3
|
-
// MCP stdio reserves stdout for JSON-RPC frames.
|
|
4
|
-
|
|
5
|
-
console.log = (...args) => {
|
|
6
|
-
console.error(...args);
|
|
7
|
-
};
|
|
9
|
+
// MCP stdio reserves stdout for JSON-RPC frames.
|
|
10
|
+
console.log = (...args) => console.error(...args);
|
|
8
11
|
}
|
|
9
12
|
export async function startStdioServer(server) {
|
|
13
|
+
configureExtensionData(server, async (binding, accept, signal, origin, supportsPurpose) => {
|
|
14
|
+
if (origin !== undefined)
|
|
15
|
+
extensionError('INVALID_PARAMS', 'Stdio data does not accept an advertised origin');
|
|
16
|
+
const dockerBase = await readDockerDataBaseUrl();
|
|
17
|
+
signal.throwIfAborted();
|
|
18
|
+
const host = dockerBase
|
|
19
|
+
? process.env.STAFF_MCP_DATA_HOST
|
|
20
|
+
: '127.0.0.1';
|
|
21
|
+
const port = dockerBase
|
|
22
|
+
? Number(process.env.STAFF_MCP_DATA_PORT)
|
|
23
|
+
: 0;
|
|
24
|
+
if (dockerBase && (host !== '0.0.0.0' || port !== 39173))
|
|
25
|
+
throw new Error('Invalid Docker data listener configuration.');
|
|
26
|
+
let session;
|
|
27
|
+
const listener = createServer((request, response) => {
|
|
28
|
+
if (!session) {
|
|
29
|
+
response.writeHead(503);
|
|
30
|
+
response.end();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
void handleNodeRequest(session, request, response).then((handled) => {
|
|
34
|
+
if (!handled) {
|
|
35
|
+
response.writeHead(404);
|
|
36
|
+
response.end();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
const close = () => new Promise((resolve) => {
|
|
41
|
+
listener.closeAllConnections();
|
|
42
|
+
listener.close(() => resolve());
|
|
43
|
+
});
|
|
44
|
+
const onAbort = () => {
|
|
45
|
+
void close();
|
|
46
|
+
};
|
|
47
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
48
|
+
try {
|
|
49
|
+
await new Promise((resolve, reject) => {
|
|
50
|
+
listener.once('error', reject);
|
|
51
|
+
listener.listen(port, host, () => {
|
|
52
|
+
listener.removeListener('error', reject);
|
|
53
|
+
resolve();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
signal.throwIfAborted();
|
|
57
|
+
const localBase = `http://127.0.0.1:${listener.address().port}`;
|
|
58
|
+
const endpoint = `${dockerBase ?? localBase}/mcp/data/${binding}`;
|
|
59
|
+
session = new HttpDataSession({
|
|
60
|
+
role: 'remote',
|
|
61
|
+
binding,
|
|
62
|
+
endpoint,
|
|
63
|
+
accept,
|
|
64
|
+
supportsPurpose,
|
|
65
|
+
// Listener mode must never follow a peer-supplied outbound descriptor.
|
|
66
|
+
fetch: async () => {
|
|
67
|
+
throw new Error('Outbound data is unavailable in stdio listener mode');
|
|
68
|
+
},
|
|
69
|
+
validateEndpoint: () => {
|
|
70
|
+
throw new Error('Outbound data endpoint is unavailable in stdio listener mode');
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
session,
|
|
75
|
+
endpoint,
|
|
76
|
+
close: () => {
|
|
77
|
+
signal.removeEventListener('abort', onAbort);
|
|
78
|
+
return close();
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
signal.removeEventListener('abort', onAbort);
|
|
84
|
+
session?.close();
|
|
85
|
+
await close();
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
10
89
|
const transport = new StdioServerTransport();
|
|
90
|
+
let resolveClosed;
|
|
91
|
+
let rejectClosed;
|
|
92
|
+
const closed = new Promise((resolve, reject) => {
|
|
93
|
+
resolveClosed = resolve;
|
|
94
|
+
rejectClosed = reject;
|
|
95
|
+
});
|
|
96
|
+
// EOF may arrive before the caller receives the controller.
|
|
97
|
+
void closed.catch(() => { });
|
|
98
|
+
let stopping;
|
|
99
|
+
let inputError;
|
|
100
|
+
const stop = () => {
|
|
101
|
+
stopping ??= Promise.resolve().then(async () => {
|
|
102
|
+
process.stdin.removeListener('end', onStdinClosed);
|
|
103
|
+
process.stdin.removeListener('close', onStdinClosed);
|
|
104
|
+
process.stdin.removeListener('error', onStdinError);
|
|
105
|
+
try {
|
|
106
|
+
await server.close();
|
|
107
|
+
if (inputError)
|
|
108
|
+
throw inputError;
|
|
109
|
+
resolveClosed();
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
rejectClosed(error);
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
return stopping;
|
|
117
|
+
};
|
|
118
|
+
const onStdinClosed = () => {
|
|
119
|
+
void stop().catch(() => { });
|
|
120
|
+
};
|
|
121
|
+
const onStdinError = () => {
|
|
122
|
+
inputError = new Error('MCP input stream failed.');
|
|
123
|
+
onStdinClosed();
|
|
124
|
+
};
|
|
125
|
+
transport.onclose = onStdinClosed;
|
|
126
|
+
process.stdin.once('end', onStdinClosed);
|
|
127
|
+
process.stdin.once('close', onStdinClosed);
|
|
128
|
+
process.stdin.once('error', onStdinError);
|
|
11
129
|
try {
|
|
12
130
|
await server.connect(transport);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// (LSP servers, intervals, background tasks). The process 'exit' hook
|
|
18
|
-
// registered by the shell tools also cleans up any background task groups.
|
|
19
|
-
const onStdinClosed = () => {
|
|
20
|
-
console.error("[staff-mcp] stdin closed (client disconnected), shutting down.");
|
|
21
|
-
process.exit(0);
|
|
22
|
-
};
|
|
23
|
-
process.stdin.on("end", onStdinClosed);
|
|
24
|
-
process.stdin.on("close", onStdinClosed);
|
|
131
|
+
if (process.stdin.readableEnded || process.stdin.destroyed)
|
|
132
|
+
onStdinClosed();
|
|
133
|
+
console.error('MCP Server (Stdio) is running.');
|
|
134
|
+
return { stop, closed };
|
|
25
135
|
}
|
|
26
136
|
catch (error) {
|
|
27
|
-
|
|
28
|
-
|
|
137
|
+
await stop().catch(() => { });
|
|
138
|
+
throw error;
|
|
29
139
|
}
|
|
30
140
|
}
|
|
31
141
|
//# sourceMappingURL=stdio.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/transports/stdio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/transports/stdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Agent, Dispatcher } from
|
|
1
|
+
import { Agent, Dispatcher } from 'undici';
|
|
2
2
|
/**
|
|
3
3
|
* Whether proxy environment variables are present (NO_PROXY alone does not count).
|
|
4
4
|
*/
|
|
5
5
|
export declare function hasProxyEnv(env?: NodeJS.ProcessEnv): boolean;
|
|
6
|
-
export type NoProxyEntryKind =
|
|
6
|
+
export type NoProxyEntryKind = 'wildcard' | 'exact' | 'suffix' | 'cidr4' | 'cidr6';
|
|
7
7
|
export interface NoProxyEntry {
|
|
8
8
|
kind: NoProxyEntryKind;
|
|
9
9
|
/** normalized host: lowercase, no trailing dot, no IPv6 brackets */
|