@thantos66/claude-context-mcp 0.2.0 → 0.3.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.
Files changed (41) hide show
  1. package/README.md +12 -1
  2. package/dist/index.js +6 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/proxy.d.ts +4 -0
  5. package/dist/proxy.js +1 -1
  6. package/dist/proxy.js.map +1 -1
  7. package/dist/services/agents.d.ts +7 -1
  8. package/dist/services/agents.js +6 -4
  9. package/dist/services/agents.js.map +1 -1
  10. package/dist/services/hooks.d.ts +29 -0
  11. package/dist/services/hooks.js +68 -0
  12. package/dist/services/hooks.js.map +1 -0
  13. package/dist/services/mcp-config.d.ts +6 -0
  14. package/dist/services/mcp-config.js +10 -9
  15. package/dist/services/mcp-config.js.map +1 -1
  16. package/dist/services/paths.d.ts +12 -4
  17. package/dist/services/paths.js +8 -8
  18. package/dist/services/paths.js.map +1 -1
  19. package/dist/services/permissions.d.ts +9 -1
  20. package/dist/services/permissions.js +9 -9
  21. package/dist/services/permissions.js.map +1 -1
  22. package/dist/services/skills.d.ts +8 -1
  23. package/dist/services/skills.js +7 -4
  24. package/dist/services/skills.js.map +1 -1
  25. package/dist/tools/agents.js +53 -1
  26. package/dist/tools/agents.js.map +1 -1
  27. package/dist/tools/export.d.ts +2 -0
  28. package/dist/tools/export.js +64 -0
  29. package/dist/tools/export.js.map +1 -0
  30. package/dist/tools/hooks.d.ts +2 -0
  31. package/dist/tools/hooks.js +51 -0
  32. package/dist/tools/hooks.js.map +1 -0
  33. package/dist/tools/mcp.js +168 -2
  34. package/dist/tools/mcp.js.map +1 -1
  35. package/dist/tools/meta.js +191 -27
  36. package/dist/tools/meta.js.map +1 -1
  37. package/dist/tools/permissions.js +8 -1
  38. package/dist/tools/permissions.js.map +1 -1
  39. package/dist/tools/skills.js +51 -1
  40. package/dist/tools/skills.js.map +1 -1
  41. package/package.json +1 -1
package/dist/tools/mcp.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { z } from "zod";
2
+ import fs from "node:fs/promises";
3
+ import { execSync, spawn } from "node:child_process";
2
4
  import { listServers, getServer, addServer, updateServer, removeServer, setServerDisabled, } from "../services/mcp-config.js";
3
5
  import { StdioServerSchema, HttpServerSchema, } from "../schemas/mcp-config.js";
4
6
  import { handle, okResponse, formatWriteResult } from "./helpers.js";
@@ -9,6 +11,10 @@ const ProjectPathField = {
9
11
  .string()
10
12
  .optional()
11
13
  .describe("Absolute path to the project. Required when scope=project."),
14
+ allowOutsideHome: z
15
+ .boolean()
16
+ .optional()
17
+ .describe("Allow projectPath outside $HOME (for cloud environments)."),
12
18
  };
