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.
Files changed (94) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +152 -55
  3. package/README_zh.md +155 -53
  4. package/dist/src/data/HttpDataSession.d.ts +22 -0
  5. package/dist/src/data/HttpDataSession.js +925 -0
  6. package/dist/src/data/HttpDataSession.js.map +1 -0
  7. package/dist/src/data/node.d.ts +4 -0
  8. package/dist/src/data/node.js +93 -0
  9. package/dist/src/data/node.js.map +1 -0
  10. package/dist/src/data/types.d.ts +54 -0
  11. package/dist/src/data/types.js +2 -0
  12. package/dist/src/data/types.js.map +1 -0
  13. package/dist/src/data-stdio-docker.d.ts +10 -0
  14. package/dist/src/data-stdio-docker.js +140 -0
  15. package/dist/src/data-stdio-docker.js.map +1 -0
  16. package/dist/src/docker-proxy.d.ts +6 -1
  17. package/dist/src/docker-proxy.js +324 -147
  18. package/dist/src/docker-proxy.js.map +1 -1
  19. package/dist/src/extensions/apps.d.ts +12 -0
  20. package/dist/src/extensions/apps.js +85 -0
  21. package/dist/src/extensions/apps.js.map +1 -0
  22. package/dist/src/extensions/config.d.ts +27 -0
  23. package/dist/src/extensions/config.js +91 -0
  24. package/dist/src/extensions/config.js.map +1 -0
  25. package/dist/src/extensions/protocol.d.ts +35 -0
  26. package/dist/src/extensions/protocol.js +47 -0
  27. package/dist/src/extensions/protocol.js.map +1 -0
  28. package/dist/src/extensions/runtime.d.ts +16 -0
  29. package/dist/src/extensions/runtime.js +266 -0
  30. package/dist/src/extensions/runtime.js.map +1 -0
  31. package/dist/src/file-manager/extension.d.ts +21 -0
  32. package/dist/src/file-manager/extension.js +514 -0
  33. package/dist/src/file-manager/extension.js.map +1 -0
  34. package/dist/src/file-manager/file-core.d.ts +128 -0
  35. package/dist/src/file-manager/file-core.js +750 -0
  36. package/dist/src/file-manager/file-core.js.map +1 -0
  37. package/dist/src/file-manager/transfers.d.ts +423 -0
  38. package/dist/src/file-manager/transfers.js +540 -0
  39. package/dist/src/file-manager/transfers.js.map +1 -0
  40. package/dist/src/file-manager/ui/index.html +81 -0
  41. package/dist/src/index.js +276 -131
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/reverse/SseTransport.d.ts +34 -0
  44. package/dist/src/reverse/SseTransport.js +215 -0
  45. package/dist/src/reverse/SseTransport.js.map +1 -0
  46. package/dist/src/reverse/http.d.ts +7 -0
  47. package/dist/src/reverse/http.js +85 -0
  48. package/dist/src/reverse/http.js.map +1 -0
  49. package/dist/src/server.d.ts +4 -2
  50. package/dist/src/server.js +80 -18
  51. package/dist/src/server.js.map +1 -1
  52. package/dist/src/terminal/extension.d.ts +4 -0
  53. package/dist/src/terminal/extension.js +108 -0
  54. package/dist/src/terminal/extension.js.map +1 -0
  55. package/dist/src/terminal/pty.d.ts +14 -0
  56. package/dist/src/terminal/pty.js +121 -0
  57. package/dist/src/terminal/pty.js.map +1 -0
  58. package/dist/src/terminal/session.d.ts +136 -0
  59. package/dist/src/terminal/session.js +422 -0
  60. package/dist/src/terminal/session.js.map +1 -0
  61. package/dist/src/terminal/ui/index.html +183 -0
  62. package/dist/src/tools/file-tools.d.ts +2 -1
  63. package/dist/src/tools/file-tools.js +19 -7
  64. package/dist/src/tools/file-tools.js.map +1 -1
  65. package/dist/src/tools/mcp-client-tools.js +243 -103
  66. package/dist/src/tools/mcp-client-tools.js.map +1 -1
  67. package/dist/src/tools/shell-tools.js +1 -1
  68. package/dist/src/tools/shell-tools.js.map +1 -1
  69. package/dist/src/tools/skills.js +26 -1
  70. package/dist/src/tools/skills.js.map +1 -1
  71. package/dist/src/transports/http.d.ts +15 -2
  72. package/dist/src/transports/http.js +244 -65
  73. package/dist/src/transports/http.js.map +1 -1
  74. package/dist/src/transports/reverse.d.ts +23 -19
  75. package/dist/src/transports/reverse.js +130 -74
  76. package/dist/src/transports/reverse.js.map +1 -1
  77. package/dist/src/transports/stdio.d.ts +5 -2
  78. package/dist/src/transports/stdio.js +130 -20
  79. package/dist/src/transports/stdio.js.map +1 -1
  80. package/dist/src/utils/proxy.d.ts +2 -2
  81. package/dist/src/utils/proxy.js +84 -62
  82. package/dist/src/utils/proxy.js.map +1 -1
  83. package/dist/src/utils/server-activity.d.ts +6 -0
  84. package/dist/src/utils/server-activity.js +46 -0
  85. package/dist/src/utils/server-activity.js.map +1 -0
  86. package/dist/src/utils/server-lifecycle.d.ts +5 -0
  87. package/dist/src/utils/server-lifecycle.js +51 -0
  88. package/dist/src/utils/server-lifecycle.js.map +1 -0
  89. package/docs/file-manager.md +179 -0
  90. package/docs/terminal.md +66 -0
  91. package/package.json +28 -6
  92. package/dist/src/transports/fte-lifecycle.d.ts +0 -13
  93. package/dist/src/transports/fte-lifecycle.js +0 -76
  94. package/dist/src/transports/fte-lifecycle.js.map +0 -1
