@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.
@@ -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"}
@@ -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":"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"}
@@ -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":"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"}