diff --git a/.github/workflows/db-migration-backwards-compatibility.yaml b/.github/workflows/db-migration-backwards-compatibility.yaml index 829abf7ae3..e8c9cd765e 100644 --- a/.github/workflows/db-migration-backwards-compatibility.yaml +++ b/.github/workflows/db-migration-backwards-compatibility.yaml @@ -169,6 +169,16 @@ jobs: wait-for: 30s log-output-if: true + - name: Start stack-mcp in background + uses: JarvusInnovations/background-action@v1.0.7 + with: + run: pnpm run start:mcp --log-order=stream & + wait-on: | + http://localhost:8144/health + tail: true + wait-for: 30s + log-output-if: true + - name: Start stack-dashboard in background uses: JarvusInnovations/background-action@v1.0.7 with: @@ -366,6 +376,16 @@ jobs: wait-for: 30s log-output-if: true + - name: Start stack-mcp in background + uses: JarvusInnovations/background-action@v1.0.7 + with: + run: pnpm run start:mcp --log-order=stream & + wait-on: | + http://localhost:8144/health + tail: true + wait-for: 30s + log-output-if: true + - name: Start stack-dashboard in background uses: JarvusInnovations/background-action@v1.0.7 with: diff --git a/.github/workflows/e2e-api-tests-local-emulator.yaml b/.github/workflows/e2e-api-tests-local-emulator.yaml index 3ebed27862..8a875da99c 100644 --- a/.github/workflows/e2e-api-tests-local-emulator.yaml +++ b/.github/workflows/e2e-api-tests-local-emulator.yaml @@ -119,6 +119,15 @@ jobs: tail: true wait-for: 30s log-output-if: true + - name: Start stack-mcp in background + uses: JarvusInnovations/background-action@v1.0.7 + with: + run: pnpm run start:mcp --log-order=stream & + wait-on: | + http://localhost:8144/health + tail: true + wait-for: 30s + log-output-if: true - name: Start stack-dashboard in background uses: JarvusInnovations/background-action@v1.0.7 diff --git a/.github/workflows/e2e-api-tests.yaml b/.github/workflows/e2e-api-tests.yaml index d3d58d132c..34bbd2c34e 100644 --- a/.github/workflows/e2e-api-tests.yaml +++ b/.github/workflows/e2e-api-tests.yaml @@ -125,6 +125,15 @@ jobs: tail: true wait-for: 30s log-output-if: true + - name: Start stack-mcp in background + uses: JarvusInnovations/background-action@v1.0.7 + with: + run: pnpm run start:mcp --log-order=stream & + wait-on: | + http://localhost:8144/health + tail: true + wait-for: 30s + log-output-if: true - name: Start stack-dashboard in background uses: JarvusInnovations/background-action@v1.0.7 with: diff --git a/.github/workflows/e2e-custom-base-port-api-tests.yaml b/.github/workflows/e2e-custom-base-port-api-tests.yaml index 95b7f680d3..8368761684 100644 --- a/.github/workflows/e2e-custom-base-port-api-tests.yaml +++ b/.github/workflows/e2e-custom-base-port-api-tests.yaml @@ -118,6 +118,15 @@ jobs: tail: true wait-for: 30s log-output-if: true + - name: Start stack-mcp in background + uses: JarvusInnovations/background-action@v1.0.7 + with: + run: pnpm run start:mcp --log-order=stream & + wait-on: | + http://localhost:6744/health + tail: true + wait-for: 30s + log-output-if: true - name: Start stack-dashboard in background uses: JarvusInnovations/background-action@v1.0.7 with: diff --git a/apps/backend/package.json b/apps/backend/package.json index 91ac9fa443..be7dce7c51 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -87,7 +87,6 @@ "@stackframe/stack-shared": "workspace:*", "@upstash/qstash": "^2.8.2", "@vercel/functions": "^2.0.0", - "@vercel/mcp-adapter": "^1.0.0", "@vercel/otel": "^1.10.4", "@vercel/sandbox": "^1.2.0", "ai": "^6.0.0", diff --git a/apps/backend/src/app/api/internal/[transport]/route.ts b/apps/backend/src/app/api/internal/[transport]/route.ts deleted file mode 100644 index 7b5880ba06..0000000000 --- a/apps/backend/src/app/api/internal/[transport]/route.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env"; -import { createMcpHandler } from "@vercel/mcp-adapter"; -import { z } from "zod"; - -import withPostHog from "@/analytics"; - -function getBackendApiBaseUrl(): string { - return ( - getEnvVariable("NEXT_PUBLIC_SERVER_STACK_API_URL", "") || - getEnvVariable("NEXT_PUBLIC_STACK_API_URL") - ).replace(/\/$/, ""); -} - -const handler = createMcpHandler( - async (server) => { - server.tool( - "ask_stack_auth", - "Ask the Stack Auth documentation assistant. Use this for any question about Stack Auth: setup, APIs, SDK usage, configuration, or troubleshooting. The assistant searches official documentation and answers with citations. Always set `reason` to a short explanation of why you are calling this tool (for product analytics and debugging).", - { - question: z.string().describe("The full question to ask about Stack Auth."), - reason: z - .string() - .min(1) - .describe( - "Why the agent invoked this tool (e.g. user asked about OAuth setup, need Stack Auth API headers). Used for analytics, not sent to the model.", - ), - userPrompt: z - .string() - .min(1) - .describe( - "The original user message/prompt that triggered this tool call. Copy the user's exact words. Don't include any sensitive information.", - ), - conversationId: z - .string() - .optional() - .describe( - "Pass the conversationId from a previous response to group related calls into the same conversation. Omit on the first call - the server will generate one and return it.", - ), - }, - async ({ question, reason, userPrompt, conversationId }) => { - await withPostHog(async (posthog) => { - posthog.capture({ - event: "ask_stack_auth_mcp", - properties: { question, reason }, - distinctId: "mcp-handler", - }); - }); - - const res = await fetch(`${getBackendApiBaseUrl()}/api/latest/ai/query/generate`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - quality: "smart", - speed: "fast", - tools: ["docs"], - systemPrompt: "docs-ask-ai", - messages: [{ role: "user", content: question }], - mcpCallMetadata: { toolName: "ask_stack_auth", reason, userPrompt, conversationId }, - }), - }); - - if (!res.ok) { - const errText = await res.text(); - return { - content: [{ type: "text", text: `Stack Auth AI error (${res.status}): ${errText}` }], - isError: true, - }; - } - - const body = (await res.json()) as { - finalText?: string, - content?: Array<{ type: string, text?: string }>, - conversationId?: string, - }; - - const text = - body.finalText ?? - body.content - ?.filter((c): c is { type: "text", text: string } => c.type === "text" && typeof c.text === "string") - .map((c) => c.text) - .join("\n\n") ?? - ""; - - const responseConversationId = body.conversationId ?? conversationId ?? ""; - - return { - content: [{ type: "text", text: `${text.length > 0 ? text : "(empty response)"}\n\n[conversationId: ${responseConversationId} - pass this value as the conversationId parameter in your next ask_stack_auth call to continue this conversation]` }], - }; - }, - ); - }, - { - serverInfo: { - name: "stack-auth-mcp", - version: "0.1.0", - }, - }, - { - basePath: "/api/internal", - verboseLogs: true, - maxDuration: 120, - } -); - -export { handler as DELETE, handler as GET, handler as POST }; diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx index cab6b61f0e..4bad9d7ec0 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx @@ -37,7 +37,7 @@ const buildInstallPrompt = (command: string) => deindent` ${command} - After it finishes, verify that the Stack Auth MCP server is registered in your AI client config — name: \`stack-auth\`, transport: \`http\`, URL: \`https://mcp.stack-auth.com/\`. The command above should handle this automatically; if for any reason it didn't, please add the MCP server manually so you have live access to Stack Auth docs and APIs. + After it finishes, verify that the Stack Auth MCP server is registered in your AI client config — name: \`stack-auth\`, transport: \`http\`, URL: \`https://mcp.stack-auth.com/mcp\`. The command above should handle this automatically; if for any reason it didn't, please add the MCP server manually so you have live access to Stack Auth docs and APIs. `; export default function SetupPage(props: { toMetrics: () => void }) { diff --git a/apps/dev-launchpad/public/index.html b/apps/dev-launchpad/public/index.html index 8447dd6d98..65470cc686 100644 --- a/apps/dev-launchpad/public/index.html +++ b/apps/dev-launchpad/public/index.html @@ -164,6 +164,15 @@

Background services

