ft-scout 9.0.7 → 9.0.8

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 (75) hide show
  1. package/.firebase/hosting.d2Vi.cache +8 -8
  2. package/AUTONOMOUS_FEATURES.md +1 -1
  3. package/README.md +113 -16
  4. package/bin/src/commands/agent.js +2 -2
  5. package/bin/src/commands/agent.js.map +1 -1
  6. package/bin/src/commands/audit.js +1 -1
  7. package/bin/src/commands/audit.js.map +1 -1
  8. package/bin/src/commands/dashboard.js +1 -1
  9. package/bin/src/commands/dashboard.js.map +1 -1
  10. package/bin/src/commands/mcp.d.ts.map +1 -0
  11. package/bin/src/commands/mcp.js +393 -0
  12. package/bin/src/commands/mcp.js.map +1 -0
  13. package/bin/src/commands/owners.js +1 -1
  14. package/bin/src/commands/owners.js.map +1 -1
  15. package/bin/src/discovery/messages.js +2 -2
  16. package/bin/src/discovery/messages.js.map +1 -1
  17. package/bin/src/discovery/signals.js +3 -3
  18. package/bin/src/discovery/signals.js.map +1 -1
  19. package/bin/src/engine/agentEngine.d.ts.map +1 -1
  20. package/bin/src/engine/agentEngine.js +53 -11
  21. package/bin/src/engine/agentEngine.js.map +1 -1
  22. package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -1
  23. package/bin/src/engine/runtime/agentRuntime.js +40 -3
  24. package/bin/src/engine/runtime/agentRuntime.js.map +1 -1
  25. package/bin/src/engine/toolRegistry.d.ts.map +1 -1
  26. package/bin/src/engine/toolRegistry.js +13 -0
  27. package/bin/src/engine/toolRegistry.js.map +1 -1
  28. package/bin/src/engine/verifier.js +2 -2
  29. package/bin/src/engine/verifier.js.map +1 -1
  30. package/bin/src/index.js +85 -7
  31. package/bin/src/index.js.map +1 -1
  32. package/bin/src/mcp/client.d.ts.map +1 -0
  33. package/bin/src/mcp/client.js +127 -0
  34. package/bin/src/mcp/client.js.map +1 -0
  35. package/bin/src/mcp/discovery.d.ts.map +1 -0
  36. package/bin/src/mcp/discovery.js +91 -0
  37. package/bin/src/mcp/discovery.js.map +1 -0
  38. package/bin/src/mcp/health.d.ts.map +1 -0
  39. package/bin/src/mcp/health.js +44 -0
  40. package/bin/src/mcp/health.js.map +1 -0
  41. package/bin/src/mcp/index.d.ts.map +1 -0
  42. package/bin/src/mcp/index.js +15 -0
  43. package/bin/src/mcp/index.js.map +1 -0
  44. package/bin/src/mcp/manager.d.ts.map +1 -0
  45. package/bin/src/mcp/manager.js +535 -0
  46. package/bin/src/mcp/manager.js.map +1 -0
  47. package/bin/src/mcp/permissions.d.ts.map +1 -0
  48. package/bin/src/mcp/permissions.js +50 -0
  49. package/bin/src/mcp/permissions.js.map +1 -0
  50. package/bin/src/mcp/persistence.d.ts.map +1 -0
  51. package/bin/src/mcp/persistence.js +156 -0
  52. package/bin/src/mcp/persistence.js.map +1 -0
  53. package/bin/src/mcp/recovery.d.ts.map +1 -0
  54. package/bin/src/mcp/recovery.js +75 -0
  55. package/bin/src/mcp/recovery.js.map +1 -0
  56. package/bin/src/mcp/telemetry.d.ts.map +1 -0
  57. package/bin/src/mcp/telemetry.js +82 -0
  58. package/bin/src/mcp/telemetry.js.map +1 -0
  59. package/bin/src/mcp/toolRouter.d.ts.map +1 -0
  60. package/bin/src/mcp/toolRouter.js +127 -0
  61. package/bin/src/mcp/toolRouter.js.map +1 -0
  62. package/bin/src/mcp/transport.d.ts.map +1 -0
  63. package/bin/src/mcp/transport.js +328 -0
  64. package/bin/src/mcp/transport.js.map +1 -0
  65. package/bin/src/mcp/types.d.ts.map +1 -0
  66. package/bin/src/mcp/types.js +6 -0
  67. package/bin/src/mcp/types.js.map +1 -0
  68. package/bin/src/server/server.d.ts.map +1 -1
  69. package/bin/src/server/server.js +207 -0
  70. package/bin/src/server/server.js.map +1 -1
  71. package/bin/src/utils/branding.js +1 -1
  72. package/bin/src/utils/email.js +4 -4
  73. package/package.json +1 -1
  74. package/web/app.js +1255 -59
  75. package/web/styles.css +1474 -15
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Scout MCP Ecosystem - Transports
3
+ * Implements Streamable HTTP and stdio local process transports for MCP JSON-RPC 2.0.
4
+ */
5
+ import { spawn } from 'child_process';
6
+ /**
7
+ * Streamable HTTP Transport
8
+ * Communicates with remote or local HTTP MCP servers using JSON-RPC 2.0 over HTTP.
9
+ */
10
+ export class HttpMcpTransport {
11
+ endpoint;
12
+ headers;
13
+ connected = false;
14
+ requestId = 1;
15
+ notificationListeners = [];
16
+ constructor(endpoint, headers = {}) {
17
+ this.endpoint = endpoint.trim().replace(/\/+$/, '');
18
+ this.headers = {
19
+ 'Content-Type': 'application/json',
20
+ 'Accept': 'application/json, text/event-stream',
21
+ ...headers,
22
+ };
23
+ }
24
+ getTransportType() {
25
+ return 'http';
26
+ }
27
+ isConnected() {
28
+ return this.connected;
29
+ }
30
+ onNotification(listener) {
31
+ this.notificationListeners.push(listener);
32
+ }
33
+ async connect() {
34
+ // Ping or check reachability
35
+ try {
36
+ const controller = new AbortController();
37
+ const timeout = setTimeout(() => controller.abort(), 10000);
38
+ const res = await fetch(this.endpoint, {
39
+ method: 'GET',
40
+ headers: this.headers,
41
+ signal: controller.signal,
42
+ }).catch(() => null);
43
+ clearTimeout(timeout);
44
+ // Accept standard HTTP status codes (200, 404/405 for GET on POST endpoint is fine for connect check)
45
+ if (res && res.status >= 500) {
46
+ throw new Error(`MCP HTTP Server returned status ${res.status} ${res.statusText}`);
47
+ }
48
+ this.connected = true;
49
+ }
50
+ catch (err) {
51
+ this.connected = false;
52
+ throw new Error(`Failed to connect to MCP HTTP endpoint at ${this.endpoint}: ${err?.message || String(err)}`);
53
+ }
54
+ }
55
+ async disconnect() {
56
+ this.connected = false;
57
+ }
58
+ async sendRequest(method, params, timeoutMs = 30000) {
59
+ const id = this.requestId++;
60
+ const requestPayload = {
61
+ jsonrpc: '2.0',
62
+ id,
63
+ method,
64
+ ...(params !== undefined ? { params } : {}),
65
+ };
66
+ const controller = new AbortController();
67
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
68
+ try {
69
+ const response = await fetch(this.endpoint, {
70
+ method: 'POST',
71
+ headers: this.headers,
72
+ body: JSON.stringify(requestPayload),
73
+ signal: controller.signal,
74
+ });
75
+ clearTimeout(timer);
76
+ if (!response.ok) {
77
+ const text = await response.text().catch(() => '');
78
+ throw new Error(`HTTP ${response.status} ${response.statusText}: ${text || 'Empty response'}`);
79
+ }
80
+ const contentType = response.headers.get('content-type') || '';
81
+ let data;
82
+ if (contentType.includes('text/event-stream')) {
83
+ // Parse SSE response
84
+ const text = await response.text();
85
+ const lines = text.split('\n');
86
+ for (const line of lines) {
87
+ if (line.startsWith('data:')) {
88
+ const jsonStr = line.slice(5).trim();
89
+ if (jsonStr) {
90
+ try {
91
+ data = JSON.parse(jsonStr);
92
+ break;
93
+ }
94
+ catch { }
95
+ }
96
+ }
97
+ }
98
+ if (!data) {
99
+ throw new Error(`Invalid SSE response from MCP server: ${text.slice(0, 200)}`);
100
+ }
101
+ }
102
+ else {
103
+ data = await response.json();
104
+ }
105
+ if (data.error) {
106
+ throw new Error(data.error.message || `MCP Error code ${data.error.code}`);
107
+ }
108
+ return data.result;
109
+ }
110
+ catch (err) {
111
+ clearTimeout(timer);
112
+ if (err.name === 'AbortError') {
113
+ throw new Error(`MCP Request timed out after ${timeoutMs}ms for method "${method}"`);
114
+ }
115
+ throw err;
116
+ }
117
+ }
118
+ async sendNotification(method, params) {
119
+ const notificationPayload = {
120
+ jsonrpc: '2.0',
121
+ method,
122
+ ...(params !== undefined ? { params } : {}),
123
+ };
124
+ try {
125
+ await fetch(this.endpoint, {
126
+ method: 'POST',
127
+ headers: this.headers,
128
+ body: JSON.stringify(notificationPayload),
129
+ });
130
+ }
131
+ catch {
132
+ // Notifications do not wait for responses
133
+ }
134
+ }
135
+ }
136
+ /**
137
+ * stdio Local Process Transport
138
+ * Spawns a local MCP server child process communicating over stdin/stdout with newline-delimited JSON-RPC 2.0.
139
+ */
140
+ export class StdioMcpTransport {
141
+ command;
142
+ args;
143
+ env;
144
+ process = null;
145
+ connected = false;
146
+ requestId = 1;
147
+ pendingRequests = new Map();
148
+ notificationListeners = [];
149
+ stdoutBuffer = '';
150
+ stderrBuffer = '';
151
+ constructor(command, args = [], env = {}) {
152
+ this.command = command;
153
+ this.args = args;
154
+ this.env = env;
155
+ }
156
+ getTransportType() {
157
+ return 'stdio';
158
+ }
159
+ isConnected() {
160
+ return this.connected && this.process !== null && !this.process.killed;
161
+ }
162
+ onNotification(listener) {
163
+ this.notificationListeners.push(listener);
164
+ }
165
+ getStderrDiagnostics() {
166
+ return this.stderrBuffer.slice(-2000);
167
+ }
168
+ async connect() {
169
+ return new Promise((resolve, reject) => {
170
+ try {
171
+ const fullEnv = {
172
+ ...process.env,
173
+ ...this.env,
174
+ };
175
+ this.process = spawn(this.command, this.args, {
176
+ env: fullEnv,
177
+ stdio: ['pipe', 'pipe', 'pipe'],
178
+ shell: process.platform === 'win32',
179
+ });
180
+ let spawnErrorOccurred = false;
181
+ this.process.on('error', (err) => {
182
+ spawnErrorOccurred = true;
183
+ this.connected = false;
184
+ reject(new Error(`Failed to spawn MCP process "${this.command}": ${err.message}`));
185
+ });
186
+ this.process.stdout?.on('data', (chunk) => {
187
+ this.handleStdoutData(chunk.toString('utf-8'));
188
+ });
189
+ this.process.stderr?.on('data', (chunk) => {
190
+ this.stderrBuffer += chunk.toString('utf-8');
191
+ if (this.stderrBuffer.length > 10000) {
192
+ this.stderrBuffer = this.stderrBuffer.slice(-5000);
193
+ }
194
+ });
195
+ this.process.on('exit', (code, signal) => {
196
+ this.connected = false;
197
+ for (const [id, req] of this.pendingRequests.entries()) {
198
+ clearTimeout(req.timer);
199
+ req.reject(new Error(`MCP process exited with code ${code ?? signal}`));
200
+ this.pendingRequests.delete(id);
201
+ }
202
+ });
203
+ // Short settle delay to ensure process didn't immediately crash on start
204
+ setTimeout(() => {
205
+ if (!spawnErrorOccurred && this.process && !this.process.killed) {
206
+ this.connected = true;
207
+ resolve();
208
+ }
209
+ }, 100);
210
+ }
211
+ catch (err) {
212
+ this.connected = false;
213
+ reject(err);
214
+ }
215
+ });
216
+ }
217
+ async disconnect() {
218
+ this.connected = false;
219
+ if (this.process) {
220
+ for (const [id, req] of this.pendingRequests.entries()) {
221
+ clearTimeout(req.timer);
222
+ req.reject(new Error('MCP process disconnected'));
223
+ this.pendingRequests.delete(id);
224
+ }
225
+ try {
226
+ this.process.kill('SIGTERM');
227
+ }
228
+ catch {
229
+ try {
230
+ this.process.kill();
231
+ }
232
+ catch { }
233
+ }
234
+ this.process = null;
235
+ }
236
+ }
237
+ handleStdoutData(data) {
238
+ this.stdoutBuffer += data;
239
+ let newlineIndex;
240
+ while ((newlineIndex = this.stdoutBuffer.indexOf('\n')) !== -1) {
241
+ const line = this.stdoutBuffer.slice(0, newlineIndex).trim();
242
+ this.stdoutBuffer = this.stdoutBuffer.slice(newlineIndex + 1);
243
+ if (line) {
244
+ this.parseJsonRpcLine(line);
245
+ }
246
+ }
247
+ }
248
+ parseJsonRpcLine(line) {
249
+ try {
250
+ // Support Content-Length prefix if sent by some standard language servers
251
+ let payload = line;
252
+ if (line.startsWith('Content-Length:')) {
253
+ const headerEnd = line.indexOf('\r\n\r\n');
254
+ if (headerEnd !== -1) {
255
+ payload = line.slice(headerEnd + 4);
256
+ }
257
+ else {
258
+ return;
259
+ }
260
+ }
261
+ const parsed = JSON.parse(payload);
262
+ // Handle Response to pending request
263
+ if (parsed.id !== undefined && this.pendingRequests.has(parsed.id)) {
264
+ const pending = this.pendingRequests.get(parsed.id);
265
+ clearTimeout(pending.timer);
266
+ this.pendingRequests.delete(parsed.id);
267
+ if (parsed.error) {
268
+ pending.reject(new Error(parsed.error.message || `MCP Error code ${parsed.error.code}`));
269
+ }
270
+ else {
271
+ pending.resolve(parsed.result);
272
+ }
273
+ return;
274
+ }
275
+ // Handle Notification
276
+ if (parsed.method) {
277
+ for (const listener of this.notificationListeners) {
278
+ try {
279
+ listener(parsed.method, parsed.params);
280
+ }
281
+ catch { }
282
+ }
283
+ }
284
+ }
285
+ catch {
286
+ // Ignore non-JSON lines (e.g. startup banner text output by child process)
287
+ }
288
+ }
289
+ sendRequest(method, params, timeoutMs = 30000) {
290
+ return new Promise((resolve, reject) => {
291
+ if (!this.isConnected() || !this.process?.stdin) {
292
+ return reject(new Error(`MCP stdio transport is not connected for "${this.command}"`));
293
+ }
294
+ const id = this.requestId++;
295
+ const payload = {
296
+ jsonrpc: '2.0',
297
+ id,
298
+ method,
299
+ ...(params !== undefined ? { params } : {}),
300
+ };
301
+ const timer = setTimeout(() => {
302
+ this.pendingRequests.delete(id);
303
+ reject(new Error(`MCP stdio request timed out after ${timeoutMs}ms for method "${method}"`));
304
+ }, timeoutMs);
305
+ this.pendingRequests.set(id, { resolve, reject, timer });
306
+ const jsonStr = JSON.stringify(payload) + '\n';
307
+ this.process.stdin.write(jsonStr, 'utf-8', (err) => {
308
+ if (err) {
309
+ clearTimeout(timer);
310
+ this.pendingRequests.delete(id);
311
+ reject(new Error(`Failed to write to MCP process stdin: ${err.message}`));
312
+ }
313
+ });
314
+ });
315
+ }
316
+ async sendNotification(method, params) {
317
+ if (!this.isConnected() || !this.process?.stdin)
318
+ return;
319
+ const payload = {
320
+ jsonrpc: '2.0',
321
+ method,
322
+ ...(params !== undefined ? { params } : {}),
323
+ };
324
+ const jsonStr = JSON.stringify(payload) + '\n';
325
+ this.process.stdin.write(jsonStr, 'utf-8');
326
+ }
327
+ }
328
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElE,MAAM,MAAM,eAAe,GACrB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,cAAc,GACd,UAAU,GACV,OAAO,GACP,cAAc,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iCAAiC,EAAE,OAAO,CAAC;IAC3C,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACT,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;QAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAChC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,kBAAkB,CAAC;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC/B,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,GAAG,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IAClC,KAAK,CAAC,EAAE;QACJ,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACrC,GAAG,SAAS,CAAC;IACd,SAAS,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAChC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACrC,GAAG,SAAS,CAAC;IACd,OAAO,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACrC,GAAG,SAAS,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,WAAW,EAAE,oBAAoB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,GAAG,CAAC;KACd,CAAC;CACL;AAED,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,CAAC;CAChB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Scout MCP Ecosystem - Type Definitions
3
+ * Standards-compliant Model Context Protocol (MCP) types and internal Scout representations.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AA8ExB,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA8uB/G"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AA+ExB,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAk8B/G"}
@@ -13,6 +13,7 @@ import dotenv from 'dotenv';
13
13
  import { TaskStateManager } from '../engine/agentState.js';
