@revealui/mcp 0.1.0 → 0.1.3

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/LICENSE +22 -0
  2. package/LICENSE.commercial +111 -0
  3. package/README.md +3 -0
  4. package/dist/{packages/mcp/src/adapters → adapters}/db.d.ts +1 -1
  5. package/dist/adapters/db.d.ts.map +1 -0
  6. package/dist/adapters/db.js.map +1 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js.map +1 -0
  9. package/dist/contracts.d.ts.map +1 -0
  10. package/dist/contracts.js.map +1 -0
  11. package/dist/{packages/mcp/src/hypervisor.d.ts → hypervisor.d.ts} +56 -0
  12. package/dist/hypervisor.d.ts.map +1 -0
  13. package/dist/{packages/mcp/src/hypervisor.js → hypervisor.js} +209 -1
  14. package/dist/hypervisor.js.map +1 -0
  15. package/dist/{packages/mcp/src/index.d.ts → index.d.ts} +9 -5
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/{packages/mcp/src/index.js → index.js} +8 -4
  18. package/dist/index.js.map +1 -0
  19. package/dist/{packages/mcp/src/servers → servers}/adapter.d.ts +11 -1
  20. package/dist/servers/adapter.d.ts.map +1 -0
  21. package/dist/{packages/mcp/src/servers → servers}/adapter.js +20 -4
  22. package/dist/servers/adapter.js.map +1 -0
  23. package/dist/servers/revealui-content.d.ts +21 -0
  24. package/dist/servers/revealui-content.d.ts.map +1 -0
  25. package/dist/servers/revealui-content.js +211 -0
  26. package/dist/servers/revealui-content.js.map +1 -0
  27. package/dist/servers/revealui-email.d.ts +18 -0
  28. package/dist/servers/revealui-email.d.ts.map +1 -0
  29. package/dist/servers/revealui-email.js +190 -0
  30. package/dist/servers/revealui-email.js.map +1 -0
  31. package/dist/servers/revealui-stripe.d.ts +19 -0
  32. package/dist/servers/revealui-stripe.d.ts.map +1 -0
  33. package/dist/servers/revealui-stripe.js +228 -0
  34. package/dist/servers/revealui-stripe.js.map +1 -0
  35. package/package.json +50 -11
  36. package/.env.example +0 -9
  37. package/MCP_MAINTENANCE.md +0 -265
  38. package/__tests__/crdt.integration.test.ts +0 -156
  39. package/configs/README.md +0 -77
  40. package/configs/claude-template.json +0 -54
  41. package/dist/packages/core/src/database/ssl-config.d.ts +0 -9
  42. package/dist/packages/core/src/database/ssl-config.d.ts.map +0 -1
  43. package/dist/packages/core/src/database/ssl-config.js +0 -8
  44. package/dist/packages/core/src/database/ssl-config.js.map +0 -1
  45. package/dist/packages/core/src/features.d.ts +0 -86
  46. package/dist/packages/core/src/features.d.ts.map +0 -1
  47. package/dist/packages/core/src/features.js +0 -93
  48. package/dist/packages/core/src/features.js.map +0 -1
  49. package/dist/packages/core/src/license.d.ts +0 -75
  50. package/dist/packages/core/src/license.d.ts.map +0 -1
  51. package/dist/packages/core/src/license.js +0 -174
  52. package/dist/packages/core/src/license.js.map +0 -1
  53. package/dist/packages/core/src/monitoring/alerts.d.ts +0 -118
  54. package/dist/packages/core/src/monitoring/alerts.d.ts.map +0 -1
  55. package/dist/packages/core/src/monitoring/alerts.js +0 -325
  56. package/dist/packages/core/src/monitoring/alerts.js.map +0 -1
  57. package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +0 -71
  58. package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +0 -1
  59. package/dist/packages/core/src/monitoring/cleanup-manager.js +0 -227
  60. package/dist/packages/core/src/monitoring/cleanup-manager.js.map +0 -1
  61. package/dist/packages/core/src/monitoring/health-monitor.d.ts +0 -22
  62. package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +0 -1
  63. package/dist/packages/core/src/monitoring/health-monitor.js +0 -143
  64. package/dist/packages/core/src/monitoring/health-monitor.js.map +0 -1
  65. package/dist/packages/core/src/monitoring/index.d.ts +0 -14
  66. package/dist/packages/core/src/monitoring/index.d.ts.map +0 -1
  67. package/dist/packages/core/src/monitoring/index.js +0 -18
  68. package/dist/packages/core/src/monitoring/index.js.map +0 -1
  69. package/dist/packages/core/src/monitoring/process-registry.d.ts +0 -97
  70. package/dist/packages/core/src/monitoring/process-registry.d.ts.map +0 -1
  71. package/dist/packages/core/src/monitoring/process-registry.js +0 -223
  72. package/dist/packages/core/src/monitoring/process-registry.js.map +0 -1
  73. package/dist/packages/core/src/monitoring/types.d.ts +0 -231
  74. package/dist/packages/core/src/monitoring/types.d.ts.map +0 -1
  75. package/dist/packages/core/src/monitoring/types.js +0 -43
  76. package/dist/packages/core/src/monitoring/types.js.map +0 -1
  77. package/dist/packages/core/src/monitoring/zombie-detector.d.ts +0 -81
  78. package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +0 -1
  79. package/dist/packages/core/src/monitoring/zombie-detector.js +0 -232
  80. package/dist/packages/core/src/monitoring/zombie-detector.js.map +0 -1
  81. package/dist/packages/core/src/observability/logger.d.ts +0 -47
  82. package/dist/packages/core/src/observability/logger.d.ts.map +0 -1
  83. package/dist/packages/core/src/observability/logger.js +0 -141
  84. package/dist/packages/core/src/observability/logger.js.map +0 -1
  85. package/dist/packages/core/src/utils/logger-server.d.ts +0 -32
  86. package/dist/packages/core/src/utils/logger-server.d.ts.map +0 -1
  87. package/dist/packages/core/src/utils/logger-server.js +0 -69
  88. package/dist/packages/core/src/utils/logger-server.js.map +0 -1
  89. package/dist/packages/core/src/utils/request-context.d.ts +0 -143
  90. package/dist/packages/core/src/utils/request-context.d.ts.map +0 -1
  91. package/dist/packages/core/src/utils/request-context.js +0 -169
  92. package/dist/packages/core/src/utils/request-context.js.map +0 -1
  93. package/dist/packages/dev/src/code-validator/index.d.ts +0 -20
  94. package/dist/packages/dev/src/code-validator/index.d.ts.map +0 -1
  95. package/dist/packages/dev/src/code-validator/index.js +0 -20
  96. package/dist/packages/dev/src/code-validator/index.js.map +0 -1
  97. package/dist/packages/dev/src/code-validator/types.d.ts +0 -67
  98. package/dist/packages/dev/src/code-validator/types.d.ts.map +0 -1
  99. package/dist/packages/dev/src/code-validator/types.js +0 -7
  100. package/dist/packages/dev/src/code-validator/types.js.map +0 -1
  101. package/dist/packages/dev/src/code-validator/validator.d.ts +0 -48
  102. package/dist/packages/dev/src/code-validator/validator.d.ts.map +0 -1
  103. package/dist/packages/dev/src/code-validator/validator.js +0 -176
  104. package/dist/packages/dev/src/code-validator/validator.js.map +0 -1
  105. package/dist/packages/mcp/src/adapters/db.d.ts.map +0 -1
  106. package/dist/packages/mcp/src/adapters/db.js.map +0 -1
  107. package/dist/packages/mcp/src/config/index.d.ts.map +0 -1
  108. package/dist/packages/mcp/src/config/index.js.map +0 -1
  109. package/dist/packages/mcp/src/contracts.d.ts.map +0 -1
  110. package/dist/packages/mcp/src/contracts.js.map +0 -1
  111. package/dist/packages/mcp/src/hypervisor.d.ts.map +0 -1
  112. package/dist/packages/mcp/src/hypervisor.js.map +0 -1
  113. package/dist/packages/mcp/src/index.d.ts.map +0 -1
  114. package/dist/packages/mcp/src/index.js.map +0 -1
  115. package/dist/packages/mcp/src/servers/adapter.d.ts.map +0 -1
  116. package/dist/packages/mcp/src/servers/adapter.js.map +0 -1
  117. package/dist/packages/mcp/src/servers/code-validator.d.ts +0 -24
  118. package/dist/packages/mcp/src/servers/code-validator.d.ts.map +0 -1
  119. package/dist/packages/mcp/src/servers/code-validator.js +0 -156
  120. package/dist/packages/mcp/src/servers/code-validator.js.map +0 -1
  121. package/dist/packages/mcp/src/servers/neon.d.ts +0 -11
  122. package/dist/packages/mcp/src/servers/neon.d.ts.map +0 -1
  123. package/dist/packages/mcp/src/servers/neon.js +0 -90
  124. package/dist/packages/mcp/src/servers/neon.js.map +0 -1
  125. package/dist/packages/mcp/src/servers/next-devtools.d.ts +0 -11
  126. package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +0 -1
  127. package/dist/packages/mcp/src/servers/next-devtools.js +0 -215
  128. package/dist/packages/mcp/src/servers/next-devtools.js.map +0 -1
  129. package/dist/packages/mcp/src/servers/playwright.d.ts +0 -11
  130. package/dist/packages/mcp/src/servers/playwright.d.ts.map +0 -1
  131. package/dist/packages/mcp/src/servers/playwright.js +0 -68
  132. package/dist/packages/mcp/src/servers/playwright.js.map +0 -1
  133. package/dist/packages/mcp/src/servers/stripe.d.ts +0 -11
  134. package/dist/packages/mcp/src/servers/stripe.d.ts.map +0 -1
  135. package/dist/packages/mcp/src/servers/stripe.js +0 -86
  136. package/dist/packages/mcp/src/servers/stripe.js.map +0 -1
  137. package/dist/packages/mcp/src/servers/supabase.d.ts +0 -11
  138. package/dist/packages/mcp/src/servers/supabase.d.ts.map +0 -1
  139. package/dist/packages/mcp/src/servers/supabase.js +0 -144
  140. package/dist/packages/mcp/src/servers/supabase.js.map +0 -1
  141. package/dist/packages/mcp/src/servers/vercel.d.ts +0 -11
  142. package/dist/packages/mcp/src/servers/vercel.d.ts.map +0 -1
  143. package/dist/packages/mcp/src/servers/vercel.js +0 -87
  144. package/dist/packages/mcp/src/servers/vercel.js.map +0 -1
  145. package/dist/packages/mcp/src/servers/vultr-test.d.ts +0 -3
  146. package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +0 -1
  147. package/dist/packages/mcp/src/servers/vultr-test.js +0 -82
  148. package/dist/packages/mcp/src/servers/vultr-test.js.map +0 -1
  149. package/dist/scripts/lib/analyzers/console-analyzer.d.ts +0 -188
  150. package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +0 -1
  151. package/dist/scripts/lib/analyzers/console-analyzer.js +0 -432
  152. package/dist/scripts/lib/analyzers/console-analyzer.js.map +0 -1
  153. package/dist/scripts/lib/analyzers/index.d.ts +0 -11
  154. package/dist/scripts/lib/analyzers/index.d.ts.map +0 -1
  155. package/dist/scripts/lib/analyzers/index.js +0 -11
  156. package/dist/scripts/lib/analyzers/index.js.map +0 -1
  157. package/dist/scripts/lib/args.d.ts +0 -104
  158. package/dist/scripts/lib/args.d.ts.map +0 -1
  159. package/dist/scripts/lib/args.js +0 -304
  160. package/dist/scripts/lib/args.js.map +0 -1
  161. package/dist/scripts/lib/cache.d.ts +0 -185
  162. package/dist/scripts/lib/cache.d.ts.map +0 -1
  163. package/dist/scripts/lib/cache.js +0 -390
  164. package/dist/scripts/lib/cache.js.map +0 -1
  165. package/dist/scripts/lib/cli/dispatch.d.ts +0 -116
  166. package/dist/scripts/lib/cli/dispatch.d.ts.map +0 -1
  167. package/dist/scripts/lib/cli/dispatch.js +0 -206
  168. package/dist/scripts/lib/cli/dispatch.js.map +0 -1
  169. package/dist/scripts/lib/cli/index.d.ts +0 -10
  170. package/dist/scripts/lib/cli/index.d.ts.map +0 -1
  171. package/dist/scripts/lib/cli/index.js +0 -10
  172. package/dist/scripts/lib/cli/index.js.map +0 -1
  173. package/dist/scripts/lib/database/ssl-config.d.ts +0 -26
  174. package/dist/scripts/lib/database/ssl-config.d.ts.map +0 -1
  175. package/dist/scripts/lib/database/ssl-config.js +0 -47
  176. package/dist/scripts/lib/database/ssl-config.js.map +0 -1
  177. package/dist/scripts/lib/errors.d.ts +0 -218
  178. package/dist/scripts/lib/errors.d.ts.map +0 -1
  179. package/dist/scripts/lib/errors.js +0 -543
  180. package/dist/scripts/lib/errors.js.map +0 -1
  181. package/dist/scripts/lib/exec.d.ts +0 -107
  182. package/dist/scripts/lib/exec.d.ts.map +0 -1
  183. package/dist/scripts/lib/exec.js +0 -232
  184. package/dist/scripts/lib/exec.js.map +0 -1
  185. package/dist/scripts/lib/index.d.ts +0 -50
  186. package/dist/scripts/lib/index.d.ts.map +0 -1
  187. package/dist/scripts/lib/index.js +0 -65
  188. package/dist/scripts/lib/index.js.map +0 -1
  189. package/dist/scripts/lib/logger.d.ts +0 -50
  190. package/dist/scripts/lib/logger.d.ts.map +0 -1
  191. package/dist/scripts/lib/logger.js +0 -159
  192. package/dist/scripts/lib/logger.js.map +0 -1
  193. package/dist/scripts/lib/output.d.ts +0 -149
  194. package/dist/scripts/lib/output.d.ts.map +0 -1
  195. package/dist/scripts/lib/output.js +0 -263
  196. package/dist/scripts/lib/output.js.map +0 -1
  197. package/dist/scripts/lib/parallel.d.ts +0 -164
  198. package/dist/scripts/lib/parallel.d.ts.map +0 -1
  199. package/dist/scripts/lib/parallel.js +0 -355
  200. package/dist/scripts/lib/parallel.js.map +0 -1
  201. package/dist/scripts/lib/paths.d.ts +0 -92
  202. package/dist/scripts/lib/paths.d.ts.map +0 -1
  203. package/dist/scripts/lib/paths.js +0 -171
  204. package/dist/scripts/lib/paths.js.map +0 -1
  205. package/dist/scripts/lib/state/adapters/memory.d.ts +0 -42
  206. package/dist/scripts/lib/state/adapters/memory.d.ts.map +0 -1
  207. package/dist/scripts/lib/state/adapters/memory.js +0 -110
  208. package/dist/scripts/lib/state/adapters/memory.js.map +0 -1
  209. package/dist/scripts/lib/state/adapters/pglite.d.ts +0 -46
  210. package/dist/scripts/lib/state/adapters/pglite.d.ts.map +0 -1
  211. package/dist/scripts/lib/state/adapters/pglite.js +0 -256
  212. package/dist/scripts/lib/state/adapters/pglite.js.map +0 -1
  213. package/dist/scripts/lib/state/index.d.ts +0 -16
  214. package/dist/scripts/lib/state/index.d.ts.map +0 -1
  215. package/dist/scripts/lib/state/index.js +0 -16
  216. package/dist/scripts/lib/state/index.js.map +0 -1
  217. package/dist/scripts/lib/state/types.d.ts +0 -111
  218. package/dist/scripts/lib/state/types.d.ts.map +0 -1
  219. package/dist/scripts/lib/state/types.js +0 -8
  220. package/dist/scripts/lib/state/types.js.map +0 -1
  221. package/dist/scripts/lib/state/workflow-state.d.ts +0 -110
  222. package/dist/scripts/lib/state/workflow-state.d.ts.map +0 -1
  223. package/dist/scripts/lib/state/workflow-state.js +0 -331
  224. package/dist/scripts/lib/state/workflow-state.js.map +0 -1
  225. package/dist/scripts/lib/telemetry.d.ts +0 -194
  226. package/dist/scripts/lib/telemetry.d.ts.map +0 -1
  227. package/dist/scripts/lib/telemetry.js +0 -394
  228. package/dist/scripts/lib/telemetry.js.map +0 -1
  229. package/dist/scripts/lib/utils.d.ts +0 -270
  230. package/dist/scripts/lib/utils.d.ts.map +0 -1
  231. package/dist/scripts/lib/utils.js +0 -473
  232. package/dist/scripts/lib/utils.js.map +0 -1
  233. package/dist/scripts/lib/validation/database.d.ts +0 -83
  234. package/dist/scripts/lib/validation/database.d.ts.map +0 -1
  235. package/dist/scripts/lib/validation/database.js +0 -199
  236. package/dist/scripts/lib/validation/database.js.map +0 -1
  237. package/dist/scripts/lib/validation/env.d.ts +0 -80
  238. package/dist/scripts/lib/validation/env.d.ts.map +0 -1
  239. package/dist/scripts/lib/validation/env.js +0 -246
  240. package/dist/scripts/lib/validation/env.js.map +0 -1
  241. package/dist/scripts/lib/validation/index.d.ts +0 -16
  242. package/dist/scripts/lib/validation/index.d.ts.map +0 -1
  243. package/dist/scripts/lib/validation/index.js +0 -16
  244. package/dist/scripts/lib/validation/index.js.map +0 -1
  245. package/dist/scripts/lib/validation/post-execution.d.ts +0 -74
  246. package/dist/scripts/lib/validation/post-execution.d.ts.map +0 -1
  247. package/dist/scripts/lib/validation/post-execution.js +0 -110
  248. package/dist/scripts/lib/validation/post-execution.js.map +0 -1
  249. package/dist/scripts/lib/validation/pre-execution.d.ts +0 -165
  250. package/dist/scripts/lib/validation/pre-execution.d.ts.map +0 -1
  251. package/dist/scripts/lib/validation/pre-execution.js +0 -466
  252. package/dist/scripts/lib/validation/pre-execution.js.map +0 -1
  253. package/dist/scripts/lib/validators/documentation-validator.d.ts +0 -242
  254. package/dist/scripts/lib/validators/documentation-validator.d.ts.map +0 -1
  255. package/dist/scripts/lib/validators/documentation-validator.js +0 -584
  256. package/dist/scripts/lib/validators/documentation-validator.js.map +0 -1
  257. package/dist/scripts/lib/validators/index.d.ts +0 -11
  258. package/dist/scripts/lib/validators/index.d.ts.map +0 -1
  259. package/dist/scripts/lib/validators/index.js +0 -11
  260. package/dist/scripts/lib/validators/index.js.map +0 -1
  261. package/docker-compose.yml +0 -46
  262. package/docs/INDEX.md +0 -88
  263. package/docs/README.md +0 -774
  264. package/docs/SETUP.md +0 -264
  265. package/docs/servers/code-validator.md +0 -586
  266. package/eslint.config.js +0 -7
  267. package/migrations/0001_add_crdt_columns.sql +0 -8
  268. package/migrations/0001_rollback.sql +0 -6
  269. package/migrations/005_performance_indexes.sql +0 -190
  270. package/migrations/backfill_crdt_meta.js +0 -45
  271. package/src/__tests__/hypervisor.test.ts +0 -212
  272. package/src/adapters/db.ts +0 -180
  273. package/src/config/config.json +0 -49
  274. package/src/config/index.ts +0 -30
  275. package/src/contracts.ts +0 -221
  276. package/src/hypervisor.ts +0 -464
  277. package/src/index.ts +0 -87
  278. package/src/servers/adapter.ts +0 -643
  279. package/src/servers/code-validator.ts +0 -188
  280. package/src/servers/neon.ts +0 -103
  281. package/src/servers/next-devtools.ts +0 -230
  282. package/src/servers/playwright.ts +0 -77
  283. package/src/servers/stripe.ts +0 -99
  284. package/src/servers/supabase.ts +0 -161
  285. package/src/servers/vercel.ts +0 -100
  286. package/src/servers/vultr-test.ts +0 -97
  287. package/tsconfig.json +0 -12
  288. package/vitest.config.ts +0 -22
  289. /package/dist/{packages/mcp/src/adapters → adapters}/db.js +0 -0
  290. /package/dist/{packages/mcp/src/config → config}/index.d.ts +0 -0
  291. /package/dist/{packages/mcp/src/config → config}/index.js +0 -0
  292. /package/dist/{packages/mcp/src/contracts.d.ts → contracts.d.ts} +0 -0
  293. /package/dist/{packages/mcp/src/contracts.js → contracts.js} +0 -0
