@revealui/mcp 0.0.1-pre.0 → 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.
Files changed (270) hide show
  1. package/.env.example +9 -0
  2. package/MCP_MAINTENANCE.md +265 -0
  3. package/README.md +260 -0
  4. package/__tests__/crdt.integration.test.ts +156 -0
  5. package/configs/README.md +77 -0
  6. package/configs/claude-template.json +54 -0
  7. package/dist/packages/core/src/database/ssl-config.d.ts +9 -0
  8. package/dist/packages/core/src/database/ssl-config.d.ts.map +1 -0
  9. package/dist/packages/core/src/database/ssl-config.js +8 -0
  10. package/dist/packages/core/src/database/ssl-config.js.map +1 -0
  11. package/dist/packages/core/src/features.d.ts +86 -0
  12. package/dist/packages/core/src/features.d.ts.map +1 -0
  13. package/dist/packages/core/src/features.js +93 -0
  14. package/dist/packages/core/src/features.js.map +1 -0
  15. package/dist/packages/core/src/license.d.ts +75 -0
  16. package/dist/packages/core/src/license.d.ts.map +1 -0
  17. package/dist/packages/core/src/license.js +174 -0
  18. package/dist/packages/core/src/license.js.map +1 -0
  19. package/dist/packages/core/src/monitoring/alerts.d.ts +118 -0
  20. package/dist/packages/core/src/monitoring/alerts.d.ts.map +1 -0
  21. package/dist/packages/core/src/monitoring/alerts.js +325 -0
  22. package/dist/packages/core/src/monitoring/alerts.js.map +1 -0
  23. package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +71 -0
  24. package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +1 -0
  25. package/dist/packages/core/src/monitoring/cleanup-manager.js +227 -0
  26. package/dist/packages/core/src/monitoring/cleanup-manager.js.map +1 -0
  27. package/dist/packages/core/src/monitoring/health-monitor.d.ts +22 -0
  28. package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +1 -0
  29. package/dist/packages/core/src/monitoring/health-monitor.js +143 -0
  30. package/dist/packages/core/src/monitoring/health-monitor.js.map +1 -0
  31. package/dist/packages/core/src/monitoring/index.d.ts +14 -0
  32. package/dist/packages/core/src/monitoring/index.d.ts.map +1 -0
  33. package/dist/packages/core/src/monitoring/index.js +18 -0
  34. package/dist/packages/core/src/monitoring/index.js.map +1 -0
  35. package/dist/packages/core/src/monitoring/process-registry.d.ts +97 -0
  36. package/dist/packages/core/src/monitoring/process-registry.d.ts.map +1 -0
  37. package/dist/packages/core/src/monitoring/process-registry.js +223 -0
  38. package/dist/packages/core/src/monitoring/process-registry.js.map +1 -0
  39. package/dist/packages/core/src/monitoring/types.d.ts +231 -0
  40. package/dist/packages/core/src/monitoring/types.d.ts.map +1 -0
  41. package/dist/packages/core/src/monitoring/types.js +43 -0
  42. package/dist/packages/core/src/monitoring/types.js.map +1 -0
  43. package/dist/packages/core/src/monitoring/zombie-detector.d.ts +81 -0
  44. package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +1 -0
  45. package/dist/packages/core/src/monitoring/zombie-detector.js +232 -0
  46. package/dist/packages/core/src/monitoring/zombie-detector.js.map +1 -0
  47. package/dist/packages/core/src/observability/logger.d.ts +47 -0
  48. package/dist/packages/core/src/observability/logger.d.ts.map +1 -0
  49. package/dist/packages/core/src/observability/logger.js +141 -0
  50. package/dist/packages/core/src/observability/logger.js.map +1 -0
  51. package/dist/packages/core/src/utils/logger-server.d.ts +32 -0
  52. package/dist/packages/core/src/utils/logger-server.d.ts.map +1 -0
  53. package/dist/packages/core/src/utils/logger-server.js +69 -0
  54. package/dist/packages/core/src/utils/logger-server.js.map +1 -0
  55. package/dist/packages/core/src/utils/request-context.d.ts +143 -0
  56. package/dist/packages/core/src/utils/request-context.d.ts.map +1 -0
  57. package/dist/packages/core/src/utils/request-context.js +169 -0
  58. package/dist/packages/core/src/utils/request-context.js.map +1 -0
  59. package/dist/packages/dev/src/code-validator/index.d.ts +20 -0
  60. package/dist/packages/dev/src/code-validator/index.d.ts.map +1 -0
  61. package/dist/packages/dev/src/code-validator/index.js +20 -0
  62. package/dist/packages/dev/src/code-validator/index.js.map +1 -0
  63. package/dist/packages/dev/src/code-validator/types.d.ts +67 -0
  64. package/dist/packages/dev/src/code-validator/types.d.ts.map +1 -0
  65. package/dist/packages/dev/src/code-validator/types.js +7 -0
  66. package/dist/packages/dev/src/code-validator/types.js.map +1 -0
  67. package/dist/packages/dev/src/code-validator/validator.d.ts +48 -0
  68. package/dist/packages/dev/src/code-validator/validator.d.ts.map +1 -0
  69. package/dist/packages/dev/src/code-validator/validator.js +176 -0
  70. package/dist/packages/dev/src/code-validator/validator.js.map +1 -0
  71. package/dist/packages/mcp/src/adapters/db.d.ts +46 -0
  72. package/dist/packages/mcp/src/adapters/db.d.ts.map +1 -0
  73. package/dist/packages/mcp/src/adapters/db.js +127 -0
  74. package/dist/packages/mcp/src/adapters/db.js.map +1 -0
  75. package/dist/packages/mcp/src/config/index.d.ts +11 -0
  76. package/dist/packages/mcp/src/config/index.d.ts.map +1 -0
  77. package/dist/packages/mcp/src/config/index.js +18 -0
  78. package/dist/packages/mcp/src/config/index.js.map +1 -0
  79. package/dist/packages/mcp/src/contracts.d.ts +131 -0
  80. package/dist/packages/mcp/src/contracts.d.ts.map +1 -0
  81. package/dist/packages/mcp/src/contracts.js +153 -0
  82. package/dist/packages/mcp/src/contracts.js.map +1 -0
  83. package/dist/packages/mcp/src/hypervisor.d.ts +132 -0
  84. package/dist/packages/mcp/src/hypervisor.d.ts.map +1 -0
  85. package/dist/packages/mcp/src/hypervisor.js +359 -0
  86. package/dist/packages/mcp/src/hypervisor.js.map +1 -0
  87. package/dist/packages/mcp/src/index.d.ts +25 -0
  88. package/dist/packages/mcp/src/index.d.ts.map +1 -0
  89. package/dist/packages/mcp/src/index.js +41 -0
  90. package/dist/packages/mcp/src/index.js.map +1 -0
  91. package/dist/packages/mcp/src/servers/adapter.d.ts +199 -0
  92. package/dist/packages/mcp/src/servers/adapter.d.ts.map +1 -0
  93. package/dist/packages/mcp/src/servers/adapter.js +487 -0
  94. package/dist/packages/mcp/src/servers/adapter.js.map +1 -0
  95. package/dist/packages/mcp/src/servers/code-validator.d.ts +24 -0
  96. package/dist/packages/mcp/src/servers/code-validator.d.ts.map +1 -0
  97. package/dist/packages/mcp/src/servers/code-validator.js +156 -0
  98. package/dist/packages/mcp/src/servers/code-validator.js.map +1 -0
  99. package/dist/packages/mcp/src/servers/neon.d.ts +11 -0
  100. package/dist/packages/mcp/src/servers/neon.d.ts.map +1 -0
  101. package/dist/packages/mcp/src/servers/neon.js +90 -0
  102. package/dist/packages/mcp/src/servers/neon.js.map +1 -0
  103. package/dist/packages/mcp/src/servers/next-devtools.d.ts +11 -0
  104. package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +1 -0
  105. package/dist/packages/mcp/src/servers/next-devtools.js +215 -0
  106. package/dist/packages/mcp/src/servers/next-devtools.js.map +1 -0
  107. package/dist/packages/mcp/src/servers/playwright.d.ts +11 -0
  108. package/dist/packages/mcp/src/servers/playwright.d.ts.map +1 -0
  109. package/dist/packages/mcp/src/servers/playwright.js +68 -0
  110. package/dist/packages/mcp/src/servers/playwright.js.map +1 -0
  111. package/dist/packages/mcp/src/servers/stripe.d.ts +11 -0
  112. package/dist/packages/mcp/src/servers/stripe.d.ts.map +1 -0
  113. package/dist/packages/mcp/src/servers/stripe.js +86 -0
  114. package/dist/packages/mcp/src/servers/stripe.js.map +1 -0
  115. package/dist/packages/mcp/src/servers/supabase.d.ts +11 -0
  116. package/dist/packages/mcp/src/servers/supabase.d.ts.map +1 -0
  117. package/dist/packages/mcp/src/servers/supabase.js +144 -0
  118. package/dist/packages/mcp/src/servers/supabase.js.map +1 -0
  119. package/dist/packages/mcp/src/servers/vercel.d.ts +11 -0
  120. package/dist/packages/mcp/src/servers/vercel.d.ts.map +1 -0
  121. package/dist/packages/mcp/src/servers/vercel.js +87 -0
  122. package/dist/packages/mcp/src/servers/vercel.js.map +1 -0
  123. package/dist/packages/mcp/src/servers/vultr-test.d.ts +3 -0
  124. package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +1 -0
  125. package/dist/packages/mcp/src/servers/vultr-test.js +82 -0
  126. package/dist/packages/mcp/src/servers/vultr-test.js.map +1 -0
  127. package/dist/scripts/lib/analyzers/console-analyzer.d.ts +188 -0
  128. package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +1 -0
  129. package/dist/scripts/lib/analyzers/console-analyzer.js +432 -0
  130. package/dist/scripts/lib/analyzers/console-analyzer.js.map +1 -0
  131. package/dist/scripts/lib/analyzers/index.d.ts +11 -0
  132. package/dist/scripts/lib/analyzers/index.d.ts.map +1 -0
  133. package/dist/scripts/lib/analyzers/index.js +11 -0
  134. package/dist/scripts/lib/analyzers/index.js.map +1 -0
  135. package/dist/scripts/lib/args.d.ts +104 -0
  136. package/dist/scripts/lib/args.d.ts.map +1 -0
  137. package/dist/scripts/lib/args.js +304 -0
  138. package/dist/scripts/lib/args.js.map +1 -0
  139. package/dist/scripts/lib/cache.d.ts +185 -0
  140. package/dist/scripts/lib/cache.d.ts.map +1 -0
  141. package/dist/scripts/lib/cache.js +390 -0
  142. package/dist/scripts/lib/cache.js.map +1 -0
  143. package/dist/scripts/lib/cli/dispatch.d.ts +116 -0
  144. package/dist/scripts/lib/cli/dispatch.d.ts.map +1 -0
  145. package/dist/scripts/lib/cli/dispatch.js +206 -0
  146. package/dist/scripts/lib/cli/dispatch.js.map +1 -0
  147. package/dist/scripts/lib/cli/index.d.ts +10 -0
  148. package/dist/scripts/lib/cli/index.d.ts.map +1 -0
  149. package/dist/scripts/lib/cli/index.js +10 -0
  150. package/dist/scripts/lib/cli/index.js.map +1 -0
  151. package/dist/scripts/lib/database/ssl-config.d.ts +26 -0
  152. package/dist/scripts/lib/database/ssl-config.d.ts.map +1 -0
  153. package/dist/scripts/lib/database/ssl-config.js +47 -0
  154. package/dist/scripts/lib/database/ssl-config.js.map +1 -0
  155. package/dist/scripts/lib/errors.d.ts +218 -0
  156. package/dist/scripts/lib/errors.d.ts.map +1 -0
  157. package/dist/scripts/lib/errors.js +543 -0
  158. package/dist/scripts/lib/errors.js.map +1 -0
  159. package/dist/scripts/lib/exec.d.ts +107 -0
  160. package/dist/scripts/lib/exec.d.ts.map +1 -0
  161. package/dist/scripts/lib/exec.js +232 -0
  162. package/dist/scripts/lib/exec.js.map +1 -0
  163. package/dist/scripts/lib/index.d.ts +50 -0
  164. package/dist/scripts/lib/index.d.ts.map +1 -0
  165. package/dist/scripts/lib/index.js +65 -0
  166. package/dist/scripts/lib/index.js.map +1 -0
  167. package/dist/scripts/lib/logger.d.ts +50 -0
  168. package/dist/scripts/lib/logger.d.ts.map +1 -0
  169. package/dist/scripts/lib/logger.js +159 -0
  170. package/dist/scripts/lib/logger.js.map +1 -0
  171. package/dist/scripts/lib/output.d.ts +149 -0
  172. package/dist/scripts/lib/output.d.ts.map +1 -0
  173. package/dist/scripts/lib/output.js +263 -0
  174. package/dist/scripts/lib/output.js.map +1 -0
  175. package/dist/scripts/lib/parallel.d.ts +164 -0
  176. package/dist/scripts/lib/parallel.d.ts.map +1 -0
  177. package/dist/scripts/lib/parallel.js +355 -0
  178. package/dist/scripts/lib/parallel.js.map +1 -0
  179. package/dist/scripts/lib/paths.d.ts +92 -0
  180. package/dist/scripts/lib/paths.d.ts.map +1 -0
  181. package/dist/scripts/lib/paths.js +171 -0
  182. package/dist/scripts/lib/paths.js.map +1 -0
  183. package/dist/scripts/lib/state/adapters/memory.d.ts +42 -0
  184. package/dist/scripts/lib/state/adapters/memory.d.ts.map +1 -0
  185. package/dist/scripts/lib/state/adapters/memory.js +110 -0
  186. package/dist/scripts/lib/state/adapters/memory.js.map +1 -0
  187. package/dist/scripts/lib/state/adapters/pglite.d.ts +46 -0
  188. package/dist/scripts/lib/state/adapters/pglite.d.ts.map +1 -0
  189. package/dist/scripts/lib/state/adapters/pglite.js +256 -0
  190. package/dist/scripts/lib/state/adapters/pglite.js.map +1 -0
  191. package/dist/scripts/lib/state/index.d.ts +16 -0
  192. package/dist/scripts/lib/state/index.d.ts.map +1 -0
  193. package/dist/scripts/lib/state/index.js +16 -0
  194. package/dist/scripts/lib/state/index.js.map +1 -0
  195. package/dist/scripts/lib/state/types.d.ts +111 -0
  196. package/dist/scripts/lib/state/types.d.ts.map +1 -0
  197. package/dist/scripts/lib/state/types.js +8 -0
  198. package/dist/scripts/lib/state/types.js.map +1 -0
  199. package/dist/scripts/lib/state/workflow-state.d.ts +110 -0
  200. package/dist/scripts/lib/state/workflow-state.d.ts.map +1 -0
  201. package/dist/scripts/lib/state/workflow-state.js +331 -0
  202. package/dist/scripts/lib/state/workflow-state.js.map +1 -0
  203. package/dist/scripts/lib/telemetry.d.ts +194 -0
  204. package/dist/scripts/lib/telemetry.d.ts.map +1 -0
  205. package/dist/scripts/lib/telemetry.js +394 -0
  206. package/dist/scripts/lib/telemetry.js.map +1 -0
  207. package/dist/scripts/lib/utils.d.ts +270 -0
  208. package/dist/scripts/lib/utils.d.ts.map +1 -0
  209. package/dist/scripts/lib/utils.js +473 -0
  210. package/dist/scripts/lib/utils.js.map +1 -0
  211. package/dist/scripts/lib/validation/database.d.ts +83 -0
  212. package/dist/scripts/lib/validation/database.d.ts.map +1 -0
  213. package/dist/scripts/lib/validation/database.js +199 -0
  214. package/dist/scripts/lib/validation/database.js.map +1 -0
  215. package/dist/scripts/lib/validation/env.d.ts +80 -0
  216. package/dist/scripts/lib/validation/env.d.ts.map +1 -0
  217. package/dist/scripts/lib/validation/env.js +246 -0
  218. package/dist/scripts/lib/validation/env.js.map +1 -0
  219. package/dist/scripts/lib/validation/index.d.ts +16 -0
  220. package/dist/scripts/lib/validation/index.d.ts.map +1 -0
  221. package/dist/scripts/lib/validation/index.js +16 -0
  222. package/dist/scripts/lib/validation/index.js.map +1 -0
  223. package/dist/scripts/lib/validation/post-execution.d.ts +74 -0
  224. package/dist/scripts/lib/validation/post-execution.d.ts.map +1 -0
  225. package/dist/scripts/lib/validation/post-execution.js +110 -0
  226. package/dist/scripts/lib/validation/post-execution.js.map +1 -0
  227. package/dist/scripts/lib/validation/pre-execution.d.ts +165 -0
  228. package/dist/scripts/lib/validation/pre-execution.d.ts.map +1 -0
  229. package/dist/scripts/lib/validation/pre-execution.js +466 -0
  230. package/dist/scripts/lib/validation/pre-execution.js.map +1 -0
  231. package/dist/scripts/lib/validators/documentation-validator.d.ts +242 -0
  232. package/dist/scripts/lib/validators/documentation-validator.d.ts.map +1 -0
  233. package/dist/scripts/lib/validators/documentation-validator.js +584 -0
  234. package/dist/scripts/lib/validators/documentation-validator.js.map +1 -0
  235. package/dist/scripts/lib/validators/index.d.ts +11 -0
  236. package/dist/scripts/lib/validators/index.d.ts.map +1 -0
  237. package/dist/scripts/lib/validators/index.js +11 -0
  238. package/dist/scripts/lib/validators/index.js.map +1 -0
  239. package/docker-compose.yml +46 -0
  240. package/docs/INDEX.md +88 -0
  241. package/docs/README.md +774 -0
  242. package/docs/SETUP.md +264 -0
  243. package/docs/servers/code-validator.md +586 -0
  244. package/eslint.config.js +7 -0
  245. package/migrations/0001_add_crdt_columns.sql +8 -0
  246. package/migrations/0001_rollback.sql +6 -0
  247. package/migrations/005_performance_indexes.sql +190 -0
  248. package/migrations/backfill_crdt_meta.js +45 -0
  249. package/package.json +21 -85
  250. package/src/__tests__/hypervisor.test.ts +212 -0
  251. package/src/adapters/db.ts +180 -0
  252. package/src/config/config.json +49 -0
  253. package/src/config/index.ts +30 -0
  254. package/src/contracts.ts +221 -0
  255. package/src/hypervisor.ts +464 -0
  256. package/src/index.ts +87 -0
  257. package/src/servers/adapter.ts +643 -0
  258. package/src/servers/code-validator.ts +188 -0
  259. package/src/servers/neon.ts +103 -0
  260. package/src/servers/next-devtools.ts +230 -0
  261. package/src/servers/playwright.ts +77 -0
  262. package/src/servers/stripe.ts +99 -0
  263. package/src/servers/supabase.ts +161 -0
  264. package/src/servers/vercel.ts +100 -0
  265. package/src/servers/vultr-test.ts +97 -0
  266. package/tsconfig.json +12 -0
  267. package/vitest.config.ts +22 -0
  268. package/LICENSE +0 -202
  269. package/dist/index.js +0 -10990
  270. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypervisor.d.ts","sourceRoot":"","sources":["../../../../src/hypervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,+BAA+B;IAC/B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;CACd;AAoCD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,eAAe,CAGV;IACb,OAAO,CAAC,gBAAgB,CAA8B;IAEtD,OAAO;IAUP,MAAM,CAAC,WAAW,IAAI,aAAa;IAWnC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAe7C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqE9C;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,cAAc;IAkBtB;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BhD;;;OAGG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAWvD;;;OAGG;IACH,WAAW,IAAI,cAAc,EAAE;IAkB/B;;;;;;OAMG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrF;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAgBxF,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,mBAAmB;IAW3B;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,IAAI;CAM9B"}