13
19
  const DryRunField = {
14
20
  dryRun: z
@@ -37,7 +43,7 @@ export function registerMcpTools(server) {
37
43
  idempotentHint: true,
38
44
  openWorldHint: false,
39
45
  },
40
- }, async ({ scope, projectPath, revealSecrets }) => {
46
+ }, async ({ scope, projectPath, revealSecrets, allowOutsideHome }) => {
41
47
  return handle(async () => {
42
48
  const scopes = scope
43
49
  ? [scope]
@@ -50,6 +56,7 @@ export function registerMcpTools(server) {
50
56
  const list = await listServers(s, {
51
57
  projectPath,
52
58
  revealSecrets,
59
+ allowOutsideHome,
53
60
  });
54
61
  all.push(...list);
55
62
  }
@@ -88,7 +95,7 @@ export function registerMcpTools(server) {
88
95
  idempotentHint: true,
89
96
  openWorldHint: false,
90
97
  },
91
- }, async ({ scope, name, projectPath, revealSecrets }) => handle(() => getServer({ scope, name, projectPath, revealSecrets }), (entry) => entry
98
+ }, async ({ scope, name, projectPath, revealSecrets, allowOutsideHome }) => handle(() => getServer({ scope, name, projectPath, revealSecrets, allowOutsideHome }), (entry) => entry
92
99
  ? okResponse(`[${entry.scope}] ${entry.name}\n path: ${entry.path}\n entry: ${JSON.stringify(entry.entry, null, 2)}`, { server: entry })
93
100
  : okResponse(`Server "${name}" not found in scope ${scope}.`, {
94
101
  found: false,
@@ -141,6 +148,7 @@ export function registerMcpTools(server) {
141
148
  projectPath: args.projectPath,
142
149
  overwrite: args.overwrite,
143
150
  dryRun: args.dryRun,
151
+ allowOutsideHome: args.allowOutsideHome,
144
152
  });
145
153
  }, (result) => {
146
154
  const restart = args.scope === "desktop" && !result.dryRun;
@@ -191,6 +199,7 @@ export function registerMcpTools(server) {
191
199
  patch: patch,
192
200
  projectPath: args.projectPath,
193
201
  dryRun: args.dryRun,
202
+ allowOutsideHome: args.allowOutsideHome,
194
203
  });
195
204
  }, (result) => {
196
205
  const restart = args.scope === "desktop" && !result.dryRun;
@@ -219,6 +228,7 @@ export function registerMcpTools(server) {
219
228
  name: args.name,
220
229
  projectPath: args.projectPath,
221
230
  dryRun: args.dryRun,
231
+ allowOutsideHome: args.allowOutsideHome,
222
232
  }), (result) => {
223
233
  const restart = args.scope === "desktop" && !result.dryRun;
224
234
  return okResponse(formatWriteResult(result, `remove server "${args.name}" from`, restart), { result, restartRequired: restart });
@@ -248,10 +258,166 @@ export function registerMcpTools(server) {
248
258
  disabled: args.disabled,
249
259
  projectPath: args.projectPath,
250
260
  dryRun: args.dryRun,
261
+ allowOutsideHome: args.allowOutsideHome,
251
262
  }), (result) => {
252
263
  const restart = args.scope === "desktop" && !result.dryRun;
253
264
  const verb = args.disabled ? "disable" : "enable";
254
265
  return okResponse(formatWriteResult(result, `${verb} server "${args.name}" in`, restart), { result, restartRequired: restart });
255
266
  }));