@@ -0,0 +1,228 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * RevealUI Stripe MCP Server
4
+ *
5
+ * Model Context Protocol server that exposes Stripe payment management tools
6
+ * scoped to RevealUI's subscription model. Gives AI agents structured access
7
+ * to customer, subscription, and payment intent data in RevealUI's Stripe account.
8
+ *
9
+ * Environment:
10
+ * STRIPE_SECRET_KEY — Stripe secret key (sk_live_... or sk_test_...)
11
+ *
12
+ * Tools:
13
+ * stripe_create_payment_intent — Create a one-time payment intent
14
+ * stripe_list_customers — List customers, with optional email filter
15
+ * stripe_get_customer — Fetch a customer and their active subscription
16
+ * stripe_list_subscriptions — List subscriptions (all or by customer/status)
17
+ */
18
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
19
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
20
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
21
+ import { logger } from '@revealui/core/observability/logger';
22
+ import { checkMcpLicense } from '../index.js';
23
+ // ---------------------------------------------------------------------------
24
+ // Stripe REST helpers
25
+ // ---------------------------------------------------------------------------
26
+ const STRIPE_BASE = 'https://api.stripe.com/v1';
27
+ function stripeHeaders(secretKey) {
28
+ return {
29
+ Authorization: `Bearer ${secretKey}`,
30
+ 'Content-Type': 'application/x-www-form-urlencoded',
31
+ 'Stripe-Version': '2025-03-31.basil',
32
+ 'User-Agent': 'RevealUI-MCP/1.0',
33
+ };
34
+ }
35
+ async function stripeGet(path, secretKey, params) {
36
+ const url = new URL(`${STRIPE_BASE}${path}`);
37
+ if (params) {
38
+ for (const [k, v] of Object.entries(params))
39
+ url.searchParams.set(k, v);
40
+ }
41
+ const res = await fetch(url.toString(), { headers: stripeHeaders(secretKey) });
42
+ const body = await res.json();
43
+ if (!res.ok)
44
+ throw new Error(body.error?.message ?? `Stripe ${res.status}`);
45
+ return body;
46
+ }
47
+ async function stripePost(path, secretKey, data) {
48
+ const res = await fetch(`${STRIPE_BASE}${path}`, {
49
+ method: 'POST',
50
+ headers: stripeHeaders(secretKey),
51
+ body: new URLSearchParams(data).toString(),
52
+ });
53
+ const body = await res.json();
54
+ if (!res.ok)
55
+ throw new Error(body.error?.message ?? `Stripe ${res.status}`);
56
+ return body;
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Server
60
+ // ---------------------------------------------------------------------------
61
+ const server = new Server({ name: 'revealui-stripe', version: '1.0.0' }, { capabilities: { tools: {} } });
62
+ const TOOLS = [
63
+ {
64
+ name: 'stripe_create_payment_intent',
65
+ description: 'Create a Stripe PaymentIntent for a one-time charge in RevealUI. ' +
66
+ 'Amount is in the smallest currency unit (cents for USD).',
67
+ inputSchema: {
68
+ type: 'object',
69
+ properties: {
70
+ amount: {
71
+ type: 'number',
72
+ description: 'Amount in smallest currency unit (e.g. 2999 = $29.99)',
73
+ },
74
+ currency: {
75
+ type: 'string',
76
+ description: 'ISO 4217 currency code (default: usd)',
77
+ default: 'usd',
78
+ },
79
+ customer_id: { type: 'string', description: 'Stripe customer ID to attach the payment to' },
80
+ description: { type: 'string', description: 'Human-readable description of the charge' },
81
+ },
82
+ required: ['amount'],
83
+ },
84
+ },
85
+ {
86
+ name: 'stripe_list_customers',
87
+ description: 'List Stripe customers in the RevealUI account. Optionally filter by email.',
88
+ inputSchema: {
89
+ type: 'object',
90
+ properties: {
91
+ email: { type: 'string', description: 'Filter by exact email address' },
92
+ limit: {
93
+ type: 'number',
94
+ description: 'Number of results (1-100, default: 20)',
95
+ default: 20,
96
+ },
97
+ },
98
+ },
99
+ },
100
+ {
101
+ name: 'stripe_get_customer',
102
+ description: 'Fetch a Stripe customer by ID, including their active RevealUI subscription tier.',
103
+ inputSchema: {
104
+ type: 'object',
105
+ properties: {
106
+ customer_id: { type: 'string', description: 'Stripe customer ID (cus_...)' },
107
+ },
108
+ required: ['customer_id'],
109
+ },
110
+ },
111
+ {
112
+ name: 'stripe_list_subscriptions',
113
+ description: 'List Stripe subscriptions for RevealUI. Can filter by customer and/or status.',
114
+ inputSchema: {
115
+ type: 'object',
116
+ properties: {
117
+ customer_id: { type: 'string', description: 'Filter to a specific customer (cus_...)' },
118
+ status: {
119
+ type: 'string',
120
+ description: 'Filter by status: active, canceled, past_due, trialing, all (default: active)',
121
+ default: 'active',
122
+ },
123
+ limit: {
124
+ type: 'number',
125
+ description: 'Number of results (1-100, default: 20)',
126
+ default: 20,
127
+ },
128
+ },
129
+ },
130
+ },
131
+ ];
132
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
133
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
134
+ const secretKey = process.env.STRIPE_SECRET_KEY;
135
+ if (!secretKey) {
136
+ return {
137
+ content: [{ type: 'text', text: 'Error: STRIPE_SECRET_KEY is not set' }],
138
+ isError: true,
139
+ };
140
+ }
141
+ try {
142
+ switch (request.params.name) {
143
+ case 'stripe_create_payment_intent': {
144
+ const { amount, currency = 'usd', customer_id, description, } = request.params.arguments;
145
+ const data = {
146
+ amount: String(Math.round(amount)),
147
+ currency,
148
+ };
149
+ if (customer_id)
150
+ data.customer = customer_id;
151
+ if (description)
152
+ data.description = description;
153
+ const intent = await stripePost('/payment_intents', secretKey, data);
154
+ return {
155
+ content: [{ type: 'text', text: JSON.stringify(intent, null, 2) }],
156
+ };
157
+ }
158
+ case 'stripe_list_customers': {
159
+ const { email, limit = 20 } = request.params.arguments;
160
+ const params = { limit: String(Math.min(limit, 100)) };
161
+ if (email)
162
+ params.email = email;
163
+ const result = await stripeGet('/customers', secretKey, params);
164
+ return {
165
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
166
+ };
167
+ }
168
+ case 'stripe_get_customer': {
169
+ const { customer_id } = request.params.arguments;
170
+ const [customer, subscriptions] = await Promise.all([
171
+ stripeGet(`/customers/${customer_id}`, secretKey),
172
+ stripeGet('/subscriptions', secretKey, {
173
+ customer: customer_id,
174
+ status: 'active',
175
+ limit: '5',
176
+ 'expand[]': 'data.items.data.price.product',
177
+ }),
178
+ ]);
179
+ return {
180
+ content: [
181
+ {
182
+ type: 'text',
183
+ text: JSON.stringify({ customer, subscriptions }, null, 2),
184
+ },
185
+ ],
186
+ };
187
+ }
188
+ case 'stripe_list_subscriptions': {
189
+ const { customer_id, status = 'active', limit = 20, } = request.params.arguments;
190
+ const params = {
191
+ limit: String(Math.min(limit, 100)),
192
+ status,
193
+ };
194
+ if (customer_id)
195
+ params.customer = customer_id;
196
+ const result = await stripeGet('/subscriptions', secretKey, params);
197
+ return {
198
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
199
+ };
200
+ }
201
+ default:
202
+ return {
203
+ content: [{ type: 'text', text: `Error: Unknown tool: ${request.params.name}` }],
204
+ isError: true,
205
+ };
206
+ }
207
+ }
208
+ catch (err) {
209
+ return {
210
+ content: [
211
+ { type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
212
+ ],
213
+ isError: true,
214
+ };
215
+ }
216
+ });
217
+ async function main() {
218
+ if (!(await checkMcpLicense())) {
219
+ process.exit(1);
220
+ }
221
+ const transport = new StdioServerTransport();
222
+ await server.connect(transport);
223
+ }
224
+ main().catch((err) => {
225
+ logger.error('RevealUI Stripe MCP error', err instanceof Error ? err : new Error(String(err)));
226
+ process.exit(1);
227
+ });
228
+ //# sourceMappingURL=revealui-stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revealui-stripe.js","sourceRoot":"","sources":["../../src/servers/revealui-stripe.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,32 +1,71 @@
1
1
  {
2
2
  "name": "@revealui/mcp",
3
- "version": "0.1.0",
4
- "license": "SEE LICENSE IN ../../LICENSE.commercial",
3
+ "version": "0.1.3",
4
+ "description": "Model Context Protocol integrations for RevealUI — adapter framework, hypervisor, and MCP contracts",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/RevealUIStudio/revealui.git",
8
+ "directory": "packages/mcp"
9
+ },
10
+ "license": "MIT",
5
11
  "dependencies": {
6
12
  "@modelcontextprotocol/sdk": "^1.26.0",
7
13
  "dotenv": "^17.2.4",
8
- "@revealui/config": "0.2.0",
9
- "@revealui/contracts": "1.0.0",
10
- "@revealui/scripts": "0.1.0",
11
- "@revealui/core": "0.2.0"
14
+ "@revealui/config": "0.3.0",
15
+ "@revealui/core": "0.5.0",
16
+ "@revealui/contracts": "1.3.1"
12
17
  },
