@instantdb/mcp 0.22.51 → 0.22.52-experimental.create-token.19444640845.1
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/dist/index.js +80 -0
- package/dist/index.js.map +1 -1
- package/package.json +7 -5
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@ import { zodToSchema } from "./schema.js";
|
|
|
9
9
|
import { parseArgs } from 'node:util';
|
|
10
10
|
import version from "./version.js";
|
|
11
11
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
12
|
+
import { HoneycombSDK } from '@honeycombio/opentelemetry-node';
|
|
13
|
+
import { trace, SpanKind, SpanStatusCode, } from '@opentelemetry/api';
|
|
12
14
|
import { createOAuthMetadata, mcpAuthRouter, } from '@modelcontextprotocol/sdk/server/auth/router.js';
|
|
13
15
|
import { pinoHttp } from 'pino-http';
|
|
14
16
|
import { pino } from 'pino';
|
|
@@ -117,6 +119,38 @@ const appPerms = z
|
|
|
117
119
|
.describe('Permission rules for the app');
|
|
118
120
|
// Tool Registration
|
|
119
121
|
// -----------
|
|
122
|
+
// Adds tracing to server.tool
|
|
123
|
+
function wrapServerWithTracing(server, tracer, attrs) {
|
|
124
|
+
const originalTool = server.tool.bind(server);
|
|
125
|
+
server.tool = function (name, ...args) {
|
|
126
|
+
// Find the callback (it's always the last argument)
|
|
127
|
+
const callback = args[args.length - 1];
|
|
128
|
+
const otherArgs = args.slice(0, -1);
|
|
129
|
+
// Wrap the callback with tracing
|
|
130
|
+
const wrappedCallback = async (...callbackArgs) => {
|
|
131
|
+
const span = tracer.startSpan(`tool.${name}`, {
|
|
132
|
+
attributes: attrs,
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
const result = await callback(...callbackArgs);
|
|
136
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
141
|
+
span.recordException(error);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
span.end();
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
return originalTool(name,
|
|
149
|
+
// @ts-expect-error: not sure how to type this
|
|
150
|
+
...otherArgs, wrappedCallback);
|
|
151
|
+
};
|
|
152
|
+
return server;
|
|
153
|
+
}
|
|
120
154
|
function registerTools(server, api) {
|
|
121
155
|
server.tool('create-app', 'Create a new Instant app. Optionally provide schema and permissions to preconfigure it', {
|
|
122
156
|
name: z.string().describe('Name of the app'),
|
|
@@ -321,6 +355,14 @@ function ensureEnv(key) {
|
|
|
321
355
|
return v;
|
|
322
356
|
}
|
|
323
357
|
async function startSse() {
|
|
358
|
+
const honeycomb = new HoneycombSDK({
|
|
359
|
+
apiKey: process.env.HONEYCOMB_API_KEY,
|
|
360
|
+
serviceName: 'mcp-server',
|
|
361
|
+
});
|
|
362
|
+
if (process.env.HONEYCOMB_API_KEY) {
|
|
363
|
+
honeycomb.start();
|
|
364
|
+
}
|
|
365
|
+
const tracer = trace.getTracer('mcp-server');
|
|
324
366
|
const db = init({
|
|
325
367
|
adminToken: ensureEnv('INSTANT_ADMIN_TOKEN'),
|
|
326
368
|
appId: ensureEnv('INSTANT_APP_ID'),
|
|
@@ -335,6 +377,28 @@ async function startSse() {
|
|
|
335
377
|
const keyConfig = JSON.parse(ensureEnv('INSTANT_AES_KEY'));
|
|
336
378
|
const app = express();
|
|
337
379
|
const logger = pino({ level: 'info' });
|
|
380
|
+
app.use((req, res, next) => {
|
|
381
|
+
const span = tracer.startSpan('http-req', {
|
|
382
|
+
kind: SpanKind.SERVER,
|
|
383
|
+
attributes: {
|
|
384
|
+
'http.method': req.method,
|
|
385
|
+
'http.url': req.url,
|
|
386
|
+
'http.target': req.path,
|
|
387
|
+
'http.host': req.get('host'),
|
|
388
|
+
'http.scheme': req.protocol,
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
const originalEnd = res.end.bind(res);
|
|
392
|
+
res.end = function (...args) {
|
|
393
|
+
span.setAttribute('http.status_code', res.statusCode);
|
|
394
|
+
span.setStatus({
|
|
395
|
+
code: res.statusCode >= 400 ? SpanStatusCode.ERROR : SpanStatusCode.OK,
|
|
396
|
+
});
|
|
397
|
+
span.end();
|
|
398
|
+
return originalEnd(...args);
|
|
399
|
+
};
|
|
400
|
+
next();
|
|
401
|
+
});
|
|
338
402
|
app.use(pinoHttp({
|
|
339
403
|
logger,
|
|
340
404
|
autoLogging: {
|
|
@@ -381,6 +445,14 @@ async function startSse() {
|
|
|
381
445
|
try {
|
|
382
446
|
const tokens = await tokensOfBearerToken(db, req.auth.token);
|
|
383
447
|
const api = createPlatformApi(makeApiAuth(oauthConfig, keyConfig, db, tokens.instantToken));
|
|
448
|
+
wrapServerWithTracing(server, tracer, {
|
|
449
|
+
'client.client_id': tokens.mcpToken.client?.client_id,
|
|
450
|
+
'client.name': tokens.mcpToken.client?.client_name,
|
|
451
|
+
'client.id': tokens.mcpToken.client?.id,
|
|
452
|
+
'client.scope': tokens.mcpToken.client?.scope,
|
|
453
|
+
'client.uri': tokens.mcpToken.client?.client_uri,
|
|
454
|
+
'client.redirect_urls': tokens.mcpToken.client?.redirect_uris,
|
|
455
|
+
});
|
|
384
456
|
registerTools(server, api);
|
|
385
457
|
const transport = new StreamableHTTPServerTransport({
|
|
386
458
|
sessionIdGenerator: undefined,
|
|
@@ -432,6 +504,14 @@ async function startSse() {
|
|
|
432
504
|
try {
|
|
433
505
|
const tokens = await tokensOfBearerToken(db, req.auth.token);
|
|
434
506
|
const api = createPlatformApi(makeApiAuth(oauthConfig, keyConfig, db, tokens.instantToken));
|
|
507
|
+
wrapServerWithTracing(server, tracer, {
|
|
508
|
+
'client.client_id': tokens.mcpToken.client?.client_id,
|
|
509
|
+
'client.name': tokens.mcpToken.client?.client_name,
|
|
510
|
+
'client.id': tokens.mcpToken.client?.id,
|
|
511
|
+
'client.scope': tokens.mcpToken.client?.scope,
|
|
512
|
+
'client.uri': tokens.mcpToken.client?.client_uri,
|
|
513
|
+
'client.redirect_urls': tokens.mcpToken.client?.redirect_uris,
|
|
514
|
+
});
|
|
435
515
|
registerTools(server, api);
|
|
436
516
|
transports.sse[transport.sessionId] = transport;
|
|
437
517
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport 'dotenv/config';\nimport express, { Request, Response } from 'express';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { PlatformApi } from '@instantdb/platform';\nimport { zodToSchema } from './schema.ts';\nimport { parseArgs } from 'node:util';\nimport version from './version.ts';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\n\nimport {\n createOAuthMetadata,\n mcpAuthRouter,\n} from '@modelcontextprotocol/sdk/server/auth/router.js';\nimport { pinoHttp } from 'pino-http';\nimport { pino } from 'pino';\nimport { init } from '@instantdb/admin';\n\nimport schema from './db/instant.schema.ts';\nimport { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';\nimport { PlatformApiAuth } from '../../platform/dist/esm/api.js';\nimport {\n addOAuthRoutes,\n makeApiAuth,\n OAuthConfig,\n ServiceProvider,\n tokensOfBearerToken,\n} from './oauth-service-provider.ts';\nimport { KeyConfig } from './crypto.ts';\nimport indexHtml from './index.html.ts';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\n\n// Helpers\n// -----------\nfunction createPlatformApi(\n auth: PlatformApiAuth,\n apiURI?: string,\n): PlatformApi {\n return new PlatformApi({\n auth,\n apiURI,\n });\n}\n\nfunction createMCPServer(): McpServer {\n return new McpServer({\n name: '@instantdb/mcp',\n version,\n });\n}\n\nfunction handleError(error: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n isError: boolean;\n} {\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n}\n\n// Zod Schemas\n// -----------\nconst schemaAdditions = z.object({\n entities: z\n .record(\n z.string(),\n z.record(\n z.string(),\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'date', 'json']),\n required: z.boolean().optional().default(true),\n unique: z.boolean().optional().default(false),\n indexed: z.boolean().optional().default(false),\n }),\n ),\n )\n .optional()\n .describe('Entities and their attributes to add'),\n links: z\n .record(\n z.string(),\n z.object({\n from: z.object({\n entity: z.string(),\n has: z.enum(['one', 'many']),\n label: z.string(),\n required: z.boolean().optional(),\n onDelete: z.literal('cascade').optional(),\n }),\n to: z.object({\n entity: z.string(),\n has: z.enum(['one', 'many']),\n label: z.string(),\n required: z.boolean().optional(),\n onDelete: z.literal('cascade').optional(),\n }),\n }),\n )\n .optional()\n .describe('Links to add between entities'),\n});\n\nconst appPerms = z\n .object({\n $default: z\n .object({\n bind: z.array(z.string()).optional().describe('Variables to bind'),\n allow: z.object({\n $default: z.string().nullable().optional(),\n view: z.string().nullable().optional(),\n create: z.string().nullable().optional(),\n update: z.string().nullable().optional(),\n delete: z.string().nullable().optional(),\n }),\n })\n .optional()\n .describe('Default rules for all entities'),\n attrs: z\n .object({\n bind: z.array(z.string()).optional().describe('Variables to bind'),\n allow: z.object({\n $default: z.string().nullable().optional(),\n view: z.string().nullable().optional(),\n create: z.string().nullable().optional(),\n update: z.string().nullable().optional(),\n delete: z.string().nullable().optional(),\n }),\n })\n .optional()\n .describe('Rules for all attributes'),\n })\n .catchall(\n z.object({\n bind: z.array(z.string()).optional().describe('Variables to bind'),\n allow: z.object({\n $default: z.string().nullable().optional(),\n view: z.string().nullable().optional(),\n create: z.string().nullable().optional(),\n update: z.string().nullable().optional(),\n delete: z.string().nullable().optional(),\n }),\n }),\n )\n .describe('Permission rules for the app');\n\n// Tool Registration\n// -----------\nfunction registerTools(server: McpServer, api: PlatformApi) {\n server.tool(\n 'create-app',\n 'Create a new Instant app. Optionally provide schema and permissions to preconfigure it',\n {\n name: z.string().describe('Name of the app'),\n title: z\n .string()\n .describe(\n 'Title of the app. If not provided, come up with a default title based on the context of the app',\n ),\n schema: schemaAdditions\n .optional()\n .describe('Initial schema additions to apply'),\n perms: appPerms.optional().describe('Initial permission rules to apply'),\n },\n async ({ title, schema, perms }) => {\n try {\n const result = await api.createApp({\n title,\n schema: schema ? zodToSchema(schema) : ({} as unknown as any),\n perms: perms || {},\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-apps',\n 'List all apps owned by the authenticated user',\n async () => {\n try {\n const result = await api.getApps();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-app',\n 'Fetch a single app by its ID',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n includeSchema: z\n .boolean()\n .optional()\n .describe('Include schema in response'),\n includePerms: z\n .boolean()\n .optional()\n .describe('Include permissions in response'),\n },\n async ({ appId, includeSchema, includePerms }) => {\n try {\n const opts = { includeSchema, includePerms };\n const result = await api.getApp(appId, opts);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-schema',\n 'Fetch schema for an app by its ID',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n },\n async ({ appId }) => {\n try {\n const { schema } = await api.getSchema(appId);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(schema, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-perms',\n 'Fetch permissions for an app by its ID',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n },\n async ({ appId }) => {\n try {\n const { perms } = await api.getPerms(appId);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(perms, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'plan-schema-push',\n 'Dry-run a schema push and receive a plan of steps the server would execute',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n additions: schemaAdditions.describe(\n 'New Instant schema additions to apply to an app',\n ),\n },\n async ({ appId, additions }) => {\n try {\n const schema = zodToSchema(additions);\n const result = await api.planSchemaPush(appId, {\n schema: schema as unknown as any,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'push-schema',\n \"Execute a schema push. Use this after 'plan-schema-push' to apply changes\",\n {\n appId: z.string().uuid().describe('UUID of the app'),\n additions: schemaAdditions.describe(\n 'New Instant schema additions to apply',\n ),\n },\n async ({ appId, additions }) => {\n try {\n const schema = zodToSchema(additions);\n const result = await api.schemaPush(appId, {\n schema: schema as unknown as any,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'push-perms',\n 'Execute a permissions push.',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n perms: appPerms.describe(\n 'Instant permission rules to apply. You should first fetch the current rules using `get-perms` and modify them as needed',\n ),\n },\n async ({ appId, perms }) => {\n try {\n const result = await api.pushPerms(appId, { perms });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n}\n\nasync function startStdio() {\n const {\n values: { token, ['api-url']: apiUrl },\n } = parseArgs({\n options: {\n token: {\n type: 'string',\n },\n ['api-url']: {\n type: 'string',\n },\n },\n });\n\n const accessToken = token || process.env.INSTANT_ACCESS_TOKEN;\n if (!accessToken) {\n console.error(\n 'Provide an access token using --token or set INSTANT_ACCESS_TOKEN environment variable',\n );\n process.exit(1);\n }\n\n const api = createPlatformApi({ token: accessToken }, apiUrl);\n const server = createMCPServer();\n registerTools(server, api);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Instant Platform MCP Server running on stdio');\n}\n\nfunction ensureEnv(key: string): string {\n const v = process.env[key];\n if (!v) {\n throw new Error(`Missing environment variable ${key}`);\n }\n return v;\n}\n\nasync function startSse() {\n const db = init({\n adminToken: ensureEnv('INSTANT_ADMIN_TOKEN'),\n appId: ensureEnv('INSTANT_APP_ID'),\n schema,\n disableValidation: true,\n });\n\n const oauthConfig: OAuthConfig = {\n clientId: ensureEnv('INSTANT_OAUTH_CLIENT_ID'),\n clientSecret: ensureEnv('INSTANT_OAUTH_CLIENT_SECRET'),\n serverOrigin: ensureEnv('SERVER_ORIGIN'),\n };\n\n const keyConfig: KeyConfig = JSON.parse(ensureEnv('INSTANT_AES_KEY'));\n\n const app = express();\n const logger = pino({ level: 'info' });\n app.use(\n pinoHttp({\n logger,\n autoLogging: {\n ignore(req) {\n return req.url === '/health';\n },\n },\n }),\n );\n app.use(express.json());\n\n const proxyProvider = new ServiceProvider(db, oauthConfig, keyConfig);\n\n const authRouterOptions = {\n scopesSupported: ['apps-read', 'apps-write'],\n provider: proxyProvider,\n issuerUrl: new URL(oauthConfig.serverOrigin),\n baseUrl: new URL(oauthConfig.serverOrigin),\n serviceDocumentationUrl: new URL('https://instantdb.com/docs'),\n };\n\n const oauthMetadata = createOAuthMetadata(authRouterOptions);\n\n app.use(mcpAuthRouter(authRouterOptions));\n\n addOAuthRoutes(app, db, oauthConfig);\n\n app.get('/.well-known/oauth-protected-resource/mcp', (_req, res) => {\n res.json({\n resource: `${oauthConfig.serverOrigin}/mcp`,\n authorization_servers: [oauthMetadata.issuer],\n scopes_supported: oauthMetadata.scopes_supported,\n resource_documentation: 'https://instantdb.com/docs',\n });\n });\n\n app.get('/.well-known/oauth-protected-resource/sse', (_req, res) => {\n res.json({\n resource: `${oauthConfig.serverOrigin}/mcp`,\n authorization_servers: [oauthMetadata.issuer],\n scopes_supported: oauthMetadata.scopes_supported,\n resource_documentation: 'https://instantdb.com/docs',\n });\n });\n\n const requireTokenMiddleware = (path: string) =>\n requireBearerAuth({\n verifier: proxyProvider,\n resourceMetadataUrl: `${oauthConfig.serverOrigin}/.well-known/oauth-protected-resource/${path}`,\n });\n\n // Handle POST requests for client-to-server communication\n app.post(\n '/mcp',\n requireTokenMiddleware('mcp'),\n async (req: Request, res: Response) => {\n const server = createMCPServer();\n try {\n const tokens = await tokensOfBearerToken(db, req.auth!.token);\n\n const api = createPlatformApi(\n makeApiAuth(oauthConfig, keyConfig, db, tokens.instantToken),\n );\n\n registerTools(server, api);\n const transport: StreamableHTTPServerTransport =\n new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n req.on('close', () => {\n transport.close();\n server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n } catch (e) {\n console.error('Error handling MCP request:', e);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n }\n },\n );\n\n // We're a stateless server, so disallow these\n const handleSessionRequest = async (\n _req: express.Request,\n res: express.Response,\n ) => {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n }),\n );\n };\n\n app.get('/mcp', handleSessionRequest);\n app.delete('/mcp', handleSessionRequest);\n\n // SSE for older clients\n const transports = {\n sse: {} as Record<string, SSEServerTransport>,\n };\n\n app.get(\n '/sse',\n requireTokenMiddleware('sse'),\n async (req: Request, res: Response) => {\n const server = createMCPServer();\n const transport = new SSEServerTransport('/messages', res);\n res.on('close', () => {\n delete transports.sse[transport.sessionId];\n });\n\n try {\n const tokens = await tokensOfBearerToken(db, req.auth!.token);\n\n const api = createPlatformApi(\n makeApiAuth(oauthConfig, keyConfig, db, tokens.instantToken),\n );\n\n registerTools(server, api);\n\n transports.sse[transport.sessionId] = transport;\n } catch (e) {\n console.error('Error handling MCP SSE request:', e);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n return;\n }\n\n await server.connect(transport);\n },\n );\n\n // Legacy message endpoint for older clients\n app.post('/messages', async (req, res) => {\n const sessionId = req.query.sessionId as string;\n const transport = transports.sse[sessionId];\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send('No transport found for sessionId');\n }\n });\n\n app.get('/', (_req, res: Response) => {\n res\n .status(200)\n .set('Content-Type', 'text/html; charset=UTF-8')\n .send(indexHtml(oauthConfig.serverOrigin));\n });\n\n app.get('/health', (_req, res: Response) => {\n res.status(200).send('Tip top!');\n });\n\n const port = parseInt(process.env.PORT || '3123');\n const host = process.env.IN_FLY ? '0.0.0.0' : 'localhost';\n\n if (process.env.IN_FLY) {\n app.set('trust proxy', 2);\n }\n\n app.listen(port, host, () => console.log(`listening on port ${port}`));\n}\n\nasync function main() {\n if (process.env.SERVER_TYPE === 'http') {\n return startSse();\n }\n return startStdio();\n}\n\nmain().catch((error) => {\n console.error('Fatal error in main():', error);\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport 'dotenv/config';\nimport express, { Request, Response } from 'express';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { PlatformApi } from '@instantdb/platform';\nimport { zodToSchema } from './schema.ts';\nimport { parseArgs } from 'node:util';\nimport version from './version.ts';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { HoneycombSDK } from '@honeycombio/opentelemetry-node';\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n Tracer,\n Attributes,\n} from '@opentelemetry/api';\n\nimport {\n createOAuthMetadata,\n mcpAuthRouter,\n} from '@modelcontextprotocol/sdk/server/auth/router.js';\nimport { pinoHttp } from 'pino-http';\nimport { pino } from 'pino';\nimport { init } from '@instantdb/admin';\n\nimport schema from './db/instant.schema.ts';\nimport { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';\nimport { PlatformApiAuth } from '../../platform/dist/esm/api.js';\nimport {\n addOAuthRoutes,\n makeApiAuth,\n OAuthConfig,\n ServiceProvider,\n tokensOfBearerToken,\n} from './oauth-service-provider.ts';\nimport { KeyConfig } from './crypto.ts';\nimport indexHtml from './index.html.ts';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\n\n// Helpers\n// -----------\nfunction createPlatformApi(\n auth: PlatformApiAuth,\n apiURI?: string,\n): PlatformApi {\n return new PlatformApi({\n auth,\n apiURI,\n });\n}\n\nfunction createMCPServer(): McpServer {\n return new McpServer({\n name: '@instantdb/mcp',\n version,\n });\n}\n\nfunction handleError(error: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n isError: boolean;\n} {\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n}\n\n// Zod Schemas\n// -----------\nconst schemaAdditions = z.object({\n entities: z\n .record(\n z.string(),\n z.record(\n z.string(),\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'date', 'json']),\n required: z.boolean().optional().default(true),\n unique: z.boolean().optional().default(false),\n indexed: z.boolean().optional().default(false),\n }),\n ),\n )\n .optional()\n .describe('Entities and their attributes to add'),\n links: z\n .record(\n z.string(),\n z.object({\n from: z.object({\n entity: z.string(),\n has: z.enum(['one', 'many']),\n label: z.string(),\n required: z.boolean().optional(),\n onDelete: z.literal('cascade').optional(),\n }),\n to: z.object({\n entity: z.string(),\n has: z.enum(['one', 'many']),\n label: z.string(),\n required: z.boolean().optional(),\n onDelete: z.literal('cascade').optional(),\n }),\n }),\n )\n .optional()\n .describe('Links to add between entities'),\n});\n\nconst appPerms = z\n .object({\n $default: z\n .object({\n bind: z.array(z.string()).optional().describe('Variables to bind'),\n allow: z.object({\n $default: z.string().nullable().optional(),\n view: z.string().nullable().optional(),\n create: z.string().nullable().optional(),\n update: z.string().nullable().optional(),\n delete: z.string().nullable().optional(),\n }),\n })\n .optional()\n .describe('Default rules for all entities'),\n attrs: z\n .object({\n bind: z.array(z.string()).optional().describe('Variables to bind'),\n allow: z.object({\n $default: z.string().nullable().optional(),\n view: z.string().nullable().optional(),\n create: z.string().nullable().optional(),\n update: z.string().nullable().optional(),\n delete: z.string().nullable().optional(),\n }),\n })\n .optional()\n .describe('Rules for all attributes'),\n })\n .catchall(\n z.object({\n bind: z.array(z.string()).optional().describe('Variables to bind'),\n allow: z.object({\n $default: z.string().nullable().optional(),\n view: z.string().nullable().optional(),\n create: z.string().nullable().optional(),\n update: z.string().nullable().optional(),\n delete: z.string().nullable().optional(),\n }),\n }),\n )\n .describe('Permission rules for the app');\n\n// Tool Registration\n// -----------\n\n// Adds tracing to server.tool\nfunction wrapServerWithTracing(\n server: McpServer,\n tracer: Tracer,\n attrs: Attributes,\n): McpServer {\n const originalTool = server.tool.bind(server);\n\n server.tool = function (name: string, ...args: any[]): any {\n // Find the callback (it's always the last argument)\n const callback = args[args.length - 1];\n const otherArgs = args.slice(0, -1);\n\n // Wrap the callback with tracing\n const wrappedCallback = async (...callbackArgs: any[]) => {\n const span = tracer.startSpan(`tool.${name}`, {\n attributes: attrs,\n });\n try {\n const result = await callback(...callbackArgs);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.recordException(error as Error);\n throw error;\n } finally {\n span.end();\n }\n };\n\n return originalTool(\n name,\n // @ts-expect-error: not sure how to type this\n ...otherArgs,\n wrappedCallback,\n );\n } as any;\n\n return server;\n}\n\nfunction registerTools(server: McpServer, api: PlatformApi) {\n server.tool(\n 'create-app',\n 'Create a new Instant app. Optionally provide schema and permissions to preconfigure it',\n {\n name: z.string().describe('Name of the app'),\n title: z\n .string()\n .describe(\n 'Title of the app. If not provided, come up with a default title based on the context of the app',\n ),\n schema: schemaAdditions\n .optional()\n .describe('Initial schema additions to apply'),\n perms: appPerms.optional().describe('Initial permission rules to apply'),\n },\n async ({ title, schema, perms }) => {\n try {\n const result = await api.createApp({\n title,\n schema: schema ? zodToSchema(schema) : ({} as unknown as any),\n perms: perms || {},\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-apps',\n 'List all apps owned by the authenticated user',\n async () => {\n try {\n const result = await api.getApps();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-app',\n 'Fetch a single app by its ID',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n includeSchema: z\n .boolean()\n .optional()\n .describe('Include schema in response'),\n includePerms: z\n .boolean()\n .optional()\n .describe('Include permissions in response'),\n },\n async ({ appId, includeSchema, includePerms }) => {\n try {\n const opts = { includeSchema, includePerms };\n const result = await api.getApp(appId, opts);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-schema',\n 'Fetch schema for an app by its ID',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n },\n async ({ appId }) => {\n try {\n const { schema } = await api.getSchema(appId);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(schema, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'get-perms',\n 'Fetch permissions for an app by its ID',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n },\n async ({ appId }) => {\n try {\n const { perms } = await api.getPerms(appId);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(perms, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'plan-schema-push',\n 'Dry-run a schema push and receive a plan of steps the server would execute',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n additions: schemaAdditions.describe(\n 'New Instant schema additions to apply to an app',\n ),\n },\n async ({ appId, additions }) => {\n try {\n const schema = zodToSchema(additions);\n const result = await api.planSchemaPush(appId, {\n schema: schema as unknown as any,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'push-schema',\n \"Execute a schema push. Use this after 'plan-schema-push' to apply changes\",\n {\n appId: z.string().uuid().describe('UUID of the app'),\n additions: schemaAdditions.describe(\n 'New Instant schema additions to apply',\n ),\n },\n async ({ appId, additions }) => {\n try {\n const schema = zodToSchema(additions);\n const result = await api.schemaPush(appId, {\n schema: schema as unknown as any,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n\n server.tool(\n 'push-perms',\n 'Execute a permissions push.',\n {\n appId: z.string().uuid().describe('UUID of the app'),\n perms: appPerms.describe(\n 'Instant permission rules to apply. You should first fetch the current rules using `get-perms` and modify them as needed',\n ),\n },\n async ({ appId, perms }) => {\n try {\n const result = await api.pushPerms(appId, { perms });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleError(error);\n }\n },\n );\n}\n\nasync function startStdio() {\n const {\n values: { token, ['api-url']: apiUrl },\n } = parseArgs({\n options: {\n token: {\n type: 'string',\n },\n ['api-url']: {\n type: 'string',\n },\n },\n });\n\n const accessToken = token || process.env.INSTANT_ACCESS_TOKEN;\n if (!accessToken) {\n console.error(\n 'Provide an access token using --token or set INSTANT_ACCESS_TOKEN environment variable',\n );\n process.exit(1);\n }\n\n const api = createPlatformApi({ token: accessToken }, apiUrl);\n const server = createMCPServer();\n registerTools(server, api);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Instant Platform MCP Server running on stdio');\n}\n\nfunction ensureEnv(key: string): string {\n const v = process.env[key];\n if (!v) {\n throw new Error(`Missing environment variable ${key}`);\n }\n return v;\n}\n\nasync function startSse() {\n const honeycomb = new HoneycombSDK({\n apiKey: process.env.HONEYCOMB_API_KEY,\n serviceName: 'mcp-server',\n });\n\n if (process.env.HONEYCOMB_API_KEY) {\n honeycomb.start();\n }\n\n const tracer = trace.getTracer('mcp-server');\n\n const db = init({\n adminToken: ensureEnv('INSTANT_ADMIN_TOKEN'),\n appId: ensureEnv('INSTANT_APP_ID'),\n schema,\n disableValidation: true,\n });\n\n const oauthConfig: OAuthConfig = {\n clientId: ensureEnv('INSTANT_OAUTH_CLIENT_ID'),\n clientSecret: ensureEnv('INSTANT_OAUTH_CLIENT_SECRET'),\n serverOrigin: ensureEnv('SERVER_ORIGIN'),\n };\n\n const keyConfig: KeyConfig = JSON.parse(ensureEnv('INSTANT_AES_KEY'));\n\n const app = express();\n const logger = pino({ level: 'info' });\n\n app.use((req, res, next) => {\n const span = tracer.startSpan('http-req', {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': req.method,\n 'http.url': req.url,\n 'http.target': req.path,\n 'http.host': req.get('host'),\n 'http.scheme': req.protocol,\n },\n });\n\n const originalEnd = res.end.bind(res);\n res.end = function (this: typeof res, ...args: any[]): typeof res {\n span.setAttribute('http.status_code', res.statusCode);\n span.setStatus({\n code: res.statusCode >= 400 ? SpanStatusCode.ERROR : SpanStatusCode.OK,\n });\n span.end();\n return originalEnd(...args);\n };\n\n next();\n });\n\n app.use(\n pinoHttp({\n logger,\n autoLogging: {\n ignore(req) {\n return req.url === '/health';\n },\n },\n }),\n );\n app.use(express.json());\n\n const proxyProvider = new ServiceProvider(db, oauthConfig, keyConfig);\n\n const authRouterOptions = {\n scopesSupported: ['apps-read', 'apps-write'],\n provider: proxyProvider,\n issuerUrl: new URL(oauthConfig.serverOrigin),\n baseUrl: new URL(oauthConfig.serverOrigin),\n serviceDocumentationUrl: new URL('https://instantdb.com/docs'),\n };\n\n const oauthMetadata = createOAuthMetadata(authRouterOptions);\n\n app.use(mcpAuthRouter(authRouterOptions));\n\n addOAuthRoutes(app, db, oauthConfig);\n\n app.get('/.well-known/oauth-protected-resource/mcp', (_req, res) => {\n res.json({\n resource: `${oauthConfig.serverOrigin}/mcp`,\n authorization_servers: [oauthMetadata.issuer],\n scopes_supported: oauthMetadata.scopes_supported,\n resource_documentation: 'https://instantdb.com/docs',\n });\n });\n\n app.get('/.well-known/oauth-protected-resource/sse', (_req, res) => {\n res.json({\n resource: `${oauthConfig.serverOrigin}/mcp`,\n authorization_servers: [oauthMetadata.issuer],\n scopes_supported: oauthMetadata.scopes_supported,\n resource_documentation: 'https://instantdb.com/docs',\n });\n });\n\n const requireTokenMiddleware = (path: string) =>\n requireBearerAuth({\n verifier: proxyProvider,\n resourceMetadataUrl: `${oauthConfig.serverOrigin}/.well-known/oauth-protected-resource/${path}`,\n });\n\n // Handle POST requests for client-to-server communication\n app.post(\n '/mcp',\n requireTokenMiddleware('mcp'),\n async (req: Request, res: Response) => {\n const server = createMCPServer();\n try {\n const tokens = await tokensOfBearerToken(db, req.auth!.token);\n\n const api = createPlatformApi(\n makeApiAuth(oauthConfig, keyConfig, db, tokens.instantToken),\n );\n\n wrapServerWithTracing(server, tracer, {\n 'client.client_id': tokens.mcpToken.client?.client_id,\n 'client.name': tokens.mcpToken.client?.client_name,\n 'client.id': tokens.mcpToken.client?.id,\n 'client.scope': tokens.mcpToken.client?.scope,\n 'client.uri': tokens.mcpToken.client?.client_uri,\n 'client.redirect_urls': tokens.mcpToken.client?.redirect_uris,\n });\n registerTools(server, api);\n const transport: StreamableHTTPServerTransport =\n new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n req.on('close', () => {\n transport.close();\n server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n } catch (e) {\n console.error('Error handling MCP request:', e);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n }\n },\n );\n\n // We're a stateless server, so disallow these\n const handleSessionRequest = async (\n _req: express.Request,\n res: express.Response,\n ) => {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n }),\n );\n };\n\n app.get('/mcp', handleSessionRequest);\n app.delete('/mcp', handleSessionRequest);\n\n // SSE for older clients\n const transports = {\n sse: {} as Record<string, SSEServerTransport>,\n };\n\n app.get(\n '/sse',\n requireTokenMiddleware('sse'),\n async (req: Request, res: Response) => {\n const server = createMCPServer();\n const transport = new SSEServerTransport('/messages', res);\n res.on('close', () => {\n delete transports.sse[transport.sessionId];\n });\n\n try {\n const tokens = await tokensOfBearerToken(db, req.auth!.token);\n\n const api = createPlatformApi(\n makeApiAuth(oauthConfig, keyConfig, db, tokens.instantToken),\n );\n\n wrapServerWithTracing(server, tracer, {\n 'client.client_id': tokens.mcpToken.client?.client_id,\n 'client.name': tokens.mcpToken.client?.client_name,\n 'client.id': tokens.mcpToken.client?.id,\n 'client.scope': tokens.mcpToken.client?.scope,\n 'client.uri': tokens.mcpToken.client?.client_uri,\n 'client.redirect_urls': tokens.mcpToken.client?.redirect_uris,\n });\n\n registerTools(server, api);\n\n transports.sse[transport.sessionId] = transport;\n } catch (e) {\n console.error('Error handling MCP SSE request:', e);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n return;\n }\n\n await server.connect(transport);\n },\n );\n\n // Legacy message endpoint for older clients\n app.post('/messages', async (req, res) => {\n const sessionId = req.query.sessionId as string;\n const transport = transports.sse[sessionId];\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send('No transport found for sessionId');\n }\n });\n\n app.get('/', (_req, res: Response) => {\n res\n .status(200)\n .set('Content-Type', 'text/html; charset=UTF-8')\n .send(indexHtml(oauthConfig.serverOrigin));\n });\n\n app.get('/health', (_req, res: Response) => {\n res.status(200).send('Tip top!');\n });\n\n const port = parseInt(process.env.PORT || '3123');\n const host = process.env.IN_FLY ? '0.0.0.0' : 'localhost';\n\n if (process.env.IN_FLY) {\n app.set('trust proxy', 2);\n }\n\n app.listen(port, host, () => console.log(`listening on port ${port}`));\n}\n\nasync function main() {\n if (process.env.SERVER_TYPE === 'http') {\n return startSse();\n }\n return startStdio();\n}\n\nmain().catch((error) => {\n console.error('Fatal error in main():', error);\n process.exit(1);\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instantdb/mcp",
|
|
3
|
-
"version": "v0.22.
|
|
3
|
+
"version": "v0.22.52-experimental.create-token.19444640845.1",
|
|
4
4
|
"description": "Model Context Protocol (MCP) server for managing Instant apps, schemas, and permissions!",
|
|
5
5
|
"homepage": "https://github.com/instantdb/instant/tree/main/client/packages/mcp",
|
|
6
6
|
"repository": {
|
|
@@ -26,7 +26,9 @@
|
|
|
26
26
|
"vitest": "^1.6.0"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
+
"@honeycombio/opentelemetry-node": "^0.7.2",
|
|
29
30
|
"@modelcontextprotocol/sdk": "^1.17.2",
|
|
31
|
+
"@opentelemetry/api": "^1.9.0",
|
|
30
32
|
"cookie-parser": "^1.4.7",
|
|
31
33
|
"dotenv": "^16.3.1",
|
|
32
34
|
"esbuild": "^0.25.5",
|
|
@@ -34,10 +36,10 @@
|
|
|
34
36
|
"pino": "^9.7.0",
|
|
35
37
|
"pino-http": "^10.5.0",
|
|
36
38
|
"zod": "^3.25.39",
|
|
37
|
-
"@instantdb/admin": "v0.22.
|
|
38
|
-
"@instantdb/
|
|
39
|
-
"@instantdb/
|
|
40
|
-
"@instantdb/
|
|
39
|
+
"@instantdb/admin": "v0.22.52-experimental.create-token.19444640845.1",
|
|
40
|
+
"@instantdb/core": "v0.22.52-experimental.create-token.19444640845.1",
|
|
41
|
+
"@instantdb/platform": "v0.22.52-experimental.create-token.19444640845.1",
|
|
42
|
+
"@instantdb/version": "v0.22.52-experimental.create-token.19444640845.1"
|
|
41
43
|
},
|
|
42
44
|
"engines": {
|
|
43
45
|
"node": ">=18"
|