convex-mcp-visual 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +844 -0
  2. package/dist/apps/apps/realtime-dashboard/index.html +15 -0
  3. package/dist/apps/apps/schema-browser/index.html +15 -0
  4. package/dist/apps/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
  5. package/dist/apps/assets/realtime-dashboard-BPA99DZn.js +140 -0
  6. package/dist/apps/assets/schema-browser-BEcF8hRP.js +499 -0
  7. package/dist/apps/assets/style-BTxSpbLq.css +1 -0
  8. package/dist/convex-client.d.ts +56 -0
  9. package/dist/convex-client.d.ts.map +1 -0
  10. package/dist/convex-client.js +206 -0
  11. package/dist/convex-client.js.map +1 -0
  12. package/dist/index.d.ts +9 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +93 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/resources/dashboard.d.ts +7 -0
  17. package/dist/resources/dashboard.d.ts.map +1 -0
  18. package/dist/resources/dashboard.js +255 -0
  19. package/dist/resources/dashboard.js.map +1 -0
  20. package/dist/resources/schema-browser.d.ts +7 -0
  21. package/dist/resources/schema-browser.d.ts.map +1 -0
  22. package/dist/resources/schema-browser.js +654 -0
  23. package/dist/resources/schema-browser.js.map +1 -0
  24. package/dist/server.d.ts +12 -0
  25. package/dist/server.d.ts.map +1 -0
  26. package/dist/server.js +142 -0
  27. package/dist/server.js.map +1 -0
  28. package/dist/tools/dashboard.d.ts +19 -0
  29. package/dist/tools/dashboard.d.ts.map +1 -0
  30. package/dist/tools/dashboard.js +309 -0
  31. package/dist/tools/dashboard.js.map +1 -0
  32. package/dist/tools/schema-browser.d.ts +19 -0
  33. package/dist/tools/schema-browser.d.ts.map +1 -0
  34. package/dist/tools/schema-browser.js +260 -0
  35. package/dist/tools/schema-browser.js.map +1 -0
  36. package/dist/ui-server.d.ts +26 -0
  37. package/dist/ui-server.d.ts.map +1 -0
  38. package/dist/ui-server.js +202 -0
  39. package/dist/ui-server.js.map +1 -0
  40. package/package.json +55 -0
