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.
- package/README.md +844 -0
- package/dist/apps/apps/realtime-dashboard/index.html +15 -0
- package/dist/apps/apps/schema-browser/index.html +15 -0
- package/dist/apps/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
- package/dist/apps/assets/realtime-dashboard-BPA99DZn.js +140 -0
- package/dist/apps/assets/schema-browser-BEcF8hRP.js +499 -0
- package/dist/apps/assets/style-BTxSpbLq.css +1 -0
- package/dist/convex-client.d.ts +56 -0
- package/dist/convex-client.d.ts.map +1 -0
- package/dist/convex-client.js +206 -0
- package/dist/convex-client.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/dashboard.d.ts +7 -0
- package/dist/resources/dashboard.d.ts.map +1 -0
- package/dist/resources/dashboard.js +255 -0
- package/dist/resources/dashboard.js.map +1 -0
- package/dist/resources/schema-browser.d.ts +7 -0
- package/dist/resources/schema-browser.d.ts.map +1 -0
- package/dist/resources/schema-browser.js +654 -0
- package/dist/resources/schema-browser.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +142 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/dashboard.d.ts +19 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +309 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/schema-browser.d.ts +19 -0
- package/dist/tools/schema-browser.d.ts.map +1 -0
- package/dist/tools/schema-browser.js +260 -0
- package/dist/tools/schema-browser.js.map +1 -0
- package/dist/ui-server.d.ts +26 -0
- package/dist/ui-server.d.ts.map +1 -0
- package/dist/ui-server.js +202 -0
- package/dist/ui-server.js.map +1 -0
- 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"}
|