@darkiceinteractive/mcp-conductor 1.1.0 → 3.0.0-beta.1

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 (293) hide show
  1. package/README.md +35 -5
  2. package/dist/bin/cli.d.ts +20 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +260 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bridge/http-server.d.ts +65 -1
  7. package/dist/bridge/http-server.d.ts.map +1 -1
  8. package/dist/bridge/http-server.js +192 -7
  9. package/dist/bridge/http-server.js.map +1 -1
  10. package/dist/bridge/index.d.ts +1 -0
  11. package/dist/bridge/index.d.ts.map +1 -1
  12. package/dist/bridge/index.js +1 -0
  13. package/dist/bridge/index.js.map +1 -1
  14. package/dist/bridge/pool.d.ts +95 -0
  15. package/dist/bridge/pool.d.ts.map +1 -0
  16. package/dist/bridge/pool.js +384 -0
  17. package/dist/bridge/pool.js.map +1 -0
  18. package/dist/bridge/session-registry.d.ts +64 -0
  19. package/dist/bridge/session-registry.d.ts.map +1 -0
  20. package/dist/bridge/session-registry.js +124 -0
  21. package/dist/bridge/session-registry.js.map +1 -0
  22. package/dist/cache/cache.d.ts +43 -0
  23. package/dist/cache/cache.d.ts.map +1 -0
  24. package/dist/cache/cache.js +167 -0
  25. package/dist/cache/cache.js.map +1 -0
  26. package/dist/cache/delta.d.ts +32 -0
  27. package/dist/cache/delta.d.ts.map +1 -0
  28. package/dist/cache/delta.js +131 -0
  29. package/dist/cache/delta.js.map +1 -0
  30. package/dist/cache/disk.d.ts +65 -0
  31. package/dist/cache/disk.d.ts.map +1 -0
  32. package/dist/cache/disk.js +238 -0
  33. package/dist/cache/disk.js.map +1 -0
  34. package/dist/cache/index.d.ts +53 -0
  35. package/dist/cache/index.d.ts.map +1 -0
  36. package/dist/cache/index.js +12 -0
  37. package/dist/cache/index.js.map +1 -0
  38. package/dist/cache/key.d.ts +44 -0
  39. package/dist/cache/key.d.ts.map +1 -0
  40. package/dist/cache/key.js +83 -0
  41. package/dist/cache/key.js.map +1 -0
  42. package/dist/cache/lru.d.ts +57 -0
  43. package/dist/cache/lru.d.ts.map +1 -0
  44. package/dist/cache/lru.js +112 -0
  45. package/dist/cache/lru.js.map +1 -0
  46. package/dist/cache/policy.d.ts +34 -0
  47. package/dist/cache/policy.d.ts.map +1 -0
  48. package/dist/cache/policy.js +95 -0
  49. package/dist/cache/policy.js.map +1 -0
  50. package/dist/cli/commands/doctor.d.ts +33 -0
  51. package/dist/cli/commands/doctor.d.ts.map +1 -0
  52. package/dist/cli/commands/doctor.js +135 -0
  53. package/dist/cli/commands/doctor.js.map +1 -0
  54. package/dist/cli/commands/export-servers.d.ts +22 -0
  55. package/dist/cli/commands/export-servers.d.ts.map +1 -0
  56. package/dist/cli/commands/export-servers.js +45 -0
  57. package/dist/cli/commands/export-servers.js.map +1 -0
  58. package/dist/cli/commands/import-servers.d.ts +57 -0
  59. package/dist/cli/commands/import-servers.d.ts.map +1 -0
  60. package/dist/cli/commands/import-servers.js +137 -0
  61. package/dist/cli/commands/import-servers.js.map +1 -0
  62. package/dist/cli/commands/routing.d.ts +34 -0
  63. package/dist/cli/commands/routing.d.ts.map +1 -0
  64. package/dist/cli/commands/routing.js +60 -0
  65. package/dist/cli/commands/routing.js.map +1 -0
  66. package/dist/cli/commands/test-server.d.ts +34 -0
  67. package/dist/cli/commands/test-server.d.ts.map +1 -0
  68. package/dist/cli/commands/test-server.js +86 -0
  69. package/dist/cli/commands/test-server.js.map +1 -0
  70. package/dist/cli/daemon.d.ts +60 -0
  71. package/dist/cli/daemon.d.ts.map +1 -0
  72. package/dist/cli/daemon.js +244 -0
  73. package/dist/cli/daemon.js.map +1 -0
  74. package/dist/cli/replay.d.ts +16 -0
  75. package/dist/cli/replay.d.ts.map +1 -0
  76. package/dist/cli/replay.js +89 -0
  77. package/dist/cli/replay.js.map +1 -0
  78. package/dist/cli/wizard/setup.d.ts +12 -0
  79. package/dist/cli/wizard/setup.d.ts.map +1 -0
  80. package/dist/cli/wizard/setup.js +71 -0
  81. package/dist/cli/wizard/setup.js.map +1 -0
  82. package/dist/config/defaults.d.ts +10 -0
  83. package/dist/config/defaults.d.ts.map +1 -1
  84. package/dist/config/defaults.js +14 -1
  85. package/dist/config/defaults.js.map +1 -1
  86. package/dist/config/schema.d.ts +34 -0
  87. package/dist/config/schema.d.ts.map +1 -1
  88. package/dist/daemon/client.d.ts +97 -0
  89. package/dist/daemon/client.d.ts.map +1 -0
  90. package/dist/daemon/client.js +279 -0
  91. package/dist/daemon/client.js.map +1 -0
  92. package/dist/daemon/discovery.d.ts +50 -0
  93. package/dist/daemon/discovery.d.ts.map +1 -0
  94. package/dist/daemon/discovery.js +104 -0
  95. package/dist/daemon/discovery.js.map +1 -0
  96. package/dist/daemon/index.d.ts +16 -0
  97. package/dist/daemon/index.d.ts.map +1 -0
  98. package/dist/daemon/index.js +11 -0
  99. package/dist/daemon/index.js.map +1 -0
  100. package/dist/daemon/sandbox-api.d.ts +45 -0
  101. package/dist/daemon/sandbox-api.d.ts.map +1 -0
  102. package/dist/daemon/sandbox-api.js +74 -0
  103. package/dist/daemon/sandbox-api.js.map +1 -0
  104. package/dist/daemon/server.d.ts +65 -0
  105. package/dist/daemon/server.d.ts.map +1 -0
  106. package/dist/daemon/server.js +351 -0
  107. package/dist/daemon/server.js.map +1 -0
  108. package/dist/daemon/shared-kv.d.ts +81 -0
  109. package/dist/daemon/shared-kv.d.ts.map +1 -0
  110. package/dist/daemon/shared-kv.js +215 -0
  111. package/dist/daemon/shared-kv.js.map +1 -0
  112. package/dist/daemon/shared-lock.d.ts +71 -0
  113. package/dist/daemon/shared-lock.d.ts.map +1 -0
  114. package/dist/daemon/shared-lock.js +119 -0
  115. package/dist/daemon/shared-lock.js.map +1 -0
  116. package/dist/hub/mcp-hub.d.ts +23 -0
  117. package/dist/hub/mcp-hub.d.ts.map +1 -1
  118. package/dist/hub/mcp-hub.js +34 -1
  119. package/dist/hub/mcp-hub.js.map +1 -1
  120. package/dist/index.js +19 -0
  121. package/dist/index.js.map +1 -1
  122. package/dist/observability/anomaly.d.ts +67 -0
  123. package/dist/observability/anomaly.d.ts.map +1 -0
  124. package/dist/observability/anomaly.js +141 -0
  125. package/dist/observability/anomaly.js.map +1 -0
  126. package/dist/observability/cost-predictor.d.ts +49 -0
  127. package/dist/observability/cost-predictor.d.ts.map +1 -0
  128. package/dist/observability/cost-predictor.js +145 -0
  129. package/dist/observability/cost-predictor.js.map +1 -0
  130. package/dist/observability/hot-path.d.ts +49 -0
  131. package/dist/observability/hot-path.d.ts.map +1 -0
  132. package/dist/observability/hot-path.js +125 -0
  133. package/dist/observability/hot-path.js.map +1 -0
  134. package/dist/observability/index.d.ts +10 -0
  135. package/dist/observability/index.d.ts.map +1 -0
  136. package/dist/observability/index.js +10 -0
  137. package/dist/observability/index.js.map +1 -0
  138. package/dist/observability/replay.d.ts +104 -0
  139. package/dist/observability/replay.d.ts.map +1 -0
  140. package/dist/observability/replay.js +239 -0
  141. package/dist/observability/replay.js.map +1 -0
  142. package/dist/registry/built-in-recommendations.d.ts +54 -0
  143. package/dist/registry/built-in-recommendations.d.ts.map +1 -0
  144. package/dist/registry/built-in-recommendations.js +65 -0
  145. package/dist/registry/built-in-recommendations.js.map +1 -0
  146. package/dist/registry/events.d.ts +26 -0
  147. package/dist/registry/events.d.ts.map +1 -0
  148. package/dist/registry/events.js +22 -0
  149. package/dist/registry/events.js.map +1 -0
  150. package/dist/registry/index.d.ts +159 -0
  151. package/dist/registry/index.d.ts.map +1 -0
  152. package/dist/registry/index.js +12 -0
  153. package/dist/registry/index.js.map +1 -0
  154. package/dist/registry/registry.d.ts +87 -0
  155. package/dist/registry/registry.d.ts.map +1 -0
  156. package/dist/registry/registry.js +294 -0
  157. package/dist/registry/registry.js.map +1 -0
  158. package/dist/registry/snapshot.d.ts +42 -0
  159. package/dist/registry/snapshot.d.ts.map +1 -0
  160. package/dist/registry/snapshot.js +71 -0
  161. package/dist/registry/snapshot.js.map +1 -0
  162. package/dist/registry/typegen.d.ts +48 -0
  163. package/dist/registry/typegen.d.ts.map +1 -0
  164. package/dist/registry/typegen.js +200 -0
  165. package/dist/registry/typegen.js.map +1 -0
  166. package/dist/registry/validator.d.ts +23 -0
  167. package/dist/registry/validator.d.ts.map +1 -0
  168. package/dist/registry/validator.js +50 -0
  169. package/dist/registry/validator.js.map +1 -0
  170. package/dist/reliability/breaker.d.ts +57 -0
  171. package/dist/reliability/breaker.d.ts.map +1 -0
  172. package/dist/reliability/breaker.js +130 -0
  173. package/dist/reliability/breaker.js.map +1 -0
  174. package/dist/reliability/errors.d.ts +78 -0
  175. package/dist/reliability/errors.d.ts.map +1 -0
  176. package/dist/reliability/errors.js +160 -0
  177. package/dist/reliability/errors.js.map +1 -0
  178. package/dist/reliability/gateway.d.ts +88 -0
  179. package/dist/reliability/gateway.d.ts.map +1 -0
  180. package/dist/reliability/gateway.js +180 -0
  181. package/dist/reliability/gateway.js.map +1 -0
  182. package/dist/reliability/index.d.ts +20 -0
  183. package/dist/reliability/index.d.ts.map +1 -0
  184. package/dist/reliability/index.js +16 -0
  185. package/dist/reliability/index.js.map +1 -0
  186. package/dist/reliability/profile.d.ts +49 -0
  187. package/dist/reliability/profile.d.ts.map +1 -0
  188. package/dist/reliability/profile.js +58 -0
  189. package/dist/reliability/profile.js.map +1 -0
  190. package/dist/reliability/retry.d.ts +39 -0
  191. package/dist/reliability/retry.d.ts.map +1 -0
  192. package/dist/reliability/retry.js +51 -0
  193. package/dist/reliability/retry.js.map +1 -0
  194. package/dist/reliability/timeout.d.ts +34 -0
  195. package/dist/reliability/timeout.d.ts.map +1 -0
  196. package/dist/reliability/timeout.js +53 -0
  197. package/dist/reliability/timeout.js.map +1 -0
  198. package/dist/runtime/executor.d.ts +12 -0
  199. package/dist/runtime/executor.d.ts.map +1 -1
  200. package/dist/runtime/executor.js +148 -16
  201. package/dist/runtime/executor.js.map +1 -1
  202. package/dist/runtime/findtool/embed.d.ts +28 -0
  203. package/dist/runtime/findtool/embed.d.ts.map +1 -0
  204. package/dist/runtime/findtool/embed.js +85 -0
  205. package/dist/runtime/findtool/embed.js.map +1 -0
  206. package/dist/runtime/findtool/index.d.ts +52 -0
  207. package/dist/runtime/findtool/index.d.ts.map +1 -0
  208. package/dist/runtime/findtool/index.js +78 -0
  209. package/dist/runtime/findtool/index.js.map +1 -0
  210. package/dist/runtime/findtool/vector-index.d.ts +53 -0
  211. package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
  212. package/dist/runtime/findtool/vector-index.js +71 -0
  213. package/dist/runtime/findtool/vector-index.js.map +1 -0
  214. package/dist/runtime/helpers/budget.d.ts +27 -0
  215. package/dist/runtime/helpers/budget.d.ts.map +1 -0
  216. package/dist/runtime/helpers/budget.js +103 -0
  217. package/dist/runtime/helpers/budget.js.map +1 -0
  218. package/dist/runtime/helpers/compact.d.ts +32 -0
  219. package/dist/runtime/helpers/compact.d.ts.map +1 -0
  220. package/dist/runtime/helpers/compact.js +93 -0
  221. package/dist/runtime/helpers/compact.js.map +1 -0
  222. package/dist/runtime/helpers/delta.d.ts +45 -0
  223. package/dist/runtime/helpers/delta.d.ts.map +1 -0
  224. package/dist/runtime/helpers/delta.js +116 -0
  225. package/dist/runtime/helpers/delta.js.map +1 -0
  226. package/dist/runtime/helpers/index.d.ts +16 -0
  227. package/dist/runtime/helpers/index.d.ts.map +1 -0
  228. package/dist/runtime/helpers/index.js +13 -0
  229. package/dist/runtime/helpers/index.js.map +1 -0
  230. package/dist/runtime/helpers/summarize.d.ts +24 -0
  231. package/dist/runtime/helpers/summarize.d.ts.map +1 -0
  232. package/dist/runtime/helpers/summarize.js +124 -0
  233. package/dist/runtime/helpers/summarize.js.map +1 -0
  234. package/dist/runtime/helpers/worker-preload.d.ts +25 -0
  235. package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
  236. package/dist/runtime/helpers/worker-preload.js +223 -0
  237. package/dist/runtime/helpers/worker-preload.js.map +1 -0
  238. package/dist/runtime/index.d.ts +1 -0
  239. package/dist/runtime/index.d.ts.map +1 -1
  240. package/dist/runtime/index.js +1 -0
  241. package/dist/runtime/index.js.map +1 -1
  242. package/dist/runtime/pool/index.d.ts +11 -0
  243. package/dist/runtime/pool/index.d.ts.map +1 -0
  244. package/dist/runtime/pool/index.js +8 -0
  245. package/dist/runtime/pool/index.js.map +1 -0
  246. package/dist/runtime/pool/recycle.d.ts +44 -0
  247. package/dist/runtime/pool/recycle.d.ts.map +1 -0
  248. package/dist/runtime/pool/recycle.js +50 -0
  249. package/dist/runtime/pool/recycle.js.map +1 -0
  250. package/dist/runtime/pool/worker-pool.d.ts +77 -0
  251. package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
  252. package/dist/runtime/pool/worker-pool.js +216 -0
  253. package/dist/runtime/pool/worker-pool.js.map +1 -0
  254. package/dist/runtime/pool/worker.d.ts +80 -0
  255. package/dist/runtime/pool/worker.d.ts.map +1 -0
  256. package/dist/runtime/pool/worker.js +324 -0
  257. package/dist/runtime/pool/worker.js.map +1 -0
  258. package/dist/server/mcp-server.d.ts +6 -0
  259. package/dist/server/mcp-server.d.ts.map +1 -1
  260. package/dist/server/mcp-server.js +610 -45
  261. package/dist/server/mcp-server.js.map +1 -1
  262. package/dist/server/passthrough-registrar.d.ts +73 -0
  263. package/dist/server/passthrough-registrar.d.ts.map +1 -0
  264. package/dist/server/passthrough-registrar.js +110 -0
  265. package/dist/server/passthrough-registrar.js.map +1 -0
  266. package/dist/skills/skills-engine.d.ts +9 -1
  267. package/dist/skills/skills-engine.d.ts.map +1 -1
  268. package/dist/skills/skills-engine.js +20 -3
  269. package/dist/skills/skills-engine.js.map +1 -1
  270. package/dist/utils/index.d.ts +3 -0
  271. package/dist/utils/index.d.ts.map +1 -1
  272. package/dist/utils/index.js +3 -0
  273. package/dist/utils/index.js.map +1 -1
  274. package/dist/utils/logger.d.ts.map +1 -1
  275. package/dist/utils/logger.js +5 -1
  276. package/dist/utils/logger.js.map +1 -1
  277. package/dist/utils/orphan-watch.d.ts +34 -0
  278. package/dist/utils/orphan-watch.d.ts.map +1 -0
  279. package/dist/utils/orphan-watch.js +54 -0
  280. package/dist/utils/orphan-watch.js.map +1 -0
  281. package/dist/utils/redact.d.ts +15 -0
  282. package/dist/utils/redact.d.ts.map +1 -0
  283. package/dist/utils/redact.js +48 -0
  284. package/dist/utils/redact.js.map +1 -0
  285. package/dist/utils/tokenize.d.ts +55 -0
  286. package/dist/utils/tokenize.d.ts.map +1 -0
  287. package/dist/utils/tokenize.js +205 -0
  288. package/dist/utils/tokenize.js.map +1 -0
  289. package/dist/version.d.ts +3 -3
  290. package/dist/version.d.ts.map +1 -1
  291. package/dist/version.js +3 -3
  292. package/dist/version.js.map +1 -1
  293. package/package.json +13 -3
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # MCP Conductor
2
2
 
