@revealui/mcp 0.1.1 → 0.1.5

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 (83) hide show
  1. package/LICENSE.commercial +2 -3
  2. package/dist/adapters/db.d.ts +1 -1
  3. package/dist/adapters/db.d.ts.map +1 -1
  4. package/dist/adapters/db.js.map +1 -1
  5. package/dist/auth.d.ts +42 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +73 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/config/index.d.ts.map +1 -1
  10. package/dist/config/index.js.map +1 -1
  11. package/dist/contracts.d.ts +36 -0
  12. package/dist/contracts.d.ts.map +1 -1
  13. package/dist/contracts.js +44 -0
  14. package/dist/contracts.js.map +1 -1
  15. package/dist/hypervisor.d.ts +63 -0
  16. package/dist/hypervisor.d.ts.map +1 -1
  17. package/dist/hypervisor.js +287 -4
  18. package/dist/hypervisor.js.map +1 -1
  19. package/dist/index.d.ts +22 -7
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +26 -5
  22. package/dist/index.js.map +1 -1
  23. package/dist/pipeline.d.ts +62 -0
  24. package/dist/pipeline.d.ts.map +1 -0
  25. package/dist/pipeline.js +230 -0
  26. package/dist/pipeline.js.map +1 -0
  27. package/dist/rate-limiter.d.ts +53 -0
  28. package/dist/rate-limiter.d.ts.map +1 -0
  29. package/dist/rate-limiter.js +96 -0
  30. package/dist/rate-limiter.js.map +1 -0
  31. package/dist/servers/_launcher-utils.d.ts +28 -0
  32. package/dist/servers/_launcher-utils.d.ts.map +1 -0
  33. package/dist/servers/_launcher-utils.js +45 -0
  34. package/dist/servers/_launcher-utils.js.map +1 -0
  35. package/dist/servers/adapter.d.ts +22 -6
  36. package/dist/servers/adapter.d.ts.map +1 -1
  37. package/dist/servers/adapter.js +53 -22
  38. package/dist/servers/adapter.js.map +1 -1
  39. package/dist/servers/neon.d.ts +15 -0
  40. package/dist/servers/neon.d.ts.map +1 -0
  41. package/dist/servers/neon.js +89 -0
  42. package/dist/servers/neon.js.map +1 -0
  43. package/dist/servers/next-devtools.d.ts +15 -0
  44. package/dist/servers/next-devtools.d.ts.map +1 -0
  45. package/dist/servers/next-devtools.js +220 -0
  46. package/dist/servers/next-devtools.js.map +1 -0
  47. package/dist/servers/playwright.d.ts +15 -0
  48. package/dist/servers/playwright.d.ts.map +1 -0
  49. package/dist/servers/playwright.js +73 -0
  50. package/dist/servers/playwright.js.map +1 -0
  51. package/dist/servers/revealui-content.d.ts +5 -1
  52. package/dist/servers/revealui-content.d.ts.map +1 -1
  53. package/dist/servers/revealui-content.js +62 -20
  54. package/dist/servers/revealui-content.js.map +1 -1
  55. package/dist/servers/revealui-email.d.ts +5 -1
  56. package/dist/servers/revealui-email.d.ts.map +1 -1
  57. package/dist/servers/revealui-email.js +47 -12
  58. package/dist/servers/revealui-email.js.map +1 -1
  59. package/dist/servers/revealui-stripe.d.ts +5 -1
  60. package/dist/servers/revealui-stripe.d.ts.map +1 -1
  61. package/dist/servers/revealui-stripe.js +68 -33
  62. package/dist/servers/revealui-stripe.js.map +1 -1
  63. package/dist/servers/stripe.d.ts +15 -0
  64. package/dist/servers/stripe.d.ts.map +1 -0
  65. package/dist/servers/stripe.js +85 -0
  66. package/dist/servers/stripe.js.map +1 -0
  67. package/dist/servers/supabase.d.ts +15 -0
  68. package/dist/servers/supabase.d.ts.map +1 -0
  69. package/dist/servers/supabase.js +143 -0
  70. package/dist/servers/supabase.js.map +1 -0
  71. package/dist/servers/vercel.d.ts +15 -0
  72. package/dist/servers/vercel.d.ts.map +1 -0
  73. package/dist/servers/vercel.js +86 -0
  74. package/dist/servers/vercel.js.map +1 -0
  75. package/dist/stores/postgres-idempotency.d.ts +32 -0
  76. package/dist/stores/postgres-idempotency.d.ts.map +1 -0
  77. package/dist/stores/postgres-idempotency.js +63 -0
  78. package/dist/stores/postgres-idempotency.js.map +1 -0
  79. package/dist/telemetry.d.ts +75 -0
  80. package/dist/telemetry.d.ts.map +1 -0
  81. package/dist/telemetry.js +110 -0
  82. package/dist/telemetry.js.map +1 -0
  83. package/package.json +47 -27
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Stripe MCP Server Launcher
4
+ *
5
+ * Starts the Stripe MCP server for AI-powered payment management.
6
+ *
7
+ * Usage:
8
+ * pnpm mcp:stripe
9
+ */
10
+ /**
11
+ * Launch the Stripe MCP server.
12
+ * Exported for programmatic use by the Hypervisor.
13
+ */
14
+ export declare function launchStripeMcp(): Promise<void>;
15
+ //# sourceMappingURL=stripe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../src/servers/stripe.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAmEH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD"}
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Stripe MCP Server Launcher
4
+ *
5
+ * Starts the Stripe MCP server for AI-powered payment management.
6
+ *
7
+ * Usage:
8
+ * pnpm mcp:stripe
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { config } from 'dotenv';
12
+ import { checkMcpLicense } from '../index.js';
13
+ import { createLauncherLogger, ExitCode } from './_launcher-utils.js';
14
+ const logger = createLauncherLogger();
15
+ // Load environment variables
16
+ config();
17
+ const MAX_RESTARTS = 3;
18
+ const RESTART_DELAYS_MS = [2000, 4000, 8000];
19
+ async function spawnStripe(stripeSecretKey) {
20
+ return new Promise((resolve) => {
21
+ const child = spawn('pnpm', ['dlx', '@stripe/mcp', '--tools=all'], {
22
+ stdio: 'inherit',
23
+ env: { ...process.env, STRIPE_SECRET_KEY: stripeSecretKey },
24
+ });
25
+ child.on('error', (error) => {
26
+ logger.error(`Failed to start Stripe MCP server: ${error.message}`);
27
+ resolve(ExitCode.CONFIG_ERROR);
28
+ });
29
+ child.on('exit', (code) => resolve(code ?? 0));
30
+ process.on('SIGINT', () => {
31
+ child.kill('SIGINT');
32
+ });
33
+ process.on('SIGTERM', () => {
34
+ child.kill('SIGTERM');
35
+ });
36
+ });
37
+ }
38
+ async function startStripeMCP() {
39
+ const stripeSecretKey = process.env.STRIPE_SECRET_KEY;
40
+ if (!stripeSecretKey) {
41
+ logger.error('STRIPE_SECRET_KEY environment variable is required');
42
+ logger.info(' Get your key from: https://dashboard.stripe.com/apikeys');
43
+ process.exit(ExitCode.CONFIG_ERROR);
44
+ }
45
+ const withRestart = process.argv.includes('--restart');
46
+ logger.header('Starting Stripe MCP Server');
47
+ logger.info(` Secret Key: ${stripeSecretKey.substring(0, 12)}...`);
48
+ if (withRestart)
49
+ logger.info(' Restart mode: enabled (up to 3 attempts)');
50
+ let attempt = 0;
51
+ while (true) {
52
+ const code = await spawnStripe(stripeSecretKey);
53
+ if (!withRestart || attempt >= MAX_RESTARTS) {
54
+ process.exit(code ?? 0);
55
+ }
56
+ const delay = RESTART_DELAYS_MS[attempt] ?? 8000;
57
+ attempt++;
58
+ logger.warning(` Server exited (code ${code}). Restarting in ${delay / 1000}s (attempt ${attempt}/${MAX_RESTARTS})...`);
59
+ await new Promise((resolve) => setTimeout(resolve, delay));
60
+ }
61
+ }
62
+ /**
63
+ * Launch the Stripe MCP server.
64
+ * Exported for programmatic use by the Hypervisor.
65
+ */
66
+ export async function launchStripeMcp() {
67
+ if (!(await checkMcpLicense())) {
68
+ throw new Error('MCP license check failed');
69
+ }
70
+ await startStripeMCP();
71
+ }
72
+ /**
73
+ * Main function (CLI entrypoint)
74
+ */
75
+ async function main() {
76
+ try {
77
+ await launchStripeMcp();
78
+ }
79
+ catch (error) {
80
+ logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
81
+ process.exit(ExitCode.EXECUTION_ERROR);
82
+ }
83
+ }
84
+ main();
85
+ //# sourceMappingURL=stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/servers/stripe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Supabase MCP Server Launcher
4
+ *
5
+ * Starts the Supabase MCP server for AI-powered database management.
6
+ *
7
+ * Usage:
8
+ * pnpm mcp:supabase
9
+ */
10
+ /**
11
+ * Launch the Supabase MCP server.
12
+ * Exported for programmatic use by the Hypervisor.
13
+ */
14
+ export declare function launchSupabaseMcp(): Promise<void>;
15
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/servers/supabase.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAiIH;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKvD"}
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Supabase MCP Server Launcher
4
+ *
5
+ * Starts the Supabase MCP server for AI-powered database management.
6
+ *
7
+ * Usage:
8
+ * pnpm mcp:supabase
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { randomBytes } from 'node:crypto';
12
+ import { config } from 'dotenv';
13
+ import { checkMcpLicense } from '../index.js';
14
+ import { createLauncherLogger, ExitCode } from './_launcher-utils.js';
15
+ const logger = createLauncherLogger();
16
+ // Load environment variables
17
+ config();
18
+ async function startSupabaseMCP() {
19
+ // Supabase MCP uses local package supabase-mcp
20
+ // Verified: Package expects SUPABASE_URL, SUPABASE_ANON_KEY, and SUPABASE_SERVICE_ROLE_KEY
21
+ // Source: node_modules/supabase-mcp/dist/esm/config.js and services/supabase.js
22
+ //
23
+ // NEW API KEY SUPPORT (2025):
24
+ // Supabase introduced new API keys: sb_publishable_... (replaces anon) and sb_secret_... (replaces service_role)
25
+ // Legacy keys (anon/service_role JWT) still work but will be deprecated in Nov 2025
26
+ // The @supabase/supabase-js client accepts any key format, so we support both
27
+ // Reference: https://github.com/orgs/supabase/discussions/29260
28
+ const supabaseUrl = process.env.SUPABASE_URL;
29
+ // Support both legacy and new API key formats
30
+ // New format: SUPABASE_PUBLISHABLE_KEY (sb_publishable_...) or SUPABASE_ANON_KEY (legacy)
31
+ // New format: SUPABASE_SECRET_KEY (sb_secret_...) or SUPABASE_SERVICE_ROLE_KEY (legacy)
32
+ const supabaseAnonKey = process.env.SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_ANON_KEY;
33
+ const supabaseServiceRoleKey = process.env.SUPABASE_SECRET_KEY || process.env.SUPABASE_SERVICE_ROLE_KEY;
34
+ if (!supabaseUrl) {
35
+ logger.error('SUPABASE_URL is required');
36
+ logger.info(' Get your credentials from: https://supabase.com/dashboard → Settings → API');
37
+ process.exit(ExitCode.CONFIG_ERROR);
38
+ }
39
+ if (!supabaseAnonKey) {
40
+ logger.error('SUPABASE_ANON_KEY or SUPABASE_PUBLISHABLE_KEY is required');
41
+ logger.info(' Legacy: SUPABASE_ANON_KEY (anon JWT key)');
42
+ logger.info(' New: SUPABASE_PUBLISHABLE_KEY (sb_publishable_... key)');
43
+ logger.info(' Get from: https://supabase.com/dashboard → Settings → API');
44
+ process.exit(ExitCode.CONFIG_ERROR);
45
+ }
46
+ if (!supabaseServiceRoleKey) {
47
+ logger.error('SUPABASE_SERVICE_ROLE_KEY or SUPABASE_SECRET_KEY is required');
48
+ logger.info(' Legacy: SUPABASE_SERVICE_ROLE_KEY (service_role JWT key)');
49
+ logger.info(' New: SUPABASE_SECRET_KEY (sb_secret_... key)');
50
+ logger.info(' Note: Required for MCP server operations (full database access)');
51
+ logger.info(' Get from: https://supabase.com/dashboard → Settings → API');
52
+ process.exit(ExitCode.CONFIG_ERROR);
53
+ }
54
+ // MCP_API_KEY is required by supabase-mcp package for server authentication
55
+ // This is NOT a Supabase key - it's a key you generate yourself to secure the MCP server
56
+ let mcpApiKey = process.env.MCP_API_KEY;
57
+ if (!mcpApiKey) {
58
+ // Auto-generate a secure random key if not provided
59
+ mcpApiKey = randomBytes(32).toString('hex');
60
+ logger.warning('MCP_API_KEY not set - auto-generated a secure key');
61
+ logger.warning(' Add this to your .env file to persist it:');
62
+ logger.warning(` MCP_API_KEY=${mcpApiKey}`);
63
+ logger.warning(' (This key secures your MCP server endpoint)');
64
+ }
65
+ const withRestart = process.argv.includes('--restart');
66
+ logger.header('Starting Supabase MCP Server (Local)');
67
+ logger.info(` Supabase URL: ${supabaseUrl}`);
68
+ if (withRestart)
69
+ logger.info(' Restart mode: enabled (up to 3 attempts)');
70
+ // Detect key format for logging
71
+ const usingNewKeys = process.env.SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_SECRET_KEY;
72
+ if (usingNewKeys) {
73
+ logger.info(' Using new API key format (sb_publishable_/sb_secret_)');
74
+ }
75
+ else {
76
+ logger.info(' Using legacy API key format (anon/service_role JWT)');
77
+ logger.warning(' Consider migrating to new keys before Nov 2025');
78
+ logger.info(' See: https://github.com/orgs/supabase/discussions/29260');
79
+ }
80
+ // Build env once — used for all spawn attempts
81
+ // Package validates: SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, MCP_API_KEY
82
+ // We map new keys to legacy variable names for package compatibility
83
+ const spawnEnv = {
84
+ ...process.env,
85
+ SUPABASE_URL: supabaseUrl,
86
+ SUPABASE_ANON_KEY: supabaseAnonKey,
87
+ SUPABASE_SERVICE_ROLE_KEY: supabaseServiceRoleKey,
88
+ MCP_API_KEY: mcpApiKey,
89
+ SUPABASE_PUBLISHABLE_KEY: process.env.SUPABASE_PUBLISHABLE_KEY,
90
+ SUPABASE_SECRET_KEY: process.env.SUPABASE_SECRET_KEY,
91
+ };
92
+ const MaxRestarts = 3;
93
+ const RestartDelaysMs = [2000, 4000, 8000];
94
+ const spawnSupabase = () => new Promise((resolve) => {
95
+ const child = spawn('pnpm', ['dlx', 'supabase-mcp'], { stdio: 'inherit', env: spawnEnv });
96
+ child.on('error', (error) => {
97
+ logger.error(`Failed to start Supabase MCP server: ${error.message}`);
98
+ resolve(ExitCode.CONFIG_ERROR);
99
+ });
100
+ child.on('exit', (code) => resolve(code ?? 0));
101
+ process.on('SIGINT', () => {
102
+ child.kill('SIGINT');
103
+ });
104
+ process.on('SIGTERM', () => {
105
+ child.kill('SIGTERM');
106
+ });
107
+ });
108
+ let attempt = 0;
109
+ while (true) {
110
+ const code = await spawnSupabase();
111
+ if (!withRestart || attempt >= MaxRestarts) {
112
+ process.exit(code ?? 0);
113
+ }
114
+ const delay = RestartDelaysMs[attempt] ?? 8000;
115
+ attempt++;
116
+ logger.warning(` Server exited (code ${code}). Restarting in ${delay / 1000}s (attempt ${attempt}/${MaxRestarts})...`);
117
+ await new Promise((resolve) => setTimeout(resolve, delay));
118
+ }
119
+ }
120
+ /**
121
+ * Launch the Supabase MCP server.
122
+ * Exported for programmatic use by the Hypervisor.
123
+ */
124
+ export async function launchSupabaseMcp() {
125
+ if (!(await checkMcpLicense())) {
126
+ throw new Error('MCP license check failed');
127
+ }
128
+ await startSupabaseMCP();
129
+ }
130
+ /**
131
+ * Main function (CLI entrypoint)
132
+ */
133
+ async function main() {
134
+ try {
135
+ await launchSupabaseMcp();
136
+ }
137
+ catch (error) {
138
+ logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
139
+ process.exit(ExitCode.EXECUTION_ERROR);
140
+ }
141
+ }
142
+ main();
143
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/servers/supabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Vercel MCP Server Launcher
4
+ *
5
+ * Starts the Vercel MCP server for AI-powered Vercel management.
6
+ *
7
+ * Usage:
8
+ * pnpm mcp:vercel
9
+ */
10
+ /**
11
+ * Launch the Vercel MCP server.
12
+ * Exported for programmatic use by the Hypervisor.
13
+ */
14
+ export declare function launchVercelMcp(): Promise<void>;
15
+ //# sourceMappingURL=vercel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../src/servers/vercel.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAoEH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD"}
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Vercel MCP Server Launcher
4
+ *
5
+ * Starts the Vercel MCP server for AI-powered Vercel management.
6
+ *
7
+ * Usage:
8
+ * pnpm mcp:vercel
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { config } from 'dotenv';
12
+ import { checkMcpLicense } from '../index.js';
13
+ import { createLauncherLogger, ExitCode } from './_launcher-utils.js';
14
+ const logger = createLauncherLogger();
15
+ // Load environment variables
16
+ config();
17
+ const MAX_RESTARTS = 3;
18
+ const RESTART_DELAYS_MS = [2000, 4000, 8000];
19
+ async function spawnVercel(vercelApiKey) {
20
+ return new Promise((resolve) => {
21
+ // Pass credentials via environment only — never as CLI arguments (visible in ps aux).
22
+ const child = spawn('pnpm', ['exec', 'vercel-mcp'], {
23
+ stdio: 'inherit',
24
+ env: { ...process.env, VERCEL_API_KEY: vercelApiKey },
25
+ });
26
+ child.on('error', (error) => {
27
+ logger.error(`Failed to start Vercel MCP server: ${error.message}`);
28
+ resolve(ExitCode.CONFIG_ERROR);
29
+ });
30
+ child.on('exit', (code) => resolve(code ?? 0));
31
+ process.on('SIGINT', () => {
32
+ child.kill('SIGINT');
33
+ });
34
+ process.on('SIGTERM', () => {
35
+ child.kill('SIGTERM');
36
+ });
37
+ });
38
+ }
39
+ async function startVercelMCP() {
40
+ const vercelApiKey = process.env.VERCEL_API_KEY ?? process.env.VERCEL_TOKEN;
41
+ if (!vercelApiKey) {
42
+ logger.error('VERCEL_API_KEY environment variable is required');
43
+ logger.info(' Get your token from: https://vercel.com/account/tokens');
44
+ process.exit(ExitCode.CONFIG_ERROR);
45
+ }
46
+ const withRestart = process.argv.includes('--restart');
47
+ logger.header('Starting Vercel MCP Server');
48
+ logger.info(` API Key: ${vercelApiKey.substring(0, 8)}...`);
49
+ if (withRestart)
50
+ logger.info(' Restart mode: enabled (up to 3 attempts)');
51
+ let attempt = 0;
52
+ while (true) {
53
+ const code = await spawnVercel(vercelApiKey);
54
+ if (!withRestart || attempt >= MAX_RESTARTS) {
55
+ process.exit(code ?? 0);
56
+ }
57
+ const delay = RESTART_DELAYS_MS[attempt] ?? 8000;
58
+ attempt++;
59
+ logger.warning(` Server exited (code ${code}). Restarting in ${delay / 1000}s (attempt ${attempt}/${MAX_RESTARTS})...`);
60
+ await new Promise((resolve) => setTimeout(resolve, delay));
61
+ }
62
+ }
63
+ /**
64
+ * Launch the Vercel MCP server.
65
+ * Exported for programmatic use by the Hypervisor.
66
+ */
67
+ export async function launchVercelMcp() {
68
+ if (!(await checkMcpLicense())) {
69
+ throw new Error('MCP license check failed');
70
+ }
71
+ await startVercelMCP();
72
+ }
73
+ /**
74
+ * Main function (CLI entrypoint)
75
+ */
76
+ async function main() {
77
+ try {
78
+ await launchVercelMcp();
79
+ }
80
+ catch (error) {
81
+ logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
82
+ process.exit(ExitCode.EXECUTION_ERROR);
83
+ }
84
+ }
85
+ main();
86
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/servers/vercel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Postgres-backed Idempotency Store
3
+ *
4
+ * Persistent implementation of the {@link IdempotencyStore} interface
5
+ * using a PostgreSQL table. Stores MCP responses keyed by idempotency
6
+ * key with automatic TTL expiration via a `expires_at` column.
7
+ *
8
+ * Table schema (auto-created on first use):
9
+ * mcp_idempotency_cache (
10
+ * key TEXT PRIMARY KEY,
11
+ * response JSONB NOT NULL,
12
+ * expires_at TIMESTAMPTZ NOT NULL
13
+ * )
14
+ */
15
+ import type { IdempotencyStore } from '../servers/adapter.js';
16
+ interface PgClient {
17
+ query(text: string, values?: unknown[]): Promise<{
18
+ rows: Record<string, unknown>[];
19
+ }>;
20
+ }
21
+ /**
22
+ * Create a Postgres-backed idempotency store.
23
+ *
24
+ * @param client - Any object with a `.query(text, values?)` method
25
+ * (e.g. `pg.Pool`, `pg.Client`, `@neondatabase/serverless` pool).
26
+ * @param opts - Optional configuration
27
+ */
28
+ export declare function createPostgresIdempotencyStore(client: PgClient, opts?: {
29
+ ensureTable?: boolean;
30
+ }): IdempotencyStore;
31
+ export {};
32
+ //# sourceMappingURL=postgres-idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-idempotency.d.ts","sourceRoot":"","sources":["../../src/stores/postgres-idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAE3E,UAAU,QAAQ;IAChB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CACvF;AAYD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,QAAQ,EAChB,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,gBAAgB,CAwClB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Postgres-backed Idempotency Store
3
+ *
4
+ * Persistent implementation of the {@link IdempotencyStore} interface
5
+ * using a PostgreSQL table. Stores MCP responses keyed by idempotency
6
+ * key with automatic TTL expiration via a `expires_at` column.
7
+ *
8
+ * Table schema (auto-created on first use):
9
+ * mcp_idempotency_cache (
10
+ * key TEXT PRIMARY KEY,
11
+ * response JSONB NOT NULL,
12
+ * expires_at TIMESTAMPTZ NOT NULL
13
+ * )
14
+ */
15
+ const TABLE = 'mcp_idempotency_cache';
16
+ const CREATE_TABLE_SQL = `
17
+ CREATE TABLE IF NOT EXISTS ${TABLE} (
18
+ key TEXT PRIMARY KEY,
19
+ response JSONB NOT NULL,
20
+ expires_at TIMESTAMPTZ NOT NULL
21
+ );
22
+ `;
23
+ /**
24
+ * Create a Postgres-backed idempotency store.
25
+ *
26
+ * @param client - Any object with a `.query(text, values?)` method
27
+ * (e.g. `pg.Pool`, `pg.Client`, `@neondatabase/serverless` pool).
28
+ * @param opts - Optional configuration
29
+ */
30
+ export function createPostgresIdempotencyStore(client, opts) {
31
+ let tableEnsured = opts?.ensureTable === false;
32
+ async function ensureTable() {
33
+ if (tableEnsured)
34
+ return;
35
+ await client.query(CREATE_TABLE_SQL);
36
+ tableEnsured = true;
37
+ }
38
+ return {
39
+ async get(key) {
40
+ await ensureTable();
41
+ const { rows } = await client.query(`SELECT response, expires_at FROM ${TABLE} WHERE key = $1 AND expires_at > NOW()`, [key]);
42
+ const row = rows[0];
43
+ if (!row)
44
+ return null;
45
+ return {
46
+ response: row.response,
47
+ expiresAt: new Date(row.expires_at).getTime(),
48
+ };
49
+ },
50
+ async set(key, response, ttlMs) {
51
+ await ensureTable();
52
+ const expiresAt = new Date(Date.now() + ttlMs).toISOString();
53
+ await client.query(`INSERT INTO ${TABLE} (key, response, expires_at)
54
+ VALUES ($1, $2, $3)
55
+ ON CONFLICT (key) DO UPDATE SET response = $2, expires_at = $3`, [key, JSON.stringify(response), expiresAt]);
56
+ },
57
+ async delete(key) {
58
+ await ensureTable();
59
+ await client.query(`DELETE FROM ${TABLE} WHERE key = $1`, [key]);
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=postgres-idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-idempotency.js","sourceRoot":"","sources":["../../src/stores/postgres-idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,MAAM,gBAAgB,GAAG;+BACM,KAAK;;;;;CAKnC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAAgB,EAChB,IAAgC;IAEhC,IAAI,YAAY,GAAG,IAAI,EAAE,WAAW,KAAK,KAAK,CAAC;IAE/C,KAAK,UAAU,WAAW;QACxB,IAAI,YAAY;YAAE,OAAO;QACzB,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrC,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAW;YACnB,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,oCAAoC,KAAK,wCAAwC,EACjF,CAAC,GAAG,CAAC,CACN,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO;gBACL,QAAQ,EAAE,GAAG,CAAC,QAAuB;gBACrC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC,CAAC,OAAO,EAAE;aACxD,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,QAAqB,EAAE,KAAa;YACzD,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7D,MAAM,MAAM,CAAC,KAAK,CAChB,eAAe,KAAK;;wEAE4C,EAChE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAC3C,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAW;YACtB,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * MCP Telemetry
3
+ *
4
+ * Structured event emitter for MCP operations. Supports multiple
5
+ * subscribers and provides convenience methods for common event types.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const telemetry = McpTelemetry.getInstance();
10
+ *
11
+ * // Register a JSON-lines handler
12
+ * telemetry.on(McpTelemetry.createJsonLogHandler());
13
+ *
14
+ * // Emit events
15
+ * telemetry.toolInvoke('stripe', 'create_customer', 'tenant-1', 'pro');
16
+ * telemetry.toolComplete('stripe', 'create_customer', true, 42, {
17
+ * tenant: 'tenant-1',
18
+ * });
19
+ * ```
20
+ */
21
+ export type McpEventType = 'tool.invoke' | 'tool.complete' | 'tool.error' | 'pipeline.start' | 'pipeline.complete' | 'server.start' | 'server.stop' | 'server.health' | 'auth.validate' | 'cache.hit' | 'cache.miss';
22
+ export interface McpEvent {
23
+ type: McpEventType;
24
+ timestamp: number;
25
+ server?: string;
26
+ tool?: string;
27
+ tenant?: string;
28
+ tier?: string;
29
+ durationMs?: number;
30
+ success?: boolean;
31
+ cached?: boolean;
32
+ error?: string;
33
+ metadata?: Record<string, unknown>;
34
+ }
35
+ export type McpEventHandler = (event: McpEvent) => void;
36
+ /**
37
+ * Simple event emitter for MCP telemetry.
38
+ * Supports multiple subscribers and structured event types.
39
+ * Default handler logs to structured JSON on stderr.
40
+ */
41
+ export declare class McpTelemetry {
42
+ private handlers;
43
+ private static instance;
44
+ static getInstance(): McpTelemetry;
45
+ /** Register an event handler. Returns an unsubscribe function. */
46
+ on(handler: McpEventHandler): () => void;
47
+ /** Emit an event to all registered handlers. */
48
+ emit(event: McpEvent): void;
49
+ /** Convenience: emit a tool invocation event. */
50
+ toolInvoke(server: string, tool: string, tenant?: string, tier?: string): void;
51
+ /** Convenience: emit a tool completion event. */
52
+ toolComplete(server: string, tool: string, success: boolean, durationMs: number, opts?: {
53
+ tenant?: string;
54
+ cached?: boolean;
55
+ error?: string;
56
+ }): void;
57
+ /** Create a JSON-lines log handler (writes to stderr). */
58
+ static createJsonLogHandler(): McpEventHandler;
59
+ /**
60
+ * Create an OpenTelemetry-compatible span handler stub.
61
+ * Pass your own tracer instance to wire real OTel export.
62
+ */
63
+ static createOtelHandler(tracer?: OtelTracerLike): McpEventHandler;
64
+ /** Reset singleton (for testing). */
65
+ static reset(): void;
66
+ }
67
+ /** Minimal OTel tracer shape — avoids requiring @opentelemetry/api as a dependency. */
68
+ interface OtelTracerLike {
69
+ startSpan(name: string): {
70
+ end(): void;
71
+ setAttribute(key: string, value: unknown): void;
72
+ };
73
+ }
74
+ export {};
75
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,eAAe,GACf,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,eAAe,GACf,eAAe,GACf,WAAW,GACX,YAAY,CAAC;AAEjB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAMxD;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC,kEAAkE;IAClE,EAAE,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI;IAOxC,gDAAgD;IAChD,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAU3B,iDAAiD;IACjD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAW9E,iDAAiD;IACjD,YAAY,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI;IAYP,0DAA0D;IAC1D,MAAM,CAAC,oBAAoB,IAAI,eAAe;IAM9C;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,eAAe;IAYlE,qCAAqC;IACrC,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB;AAMD,uFAAuF;AACvF,UAAU,cAAc;IACtB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;QACvB,GAAG,IAAI,IAAI,CAAC;QACZ,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;KACjD,CAAC;CACH"}