267
+ // ------------------------------------------------------------------
268
+ // mcp_evaluate_conditions
269
+ // ------------------------------------------------------------------
270
+ server.registerTool("mcp_evaluate_conditions", {
271
+ title: "Evaluate server conditions",
272
+ description: "Check _condition passthrough fields on MCP servers and optionally " +
273
+ "toggle their disabled flags. Conditions: fileExists, envSet, commandExists.",
274
+ inputSchema: {
275
+ scope: ScopeSchema,
276
+ ...ProjectPathField,
277
+ allowOutsideHome: z.boolean().optional(),
278
+ apply: z
279
+ .boolean()
280
+ .optional()
281
+ .describe("If true, actually toggle disabled flags. Default: false (dry-run report)."),
282
+ ...DryRunField,
283
+ },
284
+ annotations: {
285
+ readOnlyHint: false,
286
+ destructiveHint: false,
287
+ idempotentHint: true,
288
+ openWorldHint: true,
289
+ },
290
+ }, async (args) => handle(async () => {
291
+ const servers = await listServers(args.scope, {
292
+ projectPath: args.projectPath,
293
+ revealSecrets: false,
294
+ });
295
+ const results = [];
296
+ for (const srv of servers) {
297
+ const entry = srv.entry;
298
+ const condition = entry._condition;
299
+ if (!condition) {
300
+ results.push({ name: srv.name, condition: null, met: true, action: "no-change" });
301
+ continue;
302
+ }
303
+ let met = true;
304
+ if (typeof condition.fileExists === "string") {
305
+ try {
306
+ await fs.access(condition.fileExists);
307
+ }
308
+ catch {
309
+ met = false;
310
+ }
311
+ }
312
+ if (typeof condition.envSet === "string") {
313
+ const val = process.env[condition.envSet];
314
+ if (!val || val.trim() === "")
315
+ met = false;
316
+ }
317
+ if (typeof condition.commandExists === "string") {
318
+ try {
319
+ execSync(`which ${condition.commandExists}`, { stdio: "ignore" });
320
+ }
321
+ catch {
322
+ met = false;
323
+ }
324
+ }
325
+ const currentlyDisabled = !!(entry.disabled);
326
+ const shouldDisable = !met;
327
+ let action = "no-change";
328
+ if (shouldDisable && !currentlyDisabled)
329
+ action = "disable";
330
+ else if (!shouldDisable && currentlyDisabled)
331
+ action = "enable";
332
+ if (args.apply && action !== "no-change") {
333
+ await setServerDisabled({
334
+ scope: args.scope,
335
+ name: srv.name,
336
+ disabled: shouldDisable,
337
+ projectPath: args.projectPath,
338
+ });
339
+ }
340
+ results.push({ name: srv.name, condition, met, action });
341
+ }
342
+ return results;
343
+ }, (results) => okResponse(results.length === 0
344
+ ? "No servers found."
345
+ : results
346
+ .map((r) => `${r.name}: condition=${r.condition ? JSON.stringify(r.condition) : "none"} met=${r.met} action=${r.action}`)
347
+ .join("\n"), { results })));
348
+ // ------------------------------------------------------------------
349
+ // mcp_run_setup
350
+ // ------------------------------------------------------------------
351
+ server.registerTool("mcp_run_setup", {
352
+ title: "Run server setup command",
353
+ description: "Execute the _setup shell command defined on an MCP server entry. " +
354
+ "Returns stdout, stderr, and exit code.",
355
+ inputSchema: {
356
+ scope: ScopeSchema,
357
+ name: z.string().min(1),
358
+ ...ProjectPathField,
359
+ allowOutsideHome: z.boolean().optional(),
360
+ timeoutMs: z.number().optional().describe("Timeout in ms (default 60000)."),
361
+ },
362
+ annotations: {
363
+ readOnlyHint: false,
364
+ destructiveHint: true,
365
+ idempotentHint: false,
366
+ openWorldHint: true,
367
+ },
368
+ }, async (args) => handle(async () => {
369
+ const entry = await getServer({
370
+ scope: args.scope,
371
+ name: args.name,
372
+ projectPath: args.projectPath,
373
+ revealSecrets: true,
374
+ });
375
+ if (!entry) {
376
+ throw new Error(`Server "${args.name}" not found in scope ${args.scope}.`);
377
+ }
378
+ const raw = entry.entry;
379
+ const setupCmd = raw._setup;
380
+ if (typeof setupCmd !== "string" || !setupCmd.trim()) {
381
+ throw new Error(`Server "${args.name}" has no _setup field. Add a _setup string to the server entry.`);
382
+ }
383
+ const timeout = args.timeoutMs ?? 60000;
384
+ return await runSetupCommand(setupCmd, timeout);
385
+ }, (result) => okResponse(`command: ${result.command}\nexit code: ${result.exitCode}\n\n--- stdout ---\n${result.stdout}\n\n--- stderr ---\n${result.stderr}`, result)));
386
+ }
387
+ /** Spawn a shell command, collect output, enforce timeout. */
388
+ function runSetupCommand(command, timeoutMs) {
389
+ return new Promise((resolve, reject) => {
390
+ const child = spawn(command, { shell: true, stdio: ["ignore", "pipe", "pipe"] });
391
+ let stdout = "";
392
+ let stderr = "";
393
+ let settled = false;
394
+ const timer = setTimeout(() => {
395
+ if (!settled) {
396
+ settled = true;
397
+ child.kill("SIGTERM");
398
+ resolve({ command, exitCode: -1, stdout, stderr: stderr + "\n[timeout after " + timeoutMs + "ms]" });
399
+ }
400
+ }, timeoutMs);
401
+ child.stdout.on("data", (chunk) => {
402
+ stdout += chunk.toString();
403
+ });
404
+ child.stderr.on("data", (chunk) => {
405
+ stderr += chunk.toString();
406
+ });
407
+ child.on("error", (err) => {
408
+ if (!settled) {
409
+ settled = true;
410
+ clearTimeout(timer);
411
+ reject(new Error(`Failed to run setup command: ${err.message}`));
412
+ }
413
+ });
414
+ child.on("exit", (code) => {
415
+ if (!settled) {
416
+ settled = true;
417
+ clearTimeout(timer);
418
+ resolve({ command, exitCode: code ?? -1, stdout, stderr });
419
+ }
420
+ });
421
+ });
256
422
  }