package/dist/server.js ADDED
@@ -0,0 +1,142 @@
1
+ /**
2
+ * MCP Server Setup
3
+ *
4
+ * Creates and configures the MCP server with tools and resources
5
+ * for Convex database exploration.
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
10
+ import { createServer as createHttpServer } from 'http';
11
+ import { schemaBrowserTool, handleSchemaBrowser } from './tools/schema-browser.js';
12
+ import { dashboardTool, handleDashboard } from './tools/dashboard.js';
13
+ import { getSchemaResourceContent } from './resources/schema-browser.js';
14
+ import { getDashboardResourceContent } from './resources/dashboard.js';
15
+ import { ConvexClient } from './convex-client.js';
16
+ export async function createServer() {
17
+ const convexClient = new ConvexClient();
18
+ const server = new Server({
19
+ name: 'convex-mcp-apps',
20
+ version: '1.0.0',
21
+ }, {
22
+ capabilities: {
23
+ tools: {},
24
+ resources: {},
25
+ },
26
+ });
27
+ // List available tools
28
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
29
+ return {
30
+ tools: [schemaBrowserTool, dashboardTool],
31
+ };
32
+ });
33
+ // Handle tool calls
34
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
35
+ const { name, arguments: args } = request.params;
36
+ let result;
37
+ switch (name) {
38
+ case 'schema_browser':
39
+ result = await handleSchemaBrowser(convexClient, args);
40
+ break;
41
+ case 'dashboard_view':
42
+ result = await handleDashboard(convexClient, args);
43
+ break;
44
+ default:
45
+ throw new Error(`Unknown tool: ${name}`);
46
+ }
47
+ // Return properly typed response
48
+ return {
49
+ content: result.content.map((c) => ({
50
+ type: 'text',
51
+ text: c.text,
52
+ })),
53
+ isError: result.isError,
54
+ };
55
+ });
56
+ // List available resources
57
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
58
+ return {
59
+ resources: [
60
+ {
61
+ uri: 'ui://schema-browser',
62
+ name: 'Schema Browser',
63
+ description: 'Interactive UI for browsing Convex database schemas',
64
+ mimeType: 'text/html',
65
+ },
66
+ {
67
+ uri: 'ui://dashboard',
68
+ name: 'Realtime Dashboard',
69
+ description: 'Live charts and metrics for Convex data',
70
+ mimeType: 'text/html',
71
+ },
72
+ ],
73
+ };
74
+ });
75
+ // Handle resource reads
76
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
77
+ const { uri } = request.params;
78
+ if (uri.startsWith('ui://schema-browser')) {
79
+ return {
80
+ contents: [
81
+ {
82
+ uri,
83
+ mimeType: 'text/html',
84
+ text: await getSchemaResourceContent(),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ if (uri.startsWith('ui://dashboard')) {
90
+ return {
91
+ contents: [
92
+ {
93
+ uri,
94
+ mimeType: 'text/html',
95
+ text: await getDashboardResourceContent(),
96
+ },
97
+ ],
98
+ };
99
+ }
100
+ throw new Error(`Unknown resource: ${uri}`);
101
+ });
102
+ return {
103
+ async startStdio() {
104
+ const transport = new StdioServerTransport();
105
+ await server.connect(transport);
106
+ },
107
+ async startHttp(port) {
108
+ // Simple HTTP transport for MCP
109
+ const httpServer = createHttpServer(async (req, res) => {
110
+ if (req.url === '/mcp' && req.method === 'POST') {
111
+ let body = '';
112
+ req.on('data', (chunk) => (body += chunk));
113
+ req.on('end', async () => {
114
+ try {
115
+ const request = JSON.parse(body);
116
+ // Process MCP request through server
117
+ // This is a simplified implementation
118
+ res.writeHead(200, { 'Content-Type': 'application/json' });
119
+ res.end(JSON.stringify({ jsonrpc: '2.0', id: request.id, result: {} }));
120
+ }
121
+ catch (error) {
122
+ res.writeHead(400, { 'Content-Type': 'application/json' });
123
+ res.end(JSON.stringify({ error: 'Invalid request' }));
124
+ }
125
+ });
126
+ }
127
+ else if (req.url === '/health') {
128
+ res.writeHead(200, { 'Content-Type': 'application/json' });
129
+ res.end(JSON.stringify({ status: 'ok' }));
130
+ }
131
+ else {
132
+ res.writeHead(404);
133
+ res.end('Not found');
134
+ }
135
+ });
136
+ return new Promise((resolve) => {
137
+ httpServer.listen(port, () => resolve());
138
+ });
139
+ },
140
+ };
141
+ }
142
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Dashboard Tool
3
+ *
4
+ * MCP tool that creates real-time dashboard visualizations
5
+ * for Convex data - both in terminal AND in browser.
6
+ */
7
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
8
+ import type { ConvexClient } from '../convex-client.js';
9
+ export declare const dashboardTool: Tool;
10
+ interface ToolResponse {
11
+ content: Array<{
12
+ type: string;
13
+ text: string;
14
+ }>;
15
+ isError?: boolean;
16
+ }
17
+ export declare function handleDashboard(client: ConvexClient, args?: Record<string, unknown>): Promise<ToolResponse>;
18
+ export {};
19
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,eAAO,MAAM,aAAa,EAAE,IA6D3B,CAAC;AAEF,UAAU,YAAY;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmBD,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAiHvB"}
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Dashboard Tool
3
+ *
4
+ * MCP tool that creates real-time dashboard visualizations
5
+ * for Convex data - both in terminal AND in browser.
6
+ */
7
+ import { launchUIApp } from '../ui-server.js';
8
+ export const dashboardTool = {
9
+ name: 'dashboard_view',
10
+ description: `Creates a real-time dashboard for visualizing Convex data.
11
+
12
+ Features:
13
+ - Metric cards for single values
14
+ - Line and bar charts for time series
15
+ - Tables for detailed records
16
+ - Real-time updates via Convex subscriptions
17
+
18
+ The dashboard renders as an interactive UI panel with live data.`,
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ deployment: {
23
+ type: 'string',
24
+ description: 'Deployment selector (from status tool)',
25
+ },
26
+ metrics: {
27
+ type: 'array',
28
+ description: 'Metrics to display on the dashboard',
29
+ items: {
30
+ type: 'object',
31
+ properties: {
32
+ name: { type: 'string', description: 'Display name for the metric' },
33
+ table: { type: 'string', description: 'Table to query' },
34
+ aggregation: {
35
+ type: 'string',
36
+ enum: ['count', 'sum', 'avg', 'min', 'max'],
37
+ description: 'Aggregation function',
38
+ },
39
+ field: { type: 'string', description: 'Field to aggregate (not needed for count)' },
40
+ filter: { type: 'string', description: 'Optional filter expression' },
41
+ },
42
+ required: ['name', 'table', 'aggregation'],
43
+ },
44
+ },
45
+ charts: {
46
+ type: 'array',
47
+ description: 'Charts to display',
48
+ items: {
49
+ type: 'object',
50
+ properties: {
51
+ type: { type: 'string', enum: ['line', 'bar', 'pie'], description: 'Chart type' },
52
+ title: { type: 'string', description: 'Chart title' },
53
+ table: { type: 'string', description: 'Table to query' },
54
+ xField: { type: 'string', description: 'Field for X axis' },
55
+ yField: { type: 'string', description: 'Field for Y axis' },
56
+ groupBy: { type: 'string', description: 'Field to group by' },
57
+ },
58
+ required: ['type', 'title', 'table'],
59
+ },
60
+ },
61
+ refreshInterval: {
62
+ type: 'number',
63
+ description: 'Refresh interval in seconds (default: 5)',
64
+ default: 5,
65
+ },
66
+ },
67
+ required: [],
68
+ },
69
+ };
70
+ export async function handleDashboard(client, args = {}) {
71
+ const { metrics = [], charts = [], refreshInterval = 5 } = args;
72
+ if (!client.isConnected()) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: `## Realtime Dashboard
78
+
79
+ **Connection Error**: No Convex deployment configured.
80
+
81
+ To connect:
82
+ 1. Run \`npx convex login\` to authenticate
83
+ 2. Or set \`CONVEX_URL\` and \`CONVEX_DEPLOY_KEY\` environment variables`,
84
+ },
85
+ ],
86
+ isError: true,
87
+ };
88
+ }
89
+ try {
90
+ // Get all documents for computing metrics
91
+ const allDocuments = await client.getAllDocuments();
92
+ const tables = await client.listTables();
93
+ // Compute actual metric values
94
+ const computedMetrics = metrics.map((m) => {
95
+ const docs = allDocuments[m.table] || [];
96
+ const value = computeAggregation(docs, m.aggregation, m.field);
97
+ return {
98
+ ...m,
99
+ value,
100
+ documentCount: docs.length,
101
+ };
102
+ });
103
+ // If no metrics specified, auto-generate from tables
104
+ const autoMetrics = metrics.length === 0
105
+ ? tables.map((t) => ({
106
+ name: `${t.name} count`,
107
+ table: t.name,
108
+ aggregation: 'count',
109
+ value: (allDocuments[t.name] || []).length,
110
+ documentCount: (allDocuments[t.name] || []).length,
111
+ }))
112
+ : [];
113
+ // Build config for UI app
114
+ const config = {
115
+ deploymentUrl: client.getDeploymentUrl(),
116
+ metrics: metrics.length > 0 ? computedMetrics : autoMetrics,
117
+ charts,
118
+ refreshInterval,
119
+ allDocuments,
120
+ tables: tables.map((t) => ({
121
+ name: t.name,
122
+ documentCount: (allDocuments[t.name] || []).length,
123
+ })),
124
+ };
125
+ // Launch the interactive UI in browser
126
+ let uiUrl = '';
127
+ try {
128
+ const uiServer = await launchUIApp({
129
+ appName: 'realtime-dashboard',
130
+ config,
131
+ port: 3457,
132
+ autoClose: 30 * 60 * 1000, // Auto-close after 30 minutes
133
+ });
134
+ uiUrl = uiServer.url;
135
+ }
136
+ catch (error) {
137
+ console.error('Failed to launch UI:', error);
138
+ }
139
+ // Build terminal output
140
+ const terminalOutput = buildTerminalOutput(metrics.length > 0 ? computedMetrics : autoMetrics, charts, allDocuments, client.getDeploymentUrl(), uiUrl, refreshInterval);
141
+ return {
142
+ content: [
143
+ {
144
+ type: 'text',
145
+ text: terminalOutput,
146
+ },
147
+ ],
148
+ };
149
+ }
150
+ catch (error) {
151
+ return {
152
+ content: [
153
+ {
154
+ type: 'text',
155
+ text: `## Realtime Dashboard
156
+
157
+ **Error**: ${error instanceof Error ? error.message : String(error)}
158
+
159
+ Please check your Convex credentials and deployment URL.`,
160
+ },
161
+ ],
162
+ isError: true,
163
+ };
164
+ }
165
+ }
166
+ /**
167
+ * Compute aggregation on documents
168
+ */
169
+ function computeAggregation(docs, aggregation, field) {
170
+ if (docs.length === 0)
171
+ return 0;
172
+ switch (aggregation) {
173
+ case 'count':
174
+ return docs.length;
175
+ case 'sum':
176
+ if (!field)
177
+ return 0;
178
+ return docs.reduce((sum, doc) => {
179
+ const val = doc[field];
180
+ return sum + (typeof val === 'number' ? val : 0);
181
+ }, 0);
182
+ case 'avg':
183
+ if (!field)
184
+ return 0;
185
+ const values = docs
186
+ .map((doc) => doc[field])
187
+ .filter((v) => typeof v === 'number');
188
+ if (values.length === 0)
189
+ return 0;
190
+ return values.reduce((a, b) => a + b, 0) / values.length;
191
+ case 'min':
192
+ if (!field)
193
+ return 0;
194
+ const minValues = docs
195
+ .map((doc) => doc[field])
196
+ .filter((v) => typeof v === 'number');
197
+ return minValues.length > 0 ? Math.min(...minValues) : 0;
198
+ case 'max':
199
+ if (!field)
200
+ return 0;
201
+ const maxValues = docs
202
+ .map((doc) => doc[field])
203
+ .filter((v) => typeof v === 'number');
204
+ return maxValues.length > 0 ? Math.max(...maxValues) : 0;
205
+ default:
206
+ return 0;
207
+ }
208
+ }
209
+ /**
210
+ * Build terminal-friendly dashboard output
211
+ */
212
+ function buildTerminalOutput(metrics, charts, allDocuments, deploymentUrl, uiUrl, refreshInterval) {
213
+ const lines = [];
214
+ lines.push('## Realtime Dashboard');
215
+ lines.push('');
216
+ if (uiUrl) {
217
+ lines.push(`**Interactive UI**: ${uiUrl}`);
218
+ lines.push('');
219
+ }
220
+ lines.push(`Connected to: \`${deploymentUrl}\``);
221
+ lines.push(`Refresh interval: ${refreshInterval}s`);
222
+ lines.push('');
223
+ // Metrics section
224
+ if (metrics.length > 0) {
225
+ lines.push('### Metrics');
226
+ lines.push('');
227
+ lines.push('| Metric | Value | Source |');
228
+ lines.push('|--------|-------|--------|');
229
+ for (const m of metrics) {
230
+ const formattedValue = formatNumber(m.value);
231
+ const source = `${m.table} / ${m.aggregation}${m.field ? `(${m.field})` : ''}`;
232
+ lines.push(`| ${m.name} | **${formattedValue}** | ${source} |`);
233
+ }
234
+ lines.push('');
235
+ }
236
+ // Charts section (show what charts would be rendered)
237
+ if (charts.length > 0) {
238
+ lines.push('### Charts');
239
+ lines.push('');
240
+ for (const c of charts) {
241
+ lines.push(`- **${c.title}** (${c.type} chart from \`${c.table}\`)`);
242
+ }
243
+ lines.push('');
244
+ }
245
+ // Recent activity
246
+ lines.push('### Recent Documents');
247
+ lines.push('');
248
+ const flatDocs = [];
249
+ for (const [table, docs] of Object.entries(allDocuments)) {
250
+ for (const d of docs) {
251
+ flatDocs.push({
252
+ ...d,
253
+ table,
254
+ });
255
+ }
256
+ }
257
+ const allDocs = flatDocs
258
+ .sort((a, b) => {
259
+ const aTime = a._creationTime || 0;
260
+ const bTime = b._creationTime || 0;
261
+ return bTime - aTime;
262
+ })
263
+ .slice(0, 5);
264
+ if (allDocs.length > 0) {
265
+ lines.push('| Table | ID | Created |');
266
+ lines.push('|-------|-----|---------|');
267
+ for (const doc of allDocs) {
268
+ const id = String(doc._id || '').slice(0, 10) + '...';
269
+ const created = doc._creationTime
270
+ ? formatTimeAgo(doc._creationTime)
271
+ : 'Unknown';
272
+ lines.push(`| ${doc.table} | \`${id}\` | ${created} |`);
273
+ }
274
+ }
275
+ else {
276
+ lines.push('*No documents found*');
277
+ }
278
+ return lines.join('\n');
279
+ }
280
+ /**
281
+ * Format number for display
282
+ */
283
+ function formatNumber(num) {
284
+ if (num >= 1000000)
285
+ return (num / 1000000).toFixed(1) + 'M';
286
+ if (num >= 1000)
287
+ return (num / 1000).toFixed(1) + 'k';
288
+ if (Number.isInteger(num))
289
+ return num.toString();
290
+ return num.toFixed(2);
291
+ }
292
+ /**
293
+ * Format timestamp as relative time
294
+ */
295
+ function formatTimeAgo(timestamp) {
296
+ const now = Date.now();
297
+ const diff = now - timestamp;
298
+ const minutes = Math.floor(diff / 60000);
299
+ const hours = Math.floor(diff / 3600000);
300
+ const days = Math.floor(diff / 86400000);
301
+ if (minutes < 1)
302
+ return 'Just now';
303
+ if (minutes < 60)
304
+ return `${minutes}m ago`;
305
+ if (hours < 24)
306
+ return `${hours}h ago`;
307
+ return `${days}d ago`;
308
+ }
309
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Schema Browser Tool
3
+ *
4
+ * MCP tool that displays database schema in terminal AND
5
+ * opens an interactive schema browser UI in the browser.
6
+ */
7
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
8
+ import type { ConvexClient } from '../convex-client.js';
9
+ export declare const schemaBrowserTool: Tool;
10
+ interface ToolResponse {
11
+ content: Array<{
12
+ type: string;
13
+ text: string;
14
+ }>;
15
+ isError?: boolean;
16
+ }
17
+ export declare function handleSchemaBrowser(client: ConvexClient, args?: Record<string, unknown>): Promise<ToolResponse>;
18
+ export {};
19
+ //# sourceMappingURL=schema-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-browser.d.ts","sourceRoot":"","sources":["../../src/tools/schema-browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,eAAO,MAAM,iBAAiB,EAAE,IAqC/B,CAAC;AAEF,UAAU,YAAY;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAqHvB"}