@instantdb/mcp 0.20.21 → 0.20.22-experimental.aggregator.16923319501
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.html.js +1 -1
- package/dist/index.html.js.map +1 -1
- package/dist/index.js +26 -7
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.html.js
CHANGED
|
@@ -2,7 +2,7 @@ const html = (serverOrigin) => {
|
|
|
2
2
|
const dev = !serverOrigin.startsWith('https');
|
|
3
3
|
const mcpUrl = `${serverOrigin}/mcp`;
|
|
4
4
|
const cursorConfig = Buffer.from(JSON.stringify({ url: mcpUrl }), 'utf-8').toString('base64');
|
|
5
|
-
const cursorUrl = `https://cursor.com/install-mcp?name=InstantDB${dev ? '%20Dev' : ''}&config=${cursorConfig}`;
|
|
5
|
+
const cursorUrl = `https://cursor.com/en/install-mcp?name=InstantDB${dev ? '%20Dev' : ''}&config=${cursorConfig}`;
|
|
6
6
|
return /* HTML */ `<!doctype html>
|
|
7
7
|
<html lang="en">
|
|
8
8
|
<head>
|
package/dist/index.html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.html.js","sourceRoot":"","sources":["../src/index.html.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,CAAC,YAAoB,EAAU,EAAE;IAC5C,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,YAAY,MAAM,CAAC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAC/B,OAAO,CACR,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErB,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"index.html.js","sourceRoot":"","sources":["../src/index.html.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,CAAC,YAAoB,EAAU,EAAE;IAC5C,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,YAAY,MAAM,CAAC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAC/B,OAAO,CACR,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErB,MAAM,SAAS,GAAG,mDAAmD,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,YAAY,EAAE,CAAC;IAClH,OAAO,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAoDG,SAAS;;;;;;;;;;wCAUQ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwClC,CAAC;AACb,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC","sourcesContent":["const html = (serverOrigin: string): string => {\n const dev = !serverOrigin.startsWith('https');\n const mcpUrl = `${serverOrigin}/mcp`;\n const cursorConfig = Buffer.from(\n JSON.stringify({ url: mcpUrl }),\n 'utf-8',\n ).toString('base64');\n\n const cursorUrl = `https://cursor.com/en/install-mcp?name=InstantDB${dev ? '%20Dev' : ''}&config=${cursorConfig}`;\n return /* HTML */ `<!doctype html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>InstantDB Remote MCP Server</title>\n <style>\n body {\n font-family: sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 64px;\n color: #1c1e21;\n }\n .container {\n text-align: center;\n padding: 2rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n .copy-container {\n display: flex;\n margin: 1rem;\n width: 384px;\n }\n #mcpUrl {\n flex-grow: 1; /* Allows input to fill available space */\n padding: 0.5rem;\n font-size: 1rem;\n border: 1px solid #ccc;\n border-right: none;\n border-radius: 4px 0 0 4px;\n background-color: #f9f9f9;\n }\n #copyButton {\n padding: 0.5rem 1rem;\n border: 1px solid #007bff;\n background-color: #007bff;\n color: white;\n cursor: pointer;\n border-radius: 0 4px 4px 0;\n font-size: 1rem;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome to InstantDB's remote MCP Server!</h1>\n\n <p>\n <a href=\"${cursorUrl}\">\n <img\n src=\"https://cursor.com/deeplink/mcp-install-dark.svg\"\n alt=\"Add InstantDB's MCP server to Cursor\"\n height=\"32\"\n />\n </a>\n </p>\n\n <div class=\"copy-container\">\n <input type=\"text\" value=\"${mcpUrl}\" id=\"mcpUrl\" readonly />\n <button id=\"copyButton\">Copy</button>\n </div>\n\n <p>\n <a href=\"https://www.instantdb.com/docs/using-llms\"\n >Learn more in the docs.</a\n >\n </p>\n\n <p>\n <a\n href=\"https://github.com/instantdb/instant/tree/main/client/packages/mcp\"\n >View the code on GitHub.</a\n >\n </p>\n </div>\n\n <script>\n const copyButton = document.getElementById('copyButton');\n const mcpUrlInput = document.getElementById('mcpUrl');\n\n copyButton.addEventListener('click', () => {\n // Use the modern Navigator Clipboard API\n navigator.clipboard\n .writeText(mcpUrlInput.value)\n .then(() => {\n // Provide visual feedback to the user\n copyButton.textContent = 'Copied!';\n // Reset the button text after 2 seconds\n setTimeout(() => {\n copyButton.textContent = 'Copy';\n }, 2000);\n })\n .catch((err) => {\n console.error('Failed to copy text: ', err);\n });\n });\n </script>\n </body>\n </html>`;\n};\n\nexport default html;\n"]}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ 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 { mcpAuthRouter } from '@modelcontextprotocol/sdk/server/auth/router.js';
|
|
12
|
+
import { createOAuthMetadata, mcpAuthRouter, } from '@modelcontextprotocol/sdk/server/auth/router.js';
|
|
13
13
|
import { pinoHttp } from 'pino-http';
|
|
14
14
|
import { pino } from 'pino';
|
|
15
15
|
import { init } from '@instantdb/admin';
|
|
@@ -335,6 +335,7 @@ async function startSse() {
|
|
|
335
335
|
adminToken: ensureEnv('INSTANT_ADMIN_TOKEN'),
|
|
336
336
|
appId: ensureEnv('INSTANT_APP_ID'),
|
|
337
337
|
schema,
|
|
338
|
+
disableValidation: true,
|
|
338
339
|
});
|
|
339
340
|
const oauthConfig = {
|
|
340
341
|
clientId: ensureEnv('INSTANT_OAUTH_CLIENT_ID'),
|
|
@@ -354,20 +355,38 @@ async function startSse() {
|
|
|
354
355
|
}));
|
|
355
356
|
app.use(express.json());
|
|
356
357
|
const proxyProvider = new ServiceProvider(db, oauthConfig, keyConfig);
|
|
357
|
-
|
|
358
|
+
const authRouterOptions = {
|
|
358
359
|
scopesSupported: ['apps-read', 'apps-write'],
|
|
359
360
|
provider: proxyProvider,
|
|
360
361
|
issuerUrl: new URL(oauthConfig.serverOrigin),
|
|
361
362
|
baseUrl: new URL(oauthConfig.serverOrigin),
|
|
362
363
|
serviceDocumentationUrl: new URL('https://instantdb.com/docs'),
|
|
363
|
-
}
|
|
364
|
+
};
|
|
365
|
+
const oauthMetadata = createOAuthMetadata(authRouterOptions);
|
|
366
|
+
app.use(mcpAuthRouter(authRouterOptions));
|
|
364
367
|
addOAuthRoutes(app, db, oauthConfig);
|
|
365
|
-
|
|
368
|
+
app.get('/.well-known/oauth-protected-resource/mcp', (_req, res) => {
|
|
369
|
+
res.json({
|
|
370
|
+
resource: `${oauthConfig.serverOrigin}/mcp`,
|
|
371
|
+
authorization_servers: [oauthMetadata.issuer],
|
|
372
|
+
scopes_supported: oauthMetadata.scopes_supported,
|
|
373
|
+
resource_documentation: 'https://instantdb.com/docs',
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
app.get('/.well-known/oauth-protected-resource/sse', (_req, res) => {
|
|
377
|
+
res.json({
|
|
378
|
+
resource: `${oauthConfig.serverOrigin}/mcp`,
|
|
379
|
+
authorization_servers: [oauthMetadata.issuer],
|
|
380
|
+
scopes_supported: oauthMetadata.scopes_supported,
|
|
381
|
+
resource_documentation: 'https://instantdb.com/docs',
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
const requireTokenMiddleware = (path) => requireBearerAuth({
|
|
366
385
|
verifier: proxyProvider,
|
|
367
|
-
resourceMetadataUrl: `${oauthConfig.serverOrigin}/.well-known/oauth-protected-resource`,
|
|
386
|
+
resourceMetadataUrl: `${oauthConfig.serverOrigin}/.well-known/oauth-protected-resource/${path}`,
|
|
368
387
|
});
|
|
369
388
|
// Handle POST requests for client-to-server communication
|
|
370
|
-
app.post('/mcp', requireTokenMiddleware, async (req, res) => {
|
|
389
|
+
app.post('/mcp', requireTokenMiddleware('mcp'), async (req, res) => {
|
|
371
390
|
const server = createMCPServer();
|
|
372
391
|
try {
|
|
373
392
|
const tokens = await tokensOfBearerToken(db, req.auth.token);
|
|
@@ -414,7 +433,7 @@ async function startSse() {
|
|
|
414
433
|
const transports = {
|
|
415
434
|
sse: {},
|
|
416
435
|
};
|
|
417
|
-
app.get('/sse', requireTokenMiddleware, async (req, res) => {
|
|
436
|
+
app.get('/sse', requireTokenMiddleware('sse'), async (req, res) => {
|
|
418
437
|
const server = createMCPServer();
|
|
419
438
|
const transport = new SSEServerTransport('/messages', res);
|
|
420
439
|
res.on('close', () => {
|
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, Express, query, 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 { mcpAuthRouter } 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 {\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 ({ includeSchema, includePerms }) => {\n try {\n const opts = { includeSchema, includePerms };\n const result = await api.getApps(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-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 });\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 app.use(\n mcpAuthRouter({\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\n addOAuthRoutes(app, db, oauthConfig);\n\n const requireTokenMiddleware = requireBearerAuth({\n verifier: proxyProvider,\n resourceMetadataUrl: `${oauthConfig.serverOrigin}/.well-known/oauth-protected-resource`,\n });\n\n // Handle POST requests for client-to-server communication\n app.post(\n '/mcp',\n requireTokenMiddleware,\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,\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';\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 {\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 ({ includeSchema, includePerms }) => {\n try {\n const opts = { includeSchema, includePerms };\n const result = await api.getApps(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-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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instantdb/mcp",
|
|
3
|
-
"version": "v0.20.
|
|
3
|
+
"version": "v0.20.22-experimental.aggregator.16923319501",
|
|
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,7 @@
|
|
|
26
26
|
"vitest": "^1.6.0"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.17.2",
|
|
30
30
|
"cookie-parser": "^1.4.7",
|
|
31
31
|
"dotenv": "^16.3.1",
|
|
32
32
|
"esbuild": "^0.25.5",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"pino": "^9.7.0",
|
|
35
35
|
"pino-http": "^10.5.0",
|
|
36
36
|
"zod": "^3.25.39",
|
|
37
|
-
"@instantdb/admin": "v0.20.
|
|
38
|
-
"@instantdb/core": "v0.20.
|
|
39
|
-
"@instantdb/platform": "v0.20.
|
|
40
|
-
"@instantdb/version": "v0.20.
|
|
37
|
+
"@instantdb/admin": "v0.20.22-experimental.aggregator.16923319501",
|
|
38
|
+
"@instantdb/core": "v0.20.22-experimental.aggregator.16923319501",
|
|
39
|
+
"@instantdb/platform": "v0.20.22-experimental.aggregator.16923319501",
|
|
40
|
+
"@instantdb/version": "v0.20.22-experimental.aggregator.16923319501"
|
|
41
41
|
},
|
|
42
42
|
"engines": {
|
|
43
43
|
"node": ">=18"
|