257
423
  //# sourceMappingURL=mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/tools/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3D,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAExC,MAAM,gBAAgB,GAAG;IACvB,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4DAA4D,CAAC;CAC1E,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;CACxF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,qEAAqE;IACrE,mBAAmB;IACnB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,sEAAsE;YACtE,mEAAmE;QACrE,WAAW,EAAE;YACX,KAAK,EAAE,WAAW;iBACf,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,GAAG,gBAAgB;YACnB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SACtC;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,EAAE;QAC9C,OAAO,MAAM,CACX,KAAK,IAAI,EAAE;YACT,MAAM,MAAM,GAA0C,KAAK;gBACzD,CAAC,CAAC,CAAC,KAAK,CAAC;gBACT,CAAC,CAAC,WAAW;oBACX,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;oBAChC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,CAAC,EAAE;wBAChC,WAAW;wBACX,aAAa;qBACd,CAAC,CAAC;oBACH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,8CAA8C;oBAC9C,GAAG,CAAC,IAAI,CAAC;wBACP,KAAK,EAAE,CAAC;wBACR,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,EAAE;wBACR,KAAK,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAA+B;qBACtE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CACV,UAAU,CACR,OAAO,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,OAAO;iBACJ,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CACnF;iBACA,IAAI,CAAC,MAAM,CAAC,EACnB,EAAE,OAAO,EAAE,OAAO,EAAE,CACrB,CACJ,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,iBAAiB;IACjB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE;YACX,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,GAAG,gBAAgB;YACnB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SACtC;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,EAAE,CACpD,MAAM,CACJ,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,EAC5D,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;QACH,CAAC,CAAC,UAAU,CACR,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EACzG,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB;QACH,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,wBAAwB,KAAK,GAAG,EAAE;YAC1D,KAAK,EAAE,KAAK;SACb,CAAC,CACT,CACJ,CAAC;IAEF,qEAAqE;IACrE,iBAAiB;IACjB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,4EAA4E;YAC5E,wFAAwF;QAC1F,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,KAAK,CAAC,kBAAkB,EAAE,oDAAoD,CAAC;YAClF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YAChC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACxC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YACjC,GAAG,gBAAgB;YACnB,GAAG,WAAW;SACf;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,OAAO,MAAM,CACX,KAAK,IAAI,EAAE;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG;gBACpB,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC;oBACrB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;iBAC/C,CAAC;gBACJ,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC;oBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACrC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;oBAClC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;iBACnC,CAAC,CAAC;YACP,OAAO,SAAS,CAAC;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK;gBACL,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC,EACD,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3D,OAAO,UAAU,CACf,iBAAiB,CAAC,MAAM,EAAE,eAAe,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,CAAC,EAClE,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CACrC,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,oBAAoB;IACpB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,8FAA8F;QAChG,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YAChC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACxC,GAAG,gBAAgB;YACnB,GAAG,WAAW;SACf;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,MAAM,CACJ,GAAG,EAAE;QACH,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACjD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACjD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACjD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7D,OAAO,YAAY,CAAC;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,KAAgC;YACvC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC,EACD,CAAC,MAAM,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3D,OAAO,UAAU,CACf,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,CAAC,EACrE,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CACrC,CAAC;IACJ,CAAC,CACF,CACJ,CAAC;IAEF,qEAAqE;IACrE,oBAAoB;IACpB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,GAAG,gBAAgB;YACnB,GAAG,WAAW;SACf;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,MAAM,CACJ,GAAG,EAAE,CAAC,YAAY,CAAC;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,EACF,CAAC,MAAM,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3D,OAAO,UAAU,CACf,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,IAAI,CAAC,IAAI,QAAQ,EAAE,OAAO,CAAC,EACvE,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CACrC,CAAC;IACJ,CAAC,CACF,CACJ,CAAC;IAEF,qEAAqE;IACrE,mBAAmB;IACnB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,gFAAgF;QAClF,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;YACrB,GAAG,gBAAgB;YACnB,GAAG,WAAW;SACf;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,MAAM,CACJ,GAAG,EAAE,CAAC,iBAAiB,CAAC;QACtB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,EACF,CAAC,MAAM,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClD,OAAO,UAAU,CACf,iBAAiB,CAAC,MAAM,EAAE,GAAG,IAAI,YAAY,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,CAAC,EACtE,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CACrC,CAAC;IACJ,CAAC,CACF,CACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/tools/mcp.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,12 @@ import { z } from "zod";