@@ -3,6 +3,7 @@ import { SkillManager } from "../skills/manager.js";
3
3
  import * as fs from "fs/promises";
4
4
  import * as fsSync from "fs";
5
5
  import * as path from "path";
6
+ import { registerServerCleanup } from "../utils/server-lifecycle.js";
6
7
  export function registerSkillTools(server, workingDir, security, profile = "default") {
7
8
  let skillsMap = SkillManager.loadSkills(workingDir, profile);
8
9
  const promptMap = new Map();
@@ -167,13 +168,32 @@ export function registerSkillTools(server, workingDir, security, profile = "defa
167
168
  // 目录不存在则自动创建;被删除后自动重建并恢复监听
168
169
  // 全局目录和内置目录的 skill 变动需重启才能生效
169
170
  const projectSkillDir = path.join(workingDir, ".staff", "skills");
171
+ let watcher = null;
170
172
  let watchTimeout = null;
173
+ let disposed = false;
171
174
  const DEBOUNCE_MS = 1000; // 1秒防抖
175
+ registerServerCleanup(server, () => {
176
+ if (disposed)
177
+ return;
178
+ disposed = true;
179
+ if (watchTimeout) {
180
+ clearTimeout(watchTimeout);
181
+ watchTimeout = null;
182
+ }
183
+ const activeWatcher = watcher;
184
+ watcher = null;
185
+ activeWatcher?.close();
186
+ });
172
187
  const handleWatchEvent = (event, filename) => {
188
+ if (disposed)
189
+ return;
173
190
  if (watchTimeout) {
174
191
  clearTimeout(watchTimeout);
175
192
  }
176
193
  watchTimeout = setTimeout(() => {
194
+ watchTimeout = null;
195
+ if (disposed)
196
+ return;
177
197
  try {
178
198
  skillsMap = SkillManager.loadSkills(workingDir, profile);
179
199
  refreshPrompts();
@@ -184,14 +204,19 @@ export function registerSkillTools(server, workingDir, security, profile = "defa
184
204
  }, DEBOUNCE_MS);
185
205
  };
186
206
  const startWatcher = () => {
207
+ if (disposed)
208
+ return;
187
209
  if (!fsSync.existsSync(projectSkillDir)) {
188
210
  fsSync.mkdirSync(projectSkillDir, { recursive: true });
189
211
  console.log(`[SkillTools] Created project skill dir: ${projectSkillDir}`);
190
212
  }
191
213
  try {
192
- const watcher = fsSync.watch(projectSkillDir, { recursive: true }, handleWatchEvent);
214
+ watcher = fsSync.watch(projectSkillDir, { recursive: true }, handleWatchEvent);
193
215
  console.log(`[SkillTools] Watching project skill dir: ${projectSkillDir}`);
194
216
  watcher.on("close", () => {
217
+ watcher = null;
218
+ if (disposed)
219
+ return;
195
220
  console.log(`[SkillTools] Watch closed, re-establishing on: ${projectSkillDir}`);
196
221
  startWatcher();
197
222
  });
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/tools/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/tools/skills.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,16 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  export declare function getHttpAuthToken(token?: string): string | undefined;
3
- export declare function startHttpServer(serverFactory: () => McpServer, port: number, host?: string, token?: string): Promise<void>;
3
+ export declare const HTTP_MAX_SESSIONS = 64;
4
+ export declare const HTTP_SESSION_IDLE_MS: number;
5
+ export interface HttpSessionPolicy {
6
+ maxSessions?: number;
7
+ idleTimeoutMs?: number;
8
+ }
9
+ export declare function resolveHttpSessionPolicy(policy?: HttpSessionPolicy): {
10
+ maxSessions: number;
11
+ idleTimeoutMs: number;
12
+ };
13
+ export declare function startHttpServer(serverFactory: () => McpServer, port: number, host?: string, token?: string, policy?: HttpSessionPolicy): Promise<{
14
+ port: number;
15
+ stop: () => Promise<void>;
16
+ }>;
@@ -1,103 +1,282 @@
1
- import express from "express";
2
- import cors from "cors";
3
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
- import { randomUUID, timingSafeEqual } from "node:crypto";
1
+ import { HttpDataSession } from '../data/HttpDataSession.js';
2
+ import { handleNodeRequest } from '../data/node.js';
3
+ import { configureExtensionData } from '../extensions/runtime.js';
4
+ import { hasServerActivity } from '../utils/server-activity.js';
5
+ import express from 'express';
6
+ import cors from 'cors';
7
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
8
+ import { isInitializeRequest, isJSONRPCRequest, } from '@modelcontextprotocol/sdk/types.js';
9
+ import { randomUUID, timingSafeEqual } from 'node:crypto';
5
10
  export function getHttpAuthToken(token) {
6
11
  if (token === undefined)
7
12
  return undefined;
8
13
  if (!token || /\s/.test(token)) {
9
- throw new Error("--http-token must be non-empty and contain no whitespace when provided.");
14
+ throw new Error('--http-token must be non-empty and contain no whitespace when provided.');
10
15
  }
11
16
  return token;
12
17
  }
13
- export async function startHttpServer(serverFactory, port, host = "0.0.0.0", token) {
18
+ export const HTTP_MAX_SESSIONS = 64;
19
+ export const HTTP_SESSION_IDLE_MS = 30 * 60 * 1000;
20
+ export function resolveHttpSessionPolicy(policy = {}) {
21
+ const maxSessions = policy.maxSessions ?? HTTP_MAX_SESSIONS;
22
+ const idleTimeoutMs = policy.idleTimeoutMs ?? HTTP_SESSION_IDLE_MS;
23
+ if (!Number.isSafeInteger(maxSessions) || maxSessions <= 0)
24
+ throw new Error('HTTP max sessions must be a positive safe integer.');
25
+ if (!Number.isInteger(idleTimeoutMs) ||
26
+ idleTimeoutMs <= 0 ||
27
+ idleTimeoutMs > 2_147_483_647)
28
+ throw new Error('HTTP session idle timeout must be 1..2147483647 ms.');
29
+ return { maxSessions, idleTimeoutMs };
30
+ }
31
+ export async function startHttpServer(serverFactory, port, host = '0.0.0.0', token, policy = {}) {
32
+ const { maxSessions, idleTimeoutMs } = resolveHttpSessionPolicy(policy);
14
33
  const authToken = getHttpAuthToken(token);
15
34
  const app = express();
35
+ let stopping = false;
36
+ const sessions = new Map();
37
+ const dataSessions = new Map();
38
+ const closeSession = (id, session) => {
39
+ session.closing ??= Promise.resolve()
40
+ .then(() => session.server.close())
41
+ .then(() => {
42
+ if (sessions.get(id) === session)
43
+ sessions.delete(id);
44
+ });
45
+ return session.closing;
46
+ };
47
+ const observeClose = (id, session) => {
48
+ void closeSession(id, session).catch(() => console.error('[staff-mcp] HTTP session cleanup failed.'));
49
+ };
50
+ const sweepIdle = () => {
51
+ const now = performance.now();
52
+ for (const [id, session] of sessions) {
53
+ if (session.closing)
54
+ continue;
55
+ if (session.initializing || hasServerActivity(session.server)) {
56
+ session.idleSince = undefined;
57
+ }
58
+ else if (session.idleSince === undefined) {
59
+ session.idleSince = now;
60
+ }
61
+ else if (now - session.idleSince >= idleTimeoutMs) {
62
+ // Fence synchronously; cleanup keeps its slot until it succeeds.
63
+ observeClose(id, session);
64
+ }
65
+ }
66
+ };
67
+ const reject = (res, status, message) => {
68
+ if (!res.headersSent && !res.destroyed) {
69
+ res.status(status).json({
70
+ jsonrpc: '2.0',
71
+ id: null,
72
+ error: {
73
+ code: status === 404
74
+ ? -32001
75
+ : status === 429
76
+ ? -32000
77
+ : -32600,
78
+ message,
79
+ },
80
+ });
81
+ }
82
+ };
16
83
  // CORS preflight is public and never reaches MCP session handling.
17
84
  app.use(cors());
85
+ app.use((_req, res, next) => {
86
+ if (stopping)
87
+ return reject(res, 503, 'Server is stopping');
88
+ next();
89
+ });
90
+ // Session-owned public data endpoints must bypass the MCP JSON parser.
91
+ app.use((req, res, next) => {
92
+ const match = /^\/mcp\/data\/([A-Za-z0-9_-]{16,256})(?:\/|$)/.exec(req.url);
93
+ if (!match)
94
+ return next();
95
+ const session = dataSessions.get(match[1]);
96
+ if (!session) {
97
+ res.status(404).end();
98
+ return;
99
+ }
100
+ void handleNodeRequest(session, req, res).then((handled) => {
101
+ if (!handled && !res.headersSent)
102
+ res.status(404).end();
103
+ }, () => {
104
+ console.error('[staff-mcp] HTTP data request failed.');
105
+ if (!res.headersSent)
106
+ res.status(500).end();
107
+ else
108
+ res.destroy();
109
+ });
110
+ });
18
111
  // When configured, authenticate before parsing bodies or accessing sessions.
19
112
  if (authToken !== undefined) {
20
113
  const expectedToken = Buffer.from(authToken);
21
- app.use(["/mcp", "/sse", "/messages"], (req, res, next) => {
22
- const match = /^Bearer +(\S+)$/i.exec(req.headers.authorization ?? "");
23
- const token = Buffer.from(match?.[1] ?? "");
24
- if (token.length !== expectedToken.length || !timingSafeEqual(token, expectedToken)) {
25
- res.setHeader("WWW-Authenticate", 'Bearer realm="staff-mcp"');
26
- res.status(401).json({ error: "Unauthorized" });
114
+ app.use(['/mcp', '/sse', '/messages'], (req, res, next) => {
115
+ const match = /^Bearer +(\S+)$/i.exec(req.headers.authorization ?? '');
116
+ const providedToken = Buffer.from(match?.[1] ?? '');
117
+ if (providedToken.length !== expectedToken.length ||
118
+ !timingSafeEqual(providedToken, expectedToken)) {
119
+ res.setHeader('WWW-Authenticate', 'Bearer realm="staff-mcp"');
120
+ res.status(401).json({ error: 'Unauthorized' });
27
121
  return;
28
122
  }
29
123
  next();
30
124
  });
31
125
  }
32
- // Necessary for processing JSON-RPC messages (POST).
33
- // Large limit required to support MCP File Transfer Extension (FTE)
34
- // which sends base64-encoded file chunks up to 2 MiB (~2.67 MiB JSON).
126
+ // Preserve ordinary tool payloads; binary data bypasses this parser.
35
127
  app.use(express.json({ limit: '50mb' }));
36
- // === Session Pool ===
37
- const sessions = new Map();
38
128
  const mcpHandler = async (req, res) => {
39
- const sessionId = req.headers["mcp-session-id"];
40
- // 1. 尝试复用已有会话
41
- if (sessionId && sessions.has(sessionId)) {
42
- const t = sessions.get(sessionId);
129
+ const sessionId = req.headers['mcp-session-id'];
130
+ if (sessionId !== undefined) {
131
+ if (typeof sessionId !== 'string' || !sessionId) {
132
+ return reject(res, 400, 'Invalid MCP session ID');
133
+ }
134
+ const session = sessions.get(sessionId);
135
+ if (!session || session.closing) {
136
+ return reject(res, 404, 'Session not found');
137
+ }
43
138
  try {
44
- await t.handleRequest(req, res, req.body);
139
+ await session.transport.handleRequest(req, res, req.body);
45
140
  }
46
- catch (error) {
47
- console.error("[MCP HTTP Error]:", error);
48
- if (!res.headersSent) {
49
- res.status(500).json({
50
- error: "Internal Server Error",
51
- message: error instanceof Error ? error.message : String(error)
52
- });
53
- }
141
+ catch {
142
+ console.error('[staff-mcp] HTTP control request failed.');
143
+ reject(res, 500, 'Internal Server Error');
54
144
  }
55
145
  return;
56
146
  }
57
- // 2. 没有对应会话,或者是一个新的 GET 请求,创建新的
58
- const newSessionId = randomUUID();
59
- const server = serverFactory();
60
- // 如果客户端带了旧的、已失效的 sessionId 试图重连,
61
- // 必须从 headers 中抹除,否则底层 SDK 会因为它与新分配的 newSessionId 不一致而直接报错 400
62
- if (sessionId) {
63
- delete req.headers["mcp-session-id"];
64
- delete req.headers["last-event-id"];
147
+ // A stale ID, GET, DELETE or malformed request cannot allocate resources.
148
+ if (req.method !== 'POST' ||
149
+ !isJSONRPCRequest(req.body) ||
150
+ !isInitializeRequest(req.body)) {
151
+ return reject(res, 400, 'A new session requires initialization');
65
152
  }
66
- const t = new StreamableHTTPServerTransport({
67
- sessionIdGenerator: () => newSessionId,
68
- enableJsonResponse: true,
69
- });
70
- // 监听关闭事件,正常触发时清理自身
71
- t.onclose = () => {
72
- console.log(`[HTTP] Session Closed: ${newSessionId}`);
73
- sessions.delete(newSessionId);
153
+ // JSON body parsing can finish after shutdown has started.
154
+ if (stopping)
155
+ return reject(res, 503, 'Server is stopping');
156
+ sweepIdle();
157
+ if (sessions.size >= maxSessions)
158
+ return reject(res, 429, 'HTTP session capacity reached');
159
+ const id = randomUUID();
160
+ let session;
161
+ const disconnected = () => {
162
+ if (!res.writableFinished && session)
163
+ observeClose(id, session);
74
164
  };
75
- await server.connect(t);
76
- sessions.set(newSessionId, t);
77
165
  try {
78
- await t.handleRequest(req, res, req.body);
79
- }
80
- catch (error) {
81
- console.error("[MCP HTTP Error]:", error);
82
- if (!res.headersSent) {
83
- res.status(500).json({
84
- error: "Internal Server Error",
85
- message: error instanceof Error ? error.message : String(error)
166
+ const server = serverFactory();
167
+ const transport = new StreamableHTTPServerTransport({
168
+ sessionIdGenerator: () => id,
169
+ enableJsonResponse: true,
170
+ });
171
+ session = { server, transport, initializing: true };
172
+ const owned = session;
173
+ // The SDK calls this only after parsing/validating the control message.
174
+ // Neither an idle GET SSE stream nor invalid HTTP/data traffic renews it.
175
+ transport.onmessage = () => {
176
+ owned.idleSince = undefined;
177
+ };
178
+ // Include starting sessions in shutdown ownership before the first await.
179
+ sessions.set(id, session);
180
+ transport.onclose = () => observeClose(id, owned);
181
+ res.once('close', disconnected);
182
+ configureExtensionData(server, (binding, accept, signal, origin, supportsPurpose) => {
183
+ signal.throwIfAborted();
184
+ if (stopping || owned.closing)
185
+ throw new Error('HTTP session is closing.');
186
+ if (dataSessions.has(binding))
187
+ throw new Error('Data binding already exists.');
188
+ const authority = req.get('host');
189
+ if (!authority)
190
+ throw new Error('MCP HTTP Host header is required.');
191
+ const endpoint = new URL(`/mcp/data/${binding}`, origin ?? `${req.protocol}://${authority}`).href;
192
+ const data = new HttpDataSession({
193
+ role: 'remote',
194
+ binding,
195
+ endpoint,
196
+ accept,
197
+ supportsPurpose,
198
+ fetch: async () => {
199
+ throw new Error('Outbound data is unavailable in HTTP listener mode');
200
+ },
201
+ validateEndpoint: () => {
202
+ throw new Error('Outbound data endpoint is unavailable in HTTP listener mode');
203
+ },
86
204
  });
205
+ dataSessions.set(binding, data);
206
+ return {
207
+ session: data,
208
+ endpoint,
209
+ close: () => {
210
+ if (dataSessions.get(binding) === data)
211
+ dataSessions.delete(binding);
212
+ },
213
+ };
214
+ });
215
+ await server.connect(transport);
216
+ if (stopping || session.closing) {
217
+ await closeSession(id, session);
218
+ return reject(res, 503, 'Server is stopping');
219
+ }
220
+ await transport.handleRequest(req, res, req.body);
221
+ if (!transport.sessionId ||
222
+ res.statusCode >= 400 ||
223
+ (res.destroyed && !res.writableFinished)) {
224
+ await closeSession(id, session);
225
+ }
226
+ }
227
+ catch {
228
+ if (session) {
229
+ await closeSession(id, session).catch(() => console.error('[staff-mcp] HTTP session cleanup failed.'));
87
230
  }
231
+ console.error('[staff-mcp] HTTP initialization failed.');
232
+ reject(res, 500, 'Internal Server Error');
233
+ }
234
+ finally {
235
+ if (session) {
236
+ session.initializing = false;
237
+ session.idleSince = undefined;
238
+ }
239
+ res.removeListener('close', disconnected);
88
240
  }
89
241
  };
90
- // Route for all MCP interactions.
91
- app.all("/mcp", mcpHandler);
92
- // Standard fallbacks
93
- app.get("/sse", mcpHandler);
94
- app.post("/messages", mcpHandler);
95
- return new Promise((resolve) => {
96
- app.listen(port, host, () => {
97
- console.error(`[MCP HTTP] Server listening on http://${host}:${port}/mcp`);
98
- console.error(`[MCP HTTP] JSON Response enabled: true`);
242
+ app.all('/mcp', mcpHandler);
243
+ app.get('/sse', mcpHandler);
244
+ app.post('/messages', mcpHandler);
245
+ const listener = app.listen(port, host);
246
+ await new Promise((resolve, reject) => {
247
+ listener.once('error', reject);
248
+ listener.once('listening', () => {
249
+ listener.removeListener('error', reject);
99
250
  resolve();
100
251
  });
101
252
  });
253
+ const address = listener.address();
254
+ console.error(`[MCP HTTP] Server listening on http://${host}:${address.port}/mcp`);
255
+ // One bounded sweep per listener; no per-session timers or resource lease changes.
256
+ const idleTimer = setInterval(sweepIdle, Math.min(idleTimeoutMs, 60_000));
257
+ idleTimer.unref();
258
+ let stopped;
259
+ return {
260
+ port: address.port,
261
+ stop: () => {
262
+ if (stopped)
263
+ return stopped;
264
+ stopping = true;
265
+ clearInterval(idleTimer);
266
+ // Stop accepting first, but keep the listener alive until owned cleanup settles.
267
+ const listenerClosed = new Promise((resolve, reject) => {
268
+ listener.close((error) => (error ? reject(error) : resolve()));
269
+ });
270
+ stopped = (async () => {
271
+ const results = await Promise.allSettled([...sessions].map(([id, session]) => closeSession(id, session)));
272
+ listener.closeAllConnections();
273
+ await listenerClosed;
274
+ const failed = results.filter((result) => result.status === 'rejected');
275
+ if (failed.length)
276
+ throw new AggregateError(failed.map((result) => result.reason), 'HTTP session cleanup failed');
277
+ })();
278
+ return stopped;
279
+ },
280
+ };
102
281
  }
103
282
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAA8B,EAAE,IAAY,EAAE,OAAe,SAAS,EAAE,KAAc;IAC1H,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,mEAAmE;IACnE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,6EAA6E;IAC7E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACxD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;gBACpF,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAC;gBAC9D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,oEAAoE;IACpE,uEAAuE;IACvE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,uBAAuB;IACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyC,CAAC;IAElE,MAAM,UAAU,GAAG,KAAK,EAAE,GAAoB,EAAE,GAAqB,EAAE,EAAE;QACvE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,cAAc;QACd,IAAI,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACnB,KAAK,EAAE,uBAAuB;wBAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAChE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,iCAAiC;QACjC,+DAA+D;QAC/D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACrC,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,6BAA6B,CAAC;YAC1C,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY;YACtC,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QAEH,mBAAmB;QACnB,CAAC,CAAC,OAAO,GAAG,GAAG,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;YACtD,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,uBAAuB;oBAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,kCAAkC;IAClC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5B,qBAAqB;IACrB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAElC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/transports/http.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,27 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import type { Logger, ReconnectOptions, SSEHeartbeatOptions } from "mcp-reverse";
3
- import { ReverseMCPClient } from "mcp-reverse/client";
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export { reverseProxyUrl, validateReverseUrl } from '../reverse/http.js';
4
3
  export interface ReverseServerOptions {
5
- /** Timeout for establishing each SSE connection. 0 disables the timeout. */
4
+ proxy?: string;
6
5
  connectTimeout?: number;
7
- /** Deadline for MCP initialization after the SSE transport opens. */
8
6
  initializationTimeout?: number;
9
- /** Override liveness monitoring without changing tool execution timeouts. */
10
- heartbeat?: SSEHeartbeatOptions;
11
- /** Override the automatic reconnect policy. */
12
- reconnect?: ReconnectOptions;
13
- /** Override reverse transport and lifecycle logging. */
14
- logger?: Logger;
7
+ heartbeat?: {
8
+ readTimeout?: number;
9
+ };
10
+ reconnect?: {
11
+ enabled?: boolean;
12
+ initialDelay?: number;
13
+ maxDelay?: number;
14
+ stableConnectionMs?: number;
15
+ };
16
+ logger?: {
17
+ info(message: string): void;
18
+ warn(message: string): void;
19
+ error(message: string): void;
20
+ };
15
21
  }
16
- /**
17
- * Start a reverse MCP connection to a public gateway.
18
- *
19
- * The ReverseMCPClient owns transport lifecycle, reconnection, and MCP
20
- * protocol re-binding. start() launches the connection loop; readiness is
21
- * reported asynchronously through the connected event/log.
22
- */
23
- export declare function startReverseServer(server: McpServer, url: string, token: string, name: string, options?: ReverseServerOptions): Promise<ReverseMCPClient>;
22
+ export interface ReverseController {
23
+ stop(): Promise<void>;
24
+ readonly closed: Promise<void>;
25
+ }
26
+ /** New HTTP pool, SDK transport and data resources per attempt; never replay requests or input. */
27
+ export declare function startReverseServer(serverFactory: () => McpServer, value: string, token: string, name: string, options?: ReverseServerOptions): Promise<ReverseController>;