img: "https://www.svgrepo.com/show/340122/datastore.svg", importance: 2, }, + { + name: "MCP", + portSuffix: "42", + description: [ + "Src: ./apps/mcp", + "Prod: https://mcp.stack-auth.com/mcp", + ], + importance: 2, + }, { name: "Demo app", portSuffix: "03", diff --git a/apps/e2e/.env b/apps/e2e/.env index 5d0ce780bd..b24d122a82 100644 --- a/apps/e2e/.env +++ b/apps/e2e/.env @@ -1,5 +1,6 @@ STACK_DASHBOARD_BASE_URL= STACK_BACKEND_BASE_URL= +STACK_MCP_BASE_URL= STACK_INTERNAL_PROJECT_ID= STACK_INTERNAL_PROJECT_CLIENT_KEY= STACK_INTERNAL_PROJECT_SERVER_KEY= diff --git a/apps/e2e/.env.development b/apps/e2e/.env.development index c764d48b4b..b4acbfaf93 100644 --- a/apps/e2e/.env.development +++ b/apps/e2e/.env.development @@ -1,5 +1,6 @@ STACK_DASHBOARD_BASE_URL=http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}01 STACK_BACKEND_BASE_URL=http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02 +STACK_MCP_BASE_URL=http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}44 STACK_INTERNAL_PROJECT_ID=internal STACK_INTERNAL_PROJECT_CLIENT_KEY=this-publishable-client-key-is-for-local-development-only STACK_INTERNAL_PROJECT_SERVER_KEY=this-secret-server-key-is-for-local-development-only diff --git a/apps/e2e/tests/backend/endpoints/api/v1/internal/mcp.test.ts b/apps/e2e/tests/backend/endpoints/api/v1/internal/mcp.test.ts index d10d2b08a5..2648e8565f 100644 --- a/apps/e2e/tests/backend/endpoints/api/v1/internal/mcp.test.ts +++ b/apps/e2e/tests/backend/endpoints/api/v1/internal/mcp.test.ts @@ -1,7 +1,7 @@ -import { STACK_BACKEND_BASE_URL, it, niceFetch } from "../../../../../helpers"; +import { STACK_MCP_BASE_URL, it, niceFetch } from "../../../../../helpers"; -async function mcpRequest(body: unknown) { - return await niceFetch(new URL("/api/internal/mcp", STACK_BACKEND_BASE_URL), { +async function mcpRequest(body: unknown, path = "/api/internal/mcp") { + return await niceFetch(new URL(path, STACK_MCP_BASE_URL), { method: "POST", headers: { "content-type": "application/json", @@ -80,6 +80,113 @@ it("internal MCP endpoint should expose the Stack Auth docs assistant tool", asy `); }); +it("public MCP endpoint should expose the Stack Auth docs assistant tool", async ({ expect }) => { + const response = await mcpRequest({ + jsonrpc: "2.0", + id: 1, + method: "tools/list", + }, "/mcp"); + + expect(response.status).toBe(200); + expect(parseMcpBody(response.body)).toMatchObject({ + result: { + tools: [ + { + name: "ask_stack_auth", + }, + ], + }, + }); +}); + +it("public MCP endpoint should expose prompts and resources without method-not-found errors", async ({ expect }) => { + const promptsResponse = await mcpRequest({ + jsonrpc: "2.0", + id: 1, + method: "prompts/list", + }, "/mcp"); + + expect(promptsResponse.status).toBe(200); + expect(parseMcpBody(promptsResponse.body)).toMatchObject({ + result: { + prompts: [ + { + name: "ask_stack_auth", + }, + ], + }, + }); + + const resourcesResponse = await mcpRequest({ + jsonrpc: "2.0", + id: 1, + method: "resources/list", + }, "/mcp"); + + expect(resourcesResponse.status).toBe(200); + expect(parseMcpBody(resourcesResponse.body)).toMatchObject({ + result: { + resources: [ + { + uri: "stack-auth://mcp/setup", + name: "stack-auth-mcp-setup", + }, + ], + }, + }); +}); + +it("MCP service root should redirect GET and POST to /mcp", async ({ expect }) => { + const response = await niceFetch(new URL("/", STACK_MCP_BASE_URL), { + method: "GET", + redirect: "manual", + }); + + expect(response.status).toBe(307); + expect(response.headers.get("location")).toBe("/mcp"); + + const postResponse = await niceFetch(new URL("/", STACK_MCP_BASE_URL), { + method: "POST", + redirect: "manual", + headers: { + "content-type": "application/json", + accept: "application/json, text/event-stream", + }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: 1, + method: "tools/list", + }), + }); + + expect(postResponse.status).toBe(307); + expect(postResponse.headers.get("location")).toBe("/mcp"); +}); + +it("MCP setup page should show client installation instructions", async ({ expect }) => { + const mcpUrl = new URL("/mcp", STACK_MCP_BASE_URL).toString(); + const response = await niceFetch(new URL("/mcp", STACK_MCP_BASE_URL), { + method: "GET", + headers: { + accept: "text/html", + }, + }); + + expect(response.status).toBe(200); + expect(response.headers.get("content-type")).toContain("text/html"); + expect(response.body).toContain("Stack Auth MCP Setup"); + expect(response.body).toContain("Cursor"); + expect(response.body).toContain("Codex"); + expect(response.body).toContain("Claude Code"); + expect(response.body).toContain("VS Code"); + expect(response.body).toContain(`codex mcp add stack-auth --url ${mcpUrl}`); + expect(response.body).toContain(mcpUrl); + expect(response.body).not.toContain("https://mcp.stack-auth.com/mcp"); + expect(response.body).not.toContain("Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code assistance in your development environment."); + expect(response.body).toContain("
"); + expect(response.body).not.toContain("
"); +}); + it("internal MCP endpoint should reject missing required docs assistant fields before invoking AI", async ({ expect }) => { const response = await mcpRequest({ jsonrpc: "2.0", diff --git a/apps/e2e/tests/helpers.ts b/apps/e2e/tests/helpers.ts index 99130e6ccb..4d535820b5 100644 --- a/apps/e2e/tests/helpers.ts +++ b/apps/e2e/tests/helpers.ts @@ -306,6 +306,7 @@ for (const [key, value] of Object.entries(process.env)) { } export const STACK_DASHBOARD_BASE_URL = getEnvVariable("STACK_DASHBOARD_BASE_URL"); export const STACK_BACKEND_BASE_URL = getEnvVariable("STACK_BACKEND_BASE_URL"); +export const STACK_MCP_BASE_URL = getEnvVariable("STACK_MCP_BASE_URL"); /** * The `baseUrl` to pass to SDK constructors (`StackClientApp`, `StackServerApp`, diff --git a/apps/mcp/.env b/apps/mcp/.env new file mode 100644 index 0000000000..2db2ce4b87 --- /dev/null +++ b/apps/mcp/.env @@ -0,0 +1,3 @@ +NEXT_PUBLIC_STACK_API_URL= +NEXT_PUBLIC_SERVER_STACK_API_URL= +NEXT_PUBLIC_POSTHOG_KEY= diff --git a/apps/mcp/.env.development b/apps/mcp/.env.development new file mode 100644 index 0000000000..779f8f46e2 --- /dev/null +++ b/apps/mcp/.env.development @@ -0,0 +1 @@ +NEXT_PUBLIC_STACK_API_URL=http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02 diff --git a/apps/mcp/.env.example b/apps/mcp/.env.example new file mode 100644 index 0000000000..614f5eefcd --- /dev/null +++ b/apps/mcp/.env.example @@ -0,0 +1,3 @@ +NEXT_PUBLIC_STACK_API_URL=# the base URL of Stack's backend/API. For local development, this is `http://localhost:8102`; for the managed service, this is `https://api.stack-auth.com`. +NEXT_PUBLIC_SERVER_STACK_API_URL=# optional server-side override for the backend/API URL. If unset, falls back to NEXT_PUBLIC_STACK_API_URL. +NEXT_PUBLIC_POSTHOG_KEY=# optional PostHog project key for analytics. Leave blank to use the default public key. diff --git a/apps/mcp/.eslintrc.cjs b/apps/mcp/.eslintrc.cjs new file mode 100644 index 0000000000..0bed96e15c --- /dev/null +++ b/apps/mcp/.eslintrc.cjs @@ -0,0 +1,17 @@ +const defaults = require("../../configs/eslint/defaults.js"); +const publicVars = require("../../configs/eslint/extra-rules.js"); + +module.exports = { + extends: ["../../configs/eslint/defaults.js", "../../configs/eslint/next.js"], + ignorePatterns: ["/*", "!/src"], + rules: { + "no-restricted-syntax": [ + ...defaults.rules["no-restricted-syntax"], + publicVars["no-next-public-env"], + { + selector: "MemberExpression[type=MemberExpression][object.type=MemberExpression][object.object.type=Identifier][object.object.name=process][object.property.type=Identifier][object.property.name=env]", + message: "Don't use process.env directly in Stack's MCP service. Use getEnvVariable(...) instead.", + }, + ], + }, +}; diff --git a/apps/mcp/next.config.mjs b/apps/mcp/next.config.mjs new file mode 100644 index 0000000000..575cb88e2e --- /dev/null +++ b/apps/mcp/next.config.mjs @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + poweredByHeader: false, +}; + +export default nextConfig; diff --git a/apps/mcp/package.json b/apps/mcp/package.json new file mode 100644 index 0000000000..026d3da184 --- /dev/null +++ b/apps/mcp/package.json @@ -0,0 +1,32 @@ +{ + "name": "@stackframe/mcp", + "version": "2.8.86", + "repository": "https://github.com/stack-auth/stack-auth", + "private": true, + "type": "module", + "scripts": { + "clean": "rimraf .next && rimraf node_modules", + "typecheck": "tsc --noEmit", + "dev": "next dev --turbopack --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}44", + "build": "next build", + "start": "next start --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}44", + "lint": "eslint ." + }, + "dependencies": { + "@stackframe/stack-shared": "workspace:*", + "@vercel/mcp-adapter": "^1.0.0", + "next": "16.1.7", + "posthog-node": "^4.1.0", + "react": "19.2.3", + "react-dom": "19.2.3", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "20.17.6", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "rimraf": "^5.0.5", + "typescript": "5.9.3" + }, + "packageManager": "pnpm@10.23.0" +} diff --git a/apps/mcp/src/analytics.ts b/apps/mcp/src/analytics.ts new file mode 100644 index 0000000000..17fa3d4743 --- /dev/null +++ b/apps/mcp/src/analytics.ts @@ -0,0 +1,17 @@ +import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env"; +import { PostHog } from "posthog-node"; + +export default async function withPostHog(callback: (posthog: PostHog) => Promise) { + const postHogKey = getEnvVariable("NEXT_PUBLIC_POSTHOG_KEY", "phc_vIUFi0HzHo7oV26OsaZbUASqxvs8qOmap1UBYAutU4k"); + const posthogClient = new PostHog(postHogKey, { + host: "https://eu.i.posthog.com", + flushAt: 1, + flushInterval: 0, + }); + + try { + return await callback(posthogClient); + } finally { + await posthogClient.shutdown(); + } +} diff --git a/apps/mcp/src/app/api/internal/[transport]/route.ts b/apps/mcp/src/app/api/internal/[transport]/route.ts new file mode 100644 index 0000000000..2ecdca0a55 --- /dev/null +++ b/apps/mcp/src/app/api/internal/[transport]/route.ts @@ -0,0 +1,7 @@ +import { createStackMcpHandler } from "@/mcp-handler"; + +const handler = createStackMcpHandler({ + streamableHttpEndpoint: "/api/internal/mcp", +}); + +export { handler as DELETE, handler as GET, handler as POST }; diff --git a/apps/mcp/src/app/health/route.ts b/apps/mcp/src/app/health/route.ts new file mode 100644 index 0000000000..9d5a0fe195 --- /dev/null +++ b/apps/mcp/src/app/health/route.ts @@ -0,0 +1,12 @@ +export function GET() { + return Response.json({ + status: "ok", + }, { + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "*", + "Access-Control-Allow-Headers": "*", + "Access-Control-Expose-Headers": "*", + }, + }); +} diff --git a/apps/mcp/src/app/mcp/route.ts b/apps/mcp/src/app/mcp/route.ts new file mode 100644 index 0000000000..76e163780b --- /dev/null +++ b/apps/mcp/src/app/mcp/route.ts @@ -0,0 +1,21 @@ +import { createStackMcpHandler } from "@/mcp-handler"; +import { renderSetupPageHtml } from "@/setup-page"; + +const handler = createStackMcpHandler({ + streamableHttpEndpoint: "/mcp", +}); + +export function GET(req: Request) { + const accept = req.headers.get("accept") ?? ""; + if (accept.includes("text/event-stream") && !accept.includes("text/html")) { + return handler(req); + } + + return new Response(renderSetupPageHtml(new URL("/mcp", req.url).toString()), { + headers: { + "Content-Type": "text/html; charset=utf-8", + }, + }); +} + +export { handler as DELETE, handler as POST }; diff --git a/apps/mcp/src/app/route.ts b/apps/mcp/src/app/route.ts new file mode 100644 index 0000000000..e51d1063de --- /dev/null +++ b/apps/mcp/src/app/route.ts @@ -0,0 +1,16 @@ +function redirectToMcp() { + return new Response(null, { + status: 307, + headers: { + Location: "/mcp", + }, + }); +} + +export const DELETE = redirectToMcp; +export const GET = redirectToMcp; +export const HEAD = redirectToMcp; +export const OPTIONS = redirectToMcp; +export const PATCH = redirectToMcp; +export const POST = redirectToMcp; +export const PUT = redirectToMcp; diff --git a/apps/mcp/src/mcp-handler.ts b/apps/mcp/src/mcp-handler.ts new file mode 100644 index 0000000000..eef55950a9 --- /dev/null +++ b/apps/mcp/src/mcp-handler.ts @@ -0,0 +1,190 @@ +import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env"; +import { createMcpHandler } from "@vercel/mcp-adapter"; +import { z } from "zod"; + +import withPostHog from "@/analytics"; +import packageJson from "../package.json"; + +function getBackendApiBaseUrl(): string { + return ( + getEnvVariable("NEXT_PUBLIC_SERVER_STACK_API_URL", "") || + getEnvVariable("NEXT_PUBLIC_STACK_API_URL") + ).replace(/\/$/, ""); +} + +type AiTextContent = { + type: "text", + text: string, +}; + +type AiQueryResponse = { + finalText?: string, + content?: AiTextContent[], + conversationId?: string, +}; + +const setupResourceUri = "stack-auth://mcp/setup"; + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null; +} + +function parseAiQueryResponse(value: unknown): AiQueryResponse { + if (!isRecord(value)) { + return {}; + } + + const parsed: AiQueryResponse = {}; + + if (typeof value.finalText === "string") { + parsed.finalText = value.finalText; + } + + if (typeof value.conversationId === "string") { + parsed.conversationId = value.conversationId; + } + + if (Array.isArray(value.content)) { + parsed.content = value.content.flatMap((contentItem) => { + if (!isRecord(contentItem) || contentItem.type !== "text" || typeof contentItem.text !== "string") { + return []; + } + + return [{ + type: "text", + text: contentItem.text, + }]; + }); + } + + return parsed; +} + +export function createStackMcpHandler(config: { streamableHttpEndpoint: string }) { + return createMcpHandler( + async (server) => { + server.resource( + "stack-auth-mcp-setup", + setupResourceUri, + { + title: "Stack Auth MCP setup", + description: "Setup instructions for the Stack Auth MCP server.", + mimeType: "text/markdown", + }, + () => ({ + contents: [{ + uri: setupResourceUri, + mimeType: "text/markdown", + text: `# Stack Auth MCP + +Use this MCP server to ask Stack Auth documentation questions with the ask_stack_auth tool. + +Server URL: ${config.streamableHttpEndpoint} + +Tool: ask_stack_auth +- question: the Stack Auth question to answer +- reason: why the agent is calling the tool +- userPrompt: the original user prompt that triggered the call +- conversationId: optional ID from an earlier response +`, + }], + }), + ); + + server.prompt( + "ask_stack_auth", + "Ask the Stack Auth documentation assistant a question.", + { + question: z.string().describe("The Stack Auth question to ask."), + }, + ({ question }) => ({ + messages: [{ + role: "user", + content: { + type: "text", + text: `Use the ask_stack_auth tool to answer this Stack Auth question: ${question}`, + }, + }], + }), + ); + + server.tool( + "ask_stack_auth", + "Ask the Stack Auth documentation assistant. Use this for any question about Stack Auth: setup, APIs, SDK usage, configuration, or troubleshooting. The assistant searches official documentation and answers with citations. Always set `reason` to a short explanation of why you are calling this tool (for product analytics and debugging).", + { + question: z.string().describe("The full question to ask about Stack Auth."), + reason: z + .string() + .min(1) + .describe( + "Why the agent invoked this tool (e.g. user asked about OAuth setup, need Stack Auth API headers). Used for analytics, not sent to the model.", + ), + userPrompt: z + .string() + .min(1) + .describe( + "The original user message/prompt that triggered this tool call. Copy the user's exact words. Don't include any sensitive information.", + ), + conversationId: z + .string() + .optional() + .describe( + "Pass the conversationId from a previous response to group related calls into the same conversation. Omit on the first call - the server will generate one and return it.", + ), + }, + async ({ question, reason, userPrompt, conversationId }) => { + await withPostHog(async (posthog) => { + posthog.capture({ + event: "ask_stack_auth_mcp", + properties: { question, reason }, + distinctId: "mcp-handler", + }); + }); + + const res = await fetch(`${getBackendApiBaseUrl()}/api/latest/ai/query/generate`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + quality: "smart", + speed: "fast", + tools: ["docs"], + systemPrompt: "docs-ask-ai", + messages: [{ role: "user", content: question }], + mcpCallMetadata: { toolName: "ask_stack_auth", reason, userPrompt, conversationId }, + }), + }); + + if (!res.ok) { + const errText = await res.text(); + return { + content: [{ type: "text", text: `Stack Auth AI error (${res.status}): ${errText}` }], + isError: true, + }; + } + + const body = parseAiQueryResponse(await res.json()); + + const contentText = body.content?.map((c) => c.text).join("\n\n"); + const text = body.finalText ?? contentText ?? ""; + + const responseConversationId = body.conversationId ?? conversationId ?? ""; + + return { + content: [{ type: "text", text: `${text.length > 0 ? text : "(empty response)"}\n\n[conversationId: ${responseConversationId} - pass this value as the conversationId parameter in your next ask_stack_auth call to continue this conversation]` }], + }; + }, + ); + }, + { + serverInfo: { + name: "stack-auth-mcp", + version: packageJson.version, + }, + }, + { + streamableHttpEndpoint: config.streamableHttpEndpoint, + verboseLogs: true, + maxDuration: 120, + }, + ); +} diff --git a/apps/mcp/src/setup-page.ts b/apps/mcp/src/setup-page.ts new file mode 100644 index 0000000000..02d067c21f --- /dev/null +++ b/apps/mcp/src/setup-page.ts @@ -0,0 +1,701 @@ +type SetupTab = { + id: string, + label: string, + content: string, +}; + +function escapeHtml(value: string): string { + return value + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll("\"", """) + .replaceAll("'", "'"); +} + +function codeBlock(language: string, value: string): string { + return `
+
${escapeHtml(language)}
+
${escapeHtml(value)}
+
`; +} + +function getCursorInstallUrl(mcpUrl: string): string { + const url = new URL("cursor://anysphere.cursor-deeplink/mcp/install"); + url.searchParams.set("name", "stack-auth"); + url.searchParams.set("config", Buffer.from(JSON.stringify({ url: mcpUrl })).toString("base64url")); + return url.toString(); +} + +function getVsCodeInstallUrl(mcpUrl: string): string { + const url = new URL("https://insiders.vscode.dev/redirect"); + const installPayload = JSON.stringify({ + type: "http", + name: "stack-auth", + url: mcpUrl, + }); + url.searchParams.set("url", `vscode:mcp/install?${encodeURIComponent(installPayload)}`); + return url.toString(); +} + +function getTabs(mcpUrl: string, cursorInstallUrl: string, vsCodeInstallUrl: string): SetupTab[] { + return [ + { + id: "cursor", + label: "Cursor", + content: `

Configure Stack Auth MCP in Cursor IDE for enhanced code assistance.

+

CAdd to Cursor

+

Manual Installation

+

Add the following to your mcp.json file:

+ ${codeBlock("mcp.json", `{ + "mcpServers": { + "stack-auth": { + "url": "${mcpUrl}" + } + } +}`)}`, + }, + { + id: "vscode", + label: "VS Code", + content: `

Configure Stack Auth MCP in VS Code for enhanced code assistance.

+

VSAdd to VS Code

+

Manual Installation

+

Open a terminal and run the following command:

+ ${codeBlock("Terminal", `code --add-mcp '{"type":"http","name":"stack-auth","url":"${mcpUrl}"}'`)} +

Then, from inside VS Code, open the .vscode/mcp.json file and click "Start server".

`, + }, + { + id: "codex", + label: "Codex", + content: `

Configure Stack Auth MCP in Codex CLI and the Codex IDE extension. The configuration is shared between both.

+

Open a terminal and run the following command:

+ ${codeBlock("Terminal", `codex mcp add stack-auth --url ${mcpUrl}`)} +

Verify it is configured:

+ ${codeBlock("Terminal", "codex mcp list")} +

Manual Installation

+

Alternatively, add the following to ~/.codex/config.toml:

+ ${codeBlock("config.toml", `[mcp_servers.stack-auth] +url = "${mcpUrl}"`)}`, + }, + { + id: "claudecode", + label: "Claude Code", + content: `

Open a terminal and run the following command:

+ ${codeBlock("Terminal", `claude mcp add --transport http stack-auth ${mcpUrl}`)} +

From within Claude Code, you can use the /mcp command to get more information about the server.

`, + }, + { + id: "claudedesktop", + label: "Claude Desktop", + content: `

Open Claude Desktop and navigate to Settings > Connectors > Add Custom Connector.

+

Enter the name as stack-auth and the remote MCP server URL as ${escapeHtml(mcpUrl)}.

`, + }, + { + id: "windsurf", + label: "Windsurf", + content: `

Copy the following JSON to your Windsurf MCP config file:

+ ${codeBlock("mcp.json", `{ + "mcpServers": { + "stack-auth": { + "serverUrl": "${mcpUrl}" + } + } +}`)}`, + }, + { + id: "chatgpt", + label: "ChatGPT", + content: `
In Team, Enterprise, and Edu workspaces, only workspace owners and admins have permission to set this.
+

Navigate to Settings > Connectors.

+

Add a custom connector with the server URL: ${escapeHtml(mcpUrl)}

+

After this, it should be visible in Composer > Deep Research Tool.

+
Connectors can only be used with Deep Research.
`, + }, + { + id: "gemini", + label: "Gemini CLI", + content: `

Add the following JSON to your Gemini CLI configuration file (~/.gemini/settings.json):

+ ${codeBlock("settings.json", `{ + "mcpServers": { + "stack-auth": { + "httpUrl": "${mcpUrl}", + "headers": { + "Accept": "application/json, text/event-stream" + } + } + } +}`)}`, + }, + ]; +} + +function getMarkdownInstructions(mcpUrl: string, cursorInstallUrl: string, vsCodeInstallUrl: string): string { + return `
+Cursor + +#### Installation Link +[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](${cursorInstallUrl}) + +#### Manual Installation +Add the following to your \`mcp.json\` file: + +\`\`\`json +{ + "mcpServers": { + "stack-auth": { + "url": "${mcpUrl}" + } + } +} +\`\`\` +
+ +
+VSCode + +#### Installation Link +[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visual-studio-code&logoColor=white)](${vsCodeInstallUrl}) + +#### Manual Installation +Open a terminal and run the following command: + +\`\`\` +code --add-mcp '{"type":"http","name":"stack-auth","url":"${mcpUrl}"}' +\`\`\` + +Then, from inside VS Code, open the .vscode/mcp.json file and click "Start server". +
+ +
+Codex + +Open a terminal and run the following command: +\`\`\` +codex mcp add stack-auth --url ${mcpUrl} +\`\`\` + +Verify it is configured: +\`\`\` +codex mcp list +\`\`\` + +Alternatively, add the following to \`~/.codex/config.toml\`: +\`\`\`toml +[mcp_servers.stack-auth] +url = "${mcpUrl}" +\`\`\` +
+ +
+Claude Code + +Open a terminal and run the following command: +\`\`\` +claude mcp add --transport http stack-auth ${mcpUrl} +\`\`\` +From within Claude Code, you can use the \`/mcp\` command to get more information about the server. +
+ +
+Claude Desktop + +Open Claude Desktop and navigate to Settings > Connectors > Add Custom Connector. + +Enter the name as \`stack-auth\` and the remote MCP server URL as \`${mcpUrl}\`. +
+ +
+Windsurf + +Copy the following JSON to your Windsurf MCP config file: +\`\`\`json +{ + "mcpServers": { + "stack-auth": { + "serverUrl": "${mcpUrl}" + } + } +} +\`\`\` +
+ +
+ChatGPT + +*Note: In Team, Enterprise, and Edu workspaces, only workspace owners and admins have permission* + +- Navigate to **Settings > Connectors** +- Add a custom connector with the server URL: \`${mcpUrl}\` +- It should then be visible in the Composer > Deep Research tool +- You may need to add the server as a source + +*Connectors can only be used with **Deep Research*** +
+ +
+Gemini CLI + +Add the following JSON to your Gemini CLI configuration file (\`~/.gemini/settings.json\`): +\`\`\`json +{ + "mcpServers": { + "stack-auth": { + "httpUrl": "${mcpUrl}", + "headers": { + "Accept": "application/json, text/event-stream" + } + } + } +} +\`\`\` +
`; +} + +function renderTabs(tabs: SetupTab[]): string { + const tabButtons = tabs.map((tab, index) => ``).join(""); + const tabPanels = tabs.map((tab, index) => `
${tab.content}
`).join(""); + return `
+
${tabButtons}
+ ${tabPanels} +
`; +} + +export function renderSetupPageHtml(mcpUrl: string): string { + const cursorInstallUrl = getCursorInstallUrl(mcpUrl); + const vsCodeInstallUrl = getVsCodeInstallUrl(mcpUrl); + const tabs = getTabs(mcpUrl, cursorInstallUrl, vsCodeInstallUrl); + const markdownInstructions = getMarkdownInstructions(mcpUrl, cursorInstallUrl, vsCodeInstallUrl); + + return ` + + + + + Stack Auth MCP Setup + + + + +
+ + + ${renderTabs(tabs)} + +
+ + Markdown Instructions + If you want to include instructions for all clients in your project's README.md file, feel free to copy the following markdown: + +
+
${escapeHtml(markdownInstructions)}
+
+
+ +
+

Features

+

The Stack Auth MCP server exposes ask_stack_auth, which answers questions using live documentation retrieval and the docs-site AI assistant. It can help with:

+
    +
  • Authentication flows: Sign-in, sign-up, and user management
  • +
  • APIs and SDKs: Endpoints, examples, and framework integration
  • +
  • Best practices: Security and configuration guidance
  • +
+
+
+ + +`; +} diff --git a/apps/mcp/tsconfig.json b/apps/mcp/tsconfig.json new file mode 100644 index 0000000000..3494c8651f --- /dev/null +++ b/apps/mcp/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "noErrorTruncation": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./src/*" + ] + }, + "skipLibCheck": true + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules", + ".next/dev" + ] +} diff --git a/docs-mintlify/guides/other/mcp-setup.mdx b/docs-mintlify/guides/other/mcp-setup.mdx index 71f3ddd62a..ef31e3d2f4 100644 --- a/docs-mintlify/guides/other/mcp-setup.mdx +++ b/docs-mintlify/guides/other/mcp-setup.mdx @@ -17,7 +17,7 @@ Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code { "mcpServers": { "stack-auth": { - "url": "https://mcp.stack-auth.com/" + "url": "https://mcp.stack-auth.com/mcp" } } } @@ -32,17 +32,42 @@ Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code Open a terminal and run the following command: ```sh title="Terminal" - code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/"}' + code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/mcp"}' ``` Then, from inside VS Code, open the `.vscode/mcp.json` file and click "Start server". + + Configure Stack Auth MCP in Codex CLI and the Codex IDE extension. The configuration is shared between both. + + Open a terminal and run the following command: + + ```sh title="Terminal" + codex mcp add stack-auth --url https://mcp.stack-auth.com/mcp + ``` + + Verify it is configured: + + ```sh title="Terminal" + codex mcp list + ``` + + ### Manual Installation + + Alternatively, add the following to `~/.codex/config.toml`: + + ```toml title="config.toml" + [mcp_servers.stack-auth] + url = "https://mcp.stack-auth.com/mcp" + ``` + + Open a terminal and run the following command: ```sh title="Terminal" - claude mcp add --transport http stack-auth https://mcp.stack-auth.com/ + claude mcp add --transport http stack-auth https://mcp.stack-auth.com/mcp ``` From within Claude Code, you can use the `/mcp` command to get more information about the server. @@ -51,7 +76,7 @@ Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code Open Claude Desktop and navigate to **Settings > Connectors > Add Custom Connector**. - Enter the name as `stack-auth` and the remote MCP server URL as `https://mcp.stack-auth.com/`. + Enter the name as `stack-auth` and the remote MCP server URL as `https://mcp.stack-auth.com/mcp`. @@ -61,7 +86,7 @@ Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code { "mcpServers": { "stack-auth": { - "serverUrl": "https://mcp.stack-auth.com/" + "serverUrl": "https://mcp.stack-auth.com/mcp" } } } @@ -73,7 +98,7 @@ Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code In Team, Enterprise, and Edu workspaces, only workspace owners and admins have permission to set this. - Navigate to **Settings > Connectors** and add a custom connector with the server URL: `https://mcp.stack-auth.com` + Navigate to **Settings > Connectors** and add a custom connector with the server URL: `https://mcp.stack-auth.com/mcp` After this, it should be visible in Composer > Deep Research Tool. @@ -89,7 +114,7 @@ Set up Stack Auth's Model Context Protocol (MCP) server to get intelligent code { "mcpServers": { "stack-auth": { - "httpUrl": "https://mcp.stack-auth.com/", + "httpUrl": "https://mcp.stack-auth.com/mcp", "headers": { "Accept": "application/json, text/event-stream" } @@ -109,7 +134,7 @@ If you want to include instructions for all clients in your project's README.md Cursor #### Installation Link - [![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=stack-auth&config=eyJ1cmwiOiJodHRwczovL21jcC5zdGFjay1hdXRoLmNvbS8ifQ==) + [![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=stack-auth&config=eyJ1cmwiOiJodHRwczovL21jcC5zdGFjay1hdXRoLmNvbS9tY3AifQ==) #### Manual Installation Add the following to your `mcp.json` file: @@ -118,7 +143,7 @@ If you want to include instructions for all clients in your project's README.md { "mcpServers": { "stack-auth": { - "url": "https://mcp.stack-auth.com/" + "url": "https://mcp.stack-auth.com/mcp" } } } @@ -129,24 +154,44 @@ If you want to include instructions for all clients in your project's README.md VSCode #### Installation Link - [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visual-studio-code&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode:mcp/install?%7B%22type%22%3A%22http%22%2C%22name%22%3A%22stack-auth%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.stack-auth.com%2F%22%7D) + [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visual-studio-code&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode:mcp/install?%7B%22type%22%3A%22http%22%2C%22name%22%3A%22stack-auth%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.stack-auth.com%2Fmcp%22%7D) #### Manual Installation Open a terminal and run the following command: ``` - code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/"}' + code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/mcp"}' ``` Then, from inside VS Code, open the .vscode/mcp.json file and click "Start server".
+
+ Codex + + Open a terminal and run the following command: + ``` + codex mcp add stack-auth --url https://mcp.stack-auth.com/mcp + ``` + + Verify it is configured: + ``` + codex mcp list + ``` + + Alternatively, add the following to `~/.codex/config.toml`: + ```toml + [mcp_servers.stack-auth] + url = "https://mcp.stack-auth.com/mcp" + ``` +
+
Claude Code Open a terminal and run the following command: ``` - claude mcp add --transport http stack-auth https://mcp.stack-auth.com/ + claude mcp add --transport http stack-auth https://mcp.stack-auth.com/mcp ``` From within Claude Code, you can use the `/mcp` command to get more information about the server.
@@ -156,7 +201,7 @@ If you want to include instructions for all clients in your project's README.md Open Claude Desktop and navigate to Settings > Connectors > Add Custom Connector. - Enter the name as `stack-auth` and the remote MCP server URL as `https://mcp.stack-auth.com/`. + Enter the name as `stack-auth` and the remote MCP server URL as `https://mcp.stack-auth.com/mcp`.
@@ -167,7 +212,7 @@ If you want to include instructions for all clients in your project's README.md { "mcpServers": { "stack-auth": { - "serverUrl": "https://mcp.stack-auth.com/" + "serverUrl": "https://mcp.stack-auth.com/mcp" } } } @@ -180,7 +225,7 @@ If you want to include instructions for all clients in your project's README.md *Note: In Team, Enterprise, and Edu workspaces, only workspace owners and admins have permission* - Navigate to **Settings > Connectors** - - Add a custom connector with the server URL: `https://mcp.stack-auth.com/` + - Add a custom connector with the server URL: `https://mcp.stack-auth.com/mcp` - It should then be visible in the Composer > Deep research tool - You may need to add the server as a source @@ -195,7 +240,7 @@ If you want to include instructions for all clients in your project's README.md { "mcpServers": { "stack-auth": { - "httpUrl": "https://mcp.stack-auth.com/", + "httpUrl": "https://mcp.stack-auth.com/mcp", "headers": { "Accept": "application/json, text/event-stream" } diff --git a/docs/content/docs/(guides)/others/mcp-setup.mdx b/docs/content/docs/(guides)/others/mcp-setup.mdx index 047818527f..1d3e915a59 100644 --- a/docs/content/docs/(guides)/others/mcp-setup.mdx +++ b/docs/content/docs/(guides)/others/mcp-setup.mdx @@ -16,6 +16,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que Cursor VS Code + Codex Claude Code Claude Desktop Windsurf @@ -26,7 +27,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que Configure Stack Auth MCP in Cursor IDE for enhanced code assistance. - + **Manual Installation** @@ -36,7 +37,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que { "mcpServers": { "stack-auth": { - "url": "https://mcp.stack-auth.com/" + "url": "https://mcp.stack-auth.com/mcp" } } } @@ -46,25 +47,51 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que Configure Stack Auth MCP in VSCode IDE for enhanced code assistance. - + **Manual Installation** Open a terminal and run the following command: ```sh title="Terminal" - code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/"}' + code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/mcp"}' ``` Then, from inside VS Code, open the .vscode/mcp.json file and click "Start server". + + Configure Stack Auth MCP in Codex CLI and the Codex IDE extension. The configuration is shared between both. + + Open a terminal and run the following command: + + ```sh title="Terminal" + codex mcp add stack-auth --url https://mcp.stack-auth.com/mcp + ``` + + Verify it is configured: + + ```sh title="Terminal" + codex mcp list + ``` + + **Manual Installation** + + Alternatively, add the following to `~/.codex/config.toml`: + + ```toml title="config.toml" + [mcp_servers.stack-auth] + url = "https://mcp.stack-auth.com/mcp" + ``` + + + Open a terminal and run the following command: ```sh title="Terminal" - claude mcp add --transport http stack-auth https://mcp.stack-auth.com/ + claude mcp add --transport http stack-auth https://mcp.stack-auth.com/mcp ``` From within Claude Code, you can use the /mcp command to get more information about the server. @@ -73,7 +100,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que Open Claude Desktop and navigate to Settings > Connectors > Add Custom Connector. - Enter the name as stack-auth and the remote MCP server URL as https://mcp.stack-auth.com/. + Enter the name as stack-auth and the remote MCP server URL as https://mcp.stack-auth.com/mcp. @@ -83,7 +110,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que { "mcpServers": { "stack-auth": { - "serverUrl": "https://mcp.stack-auth.com/" + "serverUrl": "https://mcp.stack-auth.com/mcp" } } } @@ -95,7 +122,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que In Team, Enterprise, and Edu workspaces, only workspace owners and admins have permission to set this. Navigate to **Settings > Connectors** - Add a custom connector with the server URL: `https://mcp.stack-auth.com` + Add a custom connector with the server URL: `https://mcp.stack-auth.com/mcp` After this, it should be visible in Composer > Deep research Tool. @@ -111,7 +138,7 @@ The MCP server exposes a single tool, **`ask_stack_auth`**, which sends your que { "mcpServers": { "stack-auth": { - "httpUrl": "https://mcp.stack-auth.com/", + "httpUrl": "https://mcp.stack-auth.com/mcp", "headers": { "Accept": "application/json, text/event-stream" } @@ -132,7 +159,7 @@ If you want to include instructions for all clients in your project's README.md Cursor #### Installation Link -[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=stack-auth&config=eyJ1cmwiOiJodHRwczovL21jcC5zdGFjay1hdXRoLmNvbS8ifQ==) +[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=stack-auth&config=eyJ1cmwiOiJodHRwczovL21jcC5zdGFjay1hdXRoLmNvbS9tY3AifQ==) #### Manual Installation Add the following to your \`mcp.json\` file: @@ -141,7 +168,7 @@ Add the following to your \`mcp.json\` file: { "mcpServers": { "stack-auth": { - "url": "https://mcp.stack-auth.com/" + "url": "https://mcp.stack-auth.com/mcp" } } } @@ -152,24 +179,44 @@ Add the following to your \`mcp.json\` file: VSCode #### Installation Link -[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visual-studio-code&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode:mcp/install?%7B%22type%22%3A%22http%22%2C%22name%22%3A%22stack-auth%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.stack-auth.com%2F%22%7D) +[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visual-studio-code&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode:mcp/install?%7B%22type%22%3A%22http%22%2C%22name%22%3A%22stack-auth%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.stack-auth.com%2Fmcp%22%7D) #### Manual Installation Open a terminal and run the following command: \`\`\` -code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/"}' +code --add-mcp '{"type":"http","name":"stack-auth","url":"https://mcp.stack-auth.com/mcp"}' \`\`\` Then, from inside VS Code, open the .vscode/mcp.json file and click "Start server".
+
+Codex + +Open a terminal and run the following command: +\`\`\` +codex mcp add stack-auth --url https://mcp.stack-auth.com/mcp +\`\`\` + +Verify it is configured: +\`\`\` +codex mcp list +\`\`\` + +Alternatively, add the following to \`~/.codex/config.toml\`: +\`\`\`toml +[mcp_servers.stack-auth] +url = "https://mcp.stack-auth.com/mcp" +\`\`\` +
+
Claude Code Open a terminal and run the following command: \`\`\` -claude mcp add --transport http stack-auth https://mcp.stack-auth.com/ +claude mcp add --transport http stack-auth https://mcp.stack-auth.com/mcp \`\`\` From within Claude Code, you can use the \`/mcp\` command to get more information about the server.
@@ -179,7 +226,7 @@ From within Claude Code, you can use the \`/mcp\` command to get more informatio Open Claude Desktop and navigate to Settings > Connectors > Add Custom Connector. -Enter the name as \`stack-auth\` and the remote MCP server URL as \`https://mcp.stack-auth.com/\`. +Enter the name as \`stack-auth\` and the remote MCP server URL as \`https://mcp.stack-auth.com/mcp\`.
@@ -190,7 +237,7 @@ Copy the following JSON to your Windsurf MCP config file: { "mcpServers": { "stack-auth": { - "serverUrl": "https://mcp.stack-auth.com/" + "serverUrl": "https://mcp.stack-auth.com/mcp" } } } @@ -203,7 +250,7 @@ Copy the following JSON to your Windsurf MCP config file: *Note: In Team, Enterprise, and Edu workspaces, only workspace owners and admins have permission* - Navigate to **Settings > Connectors** -- Add a custom connector with the server URL: \`https://mcp.stack-auth.com/\` +- Add a custom connector with the server URL: \`https://mcp.stack-auth.com/mcp\` - It should then be visible in the Composer > Deep research tool - You may need to add the server as a source @@ -218,7 +265,7 @@ Add the following JSON to your Gemini CLI configuration file (\`~/.gemini/settin { "mcpServers": { "stack-auth": { - "httpUrl": "https://mcp.stack-auth.com/", + "httpUrl": "https://mcp.stack-auth.com/mcp", "headers": { "Accept": "application/json, text/event-stream" } @@ -238,4 +285,3 @@ The Stack Auth MCP server exposes **`ask_stack_auth`**, which answers questions - **Authentication flows**: Sign-in, sign-up, and user management - **APIs and SDKs**: Endpoints, examples, and framework integration - **Best practices**: Security and configuration guidance - diff --git a/package.json b/package.json index b1557a6104..750e791bf3 100644 --- a/package.json +++ b/package.json @@ -55,13 +55,14 @@ "dev:tui": "pnpm pre && (trap 'kill 0' EXIT; pnpm run generate-sdks:watch & pnpm run generate-openapi-docs:watch & pnpm run generate-setup-prompt-docs:watch & turbo run dev --ui tui --concurrency 99999 --filter=./apps/* --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo)", "dev:inspect": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--inspect\" pnpm run dev", "dev:profile": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--experimental-cpu-prof\" pnpm run dev", - "dev:basic": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999 --filter=@stackframe/backend --filter=@stackframe/dashboard --filter=@stackframe/mock-oauth-server\"", + "dev:basic": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999 --filter=@stackframe/backend --filter=@stackframe/mcp --filter=@stackframe/dashboard --filter=@stackframe/mock-oauth-server\"", "dev:docs": "pnpm pre && concurrently -k \"pnpm run generate-openapi-docs:watch\" \"pnpm run generate-setup-prompt-docs:watch\" \"turbo run dev --concurrency 99999 --filter=@stackframe/stack-docs\"", "dev:named": "pnpm pre && concurrently -k \"pnpm run dev\" \"node -e \\\"process.title='node (stack-named-dev-server)'; process.stdin.resume();\\\"\"", "kill-dev:named": "(pgrep -f 'stack-named-dev-server' | xargs -r -n1 pkill -P); echo 'Killed named dev server (if found). Sleeping to give some time for it to shut down...' && sleep 10", - "kms": "PREFIX=${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}; for p in 00 01 02 03 04 06 14; do pids=$(lsof -i :$PREFIX$p 2>/dev/null | grep LISTEN | awk '$1 != \"OrbStack\" {print $2}' | sort -u); [ -n \"$pids\" ] && echo $pids | xargs kill -9 2>/dev/null; done; echo Done.", + "kms": "PREFIX=${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}; for p in 00 01 02 03 04 06 14 42; do pids=$(lsof -i :$PREFIX$p 2>/dev/null | grep LISTEN | awk '$1 != \"OrbStack\" {print $2}' | sort -u); [ -n \"$pids\" ] && echo $pids | xargs kill -9 2>/dev/null; done; echo Done.", "start": "pnpm pre && turbo run start --concurrency 99999", "start:backend": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/backend", + "start:mcp": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/mcp", "start:dashboard": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/dashboard", "start:mock-oauth-server": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/mock-oauth-server", "lint": "pnpm pre && turbo run lint --continue -- --max-warnings=0", @@ -114,6 +115,14 @@ "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0" }, + "packageExtensions": { + "@mintlify/link-rot": { + "dependencies": { + "react": "*", + "react-dom": "*" + } + } + }, "patchedDependencies": { "openid-client@5.6.4": "patches/openid-client@5.6.4.patch" } diff --git a/packages/init-stack/src/index.ts b/packages/init-stack/src/index.ts index 0b76a4f1cf..b11ea28cc4 100644 --- a/packages/init-stack/src/index.ts +++ b/packages/init-stack/src/index.ts @@ -397,7 +397,7 @@ async function main(): Promise { } console.log(); console.log("MCP servers installed:"); - console.log(` ${colorize.green`https://mcp.stack-auth.com`}`); + console.log(` ${colorize.green`https://mcp.stack-auth.com/mcp`}`); console.log(); console.log("Files written:"); for (const file of filesModified) { diff --git a/packages/init-stack/src/mcp.ts b/packages/init-stack/src/mcp.ts index 0737bb39a1..75ad13739f 100644 --- a/packages/init-stack/src/mcp.ts +++ b/packages/init-stack/src/mcp.ts @@ -7,7 +7,7 @@ import type { Colorize, JsonRecord } from "./util"; import { getCommandPath, logVerbose, shouldWriteConfigFile } from "./util"; const MCP_SERVER_NAME = "stack-auth"; -const MCP_SERVER_URL = "https://mcp.stack-auth.com/"; +const MCP_SERVER_URL = "https://mcp.stack-auth.com/mcp"; const MCP_ACCEPT_HEADER = "application/json, text/event-stream"; type JsonUpdater = (current: JsonRecord) => JsonRecord | null | undefined; diff --git a/packages/stack-shared/src/helpers/init-prompt.ts b/packages/stack-shared/src/helpers/init-prompt.ts index c1462ad488..8a2262c0db 100644 --- a/packages/stack-shared/src/helpers/init-prompt.ts +++ b/packages/stack-shared/src/helpers/init-prompt.ts @@ -8,7 +8,7 @@ These instructions describe how to set up Stack Auth. ${web ? ` First of all, if you have access to a terminal, it is better to use the \`npx @stackframe/stack-cli init\`` : ""} -Install mcp server from https://mcp.stack-auth.com if not already installed. Global MCP config file paths for popular coding agents: +Install mcp server from https://mcp.stack-auth.com/mcp if not already installed. Global MCP config file paths for popular coding agents: - Claude Code: \`~/.claude.json\` - Codex CLI: \`~/.codex/config.toml\` - Cursor: \`~/.cursor/mcp.json\` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 482352d2f2..ccbf775475 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,8 @@ overrides: '@types/react': ^18.2.0 '@types/react-dom': ^18.2.0 +packageExtensionsChecksum: sha256-jyQU7e0t0VUO1JH8fGrtf6w0YS6gWM5pvlGxPG5AotA= + patchedDependencies: openid-client@5.6.4: hash: 99fe6a7ee65b97d4c75e472c3dcd68a31f62ffdfa047dae014a4b6ecaf0d3fe3 @@ -204,9 +206,6 @@ importers: '@vercel/functions': specifier: ^2.0.0 version: 2.0.0(@aws-sdk/credential-provider-web-identity@3.972.27) - '@vercel/mcp-adapter': - specifier: ^1.0.0 - version: 1.0.0(@modelcontextprotocol/sdk@1.17.2)(next@16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) '@vercel/otel': specifier: ^1.10.4 version: 1.10.4(@opentelemetry/api-logs@0.53.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)) @@ -749,7 +748,7 @@ importers: version: 1.166.6(crossws@0.4.4(srvx@0.8.16)) nitro: specifier: ^3.0.0 - version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2) + version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.0.0-rc.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2) react: specifier: 19.2.1 version: 19.2.1 @@ -840,6 +839,46 @@ importers: specifier: 5.9.3 version: 5.9.3 + apps/mcp: + dependencies: + '@stackframe/stack-shared': + specifier: workspace:* + version: link:../../packages/stack-shared + '@vercel/mcp-adapter': + specifier: ^1.0.0 + version: 1.0.0(@modelcontextprotocol/sdk@1.17.2)(next@16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + next: + specifier: 16.1.7 + version: 16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + posthog-node: + specifier: ^4.1.0 + version: 4.1.0 + react: + specifier: 19.2.3 + version: 19.2.3 + react-dom: + specifier: 19.2.3 + version: 19.2.3(react@19.2.3) + zod: + specifier: ^3.23.8 + version: 3.25.76 + devDependencies: + '@types/node': + specifier: 20.17.6 + version: 20.17.6 + '@types/react': + specifier: ^18.2.0 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.2.0 + version: 18.3.1 + rimraf: + specifier: ^5.0.5 + version: 5.0.10 + typescript: + specifier: 5.9.3 + version: 5.9.3 + apps/mock-oauth-server: dependencies: '@types/express': @@ -1020,7 +1059,7 @@ importers: devDependencies: mint: specifier: ^4.2.487 - version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) examples/cjs-test: dependencies: @@ -1568,10 +1607,10 @@ importers: version: link:../../packages/stack '@supabase/ssr': specifier: latest - version: 0.10.0(@supabase/supabase-js@2.102.1) + version: 0.10.2(@supabase/supabase-js@2.105.0) '@supabase/supabase-js': specifier: latest - version: 2.102.1 + version: 2.105.0 jose: specifier: ^5.2.2 version: 5.6.3 @@ -9891,36 +9930,36 @@ packages: resolution: {integrity: sha512-SXuhqhuR5FXaYgKTXzZJeqtVA6JKb9IZWaGeEUxHHiOcFy2p51wccO72bYpXwoK4D5pzQOIYLTuAc7etxyMmwg==} engines: {node: '>=12.16'} - '@supabase/auth-js@2.102.1': - resolution: {integrity: sha512-2uH2WB0H98TOGDtaFWhxIcR42Dro/VB7VDZanz/4bVJsqioIue1m3TUqu3xciDm2W9r+1LXQvYNsYbQfWmD+uQ==} + '@supabase/auth-js@2.105.0': + resolution: {integrity: sha512-cwNB9M4gClqOVJrlX+p2oPgqgRHiUm6hOQSRjgntplB/9XLP78/6MtvkhWdGeWpkP6npZxiLZ+VwNgeigk1wiw==} engines: {node: '>=20.0.0'} - '@supabase/functions-js@2.102.1': - resolution: {integrity: sha512-UcrcKTPnAIo+Yp9Jjq9XXwFbsmgRYY637mwka9ZjmTIWcX/xr1pote4OVvaGQycVY1KTiQgjMvpC0Q0yJhRq3w==} + '@supabase/functions-js@2.105.0': + resolution: {integrity: sha512-Q58EDZPb/3KM0Ksp4pUYPrShIAjoC12BRMIKlMOxcpVBYMQRZCDqr5ohRp1pKiCCvRbDD/bhiLIutdBmU5Nu6Q==} engines: {node: '>=20.0.0'} '@supabase/phoenix@0.4.0': resolution: {integrity: sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==} - '@supabase/postgrest-js@2.102.1': - resolution: {integrity: sha512-InLvXKAYf8BIqiv9jWOYudWB3rU8A9uMbcip5BQ5sLLNPrbO1Ekkr79OvlhZBgMNSppxVyC7wPPGzLxMcTZhlA==} + '@supabase/postgrest-js@2.105.0': + resolution: {integrity: sha512-+M8mHTNEGlWXNvDEU14oL0aGQxAwGra19PO49/Gqco9iHKzgKL2xceE5CiqGOLQ547KMB/1uSFsETIKj8WQYmg==} engines: {node: '>=20.0.0'} - '@supabase/realtime-js@2.102.1': - resolution: {integrity: sha512-h2fCumib/v6u7XMwSPgxnpfimjX4xCEayUHrxWLC7UurfQjUZJ0pmJDgm6yj80DnUerxuulRghwm5zXYysFG/Q==} + '@supabase/realtime-js@2.105.0': + resolution: {integrity: sha512-sU3bhcZnIT8rny4ZAR257JMjh6tBZVLvhTfczDXDKHaFZVje9Qaaqbl4O9UuuZmPsGWRfOfI1kUJ15uPeL0KhA==} engines: {node: '>=20.0.0'} - '@supabase/ssr@0.10.0': - resolution: {integrity: sha512-36jIu+DuKzg5EgA3fnH+zHvwASvpKcL4zPgmHoZaULroS5Q4mzeHcM69zJ0sXUHddO5IcHjQNZJ9Vyhl/DdbRw==} + '@supabase/ssr@0.10.2': + resolution: {integrity: sha512-JFbchN63CXLFHJRNT7udec4/RoD9PmXkSGko3QSO6vUuqGBtSzdmxR7FPfQNr7SuFd65I7Xv46q66ALjEN1cgQ==} peerDependencies: - '@supabase/supabase-js': ^2.100.1 + '@supabase/supabase-js': ^2.102.1 - '@supabase/storage-js@2.102.1': - resolution: {integrity: sha512-eCL9T4Xpe40nmKlkUJ7Zq/hk34db1xPiT0WL3Iv5MbJqHuCAe5TxhV8Rjqd6DNZrzjtfYObZtYl9jKJaHrivqw==} + '@supabase/storage-js@2.105.0': + resolution: {integrity: sha512-advo1qhRjeNLPYciUMpGeJTVFqaidPJq/6h4FoPF3XSo2SfecBUYQg/axcy26uon7y58QZoJxxguSmRZhuiRQA==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.102.1': - resolution: {integrity: sha512-bChxPVeLDnYN9M2d/u4fXsvylwSQG5grAl+HN8f+ZD9a9PuVU+Ru+xGmEsk+b9Iz3rJC9ZQnQUJYQ28fApdWYA==} + '@supabase/supabase-js@2.105.0': + resolution: {integrity: sha512-UUmh6KpStf2RdKpRUmzj0cPl6OXlo1hkRTNHdFHozbiJv2MIxR/7eWGKHAO8OgnaZt0gv52k7NL/bZXgPQbw/A==} engines: {node: '>=20.0.0'} '@sveltejs/sv-utils@0.0.3': @@ -18849,6 +18888,7 @@ packages: uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@11.1.0: @@ -18857,6 +18897,7 @@ packages: uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uzip@0.20201231.0: @@ -22676,16 +22717,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/checkbox@4.3.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/confirm@5.1.21(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22693,13 +22724,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/confirm@5.1.21(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/core@10.3.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22713,19 +22737,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/core@10.3.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/editor@4.2.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22734,14 +22745,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/editor@4.2.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/external-editor': 1.0.3(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/expand@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22750,14 +22753,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/expand@4.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/external-editor@1.0.3(@types/node@20.17.6)': dependencies: chardet: 2.1.1 @@ -22765,13 +22760,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/external-editor@1.0.3(@types/node@24.9.2)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/figures@1.0.15': {} '@inquirer/figures@1.0.3': {} @@ -22783,13 +22771,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/input@4.3.1(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/number@3.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22797,13 +22778,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/number@3.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/password@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22812,14 +22786,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/password@4.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/prompts@7.10.1(@types/node@20.17.6)': dependencies: '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) @@ -22835,35 +22801,20 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/prompts@7.10.1(@types/node@24.9.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) - '@inquirer/confirm': 5.1.21(@types/node@24.9.2) - '@inquirer/editor': 4.2.23(@types/node@24.9.2) - '@inquirer/expand': 4.0.23(@types/node@24.9.2) - '@inquirer/input': 4.3.1(@types/node@24.9.2) - '@inquirer/number': 3.0.23(@types/node@24.9.2) - '@inquirer/password': 4.0.23(@types/node@24.9.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) - '@inquirer/search': 3.2.2(@types/node@24.9.2) - '@inquirer/select': 4.4.2(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - - '@inquirer/prompts@7.9.0(@types/node@24.9.2)': + '@inquirer/prompts@7.9.0(@types/node@20.17.6)': dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) - '@inquirer/confirm': 5.1.21(@types/node@24.9.2) - '@inquirer/editor': 4.2.23(@types/node@24.9.2) - '@inquirer/expand': 4.0.23(@types/node@24.9.2) - '@inquirer/input': 4.3.1(@types/node@24.9.2) - '@inquirer/number': 3.0.23(@types/node@24.9.2) - '@inquirer/password': 4.0.23(@types/node@24.9.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) - '@inquirer/search': 3.2.2(@types/node@24.9.2) - '@inquirer/select': 4.4.2(@types/node@24.9.2) + '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) + '@inquirer/confirm': 5.1.21(@types/node@20.17.6) + '@inquirer/editor': 4.2.23(@types/node@20.17.6) + '@inquirer/expand': 4.0.23(@types/node@20.17.6) + '@inquirer/input': 4.3.1(@types/node@20.17.6) + '@inquirer/number': 3.0.23(@types/node@20.17.6) + '@inquirer/password': 4.0.23(@types/node@20.17.6) + '@inquirer/rawlist': 4.1.11(@types/node@20.17.6) + '@inquirer/search': 3.2.2(@types/node@20.17.6) + '@inquirer/select': 4.4.2(@types/node@20.17.6) optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 20.17.6 '@inquirer/rawlist@4.1.11(@types/node@20.17.6)': dependencies: @@ -22873,14 +22824,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/rawlist@4.1.11(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/search@3.2.2(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22890,15 +22833,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/search@3.2.2(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/select@4.4.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22909,24 +22843,10 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/select@4.4.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/type@3.0.10(@types/node@20.17.6)': optionalDependencies: '@types/node': 20.17.6 - '@inquirer/type@3.0.10(@types/node@24.9.2)': - optionalDependencies: - '@types/node': 24.9.2 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -23054,6 +22974,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@mdx-js/react@3.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.12 + react: 18.3.1 + '@mdx-js/react@3.1.1(@types/react@18.3.12)(react@19.2.3)': dependencies: '@types/mdx': 2.0.13 @@ -23064,11 +22990,11 @@ snapshots: dependencies: langium: 3.3.1 - '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@24.9.2) + '@inquirer/prompts': 7.9.0(@types/node@20.17.6) '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) - '@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) @@ -23079,7 +23005,7 @@ snapshots: front-matter: 4.0.2 fs-extra: 11.2.0 ink: 6.3.0(@types/react@18.3.12)(react@19.2.3) - inquirer: 12.3.0(@types/node@24.9.2) + inquirer: 12.3.0(@types/node@20.17.6) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 open: 8.4.2 @@ -23110,13 +23036,13 @@ snapshots: - utf-8-validate - yaml - '@mintlify/common@1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/common@1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: '@asyncapi/parser': 3.4.0(encoding@0.1.13) - '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@mintlify/models': 0.0.255 '@mintlify/openapi-parser': 0.0.8 - '@mintlify/validation': 0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/validation': 0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@sindresorhus/slugify': 2.2.0 '@types/mdast': 4.0.4 acorn: 8.11.2 @@ -23170,6 +23096,134 @@ snapshots: - ts-node - typescript + '@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@asyncapi/parser': 3.4.0(encoding@0.1.13) + '@asyncapi/specs': 6.8.1 + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@mintlify/models': 0.0.287 + '@mintlify/openapi-parser': 0.0.8 + '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@sindresorhus/slugify': 2.2.0 + '@types/mdast': 4.0.4 + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + color-blend: 4.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + front-matter: 4.0.2 + hast-util-from-html: 2.0.3 + hast-util-to-html: 9.0.4 + hast-util-to-text: 4.0.2 + hex-rgb: 5.0.0 + ignore: 7.0.5 + js-yaml: 4.1.0 + lodash: 4.17.21 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.0.0 + mdast-util-mdx: 3.0.0 + mdast-util-mdx-jsx: 3.1.3 + micromark-extension-gfm: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdxjs: 3.0.0 + openapi-types: 12.1.3 + postcss: 8.5.6 + rehype-stringify: 10.0.1 + remark: 15.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + remark-math: 6.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + remark-stringify: 11.0.0 + sucrase: 3.35.0 + tailwindcss: 3.4.18(tsx@4.19.3)(yaml@2.6.0) + unified: 11.0.5 + unist-builder: 4.0.0 + unist-util-map: 4.0.0 + unist-util-remove: 4.0.0 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + xss: 1.0.15 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - debug + - encoding + - react + - react-dom + - supports-color + - tsx + - typescript + - yaml + + '@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@asyncapi/parser': 3.4.0(encoding@0.1.13) + '@asyncapi/specs': 6.8.1 + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3) + '@mintlify/models': 0.0.287 + '@mintlify/openapi-parser': 0.0.8 + '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3) + '@sindresorhus/slugify': 2.2.0 + '@types/mdast': 4.0.4 + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + color-blend: 4.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + front-matter: 4.0.2 + hast-util-from-html: 2.0.3 + hast-util-to-html: 9.0.4 + hast-util-to-text: 4.0.2 + hex-rgb: 5.0.0 + ignore: 7.0.5 + js-yaml: 4.1.0 + lodash: 4.17.21 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.0.0 + mdast-util-mdx: 3.0.0 + mdast-util-mdx-jsx: 3.1.3 + micromark-extension-gfm: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdxjs: 3.0.0 + openapi-types: 12.1.3 + postcss: 8.5.6 + rehype-stringify: 10.0.1 + remark: 15.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + remark-math: 6.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + remark-stringify: 11.0.0 + sucrase: 3.35.0 + tailwindcss: 3.4.18(tsx@4.19.3)(yaml@2.6.0) + unified: 11.0.5 + unist-builder: 4.0.0 + unist-util-map: 4.0.0 + unist-util-remove: 4.0.0 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + xss: 1.0.15 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - debug + - encoding + - react + - react-dom + - supports-color + - tsx + - typescript + - yaml + '@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: '@asyncapi/parser': 3.4.0(encoding@0.1.13) @@ -23234,14 +23288,16 @@ snapshots: - typescript - yaml - '@mintlify/link-rot@3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + '@mintlify/link-rot@3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: - '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) - '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) - '@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) - '@mintlify/scraping': 4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/scraping': 4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) fs-extra: 11.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) unist-util-visit: 4.1.2 transitivePeerDependencies: - '@radix-ui/react-popover' @@ -23251,9 +23307,7 @@ snapshots: - bufferutil - debug - encoding - - react - react-devtools-core - - react-dom - supports-color - ts-node - tsx @@ -23261,6 +23315,58 @@ snapshots: - utf-8-validate - yaml + '@mintlify/mdx@3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + dependencies: + '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@shikijs/transformers': 3.14.0 + '@shikijs/twoslash': 3.23.0(typescript@5.9.3) + arktype: 2.1.27 + hast-util-to-string: 3.0.1 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.1.0 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-hast: 13.2.0 + next-mdx-remote-client: 1.1.7(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(unified@11.0.5) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rehype-katex: 7.0.1 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-smartypants: 3.0.2 + shiki: 3.14.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + - typescript + + '@mintlify/mdx@3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3)': + dependencies: + '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@shikijs/transformers': 3.14.0 + '@shikijs/twoslash': 3.23.0(typescript@5.9.3) + arktype: 2.1.27 + hast-util-to-string: 3.0.1 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.1.0 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-hast: 13.2.0 + next-mdx-remote-client: 1.1.7(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(unified@11.0.5) + react: 19.2.3 + react-dom: 18.3.1(react@18.3.1) + rehype-katex: 7.0.1 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-smartypants: 3.0.2 + shiki: 3.14.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + - typescript + '@mintlify/mdx@3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -23310,6 +23416,70 @@ snapshots: leven: 4.0.0 yaml: 2.8.0 + '@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/openapi-parser': 0.0.8 + '@mintlify/scraping': 4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + chalk: 5.3.0 + favicons: 7.2.0 + front-matter: 4.0.2 + fs-extra: 11.1.0 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + sharp: 0.33.5 + sharp-ico: 0.1.5 + unist-util-visit: 4.1.2 + uuid: 11.1.0 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - bare-abort-controller + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - tsx + - typescript + - utf-8-validate + - yaml + + '@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/openapi-parser': 0.0.8 + '@mintlify/scraping': 4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3) + chalk: 5.3.0 + favicons: 7.2.0 + front-matter: 4.0.2 + fs-extra: 11.1.0 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + sharp: 0.33.5 + sharp-ico: 0.1.5 + unist-util-visit: 4.1.2 + uuid: 11.1.0 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - bare-abort-controller + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - tsx + - typescript + - utf-8-validate + - yaml + '@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) @@ -23342,6 +23512,45 @@ snapshots: - utf-8-validate - yaml + '@mintlify/previewing@4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3) + adm-zip: 0.5.16 + better-opn: 3.0.2 + chalk: 5.2.0 + chokidar: 3.5.3 + express: 4.18.2 + front-matter: 4.0.2 + fs-extra: 11.1.0 + got: 13.0.0 + ink: 6.3.0(@types/react@18.3.12)(react@19.2.3) + ink-spinner: 5.0.0(ink@6.3.0(@types/react@18.3.12)(react@19.2.3))(react@19.2.3) + is-online: 10.0.0 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + react: 19.2.3 + socket.io: 4.7.2 + tar: 6.1.15 + unist-util-visit: 4.1.2 + yargs: 17.7.1 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - bare-abort-controller + - bare-buffer + - bufferutil + - debug + - encoding + - react-devtools-core + - react-dom + - supports-color + - tsx + - typescript + - utf-8-validate + - yaml + '@mintlify/previewing@4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) @@ -23381,9 +23590,9 @@ snapshots: - utf-8-validate - yaml - '@mintlify/scraping@4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/scraping@4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@mintlify/common': 1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@mintlify/openapi-parser': 0.0.8 fs-extra: 11.1.1 hast-util-to-mdast: 10.1.0 @@ -23415,6 +23624,76 @@ snapshots: - typescript - utf-8-validate + '@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/openapi-parser': 0.0.8 + fs-extra: 11.1.1 + hast-util-to-mdast: 10.1.0 + js-yaml: 4.1.0 + mdast-util-mdx-jsx: 3.1.3 + neotraverse: 0.6.18 + puppeteer: 22.14.0(typescript@5.9.3) + rehype-parse: 9.0.1 + remark-gfm: 4.0.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + yargs: 17.7.1 + zod: 3.24.0 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - bare-abort-controller + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - tsx + - typescript + - utf-8-validate + - yaml + + '@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + dependencies: + '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/openapi-parser': 0.0.8 + fs-extra: 11.1.1 + hast-util-to-mdast: 10.1.0 + js-yaml: 4.1.0 + mdast-util-mdx-jsx: 3.1.3 + neotraverse: 0.6.18 + puppeteer: 22.14.0(typescript@5.9.3) + rehype-parse: 9.0.1 + remark-gfm: 4.0.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + yargs: 17.7.1 + zod: 3.24.0 + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - bare-abort-controller + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - tsx + - typescript + - utf-8-validate + - yaml + '@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) @@ -23450,9 +23729,9 @@ snapshots: - utf-8-validate - yaml - '@mintlify/validation@0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/validation@0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@mintlify/models': 0.0.255 arktype: 2.1.27 js-yaml: 4.1.0 @@ -23472,6 +23751,52 @@ snapshots: - supports-color - typescript + '@mintlify/validation@0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + dependencies: + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@mintlify/models': 0.0.287 + arktype: 2.1.27 + js-yaml: 4.1.0 + lcm: 0.0.3 + lodash: 4.17.21 + neotraverse: 0.6.18 + object-hash: 3.0.0 + openapi-types: 12.1.3 + uuid: 11.1.0 + zod: 3.24.0 + zod-to-json-schema: 3.20.4(zod@3.24.0) + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - debug + - react + - react-dom + - supports-color + - typescript + + '@mintlify/validation@0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3)': + dependencies: + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(typescript@5.9.3) + '@mintlify/models': 0.0.287 + arktype: 2.1.27 + js-yaml: 4.1.0 + lcm: 0.0.3 + lodash: 4.17.21 + neotraverse: 0.6.18 + object-hash: 3.0.0 + openapi-types: 12.1.3 + uuid: 11.1.0 + zod: 3.24.0 + zod-to-json-schema: 3.20.4(zod@3.24.0) + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - debug + - react + - react-dom + - supports-color + - typescript + '@mintlify/validation@0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) @@ -29473,21 +29798,21 @@ snapshots: '@stripe/stripe-js@7.7.0': {} - '@supabase/auth-js@2.102.1': + '@supabase/auth-js@2.105.0': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.102.1': + '@supabase/functions-js@2.105.0': dependencies: tslib: 2.8.1 '@supabase/phoenix@0.4.0': {} - '@supabase/postgrest-js@2.102.1': + '@supabase/postgrest-js@2.105.0': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.102.1': + '@supabase/realtime-js@2.105.0': dependencies: '@supabase/phoenix': 0.4.0 '@types/ws': 8.18.1 @@ -29497,23 +29822,23 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.10.0(@supabase/supabase-js@2.102.1)': + '@supabase/ssr@0.10.2(@supabase/supabase-js@2.105.0)': dependencies: - '@supabase/supabase-js': 2.102.1 + '@supabase/supabase-js': 2.105.0 cookie: 1.0.2 - '@supabase/storage-js@2.102.1': + '@supabase/storage-js@2.105.0': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@supabase/supabase-js@2.102.1': + '@supabase/supabase-js@2.105.0': dependencies: - '@supabase/auth-js': 2.102.1 - '@supabase/functions-js': 2.102.1 - '@supabase/postgrest-js': 2.102.1 - '@supabase/realtime-js': 2.102.1 - '@supabase/storage-js': 2.102.1 + '@supabase/auth-js': 2.105.0 + '@supabase/functions-js': 2.105.0 + '@supabase/postgrest-js': 2.105.0 + '@supabase/realtime-js': 2.105.0 + '@supabase/storage-js': 2.105.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -30247,6 +30572,7 @@ snapshots: '@types/node@24.9.2': dependencies: undici-types: 7.16.0 + optional: true '@types/nodemailer@6.4.15': dependencies: @@ -30636,13 +30962,6 @@ snapshots: optionalDependencies: '@aws-sdk/credential-provider-web-identity': 3.972.27 - '@vercel/mcp-adapter@1.0.0(@modelcontextprotocol/sdk@1.17.2)(next@15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': - dependencies: - '@modelcontextprotocol/sdk': 1.17.2 - mcp-handler: 1.0.1(@modelcontextprotocol/sdk@1.17.2)(next@15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - optionalDependencies: - next: 15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@vercel/mcp-adapter@1.0.0(@modelcontextprotocol/sdk@1.17.2)(next@16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: '@modelcontextprotocol/sdk': 1.17.2 @@ -33331,7 +33650,7 @@ snapshots: eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) @@ -33355,7 +33674,7 @@ snapshots: debug: 4.4.3 enhanced-resolve: 5.17.0 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) fast-glob: 3.3.3 get-tsconfig: 4.8.1 @@ -33373,7 +33692,7 @@ snapshots: debug: 4.4.3 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.3 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -33405,7 +33724,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -33416,7 +33735,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -33465,7 +33784,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -33494,7 +33813,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -35400,12 +35719,12 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - inquirer@12.3.0(@types/node@24.9.2): + inquirer@12.3.0(@types/node@20.17.6): dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/prompts': 7.10.1(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - '@types/node': 24.9.2 + '@inquirer/core': 10.3.2(@types/node@20.17.6) + '@inquirer/prompts': 7.10.1(@types/node@20.17.6) + '@inquirer/type': 3.0.10(@types/node@20.17.6) + '@types/node': 20.17.6 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -36229,15 +36548,6 @@ snapshots: math-intrinsics@1.1.0: {} - mcp-handler@1.0.1(@modelcontextprotocol/sdk@1.17.2)(next@15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): - dependencies: - '@modelcontextprotocol/sdk': 1.17.2 - chalk: 5.6.2 - commander: 11.1.0 - redis: 4.7.1 - optionalDependencies: - next: 15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - mcp-handler@1.0.1(@modelcontextprotocol/sdk@1.17.2)(next@16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)): dependencies: '@modelcontextprotocol/sdk': 1.17.2 @@ -36897,9 +37207,9 @@ snapshots: dependencies: minipass: 7.1.2 - mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): + mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): dependencies: - '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -37036,6 +37346,38 @@ snapshots: react: 18.3.1 use-intl: 3.19.1(react@18.3.1) + next-mdx-remote-client@1.1.7(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(unified@11.0.5): + dependencies: + '@babel/code-frame': 7.29.0 + '@mdx-js/mdx': 3.1.1 + '@mdx-js/react': 3.1.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + remark-mdx-remove-esm: 1.3.1(unified@11.0.5) + serialize-error: 13.0.1 + vfile: 6.0.3 + vfile-matter: 5.0.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + - unified + + next-mdx-remote-client@1.1.7(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@19.2.3)(unified@11.0.5): + dependencies: + '@babel/code-frame': 7.29.0 + '@mdx-js/mdx': 3.1.1 + '@mdx-js/react': 3.1.1(@types/react@18.3.12)(react@19.2.3) + react: 19.2.3 + react-dom: 18.3.1(react@18.3.1) + remark-mdx-remove-esm: 1.3.1(unified@11.0.5) + serialize-error: 13.0.1 + vfile: 6.0.3 + vfile-matter: 5.0.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + - unified + next-mdx-remote-client@1.1.7(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(unified@11.0.5): dependencies: '@babel/code-frame': 7.29.0 @@ -37367,7 +37709,7 @@ snapshots: jsonpath-plus: 10.4.0 lodash.topath: 4.5.2 - nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2): + nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.0.0-rc.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2): dependencies: consola: 3.4.2 cookie-es: 2.0.0 @@ -37387,6 +37729,7 @@ snapshots: unenv: 2.0.0-rc.21 unstorage: 2.0.0-alpha.3(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3))(lru-cache@11.2.2)(ofetch@1.5.1) optionalDependencies: + rolldown: 1.0.0-rc.3 vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) xml2js: 0.6.2 transitivePeerDependencies: @@ -41062,7 +41405,8 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.16.0: + optional: true undici@6.19.8: {}