3
- **97% fewer tokens. Parallel execution. One `npx` command.**
3
+ **99.7% fewer tokens. Parallel execution. One `npx` command.**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@darkiceinteractive/mcp-conductor.svg?style=flat)](https://www.npmjs.com/package/@darkiceinteractive/mcp-conductor)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/@darkiceinteractive/mcp-conductor.svg?style=flat)](https://www.npmjs.com/package/@darkiceinteractive/mcp-conductor)
@@ -11,11 +11,32 @@
11
11
  MCP Conductor is a single MCP server that orchestrates all your other MCP servers through a sandboxed Deno runtime. Instead of Claude making direct tool calls (and dumping every intermediate result into your context window), Claude writes TypeScript code that runs in an isolated sandbox. Only the final result comes back.
12
12
 
13
13
  ```
14
- Before: 45,000 tokens → Claude context window → 45,000 tokens billed
15
- After: 45,000 tokens → Deno sandbox → 800 tokens → Claude context window
14
+ Before: 153,900 tokens → Claude context window → 153,900 tokens billed
15
+ After: 153,900 tokens → Deno sandbox → 435 tokens → Claude context window
16
16
  ```
17
17
 
18
- **Average measured reduction: 94.3%. Peak: 97.8%.**
18
+ **Average measured reduction: 99.7%. Verified against Anthropic's published benchmarks.**
19
+
20
+ ---
21
+
22
+ ## What's New in v3 (beta)
23
+
24
+ v3 is a ground-up registry-driven architecture. Every backend tool is described, validated, and type-generated at startup. New workstreams add production-grade reliability, caching, observability, and multi-agent coordination.
25
+
26
+ | Workstream | Feature | Docs |
27
+ |---|---|---|
28
+ | Phase 1 | Tool Registry — schema validation, hot-reload, type generation | [architecture](./docs/v3/architecture.md) |
29
+ | Phase 2 | Response cache — LRU + CBOR serialisation, TTL per tool | [configuration](./docs/v3/configuration.md) |
30
+ | Phase 3 | Reliability gateway — timeout, retry, circuit breaker | [architecture](./docs/v3/architecture.md) |
31
+ | Phase 4 | Connection pool + warm sandbox pool | [configuration](./docs/v3/configuration.md) |
32
+ | Phase 5 | Sandbox API — `compact`, `summarize`, `findTool`, `budget` | [sandbox-api](./docs/v3/sandbox-api.md) |
33
+ | Phase 6 | Daemon mode, shared KV store, distributed lock | [configuration](./docs/v3/configuration.md) |
34
+ | Phase 7 | Structured observability, session replay | [architecture](./docs/v3/architecture.md) |
35
+ | X1 | Passthrough adapter — expose backend tools directly | [recipes](./docs/v3/recipes.md) |
36
+ | X2 | Lifecycle tools, CLI wizard | [sandbox-api](./docs/v3/sandbox-api.md) |
37
+ | X4 | PII tokenisation, response redaction | [configuration](./docs/v3/configuration.md) |
38
+
39
+ Migrating from v2? See the [migration guide](./docs/v3/migration.md).
19
40
 
20
41
  ---
21
42
 
@@ -161,13 +182,22 @@ Inside `execute_code`, you have access to the `mcp` object:
161
182
  // Call a server tool
162
183
  const result = await mcp.server('github').call('list_issues', { owner: 'org', repo: 'repo' });
163
184
 
164
- // Parallel execution — executes all calls simultaneously
185
+ // Parallel execution — executes all calls simultaneously.
186
+ // Two call shapes are supported:
187
+ //
188
+ // 1. Callback form (composable, no rate-limit detection):
165
189
  const [issues, files, searches] = await mcp.batch([
166
190
  () => mcp.server('github').call('list_issues', { owner: 'org', repo: 'repo' }),
167
191
  () => mcp.server('filesystem').call('list_directory', { path: '/src' }),
168
192
  () => mcp.server('brave-search').call('search', { q: 'topic', count: 5 })
169
193
  ]);
170
194
 
195
+ // 2. Descriptor form (rate-limit aware, retries on 429s):
196
+ const [a, b] = await mcp.batch([
197
+ { server: 'github', tool: 'list_issues', params: { owner: 'org', repo: 'repo' } },
198
+ { server: 'filesystem', tool: 'list_directory', params: { path: '/src' } },
199
+ ]);
200
+
171
201
  // Batch web searches (handles rate limits automatically)
172
202
  const results = await mcp.batchSearch(['query 1', 'query 2', 'query 3'], { topN: 3 });
173
203
 
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Conductor CLI — interactive wizard and server management commands.
4
+ *
5
+ * Entry point for the `mcp-conductor-cli` binary.
6
+ * Subcommands:
7
+ * setup — interactive wizard (imports from Claude configs)
8
+ * add — add a server to conductor config
9
+ * list — list configured servers
10
+ * test — transient connect + list tools
11
+ * routing — show/apply routing recommendations
12
+ * doctor — health check all servers
13
+ * import — non-interactive import from Claude configs
14
+ * export — generate mcpServers JSON for Claude rollback
15
+ * daemon — start|stop|status|logs (wired to Phase 6 module)
16
+ *
17
+ * @module bin/cli
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Conductor CLI — interactive wizard and server management commands.
4
+ *
5
+ * Entry point for the `mcp-conductor-cli` binary.
6
+ * Subcommands:
7
+ * setup — interactive wizard (imports from Claude configs)
8
+ * add — add a server to conductor config
9
+ * list — list configured servers
10
+ * test — transient connect + list tools
11
+ * routing — show/apply routing recommendations
12
+ * doctor — health check all servers
13
+ * import — non-interactive import from Claude configs
14
+ * export — generate mcpServers JSON for Claude rollback
15
+ * daemon — start|stop|status|logs (wired to Phase 6 module)
16
+ *
17
+ * @module bin/cli
18
+ */
19
+ import { Command } from 'commander';
20
+ import pc from 'picocolors';
21
+ import { runSetupWizard } from '../cli/wizard/setup.js';
22
+ import { importServers, formatImportResults } from '../cli/commands/import-servers.js';
23
+ import { exportToClaude } from '../cli/commands/export-servers.js';
24
+ import { testServer } from '../cli/commands/test-server.js';
25
+ import { getRoutingRecommendations } from '../cli/commands/routing.js';
26
+ import { runDoctor, formatDoctorResults } from '../cli/commands/doctor.js';
27
+ import { loadConductorConfig, saveConductorConfig, getDefaultConductorConfigPath, } from '../config/index.js';
28
+ import { registerDaemonCommands } from '../cli/daemon.js';
29
+ import { VERSION } from '../version.js';
30
+ const program = new Command();
31
+ program
32
+ .name('mcp-conductor-cli')
33
+ .description('MCP Conductor — server lifecycle management CLI')
34
+ .version(VERSION);
35
+ // ----------------------------------------------------------------
36
+ // setup — interactive wizard
37
+ // ----------------------------------------------------------------
38
+ program
39
+ .command('setup')
40
+ .description('Interactive wizard: detect Claude configs, import servers, verify health')
41
+ .action(async () => {
42
+ try {
43
+ await runSetupWizard();
44
+ }
45
+ catch (err) {
46
+ console.error(pc.red(`Setup failed: ${String(err)}`));
47
+ process.exit(1);
48
+ }
49
+ });
50
+ // ----------------------------------------------------------------
51
+ // add — add a server
52
+ // ----------------------------------------------------------------
53
+ program
54
+ .command('add <name> <command> [args...]')
55
+ .description('Add an MCP server to the conductor config')
56
+ .option('-e, --env <pairs...>', 'Environment variables as KEY=VALUE pairs')
57
+ .action((name, command, args, opts) => {
58
+ try {
59
+ const env = {};
60
+ for (const pair of opts.env ?? []) {
61
+ const [k, ...rest] = pair.split('=');
62
+ if (k)
63
+ env[k] = rest.join('=');
64
+ }
65
+ let config = loadConductorConfig() ?? { exclusive: false, servers: {} };
66
+ if (config.servers[name]) {
67
+ console.error(pc.red(`Server '${name}' already exists. Remove it first with: mcp-conductor-cli remove ${name}`));
68
+ process.exit(1);
69
+ }
70
+ config.servers[name] = { command, args, env };
71
+ const result = saveConductorConfig(config, getDefaultConductorConfigPath());
72
+ if (result.success) {
73
+ console.log(pc.green(`Added server '${name}' — config saved to ${result.path}`));
74
+ }
75
+ else {
76
+ console.error(pc.red(`Failed to save config: ${result.error}`));
77
+ process.exit(1);
78
+ }
79
+ }
80
+ catch (err) {
81
+ console.error(pc.red(`Add failed: ${String(err)}`));
82
+ process.exit(1);
83
+ }
84
+ });
85
+ // ----------------------------------------------------------------
86
+ // list — list configured servers
87
+ // ----------------------------------------------------------------
88
+ program
89
+ .command('list')
90
+ .description('List all servers in the conductor config')
91
+ .action(() => {
92
+ try {
93
+ const config = loadConductorConfig();
94
+ if (!config) {
95
+ console.log(pc.yellow('No conductor config found. Run `mcp-conductor-cli setup` first.'));
96
+ return;
97
+ }
98
+ const names = Object.keys(config.servers);
99
+ if (names.length === 0) {
100
+ console.log(pc.dim('No servers configured.'));
101
+ return;
102
+ }
103
+ console.log(pc.bold(`\nConfigured servers (${names.length}):\n`));
104
+ for (const [name, def] of Object.entries(config.servers)) {
105
+ console.log(` ${pc.cyan(name)}`);
106
+ console.log(` command: ${def.command}${(def.args ?? []).length ? ' ' + def.args.join(' ') : ''}`);
107
+ if (Object.keys(def.env ?? {}).length > 0) {
108
+ const envKeys = Object.keys(def.env).join(', ');
109
+ console.log(` env: ${envKeys}`);
110
+ }
111
+ }
112
+ console.log('');
113
+ }
114
+ catch (err) {
115
+ console.error(pc.red(`List failed: ${String(err)}`));
116
+ process.exit(1);
117
+ }
118
+ });
119
+ // ----------------------------------------------------------------
120
+ // test — transient connect + list tools
121
+ // ----------------------------------------------------------------
122
+ program
123
+ .command('test <name>')
124
+ .description('Transiently connect to a server, list its tools and measure latency')
125
+ .option('--timeout <ms>', 'Connection timeout in milliseconds', '15000')
126
+ .action(async (name, opts) => {
127
+ try {
128
+ console.log(pc.dim(`Testing server '${name}'...`));
129
+ const result = await testServer({
130
+ name,
131
+ timeoutMs: parseInt(opts.timeout ?? '15000', 10),
132
+ });
133
+ if (result.success) {
134
+ console.log(pc.green(`\n[OK] ${result.serverName}`));
135
+ console.log(` Latency: ${result.latencyMs}ms`);
136
+ console.log(` Tools: ${result.toolCount}`);
137
+ if (result.tools.length > 0) {
138
+ for (const t of result.tools.slice(0, 20)) {
139
+ console.log(` • ${t.name}: ${t.description.slice(0, 80)}`);
140
+ }
141
+ if (result.tools.length > 20) {
142
+ console.log(` ... and ${result.tools.length - 20} more`);
143
+ }
144
+ }
145
+ }
146
+ else {
147
+ console.log(pc.red(`\n[FAIL] ${result.serverName}`));
148
+ console.log(` Error: ${result.error}`);
149
+ process.exit(1);
150
+ }
151
+ }
152
+ catch (err) {
153
+ console.error(pc.red(`Test failed: ${String(err)}`));
154
+ process.exit(1);
155
+ }
156
+ });
157
+ // ----------------------------------------------------------------
158
+ // routing — routing recommendations
159
+ // ----------------------------------------------------------------
160
+ program
161
+ .command('routing [name]')
162
+ .description('Show routing recommendations for a server (or all servers)')
163
+ .option('--apply', 'Write routing hints to conductor config')
164
+ .action((name, opts) => {
165
+ try {
166
+ const result = getRoutingRecommendations({ serverName: name, apply: opts.apply });
167
+ if (result.recommendations.length === 0) {
168
+ console.log(pc.yellow('No servers found to analyse.'));
169
+ return;
170
+ }
171
+ console.log(pc.bold('\nRouting recommendations:\n'));
172
+ for (const rec of result.recommendations) {
173
+ const icon = rec.recommendation === 'passthrough' ? pc.green('passthrough') : pc.dim('execute_code');
174
+ console.log(` ${pc.cyan(rec.serverName)}: ${icon}`);
175
+ console.log(` Reason: ${rec.reason}`);
176
+ }
177
+ if (result.applied) {
178
+ console.log(pc.green(`\nRouting hints written to ${result.configPath}`));
179
+ }
180
+ else {
181
+ console.log(pc.dim('\nUse --apply to write hints to conductor config.'));
182
+ }
183
+ }
184
+ catch (err) {
185
+ console.error(pc.red(`Routing failed: ${String(err)}`));
186
+ process.exit(1);
187
+ }
188
+ });
189
+ // ----------------------------------------------------------------
190
+ // doctor — health check
191
+ // ----------------------------------------------------------------
192
+ program
193
+ .command('doctor')
194
+ .description('Health check all configured MCP servers')
195
+ .action(() => {
196
+ try {
197
+ const result = runDoctor();
198
+ console.log('\n' + formatDoctorResults(result));
199
+ if (result.errorCount > 0) {
200
+ process.exit(1);
201
+ }
202
+ }
203
+ catch (err) {
204
+ console.error(pc.red(`Doctor failed: ${String(err)}`));
205
+ process.exit(1);
206
+ }
207
+ });
208
+ // ----------------------------------------------------------------
209
+ // import — non-interactive import
210
+ // ----------------------------------------------------------------
211
+ program
212
+ .command('import')
213
+ .description('Import MCP servers from Claude config files (non-interactive)')
214
+ .option('--remove-originals', 'Remove imported servers from source configs')
215
+ .option('--dry-run', 'Show what would be imported without writing')
216
+ .action((opts) => {
217
+ try {
218
+ const results = importServers({
219
+ yes: true,
220
+ removeOriginals: opts.removeOriginals,
221
+ dryRun: opts.dryRun,
222
+ });
223
+ console.log(formatImportResults(results, opts.dryRun));
224
+ }
225
+ catch (err) {
226
+ console.error(pc.red(`Import failed: ${String(err)}`));
227
+ process.exit(1);
228
+ }
229
+ });
230
+ // ----------------------------------------------------------------
231
+ // export — generate rollback JSON
232
+ // ----------------------------------------------------------------
233
+ program
234
+ .command('export')
235
+ .description('Generate mcpServers JSON that points Claude back at mcp-conductor (rollback path)')
236
+ .option('--format <format>', 'Output format: claude-desktop | claude-code | raw', 'claude-desktop')
237
+ .action((opts) => {
238
+ try {
239
+ const result = exportToClaude({
240
+ format: opts.format ?? 'claude-desktop',
241
+ });
242
+ console.log(result.json);
243
+ }
244
+ catch (err) {
245
+ console.error(pc.red(`Export failed: ${String(err)}`));
246
+ process.exit(1);
247
+ }
248
+ });
249
+ // ----------------------------------------------------------------
250
+ // daemon — Phase 6 subcommands (start|stop|status|logs)
251
+ // ----------------------------------------------------------------
252
+ registerDaemonCommands(program);
253
+ // ----------------------------------------------------------------
254
+ // parse
255
+ // ----------------------------------------------------------------
256
+ program.parseAsync(process.argv).catch((err) => {
257
+ console.error(pc.red(`Unexpected error: ${String(err)}`));
258
+ process.exit(1);
259
+ });
260
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import type { BridgeConfig } from '../config/index.js';
9
9
  import { type ExecutionStream } from '../streaming/index.js';
10
+ import { SessionRegistry } from './session-registry.js';
10
11
  export interface ToolCallRequest {
11
12
  server: string;
12
13
  tool: string;
@@ -17,12 +18,38 @@ export interface ToolCallResponse {
17
18
  error?: {
18
19
  type: string;
19
20
  message: string;
21
+ /** Populated when type === 'mcp_tool_error' */
22
+ code?: string;
23
+ server?: string;
24
+ tool?: string;
20
25
  };
21
26
  metrics?: {
22
27
  durationMs: number;
23
28
  dataSize: number;
24
29
  };
30
+ /**
31
+ * Per-call PII reverse map (X4 — Agent J).
32
+ * Present only when the tool's `ToolDefinition.redact.response` annotation
33
+ * is active. Maps `[TOKEN_N]` → original sensitive value. The sandbox
34
+ * accumulates this across tool calls within one `execute_code` invocation
35
+ * and uses it to back `mcp.detokenize()`.
36
+ */
37
+ reverseMap?: Record<string, string>;
25
38
  }
39
+ /**
40
+ * Internal marker returned by the bridge callTool handler when X4
41
+ * tokenization is active. The HTTP server unwraps it so the wire format
42
+ * cleanly separates `result` from `reverseMap`.
43
+ *
44
+ * @internal Not part of the public API — used only between mcp-server.ts
45
+ * and http-server.ts handleToolCall.
46
+ */
47
+ export interface TokenizedCallResult {
48
+ __x4_result: unknown;
49
+ __x4_reverseMap: Record<string, string>;
50
+ }
51
+ /** Type guard for TokenizedCallResult */
52
+ export declare function isTokenizedCallResult(v: unknown): v is TokenizedCallResult;
26
53
  export interface ServerInfo {
27
54
  name: string;
28
55
  toolCount: number;
@@ -72,7 +99,12 @@ export declare class HttpBridge {
72
99
  private handlers;
73
100
  private startTime;
74
101
  private actualPort;
75
- constructor(config: BridgeConfig);
102
+ private sessions;
103
+ constructor(config: BridgeConfig, sessions?: SessionRegistry);
104
+ /**
105
+ * Exposed for tests that need to assert registry state directly.
106
+ */
107
+ getSessionRegistry(): SessionRegistry;
76
108
  /**
77
109
  * Set the handlers for bridge operations
78
110
  */
@@ -93,6 +125,38 @@ export declare class HttpBridge {
93
125
  * Get the actual port the server is listening on
94
126
  */
95
127
  getPort(): number;
128
+ /**
129
+ * Return true if a bare hostname (no brackets, no port) is loopback.
130
+ * Hostnames are case-insensitive per RFC 1035 §2.3.3 — `Localhost` and
131
+ * `LOCALHOST` are valid Host header values, so compare lowercased.
132
+ */
133
+ private static isLoopbackHostname;
134
+ /**
135
+ * Extract the bare hostname from a `Host` header (`host[:port]` or
136
+ * `[ipv6]:port`). Returns undefined for malformed values.
137
+ */
138
+ private static extractHostHeaderName;
139
+ /**
140
+ * Extract hostname from an `Origin` header (a full URL like
141
+ * `http://example.com:8080`). Returns undefined for malformed values.
142
+ *
143
+ * Node's WHATWG URL keeps IPv6 addresses in bracketed form (`[::1]`) on
144
+ * the `hostname` property, so strip the brackets for comparison.
145
+ */
146
+ private static extractOriginHostname;
147
+ /**
148
+ * Internal sandbox-only routes that should bypass MCP session middleware.
149
+ * The Deno sandbox is not an MCP client; tracking a session per call
150
+ * inflates the registry without any reconnection benefit and forces the
151
+ * 1000-entry LRU evictor into the hot path.
152
+ */
153
+ private static isSandboxInternalPath;
154
+ /**
155
+ * Normalise the Mcp-Session-Id header. Node surfaces duplicates as string[],
156
+ * so take the first value and trim. Reject obvious garbage so bad clients
157
+ * don't get stored in the registry.
158
+ */
159
+ private readSessionHeader;
96
160
  /**
97
161
  * Handle incoming HTTP request
98
162
  */
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"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"}