13
18
  "devDependencies": {
14
- "@electric-sql/pglite": "^0.3.15",
19
+ "@electric-sql/pglite": "^0.4.2",
15
20
  "pg": "^8.18.0",
16
- "typescript": "^5.9.3",
21
+ "typescript": "^6.0.2",
17
22
  "vitest": "^4.0.18"
18
23
  },
19
- "type": "module",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ },
29
+ "./adapter": {
30
+ "types": "./dist/servers/adapter.d.ts",
31
+ "import": "./dist/servers/adapter.js"
32
+ },
33
+ "./contracts": {
34
+ "types": "./dist/contracts.d.ts",
35
+ "import": "./dist/contracts.js"
36
+ },
37
+ "./hypervisor": {
38
+ "types": "./dist/hypervisor.d.ts",
39
+ "import": "./dist/hypervisor.js"
40
+ },
41
+ "./db": {
42
+ "types": "./dist/adapters/db.d.ts",
43
+ "import": "./dist/adapters/db.js"
44
+ },
45
+ "./config": {
46
+ "types": "./dist/config/index.d.ts",
47
+ "import": "./dist/config/index.js"
48
+ }
49
+ },
50
+ "files": [
51
+ "dist"
52
+ ],
53
+ "funding": {
54
+ "type": "commercial",
55
+ "url": "https://revealui.com/pro"
56
+ },
57
+ "main": "./dist/index.js",
20
58
  "publishConfig": {
21
- "registry": "https://registry.npmjs.org",
22
59
  "access": "public"
23
60
  },
