@sonoma-security/mcp-gateway 0.1.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/README.md +82 -0
- package/dist/auth/client.d.ts +35 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +217 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/server.d.ts +26 -0
- package/dist/auth/server.d.ts.map +1 -0
- package/dist/auth/server.js +155 -0
- package/dist/auth/server.js.map +1 -0
- package/dist/auth/storage.d.ts +58 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +181 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +272 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +134 -0
- package/dist/config.js.map +1 -0
- package/dist/gateway.d.ts +66 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +346 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/sonoma-client.d.ts +55 -0
- package/dist/sonoma-client.d.ts.map +1 -0
- package/dist/sonoma-client.js +144 -0
- package/dist/sonoma-client.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Gateway - Core proxy implementation
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* AI Client (stdio) -> Gateway Server -> [Upstream MCP Clients] -> Upstream Servers
|
|
6
|
+
*
|
|
7
|
+
* The gateway:
|
|
8
|
+
* 1. Exposes itself as an MCP server to the AI client
|
|
9
|
+
* 2. Spawns upstream MCP servers and connects as a client to each
|
|
10
|
+
* 3. Aggregates tools from all upstream servers
|
|
11
|
+
* 4. Forwards tool calls to the appropriate upstream server
|
|
12
|
+
* 5. Reports telemetry to Sonoma API
|
|
13
|
+
* 6. Enforces policy (block/allow tools)
|
|
14
|
+
*/
|
|
15
|
+
import type { GatewayConfig, ToolCallEvent } from "./types";
|
|
16
|
+
export declare class McpGateway {
|
|
17
|
+
private config;
|
|
18
|
+
private server;
|
|
19
|
+
private upstreams;
|
|
20
|
+
private toolToServer;
|
|
21
|
+
private events;
|
|
22
|
+
private debug;
|
|
23
|
+
private sonomaClient;
|
|
24
|
+
private policy;
|
|
25
|
+
private policyRefreshInterval;
|
|
26
|
+
constructor(config: GatewayConfig);
|
|
27
|
+
private log;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a tool is blocked by policy
|
|
30
|
+
* @returns true if blocked, false if allowed
|
|
31
|
+
*/
|
|
32
|
+
private isToolBlocked;
|
|
33
|
+
/**
|
|
34
|
+
* Set up MCP server handlers
|
|
35
|
+
*/
|
|
36
|
+
private setupHandlers;
|
|
37
|
+
/**
|
|
38
|
+
* Connect to an upstream MCP server
|
|
39
|
+
*/
|
|
40
|
+
private connectUpstream;
|
|
41
|
+
/**
|
|
42
|
+
* Record a tool call event for telemetry
|
|
43
|
+
*/
|
|
44
|
+
private recordEvent;
|
|
45
|
+
/**
|
|
46
|
+
* Refresh policy from Sonoma API
|
|
47
|
+
*/
|
|
48
|
+
private refreshPolicy;
|
|
49
|
+
/**
|
|
50
|
+
* Start the gateway
|
|
51
|
+
*/
|
|
52
|
+
start(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Stop the gateway and disconnect from all upstreams
|
|
55
|
+
*/
|
|
56
|
+
stop(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Get recorded events (for telemetry export)
|
|
59
|
+
*/
|
|
60
|
+
getEvents(): ToolCallEvent[];
|
|
61
|
+
/**
|
|
62
|
+
* Clear recorded events
|
|
63
|
+
*/
|
|
64
|
+
clearEvents(): void;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH,OAAO,KAAK,EACV,aAAa,EAEb,aAAa,EACd,MAAM,SAAS,CAAC;AAUjB,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,qBAAqB,CAA+C;gBAEhE,MAAM,EAAE,aAAa;IA6BjC,OAAO,CAAC,GAAG;IAMX;;;OAGG;IACH,OAAO,CAAC,aAAa;IAwCrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkIrB;;OAEG;YACW,eAAe;IA2C7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAI5B;;OAEG;IACH,WAAW,IAAI,IAAI;CAGpB"}
|
package/dist/gateway.js
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Gateway - Core proxy implementation
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* AI Client (stdio) -> Gateway Server -> [Upstream MCP Clients] -> Upstream Servers
|
|
6
|
+
*
|
|
7
|
+
* The gateway:
|
|
8
|
+
* 1. Exposes itself as an MCP server to the AI client
|
|
9
|
+
* 2. Spawns upstream MCP servers and connects as a client to each
|
|
10
|
+
* 3. Aggregates tools from all upstream servers
|
|
11
|
+
* 4. Forwards tool calls to the appropriate upstream server
|
|
12
|
+
* 5. Reports telemetry to Sonoma API
|
|
13
|
+
* 6. Enforces policy (block/allow tools)
|
|
14
|
+
*/
|
|
15
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
16
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
17
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
18
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
19
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
20
|
+
import { SonomaClient } from "./sonoma-client";
|
|
21
|
+
export class McpGateway {
|
|
22
|
+
config;
|
|
23
|
+
server;
|
|
24
|
+
upstreams = new Map();
|
|
25
|
+
toolToServer = new Map();
|
|
26
|
+
events = [];
|
|
27
|
+
debug;
|
|
28
|
+
sonomaClient = null;
|
|
29
|
+
policy = null;
|
|
30
|
+
policyRefreshInterval = null;
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this.config = config;
|
|
33
|
+
this.debug = config.debug ?? false;
|
|
34
|
+
// Initialize Sonoma client if endpoint provided
|
|
35
|
+
// Auth priority: OAuth token (user-linked) > org API key (device-level)
|
|
36
|
+
if (config.sonomaEndpoint) {
|
|
37
|
+
this.sonomaClient = new SonomaClient({
|
|
38
|
+
endpoint: config.sonomaEndpoint,
|
|
39
|
+
orgApiKey: config.sonomaApiKey,
|
|
40
|
+
debug: this.debug,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
this.server = new Server({
|
|
44
|
+
name: "sonoma-mcp-gateway",
|
|
45
|
+
version: "0.1.0",
|
|
46
|
+
}, {
|
|
47
|
+
capabilities: {
|
|
48
|
+
tools: {},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
this.setupHandlers();
|
|
52
|
+
}
|
|
53
|
+
log(message, ...args) {
|
|
54
|
+
if (this.debug) {
|
|
55
|
+
console.error(`[gateway] ${message}`, ...args);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a tool is blocked by policy
|
|
60
|
+
* @returns true if blocked, false if allowed
|
|
61
|
+
*/
|
|
62
|
+
isToolBlocked(serverName, toolName) {
|
|
63
|
+
if (!this.policy || this.policy.mode === "disabled") {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Get identifiers to check
|
|
67
|
+
const upstream = this.upstreams.get(serverName);
|
|
68
|
+
const packageName = upstream?.config.packageName;
|
|
69
|
+
// Identifiers to check: packageName (preferred) or server name
|
|
70
|
+
const identifiers = [];
|
|
71
|
+
if (packageName)
|
|
72
|
+
identifiers.push(packageName);
|
|
73
|
+
identifiers.push(serverName);
|
|
74
|
+
// Check if any identifier is in the list
|
|
75
|
+
const matchedEntry = this.policy.list.find((entry) => identifiers.includes(entry.identifier));
|
|
76
|
+
if (this.policy.mode === "blocklist") {
|
|
77
|
+
// Blocklist: block if found in list with blocked status
|
|
78
|
+
if (matchedEntry && matchedEntry.status === "blocked") {
|
|
79
|
+
this.log(`Tool blocked by policy: ${serverName}.${toolName}`);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
if (this.policy.mode === "allowlist") {
|
|
85
|
+
// Allowlist: block if NOT found in list with allowed status
|
|
86
|
+
if (!matchedEntry || matchedEntry.status !== "allowed") {
|
|
87
|
+
this.log(`Tool not in allowlist: ${serverName}.${toolName}`);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set up MCP server handlers
|
|
96
|
+
*/
|
|
97
|
+
setupHandlers() {
|
|
98
|
+
// Handle tools/list - aggregate tools from all upstreams
|
|
99
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
100
|
+
const allTools = [];
|
|
101
|
+
for (const [serverName, upstream] of this.upstreams) {
|
|
102
|
+
for (const tool of upstream.tools) {
|
|
103
|
+
// Namespace tool names to avoid conflicts: serverName__toolName
|
|
104
|
+
const namespacedTool = {
|
|
105
|
+
...tool,
|
|
106
|
+
name: `${serverName}__${tool.name}`,
|
|
107
|
+
description: `[${serverName}] ${tool.description || ""}`,
|
|
108
|
+
};
|
|
109
|
+
allTools.push(namespacedTool);
|
|
110
|
+
this.toolToServer.set(namespacedTool.name, serverName);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
this.log(`Returning ${allTools.length} tools from ${this.upstreams.size} servers`);
|
|
114
|
+
return { tools: allTools };
|
|
115
|
+
});
|
|
116
|
+
// Handle tools/call - forward to appropriate upstream
|
|
117
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
118
|
+
const { name, arguments: args } = request.params;
|
|
119
|
+
const startTime = Date.now();
|
|
120
|
+
// Parse namespaced tool name
|
|
121
|
+
const separatorIndex = name.indexOf("__");
|
|
122
|
+
if (separatorIndex === -1) {
|
|
123
|
+
return {
|
|
124
|
+
isError: true,
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: `Invalid tool name format: ${name}. Expected serverName__toolName`,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const serverName = name.slice(0, separatorIndex);
|
|
134
|
+
const toolName = name.slice(separatorIndex + 2);
|
|
135
|
+
const upstream = this.upstreams.get(serverName);
|
|
136
|
+
if (!upstream) {
|
|
137
|
+
return {
|
|
138
|
+
isError: true,
|
|
139
|
+
content: [
|
|
140
|
+
{
|
|
141
|
+
type: "text",
|
|
142
|
+
text: `Unknown server: ${serverName}`,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Check policy before forwarding
|
|
148
|
+
if (this.isToolBlocked(serverName, toolName)) {
|
|
149
|
+
const event = {
|
|
150
|
+
serverName,
|
|
151
|
+
toolName,
|
|
152
|
+
timestamp: new Date().toISOString(),
|
|
153
|
+
durationMs: Date.now() - startTime,
|
|
154
|
+
status: "blocked",
|
|
155
|
+
argumentKeys: args ? Object.keys(args) : [],
|
|
156
|
+
};
|
|
157
|
+
this.recordEvent(event);
|
|
158
|
+
return {
|
|
159
|
+
isError: true,
|
|
160
|
+
content: [
|
|
161
|
+
{
|
|
162
|
+
type: "text",
|
|
163
|
+
text: `Tool ${serverName}.${toolName} is blocked by organization policy`,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
this.log(`Forwarding tool call: ${serverName}.${toolName}`);
|
|
169
|
+
try {
|
|
170
|
+
const result = await upstream.client.callTool({
|
|
171
|
+
name: toolName,
|
|
172
|
+
arguments: args,
|
|
173
|
+
});
|
|
174
|
+
this.recordEvent({
|
|
175
|
+
serverName,
|
|
176
|
+
toolName,
|
|
177
|
+
timestamp: new Date().toISOString(),
|
|
178
|
+
durationMs: Date.now() - startTime,
|
|
179
|
+
status: "success",
|
|
180
|
+
argumentKeys: args ? Object.keys(args) : [],
|
|
181
|
+
});
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
186
|
+
this.recordEvent({
|
|
187
|
+
serverName,
|
|
188
|
+
toolName,
|
|
189
|
+
timestamp: new Date().toISOString(),
|
|
190
|
+
durationMs: Date.now() - startTime,
|
|
191
|
+
status: "error",
|
|
192
|
+
errorMessage,
|
|
193
|
+
argumentKeys: args ? Object.keys(args) : [],
|
|
194
|
+
});
|
|
195
|
+
return {
|
|
196
|
+
isError: true,
|
|
197
|
+
content: [
|
|
198
|
+
{
|
|
199
|
+
type: "text",
|
|
200
|
+
text: `Error calling ${serverName}.${toolName}: ${errorMessage}`,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Connect to an upstream MCP server
|
|
209
|
+
*/
|
|
210
|
+
async connectUpstream(config) {
|
|
211
|
+
this.log(`Connecting to upstream: ${config.name} (${config.command})`);
|
|
212
|
+
const client = new Client({
|
|
213
|
+
name: `gateway-client-${config.name}`,
|
|
214
|
+
version: "0.1.0",
|
|
215
|
+
}, {
|
|
216
|
+
capabilities: {},
|
|
217
|
+
});
|
|
218
|
+
// Build env with only defined values (filter out undefined from process.env)
|
|
219
|
+
let env;
|
|
220
|
+
if (config.env) {
|
|
221
|
+
env = {};
|
|
222
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
223
|
+
if (value !== undefined) {
|
|
224
|
+
env[key] = value;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
Object.assign(env, config.env);
|
|
228
|
+
}
|
|
229
|
+
const transport = new StdioClientTransport({
|
|
230
|
+
command: config.command,
|
|
231
|
+
args: config.args,
|
|
232
|
+
env,
|
|
233
|
+
cwd: config.cwd,
|
|
234
|
+
});
|
|
235
|
+
await client.connect(transport);
|
|
236
|
+
// Fetch tools from this upstream
|
|
237
|
+
const toolsResult = await client.listTools();
|
|
238
|
+
const tools = toolsResult.tools || [];
|
|
239
|
+
this.log(` ${config.name}: ${tools.length} tools available`);
|
|
240
|
+
return { config, client, transport, tools };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Record a tool call event for telemetry
|
|
244
|
+
*/
|
|
245
|
+
recordEvent(event) {
|
|
246
|
+
this.events.push(event);
|
|
247
|
+
this.log(`Event: ${event.serverName}.${event.toolName} [${event.status}] ${event.durationMs}ms`);
|
|
248
|
+
// Queue event for Sonoma telemetry if connected
|
|
249
|
+
if (this.sonomaClient) {
|
|
250
|
+
this.sonomaClient.queueEvent(event);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Refresh policy from Sonoma API
|
|
255
|
+
*/
|
|
256
|
+
async refreshPolicy() {
|
|
257
|
+
if (!this.sonomaClient)
|
|
258
|
+
return;
|
|
259
|
+
try {
|
|
260
|
+
this.policy = await this.sonomaClient.fetchPolicy();
|
|
261
|
+
this.log(`Policy refreshed: mode=${this.policy.mode}, ${this.policy.list.length} rules`);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
this.log(`Failed to refresh policy: ${error}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Start the gateway
|
|
269
|
+
*/
|
|
270
|
+
async start() {
|
|
271
|
+
this.log("Starting MCP Gateway...");
|
|
272
|
+
// Fetch initial policy from Sonoma
|
|
273
|
+
if (this.sonomaClient) {
|
|
274
|
+
await this.refreshPolicy();
|
|
275
|
+
// Start periodic policy refresh (every 5 minutes)
|
|
276
|
+
this.policyRefreshInterval = setInterval(() => {
|
|
277
|
+
this.refreshPolicy().catch((err) => {
|
|
278
|
+
this.log(`Policy refresh error: ${err}`);
|
|
279
|
+
});
|
|
280
|
+
}, 5 * 60 * 1000);
|
|
281
|
+
// Start periodic telemetry flush (every 30 seconds)
|
|
282
|
+
this.sonomaClient.startTelemetryFlush(30 * 1000);
|
|
283
|
+
}
|
|
284
|
+
// Connect to all upstream servers
|
|
285
|
+
for (const serverConfig of this.config.servers) {
|
|
286
|
+
try {
|
|
287
|
+
const upstream = await this.connectUpstream(serverConfig);
|
|
288
|
+
this.upstreams.set(serverConfig.name, upstream);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
console.error(`Failed to connect to ${serverConfig.name}:`, error);
|
|
292
|
+
// Continue with other servers
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
this.log(`Connected to ${this.upstreams.size}/${this.config.servers.length} upstreams`);
|
|
296
|
+
// Start the server (stdio transport to AI client)
|
|
297
|
+
const transport = new StdioServerTransport();
|
|
298
|
+
await this.server.connect(transport);
|
|
299
|
+
this.log("Gateway ready - listening for requests");
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Stop the gateway and disconnect from all upstreams
|
|
303
|
+
*/
|
|
304
|
+
async stop() {
|
|
305
|
+
this.log("Stopping gateway...");
|
|
306
|
+
// Stop policy refresh
|
|
307
|
+
if (this.policyRefreshInterval) {
|
|
308
|
+
clearInterval(this.policyRefreshInterval);
|
|
309
|
+
this.policyRefreshInterval = null;
|
|
310
|
+
}
|
|
311
|
+
// Flush remaining telemetry
|
|
312
|
+
if (this.sonomaClient) {
|
|
313
|
+
this.sonomaClient.stopTelemetryFlush();
|
|
314
|
+
try {
|
|
315
|
+
await this.sonomaClient.flushTelemetry();
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
this.log(`Failed to flush telemetry on shutdown: ${error}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
for (const [name, upstream] of this.upstreams) {
|
|
322
|
+
try {
|
|
323
|
+
await upstream.client.close();
|
|
324
|
+
this.log(`Disconnected from ${name}`);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
console.error(`Error disconnecting from ${name}:`, error);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
await this.server.close();
|
|
331
|
+
this.log("Gateway stopped");
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get recorded events (for telemetry export)
|
|
335
|
+
*/
|
|
336
|
+
getEvents() {
|
|
337
|
+
return [...this.events];
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Clear recorded events
|
|
341
|
+
*/
|
|
342
|
+
clearEvents() {
|
|
343
|
+
this.events = [];
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAW5C,OAAO,EAAE,YAAY,EAAuB,MAAM,iBAAiB,CAAC;AASpE,MAAM,OAAO,UAAU;IACb,MAAM,CAAgB;IACtB,MAAM,CAAS;IACf,SAAS,GAAoC,IAAI,GAAG,EAAE,CAAC;IACvD,YAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,GAAoB,EAAE,CAAC;IAC7B,KAAK,CAAU;IACf,YAAY,GAAwB,IAAI,CAAC;IACzC,MAAM,GAA0B,IAAI,CAAC;IACrC,qBAAqB,GAA0C,IAAI,CAAC;IAE5E,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QAEnC,gDAAgD;QAChD,wEAAwE;QACxE,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC;gBACnC,QAAQ,EAAE,MAAM,CAAC,cAAc;gBAC/B,SAAS,EAAE,MAAM,CAAC,YAAY;gBAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;aACV;SACF,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,GAAG,CAAC,OAAe,EAAE,GAAG,IAAe;QAC7C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,UAAkB,EAAE,QAAgB;QACxD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;QAEjD,+DAA+D;QAC/D,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7B,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAClD,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,wDAAwD;YACxD,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtD,IAAI,CAAC,GAAG,CAAC,2BAA2B,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,4DAA4D;YAC5D,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvD,IAAI,CAAC,GAAG,CAAC,0BAA0B,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,yDAAyD;QACzD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,sBAAsB,EACtB,KAAK,IAA8B,EAAE;YACnC,MAAM,QAAQ,GAAW,EAAE,CAAC;YAE5B,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAClC,gEAAgE;oBAChE,MAAM,cAAc,GAAS;wBAC3B,GAAG,IAAI;wBACP,IAAI,EAAE,GAAG,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE;wBACnC,WAAW,EAAE,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE;qBACzD,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,CAAC;YACnF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7B,CAAC,CACF,CAAC;QAEF,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,qBAAqB,EACrB,KAAK,EAAE,OAAO,EAA2B,EAAE;YACzC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,6BAA6B;YAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,6BAA6B,IAAI,iCAAiC;yBACzE;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,mBAAmB,UAAU,EAAE;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAkB;oBAC3B,UAAU;oBACV,QAAQ;oBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,MAAM,EAAE,SAAS;oBACjB,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC5C,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAExB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,QAAQ,UAAU,IAAI,QAAQ,oCAAoC;yBACzE;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,yBAAyB,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;YAE5D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;oBAC5C,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBAEH,IAAI,CAAC,WAAW,CAAC;oBACf,UAAU;oBACV,QAAQ;oBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,MAAM,EAAE,SAAS;oBACjB,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC5C,CAAC,CAAC;gBAEH,OAAO,MAAwB,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAE5E,IAAI,CAAC,WAAW,CAAC;oBACf,UAAU;oBACV,QAAQ;oBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,MAAM,EAAE,OAAO;oBACf,YAAY;oBACZ,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC5C,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,iBAAiB,UAAU,IAAI,QAAQ,KAAK,YAAY,EAAE;yBACjE;qBACF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,MAAuB;QACnD,IAAI,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;YACE,IAAI,EAAE,kBAAkB,MAAM,CAAC,IAAI,EAAE;YACrC,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE,EAAE;SACjB,CACF,CAAC;QAEF,6EAA6E;QAC7E,IAAI,GAAuC,CAAC;QAC5C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,GAAG,GAAG,EAA4B,CAAC;YACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG;YACH,GAAG,EAAE,MAAM,CAAC,GAAG;SAChB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,iCAAiC;QACjC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;QAEtC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAoB;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QAEjG,gDAAgD;QAChD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAE/B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAEpC,mCAAmC;QACnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAE3B,kDAAkD;YAClD,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACjC,IAAI,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;YACL,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAElB,oDAAoD;YACpD,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,kCAAkC;QAClC,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,YAAY,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnE,8BAA8B;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QAExF,kDAAkD;QAClD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAEhC,sBAAsB;QACtB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC1C,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACpC,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @sonoma/mcp-gateway
|
|
3
|
+
*
|
|
4
|
+
* Local MCP Gateway for tool-level visibility and enforcement.
|
|
5
|
+
* Proxies MCP servers and reports telemetry to Sonoma.
|
|
6
|
+
*/
|
|
7
|
+
export { McpGateway } from "./gateway";
|
|
8
|
+
export { loadConfig, findClaudeDesktopConfig, createTestConfig } from "./config";
|
|
9
|
+
export type { GatewayConfig, McpServerConfig, ToolCallEvent, ToolInfo, UpstreamServer, } from "./types";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjF,YAAY,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,QAAQ,EACR,cAAc,GACf,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @sonoma/mcp-gateway
|
|
3
|
+
*
|
|
4
|
+
* Local MCP Gateway for tool-level visibility and enforcement.
|
|
5
|
+
* Proxies MCP servers and reports telemetry to Sonoma.
|
|
6
|
+
*/
|
|
7
|
+
export { McpGateway } from "./gateway";
|
|
8
|
+
export { loadConfig, findClaudeDesktopConfig, createTestConfig } from "./config";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sonoma API client for telemetry and policy
|
|
3
|
+
*
|
|
4
|
+
* Uses OAuth tokens from the auth module for authentication.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolCallEvent } from "./types";
|
|
7
|
+
export interface PolicyResponse {
|
|
8
|
+
mode: "disabled" | "blocklist" | "allowlist";
|
|
9
|
+
gatewayAuthMode: "org_key" | "user_id";
|
|
10
|
+
list: Array<{
|
|
11
|
+
identifier: string;
|
|
12
|
+
type: string;
|
|
13
|
+
status: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export declare class SonomaClient {
|
|
17
|
+
private endpoint;
|
|
18
|
+
private hostname;
|
|
19
|
+
private deviceId;
|
|
20
|
+
private orgApiKey;
|
|
21
|
+
private pendingEvents;
|
|
22
|
+
private flushInterval;
|
|
23
|
+
private debug;
|
|
24
|
+
constructor(options: {
|
|
25
|
+
endpoint: string;
|
|
26
|
+
orgApiKey?: string;
|
|
27
|
+
debug?: boolean;
|
|
28
|
+
});
|
|
29
|
+
private log;
|
|
30
|
+
/**
|
|
31
|
+
* Get auth token - tries OAuth first, falls back to org API key
|
|
32
|
+
*/
|
|
33
|
+
private getToken;
|
|
34
|
+
/**
|
|
35
|
+
* Start periodic telemetry flush
|
|
36
|
+
*/
|
|
37
|
+
startTelemetryFlush(intervalMs?: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Stop periodic telemetry flush
|
|
40
|
+
*/
|
|
41
|
+
stopTelemetryFlush(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Queue an event for telemetry
|
|
44
|
+
*/
|
|
45
|
+
queueEvent(event: ToolCallEvent): void;
|
|
46
|
+
/**
|
|
47
|
+
* Flush all pending events to Sonoma
|
|
48
|
+
*/
|
|
49
|
+
flushTelemetry(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Fetch policy from Sonoma
|
|
52
|
+
*/
|
|
53
|
+
fetchPolicy(): Promise<PolicyResponse>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=sonoma-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sonoma-client.d.ts","sourceRoot":"","sources":["../src/sonoma-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,eAAe,EAAE,SAAS,GAAG,SAAS,CAAC;IACvC,IAAI,EAAE,KAAK,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,KAAK,CAAU;gBAEX,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAQ9E,OAAO,CAAC,GAAG;IAMX;;OAEG;YACW,QAAQ;IActB;;OAEG;IACH,mBAAmB,CAAC,UAAU,SAAQ,GAAG,IAAI;IAc7C;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAO1B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKtC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA6CrC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;CAwB7C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sonoma API client for telemetry and policy
|
|
3
|
+
*
|
|
4
|
+
* Uses OAuth tokens from the auth module for authentication.
|
|
5
|
+
*/
|
|
6
|
+
import { hostname } from "node:os";
|
|
7
|
+
import { getAccessToken, getStoredDeviceId } from "./auth";
|
|
8
|
+
export class SonomaClient {
|
|
9
|
+
endpoint;
|
|
10
|
+
hostname;
|
|
11
|
+
deviceId;
|
|
12
|
+
orgApiKey = null;
|
|
13
|
+
pendingEvents = [];
|
|
14
|
+
flushInterval = null;
|
|
15
|
+
debug;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.endpoint = options.endpoint.replace(/\/$/, "");
|
|
18
|
+
this.hostname = hostname();
|
|
19
|
+
this.deviceId = getStoredDeviceId();
|
|
20
|
+
this.orgApiKey = options.orgApiKey ?? null;
|
|
21
|
+
this.debug = options.debug ?? false;
|
|
22
|
+
}
|
|
23
|
+
log(message, ...args) {
|
|
24
|
+
if (this.debug) {
|
|
25
|
+
console.error(`[sonoma-client] ${message}`, ...args);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get auth token - tries OAuth first, falls back to org API key
|
|
30
|
+
*/
|
|
31
|
+
async getToken() {
|
|
32
|
+
// Try OAuth token first
|
|
33
|
+
try {
|
|
34
|
+
return await getAccessToken({ sonomaEndpoint: this.endpoint, debug: this.debug });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Fall back to org API key if available
|
|
38
|
+
if (this.orgApiKey) {
|
|
39
|
+
this.log("Using org API key (no OAuth token)");
|
|
40
|
+
return this.orgApiKey;
|
|
41
|
+
}
|
|
42
|
+
throw new Error("No authentication available. Run --login or set SONOMA_API_KEY");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Start periodic telemetry flush
|
|
47
|
+
*/
|
|
48
|
+
startTelemetryFlush(intervalMs = 30000) {
|
|
49
|
+
if (this.flushInterval) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.flushInterval = setInterval(() => {
|
|
53
|
+
this.flushTelemetry().catch((err) => {
|
|
54
|
+
this.log("Failed to flush telemetry:", err);
|
|
55
|
+
});
|
|
56
|
+
}, intervalMs);
|
|
57
|
+
this.log(`Started telemetry flush every ${intervalMs}ms`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stop periodic telemetry flush
|
|
61
|
+
*/
|
|
62
|
+
stopTelemetryFlush() {
|
|
63
|
+
if (this.flushInterval) {
|
|
64
|
+
clearInterval(this.flushInterval);
|
|
65
|
+
this.flushInterval = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Queue an event for telemetry
|
|
70
|
+
*/
|
|
71
|
+
queueEvent(event) {
|
|
72
|
+
this.pendingEvents.push(event);
|
|
73
|
+
this.log(`Queued event: ${event.serverName}.${event.toolName}`);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Flush all pending events to Sonoma
|
|
77
|
+
*/
|
|
78
|
+
async flushTelemetry() {
|
|
79
|
+
if (this.pendingEvents.length === 0) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const events = [...this.pendingEvents];
|
|
83
|
+
this.pendingEvents = [];
|
|
84
|
+
try {
|
|
85
|
+
const token = await this.getToken();
|
|
86
|
+
const response = await fetch(`${this.endpoint}/api/mcp-visibility/telemetry`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: {
|
|
89
|
+
"Content-Type": "application/json",
|
|
90
|
+
Authorization: `Bearer ${token}`,
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify({
|
|
93
|
+
hostname: this.hostname,
|
|
94
|
+
deviceId: this.deviceId,
|
|
95
|
+
events: events.map((e) => ({
|
|
96
|
+
serverName: e.serverName,
|
|
97
|
+
toolName: e.toolName,
|
|
98
|
+
timestamp: e.timestamp,
|
|
99
|
+
durationMs: e.durationMs,
|
|
100
|
+
status: e.status,
|
|
101
|
+
errorMessage: e.errorMessage,
|
|
102
|
+
argumentKeys: e.argumentKeys,
|
|
103
|
+
})),
|
|
104
|
+
}),
|
|
105
|
+
});
|
|
106
|
+
if (!response.ok) {
|
|
107
|
+
const text = await response.text();
|
|
108
|
+
throw new Error(`Telemetry failed: ${response.status} ${text}`);
|
|
109
|
+
}
|
|
110
|
+
this.log(`Flushed ${events.length} events to Sonoma`);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// Re-queue events on failure
|
|
114
|
+
this.pendingEvents.unshift(...events);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Fetch policy from Sonoma
|
|
120
|
+
*/
|
|
121
|
+
async fetchPolicy() {
|
|
122
|
+
try {
|
|
123
|
+
const token = await this.getToken();
|
|
124
|
+
const response = await fetch(`${this.endpoint}/api/mcp-visibility/policy`, {
|
|
125
|
+
headers: {
|
|
126
|
+
Authorization: `Bearer ${token}`,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
const text = await response.text();
|
|
131
|
+
throw new Error(`Policy fetch failed: ${response.status} ${text}`);
|
|
132
|
+
}
|
|
133
|
+
const policy = (await response.json());
|
|
134
|
+
this.log(`Fetched policy: mode=${policy.mode}, ${policy.list.length} rules`);
|
|
135
|
+
return policy;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
this.log("Failed to fetch policy:", error);
|
|
139
|
+
// Return disabled policy on failure (fail-open)
|
|
140
|
+
return { mode: "disabled", gatewayAuthMode: "org_key", list: [] };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=sonoma-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sonoma-client.js","sourceRoot":"","sources":["../src/sonoma-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAY3D,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IACjB,QAAQ,CAAS;IACjB,QAAQ,CAAS;IACjB,SAAS,GAAkB,IAAI,CAAC;IAChC,aAAa,GAAoB,EAAE,CAAC;IACpC,aAAa,GAA0C,IAAI,CAAC;IAC5D,KAAK,CAAU;IAEvB,YAAY,OAAkE;QAC5E,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAEO,GAAG,CAAC,OAAe,EAAE,GAAG,IAAe;QAC7C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ;QACpB,wBAAwB;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;YACxC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAC/C,OAAO,IAAI,CAAC,SAAS,CAAC;YACxB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,UAAU,GAAG,KAAK;QACpC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClC,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,IAAI,CAAC,GAAG,CAAC,iCAAiC,UAAU,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAoB;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,+BAA+B,EAAE;gBAC5E,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,KAAK,EAAE;iBACjC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACzB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,YAAY,EAAE,CAAC,CAAC,YAAY;wBAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;qBAC7B,CAAC,CAAC;iBACJ,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,mBAAmB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6BAA6B;YAC7B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,4BAA4B,EAAE;gBACzE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;iBACjC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC3C,gDAAgD;YAChD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;CACF"}
|