@sonoma-security/mcp-gateway 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/__tests__/plugin-discovery.test.d.ts +12 -0
  2. package/dist/__tests__/plugin-discovery.test.d.ts.map +1 -0
  3. package/dist/__tests__/plugin-discovery.test.js +367 -0
  4. package/dist/__tests__/plugin-discovery.test.js.map +1 -0
  5. package/dist/__tests__/tool-blocking.test.d.ts +2 -0
  6. package/dist/__tests__/tool-blocking.test.d.ts.map +1 -0
  7. package/dist/__tests__/tool-blocking.test.js +256 -0
  8. package/dist/__tests__/tool-blocking.test.js.map +1 -0
  9. package/dist/auth/client.d.ts.map +1 -1
  10. package/dist/auth/client.js +49 -6
  11. package/dist/auth/client.js.map +1 -1
  12. package/dist/auth/keychain.d.ts +34 -0
  13. package/dist/auth/keychain.d.ts.map +1 -0
  14. package/dist/auth/keychain.js +305 -0
  15. package/dist/auth/keychain.js.map +1 -0
  16. package/dist/auth/server.d.ts +15 -3
  17. package/dist/auth/server.d.ts.map +1 -1
  18. package/dist/auth/server.js +110 -23
  19. package/dist/auth/server.js.map +1 -1
  20. package/dist/auth/storage.d.ts +5 -6
  21. package/dist/auth/storage.d.ts.map +1 -1
  22. package/dist/auth/storage.js +72 -21
  23. package/dist/auth/storage.js.map +1 -1
  24. package/dist/auth/upstream-oauth.d.ts +2 -0
  25. package/dist/auth/upstream-oauth.d.ts.map +1 -1
  26. package/dist/auth/upstream-oauth.js +58 -8
  27. package/dist/auth/upstream-oauth.js.map +1 -1
  28. package/dist/auth/upstream-token-store.d.ts +18 -6
  29. package/dist/auth/upstream-token-store.d.ts.map +1 -1
  30. package/dist/auth/upstream-token-store.js +127 -35
  31. package/dist/auth/upstream-token-store.js.map +1 -1
  32. package/dist/cli.js +16 -0
  33. package/dist/cli.js.map +1 -1
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +17 -7
  36. package/dist/config.js.map +1 -1
  37. package/dist/gateway.d.ts +17 -0
  38. package/dist/gateway.d.ts.map +1 -1
  39. package/dist/gateway.js +302 -66
  40. package/dist/gateway.js.map +1 -1
  41. package/dist/http-proxy.d.ts +76 -0
  42. package/dist/http-proxy.d.ts.map +1 -0
  43. package/dist/http-proxy.js +316 -0
  44. package/dist/http-proxy.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/pattern-matcher.d.ts +25 -0
  50. package/dist/pattern-matcher.d.ts.map +1 -1
  51. package/dist/pattern-matcher.js +65 -0
  52. package/dist/pattern-matcher.js.map +1 -1
  53. package/dist/prompt-guard.d.ts +24 -0
  54. package/dist/prompt-guard.d.ts.map +1 -0
  55. package/dist/prompt-guard.js +161 -0
  56. package/dist/prompt-guard.js.map +1 -0
  57. package/dist/sonoma-client.d.ts +28 -1
  58. package/dist/sonoma-client.d.ts.map +1 -1
  59. package/dist/sonoma-client.js +67 -43
  60. package/dist/sonoma-client.js.map +1 -1
  61. package/dist/types.d.ts +6 -0
  62. package/dist/types.d.ts.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Unit tests for discoverClaudeCodePlugins