2
2
  import fs from "node:fs/promises";
3
3
  import { spawn } from "node:child_process";
4
4
  import { allPlatformPaths } from "../services/paths.js";
5
- import { loadMcpConfig } from "../services/mcp-config.js";
5
+ import { loadMcpConfig, listServers } from "../services/mcp-config.js";
6
6
  import { loadSettings } from "../services/permissions.js";
7
7
  import { backupFile } from "../services/backup.js";
8
8
  import { getServer } from "../services/mcp-config.js";
9
9
  import { isStdioServer } from "../schemas/mcp-config.js";
10
+ import { schemaHasUnion } from "../proxy.js";
10
11
  import { handle, okResponse } from "./helpers.js";
11
12
  export function registerMetaTools(server) {
12
13
  // ------------------------------------------------------------------
@@ -18,6 +19,7 @@ export function registerMetaTools(server) {
18
19
  "current OS, for each scope (and an optional project path).",
19
20
  inputSchema: {
20
21
  projectPath: z.string().optional(),
22
+ allowOutsideHome: z.boolean().optional().describe("Allow projectPath outside $HOME (for cloud environments)."),
21
23
  },
22
24
  annotations: {
23
25
  readOnlyHint: true,
@@ -25,7 +27,7 @@ export function registerMetaTools(server) {
25
27
  idempotentHint: true,
26
28
  openWorldHint: false,
27
29
  },
28
- }, async ({ projectPath }) => {
30
+ }, async ({ projectPath, allowOutsideHome: _allowOutsideHome }) => {
29
31
  const paths = allPlatformPaths(projectPath);
30
32
  return okResponse(JSON.stringify(paths, null, 2), paths);
31
33
  });
@@ -92,7 +94,10 @@ export function registerMetaTools(server) {
92
94
  command: z.string().optional().describe("Command to spawn directly (alternative to scope+name)."),
93
95
  args: z.array(z.string()).optional(),
94
96
  projectPath: z.string().optional(),
97
+ allowOutsideHome: z.boolean().optional().describe("Allow projectPath outside $HOME (for cloud environments)."),
95
98
  timeoutMs: z.number().optional().describe("Timeout in ms (default 10000)."),
99
+ validateSchemas: z.boolean().optional().describe("Also send tools/list and check for oneOf/anyOf/allOf."),
100
+ checkAll: z.boolean().optional().describe("Check all servers in the given scope. Ignores name/command."),
96
101
  },
97
102
  annotations: {
98
103
  readOnlyHint: true,
@@ -101,6 +106,28 @@ export function registerMetaTools(server) {
101
106
  openWorldHint: true,
102
107
  },
103
108
  }, async (input) => handle(async () => {
109
+ // Batch mode: check all servers in scope
110
+ if (input.checkAll) {
111
+ const scopes = input.scope ? [input.scope] : ["desktop", "user", "project"];
112
+ const results = [];
113
+ for (const s of scopes) {
114
+ try {
115
+ const servers = await listServers(s, { projectPath: input.projectPath });
116
+ for (const srv of servers) {
117
+ if (!isStdioServer(srv.entry)) {
118
+ results.push({ name: srv.name, scope: s, status: "skip", message: "HTTP server" });
119
+ continue;
120
+ }
121
+ const r = await checkServerHealth(srv.entry.command, srv.entry.args ?? [], srv.entry.env, input.timeoutMs ?? 10000, input.validateSchemas);
122
+ results.push({ name: srv.name, scope: s, ...r });
123
+ }
124
+ }
125
+ catch {
126
+ continue;
127
+ }
128
+ }
129
+ return { status: "batch", servers: results, total: results.length };
130
+ }
104
131
  let cmd;
105
132
  let cmdArgs = [];
106
133
  let env;
@@ -114,6 +141,7 @@ export function registerMetaTools(server) {
114
141
  name: input.name,
115
142
  projectPath: input.projectPath,
116
143
  revealSecrets: true,
144
+ allowOutsideHome: input.allowOutsideHome,
117
145
  });
118
146
  if (!entry) {
119
147
  return { status: "not_found", message: `Server "${input.name}" not found in ${input.scope} scope.` };
@@ -129,7 +157,7 @@ export function registerMetaTools(server) {
129
157
  throw new Error("Provide either (scope + name) or (command + args).");
130
158
  }
131
159
  const timeout = input.timeoutMs ?? 10000;
132
- return await checkServerHealth(cmd, cmdArgs, env, timeout);
160
+ return await checkServerHealth(cmd, cmdArgs, env, timeout, input.validateSchemas);
133
161
  }, (result) => okResponse(`status: ${result.status}\n${result.message ?? ""}`, result)));
