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.
- package/.firebase/hosting.d2Vi.cache +8 -8
- package/AUTONOMOUS_FEATURES.md +1 -1
- package/README.md +113 -16
- package/bin/src/commands/agent.js +2 -2
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/commands/audit.js +1 -1
- package/bin/src/commands/audit.js.map +1 -1
- package/bin/src/commands/dashboard.js +1 -1
- package/bin/src/commands/dashboard.js.map +1 -1
- package/bin/src/commands/mcp.d.ts.map +1 -0
- package/bin/src/commands/mcp.js +393 -0
- package/bin/src/commands/mcp.js.map +1 -0
- package/bin/src/commands/owners.js +1 -1
- package/bin/src/commands/owners.js.map +1 -1
- package/bin/src/discovery/messages.js +2 -2
- package/bin/src/discovery/messages.js.map +1 -1
- package/bin/src/discovery/signals.js +3 -3
- package/bin/src/discovery/signals.js.map +1 -1
- package/bin/src/engine/agentEngine.d.ts.map +1 -1
- package/bin/src/engine/agentEngine.js +53 -11
- package/bin/src/engine/agentEngine.js.map +1 -1
- package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -1
- package/bin/src/engine/runtime/agentRuntime.js +40 -3
- package/bin/src/engine/runtime/agentRuntime.js.map +1 -1
- package/bin/src/engine/toolRegistry.d.ts.map +1 -1
- package/bin/src/engine/toolRegistry.js +13 -0
- package/bin/src/engine/toolRegistry.js.map +1 -1
- package/bin/src/engine/verifier.js +2 -2
- package/bin/src/engine/verifier.js.map +1 -1
- package/bin/src/index.js +85 -7
- package/bin/src/index.js.map +1 -1
- package/bin/src/mcp/client.d.ts.map +1 -0
- package/bin/src/mcp/client.js +127 -0
- package/bin/src/mcp/client.js.map +1 -0
- package/bin/src/mcp/discovery.d.ts.map +1 -0
- package/bin/src/mcp/discovery.js +91 -0
- package/bin/src/mcp/discovery.js.map +1 -0
- package/bin/src/mcp/health.d.ts.map +1 -0
- package/bin/src/mcp/health.js +44 -0
- package/bin/src/mcp/health.js.map +1 -0
- package/bin/src/mcp/index.d.ts.map +1 -0
- package/bin/src/mcp/index.js +15 -0
- package/bin/src/mcp/index.js.map +1 -0
- package/bin/src/mcp/manager.d.ts.map +1 -0
- package/bin/src/mcp/manager.js +535 -0
- package/bin/src/mcp/manager.js.map +1 -0
- package/bin/src/mcp/permissions.d.ts.map +1 -0
- package/bin/src/mcp/permissions.js +50 -0
- package/bin/src/mcp/permissions.js.map +1 -0
- package/bin/src/mcp/persistence.d.ts.map +1 -0
- package/bin/src/mcp/persistence.js +156 -0
- package/bin/src/mcp/persistence.js.map +1 -0
- package/bin/src/mcp/recovery.d.ts.map +1 -0
- package/bin/src/mcp/recovery.js +75 -0
- package/bin/src/mcp/recovery.js.map +1 -0
- package/bin/src/mcp/telemetry.d.ts.map +1 -0
- package/bin/src/mcp/telemetry.js +82 -0
- package/bin/src/mcp/telemetry.js.map +1 -0
- package/bin/src/mcp/toolRouter.d.ts.map +1 -0
- package/bin/src/mcp/toolRouter.js +127 -0
- package/bin/src/mcp/toolRouter.js.map +1 -0
- package/bin/src/mcp/transport.d.ts.map +1 -0
- package/bin/src/mcp/transport.js +328 -0
- package/bin/src/mcp/transport.js.map +1 -0
- package/bin/src/mcp/types.d.ts.map +1 -0
- package/bin/src/mcp/types.js +6 -0
- package/bin/src/mcp/types.js.map +1 -0
- package/bin/src/server/server.d.ts.map +1 -1
- package/bin/src/server/server.js +207 -0
- package/bin/src/server/server.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/email.js +4 -4
- package/package.json +1 -1
- package/web/app.js +1255 -59
- package/web/styles.css +1474 -15
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout MCP Ecosystem - Central Connection Manager
|
|
3
|
+
* Coordinates lifecycle, connection pools, tool execution, permissions, health, and persistence.
|
|
4
|
+
*/
|
|
5
|
+
import crypto from 'crypto';
|
|
6
|
+
import { loadMCPServers, saveMCPServers, saveServerSecret, getServerSecret, deleteServerSecret, sanitizeServerConfig, } from './persistence.js';
|
|
7
|
+
import { HttpMcpTransport, StdioMcpTransport } from './transport.js';
|
|
8
|
+
import { MCPClient } from './client.js';
|
|
9
|
+
import { normalizeMCPTool } from './discovery.js';
|
|
10
|
+
import { MCPPermissionManager } from './permissions.js';
|
|
11
|
+
import { MCPToolRouter } from './toolRouter.js';
|
|
12
|
+
import { MCPTelemetry } from './telemetry.js';
|
|
13
|
+
import { MCPHealthMonitor } from './health.js';
|
|
14
|
+
import { MCPRecovery } from './recovery.js';
|
|
15
|
+
export class MCPManager {
|
|
16
|
+
static instance = null;
|
|
17
|
+
servers = new Map();
|
|
18
|
+
clients = new Map();
|
|
19
|
+
initialized = false;
|
|
20
|
+
constructor() {
|
|
21
|
+
this.loadState();
|
|
22
|
+
}
|
|
23
|
+
static getInstance() {
|
|
24
|
+
if (!MCPManager.instance) {
|
|
25
|
+
MCPManager.instance = new MCPManager();
|
|
26
|
+
}
|
|
27
|
+
return MCPManager.instance;
|
|
28
|
+
}
|
|
29
|
+
loadState() {
|
|
30
|
+
const saved = loadMCPServers();
|
|
31
|
+
this.servers.clear();
|
|
32
|
+
for (const s of saved) {
|
|
33
|
+
// Reset in-memory volatile status on startup if was previously connecting
|
|
34
|
+
if (s.status === 'connecting' || s.status === 'reconnecting') {
|
|
35
|
+
s.status = 'disconnected';
|
|
36
|
+
}
|
|
37
|
+
this.servers.set(s.id, s);
|
|
38
|
+
}
|
|
39
|
+
this.initialized = true;
|
|
40
|
+
}
|
|
41
|
+
persistState() {
|
|
42
|
+
const list = Array.from(this.servers.values());
|
|
43
|
+
saveMCPServers(list);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Find server by ID or case-insensitive Name
|
|
47
|
+
*/
|
|
48
|
+
getServer(idOrName) {
|
|
49
|
+
if (!idOrName)
|
|
50
|
+
return undefined;
|
|
51
|
+
// Direct ID lookup
|
|
52
|
+
const byId = this.servers.get(idOrName);
|
|
53
|
+
if (byId)
|
|
54
|
+
return byId;
|
|
55
|
+
// Name lookup
|
|
56
|
+
const lower = idOrName.toLowerCase().trim();
|
|
57
|
+
for (const s of this.servers.values()) {
|
|
58
|
+
if (s.name.toLowerCase() === lower || s.id.toLowerCase() === lower) {
|
|
59
|
+
return s;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* List all registered MCP servers (with secrets sanitized)
|
|
66
|
+
*/
|
|
67
|
+
listServers() {
|
|
68
|
+
return Array.from(this.servers.values()).map((s) => sanitizeServerConfig(s));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Register a new MCP server configuration and optionally store credentials
|
|
72
|
+
*/
|
|
73
|
+
async addServer(config, secret) {
|
|
74
|
+
const name = config.name.trim();
|
|
75
|
+
const existing = this.getServer(name);
|
|
76
|
+
if (existing) {
|
|
77
|
+
throw new Error(`An MCP server with name "${name}" already exists.`);
|
|
78
|
+
}
|
|
79
|
+
const id = config.id || name.toLowerCase().replace(/[^a-z0-9]/g, '-') || `mcp-${Date.now()}`;
|
|
80
|
+
const now = new Date().toISOString();
|
|
81
|
+
const defaultPermissions = {
|
|
82
|
+
enabled: true,
|
|
83
|
+
allowedTools: [],
|
|
84
|
+
disabledTools: [],
|
|
85
|
+
requireConfirmationForDestructive: true,
|
|
86
|
+
autoApproveSafe: true,
|
|
87
|
+
...config.permissions,
|
|
88
|
+
};
|
|
89
|
+
const server = {
|
|
90
|
+
id,
|
|
91
|
+
name,
|
|
92
|
+
description: config.description || '',
|
|
93
|
+
transport: config.transport,
|
|
94
|
+
endpoint: config.endpoint,
|
|
95
|
+
command: config.command,
|
|
96
|
+
args: config.args || [],
|
|
97
|
+
env: config.env || {},
|
|
98
|
+
authType: config.authType || (secret ? 'bearer' : 'none'),
|
|
99
|
+
authHeader: config.authHeader,
|
|
100
|
+
status: 'disconnected',
|
|
101
|
+
health: {
|
|
102
|
+
status: 'disconnected',
|
|
103
|
+
},
|
|
104
|
+
tools: [],
|
|
105
|
+
permissions: defaultPermissions,
|
|
106
|
+
createdAt: now,
|
|
107
|
+
updatedAt: now,
|
|
108
|
+
};
|
|
109
|
+
this.servers.set(id, server);
|
|
110
|
+
if (secret) {
|
|
111
|
+
saveServerSecret(id, secret);
|
|
112
|
+
server.hasSecret = true;
|
|
113
|
+
}
|
|
114
|
+
this.persistState();
|
|
115
|
+
return sanitizeServerConfig(server);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove an MCP server and its stored secrets
|
|
119
|
+
*/
|
|
120
|
+
async removeServer(idOrName) {
|
|
121
|
+
const server = this.getServer(idOrName);
|
|
122
|
+
if (!server)
|
|
123
|
+
return false;
|
|
124
|
+
await this.disconnectServer(server.id).catch(() => { });
|
|
125
|
+
deleteServerSecret(server.id);
|
|
126
|
+
this.servers.delete(server.id);
|
|
127
|
+
this.clients.delete(server.id);
|
|
128
|
+
this.persistState();
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create an IMCPTransport instance for the given server config
|
|
133
|
+
*/
|
|
134
|
+
createTransport(server) {
|
|
135
|
+
if (server.transport === 'http') {
|
|
136
|
+
if (!server.endpoint) {
|
|
137
|
+
throw new Error(`HTTP MCP server "${server.name}" requires an endpoint URL.`);
|
|
138
|
+
}
|
|
139
|
+
const headers = {};
|
|
140
|
+
const secret = getServerSecret(server.id);
|
|
141
|
+
if (secret) {
|
|
142
|
+
const headerName = server.authHeader || 'Authorization';
|
|
143
|
+
if (server.authType === 'bearer' || server.authType === 'oauth') {
|
|
144
|
+
headers[headerName] = `Bearer ${secret}`;
|
|
145
|
+
}
|
|
146
|
+
else if (server.authType === 'api-key') {
|
|
147
|
+
headers[headerName] = secret;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
headers[headerName] = secret;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return new HttpMcpTransport(server.endpoint, headers);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
if (!server.command) {
|
|
157
|
+
throw new Error(`stdio MCP server "${server.name}" requires a command.`);
|
|
158
|
+
}
|
|
159
|
+
return new StdioMcpTransport(server.command, server.args || [], server.env || {});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Connect to an MCP server, perform initialize handshake, and discover tools
|
|
164
|
+
*/
|
|
165
|
+
async connectServer(idOrName) {
|
|
166
|
+
const server = this.getServer(idOrName);
|
|
167
|
+
if (!server) {
|
|
168
|
+
throw new Error(`MCP server "${idOrName}" not found.`);
|
|
169
|
+
}
|
|
170
|
+
server.status = 'connecting';
|
|
171
|
+
this.persistState();
|
|
172
|
+
try {
|
|
173
|
+
// Disconnect old client if present
|
|
174
|
+
if (this.clients.has(server.id)) {
|
|
175
|
+
await this.clients.get(server.id)?.disconnect().catch(() => { });
|
|
176
|
+
this.clients.delete(server.id);
|
|
177
|
+
}
|
|
178
|
+
const transport = this.createTransport(server);
|
|
179
|
+
const client = new MCPClient(transport);
|
|
180
|
+
const initResult = await client.connectAndInitialize();
|
|
181
|
+
server.capabilities = initResult.capabilities;
|
|
182
|
+
// Discover and normalize tools
|
|
183
|
+
const rawTools = await client.listTools();
|
|
184
|
+
const normalizedTools = rawTools.map((rt) => normalizeMCPTool(rt, server.id, server.name));
|
|
185
|
+
// Restore disabled state if previously set
|
|
186
|
+
const disabledSet = new Set(server.permissions.disabledTools || []);
|
|
187
|
+
for (const t of normalizedTools) {
|
|
188
|
+
if (disabledSet.has(t.name)) {
|
|
189
|
+
t.enabled = false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
server.tools = normalizedTools;
|
|
193
|
+
server.status = 'connected';
|
|
194
|
+
server.lastConnectedAt = new Date().toISOString();
|
|
195
|
+
server.updatedAt = new Date().toISOString();
|
|
196
|
+
// Ping for initial latency check
|
|
197
|
+
try {
|
|
198
|
+
const latency = await client.ping();
|
|
199
|
+
server.health = {
|
|
200
|
+
status: 'connected',
|
|
201
|
+
latencyMs: latency,
|
|
202
|
+
lastCheckedAt: new Date().toISOString(),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
server.health = {
|
|
207
|
+
status: 'connected',
|
|
208
|
+
lastCheckedAt: new Date().toISOString(),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
this.clients.set(server.id, client);
|
|
212
|
+
this.persistState();
|
|
213
|
+
return sanitizeServerConfig(server);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
server.status = 'error';
|
|
217
|
+
server.health = {
|
|
218
|
+
status: 'error',
|
|
219
|
+
error: err?.message || String(err),
|
|
220
|
+
lastCheckedAt: new Date().toISOString(),
|
|
221
|
+
};
|
|
222
|
+
this.persistState();
|
|
223
|
+
throw err;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Disconnect an active MCP server
|
|
228
|
+
*/
|
|
229
|
+
async disconnectServer(idOrName) {
|
|
230
|
+
const server = this.getServer(idOrName);
|
|
231
|
+
if (!server) {
|
|
232
|
+
throw new Error(`MCP server "${idOrName}" not found.`);
|
|
233
|
+
}
|
|
234
|
+
const client = this.clients.get(server.id);
|
|
235
|
+
if (client) {
|
|
236
|
+
await client.disconnect().catch(() => { });
|
|
237
|
+
this.clients.delete(server.id);
|
|
238
|
+
}
|
|
239
|
+
server.status = 'disconnected';
|
|
240
|
+
server.health = {
|
|
241
|
+
status: 'disconnected',
|
|
242
|
+
lastCheckedAt: new Date().toISOString(),
|
|
243
|
+
};
|
|
244
|
+
server.updatedAt = new Date().toISOString();
|
|
245
|
+
this.persistState();
|
|
246
|
+
return sanitizeServerConfig(server);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Reconnect to an MCP server
|
|
250
|
+
*/
|
|
251
|
+
async reconnectServer(idOrName) {
|
|
252
|
+
const server = this.getServer(idOrName);
|
|
253
|
+
if (!server) {
|
|
254
|
+
throw new Error(`MCP server "${idOrName}" not found.`);
|
|
255
|
+
}
|
|
256
|
+
await this.disconnectServer(server.id).catch(() => { });
|
|
257
|
+
return await this.connectServer(server.id);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Check health and latency for a server, or all connected servers
|
|
261
|
+
*/
|
|
262
|
+
async checkHealth(idOrName) {
|
|
263
|
+
const results = {};
|
|
264
|
+
const targets = idOrName
|
|
265
|
+
? [this.getServer(idOrName)].filter(Boolean)
|
|
266
|
+
: Array.from(this.servers.values());
|
|
267
|
+
for (const server of targets) {
|
|
268
|
+
const client = this.clients.get(server.id);
|
|
269
|
+
const health = await MCPHealthMonitor.checkHealth(server, client);
|
|
270
|
+
server.health = health;
|
|
271
|
+
server.status = health.status;
|
|
272
|
+
results[server.id] = health;
|
|
273
|
+
}
|
|
274
|
+
this.persistState();
|
|
275
|
+
return results;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Retrieve all discovered tools for a server
|
|
279
|
+
*/
|
|
280
|
+
getToolsForServer(idOrName) {
|
|
281
|
+
const server = this.getServer(idOrName);
|
|
282
|
+
return server ? server.tools : [];
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Retrieve all discovered tools across all servers
|
|
286
|
+
*/
|
|
287
|
+
getAllTools(options = {}) {
|
|
288
|
+
const list = [];
|
|
289
|
+
for (const server of this.servers.values()) {
|
|
290
|
+
if (options.onlyEnabled && (server.status !== 'connected' || !server.permissions.enabled)) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
for (const tool of server.tools) {
|
|
294
|
+
if (options.onlyEnabled && !tool.enabled)
|
|
295
|
+
continue;
|
|
296
|
+
list.push(tool);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return list;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Enable or disable an individual tool on a server
|
|
303
|
+
*/
|
|
304
|
+
setToolEnabled(serverId, toolName, enabled) {
|
|
305
|
+
const server = this.getServer(serverId);
|
|
306
|
+
if (!server)
|
|
307
|
+
return false;
|
|
308
|
+
const tool = server.tools.find((t) => t.name === toolName || t.qualifiedName === toolName);
|
|
309
|
+
if (!tool)
|
|
310
|
+
return false;
|
|
311
|
+
tool.enabled = enabled;
|
|
312
|
+
const disabledSet = new Set(server.permissions.disabledTools || []);
|
|
313
|
+
if (enabled) {
|
|
314
|
+
disabledSet.delete(tool.name);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
disabledSet.add(tool.name);
|
|
318
|
+
}
|
|
319
|
+
server.permissions.disabledTools = Array.from(disabledSet);
|
|
320
|
+
server.updatedAt = new Date().toISOString();
|
|
321
|
+
this.persistState();
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Update permissions for an MCP server
|
|
326
|
+
*/
|
|
327
|
+
setServerPermissions(serverId, permissions) {
|
|
328
|
+
const server = this.getServer(serverId);
|
|
329
|
+
if (!server)
|
|
330
|
+
return false;
|
|
331
|
+
server.permissions = {
|
|
332
|
+
...server.permissions,
|
|
333
|
+
...permissions,
|
|
334
|
+
};
|
|
335
|
+
server.updatedAt = new Date().toISOString();
|
|
336
|
+
this.persistState();
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Toggle a tool enabled/disabled state for a given server
|
|
341
|
+
*/
|
|
342
|
+
toggleTool(serverId, toolName, enabled) {
|
|
343
|
+
const server = this.getServer(serverId);
|
|
344
|
+
if (!server)
|
|
345
|
+
return undefined;
|
|
346
|
+
const targetTool = server.tools.find((t) => t.originalName === toolName || t.name === toolName);
|
|
347
|
+
if (!targetTool)
|
|
348
|
+
return undefined;
|
|
349
|
+
targetTool.enabled = enabled !== undefined ? enabled : !targetTool.enabled;
|
|
350
|
+
const disabledList = new Set(server.permissions.disabledTools || []);
|
|
351
|
+
if (targetTool.enabled) {
|
|
352
|
+
disabledList.delete(targetTool.originalName);
|
|
353
|
+
disabledList.delete(targetTool.name);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
disabledList.add(targetTool.originalName);
|
|
357
|
+
}
|
|
358
|
+
server.permissions.disabledTools = Array.from(disabledList);
|
|
359
|
+
server.updatedAt = new Date().toISOString();
|
|
360
|
+
this.persistState();
|
|
361
|
+
return sanitizeServerConfig(server);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Route user request to relevant MCP tools
|
|
365
|
+
*/
|
|
366
|
+
routeTools(userGoal) {
|
|
367
|
+
return MCPToolRouter.routeTools(userGoal, Array.from(this.servers.values()));
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Find tool by either its qualified name (mcp__<serverId>__<toolName>) or its original name
|
|
371
|
+
*/
|
|
372
|
+
findTool(nameOrQualified) {
|
|
373
|
+
for (const server of this.servers.values()) {
|
|
374
|
+
for (const tool of server.tools) {
|
|
375
|
+
if (tool.qualifiedName === nameOrQualified || tool.name === nameOrQualified) {
|
|
376
|
+
return { tool, server };
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Execute an MCP tool by name, handling permissions, connection, retry, and telemetry
|
|
384
|
+
*/
|
|
385
|
+
async executeTool(nameOrQualified, args = {}) {
|
|
386
|
+
const startedAt = new Date().toISOString();
|
|
387
|
+
const startTime = Date.now();
|
|
388
|
+
const invocationId = `mcp_inv_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;
|
|
389
|
+
const target = this.findTool(nameOrQualified);
|
|
390
|
+
if (!target) {
|
|
391
|
+
const err = `Tool "${nameOrQualified}" is not registered on any connected MCP server.`;
|
|
392
|
+
const result = {
|
|
393
|
+
serverId: 'unknown',
|
|
394
|
+
serverName: 'Unknown',
|
|
395
|
+
toolName: nameOrQualified,
|
|
396
|
+
invocationId,
|
|
397
|
+
startedAt,
|
|
398
|
+
completedAt: new Date().toISOString(),
|
|
399
|
+
status: 'error',
|
|
400
|
+
inputSummary: JSON.stringify(args),
|
|
401
|
+
outputSummary: err,
|
|
402
|
+
result: null,
|
|
403
|
+
error: err,
|
|
404
|
+
executionDurationMs: Date.now() - startTime,
|
|
405
|
+
};
|
|
406
|
+
MCPTelemetry.recordResult(result);
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
const { tool, server } = target;
|
|
410
|
+
// 1. Enforce Permissions
|
|
411
|
+
const perm = MCPPermissionManager.checkToolAccess(server, tool);
|
|
412
|
+
if (!perm.allowed) {
|
|
413
|
+
const blockedReason = perm.reason || `Tool "${tool.name}" is restricted by Scout permissions.`;
|
|
414
|
+
const result = {
|
|
415
|
+
serverId: server.id,
|
|
416
|
+
serverName: server.name,
|
|
417
|
+
toolName: tool.name,
|
|
418
|
+
invocationId,
|
|
419
|
+
startedAt,
|
|
420
|
+
completedAt: new Date().toISOString(),
|
|
421
|
+
status: 'blocked',
|
|
422
|
+
inputSummary: JSON.stringify(args),
|
|
423
|
+
outputSummary: `[MCP PERMISSION BLOCKED]: ${blockedReason}`,
|
|
424
|
+
result: { success: false, error: 'PermissionBlocked', message: blockedReason },
|
|
425
|
+
error: blockedReason,
|
|
426
|
+
executionDurationMs: Date.now() - startTime,
|
|
427
|
+
};
|
|
428
|
+
MCPTelemetry.recordResult(result);
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
// 2. Ensure Client is connected
|
|
432
|
+
let client = this.clients.get(server.id);
|
|
433
|
+
if (!client || !client.isConnected()) {
|
|
434
|
+
try {
|
|
435
|
+
await this.connectServer(server.id);
|
|
436
|
+
client = this.clients.get(server.id);
|
|
437
|
+
}
|
|
438
|
+
catch (connErr) {
|
|
439
|
+
const classified = MCPRecovery.classifyError(connErr, server.name, tool.permissionLevel === 'destructive');
|
|
440
|
+
const result = {
|
|
441
|
+
serverId: server.id,
|
|
442
|
+
serverName: server.name,
|
|
443
|
+
toolName: tool.name,
|
|
444
|
+
invocationId,
|
|
445
|
+
startedAt,
|
|
446
|
+
completedAt: new Date().toISOString(),
|
|
447
|
+
status: 'error',
|
|
448
|
+
inputSummary: JSON.stringify(args),
|
|
449
|
+
outputSummary: classified.userFriendlyMessage,
|
|
450
|
+
result: null,
|
|
451
|
+
error: classified.originalError,
|
|
452
|
+
executionDurationMs: Date.now() - startTime,
|
|
453
|
+
};
|
|
454
|
+
MCPTelemetry.recordResult(result);
|
|
455
|
+
return result;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (!client) {
|
|
459
|
+
throw new Error(`Could not obtain active client for MCP server "${server.name}".`);
|
|
460
|
+
}
|
|
461
|
+
// 3. Execute with bounded recovery
|
|
462
|
+
let execResult = null;
|
|
463
|
+
let execError = null;
|
|
464
|
+
const maxRetries = tool.permissionLevel === 'read' ? 1 : 0;
|
|
465
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
466
|
+
try {
|
|
467
|
+
execResult = await client.callTool(tool.originalName, args);
|
|
468
|
+
execError = null;
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
catch (callErr) {
|
|
472
|
+
execError = callErr;
|
|
473
|
+
const classified = MCPRecovery.classifyError(callErr, server.name, tool.permissionLevel === 'destructive');
|
|
474
|
+
if (classified.isRecoverable && classified.canRetry && attempt < maxRetries) {
|
|
475
|
+
// Try reconnecting once before final retry
|
|
476
|
+
await this.reconnectServer(server.id).catch(() => { });
|
|
477
|
+
client = this.clients.get(server.id) || client;
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
break;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
server.lastActivityAt = new Date().toISOString();
|
|
484
|
+
this.persistState();
|
|
485
|
+
const completedAt = new Date().toISOString();
|
|
486
|
+
const duration = Date.now() - startTime;
|
|
487
|
+
if (execError) {
|
|
488
|
+
const classified = MCPRecovery.classifyError(execError, server.name, tool.permissionLevel === 'destructive');
|
|
489
|
+
const result = {
|
|
490
|
+
serverId: server.id,
|
|
491
|
+
serverName: server.name,
|
|
492
|
+
toolName: tool.name,
|
|
493
|
+
invocationId,
|
|
494
|
+
startedAt,
|
|
495
|
+
completedAt,
|
|
496
|
+
status: classified.category === 'TIMEOUT' ? 'timeout' : 'error',
|
|
497
|
+
inputSummary: JSON.stringify(args),
|
|
498
|
+
outputSummary: classified.userFriendlyMessage,
|
|
499
|
+
result: null,
|
|
500
|
+
error: classified.originalError,
|
|
501
|
+
executionDurationMs: duration,
|
|
502
|
+
};
|
|
503
|
+
MCPTelemetry.recordResult(result);
|
|
504
|
+
return result;
|
|
505
|
+
}
|
|
506
|
+
const outSummary = typeof execResult === 'string'
|
|
507
|
+
? execResult.slice(0, 300)
|
|
508
|
+
: (execResult?.text ? String(execResult.text).slice(0, 300) : JSON.stringify(execResult).slice(0, 300));
|
|
509
|
+
const successRecord = {
|
|
510
|
+
serverId: server.id,
|
|
511
|
+
serverName: server.name,
|
|
512
|
+
toolName: tool.name,
|
|
513
|
+
invocationId,
|
|
514
|
+
startedAt,
|
|
515
|
+
completedAt,
|
|
516
|
+
status: 'success',
|
|
517
|
+
inputSummary: JSON.stringify(args),
|
|
518
|
+
outputSummary: outSummary,
|
|
519
|
+
result: execResult,
|
|
520
|
+
executionDurationMs: duration,
|
|
521
|
+
};
|
|
522
|
+
MCPTelemetry.recordResult(successRecord);
|
|
523
|
+
return successRecord;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Get recent observable activity
|
|
527
|
+
*/
|
|
528
|
+
getActivityLog(limit = 50) {
|
|
529
|
+
return MCPTelemetry.loadActivity(limit);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
export function getMCPManager() {
|
|
533
|
+
return MCPManager.getInstance();
|
|
534
|
+
}
|
|
535
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["permissions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,kBAAkB,CAAC;CACvC;AAED,qBAAa,oBAAoB;IAC7B;;OAEG;IACH,OAAc,eAAe,CACzB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,iBAAiB,GACxB,wBAAwB,CA+C1B;CACJ"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout MCP Ecosystem - Permission Boundary Engine
|
|
3
|
+
* Enforces server-level and tool-level permission rules before execution or model exposure.
|
|
4
|
+
*/
|
|
5
|
+
export class MCPPermissionManager {
|
|
6
|
+
/**
|
|
7
|
+
* Check if a tool can be made available to the agent or executed
|
|
8
|
+
*/
|
|
9
|
+
static checkToolAccess(server, tool) {
|
|
10
|
+
// 1. Server-level disabled check
|
|
11
|
+
if (server.permissions.enabled === false) {
|
|
12
|
+
return {
|
|
13
|
+
allowed: false,
|
|
14
|
+
reason: `MCP server "${server.name}" is currently disabled in Scout settings.`,
|
|
15
|
+
requiresApproval: false,
|
|
16
|
+
permissionLevel: tool.permissionLevel,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// 2. Individual tool disabled check
|
|
20
|
+
if (tool.enabled === false ||
|
|
21
|
+
(server.permissions.disabledTools && server.permissions.disabledTools.includes(tool.name))) {
|
|
22
|
+
return {
|
|
23
|
+
allowed: false,
|
|
24
|
+
reason: `Tool "${tool.name}" on server "${server.name}" has been disabled by the user.`,
|
|
25
|
+
requiresApproval: false,
|
|
26
|
+
permissionLevel: tool.permissionLevel,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// 3. Whitelist check (if configured)
|
|
30
|
+
if (Array.isArray(server.permissions.allowedTools) &&
|
|
31
|
+
server.permissions.allowedTools.length > 0 &&
|
|
32
|
+
!server.permissions.allowedTools.includes(tool.name)) {
|
|
33
|
+
return {
|
|
34
|
+
allowed: false,
|
|
35
|
+
reason: `Tool "${tool.name}" is not included in the allowed tools whitelist for "${server.name}".`,
|
|
36
|
+
requiresApproval: false,
|
|
37
|
+
permissionLevel: tool.permissionLevel,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// 4. Approval requirements for destructive or admin actions
|
|
41
|
+
const isDestructive = tool.permissionLevel === 'destructive' || tool.permissionLevel === 'admin';
|
|
42
|
+
const requiresApproval = isDestructive && server.permissions.requireConfirmationForDestructive;
|
|
43
|
+
return {
|
|
44
|
+
allowed: true,
|
|
45
|
+
requiresApproval,
|
|
46
|
+
permissionLevel: tool.permissionLevel,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["permissions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,OAAO,oBAAoB;IAC7B;;OAEG;IACI,MAAM,CAAC,eAAe,CACzB,MAAuB,EACvB,IAAuB;QAEvB,iCAAiC;QACjC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACvC,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,eAAe,MAAM,CAAC,IAAI,4CAA4C;gBAC9E,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,IAAI,CAAC,eAAe;aACxC,CAAC;QACN,CAAC;QAED,oCAAoC;QACpC,IACI,IAAI,CAAC,OAAO,KAAK,KAAK;YACtB,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,IAAI,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAC5F,CAAC;YACC,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS,IAAI,CAAC,IAAI,gBAAgB,MAAM,CAAC,IAAI,kCAAkC;gBACvF,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,IAAI,CAAC,eAAe;aACxC,CAAC;QACN,CAAC;QAED,qCAAqC;QACrC,IACI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAC1C,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EACtD,CAAC;YACC,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS,IAAI,CAAC,IAAI,yDAAyD,MAAM,CAAC,IAAI,IAAI;gBAClG,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,IAAI,CAAC,eAAe;aACxC,CAAC;QACN,CAAC;QAED,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,KAAK,aAAa,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,CAAC;QACjG,MAAM,gBAAgB,GAAG,aAAa,IAAI,MAAM,CAAC,WAAW,CAAC,iCAAiC,CAAC;QAE/F,OAAO;YACH,OAAO,EAAE,IAAI;YACb,gBAAgB;YAChB,eAAe,EAAE,IAAI,CAAC,eAAe;SACxC,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmBlD;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAoB9D;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAKhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,QAMlD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAalD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,QAKxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAS7E"}
|