@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.
- package/.env.example +9 -0
- package/MCP_MAINTENANCE.md +265 -0
- package/README.md +260 -0
- package/__tests__/crdt.integration.test.ts +156 -0
- package/configs/README.md +77 -0
- package/configs/claude-template.json +54 -0
- package/dist/packages/core/src/database/ssl-config.d.ts +9 -0
- package/dist/packages/core/src/database/ssl-config.d.ts.map +1 -0
- package/dist/packages/core/src/database/ssl-config.js +8 -0
- package/dist/packages/core/src/database/ssl-config.js.map +1 -0
- package/dist/packages/core/src/features.d.ts +86 -0
- package/dist/packages/core/src/features.d.ts.map +1 -0
- package/dist/packages/core/src/features.js +93 -0
- package/dist/packages/core/src/features.js.map +1 -0
- package/dist/packages/core/src/license.d.ts +75 -0
- package/dist/packages/core/src/license.d.ts.map +1 -0
- package/dist/packages/core/src/license.js +174 -0
- package/dist/packages/core/src/license.js.map +1 -0
- package/dist/packages/core/src/monitoring/alerts.d.ts +118 -0
- package/dist/packages/core/src/monitoring/alerts.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/alerts.js +325 -0
- package/dist/packages/core/src/monitoring/alerts.js.map +1 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +71 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.js +227 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.js.map +1 -0
- package/dist/packages/core/src/monitoring/health-monitor.d.ts +22 -0
- package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/health-monitor.js +143 -0
- package/dist/packages/core/src/monitoring/health-monitor.js.map +1 -0
- package/dist/packages/core/src/monitoring/index.d.ts +14 -0
- package/dist/packages/core/src/monitoring/index.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/index.js +18 -0
- package/dist/packages/core/src/monitoring/index.js.map +1 -0
- package/dist/packages/core/src/monitoring/process-registry.d.ts +97 -0
- package/dist/packages/core/src/monitoring/process-registry.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/process-registry.js +223 -0
- package/dist/packages/core/src/monitoring/process-registry.js.map +1 -0
- package/dist/packages/core/src/monitoring/types.d.ts +231 -0
- package/dist/packages/core/src/monitoring/types.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/types.js +43 -0
- package/dist/packages/core/src/monitoring/types.js.map +1 -0
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts +81 -0
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/zombie-detector.js +232 -0
- package/dist/packages/core/src/monitoring/zombie-detector.js.map +1 -0
- package/dist/packages/core/src/observability/logger.d.ts +47 -0
- package/dist/packages/core/src/observability/logger.d.ts.map +1 -0
- package/dist/packages/core/src/observability/logger.js +141 -0
- package/dist/packages/core/src/observability/logger.js.map +1 -0
- package/dist/packages/core/src/utils/logger-server.d.ts +32 -0
- package/dist/packages/core/src/utils/logger-server.d.ts.map +1 -0
- package/dist/packages/core/src/utils/logger-server.js +69 -0
- package/dist/packages/core/src/utils/logger-server.js.map +1 -0
- package/dist/packages/core/src/utils/request-context.d.ts +143 -0
- package/dist/packages/core/src/utils/request-context.d.ts.map +1 -0
- package/dist/packages/core/src/utils/request-context.js +169 -0
- package/dist/packages/core/src/utils/request-context.js.map +1 -0
- package/dist/packages/dev/src/code-validator/index.d.ts +20 -0
- package/dist/packages/dev/src/code-validator/index.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/index.js +20 -0
- package/dist/packages/dev/src/code-validator/index.js.map +1 -0
- package/dist/packages/dev/src/code-validator/types.d.ts +67 -0
- package/dist/packages/dev/src/code-validator/types.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/types.js +7 -0
- package/dist/packages/dev/src/code-validator/types.js.map +1 -0
- package/dist/packages/dev/src/code-validator/validator.d.ts +48 -0
- package/dist/packages/dev/src/code-validator/validator.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/validator.js +176 -0
- package/dist/packages/dev/src/code-validator/validator.js.map +1 -0
- package/dist/packages/mcp/src/adapters/db.d.ts +46 -0
- package/dist/packages/mcp/src/adapters/db.d.ts.map +1 -0
- package/dist/packages/mcp/src/adapters/db.js +127 -0
- package/dist/packages/mcp/src/adapters/db.js.map +1 -0
- package/dist/packages/mcp/src/config/index.d.ts +11 -0
- package/dist/packages/mcp/src/config/index.d.ts.map +1 -0
- package/dist/packages/mcp/src/config/index.js +18 -0
- package/dist/packages/mcp/src/config/index.js.map +1 -0
- package/dist/packages/mcp/src/contracts.d.ts +131 -0
- package/dist/packages/mcp/src/contracts.d.ts.map +1 -0
- package/dist/packages/mcp/src/contracts.js +153 -0
- package/dist/packages/mcp/src/contracts.js.map +1 -0
- package/dist/packages/mcp/src/hypervisor.d.ts +132 -0
- package/dist/packages/mcp/src/hypervisor.d.ts.map +1 -0
- package/dist/packages/mcp/src/hypervisor.js +359 -0
- package/dist/packages/mcp/src/hypervisor.js.map +1 -0
- package/dist/packages/mcp/src/index.d.ts +25 -0
- package/dist/packages/mcp/src/index.d.ts.map +1 -0
- package/dist/packages/mcp/src/index.js +41 -0
- package/dist/packages/mcp/src/index.js.map +1 -0
- package/dist/packages/mcp/src/servers/adapter.d.ts +199 -0
- package/dist/packages/mcp/src/servers/adapter.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/adapter.js +487 -0
- package/dist/packages/mcp/src/servers/adapter.js.map +1 -0
- package/dist/packages/mcp/src/servers/code-validator.d.ts +24 -0
- package/dist/packages/mcp/src/servers/code-validator.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/code-validator.js +156 -0
- package/dist/packages/mcp/src/servers/code-validator.js.map +1 -0
- package/dist/packages/mcp/src/servers/neon.d.ts +11 -0
- package/dist/packages/mcp/src/servers/neon.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/neon.js +90 -0
- package/dist/packages/mcp/src/servers/neon.js.map +1 -0
- package/dist/packages/mcp/src/servers/next-devtools.d.ts +11 -0
- package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/next-devtools.js +215 -0
- package/dist/packages/mcp/src/servers/next-devtools.js.map +1 -0
- package/dist/packages/mcp/src/servers/playwright.d.ts +11 -0
- package/dist/packages/mcp/src/servers/playwright.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/playwright.js +68 -0
- package/dist/packages/mcp/src/servers/playwright.js.map +1 -0
- package/dist/packages/mcp/src/servers/stripe.d.ts +11 -0
- package/dist/packages/mcp/src/servers/stripe.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/stripe.js +86 -0
- package/dist/packages/mcp/src/servers/stripe.js.map +1 -0
- package/dist/packages/mcp/src/servers/supabase.d.ts +11 -0
- package/dist/packages/mcp/src/servers/supabase.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/supabase.js +144 -0
- package/dist/packages/mcp/src/servers/supabase.js.map +1 -0
- package/dist/packages/mcp/src/servers/vercel.d.ts +11 -0
- package/dist/packages/mcp/src/servers/vercel.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/vercel.js +87 -0
- package/dist/packages/mcp/src/servers/vercel.js.map +1 -0
- package/dist/packages/mcp/src/servers/vultr-test.d.ts +3 -0
- package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/vultr-test.js +82 -0
- package/dist/packages/mcp/src/servers/vultr-test.js.map +1 -0
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts +188 -0
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +1 -0
- package/dist/scripts/lib/analyzers/console-analyzer.js +432 -0
- package/dist/scripts/lib/analyzers/console-analyzer.js.map +1 -0
- package/dist/scripts/lib/analyzers/index.d.ts +11 -0
- package/dist/scripts/lib/analyzers/index.d.ts.map +1 -0
- package/dist/scripts/lib/analyzers/index.js +11 -0
- package/dist/scripts/lib/analyzers/index.js.map +1 -0
- package/dist/scripts/lib/args.d.ts +104 -0
- package/dist/scripts/lib/args.d.ts.map +1 -0
- package/dist/scripts/lib/args.js +304 -0
- package/dist/scripts/lib/args.js.map +1 -0
- package/dist/scripts/lib/cache.d.ts +185 -0
- package/dist/scripts/lib/cache.d.ts.map +1 -0
- package/dist/scripts/lib/cache.js +390 -0
- package/dist/scripts/lib/cache.js.map +1 -0
- package/dist/scripts/lib/cli/dispatch.d.ts +116 -0
- package/dist/scripts/lib/cli/dispatch.d.ts.map +1 -0
- package/dist/scripts/lib/cli/dispatch.js +206 -0
- package/dist/scripts/lib/cli/dispatch.js.map +1 -0
- package/dist/scripts/lib/cli/index.d.ts +10 -0
- package/dist/scripts/lib/cli/index.d.ts.map +1 -0
- package/dist/scripts/lib/cli/index.js +10 -0
- package/dist/scripts/lib/cli/index.js.map +1 -0
- package/dist/scripts/lib/database/ssl-config.d.ts +26 -0
- package/dist/scripts/lib/database/ssl-config.d.ts.map +1 -0
- package/dist/scripts/lib/database/ssl-config.js +47 -0
- package/dist/scripts/lib/database/ssl-config.js.map +1 -0
- package/dist/scripts/lib/errors.d.ts +218 -0
- package/dist/scripts/lib/errors.d.ts.map +1 -0
- package/dist/scripts/lib/errors.js +543 -0
- package/dist/scripts/lib/errors.js.map +1 -0
- package/dist/scripts/lib/exec.d.ts +107 -0
- package/dist/scripts/lib/exec.d.ts.map +1 -0
- package/dist/scripts/lib/exec.js +232 -0
- package/dist/scripts/lib/exec.js.map +1 -0
- package/dist/scripts/lib/index.d.ts +50 -0
- package/dist/scripts/lib/index.d.ts.map +1 -0
- package/dist/scripts/lib/index.js +65 -0
- package/dist/scripts/lib/index.js.map +1 -0
- package/dist/scripts/lib/logger.d.ts +50 -0
- package/dist/scripts/lib/logger.d.ts.map +1 -0
- package/dist/scripts/lib/logger.js +159 -0
- package/dist/scripts/lib/logger.js.map +1 -0
- package/dist/scripts/lib/output.d.ts +149 -0
- package/dist/scripts/lib/output.d.ts.map +1 -0
- package/dist/scripts/lib/output.js +263 -0
- package/dist/scripts/lib/output.js.map +1 -0
- package/dist/scripts/lib/parallel.d.ts +164 -0
- package/dist/scripts/lib/parallel.d.ts.map +1 -0
- package/dist/scripts/lib/parallel.js +355 -0
- package/dist/scripts/lib/parallel.js.map +1 -0
- package/dist/scripts/lib/paths.d.ts +92 -0
- package/dist/scripts/lib/paths.d.ts.map +1 -0
- package/dist/scripts/lib/paths.js +171 -0
- package/dist/scripts/lib/paths.js.map +1 -0
- package/dist/scripts/lib/state/adapters/memory.d.ts +42 -0
- package/dist/scripts/lib/state/adapters/memory.d.ts.map +1 -0
- package/dist/scripts/lib/state/adapters/memory.js +110 -0
- package/dist/scripts/lib/state/adapters/memory.js.map +1 -0
- package/dist/scripts/lib/state/adapters/pglite.d.ts +46 -0
- package/dist/scripts/lib/state/adapters/pglite.d.ts.map +1 -0
- package/dist/scripts/lib/state/adapters/pglite.js +256 -0
- package/dist/scripts/lib/state/adapters/pglite.js.map +1 -0
- package/dist/scripts/lib/state/index.d.ts +16 -0
- package/dist/scripts/lib/state/index.d.ts.map +1 -0
- package/dist/scripts/lib/state/index.js +16 -0
- package/dist/scripts/lib/state/index.js.map +1 -0
- package/dist/scripts/lib/state/types.d.ts +111 -0
- package/dist/scripts/lib/state/types.d.ts.map +1 -0
- package/dist/scripts/lib/state/types.js +8 -0
- package/dist/scripts/lib/state/types.js.map +1 -0
- package/dist/scripts/lib/state/workflow-state.d.ts +110 -0
- package/dist/scripts/lib/state/workflow-state.d.ts.map +1 -0
- package/dist/scripts/lib/state/workflow-state.js +331 -0
- package/dist/scripts/lib/state/workflow-state.js.map +1 -0
- package/dist/scripts/lib/telemetry.d.ts +194 -0
- package/dist/scripts/lib/telemetry.d.ts.map +1 -0
- package/dist/scripts/lib/telemetry.js +394 -0
- package/dist/scripts/lib/telemetry.js.map +1 -0
- package/dist/scripts/lib/utils.d.ts +270 -0
- package/dist/scripts/lib/utils.d.ts.map +1 -0
- package/dist/scripts/lib/utils.js +473 -0
- package/dist/scripts/lib/utils.js.map +1 -0
- package/dist/scripts/lib/validation/database.d.ts +83 -0
- package/dist/scripts/lib/validation/database.d.ts.map +1 -0
- package/dist/scripts/lib/validation/database.js +199 -0
- package/dist/scripts/lib/validation/database.js.map +1 -0
- package/dist/scripts/lib/validation/env.d.ts +80 -0
- package/dist/scripts/lib/validation/env.d.ts.map +1 -0
- package/dist/scripts/lib/validation/env.js +246 -0
- package/dist/scripts/lib/validation/env.js.map +1 -0
- package/dist/scripts/lib/validation/index.d.ts +16 -0
- package/dist/scripts/lib/validation/index.d.ts.map +1 -0
- package/dist/scripts/lib/validation/index.js +16 -0
- package/dist/scripts/lib/validation/index.js.map +1 -0
- package/dist/scripts/lib/validation/post-execution.d.ts +74 -0
- package/dist/scripts/lib/validation/post-execution.d.ts.map +1 -0
- package/dist/scripts/lib/validation/post-execution.js +110 -0
- package/dist/scripts/lib/validation/post-execution.js.map +1 -0
- package/dist/scripts/lib/validation/pre-execution.d.ts +165 -0
- package/dist/scripts/lib/validation/pre-execution.d.ts.map +1 -0
- package/dist/scripts/lib/validation/pre-execution.js +466 -0
- package/dist/scripts/lib/validation/pre-execution.js.map +1 -0
- package/dist/scripts/lib/validators/documentation-validator.d.ts +242 -0
- package/dist/scripts/lib/validators/documentation-validator.d.ts.map +1 -0
- package/dist/scripts/lib/validators/documentation-validator.js +584 -0
- package/dist/scripts/lib/validators/documentation-validator.js.map +1 -0
- package/dist/scripts/lib/validators/index.d.ts +11 -0
- package/dist/scripts/lib/validators/index.d.ts.map +1 -0
- package/dist/scripts/lib/validators/index.js +11 -0
- package/dist/scripts/lib/validators/index.js.map +1 -0
- package/docker-compose.yml +46 -0
- package/docs/INDEX.md +88 -0
- package/docs/README.md +774 -0
- package/docs/SETUP.md +264 -0
- package/docs/servers/code-validator.md +586 -0
- package/eslint.config.js +7 -0
- package/migrations/0001_add_crdt_columns.sql +8 -0
- package/migrations/0001_rollback.sql +6 -0
- package/migrations/005_performance_indexes.sql +190 -0
- package/migrations/backfill_crdt_meta.js +45 -0
- package/package.json +21 -85
- package/src/__tests__/hypervisor.test.ts +212 -0
- package/src/adapters/db.ts +180 -0
- package/src/config/config.json +49 -0
- package/src/config/index.ts +30 -0
- package/src/contracts.ts +221 -0
- package/src/hypervisor.ts +464 -0
- package/src/index.ts +87 -0
- package/src/servers/adapter.ts +643 -0
- package/src/servers/code-validator.ts +188 -0
- package/src/servers/neon.ts +103 -0
- package/src/servers/next-devtools.ts +230 -0
- package/src/servers/playwright.ts +77 -0
- package/src/servers/stripe.ts +99 -0
- package/src/servers/supabase.ts +161 -0
- package/src/servers/vercel.ts +100 -0
- package/src/servers/vultr-test.ts +97 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +22 -0
- package/LICENSE +0 -202
- package/dist/index.js +0 -10990
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,487 @@
|
|
|
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
|
+
import { randomBytes } from 'node:crypto';
|
|
13
|
+
import { registerCleanupHandler } from '@revealui/core/monitoring';
|
|
14
|
+
import { logger as coreLogger } from '@revealui/core/observability/logger';
|
|
15
|
+
import { createLogger } from '@revealui/scripts';
|
|
16
|
+
import { ErrorCode, ScriptError } from '@revealui/scripts/errors';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Global Adapter Registry
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Track all active MCP adapters for cleanup
|
|
22
|
+
*/
|
|
23
|
+
const activeAdapters = new Set();
|
|
24
|
+
/**
|
|
25
|
+
* Dispose all active MCP adapters (cleanup on shutdown)
|
|
26
|
+
*/
|
|
27
|
+
export function disposeAllAdapters() {
|
|
28
|
+
for (const adapter of activeAdapters) {
|
|
29
|
+
try {
|
|
30
|
+
adapter.dispose();
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
coreLogger.error('Failed to dispose adapter', error instanceof Error ? error : new Error(String(error)));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
activeAdapters.clear();
|
|
37
|
+
}
|
|
38
|
+
// Register cleanup handler
|
|
39
|
+
let cleanupHandlerRegistered = false;
|
|
40
|
+
function registerAdapterCleanup() {
|
|
41
|
+
if (cleanupHandlerRegistered)
|
|
42
|
+
return;
|
|
43
|
+
registerCleanupHandler('mcp-adapters', () => {
|
|
44
|
+
disposeAllAdapters();
|
|
45
|
+
}, 'Dispose all MCP adapters', 90);
|
|
46
|
+
cleanupHandlerRegistered = true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* In-memory idempotency cache for preventing duplicate operations.
|
|
50
|
+
* Each adapter instance has its own cache.
|
|
51
|
+
*/
|
|
52
|
+
class IdempotencyCache {
|
|
53
|
+
cache = new Map();
|
|
54
|
+
cleanupInterval = null;
|
|
55
|
+
// biome-ignore lint/style/useNamingConvention: Constant should be uppercase
|
|
56
|
+
DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes
|
|
57
|
+
constructor() {
|
|
58
|
+
// Cleanup expired entries every minute
|
|
59
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60 * 1000);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get a cached response by idempotency key
|
|
63
|
+
*/
|
|
64
|
+
get(key) {
|
|
65
|
+
const cached = this.cache.get(key);
|
|
66
|
+
if (!cached)
|
|
67
|
+
return null;
|
|
68
|
+
if (Date.now() > cached.expiresAt) {
|
|
69
|
+
this.cache.delete(key);
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
...cached.response,
|
|
74
|
+
metadata: {
|
|
75
|
+
...cached.response.metadata,
|
|
76
|
+
cached: true,
|
|
77
|
+
idempotencyKey: key,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Store a response with idempotency key
|
|
83
|
+
*/
|
|
84
|
+
set(key, response, ttl) {
|
|
85
|
+
const expiresAt = Date.now() + (ttl || this.DEFAULT_TTL);
|
|
86
|
+
this.cache.set(key, { response, expiresAt });
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if a key exists in the cache
|
|
90
|
+
*/
|
|
91
|
+
has(key) {
|
|
92
|
+
const cached = this.cache.get(key);
|
|
93
|
+
if (!cached)
|
|
94
|
+
return false;
|
|
95
|
+
if (Date.now() > cached.expiresAt) {
|
|
96
|
+
this.cache.delete(key);
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Remove expired entries
|
|
103
|
+
*/
|
|
104
|
+
cleanup() {
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
for (const [key, value] of this.cache.entries()) {
|
|
107
|
+
if (now > value.expiresAt) {
|
|
108
|
+
this.cache.delete(key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Clear all cached entries
|
|
114
|
+
*/
|
|
115
|
+
clear() {
|
|
116
|
+
this.cache.clear();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Stop the cleanup interval
|
|
120
|
+
*/
|
|
121
|
+
dispose() {
|
|
122
|
+
if (this.cleanupInterval) {
|
|
123
|
+
clearInterval(this.cleanupInterval);
|
|
124
|
+
this.cleanupInterval = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get cache statistics
|
|
129
|
+
*/
|
|
130
|
+
stats() {
|
|
131
|
+
return {
|
|
132
|
+
size: this.cache.size,
|
|
133
|
+
keys: Array.from(this.cache.keys()),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export class MCPAdapter {
|
|
138
|
+
serviceName;
|
|
139
|
+
config;
|
|
140
|
+
logger = createLogger();
|
|
141
|
+
idempotencyCache = new IdempotencyCache();
|
|
142
|
+
constructor(serviceName, config) {
|
|
143
|
+
this.serviceName = serviceName;
|
|
144
|
+
this.config = {
|
|
145
|
+
timeout: 30000,
|
|
146
|
+
retries: 3,
|
|
147
|
+
environment: 'development',
|
|
148
|
+
...config,
|
|
149
|
+
};
|
|
150
|
+
// Register adapter for cleanup
|
|
151
|
+
activeAdapters.add(this);
|
|
152
|
+
registerAdapterCleanup();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Dispose of adapter resources (cleanup idempotency cache)
|
|
156
|
+
*/
|
|
157
|
+
dispose() {
|
|
158
|
+
this.idempotencyCache.dispose();
|
|
159
|
+
activeAdapters.delete(this);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get idempotency cache statistics
|
|
163
|
+
*/
|
|
164
|
+
getCacheStats() {
|
|
165
|
+
return this.idempotencyCache.stats();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Clear the idempotency cache
|
|
169
|
+
*/
|
|
170
|
+
clearCache() {
|
|
171
|
+
this.idempotencyCache.clear();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Execute an MCP request
|
|
175
|
+
*
|
|
176
|
+
* If an idempotencyKey is provided in options, the request will be checked
|
|
177
|
+
* against the cache. If a cached response exists, it will be returned
|
|
178
|
+
* immediately. Otherwise, the request will be executed and the response
|
|
179
|
+
* will be cached for future duplicate requests.
|
|
180
|
+
*/
|
|
181
|
+
async execute(request) {
|
|
182
|
+
const startTime = Date.now();
|
|
183
|
+
let attempts = 0;
|
|
184
|
+
const idempotencyKey = request.options?.idempotencyKey;
|
|
185
|
+
try {
|
|
186
|
+
this.validateRequest(request);
|
|
187
|
+
// Check idempotency cache first
|
|
188
|
+
if (idempotencyKey) {
|
|
189
|
+
const cached = this.idempotencyCache.get(idempotencyKey);
|
|
190
|
+
if (cached) {
|
|
191
|
+
this.logger.info(`[${this.serviceName}] Returning cached response for idempotency key: ${idempotencyKey}`);
|
|
192
|
+
return cached;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (request.options?.dryRun) {
|
|
196
|
+
return this.createDryRunResponse(request);
|
|
197
|
+
}
|
|
198
|
+
while (attempts < (request.options?.retries || this.config.retries || 3)) {
|
|
199
|
+
attempts++;
|
|
200
|
+
try {
|
|
201
|
+
this.logger.info(`[${this.serviceName}] Executing ${request.action} (attempt ${attempts})`);
|
|
202
|
+
const result = await this.executeRequest(request);
|
|
203
|
+
const duration = Date.now() - startTime;
|
|
204
|
+
const response = {
|
|
205
|
+
success: true,
|
|
206
|
+
data: result,
|
|
207
|
+
metadata: {
|
|
208
|
+
duration,
|
|
209
|
+
retries: attempts - 1,
|
|
210
|
+
service: this.serviceName,
|
|
211
|
+
...(idempotencyKey && { idempotencyKey }),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
// Cache successful response if idempotency key provided
|
|
215
|
+
if (idempotencyKey) {
|
|
216
|
+
this.idempotencyCache.set(idempotencyKey, response, request.options?.idempotencyTTL);
|
|
217
|
+
}
|
|
218
|
+
return response;
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
this.logger.warning(`[${this.serviceName}] Attempt ${attempts} failed: ${error}`);
|
|
222
|
+
if (attempts >= (request.options?.retries || this.config.retries || 3)) {
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
// Wait before retry (exponential backoff)
|
|
226
|
+
const delay = Math.min(1000 * 2 ** (attempts - 1), 10000);
|
|
227
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
throw new ScriptError('All retry attempts exhausted', ErrorCode.TIMEOUT_ERROR);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const duration = Date.now() - startTime;
|
|
234
|
+
const response = {
|
|
235
|
+
success: false,
|
|
236
|
+
error: error instanceof Error ? error.message : String(error),
|
|
237
|
+
metadata: {
|
|
238
|
+
duration,
|
|
239
|
+
retries: attempts,
|
|
240
|
+
service: this.serviceName,
|
|
241
|
+
...(idempotencyKey && { idempotencyKey }),
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
// Also cache failed responses to prevent duplicate attempts
|
|
245
|
+
// This prevents the same failing request from being retried repeatedly
|
|
246
|
+
if (idempotencyKey) {
|
|
247
|
+
this.idempotencyCache.set(idempotencyKey, response, request.options?.idempotencyTTL);
|
|
248
|
+
}
|
|
249
|
+
return response;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Validate the incoming request
|
|
254
|
+
*/
|
|
255
|
+
validateRequest(request) {
|
|
256
|
+
if (!request.action) {
|
|
257
|
+
throw new ScriptError('Request must include an action', ErrorCode.VALIDATION_ERROR);
|
|
258
|
+
}
|
|
259
|
+
if (!this.isValidAction(request.action)) {
|
|
260
|
+
throw new ScriptError(`Unsupported action: ${request.action}`, ErrorCode.VALIDATION_ERROR);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Create a dry-run response
|
|
265
|
+
*/
|
|
266
|
+
createDryRunResponse(request) {
|
|
267
|
+
return {
|
|
268
|
+
success: true,
|
|
269
|
+
data: {
|
|
270
|
+
dryRun: true,
|
|
271
|
+
action: request.action,
|
|
272
|
+
parameters: request.parameters,
|
|
273
|
+
message: `Would execute ${request.action} on ${this.serviceName}`,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get authentication headers for API calls
|
|
279
|
+
*/
|
|
280
|
+
getAuthHeaders() {
|
|
281
|
+
const headers = {
|
|
282
|
+
'Content-Type': 'application/json',
|
|
283
|
+
'User-Agent': `RevealUI-MCP/${this.serviceName}`,
|
|
284
|
+
};
|
|
285
|
+
if (this.config.apiKey) {
|
|
286
|
+
// Different services use different header names
|
|
287
|
+
const headerName = this.getAuthHeaderName();
|
|
288
|
+
headers[headerName] = this.config.apiKey;
|
|
289
|
+
}
|
|
290
|
+
return headers;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Make an HTTP request with proper error handling
|
|
294
|
+
*/
|
|
295
|
+
async makeRequest(method, url, data) {
|
|
296
|
+
const headers = this.getAuthHeaders();
|
|
297
|
+
const timeout = this.config.timeout || 30000;
|
|
298
|
+
const controller = new AbortController();
|
|
299
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
300
|
+
try {
|
|
301
|
+
const response = await fetch(url, {
|
|
302
|
+
method,
|
|
303
|
+
headers,
|
|
304
|
+
body: data && (method === 'POST' || method === 'PUT') ? JSON.stringify(data) : undefined,
|
|
305
|
+
signal: controller.signal,
|
|
306
|
+
});
|
|
307
|
+
if (!response.ok) {
|
|
308
|
+
throw new ScriptError(`HTTP ${response.status} ${response.statusText}`, ErrorCode.NETWORK_ERROR);
|
|
309
|
+
}
|
|
310
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
311
|
+
if (contentType.includes('application/json')) {
|
|
312
|
+
return await response.json();
|
|
313
|
+
}
|
|
314
|
+
return await response.text();
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
if (error instanceof ScriptError)
|
|
318
|
+
throw error;
|
|
319
|
+
throw new ScriptError(`Request to ${this.serviceName} failed: ${error}`, ErrorCode.NETWORK_ERROR);
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
clearTimeout(timer);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Specific service adapters
|
|
327
|
+
export class VercelAdapter extends MCPAdapter {
|
|
328
|
+
constructor(config) {
|
|
329
|
+
super('vercel', config);
|
|
330
|
+
}
|
|
331
|
+
isValidAction(action) {
|
|
332
|
+
return ['deploy', 'list-deployments', 'get-deployment', 'delete-deployment'].includes(action);
|
|
333
|
+
}
|
|
334
|
+
getAuthHeaderName() {
|
|
335
|
+
return 'Authorization';
|
|
336
|
+
}
|
|
337
|
+
async executeRequest(request) {
|
|
338
|
+
const baseUrl = this.config.baseUrl || 'https://api.vercel.com';
|
|
339
|
+
switch (request.action) {
|
|
340
|
+
case 'deploy':
|
|
341
|
+
return this.makeRequest('POST', `${baseUrl}/v13/deployments`, request.parameters);
|
|
342
|
+
case 'list-deployments':
|
|
343
|
+
return this.makeRequest('GET', `${baseUrl}/v6/deployments`);
|
|
344
|
+
case 'get-deployment': {
|
|
345
|
+
const { id } = request.parameters || {};
|
|
346
|
+
if (!id)
|
|
347
|
+
throw new ScriptError('Deployment ID required', ErrorCode.VALIDATION_ERROR);
|
|
348
|
+
return this.makeRequest('GET', `${baseUrl}/v13/deployments/${String(id)}`);
|
|
349
|
+
}
|
|
350
|
+
case 'delete-deployment': {
|
|
351
|
+
const { deploymentId } = request.parameters || {};
|
|
352
|
+
if (!deploymentId)
|
|
353
|
+
throw new ScriptError('Deployment ID required', ErrorCode.VALIDATION_ERROR);
|
|
354
|
+
return this.makeRequest('DELETE', `${baseUrl}/v13/deployments/${String(deploymentId)}`);
|
|
355
|
+
}
|
|
356
|
+
default:
|
|
357
|
+
throw new ScriptError(`Unsupported action: ${request.action}`, ErrorCode.VALIDATION_ERROR);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
export class StripeAdapter extends MCPAdapter {
|
|
362
|
+
constructor(config) {
|
|
363
|
+
super('stripe', config);
|
|
364
|
+
}
|
|
365
|
+
isValidAction(action) {
|
|
366
|
+
return [
|
|
367
|
+
'create-payment-intent',
|
|
368
|
+
'list-payment-intents',
|
|
369
|
+
'create-customer',
|
|
370
|
+
'list-customers',
|
|
371
|
+
].includes(action);
|
|
372
|
+
}
|
|
373
|
+
getAuthHeaderName() {
|
|
374
|
+
return 'Authorization';
|
|
375
|
+
}
|
|
376
|
+
async executeRequest(request) {
|
|
377
|
+
const baseUrl = this.config.baseUrl || 'https://api.stripe.com/v1';
|
|
378
|
+
switch (request.action) {
|
|
379
|
+
case 'create-payment-intent':
|
|
380
|
+
return this.makeRequest('POST', `${baseUrl}/payment_intents`, request.parameters);
|
|
381
|
+
case 'list-payment-intents':
|
|
382
|
+
return this.makeRequest('GET', `${baseUrl}/payment_intents`);
|
|
383
|
+
case 'create-customer':
|
|
384
|
+
return this.makeRequest('POST', `${baseUrl}/customers`, request.parameters);
|
|
385
|
+
case 'list-customers':
|
|
386
|
+
return this.makeRequest('GET', `${baseUrl}/customers`);
|
|
387
|
+
default:
|
|
388
|
+
throw new ScriptError(`Unsupported action: ${request.action}`, ErrorCode.VALIDATION_ERROR);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
export class NeonAdapter extends MCPAdapter {
|
|
393
|
+
constructor(config) {
|
|
394
|
+
super('neon', config);
|
|
395
|
+
}
|
|
396
|
+
isValidAction(action) {
|
|
397
|
+
return ['list-projects', 'create-project', 'get-project', 'delete-project'].includes(action);
|
|
398
|
+
}
|
|
399
|
+
getAuthHeaderName() {
|
|
400
|
+
return 'Authorization';
|
|
401
|
+
}
|
|
402
|
+
async executeRequest(request) {
|
|
403
|
+
const baseUrl = this.config.baseUrl || 'https://console.neon.tech/api/v2';
|
|
404
|
+
switch (request.action) {
|
|
405
|
+
case 'list-projects':
|
|
406
|
+
return this.makeRequest('GET', `${baseUrl}/projects`);
|
|
407
|
+
case 'create-project':
|
|
408
|
+
return this.makeRequest('POST', `${baseUrl}/projects`, request.parameters);
|
|
409
|
+
case 'get-project': {
|
|
410
|
+
const { id } = request.parameters || {};
|
|
411
|
+
if (!id)
|
|
412
|
+
throw new ScriptError('Project ID required', ErrorCode.VALIDATION_ERROR);
|
|
413
|
+
return this.makeRequest('GET', `${baseUrl}/projects/${String(id)}`);
|
|
414
|
+
}
|
|
415
|
+
case 'delete-project': {
|
|
416
|
+
const { projectId } = request.parameters || {};
|
|
417
|
+
if (!projectId)
|
|
418
|
+
throw new ScriptError('Project ID required', ErrorCode.VALIDATION_ERROR);
|
|
419
|
+
return this.makeRequest('DELETE', `${baseUrl}/projects/${String(projectId)}`);
|
|
420
|
+
}
|
|
421
|
+
default:
|
|
422
|
+
throw new ScriptError(`Unsupported action: ${request.action}`, ErrorCode.VALIDATION_ERROR);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Factory function to create adapters
|
|
427
|
+
export function createMCPAdapter(service, config) {
|
|
428
|
+
switch (service.toLowerCase()) {
|
|
429
|
+
case 'vercel':
|
|
430
|
+
return new VercelAdapter(config);
|
|
431
|
+
case 'stripe':
|
|
432
|
+
return new StripeAdapter(config);
|
|
433
|
+
case 'neon':
|
|
434
|
+
return new NeonAdapter(config);
|
|
435
|
+
default:
|
|
436
|
+
throw new ScriptError(`Unsupported MCP service: ${service}`, ErrorCode.CONFIG_ERROR);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Generate an idempotency key based on the request content.
|
|
441
|
+
*
|
|
442
|
+
* This creates a deterministic key from the action and parameters,
|
|
443
|
+
* so identical requests will get the same key.
|
|
444
|
+
*
|
|
445
|
+
* @example
|
|
446
|
+
* ```typescript
|
|
447
|
+
* const key = generateIdempotencyKey({
|
|
448
|
+
* action: 'deploy',
|
|
449
|
+
* parameters: { projectId: '123' }
|
|
450
|
+
* })
|
|
451
|
+
* // Returns: "deploy:a1b2c3d4e5f6..."
|
|
452
|
+
* ```
|
|
453
|
+
*/
|
|
454
|
+
export function generateIdempotencyKey(request) {
|
|
455
|
+
const content = JSON.stringify({
|
|
456
|
+
action: request.action,
|
|
457
|
+
parameters: request.parameters || {},
|
|
458
|
+
});
|
|
459
|
+
// Simple hash function for generating consistent keys
|
|
460
|
+
let hash = 0;
|
|
461
|
+
for (let i = 0; i < content.length; i++) {
|
|
462
|
+
const char = content.charCodeAt(i);
|
|
463
|
+
hash = (hash << 5) - hash + char;
|
|
464
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
465
|
+
}
|
|
466
|
+
// Convert to positive hex string
|
|
467
|
+
const hashHex = Math.abs(hash).toString(16).padStart(8, '0');
|
|
468
|
+
return `${request.action}:${hashHex}`;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Generate a unique idempotency key with timestamp.
|
|
472
|
+
*
|
|
473
|
+
* Use this when you want each request to be unique but still
|
|
474
|
+
* want idempotency protection against rapid duplicate submissions.
|
|
475
|
+
*
|
|
476
|
+
* @example
|
|
477
|
+
* ```typescript
|
|
478
|
+
* const key = generateUniqueIdempotencyKey('deploy')
|
|
479
|
+
* // Returns: "deploy:1706536800000:a1b2c3d4"
|
|
480
|
+
* ```
|
|
481
|
+
*/
|
|
482
|
+
export function generateUniqueIdempotencyKey(action) {
|
|
483
|
+
const timestamp = Date.now();
|
|
484
|
+
const random = randomBytes(6).toString('hex');
|
|
485
|
+
return `${action}:${timestamp}:${random}`;
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../../src/servers/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Code Validator MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Model Context Protocol server that exposes code validation tools
|
|
6
|
+
* for AI assistants to validate code before writing to disk.
|
|
7
|
+
*
|
|
8
|
+
* This server provides:
|
|
9
|
+
* - validate_code: Validate code content against standards
|
|
10
|
+
* - get_standards: Get current code standards configuration
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* Add to Claude Code MCP config:
|
|
14
|
+
* {
|
|
15
|
+
* "mcpServers": {
|
|
16
|
+
* "revealui-validator": {
|
|
17
|
+
* "command": "node",
|
|
18
|
+
* "args": ["./packages/mcp/src/servers/code-validator.ts"]
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=code-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-validator.d.ts","sourceRoot":"","sources":["../../../../../src/servers/code-validator.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|