134
162
  // ------------------------------------------------------------------
135
163
  // meta_env_template
@@ -229,6 +257,99 @@ export function registerMetaTools(server) {
229
257
  : `${issues.length} of ${parsed.length} key(s) need attention: ${issues.join(", ")}`,
230
258
  };
231
259
  }, (result) => okResponse(result.message ?? JSON.stringify(result), result)));
260
+ // ------------------------------------------------------------------
261
+ // meta_apply_template
262
+ // ------------------------------------------------------------------
263
+ server.registerTool("meta_apply_template", {
264
+ title: "Apply template with secrets",
265
+ description: "Read a template file, substitute ${VAR_NAME} placeholders from a .env file, " +
266
+ "and write the output. Useful for generating .mcp.json from a committed template + secrets.",
267
+ inputSchema: {
268
+ templatePath: z.string().describe("Path to template file (e.g., .mcp.json.template)."),
269
+ envPath: z.string().describe("Path to .env file with secret values."),
270
+ outputPath: z.string().optional().describe("Output path. Defaults to templatePath without .template suffix."),
271
+ dryRun: z.boolean().optional(),
272
+ },
273
+ annotations: {
274
+ readOnlyHint: false,
275
+ destructiveHint: false,
276
+ idempotentHint: true,
277
+ openWorldHint: false,
278
+ },
279
+ }, async (args) => handle(async () => {
280
+ const template = await fs.readFile(args.templatePath, "utf8");
281
+ const envContent = await fs.readFile(args.envPath, "utf8");
282
+ const envVars = parseEnvFile(envContent);
283
+ const envMap = new Map(envVars.map((e) => [e.key, e.value]));
284
+ const resolved = [];
285
+ const unresolved = [];
286
+ const output = template.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (_match, name) => {
287
+ const val = envMap.get(name);
288
+ if (val && val.trim()) {
289
+ resolved.push(name);
290
+ return val;
291
+ }
292
+ unresolved.push(name);
293
+ return _match;
294
+ });
295
+ JSON.parse(output); // validate JSON
296
+ const outPath = args.outputPath ?? args.templatePath.replace(/\.template$/, "");
297
+ if (!args.dryRun) {
298
+ await fs.writeFile(outPath, output);
299
+ }
300
+ return { outputPath: outPath, resolved, unresolved, dryRun: args.dryRun ?? false };
301
+ }, (r) => okResponse(`Template applied: ${r.resolved.length} vars resolved, ${r.unresolved.length} unresolved. Output: ${r.outputPath}`, r)));
302
+ // ------------------------------------------------------------------
303
+ // meta_list_server_tools
304
+ // ------------------------------------------------------------------
305
+ server.registerTool("meta_list_server_tools", {
306
+ title: "List tools from an MCP server",
307
+ description: "Spawn a stdio MCP server, send initialize + tools/list, and return " +
308
+ "the tool names and schema health. For debugging which server has bad schemas.",
309
+ inputSchema: {
310
+ scope: z.enum(["desktop", "user", "project"]).optional(),
311
+ name: z.string().optional().describe("Server name to look up in config."),
312
+ command: z.string().optional().describe("Command to spawn directly."),
313
+ args: z.array(z.string()).optional(),
314
+ projectPath: z.string().optional(),
315
+ timeoutMs: z.number().optional().describe("Timeout in ms (default 10000)."),
316
+ },
317
+ annotations: {
318
+ readOnlyHint: true,
319
+ destructiveHint: false,
320
+ idempotentHint: true,
321
+ openWorldHint: true,
322
+ },
323
+ }, async (input) => handle(async () => {
324
+ let cmd;
325
+ let cmdArgs = [];
326
+ let env;
327
+ if (input.command) {
328
+ cmd = input.command;
329
+ cmdArgs = input.args ?? [];
330
+ }
331
+ else if (input.scope && input.name) {
332
+ const entry = await getServer({
333
+ scope: input.scope,
334
+ name: input.name,
335
+ projectPath: input.projectPath,
336
+ revealSecrets: true,
337
+ });
338
+ if (!entry) {
339
+ return { status: "not_found", tools: [], totalTools: 0, problematicTools: 0 };
340
+ }
341
+ if (!isStdioServer(entry.entry)) {
342
+ return { status: "skip", message: "HTTP server", tools: [], totalTools: 0, problematicTools: 0 };
343
+ }
344
+ cmd = entry.entry.command;
345
+ cmdArgs = entry.entry.args ?? [];
346
+ env = entry.entry.env;
347
+ }
348
+ else {
349
+ throw new Error("Provide either (scope + name) or (command + args).");
350
+ }
351
+ return await checkServerHealth(cmd, cmdArgs, env, input.timeoutMs ?? 10000, true);
352
+ }, (r) => okResponse(`status: ${r.status}\n${r.message ?? ""}\n${r.schemaIssues ? `Schema issues: ${JSON.stringify(r.schemaIssues)}` : ""}`, r)));
232
353
  }