@@ -0,0 +1,359 @@
1
+ /**
2
+ * MCP Hypervisor
3
+ *
4
+ * Manages N running MCP server processes, pings them for liveness, and
5
+ * dynamically exposes their tools at runtime. Inspired by the
6
+ * MCPCompatibilityLayer/MCPHypervisor pattern from AnythingLLM.
7
+ *
8
+ * Architecture:
9
+ * - Singleton: one hypervisor per process manages all MCP servers
10
+ * - Each server is spawned with piped stdio for JSON-RPC communication
11
+ * - Tool names are namespaced: @@mcp_{serverName}_{toolName}
12
+ * - Health check loop: every 60s, process.exitCode check + tools/list probe
13
+ *
14
+ * Wire format: newline-delimited JSON-RPC 2.0 (stdin/stdout)
15
+ */
16
+ import { spawn } from 'node:child_process';
17
+ import { registerCleanupHandler } from '@revealui/core/monitoring';
18
+ import { logger } from '@revealui/core/observability/logger';
19
+ // =============================================================================
20
+ // Constants
21
+ // =============================================================================
22
+ const HEALTH_CHECK_INTERVAL_MS = 60_000;
23
+ const REQUEST_TIMEOUT_MS = 5_000;
24
+ const MCP_TOOL_PREFIX = '@@mcp';
25
+ // =============================================================================
26
+ // MCPHypervisor
27
+ // =============================================================================
28
+ /**
29
+ * Singleton that manages MCP server processes and their tool registries.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const hypervisor = MCPHypervisor.getInstance()
34
+ *
35
+ * hypervisor.registerServer({
36
+ * name: 'stripe',
37
+ * command: 'pnpm',
38
+ * args: ['dlx', '@stripe/mcp', '--tools=all', '--api-key=sk_...'],
39
+ * })
40
+ *
41
+ * await hypervisor.startServer('stripe')
42
+ * const tools = hypervisor.getAllTools()
43
+ * // tools[0].namespacedName === '@@mcp_stripe_create_payment_intent'
44
+ * ```
45
+ */
46
+ export class MCPHypervisor {
47
+ static instance = null;
48
+ servers = new Map();
49
+ requestCounter = 0;
50
+ pendingRequests = new Map();
51
+ healthCheckTimer = null;
52
+ constructor() {
53
+ registerCleanupHandler('mcp-hypervisor', async () => this.stopAll(), 'Stop all MCP server processes', 85);
54
+ this.startHealthCheckLoop();
55
+ }
56
+ static getInstance() {
57
+ if (!MCPHypervisor.instance) {
58
+ MCPHypervisor.instance = new MCPHypervisor();
59
+ }
60
+ return MCPHypervisor.instance;
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // Server registration
64
+ // ---------------------------------------------------------------------------
65
+ /**
66
+ * Register an MCP server configuration without starting it.
67
+ */
68
+ registerServer(config) {
69
+ if (this.servers.has(config.name)) {
70
+ logger.warn(`[MCPHypervisor] Server "${config.name}" is already registered`);
71
+ return;
72
+ }
73
+ this.servers.set(config.name, {
74
+ config,
75
+ process: null,
76
+ tools: [],
77
+ healthy: false,
78
+ lastPingAt: null,
79
+ });
80
+ logger.info(`[MCPHypervisor] Registered server: ${config.name}`);
81
+ }
82
+ /**
83
+ * Unregister a server (stops it first if running).
84
+ */
85
+ async unregisterServer(name) {
86
+ const entry = this.servers.get(name);
87
+ if (!entry)
88
+ return;
89
+ if (entry.process)
90
+ await this.stopServer(name);
91
+ this.servers.delete(name);
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Lifecycle
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Spawn the MCP server process with piped stdio.
98
+ * Tools are discovered via `listServerTools()` after startup.
99
+ */
100
+ async startServer(name) {
101
+ const entry = this.servers.get(name);
102
+ if (!entry)
103
+ throw new Error(`[MCPHypervisor] Unknown server: "${name}"`);
104
+ if (entry.process && entry.process.exitCode === null) {
105
+ logger.info(`[MCPHypervisor] Server "${name}" is already running`);
106
+ return;
107
+ }
108
+ const { config } = entry;
109
+ const child = spawn(config.command, config.args, {
110
+ stdio: ['pipe', 'pipe', 'pipe'],
111
+ env: { ...process.env, ...config.env },
112
+ });
113
+ entry.process = child;
114
+ entry.healthy = false;
115
+ entry.tools = [];
116
+ // Buffer incoming stdout for JSON-RPC response parsing
117
+ let buffer = '';
118
+ child.stdout?.on('data', (chunk) => {
119
+ buffer += chunk.toString();
120
+ const lines = buffer.split('\n');
121
+ buffer = lines.pop() ?? ''; // keep incomplete line in buffer
122
+ for (const line of lines) {
123
+ const trimmed = line.trim();
124
+ if (!trimmed)
125
+ continue;
126
+ try {
127
+ const msg = JSON.parse(trimmed);
128
+ this.handleResponse(msg);
129
+ }
130
+ catch {
131
+ // Non-JSON output from server — ignore
132
+ }
133
+ }
134
+ });
135
+ child.stderr?.on('data', (chunk) => {
136
+ logger.warn(`[MCPHypervisor] ${name} stderr: ${chunk.toString().trim()}`);
137
+ });
138
+ child.on('exit', (code) => {
139
+ logger.warn(`[MCPHypervisor] Server "${name}" exited with code ${code}`);
140
+ entry.healthy = false;
141
+ // Reject all pending requests for this server
142
+ for (const [id, pending] of this.pendingRequests) {
143
+ pending.reject(new Error(`Server "${name}" exited`));
144
+ clearTimeout(pending.timer);
145
+ this.pendingRequests.delete(id);
146
+ }
147
+ });
148
+ // Allow a brief startup window, then probe tools
149
+ await new Promise((resolve) => setTimeout(resolve, 500));
150
+ try {
151
+ await this.listServerTools(name);
152
+ entry.healthy = true;
153
+ logger.info(`[MCPHypervisor] Server "${name}" started (${entry.tools.length} tools)`);
154
+ }
155
+ catch (error) {
156
+ logger.warn(`[MCPHypervisor] Server "${name}" started but tool discovery failed: ${error instanceof Error ? error.message : String(error)}`);
157
+ // Still mark healthy if the process is alive (tools may not be supported)
158
+ entry.healthy = entry.process.exitCode === null;
159
+ }
160
+ }
161
+ /**
162
+ * Stop a running MCP server process.
163
+ */
164
+ async stopServer(name) {
165
+ const entry = this.servers.get(name);
166
+ if (!entry?.process)
167
+ return;
168
+ entry.process.kill('SIGTERM');
169
+ await new Promise((resolve) => setTimeout(resolve, 200));
170
+ if (entry.process.exitCode === null) {
171
+ entry.process.kill('SIGKILL');
172
+ }
173
+ entry.process = null;
174
+ entry.healthy = false;
175
+ entry.tools = [];
176
+ logger.info(`[MCPHypervisor] Stopped server: ${name}`);
177
+ }
178
+ /**
179
+ * Stop all running servers.
180
+ */
181
+ async stopAll() {
182
+ this.stopHealthCheckLoop();
183
+ await Promise.all(Array.from(this.servers.keys()).map((name) => this.stopServer(name)));
184
+ }
185
+ // ---------------------------------------------------------------------------
186
+ // JSON-RPC communication
187
+ // ---------------------------------------------------------------------------
188
+ /**
189
+ * Send a JSON-RPC request to a running server and await the response.
190
+ */
191
+ sendRequest(name, method, params) {
192
+ const entry = this.servers.get(name);
193
+ if (!entry?.process || entry.process.exitCode !== null) {
194
+ return Promise.reject(new Error(`Server "${name}" is not running`));
195
+ }
196
+ const id = ++this.requestCounter;
197
+ const request = {
198
+ jsonrpc: '2.0',
199
+ id,
200
+ method,
201
+ ...(params !== undefined && { params }),
202
+ };
203
+ return new Promise((resolve, reject) => {
204
+ const timer = setTimeout(() => {
205
+ this.pendingRequests.delete(id);
206
+ reject(new Error(`Request ${method} timed out after ${REQUEST_TIMEOUT_MS}ms`));
207
+ }, REQUEST_TIMEOUT_MS);
208
+ this.pendingRequests.set(id, { resolve, reject, timer });
209
+ try {
210
+ entry.process?.stdin?.write(`${JSON.stringify(request)}\n`);
211
+ }
212
+ catch (error) {
213
+ clearTimeout(timer);
214
+ this.pendingRequests.delete(id);
215
+ reject(error);
216
+ }
217
+ });
218
+ }
219
+ handleResponse(msg) {
220
+ const pending = this.pendingRequests.get(msg.id);
221
+ if (!pending)
222
+ return;
223
+ clearTimeout(pending.timer);
224
+ this.pendingRequests.delete(msg.id);
225
+ if (msg.error) {
226
+ pending.reject(new Error(`JSON-RPC error ${msg.error.code}: ${msg.error.message}`));
227
+ }
228
+ else {
229
+ pending.resolve(msg.result);
230
+ }
231
+ }
232
+ // ---------------------------------------------------------------------------
233
+ // Health checks
234
+ // ---------------------------------------------------------------------------
235
+ /**
236
+ * Ping a server — checks process liveness and sends a JSON-RPC `ping`.
237
+ * Updates `entry.healthy`.
238
+ */
239
+ async pingServer(name) {
240
+ const entry = this.servers.get(name);
241
+ if (!entry)
242
+ return false;
243
+ // Process liveness check
244
+ if (!entry.process || entry.process.exitCode !== null) {
245
+ entry.healthy = false;
246
+ return false;
247
+ }
248
+ entry.lastPingAt = Date.now();
249
+ try {
250
+ await this.sendRequest(name, 'ping');
251
+ entry.healthy = true;
252
+ return true;
253
+ }
254
+ catch {
255
+ // ping not supported by all servers — still healthy if process is alive
256
+ entry.healthy = entry.process.exitCode === null;
257
+ return entry.healthy;
258
+ }
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // Tool discovery
262
+ // ---------------------------------------------------------------------------
263
+ /**
264
+ * Discover tools from a running server via JSON-RPC `tools/list`.
265
+ * Caches the result in the server entry.
266
+ */
267
+ async listServerTools(name) {
268
+ const entry = this.servers.get(name);
269
+ if (!entry)
270
+ throw new Error(`Unknown server: "${name}"`);
271
+ const result = await this.sendRequest(name, 'tools/list');
272
+ const tools = result?.tools ?? [];
273
+ entry.tools = tools;
274
+ return tools;
275
+ }
276
+ /**
277
+ * Return all tools from all healthy servers, namespaced as
278
+ * `@@mcp_{serverName}_{toolName}` to avoid collisions.
279
+ */
280
+ getAllTools() {
281
+ const tools = [];
282
+ for (const [serverName, entry] of this.servers) {
283
+ if (!entry.healthy)
284
+ continue;
285
+ for (const tool of entry.tools) {
286
+ tools.push({
287
+ namespacedName: `${MCP_TOOL_PREFIX}_${serverName}_${tool.name}`,
288
+ serverName,
289
+ tool,
290
+ });
291
+ }
292
+ }
293
+ return tools;
294
+ }
295
+ /**
296
+ * Call a tool on a running MCP server via JSON-RPC `tools/call`.
297
+ *
298
+ * @param serverName - The registered server name
299
+ * @param toolName - The tool name (without namespace prefix)
300
+ * @param args - Arguments to pass to the tool
301
+ */
302
+ async callTool(serverName, toolName, args) {
303
+ return this.sendRequest(serverName, 'tools/call', {
304
+ name: toolName,
305
+ arguments: args,
306
+ });
307
+ }
308
+ /**
309
+ * Return the health status of all registered servers.
310
+ */
311
+ getStatus() {
312
+ const status = {};
313
+ for (const [name, entry] of this.servers) {
314
+ status[name] = {
315
+ healthy: entry.healthy,
316
+ toolCount: entry.tools.length,
317
+ pid: entry.process?.pid ?? null,
318
+ };
319
+ }
320
+ return status;
321
+ }
322
+ // ---------------------------------------------------------------------------
323
+ // Health check loop
324
+ // ---------------------------------------------------------------------------
325
+ startHealthCheckLoop() {
326
+ this.healthCheckTimer = setInterval(async () => {
327
+ for (const [name] of this.servers) {
328
+ try {
329
+ await this.pingServer(name);
330
+ }
331
+ catch {
332
+ // Already handled inside pingServer
333
+ }
334
+ }
335
+ }, HEALTH_CHECK_INTERVAL_MS);
336
+ // Don't prevent process exit
337
+ this.healthCheckTimer.unref?.();
338
+ }
339
+ stopHealthCheckLoop() {
340
+ if (this.healthCheckTimer) {
341
+ clearInterval(this.healthCheckTimer);
342
+ this.healthCheckTimer = null;
343
+ }
344
+ }
345
+ // ---------------------------------------------------------------------------
346
+ // Testing utilities
347
+ // ---------------------------------------------------------------------------
348
+ /**
349
+ * Reset the singleton (for testing only).
350
+ * @internal
351
+ */
352
+ static _resetForTests() {
353
+ if (MCPHypervisor.instance) {
354
+ MCPHypervisor.instance.stopHealthCheckLoop();
355
+ MCPHypervisor.instance = null;
356
+ }
357
+ }
358
+ }
359
+ //# sourceMappingURL=hypervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypervisor.js","sourceRoot":"","sources":["../../../../src/hypervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @revealui/mcp
3
+ *
4
+ * Model Context Protocol integrations for RevealUI.
5
+ *
6
+ * Provides:
7
+ * - MCP adapter framework (Vercel, Stripe, Neon)
8
+ * - Database adapter (PGlite / PostgreSQL) with CRDT support
9
+ * - MCP contracts (Zod schemas for request/response/tool bridging)
10
+ * - MCP server launchers (code-validator, stripe, neon, etc.)
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ /**
15
+ * Check if the MCP package is licensed for use.
16
+ * Initializes the license cache from environment variables, then checks the tier.
17
+ * Returns false with a warning log if no Pro/Enterprise license is active.
18
+ */
19
+ export declare function checkMcpLicense(): Promise<boolean>;
20
+ export { type CrdtOperationsInsert, type CrdtOperationsRow, connectPglite, connectPostgres, createMcpDbClient, type McpDbClient, type QueryResult, } from './adapters/db.js';
21
+ export { getMcpConfig, type McpConfig as McpEnvConfig, type McpMetricsMode, } from './config/index.js';
22
+ export { agentDefinitionToAgentCard, agentDefinitionToMcpTools, contractsToolDefinitionToMcpTool, type MCPAdapterConfig, MCPAdapterConfigSchema, type MCPRequest, type MCPRequestOptions, MCPRequestOptionsSchema, MCPRequestSchema, type MCPResponse, type MCPResponseMetadata, MCPResponseMetadataSchema, MCPResponseSchema, mcpToolToContractsToolDefinition, } from './contracts.js';
23
+ export { MCPHypervisor, type MCPServerConfig, type MCPTool, type NamespacedTool, } from './hypervisor.js';
24
+ export { createMCPAdapter, disposeAllAdapters, generateIdempotencyKey, generateUniqueIdempotencyKey, MCPAdapter, type MCPConfig, NeonAdapter, StripeAdapter, VercelAdapter, } from './servers/adapter.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAUxD;AAGD,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,YAAY,EACZ,KAAK,SAAS,IAAI,YAAY,EAC9B,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,gCAAgC,EAChC,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,gCAAgC,GACjC,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,4BAA4B,EAC5B,UAAU,EACV,KAAK,SAAS,EACd,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @revealui/mcp
3
+ *
4
+ * Model Context Protocol integrations for RevealUI.
5
+ *
6
+ * Provides:
7
+ * - MCP adapter framework (Vercel, Stripe, Neon)
8
+ * - Database adapter (PGlite / PostgreSQL) with CRDT support
9
+ * - MCP contracts (Zod schemas for request/response/tool bridging)
10
+ * - MCP server launchers (code-validator, stripe, neon, etc.)
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import { isFeatureEnabled } from '@revealui/core/features';
15
+ import { initializeLicense } from '@revealui/core/license';
16
+ import { logger } from '@revealui/core/observability/logger';
17
+ /**
18
+ * Check if the MCP package is licensed for use.
19
+ * Initializes the license cache from environment variables, then checks the tier.
20
+ * Returns false with a warning log if no Pro/Enterprise license is active.
21
+ */
22
+ export async function checkMcpLicense() {
23
+ await initializeLicense();
24
+ if (!isFeatureEnabled('mcp')) {
25
+ logger.warn('[@revealui/mcp] MCP server integration requires a Pro or Enterprise license. ' +
26
+ 'Visit https://revealui.com/pricing for details.');
27
+ return false;
28
+ }
29
+ return true;
30
+ }
31
+ // Database adapter
32
+ export { connectPglite, connectPostgres, createMcpDbClient, } from './adapters/db.js';
33
+ // Configuration
34
+ export { getMcpConfig, } from './config/index.js';
35
+ // Contracts (Zod schemas + tool bridging)
36
+ export { agentDefinitionToAgentCard, agentDefinitionToMcpTools, contractsToolDefinitionToMcpTool, MCPAdapterConfigSchema, MCPRequestOptionsSchema, MCPRequestSchema, MCPResponseMetadataSchema, MCPResponseSchema, mcpToolToContractsToolDefinition, } from './contracts.js';
37
+ // Hypervisor: process management + dynamic tool discovery
38
+ export { MCPHypervisor, } from './hypervisor.js';
39
+ // Adapter framework
40
+ export { createMCPAdapter, disposeAllAdapters, generateIdempotencyKey, generateUniqueIdempotencyKey, MCPAdapter, NeonAdapter, StripeAdapter, VercelAdapter, } from './servers/adapter.js';
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAA;AAE5D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,iBAAiB,EAAE,CAAA;IACzB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CACT,+EAA+E;YAC7E,iDAAiD,CACpD,CAAA;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,mBAAmB;AACnB,OAAO,EAGL,aAAa,EACb,eAAe,EACf,iBAAiB,GAGlB,MAAM,kBAAkB,CAAA;AACzB,gBAAgB;AAChB,OAAO,EACL,YAAY,GAGb,MAAM,mBAAmB,CAAA;AAC1B,0CAA0C;AAC1C,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,gCAAgC,EAEhC,sBAAsB,EAGtB,uBAAuB,EACvB,gBAAgB,EAGhB,yBAAyB,EACzB,iBAAiB,EACjB,gCAAgC,GACjC,MAAM,gBAAgB,CAAA;AACvB,0DAA0D;AAC1D,OAAO,EACL,aAAa,GAId,MAAM,iBAAiB,CAAA;AACxB,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,4BAA4B,EAC5B,UAAU,EAEV,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * MCP Adapter - Generic Model Context Protocol Integration
4
+ *
5
+ * Provides a unified interface for all MCP server integrations,
6
+ * eliminating code duplication across different service adapters.
7
+ *
8
+ * Usage:
9
+ * const adapter = new MCPAdapter('vercel', config)
10
+ * await adapter.execute(request)
11
+ */
12
+ /**
13
+ * Dispose all active MCP adapters (cleanup on shutdown)
14
+ */
15
+ export declare function disposeAllAdapters(): void;
16
+ export interface MCPRequest {
17
+ action: string;
18
+ parameters?: Record<string, unknown>;
19
+ options?: {
20
+ timeout?: number;
21
+ retries?: number;
22
+ dryRun?: boolean;
23
+ /** Idempotency key to prevent duplicate operations */
24
+ idempotencyKey?: string;
25
+ /** TTL for idempotency cache in milliseconds (default: 5 minutes) */
26
+ idempotencyTTL?: number;
27
+ };
28
+ }
29
+ export interface MCPResponse {
30
+ success: boolean;
31
+ data?: unknown;
32
+ error?: string;
33
+ metadata?: {
34
+ duration: number;
35
+ retries: number;
36
+ service: string;
37
+ /** Indicates this response was served from idempotency cache */
38
+ cached?: boolean;
39
+ /** The idempotency key that was used */
40
+ idempotencyKey?: string;
41
+ };
42
+ }
43
+ /**
44
+ * In-memory idempotency cache for preventing duplicate operations.
45
+ * Each adapter instance has its own cache.
46
+ */
47
+ declare class IdempotencyCache {
48
+ private cache;
49
+ private cleanupInterval;
50
+ private readonly DEFAULT_TTL;
51
+ constructor();
52
+ /**
53
+ * Get a cached response by idempotency key
54
+ */
55
+ get(key: string): MCPResponse | null;
56
+ /**
57
+ * Store a response with idempotency key
58
+ */
59
+ set(key: string, response: MCPResponse, ttl?: number): void;
60
+ /**
61
+ * Check if a key exists in the cache
62
+ */
63
+ has(key: string): boolean;
64
+ /**
65
+ * Remove expired entries
66
+ */
67
+ private cleanup;
68
+ /**
69
+ * Clear all cached entries
70
+ */
71
+ clear(): void;
72
+ /**
73
+ * Stop the cleanup interval
74
+ */
75
+ dispose(): void;
76
+ /**
77
+ * Get cache statistics
78
+ */
79
+ stats(): {
80
+ size: number;
81
+ keys: string[];
82
+ };
83
+ }
84
+ export interface MCPConfig {
85
+ apiKey?: string;
86
+ baseUrl?: string;
87
+ timeout?: number;
88
+ retries?: number;
89
+ environment?: 'development' | 'production';
90
+ }
91
+ export declare abstract class MCPAdapter {
92
+ protected serviceName: string;
93
+ protected config: MCPConfig;
94
+ protected logger: import("@revealui/scripts").Logger;
95
+ protected idempotencyCache: IdempotencyCache;
96
+ constructor(serviceName: string, config: MCPConfig);
97
+ /**
98
+ * Dispose of adapter resources (cleanup idempotency cache)
99
+ */
100
+ dispose(): void;
101
+ /**
102
+ * Get idempotency cache statistics
103
+ */
104
+ getCacheStats(): {
105
+ size: number;
106
+ keys: string[];
107
+ };
108
+ /**
109
+ * Clear the idempotency cache
110
+ */
111
+ clearCache(): void;
112
+ /**
113
+ * Execute an MCP request
114
+ *
115
+ * If an idempotencyKey is provided in options, the request will be checked
116
+ * against the cache. If a cached response exists, it will be returned
117
+ * immediately. Otherwise, the request will be executed and the response
118
+ * will be cached for future duplicate requests.
119
+ */
120
+ execute(request: MCPRequest): Promise<MCPResponse>;
121
+ /**
122
+ * Validate the incoming request
123
+ */
124
+ protected validateRequest(request: MCPRequest): void;
125
+ /**
126
+ * Check if an action is supported by this adapter
127
+ */
128
+ protected abstract isValidAction(action: string): boolean;
129
+ /**
130
+ * Execute the actual request (implemented by subclasses)
131
+ */
132
+ protected abstract executeRequest(request: MCPRequest): Promise<unknown>;
133
+ /**
134
+ * Create a dry-run response
135
+ */
136
+ protected createDryRunResponse(request: MCPRequest): MCPResponse;
137
+ /**
138
+ * Get authentication headers for API calls
139
+ */
140
+ protected getAuthHeaders(): Record<string, string>;
141
+ /**
142
+ * Get the authentication header name for this service
143
+ */
144
+ protected abstract getAuthHeaderName(): string;
145
+ /**
146
+ * Make an HTTP request with proper error handling
147
+ */
148
+ protected makeRequest(method: 'GET' | 'POST' | 'PUT' | 'DELETE', url: string, data?: unknown): Promise<unknown>;
149
+ }
150
+ export declare class VercelAdapter extends MCPAdapter {
151
+ constructor(config: MCPConfig);
152
+ protected isValidAction(action: string): boolean;
153
+ protected getAuthHeaderName(): string;
154
+ protected executeRequest(request: MCPRequest): Promise<unknown>;
155
+ }
156
+ export declare class StripeAdapter extends MCPAdapter {
157
+ constructor(config: MCPConfig);
158
+ protected isValidAction(action: string): boolean;
159
+ protected getAuthHeaderName(): string;
160
+ protected executeRequest(request: MCPRequest): Promise<unknown>;
161
+ }
162
+ export declare class NeonAdapter extends MCPAdapter {
163
+ constructor(config: MCPConfig);
164
+ protected isValidAction(action: string): boolean;
165
+ protected getAuthHeaderName(): string;
166
+ protected executeRequest(request: MCPRequest): Promise<unknown>;
167
+ }
168
+ export declare function createMCPAdapter(service: string, config: MCPConfig): MCPAdapter;
169
+ /**
170
+ * Generate an idempotency key based on the request content.
171
+ *
172
+ * This creates a deterministic key from the action and parameters,
173
+ * so identical requests will get the same key.
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * const key = generateIdempotencyKey({
178
+ * action: 'deploy',
179
+ * parameters: { projectId: '123' }
180
+ * })
181
+ * // Returns: "deploy:a1b2c3d4e5f6..."
182
+ * ```
183
+ */
184
+ export declare function generateIdempotencyKey(request: MCPRequest): string;
185
+ /**
186
+ * Generate a unique idempotency key with timestamp.
187
+ *
188
+ * Use this when you want each request to be unique but still
189
+ * want idempotency protection against rapid duplicate submissions.
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * const key = generateUniqueIdempotencyKey('deploy')
194
+ * // Returns: "deploy:1706536800000:a1b2c3d4"
195
+ * ```
196
+ */
197
+ export declare function generateUniqueIdempotencyKey(action: string): string;
198
+ export {};
199
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../src/servers/adapter.ts"],"names":[],"mappings":"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"}