61
+ "type": "module",
62
+ "types": "./dist/index.d.ts",
24
63
  "scripts": {
25
64
  "build": "tsc",
26
65
  "clean": "rm -rf dist",
27
66
  "dev": "tsc --watch",
28
67
  "lint": "biome check .",
29
- "test": "vitest run",
68
+ "test": "vitest run --passWithNoTests",
30
69
  "typecheck": "tsc --noEmit"
31
70
  }
32
71
  }
package/.env.example DELETED
@@ -1,9 +0,0 @@
1
- MCP_PERSISTENCE_DRIVER=pglite
2
- ELECTRIC_DATABASE_URL=postgres://dev:dev@localhost:5432/revealui_mcp
3
- ELECTRIC_API_KEY=replace-me
4
- MCP_METRICS_MODE=logs
5
- PGVECTOR_ENABLED=false
6
-
7
- # Notes:
8
- # - Do NOT commit real credentials. Store real secrets in CI/Vault.
9
- # - Set `PGVECTOR_ENABLED=true` when using local Postgres with pgvector for vector testing.
@@ -1,265 +0,0 @@
1
- # MCP Maintenance Guide
2
-
3
- This document consolidates all MCP-related maintenance information including CRDT audit strategy, key decisions, migration procedures, and metrics/observability approach.
4
-
5
- ---
6
-
7
- ## Table of Contents
8
-
9
- 1. [Decision Log](#decision-log)
10
- 2. [CRDT Audit](#crdt-audit)
11
- 3. [Migration Checklist](#migration-checklist)
12
- 4. [Metrics & Observability](#metrics--observability)
13
-
14
- ---
15
-
16
- ## Decision Log
17
-
18
- ### MCP Decision — pglite (ElectricSQL) + Logs‑First Metrics
19
-
20
- **TL;DR** — Default to ElectricSQL (`pglite`) for local development to get Postgres parity, CRDT sync, and smooth production migration. Start observability with a logs‑first approach (`MCP_METRICS_MODE=logs`). Provide a documented migration path to managed Postgres + `pgvector` for production, and TODOs to add Prometheus + Grafana later.
21
-
22
- #### Why `pglite` (ElectricSQL)
23
-
24
- - Local Postgres parity: preserves SQL semantics developers expect while providing Electric sync.
25
- - CRDT & sync primitives: built-in conflict resolution and metadata for replicated state.
26
- - Smooth prod path: same logical model maps to managed Postgres (Neon / Supabase) with minimal code changes.
27
-
28
- #### Default configuration
29
-
30
- - `MCP_PERSISTENCE_DRIVER=pglite` (dev default)
31
- - `ELECTRIC_DATABASE_URL=` (placeholder for local pglite path/URL)
32
- - `MCP_METRICS_MODE=logs`
33
-
34
- #### Local vector testing
35
-
36
- - Use a compose variant with local Postgres + `pgvector` when testing vector queries or index behavior. `pglite` remains the default for state and CRDT behavior.
37
-
38
- #### Security stance
39
-
40
- - Never commit credentials. Use `packages/mcp/.env.example` with placeholders only.
41
- - Store `ELECTRIC_DATABASE_URL`, `ELECTRIC_API_KEY`, `PROD_DATABASE_URL` in CI secrets or Vault for staging/prod.
42
-
43
- #### Migration path (dev → prod)
44
-
45
- - Dev: `pglite` (local ElectricSQL)
46
- - Stage: Local Postgres with `pgvector` + Electric sync metadata
47
- - Prod: Managed Postgres (enable `pgvector`), Electric sync metadata preserved
48
-
49
- (See [Migration Checklist](#migration-checklist) section for a detailed plan.)
50
-
51
- #### Observability
52
-
53
- - Start with logs-first metrics (Option C). Emit structured log events for conflicts, merges, and error rates.
54
- - TODO: add Prometheus + Grafana manifests under `packages/mcp/k8s/` when operational budget permits.
55
-
56
- #### TODOs (short)
57
-
58
- - Add `packages/mcp/docker-compose.yml` with `pglite` dev service and `postgres+pgvector` variant.
59
- - Add `packages/mcp/src/adapters/db.ts` with `connectPglite()` / `connectPostgres()`.
60
- - Add CRDT migrations & backfill scripts.
61
- - Add integration tests that spin up compose and validate CRDT merges.
62
- - Add `packages/mcp/metrics.md` (logs-first) and TODOs for Option A (Prometheus + Grafana).
63
-
64
- ---
65
-
66
- ## CRDT Audit
67
-
68
- ### CRDT Audit — Candidate Entities & Strategy
69
-
70
- **Goal** — ensure all replicated, collaborative, or concurrent state uses CRDT semantics to avoid manual conflict resolution.
71
-
72
- #### Scope
73
-
74
- - Applies to MCP persistence: local `pglite` (dev) and managed Postgres (prod).
75
- - Targets entity categories that are concurrently updated or replicated.
76
-
77
- #### Candidate entities and recommended CRDT types
78
-
79
- - `documents` / `shared_documents`
80
- - Use: collaborative edits
81
- - CRDT: delta CRDT (RGA / JSON CRDT / operation-based)
82
- - Policy: preserve operations and causal order
83
- - `subscription_state` / `cursors`
84
- - Use: client offsets, cursors
85
- - CRDT: LWW register or monotonic counter
86
- - Policy: LWW with server-side monotonic enforcement where possible
87
- - `presence` / `ephemeral_status`
88
- - Use: frequent transient updates
89
- - CRDT: OR-Set with TTL or presence map
90
- - Policy: TTL-based garbage collection
91
- - `message_ack` / `delivered_acks`
92
- - Use: dedup across replicas
93
- - CRDT: OR-Set or G-Set with tombstones
94
- - Policy: idempotent ack addition, compact tombstones periodically
95
- - `user_settings` / `shared_settings`
96
- - Use: small multi-client updates
97
- - CRDT: observed-remove map / JSON CRDT
98
- - Policy: field-level merge, operator override protected
99
-
100
- #### Implementation notes
101
-
102
- - Adapter responsibilities:
103
- - `connectPglite()` should declare CRDT columns via Electric APIs (where available).
104
- - `connectPostgres()` must keep Electric metadata columns and map CRDT metadata to Postgres-compatible storage.
105
- - Schema:
106
- - Add `_electric_meta` or `_crdt_meta` columns near payloads.
107
- - Store operation deltas if possible for efficient merges.
108
- - Rollout:
109
- - Feature-flag per-entity CRDT enablement for staged rollout.
110
- - Small-sample backfills prior to full backfill.
111
- - Storage & compaction:
112
- - Implement delta compaction for large-delta CRDTs.
113
- - Schedule periodic compaction jobs to remove tombstones and shrink op logs.
114
-
115
- #### Testing
116
-
117
- - Unit tests: CRDT op merges for each primitive (OR-Set, PNCounter, LWW register).
118
- - Integration tests: concurrent writers with `pglite` stack asserting deterministic merged state.
119
- - Migration tests: backfill scripts run on sample data and validate checksum diffs.
120
-
121
- #### Risk & mitigation
122
-
123
- - Existing payload types incompatible with CRDT fields — use non-destructive migrations and backfill.
124
- - Vector index (pgvector) mapping must be preserved during schema changes — treat embedding columns as orthogonal.
125
-
126
- #### Suggested tests to add
127
-
128
- - `packages/mcp/__tests__/crdt.unit.test.ts` — unit semantics.
129
- - `packages/mcp/__tests__/crdt.integration.test.ts` — compose-based concurrent writes.
130
-
131
- ---
132
-
133
- ## Migration Checklist
134
-
135
- ### MCP Migration Checklist — pglite → Managed Postgres + pgvector
136
-
137
- **Goal** — safely cut over from `pglite` dev workflows to managed Postgres in production while preserving CRDT semantics and vector index integrity.
138
-
139
- #### Pre‑reqs
140
-
141
- - Staging Postgres provisioned with `pgvector` enabled.
142
- - Backups and CI/Vault secrets available: `ELECTRIC_DATABASE_URL`, `ELECTRIC_API_KEY`, `PROD_DATABASE_URL`.
143
- - Smoke test harness and CRDT integration tests present.
144
-
145
- #### Ordered checklist
146
-
147
- 1. **Backup source DB**
148
- ```bash
149
- pg_dump -Fc -f backup.before.mcp.dump "$CURRENT_DB_URL"
150
- ```
151
-
152
- 2. **Provision staging DB with `pgvector`**
153
- ```sql
154
- CREATE EXTENSION IF NOT EXISTS vector;
155
- ```
156
-
157
- 3. **Apply schema migrations to staging (include CRDT metadata columns)**
158
- - Add migration files: `packages/mcp/migrations/0001_add_crdt_columns.sql` and rollback script.
159
-
160
- 4. **Small backfill (sample subset)**
161
- - Run `packages/mcp/migrations/backfill_crdt_meta.js` for representative rows; validate merges.
162
-
163
- 5. **Run integration smoke tests**
164
- - Execute CRDT integration test suite against staging.
165
-
166
- 6. **Export/import full snapshot (if migrating data)**
167
- ```bash
168
- pg_restore -d "$STAGING_DB_URL" backup.before.mcp.dump
169
- ```
170
-
171
- 7. **Create `pgvector` indexes (maintenance window suggested)**
172
- ```sql
173
- CREATE EXTENSION IF NOT EXISTS vector;
174
- CREATE INDEX IF NOT EXISTS documents_embedding_idx ON documents USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
175
- ```
176
-
177
- 8. **Full backfill & compaction**
178
- - Run full backfill; compact delta-CRDT ops as needed.
179
-
180
- 9. **Switch app config (canary first)**
181
- - Set `MCP_PERSISTENCE_DRIVER=postgres`
182
- - Update `ELECTRIC_DATABASE_URL` to prod managed DB via secrets
183
-
184
- 10. **Canary / canary tests**
185
- - Route small traffic, monitor conflict events and query correctness.
186
-
187
- 11. **Full cutover**
188
- - Promote config change to all instances.
189
-
190
- 12. **Post-migration validation**
191
- - Run full test suite, verify vector results, verify merge/conflict telemetry.
192
-
193
- 13. **Rollback readiness**
194
- ```bash
195
- pg_restore -d "$PROD_DB_URL" backup.before.mcp.dump
196
- ```
197
-
198
- #### Operational notes
199
-
200
- - Prefer online migration with feature flags and small maintenance windows for index builds.
201
- - Validate checksums and sample-row diffs after every major migration step.
202
- - Keep rollback scripts next to each migration file.
203
-
204
- ---
205
-
206
- ## Metrics & Observability
207
-
208
- ### MCP Metrics & Observability — Logs‑First (Option C)
209
-
210
- #### Decision
211
-
212
- - Start with logs-first metrics to avoid hosted monitoring costs and reduce infra.
213
- - Emit structured logs for conflicts, merges, errors, and key latencies.
214
- - Provide clear TODOs and skeletons to add Prometheus + Grafana later.
215
-
216
- #### Env & modes
217
-
218
- - `MCP_METRICS_MODE=logs` (default)
219
- - Other modes: `otel` (collector), `prometheus` (future Option A)
220
-
221
- #### Structured log schema (recommended JSON fields)
222
-
223
- - `timestamp`
224
- - `service = "mcp"`
225
- - `event` = `conflict|merge|error|operation`
226
- - `entity` = `documents|cursors|presence|...`
227
- - `entity_id`
228
- - `op_type` = `write|merge|backfill|index`
229
- - `details` = short summary
230
- - `duration_ms`
231
- - `trace_id` (optional)
232
-
233
- #### Conflict/merge logging example (concept)
234
-
235
- - Log a `conflict` event when CRDT merge produces non-trivial resolution; include `before`, `ops_count`, `merged_summary`.
236
-
237
- #### Log collection options (free)
238
-
239
- - Use file logs + `loki` (self-hosted) and Grafana Loki datasource for queries (both OSS).
240
- - Or aggregate logs to a central file/CI artifact and analyze with `rg`/`jq` for small teams.
241
-
242
- #### Quick local setup (suggested)
243
-
244
- - Start compose with `loki` (optional) to collect logs, or rely on local file logs.
245
- ```bash
246
- docker-compose -f packages/mcp/docker-compose.yml up -d loki
247
- ```
248
-
249
- #### TODOs for Option A (Prometheus + Grafana)
250
-
251
- - Add `packages/mcp/k8s/` manifests and Helm chart scaffolding for Prometheus exporters and Grafana dashboards.
252
- - Instrument code with Prometheus client metrics (conflict counters, merge latencies).
253
- - Add dashboards and alert rules for high conflict rates.
254
-
255
- #### Implementation guidance
256
-
257
- - Implement `packages/mcp/src/telemetry.ts` that:
258
- - Emits structured logs for every conflict/merge.
259
- - In `MCP_METRICS_MODE=logs`, write JSON lines to stdout and rotate to file if needed.
260
- - Provide quick grep/jq scripts in `packages/mcp/` to extract conflict rates.
261
-
262
- #### Security & privacy
263
-
264
- - Avoid logging sensitive payloads (mask user PII).
265
- - Keep telemetry ingestion endpoints protected; local logs are preferred during dev.