233
354
  // ── Helpers ──────────────────────────────────────────────────────────
234
355
  function parseEnvFile(content) {
@@ -247,7 +368,7 @@ function parseEnvFile(content) {
247
368
  }
248
369
  return results;
249
370
  }
250
- function checkServerHealth(command, args, env, timeoutMs) {
371
+ function checkServerHealth(command, args, env, timeoutMs, validateSchemas) {
251
372
  return new Promise((resolve) => {
252
373
  const childEnv = env ? { ...process.env, ...env } : process.env;
253
374
  let child;
@@ -267,50 +388,93 @@ function checkServerHealth(command, args, env, timeoutMs) {
267
388
  let stdout = "";
268
389
  let stderr = "";
269
390
  let settled = false;
391
+ let phase = "init";
270
392
  const timer = setTimeout(() => {
271
393
  if (!settled) {
272
394
  settled = true;
273
395
  child.kill("SIGTERM");
274
396
  resolve({
275
397
  status: "timeout",
276
- message: `Server did not respond within ${timeoutMs}ms.`,
398
+ message: `Server did not respond within ${timeoutMs}ms (phase: ${phase}).`,
277
399
  stderr: stderr.slice(0, 500),
278
400
  });
279
401
  }
280
402
  }, timeoutMs);
281
- child.stdout.on("data", (chunk) => {
282
- stdout += chunk.toString();
283
- // Check if we got a valid JSON-RPC response
284
- if (!settled && stdout.includes('"result"')) {
403
+ function finish(result) {
404
+ if (!settled) {
285
405
  settled = true;
286
406
  clearTimeout(timer);
287
407
  child.kill("SIGTERM");
288
- resolve({ status: "ok", message: "Server responded to initialize." });
408
+ resolve(result);
409
+ }
410
+ }
411
+ child.stdout.on("data", (chunk) => {
412
+ stdout += chunk.toString();
413
+ // Try to parse complete JSON-RPC responses (newline-delimited)
414
+ const lines = stdout.split("\n");
415
+ for (const line of lines) {
416
+ if (!line.trim())
417
+ continue;
418
+ let msg;
419
+ try {
420
+ msg = JSON.parse(line);
421
+ }
422
+ catch {
423
+ continue;
424
+ }
425
+ if (phase === "init" && msg.result) {
426
+ if (validateSchemas) {
427
+ // Move to tools/list phase
428
+ phase = "tools";
429
+ stdout = "";
430
+ const toolsRequest = JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/list" });
431
+ child.stdin.write(toolsRequest + "\n");
432
+ }
433
+ else {
434
+ finish({ status: "ok", message: "Server responded to initialize." });
435
+ }
436
+ return;
437
+ }
438
+ if (phase === "tools" && msg.result) {
439
+ const result = msg.result;
440
+ if (Array.isArray(result.tools)) {
441
+ const tools = result.tools;
442
+ const schemaIssues = [];
443
+ for (const tool of tools) {
444
+ if (tool.inputSchema && schemaHasUnion(tool.inputSchema)) {
445
+ const keywords = [];
446
+ const schema = tool.inputSchema;
447
+ if (schema.oneOf)
448
+ keywords.push("oneOf");
449
+ if (schema.anyOf)
450
+ keywords.push("anyOf");
451
+ if (schema.allOf)
452
+ keywords.push("allOf");
453
+ schemaIssues.push({ tool: tool.name ?? "unknown", keywords });
454
+ }
455
+ }
456
+ finish({
457
+ status: "ok",
458
+ message: `Server responded. ${tools.length} tools, ${schemaIssues.length} with schema issues.`,
459
+ totalTools: tools.length,
460
+ schemaIssues: schemaIssues.length > 0 ? schemaIssues : undefined,
461
+ });
462
+ }
463
+ else {
464
+ finish({ status: "ok", message: "Server responded but tools/list had no tools array." });
465
+ }
466
+ return;
467
+ }
289
468
  }
290
469
  });
291
470
  child.stderr.on("data", (chunk) => {
292
471
  stderr += chunk.toString();
293
472
  });
294
473
  child.on("error", (err) => {
295
- if (!settled) {
296
- settled = true;
297
- clearTimeout(timer);
298
- resolve({
299
- status: "failed",
300
- message: `Spawn error: ${err.message}`,
301
- });
302
- }
474
+ finish({ status: "failed", message: `Spawn error: ${err.message}` });
303
475
  });
304
476
  child.on("exit", (code) => {
305
- if (!settled) {
306
- settled = true;
307
- clearTimeout(timer);
308
- resolve({
309
- status: "failed",
310
- message: `Server exited with code ${code} before responding.`,
311
- stderr: stderr.slice(0, 500),
312
- });
313
- }
477
+ finish({ status: "failed", message: `Server exited with code ${code} before responding.`, stderr: stderr.slice(0, 500) });
314
478
  });
315
479
  // Send an initialize request
316
480
  const initRequest = JSON.stringify({