3
+ *
4
+ * What's REAL:
5
+ * - discoverClaudeCodePlugins business logic
6
+ * - Node.js fs module (real reads from temp directories)
7
+ *
8
+ * What's MOCKED:
9
+ * - homedir() - redirected to a temp directory so tests don't touch ~/.claude
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=plugin-discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-discovery.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/plugin-discovery.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Unit tests for discoverClaudeCodePlugins
3
+ *
4
+ * What's REAL:
5
+ * - discoverClaudeCodePlugins business logic
6
+ * - Node.js fs module (real reads from temp directories)
7
+ *
8
+ * What's MOCKED:
9
+ * - homedir() - redirected to a temp directory so tests don't touch ~/.claude
10
+ */
11
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
12
+ import { writeFileSync, mkdirSync, rmSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ import { tmpdir } from "node:os";
15
+ // Mock os.homedir to point at our temp directory.
16
+ // The real fs calls (readFileSync, existsSync) are NOT mocked - they run against real files.
17
+ vi.mock("node:os", async (importOriginal) => {
18
+ const original = await importOriginal();
19
+ return {
20
+ ...original,
21
+ homedir: vi.fn(() => testHomeDir),
22
+ };
23
+ });
24
+ // testHomeDir is declared here so the mock closure can reference it.
25
+ // It is assigned in beforeEach before any test code runs.
26
+ let testHomeDir;
27
+ // Dynamic import so the vi.mock above is applied before the module resolves.
28
+ const { discoverClaudeCodePlugins } = await import("../config.js");
29
+ describe("discoverClaudeCodePlugins", () => {
30
+ let pluginsDir;
31
+ let pluginsFile;
32
+ beforeEach(() => {
33
+ testHomeDir = join(tmpdir(), `plugin-discovery-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
34
+ pluginsDir = join(testHomeDir, ".claude", "plugins");
35
+ pluginsFile = join(pluginsDir, "installed_plugins.json");
36
+ mkdirSync(pluginsDir, { recursive: true });
37
+ });
38
+ afterEach(() => {
39
+ rmSync(testHomeDir, { recursive: true, force: true });
40
+ });
41
+ // ---------------------------------------------------------------------------
42
+ // Helpers
43
+ // ---------------------------------------------------------------------------
44
+ function writePluginsJson(plugins) {
45
+ writeFileSync(pluginsFile, JSON.stringify({ plugins }));
46
+ }
47
+ function writePluginMcpJson(installPath, content) {
48
+ mkdirSync(installPath, { recursive: true });
49
+ writeFileSync(join(installPath, ".mcp.json"), JSON.stringify(content));
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Basic plugin discovery (no backup)
53
+ // ---------------------------------------------------------------------------
54
+ describe("basic plugin discovery", () => {
55
+ it("returns an empty array when installed_plugins.json does not exist", () => {
56
+ // No file written - pluginsDir exists but installed_plugins.json does not.
57
+ const servers = discoverClaudeCodePlugins();
58
+ expect(servers).toEqual([]);
59
+ });
60
+ it("returns an empty array when installed_plugins.json has no plugins key", () => {
61
+ writeFileSync(pluginsFile, JSON.stringify({}));
62
+ const servers = discoverClaudeCodePlugins();
63
+ expect(servers).toEqual([]);
64
+ });
65
+ it("discovers a server from a plugin with standard mcpServers format", () => {
66
+ const installPath = join(testHomeDir, "plugins", "slack");
67
+ writePluginsJson({ "com.example.slack": [{ installPath }] });
68
+ writePluginMcpJson(installPath, {
69
+ mcpServers: {
70
+ slack: {
71
+ url: "https://slack.com/mcp",
72
+ },
73
+ },
74
+ });
75
+ const servers = discoverClaudeCodePlugins();
76
+ expect(servers).toHaveLength(1);
77
+ expect(servers[0].name).toBe("slack");
78
+ expect(servers[0].url).toBe("https://slack.com/mcp");
79
+ });
80
+ it("discovers a server from a plugin with flat (non-mcpServers) format", () => {
81
+ const installPath = join(testHomeDir, "plugins", "github");
82
+ writePluginsJson({ "com.example.github": [{ installPath }] });
83
+ writePluginMcpJson(installPath, {
84
+ github: {
85
+ url: "https://api.github.com/mcp",
86
+ type: "http",
87
+ },
88
+ });
89
+ const servers = discoverClaudeCodePlugins();
90
+ expect(servers).toHaveLength(1);
91
+ expect(servers[0].name).toBe("github");
92
+ expect(servers[0].url).toBe("https://api.github.com/mcp");
93
+ });
94
+ it("skips plugins that have no .mcp.json file", () => {
95
+ const installPath = join(testHomeDir, "plugins", "no-mcp");
96
+ mkdirSync(installPath, { recursive: true });
97
+ // Intentionally do NOT write a .mcp.json
98
+ writePluginsJson({ "com.example.no-mcp": [{ installPath }] });
99
+ const servers = discoverClaudeCodePlugins();
100
+ expect(servers).toEqual([]);
101
+ });
102
+ it("skips installations with no installPath", () => {
103
+ writePluginsJson({ "com.example.bad": [{}] });
104
+ const servers = discoverClaudeCodePlugins();
105
+ expect(servers).toEqual([]);
106
+ });
107
+ });
108
+ // ---------------------------------------------------------------------------
109
+ // Backup restoration (_sonomaBackup / _sonomaGatewayed)
110
+ // ---------------------------------------------------------------------------
111
+ describe("backup restoration", () => {
112
+ it("uses the backup config when _sonomaGatewayed flag is present", () => {
113
+ const installPath = join(testHomeDir, "plugins", "slack-rewritten");
114
+ writePluginsJson({ "com.example.slack": [{ installPath }] });
115
+ writePluginMcpJson(installPath, {
116
+ mcpServers: {
117
+ slack: {
118
+ // Rewritten by enforce.sh to point at the local gateway proxy
119
+ url: "http://localhost:19880/proxy/slack/mcp",
120
+ },
121
+ },
122
+ _sonomaBackup: {
123
+ slack: {
124
+ // Original upstream URL stored by enforce.sh
125
+ url: "https://slack.com/mcp",
126
+ _sonomaGatewayed: "1",
127
+ },
128
+ },
129
+ });
130
+ const servers = discoverClaudeCodePlugins();
131
+ expect(servers).toHaveLength(1);
132
+ expect(servers[0].name).toBe("slack");
133
+ // Must use the original upstream URL, not the proxy URL
134
+ expect(servers[0].url).toBe("https://slack.com/mcp");
135
+ });
136
+ it("uses the rewritten (current) entry when backup exists but has no _sonomaGatewayed flag", () => {
137
+ const installPath = join(testHomeDir, "plugins", "partial-backup");
138
+ writePluginsJson({ "com.example.partial": [{ installPath }] });
139
+ writePluginMcpJson(installPath, {
140
+ mcpServers: {
141
+ myserver: {
142
+ url: "https://rewritten.example.com/mcp",
143
+ },
144
+ },
145
+ _sonomaBackup: {
146
+ myserver: {
147
+ url: "https://original.example.com/mcp",
148
+ // No _sonomaGatewayed flag - enforce.sh did not rewrite this entry
149
+ },
150
+ },
151
+ });
152
+ const servers = discoverClaudeCodePlugins();
153
+ expect(servers).toHaveLength(1);
154
+ // Without the flag, fall through to the current (rewritten) entry
155
+ expect(servers[0].url).toBe("https://rewritten.example.com/mcp");
156
+ });
157
+ });
158
+ // ---------------------------------------------------------------------------
159
+ // OAuth config preservation
160
+ // ---------------------------------------------------------------------------
161
+ describe("OAuth config preservation", () => {
162
+ it("preserves oauth config from the backup entry", () => {
163
+ const installPath = join(testHomeDir, "plugins", "oauth-plugin");
164
+ writePluginsJson({ "com.example.oauth": [{ installPath }] });
165
+ writePluginMcpJson(installPath, {
166
+ mcpServers: {
167
+ linear: {
168
+ // Proxy URL written by enforce.sh
169
+ url: "http://localhost:19880/proxy/linear/mcp",
170
+ },
171
+ },
172
+ _sonomaBackup: {
173
+ linear: {
174
+ url: "https://linear.app/mcp",
175
+ oauth: {
176
+ clientId: "my-client-id",
177
+ callbackPort: 9000,
178
+ },
179
+ _sonomaGatewayed: "1",
180
+ },
181
+ },
182
+ });
183
+ const servers = discoverClaudeCodePlugins();
184
+ expect(servers).toHaveLength(1);
185
+ expect(servers[0].name).toBe("linear");
186
+ expect(servers[0].url).toBe("https://linear.app/mcp");
187
+ expect(servers[0].oauth).toEqual({ clientId: "my-client-id", callbackPort: 9000 });
188
+ });
189
+ it("preserves oauth config from a non-rewritten entry", () => {
190
+ const installPath = join(testHomeDir, "plugins", "oauth-direct");
191
+ writePluginsJson({ "com.example.direct": [{ installPath }] });
192
+ writePluginMcpJson(installPath, {
193
+ mcpServers: {
194
+ notion: {
195
+ url: "https://notion.so/mcp",
196
+ oauth: {
197
+ clientId: "notion-client",
198
+ callbackPort: 8080,
199
+ },
200
+ },
201
+ },
202
+ });
203
+ const servers = discoverClaudeCodePlugins();
204
+ expect(servers).toHaveLength(1);
205
+ expect(servers[0].oauth).toEqual({ clientId: "notion-client", callbackPort: 8080 });
206
+ });
207
+ it("preserves oauth clientId when callbackPort is omitted", () => {
208
+ const installPath = join(testHomeDir, "plugins", "oauth-no-port");
209
+ writePluginsJson({ "com.example.noport": [{ installPath }] });
210
+ writePluginMcpJson(installPath, {
211
+ _sonomaBackup: {
212
+ svc: {
213
+ url: "https://svc.example.com/mcp",
214
+ oauth: { clientId: "just-an-id" },
215
+ _sonomaGatewayed: "1",
216
+ },
217
+ },
218
+ mcpServers: {
219
+ svc: { url: "http://localhost:19880/proxy/svc/mcp" },
220
+ },
221
+ });
222
+ const servers = discoverClaudeCodePlugins();
223
+ expect(servers[0].oauth).toEqual({ clientId: "just-an-id" });
224
+ expect(servers[0].oauth?.callbackPort).toBeUndefined();
225
+ });
226
+ });
227
+ // ---------------------------------------------------------------------------
228
+ // Mixed plugins (some rewritten, some not)
229
+ // ---------------------------------------------------------------------------
230
+ describe("mixed plugins", () => {
231
+ it("handles a mix of rewritten and non-rewritten plugin servers correctly", () => {
232
+ const slackPath = join(testHomeDir, "plugins", "slack");
233
+ const githubPath = join(testHomeDir, "plugins", "github");
234
+ writePluginsJson({
235
+ "com.example.slack": [{ installPath: slackPath }],
236
+ "com.example.github": [{ installPath: githubPath }],
237
+ });
238
+ // Slack was rewritten by enforce.sh
239
+ writePluginMcpJson(slackPath, {
240
+ mcpServers: {
241
+ slack: { url: "http://localhost:19880/proxy/slack/mcp" },
242
+ },
243
+ _sonomaBackup: {
244
+ slack: {
245
+ url: "https://slack.com/mcp",
246
+ _sonomaGatewayed: "1",
247
+ },
248
+ },
249
+ });
250
+ // GitHub was not rewritten
251
+ writePluginMcpJson(githubPath, {
252
+ mcpServers: {
253
+ github: { url: "https://api.github.com/mcp" },
254
+ },
255
+ });
256
+ const servers = discoverClaudeCodePlugins();
257
+ expect(servers).toHaveLength(2);
258
+ const slack = servers.find((s) => s.name === "slack");
259
+ expect(slack?.url).toBe("https://slack.com/mcp");
260
+ const github = servers.find((s) => s.name === "github");
261
+ expect(github?.url).toBe("https://api.github.com/mcp");
262
+ });
263
+ it("discovers multiple servers from a single plugin .mcp.json", () => {
264
+ const installPath = join(testHomeDir, "plugins", "multi");
265
+ writePluginsJson({ "com.example.multi": [{ installPath }] });
266
+ writePluginMcpJson(installPath, {
267
+ mcpServers: {
268
+ serverA: { url: "https://a.example.com/mcp" },
269
+ serverB: { url: "https://b.example.com/mcp" },
270
+ },
271
+ });
272
+ const servers = discoverClaudeCodePlugins();
273
+ expect(servers).toHaveLength(2);
274
+ expect(servers.map((s) => s.name).sort()).toEqual(["serverA", "serverB"]);
275
+ });
276
+ });
277
+ // ---------------------------------------------------------------------------
278
+ // Disabled servers
279
+ // ---------------------------------------------------------------------------
280
+ describe("disabled servers", () => {
281
+ it("skips servers with disabled: true even when they have a backup", () => {
282
+ const installPath = join(testHomeDir, "plugins", "disabled-plugin");
283
+ writePluginsJson({ "com.example.disabled": [{ installPath }] });
284
+ writePluginMcpJson(installPath, {
285
+ mcpServers: {
286
+ disabledServer: {
287
+ url: "http://localhost:19880/proxy/disabledServer/mcp",
288
+ disabled: true,
289
+ },
290
+ },
291
+ _sonomaBackup: {
292
+ disabledServer: {
293
+ url: "https://real.example.com/mcp",
294
+ _sonomaGatewayed: "1",
295
+ },
296
+ },
297
+ });
298
+ const servers = discoverClaudeCodePlugins();
299
+ expect(servers).toEqual([]);
300
+ });
301
+ it("skips servers with disabled: true when there is no backup", () => {
302
+ const installPath = join(testHomeDir, "plugins", "disabled-no-backup");
303
+ writePluginsJson({ "com.example.disabled2": [{ installPath }] });
304
+ writePluginMcpJson(installPath, {
305
+ mcpServers: {
306
+ gone: {
307
+ url: "https://example.com/mcp",
308
+ disabled: true,
309
+ },
310
+ },
311
+ });
312
+ const servers = discoverClaudeCodePlugins();
313
+ expect(servers).toEqual([]);
314
+ });
315
+ it("only skips the disabled server when a plugin contains both enabled and disabled servers", () => {
316
+ const installPath = join(testHomeDir, "plugins", "mixed-disabled");
317
+ writePluginsJson({ "com.example.mixed-disabled": [{ installPath }] });
318
+ writePluginMcpJson(installPath, {
319
+ mcpServers: {
320
+ active: { url: "https://active.example.com/mcp" },
321
+ inactive: { url: "https://inactive.example.com/mcp", disabled: true },
322
+ },
323
+ });
324
+ const servers = discoverClaudeCodePlugins();
325
+ expect(servers).toHaveLength(1);
326
+ expect(servers[0].name).toBe("active");
327
+ });
328
+ });
329
+ // ---------------------------------------------------------------------------
330
+ // Error resilience
331
+ // ---------------------------------------------------------------------------
332
+ describe("error resilience", () => {
333
+ it("returns an empty array when installed_plugins.json contains invalid JSON", () => {
334
+ writeFileSync(pluginsFile, "{ not valid json }");
335
+ const servers = discoverClaudeCodePlugins();
336
+ expect(servers).toEqual([]);
337
+ });
338
+ it("skips a plugin whose .mcp.json contains invalid JSON and continues with others", () => {
339
+ const badPath = join(testHomeDir, "plugins", "bad-json");
340
+ const goodPath = join(testHomeDir, "plugins", "good");
341
+ writePluginsJson({
342
+ "com.example.bad": [{ installPath: badPath }],
343
+ "com.example.good": [{ installPath: goodPath }],
344
+ });
345
+ mkdirSync(badPath, { recursive: true });
346
+ writeFileSync(join(badPath, ".mcp.json"), "{ broken");
347
+ writePluginMcpJson(goodPath, {
348
+ mcpServers: { fine: { url: "https://fine.example.com/mcp" } },
349
+ });
350
+ const servers = discoverClaudeCodePlugins();
351
+ expect(servers).toHaveLength(1);
352
+ expect(servers[0].name).toBe("fine");
353
+ });
354
+ it("skips servers that have neither command nor url", () => {
355
+ const installPath = join(testHomeDir, "plugins", "no-transport");
356
+ writePluginsJson({ "com.example.no-transport": [{ installPath }] });
357
+ writePluginMcpJson(installPath, {
358
+ mcpServers: {
359
+ empty: { env: { SOME_VAR: "value" } },
360
+ },
361
+ });
362
+ const servers = discoverClaudeCodePlugins();
363
+ expect(servers).toEqual([]);
364
+ });
365
+ });
366
+ });
367
+ //# sourceMappingURL=plugin-discovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-discovery.test.js","sourceRoot":"","sources":["../../src/__tests__/plugin-discovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-blocking.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-blocking.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tool-blocking.test.ts"],"names":[],"mappings":""}