14
14
  import { ApprovalManager } from '../engine/safety.js';
15
15
  import { AgentExecutionLoop } from '../engine/agentEngine.js';
16
+ import { getMCPManager, MCPTelemetry } from '../mcp/index.js';
16
17
  let activeAgentLoop = null;
17
18
  const serverStateManager = new TaskStateManager(process.cwd());
18
19
  const DEFAULT_PORT = 9120;
@@ -724,6 +725,212 @@ export function startDashboardServer(port = DEFAULT_PORT) {
724
725
  });
725
726
  return;
726
727
  }
728
+ // ==========================================
729
+ // MCP ECOSYSTEM REST API
730
+ // ==========================================
731
+ // GET /api/mcp/servers - List all configured MCP servers
732
+ if (pathname === '/api/mcp/servers' && req.method === 'GET') {
733
+ try {
734
+ const manager = getMCPManager();
735
+ const servers = manager.listServers();
736
+ res.writeHead(200);
737
+ res.end(JSON.stringify({ success: true, servers }));
738
+ }
739
+ catch (err) {
740
+ res.writeHead(500);
741
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to list MCP servers' }));
742
+ }
743
+ return;
744
+ }
745
+ // POST /api/mcp/servers - Add a new MCP server
746
+ if (pathname === '/api/mcp/servers' && req.method === 'POST') {
747
+ let body = '';
748
+ req.on('data', chunk => body += chunk);
749
+ req.on('end', async () => {
750
+ try {
751
+ const data = JSON.parse(body || '{}');
752
+ if (!data.name || !data.transport) {
753
+ res.writeHead(400);
754
+ res.end(JSON.stringify({ success: false, error: 'Name and transport (http|stdio) are required.' }));
755
+ return;
756
+ }
757
+ const manager = getMCPManager();
758
+ const server = await manager.addServer({
759
+ name: data.name,
760
+ transport: data.transport,
761
+ endpoint: data.endpoint,
762
+ command: data.command,
763
+ args: data.args,
764
+ authType: data.authType || (data.token ? 'bearer' : 'none'),
765
+ authHeader: data.headerKey,
766
+ permissions: data.permissions,
767
+ }, data.token);
768
+ if (data.autoConnect) {
769
+ try {
770
+ await manager.connectServer(server.id);
771
+ }
772
+ catch {
773
+ // Log but return created server with its status
774
+ }
775
+ }
776
+ const updated = manager.getServer(server.id) || server;
777
+ res.writeHead(201);
778
+ res.end(JSON.stringify({ success: true, server: updated }));
779
+ }
780
+ catch (err) {
781
+ res.writeHead(400);
782
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to add MCP server' }));
783
+ }
784
+ });
785
+ return;
786
+ }
787
+ // GET /api/mcp/health - Check health across all MCP servers
788
+ if (pathname === '/api/mcp/health' && req.method === 'GET') {
789
+ try {
790
+ const manager = getMCPManager();
791
+ const health = await manager.checkHealth();
792
+ res.writeHead(200);
793
+ res.end(JSON.stringify({ success: true, health }));
794
+ }
795
+ catch (err) {
796
+ res.writeHead(500);
797
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to check MCP health' }));
798
+ }
799
+ return;
800
+ }
801
+ // GET /api/mcp/activity - Retrieve MCP activity audit trail
802
+ if (pathname === '/api/mcp/activity' && req.method === 'GET') {
803
+ try {
804
+ const limit = parseInt(parsedUrl.searchParams.get('limit') || '50', 10);
805
+ const activity = MCPTelemetry.loadActivity(limit);
806
+ res.writeHead(200);
807
+ res.end(JSON.stringify({ success: true, activity }));
808
+ }
809
+ catch (err) {
810
+ res.writeHead(500);
811
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to load MCP activity' }));
812
+ }
813
+ return;
814
+ }
815
+ // Server-specific routes: /api/mcp/servers/:id...
816
+ const mcpServerMatch = pathname.match(/^\/api\/mcp\/servers\/([^/]+)(\/(.*))?$/);
817
+ if (mcpServerMatch) {
818
+ const serverId = decodeURIComponent(mcpServerMatch[1] || '');
819
+ const subPath = mcpServerMatch[3] || '';
820
+ const manager = getMCPManager();
821
+ // DELETE /api/mcp/servers/:id
822
+ if (req.method === 'DELETE' && !subPath) {
823
+ try {
824
+ const success = await manager.removeServer(serverId);
825
+ res.writeHead(200);
826
+ res.end(JSON.stringify({ success, message: success ? 'Server removed' : 'Server not found' }));
827
+ }
828
+ catch (err) {
829
+ res.writeHead(500);
830
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to remove server' }));
831
+ }
832
+ return;
833
+ }
834
+ // GET /api/mcp/servers/:id
835
+ if (req.method === 'GET' && !subPath) {
836
+ const server = manager.getServer(serverId);
837
+ if (!server) {
838
+ res.writeHead(404);
839
+ res.end(JSON.stringify({ success: false, error: 'Server not found' }));
840
+ return;
841
+ }
842
+ res.writeHead(200);
843
+ res.end(JSON.stringify({ success: true, server }));
844
+ return;
845
+ }
846
+ // POST /api/mcp/servers/:id/connect
847
+ if (req.method === 'POST' && subPath === 'connect') {
848
+ try {
849
+ const server = await manager.connectServer(serverId);
850
+ res.writeHead(200);
851
+ res.end(JSON.stringify({ success: true, server }));
852
+ }
853
+ catch (err) {
854
+ res.writeHead(500);
855
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to connect server' }));
856
+ }
857
+ return;
858
+ }
859
+ // POST /api/mcp/servers/:id/disconnect
860
+ if (req.method === 'POST' && subPath === 'disconnect') {
861
+ try {
862
+ const server = await manager.disconnectServer(serverId);
863
+ res.writeHead(200);
864
+ res.end(JSON.stringify({ success: true, server }));
865
+ }
866
+ catch (err) {
867
+ res.writeHead(500);
868
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to disconnect server' }));
869
+ }
870
+ return;
871
+ }
872
+ // GET /api/mcp/servers/:id/tools
873
+ if (req.method === 'GET' && subPath === 'tools') {
874
+ const server = manager.getServer(serverId);
875
+ if (!server) {
876
+ res.writeHead(404);
877
+ res.end(JSON.stringify({ success: false, error: 'Server not found' }));
878
+ return;
879
+ }
880
+ res.writeHead(200);
881
+ res.end(JSON.stringify({ success: true, tools: server.tools }));
882
+ return;
883
+ }
884
+ // POST /api/mcp/servers/:id/tools/:toolName/toggle
885
+ const toggleMatch = subPath.match(/^tools\/([^/]+)\/toggle$/);
886
+ if (req.method === 'POST' && toggleMatch) {
887
+ const toolName = decodeURIComponent(toggleMatch[1] || '');
888
+ let body = '';
889
+ req.on('data', chunk => body += chunk);
890
+ req.on('end', () => {
891
+ try {
892
+ const data = JSON.parse(body || '{}');
893
+ const server = manager.toggleTool(serverId, toolName, data.enabled);
894
+ if (!server) {
895
+ res.writeHead(404);
896
+ res.end(JSON.stringify({ success: false, error: 'Server or tool not found' }));
897
+ return;
898
+ }
899
+ res.writeHead(200);
900
+ res.end(JSON.stringify({ success: true, server }));
901
+ }
902
+ catch (err) {
903
+ res.writeHead(400);
904
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to toggle tool' }));
905
+ }
906
+ });
907
+ return;
908
+ }
909
+ // POST /api/mcp/servers/:id/permissions
910
+ if (req.method === 'POST' && subPath === 'permissions') {
911
+ let body = '';
912
+ req.on('data', chunk => body += chunk);
913
+ req.on('end', () => {
914
+ try {
915
+ const data = JSON.parse(body || '{}');
916
+ const ok = manager.setServerPermissions(serverId, data.permissions || {});
917
+ if (!ok) {
918
+ res.writeHead(404);
919
+ res.end(JSON.stringify({ success: false, error: 'Server not found' }));
920
+ return;
921
+ }
922
+ const server = manager.getServer(serverId);
923
+ res.writeHead(200);
924
+ res.end(JSON.stringify({ success: true, server }));
925
+ }
926
+ catch (err) {
927
+ res.writeHead(400);
928
+ res.end(JSON.stringify({ success: false, error: err.message || 'Failed to update permissions' }));
929
+ }
930
+ });
931
+ return;
932
+ }
933
+ }
727
934
  res.writeHead(404);
728
935
  res.end(JSON.stringify({ error: 'API route not found' }));
729
936
  return;