diff --git a/packages/mcp-cloudflare/src/server/oauth/state.ts b/packages/mcp-cloudflare/src/server/oauth/state.ts index c1be5cc9b..b0e0ed1e5 100644 --- a/packages/mcp-cloudflare/src/server/oauth/state.ts +++ b/packages/mcp-cloudflare/src/server/oauth/state.ts @@ -6,7 +6,7 @@ import { z } from "zod"; // Safe envelope: keep the full downstream AuthRequest (+permissions) under `req` // and include only iat/exp metadata at top-level to avoid collisions. export const OAuthStateSchema = z.object({ - req: z.record(z.unknown()), + req: z.record(z.string(), z.unknown()), iat: z.number().int(), exp: z.number().int(), }); diff --git a/packages/mcp-cloudflare/src/server/routes/search.ts b/packages/mcp-cloudflare/src/server/routes/search.ts index 087980d2d..b8ab104b7 100644 --- a/packages/mcp-cloudflare/src/server/routes/search.ts +++ b/packages/mcp-cloudflare/src/server/routes/search.ts @@ -85,7 +85,7 @@ export default new Hono<{ Bindings: Env }>().post("/", async (c) => { return c.json( { error: "Invalid request", - details: validationResult.error.errors, + details: validationResult.error.issues, }, 400, ); diff --git a/packages/mcp-cloudflare/vitest.config.ts b/packages/mcp-cloudflare/vitest.config.ts index 2c94ddbda..107a16573 100644 --- a/packages/mcp-cloudflare/vitest.config.ts +++ b/packages/mcp-cloudflare/vitest.config.ts @@ -48,6 +48,6 @@ export default defineConfig({ }, // Force bundling to apply the ajv alias during module resolution ssr: { - noExternal: ["@modelcontextprotocol/sdk", "agents", "zod-to-json-schema"], + noExternal: ["@modelcontextprotocol/sdk", "agents"], }, }); diff --git a/packages/mcp-core/package.json b/packages/mcp-core/package.json index fa756829b..a0e0066c5 100644 --- a/packages/mcp-core/package.json +++ b/packages/mcp-core/package.json @@ -158,8 +158,7 @@ "@sentry/mcp-server-tsconfig": "workspace:*", "msw": "catalog:", "tiktoken": "^1.0.18", - "yaml": "^2.8.3", - "zod-to-json-schema": "catalog:" + "yaml": "^2.8.3" }, "dependencies": { "@ai-sdk/anthropic": "catalog:", diff --git a/packages/mcp-core/scripts/generate-definitions.ts b/packages/mcp-core/scripts/generate-definitions.ts index 1398d291a..228d39eb3 100644 --- a/packages/mcp-core/scripts/generate-definitions.ts +++ b/packages/mcp-core/scripts/generate-definitions.ts @@ -9,7 +9,6 @@ import * as path from "node:path"; import { fileURLToPath } from "node:url"; import YAML from "yaml"; import { type ZodTypeAny, z } from "zod"; -import { zodToJsonSchema } from "zod-to-json-schema"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -33,7 +32,12 @@ function zodFieldMapToJsonSchema( ): unknown { if (!fieldMap || Object.keys(fieldMap).length === 0) return {}; const obj = z.object(fieldMap); - return zodToJsonSchema(obj, { $refStrategy: "none" }); + const { $schema: _, ...jsonSchema } = z.toJSONSchema(obj, { + io: "input", + target: "draft-7", + unrepresentable: "any", + }); + return jsonSchema; } // Plugin variants whose agent frontmatter gets synced by this script. @@ -161,7 +165,13 @@ function generateToolDefinitions({ // Export full JSON Schema under inputSchema for external docs inputSchema: jsonSchema, outputSchema: t.outputSchema - ? zodToJsonSchema(t.outputSchema, { $refStrategy: "none" }) + ? (({ $schema: _, ...jsonSchema }) => jsonSchema)( + z.toJSONSchema(t.outputSchema, { + io: "output", + target: "draft-7", + unrepresentable: "any", + }), + ) : undefined, // Preserve tool access requirements for UIs/docs requiredScopes: t.requiredScopes, diff --git a/packages/mcp-core/scripts/measure-token-cost.ts b/packages/mcp-core/scripts/measure-token-cost.ts index b61caa916..6d47efccc 100644 --- a/packages/mcp-core/scripts/measure-token-cost.ts +++ b/packages/mcp-core/scripts/measure-token-cost.ts @@ -13,7 +13,6 @@ import * as fs from "node:fs"; import * as path from "node:path"; import { type Tiktoken, encoding_for_model } from "tiktoken"; import { type ZodTypeAny, z } from "zod"; -import { zodToJsonSchema } from "zod-to-json-schema"; // Lazy imports to avoid type bleed const toolsModule = await import("../src/tools/index.ts"); @@ -80,9 +79,9 @@ function formatToolsForMCP(tools: Record) { ? z.object(inputSchema) : z.object({}); // Use the same options as the MCP SDK to match actual payload - const jsonSchema = zodToJsonSchema(zodObject, { - strictUnions: true, - pipeStrategy: "input", + const jsonSchema = z.toJSONSchema(zodObject, { + io: "input", + unrepresentable: "any", }); return { diff --git a/packages/mcp-core/src/api-client/client.ts b/packages/mcp-core/src/api-client/client.ts index 271068f49..de6c7da5c 100644 --- a/packages/mcp-core/src/api-client/client.ts +++ b/packages/mcp-core/src/api-client/client.ts @@ -3277,7 +3277,7 @@ export class SentryApiService { eventType, eventId: bodyObj.id, validationError: parseResult.error.message, - validationIssues: parseResult.error.errors, + validationIssues: parseResult.error.issues, }, }); diff --git a/packages/mcp-core/src/api-client/schema.ts b/packages/mcp-core/src/api-client/schema.ts index c2c989e40..b3c9fe9f7 100644 --- a/packages/mcp-core/src/api-client/schema.ts +++ b/packages/mcp-core/src/api-client/schema.ts @@ -775,12 +775,14 @@ export const IssueSchema = z status: z.string(), substatus: z.string().nullable().optional(), culprit: z.string().nullable(), - type: z.union([ - z.literal("error"), - z.literal("transaction"), - z.literal("generic"), - z.unknown(), - ]), + type: z + .union([ + z.literal("error"), + z.literal("transaction"), + z.literal("generic"), + z.unknown(), + ]) + .optional(), assignedTo: AssignedToSchema.optional(), issueType: z.string().optional(), issueCategory: z.string().optional(), @@ -867,7 +869,7 @@ const StacktraceSchema = z .object({ frames: z.array(FrameInterface), framesOmitted: z.array(z.unknown()).nullable().optional(), - registers: z.record(z.unknown()).nullable().optional(), + registers: z.record(z.string(), z.unknown()).nullable().optional(), hasSystemFrames: z.boolean().nullable().optional(), }) .partial() @@ -882,7 +884,7 @@ export const ThreadEntrySchema = z current: z.boolean().nullable(), crashed: z.boolean().nullable(), state: z.string().nullable(), - heldLocks: z.record(z.unknown()).nullable().optional(), + heldLocks: z.record(z.string(), z.unknown()).nullable().optional(), stacktrace: StacktraceSchema.nullable(), rawStacktrace: StacktraceSchema.nullable().optional(), }) @@ -901,7 +903,7 @@ export const BreadcrumbSchema = z category: z.string().nullable(), level: z.string().nullable(), message: z.string().nullable(), - data: z.record(z.unknown()).nullable(), + data: z.record(z.string(), z.unknown()).nullable(), }) .partial(); @@ -981,13 +983,15 @@ const BaseEventSchema = z.object({ z.string(), z .object({ - type: z.union([ - z.literal("default"), - z.literal("runtime"), - z.literal("os"), - z.literal("trace"), - z.unknown(), - ]), + type: z + .union([ + z.literal("default"), + z.literal("runtime"), + z.literal("os"), + z.literal("trace"), + z.unknown(), + ]) + .optional(), }) .passthrough(), ) @@ -1721,7 +1725,7 @@ export const FlamegraphSchema = z.preprocess( z .object({ activeProfileIndex: z.preprocess((value) => value ?? 0, z.number()), - metadata: z.record(z.unknown()).optional(), + metadata: z.record(z.string(), z.unknown()).optional(), platform: z.string(), profiles: z.preprocess( (value) => value ?? [], @@ -1784,11 +1788,12 @@ export const ProfileFrameSchema = z raw_function: z.string().nullable().optional(), symbol: z.string().nullable().optional(), lang: z.string().nullable().optional(), - data: z.record(z.unknown()).optional(), + data: z.record(z.string(), z.unknown()).optional(), }) .passthrough(); const ProfileThreadMetadataSchema = z.record( + z.string(), z .object({ // Matches Sentry's `Profiling.ContinuousProfile.thread_metadata` type, diff --git a/packages/mcp-core/src/internal/agents/callEmbeddedAgent.ts b/packages/mcp-core/src/internal/agents/callEmbeddedAgent.ts index 845d46484..f7dfdbd1c 100644 --- a/packages/mcp-core/src/internal/agents/callEmbeddedAgent.ts +++ b/packages/mcp-core/src/internal/agents/callEmbeddedAgent.ts @@ -31,7 +31,7 @@ interface EmbeddedAgentResult { */ export async function callEmbeddedAgent< TOutput, - TSchema extends z.ZodType, + TSchema extends z.ZodType, >({ system, prompt, @@ -246,7 +246,7 @@ function extractJsonCandidates(text: string): string[] { */ function rescueFromText( text: string, - schema: z.ZodType, + schema: z.ZodType, ): TOutput | null { for (const candidate of extractJsonCandidates(text)) { try { diff --git a/packages/mcp-core/src/internal/formatting.ts b/packages/mcp-core/src/internal/formatting.ts index a78eb3a22..94cbac214 100644 --- a/packages/mcp-core/src/internal/formatting.ts +++ b/packages/mcp-core/src/internal/formatting.ts @@ -2462,7 +2462,7 @@ function stripReplayMetadata(event: Event): Event { ) : { ...event.contexts, - replay: nextReplayContext, + replay: { ...nextReplayContext, type: replayContext.type }, }; return { diff --git a/packages/mcp-core/src/toolDefinitions.json b/packages/mcp-core/src/toolDefinitions.json index 686bfc94b..77fe4a4e8 100644 --- a/packages/mcp-core/src/toolDefinitions.json +++ b/packages/mcp-core/src/toolDefinitions.json @@ -10,6 +10,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -18,9 +19,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -38,9 +37,7 @@ "description": "The exact comment text to add to the issue." } }, - "required": ["text"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["text"] }, "requiredScopes": ["event:write"], "skills": ["triage"], @@ -57,6 +54,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -65,9 +63,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { "type": "string", @@ -78,9 +74,7 @@ "description": "The team's slug. You can find a list of existing teams in an organization with the Sentry tool `find_teams`." } }, - "required": ["organizationSlug", "projectSlug", "teamSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug", "teamSlug"] }, "requiredScopes": ["project:write", "team:read", "org:read"], "skills": ["project-management"], @@ -97,6 +91,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -105,9 +100,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -122,9 +115,7 @@ "type": "string", "description": "Optional custom instruction for the AI analysis" } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": [], "skills": ["seer"], @@ -141,6 +132,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -149,9 +141,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { "type": "string", @@ -162,9 +152,7 @@ "description": "The name of the DSN to create, for example 'Production'." } }, - "required": ["organizationSlug", "projectSlug", "name"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug", "name"] }, "requiredScopes": ["project:write"], "skills": ["project-management"], @@ -181,6 +169,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -189,9 +178,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "teamSlug": { "type": "string", @@ -202,6 +189,7 @@ "description": "The name of the project to create. Typically this is the name of the application or service. It is only used as a visual label in Sentry." }, "slug": { + "default": null, "anyOf": [ { "type": "string", @@ -210,11 +198,10 @@ { "type": "null" } - ], - "description": "Optional project slug to create.", - "default": null + ] }, "platform": { + "default": null, "anyOf": [ { "type": "string", @@ -223,11 +210,11 @@ { "type": "null" } - ], - "description": "The platform for the project. e.g., python, javascript, react, etc.", - "default": null + ] }, "repository": { + "default": null, + "description": "Optional repository name to link to the project (e.g. 'getsentry/sentry'). The repo must already be connected to the organization via a VCS integration.", "anyOf": [ { "type": "string" @@ -235,14 +222,10 @@ { "type": "null" } - ], - "default": null, - "description": "Optional repository name to link to the project (e.g. 'getsentry/sentry'). The repo must already be connected to the organization via a VCS integration." + ] } }, - "required": ["organizationSlug", "teamSlug", "name"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "teamSlug", "name"] }, "requiredScopes": ["project:write", "team:read", "org:read"], "skills": ["project-management"], @@ -259,6 +242,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -267,18 +251,14 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "name": { "type": "string", "description": "The name of the team to create." } }, - "required": ["organizationSlug", "name"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "name"] }, "requiredScopes": ["team:write"], "skills": ["project-management"], @@ -296,15 +276,16 @@ "description": "The name of the available tool to execute." }, "arguments": { - "type": "object", - "additionalProperties": {}, "default": {}, - "description": "Arguments for the target tool, matching the schema returned by search_sentry_tools." + "description": "Arguments for the target tool, matching the schema returned by search_sentry_tools.", + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} } }, - "required": ["name"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["name"] }, "requiredScopes": [], "skills": ["inspect", "seer", "docs", "triage", "project-management"], @@ -321,6 +302,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -329,17 +311,16 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "kind": { + "default": "all", "type": "string", "enum": ["all", "issue", "metric"], - "description": "Which alert rule family to search. Use `all` to include metric alerts, plus issue alerts when a project is available.", - "default": "all" + "description": "Which alert rule family to search. Use `all` to include metric alerts, plus issue alerts when a project is available." }, "projectSlug": { + "default": null, "anyOf": [ { "type": "string", @@ -348,11 +329,10 @@ { "type": "null" } - ], - "description": "The project's slug, or exact lowercase `all` when a tool supports all-projects scope. Other casing is treated as a project slug.", - "default": null + ] }, "query": { + "default": null, "anyOf": [ { "type": "string", @@ -361,11 +341,10 @@ { "type": "null" } - ], - "description": "Optional search query for alert rule name.", - "default": null + ] }, "cursor": { + "default": null, "anyOf": [ { "type": "string", @@ -374,21 +353,17 @@ { "type": "null" } - ], - "description": "Optional pagination cursor from a previous Sentry API response.", - "default": null + ] }, "limit": { + "default": 10, "type": "integer", "exclusiveMinimum": 0, "maximum": 100, - "description": "Maximum number of alert rules to return per alert family.", - "default": 10 + "description": "Maximum number of alert rules to return per alert family." } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["org:read", "project:read"], "skills": ["inspect"], @@ -405,6 +380,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -413,11 +389,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "titleQuery": { + "default": null, "anyOf": [ { "type": "string", @@ -426,17 +401,16 @@ { "type": "null" } - ], - "description": "Optional title substring to search for.", - "default": null + ] }, "sort": { + "default": "title", "type": "string", "enum": ["title", "-title", "dateCreated", "-dateCreated"], - "description": "Sort order for dashboard results.", - "default": "title" + "description": "Sort order for dashboard results." }, "cursor": { + "default": null, "anyOf": [ { "type": "string", @@ -445,21 +419,17 @@ { "type": "null" } - ], - "description": "Optional pagination cursor from a previous response. Reuse cursors only with the same search scope and project constraint.", - "default": null + ] }, "limit": { + "default": 10, "type": "integer", "exclusiveMinimum": 0, "maximum": 100, - "description": "Maximum number of dashboards to return.", - "default": 10 + "description": "Maximum number of dashboards to return." } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["org:read"], "skills": ["inspect"], @@ -476,6 +446,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -484,18 +455,14 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { "type": "string", "description": "The project's slug. You can find a list of existing projects in an organization using the `find_projects()` tool." } }, - "required": ["organizationSlug", "projectSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug"] }, "requiredScopes": ["project:read"], "skills": ["project-management"], @@ -512,6 +479,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -520,11 +488,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { + "default": null, "anyOf": [ { "type": "string", @@ -533,11 +500,10 @@ { "type": "null" } - ], - "description": "The project's slug, or exact lowercase `all` when a tool supports all-projects scope. Other casing is treated as a project slug.", - "default": null + ] }, "environment": { + "default": null, "anyOf": [ { "type": "string", @@ -546,11 +512,10 @@ { "type": "null" } - ], - "description": "Optional environment name to limit monitor state.", - "default": null + ] }, "owner": { + "default": null, "anyOf": [ { "type": "string", @@ -559,11 +524,10 @@ { "type": "null" } - ], - "description": "Optional owner filter, such as `user:123`, `team:456`, `myteams`, or `unassigned`.", - "default": null + ] }, "query": { + "default": null, "anyOf": [ { "type": "string", @@ -572,21 +536,17 @@ { "type": "null" } - ], - "description": "Optional search query for monitor name or slug.", - "default": null + ] }, "limit": { + "default": 10, "type": "integer", "exclusiveMinimum": 0, "maximum": 100, - "description": "Maximum number of monitors to return.", - "default": 10 + "description": "Maximum number of monitors to return." } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["org:read"], "skills": ["inspect"], @@ -599,6 +559,7 @@ "type": "object", "properties": { "query": { + "default": null, "anyOf": [ { "type": "string", @@ -607,13 +568,9 @@ { "type": "null" } - ], - "description": "Search query to filter results by name or slug. Use this to narrow down results when there are many items.", - "default": null + ] } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["org:read"], "skills": ["inspect", "seer", "docs", "triage", "project-management"], @@ -630,6 +587,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -638,11 +596,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "query": { + "default": null, "anyOf": [ { "type": "string", @@ -651,14 +608,10 @@ { "type": "null" } - ], - "description": "Search query to filter results by name or slug. Use this to narrow down results when there are many items.", - "default": null + ] } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["project:read"], "skills": ["inspect", "seer", "docs", "triage", "project-management"], @@ -675,6 +628,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -683,11 +637,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { + "default": null, "anyOf": [ { "type": "string", @@ -696,11 +649,10 @@ { "type": "null" } - ], - "description": "The project's slug, or exact lowercase `all` when a tool supports all-projects scope. Other casing is treated as a project slug.", - "default": null + ] }, "query": { + "default": null, "anyOf": [ { "type": "string", @@ -709,14 +661,10 @@ { "type": "null" } - ], - "description": "Search for versions which contain the provided string.", - "default": null + ] } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["project:read"], "skills": ["inspect"], @@ -733,6 +681,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -741,11 +690,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "query": { + "default": null, "anyOf": [ { "type": "string", @@ -754,14 +702,10 @@ { "type": "null" } - ], - "description": "Search query to filter results by name or slug. Use this to narrow down results when there are many items.", - "default": null + ] } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["team:read"], "skills": ["inspect", "triage", "project-management"], @@ -782,25 +726,23 @@ "description": "The AI conversation ID from gen_ai.conversation.id." }, "project": { - "type": "string", - "description": "Numeric project ID to scope the query. Falls back to context constraint or all projects." + "description": "Numeric project ID to scope the query. Falls back to context constraint or all projects.", + "type": "string" }, "start": { - "type": "string", - "description": "Explicit start time for the conversation lookup window." + "description": "Explicit start time for the conversation lookup window.", + "type": "string" }, "end": { - "type": "string", - "description": "Explicit end time for the conversation lookup window." + "description": "Explicit end time for the conversation lookup window.", + "type": "string" }, "regionUrl": { "type": "string", "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool." } }, - "required": ["organizationSlug", "conversationId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "conversationId"] }, "outputSchema": { "type": "object", @@ -831,10 +773,24 @@ "additionalProperties": false }, "startTimestamp": { - "type": ["number", "null"] + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] }, "endTimestamp": { - "type": ["number", "null"] + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] }, "traceIds": { "type": "array", @@ -875,13 +831,27 @@ "type": "string" }, "parentSpanId": { - "type": ["string", "null"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] }, "project": { "type": "string" }, "projectId": { - "type": ["string", "number"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] }, "timestamp": { "type": "number" @@ -982,7 +952,7 @@ "timeline": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "type": "object", "properties": { @@ -1210,8 +1180,7 @@ "spanSummaries", "timeline" ], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "additionalProperties": false }, "requiredScopes": ["event:read", "project:read"], "skills": ["inspect", "triage", "seer"], @@ -1228,6 +1197,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1236,17 +1206,16 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "kind": { + "default": "all", "type": "string", "enum": ["all", "issue", "metric"], - "description": "Which alert rule family to inspect. Use `issue` or `metric` for numeric IDs; `all` treats the value as an exact-name lookup.", - "default": "all" + "description": "Which alert rule family to inspect. Use `issue` or `metric` for numeric IDs; `all` treats the value as an exact-name lookup." }, "projectSlug": { + "default": null, "anyOf": [ { "type": "string", @@ -1255,9 +1224,7 @@ { "type": "null" } - ], - "description": "The project's slug, or exact lowercase `all` when a tool supports all-projects scope. Other casing is treated as a project slug.", - "default": null + ] }, "ruleIdOrName": { "type": "string", @@ -1265,9 +1232,7 @@ "description": "The alert rule's numeric ID, or an exact alert rule name." } }, - "required": ["organizationSlug", "ruleIdOrName"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "ruleIdOrName"] }, "requiredScopes": ["org:read", "project:read"], "skills": ["inspect"], @@ -1284,6 +1249,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1292,9 +1258,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "dashboardIdOrTitle": { "type": "string", @@ -1302,9 +1266,7 @@ "description": "The dashboard's numeric ID or exact title." } }, - "required": ["organizationSlug", "dashboardIdOrTitle"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "dashboardIdOrTitle"] }, "requiredScopes": ["org:read"], "skills": ["inspect"], @@ -1321,9 +1283,7 @@ "description": "The documentation path (e.g., '/platforms/javascript/guides/nextjs.md'). Get this from search_docs results." } }, - "required": ["path"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["path"] }, "requiredScopes": [], "skills": ["inspect", "docs"], @@ -1348,6 +1308,7 @@ "description": "The ID of the event." }, "attachmentId": { + "default": null, "anyOf": [ { "type": "string", @@ -1356,11 +1317,10 @@ { "type": "null" } - ], - "description": "The ID of the attachment to download.", - "default": null + ] }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1369,14 +1329,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] } }, - "required": ["organizationSlug", "projectSlug", "eventId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug", "eventId"] }, "requiredScopes": ["event:read"], "skills": ["inspect"], @@ -1393,6 +1349,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1401,35 +1358,33 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", "description": "The Issue ID. e.g. `PROJECT-1Z43`" }, "eventId": { - "type": "string", "default": "latest", - "description": "The event ID for the issue. Defaults to `latest`." + "description": "The event ID for the issue. Defaults to `latest`.", + "type": "string" }, "thread": { + "description": "Optional thread selector. Pass a numeric thread ID, or an exact thread name string. If omitted, returns the same default thread Sentry selects: first crashed thread, then first thread with a stacktrace, then first thread.", "anyOf": [ { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, { "type": "string", "minLength": 1 } - ], - "description": "Optional thread selector. Pass a numeric thread ID, or an exact thread name string. If omitted, returns the same default thread Sentry selects: first crashed thread, then first thread with a stacktrace, then first thread." + ] } }, - "required": ["organizationSlug", "issueId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "issueId"] }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage", "seer"], @@ -1446,6 +1401,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1454,9 +1410,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -1468,18 +1422,16 @@ "description": "The URL of the issue. e.g. https://my-organization.sentry.io/issues/PROJECT-1Z43" }, "includeComments": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" }, "limit": { + "default": 25, "type": "integer", "exclusiveMinimum": 0, - "maximum": 100, - "default": 25 + "maximum": 100 } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage"], @@ -1496,6 +1448,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1504,9 +1457,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -1521,9 +1472,7 @@ "format": "uri", "description": "The URL of the issue. e.g. https://my-organization.sentry.io/issues/PROJECT-1Z43" } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage", "seer"], @@ -1540,6 +1489,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1548,9 +1498,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -1567,9 +1515,7 @@ "description": "The tag key to get values for (e.g., 'url', 'browser', 'environment', 'release')." } }, - "required": ["tagKey"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["tagKey"] }, "requiredScopes": ["event:read"], "skills": ["inspect"], @@ -1586,6 +1532,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1594,9 +1541,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -1608,6 +1553,7 @@ "description": "The URL of the issue. e.g. https://my-organization.sentry.io/issues/PROJECT-1Z43" }, "cursor": { + "default": null, "anyOf": [ { "type": "string", @@ -1616,20 +1562,16 @@ { "type": "null" } - ], - "description": "Optional pagination cursor from a previous response.", - "default": null + ] }, "limit": { + "default": 25, "type": "integer", "exclusiveMinimum": 0, "maximum": 100, - "description": "Maximum number of user reports to return.", - "default": 25 + "description": "Maximum number of user reports to return." } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage"], @@ -1650,6 +1592,7 @@ "description": "The app identifier (e.g. 'sentry-frontend', 'com.emergetools.hackernews'). Required." }, "branch": { + "default": null, "anyOf": [ { "type": "string", @@ -1658,11 +1601,10 @@ { "type": "null" } - ], - "description": "Filter by git branch (e.g. 'main'). Omit to use the app's default branch.", - "default": null + ] }, "project": { + "default": null, "anyOf": [ { "type": "string", @@ -1671,11 +1613,10 @@ { "type": "null" } - ], - "description": "Project slug or numeric ID for scoping (e.g. 'frontend').", - "default": null + ] }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1684,14 +1625,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] } }, - "required": ["organizationSlug", "appId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "appId"] }, "requiredScopes": ["project:read"], "skills": ["inspect"], @@ -1708,6 +1645,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1716,11 +1654,11 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlugOrId": { + "default": null, + "description": "Optional project slug or numeric ID. Use this to disambiguate monitors with the same slug or to scope a monitor URL that includes a project segment.", "anyOf": [ { "type": "string" @@ -1728,9 +1666,7 @@ { "type": "null" } - ], - "default": null, - "description": "Optional project slug or numeric ID. Use this to disambiguate monitors with the same slug or to scope a monitor URL that includes a project segment." + ] }, "monitorSlug": { "type": "string", @@ -1738,6 +1674,7 @@ "description": "Monitor slug or GUID." }, "environment": { + "default": null, "anyOf": [ { "type": "string", @@ -1746,11 +1683,10 @@ { "type": "null" } - ], - "description": "Optional environment name to filter monitor environments, recent check-ins, and stats.", - "default": null + ] }, "period": { + "default": null, "anyOf": [ { "type": "string", @@ -1760,68 +1696,64 @@ { "type": "null" } - ], - "description": "Relative time range. Defaults to `24h` when `start` and `end` are omitted.", - "default": null + ] }, "start": { + "default": null, "anyOf": [ { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "description": "Absolute start time. Must be provided with `end`; do not combine with `period`." }, { "type": "null" } - ], - "description": "Absolute start time. Must be provided with `end`; do not combine with `period`.", - "default": null + ] }, "end": { + "default": null, "anyOf": [ { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "description": "Absolute end time. Must be provided with `start`; do not combine with `period`." }, { "type": "null" } - ], - "description": "Absolute end time. Must be provided with `start`; do not combine with `period`.", - "default": null + ] }, "checkInLimit": { + "default": 10, "type": "integer", "exclusiveMinimum": 0, "maximum": 50, - "description": "Maximum number of recent check-ins to include.", - "default": 10 + "description": "Maximum number of recent check-ins to include." }, "includeStats": { + "default": true, "type": "boolean", - "description": "Include aggregate check-in stats for the selected time range.", - "default": true + "description": "Include aggregate check-in stats for the selected time range." }, "rollupSeconds": { + "default": null, "anyOf": [ { "type": "integer", "exclusiveMinimum": 0, + "maximum": 9007199254740991, "description": "Optional stats bucket size in seconds. Omit this to let Sentry choose an appropriate rollup." }, { "type": "null" } - ], - "description": "Optional stats bucket size in seconds. Omit this to let Sentry choose an appropriate rollup.", - "default": null + ] } }, - "required": ["organizationSlug", "monitorSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "monitorSlug"] }, "requiredScopes": ["project:read"], "skills": ["inspect"], @@ -1834,15 +1766,16 @@ "type": "object", "properties": { "profileUrl": { + "description": "Sentry profile URL. If provided, organization and project are extracted from URL. transactionName is still required.", "type": "string", - "format": "uri", - "description": "Sentry profile URL. If provided, organization and project are extracted from URL. transactionName is still required." + "format": "uri" }, "organizationSlug": { "type": "string", "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1851,44 +1784,47 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlugOrId": { - "type": ["string", "number"], - "description": "Project slug or numeric ID" + "description": "Project slug or numeric ID", + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] }, "transactionName": { - "type": "string", - "description": "Transaction name (e.g., '/api/users', 'POST /graphql')" + "description": "Transaction name (e.g., '/api/users', 'POST /graphql')", + "type": "string" }, "period": { - "type": "string", - "pattern": "^\\d+[hdw]$", + "default": "7d", "description": "Profiling time window (default: '7d'). Use '1h' for very recent profiling data.", - "default": "7d" + "type": "string", + "pattern": "^\\d+[hdw]$" }, "compareAgainstPeriod": { + "description": "Compare against this baseline profiling time window. Enables regression detection.", "type": "string", - "pattern": "^\\d+[hdw]$", - "description": "Compare against this baseline profiling time window. Enables regression detection." + "pattern": "^\\d+[hdw]$" }, "focusOnUserCode": { - "type": "boolean", "default": true, - "description": "Show only user code (is_application: true). Set to false to include library code." + "description": "Show only user code (is_application: true). Set to false to include library code.", + "type": "boolean" }, "maxHotPaths": { + "default": 10, + "description": "Number of hot paths to display (1-20, default: 10)", "type": "integer", "minimum": 1, - "maximum": 20, - "default": 10, - "description": "Number of hot paths to display (1-20, default: 10)" + "maximum": 20 } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read"], "skills": ["inspect"], @@ -1901,15 +1837,16 @@ "type": "object", "properties": { "profileUrl": { + "description": "Sentry transaction profile or continuous profile URL. If provided, organization, project, and profile identifiers are extracted from the URL.", "type": "string", - "format": "uri", - "description": "Sentry transaction profile or continuous profile URL. If provided, organization, project, and profile identifiers are extracted from the URL." + "format": "uri" }, "organizationSlug": { "type": "string", "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1918,38 +1855,41 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlugOrId": { - "type": ["string", "number"], - "description": "Project slug or numeric ID" + "description": "Project slug or numeric ID", + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] }, "profileId": { - "type": "string", - "description": "Transaction profile ID from a profile flamegraph URL" + "description": "Transaction profile ID from a profile flamegraph URL", + "type": "string" }, "profilerId": { - "type": "string", - "description": "Continuous profiler session ID" + "description": "Continuous profiler session ID", + "type": "string" }, "start": { - "type": "string", - "description": "Continuous profile start time in ISO 8601 format, for example '2024-01-01T00:00:00Z'" + "description": "Continuous profile start time in ISO 8601 format, for example '2024-01-01T00:00:00Z'", + "type": "string" }, "end": { - "type": "string", - "description": "Continuous profile end time in ISO 8601 format, for example '2024-01-01T01:00:00Z'" + "description": "Continuous profile end time in ISO 8601 format, for example '2024-01-01T01:00:00Z'", + "type": "string" }, "focusOnUserCode": { - "type": "boolean", "default": true, - "description": "Show only user code frames in the hotspot table. Set to false to include library frames." + "description": "Show only user code frames in the hotspot table. Set to false to include library frames.", + "type": "boolean" } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read"], "skills": ["inspect"], @@ -1966,6 +1906,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -1974,9 +1915,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "releaseVersion": { "type": "string", @@ -1984,6 +1923,7 @@ "description": "Exact release version." }, "projectSlugOrId": { + "default": null, "anyOf": [ { "type": "string", @@ -1992,36 +1932,32 @@ { "type": "null" } - ], - "description": "Optional project slug or numeric ID. Use this to scope release details, deploys, and commits to one project; required for health metadata unless the session is already project-constrained.", - "default": null + ] }, "includeHealth": { + "default": false, "type": "boolean", - "description": "Include project-specific release health metadata. Requires projectSlugOrId unless the session is already project-constrained.", - "default": false + "description": "Include project-specific release health metadata. Requires projectSlugOrId unless the session is already project-constrained." }, "includeDeploys": { + "default": true, "type": "boolean", - "description": "Include recent deploys for this release.", - "default": true + "description": "Include recent deploys for this release." }, "includeCommits": { + "default": true, "type": "boolean", - "description": "Include recent commits attached to this release.", - "default": true + "description": "Include recent commits attached to this release." }, "limit": { + "default": 10, "type": "integer", "exclusiveMinimum": 0, "maximum": 50, - "description": "Maximum number of deploys and commits to return, up to 50.", - "default": 10 + "description": "Maximum number of deploys and commits to return, up to 50." } }, - "required": ["organizationSlug", "releaseVersion"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "releaseVersion"] }, "requiredScopes": ["project:read"], "skills": ["inspect"], @@ -2055,12 +1991,9 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool." + ] } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["org:read", "project:read", "event:read"], "skills": ["inspect"], @@ -2073,11 +2006,12 @@ "type": "object", "properties": { "url": { + "description": "Sentry URL. The resource type is auto-detected from the URL pattern.", "type": "string", - "format": "uri", - "description": "Sentry URL. The resource type is auto-detected from the URL pattern." + "format": "uri" }, "resourceType": { + "description": "Resource type. With a URL, can override the auto-detected type for breadcrumbs on an issue/event URL or for `trace` on a span-focused trace URL. Use `monitor` with a monitor slug only when inspect monitor tools are available, `snapshot` with a snapshot artifact ID, or `snapshotImage` with `:`.", "type": "string", "enum": [ "issue", @@ -2090,20 +2024,17 @@ "monitor", "snapshot", "snapshotImage" - ], - "description": "Resource type. With a URL, can override the auto-detected type for breadcrumbs on an issue/event URL or for `trace` on a span-focused trace URL. Use `monitor` with a monitor slug only when inspect monitor tools are available, `snapshot` with a snapshot artifact ID, or `snapshotImage` with `:`." + ] }, "resourceId": { - "type": "string", - "description": "Resource identifier: issue shortId (e.g., 'PROJECT-123'), event ID, trace ID, AI conversation ID, replay ID, monitor slug when inspect monitor tools are available, snapshot artifact ID, `:` for snapshot image resources, or `traceId:spanId` for span resources. Required when not using a URL." + "description": "Resource identifier: issue shortId (e.g., 'PROJECT-123'), event ID, trace ID, AI conversation ID, replay ID, monitor slug when inspect monitor tools are available, snapshot artifact ID, `:` for snapshot image resources, or `traceId:spanId` for span resources. Required when not using a URL.", + "type": "string" }, "organizationSlug": { "type": "string", "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read", "project:read"], "skills": ["inspect", "triage", "seer"], @@ -2125,11 +2056,12 @@ "description": "The numeric snapshot artifact ID." }, "showUnmodified": { + "default": false, "type": "boolean", - "description": "When true, include unchanged and skipped image sections. This can substantially increase response size and token usage for large snapshots.", - "default": false + "description": "When true, include unchanged and skipped image sections. This can substantially increase response size and token usage for large snapshots." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -2138,14 +2070,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] } }, - "required": ["organizationSlug", "snapshotId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "snapshotId"] }, "requiredScopes": ["project:read"], "skills": ["inspect"], @@ -2172,12 +2100,13 @@ "description": "The snapshot image file name or identifier to fetch." }, "imageResolution": { + "default": "preview", "type": "string", "enum": ["preview", "full"], - "description": "Return locally generated previews or original full-resolution bytes. Full-resolution images can substantially increase response size and token usage.", - "default": "preview" + "description": "Return locally generated previews or original full-resolution bytes. Full-resolution images can substantially increase response size and token usage." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -2186,14 +2115,10 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] } }, - "required": ["organizationSlug", "snapshotId", "imageIdentifier"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "snapshotId", "imageIdentifier"] }, "requiredScopes": ["project:read"], "skills": ["inspect"], @@ -2210,6 +2135,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -2218,9 +2144,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "traceId": { "type": "string", @@ -2233,9 +2157,7 @@ "description": "The span ID within a trace. Use this with a trace resource to focus on a specific span." } }, - "required": ["organizationSlug", "traceId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "traceId"] }, "requiredScopes": ["event:read"], "skills": ["inspect"], @@ -2252,6 +2174,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -2260,9 +2183,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { "type": "string", @@ -2273,9 +2194,7 @@ "description": "The team's slug. You can find a list of existing teams in an organization with the Sentry tool `find_teams`." } }, - "required": ["organizationSlug", "projectSlug", "teamSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug", "teamSlug"] }, "requiredScopes": ["project:write", "team:read", "org:read"], "skills": ["project-management"], @@ -2292,75 +2211,73 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "query": { - "type": "string", - "description": "Conversation query/filter string." + "description": "Conversation query/filter string.", + "type": "string" }, "project": { + "description": "Project slug or numeric project ID, or an array of projects.", "anyOf": [ { "type": "string", "description": "The project's slug. You can find a list of existing projects in an organization using the `find_projects()` tool." }, { + "minItems": 1, "type": "array", "items": { "type": "string", "description": "The project's slug. You can find a list of existing projects in an organization using the `find_projects()` tool." - }, - "minItems": 1 + } } - ], - "description": "Project slug or numeric project ID, or an array of projects." + ] }, "environment": { + "description": "Environment name, or an array of environments.", "anyOf": [ { "type": "string", "minLength": 1 }, { + "minItems": 1, "type": "array", "items": { "type": "string", "minLength": 1 - }, - "minItems": 1 + } } - ], - "description": "Environment name, or an array of environments." + ] }, "period": { - "type": "string", - "pattern": "^\\d+[hdw]$", + "default": "30d", "description": "Relative time range. Defaults to 30d.", - "default": "30d" + "type": "string", + "pattern": "^\\d+[hdw]$" }, "start": { - "type": "string", - "description": "Explicit start time for the search window." + "description": "Explicit start time for the search window.", + "type": "string" }, "end": { - "type": "string", - "description": "Explicit end time for the search window." + "description": "Explicit end time for the search window.", + "type": "string" }, "cursor": { - "type": "string", - "description": "Pagination cursor from a previous response." + "description": "Pagination cursor from a previous response.", + "type": "string" }, "limit": { + "default": 10, "type": "integer", "minimum": 1, - "maximum": 100, - "default": 10 + "maximum": 100 }, "regionUrl": { "type": "string", "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool." } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "outputSchema": { "type": "object", @@ -2376,7 +2293,14 @@ "type": "number" }, "nextCursor": { - "type": ["string", "null"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] }, "conversations": { "type": "array", @@ -2427,10 +2351,24 @@ } }, "firstInputPreview": { - "type": ["string", "null"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] }, "lastOutputPreview": { - "type": ["string", "null"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] }, "flow": { "type": "array", @@ -2450,10 +2388,24 @@ "type": "object", "properties": { "email": { - "type": ["string", "null"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] }, "username": { - "type": ["string", "null"] + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] } }, "required": ["email", "username"], @@ -2496,8 +2448,7 @@ "nextCursor", "conversations" ], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "additionalProperties": false }, "requiredScopes": ["event:read", "project:read"], "skills": ["inspect", "triage", "seer"], @@ -2516,11 +2467,11 @@ "description": "The search query in natural language. Be specific about what you're looking for." }, "maxResults": { + "default": 3, + "description": "Maximum number of results to return (1-10)", "type": "integer", "minimum": 1, - "maximum": 10, - "default": 3, - "description": "Maximum number of results to return (1-10)" + "maximum": 10 }, "guide": { "type": "string", @@ -2655,9 +2606,7 @@ "description": "Optional guide filter to limit search results to specific documentation sections. Use either a platform (e.g., 'javascript', 'python') or platform/guide combination (e.g., 'javascript/nextjs', 'python/django')." } }, - "required": ["query"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["query"] }, "requiredScopes": [], "skills": ["inspect", "docs"], @@ -2674,15 +2623,16 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "dataset": { + "description": "Initial dataset hint: errors, logs, spans, metrics, profiles, or replays. The agent may correct this when configured.", "type": "string", - "enum": ["spans", "errors", "logs", "metrics", "profiles", "replays"], - "description": "Initial dataset hint: errors, logs, spans, metrics, profiles, or replays. The agent may correct this when configured." + "enum": ["spans", "errors", "logs", "metrics", "profiles", "replays"] }, "query": { - "type": "string", - "description": "Natural language or Sentry event search query syntax." + "description": "Natural language or Sentry event search query syntax.", + "type": "string" }, "fields": { + "description": "Fields to return for event datasets. If not specified, uses sensible defaults. Include aggregate functions like count(), avg() for statistics. Leave null for dataset='replays'.", "anyOf": [ { "type": "array", @@ -2693,10 +2643,10 @@ { "type": "null" } - ], - "description": "Fields to return for event datasets. If not specified, uses sensible defaults. Include aggregate functions like count(), avg() for statistics. Leave null for dataset='replays'." + ] }, "sort": { + "description": "Sort field (prefix with - for descending). If omitted, event datasets default to -timestamp and replays default to -started_at. Use -count() for event aggregations. For dataset='replays', use replay sorts like -started_at or -count_errors.", "anyOf": [ { "type": "string" @@ -2704,10 +2654,10 @@ { "type": "null" } - ], - "description": "Sort field (prefix with - for descending). If omitted, event datasets default to -timestamp and replays default to -started_at. Use -count() for event aggregations. For dataset='replays', use replay sorts like -started_at or -count_errors." + ] }, "projectSlug": { + "default": null, "anyOf": [ { "type": "string", @@ -2716,11 +2666,10 @@ { "type": "null" } - ], - "description": "The project's slug. You can find a list of existing projects in an organization using the `find_projects()` tool.", - "default": null + ] }, "environment": { + "description": "Optional environment filter for dataset='replays'. Use a string for one environment or an array for multiple. For other datasets, filter environment in the query string instead.", "anyOf": [ { "anyOf": [ @@ -2729,20 +2678,19 @@ "minLength": 1 }, { + "minItems": 1, "type": "array", "items": { "type": "string", "minLength": 1 - }, - "minItems": 1 + } } ] }, { "type": "null" } - ], - "description": "Optional environment filter for dataset='replays'. Use a string for one environment or an array for multiple. For other datasets, filter environment in the query string instead." + ] }, "period": { "type": "string", @@ -2750,6 +2698,7 @@ "description": "Relative time window, such as `24h`, `7d`, `14d`, `30d`, or `90d`. Controls which records fall within the search window." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -2758,26 +2707,22 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "limit": { + "default": 10, + "description": "Maximum number of results to return (1-100)", "type": "number", "minimum": 1, - "maximum": 100, - "default": 10, - "description": "Maximum number of results to return (1-100)" + "maximum": 100 }, "includeExplanation": { - "type": "boolean", "default": false, - "description": "Include explanation of how the query was translated or repaired" + "description": "Include explanation of how the query was translated or repaired", + "type": "boolean" } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage", "seer"], @@ -2790,6 +2735,8 @@ "type": "object", "properties": { "organizationSlug": { + "default": null, + "description": "Organization slug. Required when using issueId. Not needed when using issueUrl.", "anyOf": [ { "type": "string", @@ -2798,26 +2745,24 @@ { "type": "null" } - ], - "description": "Organization slug. Required when using issueId. Not needed when using issueUrl.", - "default": null + ] }, "issueId": { - "type": "string", - "description": "Issue ID (e.g., 'MCP-41', 'PROJECT-123'). Requires organizationSlug. Alternatively, use issueUrl." + "description": "Issue ID (e.g., 'MCP-41', 'PROJECT-123'). Requires organizationSlug. Alternatively, use issueUrl.", + "type": "string" }, "issueUrl": { + "description": "Full Sentry issue URL (e.g., 'https://sentry.io/organizations/my-org/issues/123/'). Includes both organization and issue ID.", "type": "string", - "format": "uri", - "description": "Full Sentry issue URL (e.g., 'https://sentry.io/organizations/my-org/issues/123/'). Includes both organization and issue ID." + "format": "uri" }, "query": { - "type": "string", - "description": "Natural language or Sentry event search query syntax for filtering within the issue." + "description": "Natural language or Sentry event search query syntax for filtering within the issue.", + "type": "string" }, "sort": { - "type": "string", - "description": "Sort field (prefix with - for descending). Default: -timestamp" + "description": "Sort field (prefix with - for descending). Default: -timestamp", + "type": "string" }, "period": { "type": "string", @@ -2825,6 +2770,8 @@ "description": "Relative time window, such as `24h`, `7d`, `14d`, `30d`, or `90d`. Controls which records fall within the search window." }, "projectSlug": { + "default": null, + "description": "Project slug for better tag discovery. Optional - helps find project-specific tags.", "anyOf": [ { "type": "string", @@ -2833,11 +2780,11 @@ { "type": "null" } - ], - "description": "Project slug for better tag discovery. Optional - helps find project-specific tags.", - "default": null + ] }, "regionUrl": { + "default": null, + "description": "Sentry region URL. Optional - defaults to main region.", "anyOf": [ { "type": "string", @@ -2846,25 +2793,21 @@ { "type": "null" } - ], - "description": "Sentry region URL. Optional - defaults to main region.", - "default": null + ] }, "limit": { + "default": 50, + "description": "Maximum number of events to return (1-100, default: 50)", "type": "number", "minimum": 1, - "maximum": 100, - "default": 50, - "description": "Maximum number of events to return (1-100, default: 50)" + "maximum": 100 }, "includeExplanation": { - "type": "boolean", "default": false, - "description": "Include explanation of how the query was translated or repaired" + "description": "Include explanation of how the query was translated or repaired", + "type": "boolean" } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage"], @@ -2881,17 +2824,19 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "query": { - "type": "string", "default": "is:unresolved", - "description": "Natural language or Sentry issue search query syntax." + "description": "Natural language or Sentry issue search query syntax.", + "type": "string" }, "sort": { - "type": "string", - "enum": ["date", "freq", "new", "user"], "default": "date", - "description": "Sort order: date (last seen), freq (frequency), new (first seen), user (user count)" + "description": "Sort order: date (last seen), freq (frequency), new (first seen), user (user count)", + "type": "string", + "enum": ["date", "freq", "new", "user"] }, "projectSlugOrId": { + "default": null, + "description": "The project's slug or numeric ID (optional)", "anyOf": [ { "type": "string" @@ -2899,11 +2844,10 @@ { "type": "null" } - ], - "default": null, - "description": "The project's slug or numeric ID (optional)" + ] }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -2912,32 +2856,28 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "limit": { + "default": 10, + "description": "Maximum number of issues to return (1-100)", "type": "number", "minimum": 1, - "maximum": 100, - "default": 10, - "description": "Maximum number of issues to return (1-100)" + "maximum": 100 }, "period": { - "type": "string", - "enum": ["24h", "7d", "14d", "30d", "90d"], "default": "30d", - "description": "Time window for issue search results. Controls which issues are returned based on when they had activity. Default 30d is a balance between coverage and query performance; use 24h for very recent issues or 90d for broader historical searches." + "description": "Time window for issue search results. Controls which issues are returned based on when they had activity. Default 30d is a balance between coverage and query performance; use 24h for very recent issues or 90d for broader historical searches.", + "type": "string", + "enum": ["24h", "7d", "14d", "30d", "90d"] }, "includeExplanation": { - "type": "boolean", "default": false, - "description": "Include explanation of how the query was translated or repaired" + "description": "Include explanation of how the query was translated or repaired", + "type": "boolean" } }, - "required": ["organizationSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug"] }, "requiredScopes": ["event:read"], "skills": ["inspect", "triage", "seer"], @@ -2955,6 +2895,8 @@ "description": "Natural language keywords describing the Sentry operation, resource, or workflow to find." }, "limit": { + "default": 8, + "description": "Maximum number of matching tools to return, up to 20.", "anyOf": [ { "type": "integer", @@ -2964,14 +2906,10 @@ { "type": "null" } - ], - "default": 8, - "description": "Maximum number of matching tools to return, up to 20." + ] } }, - "required": ["query"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["query"] }, "outputSchema": { "type": "object", @@ -2992,6 +2930,9 @@ }, "inputSchema": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": {}, "description": "JSON Schema for the matching tool's arguments. Session-constrained parameters are omitted." }, @@ -3020,8 +2961,7 @@ } }, "required": ["query", "results"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "additionalProperties": false }, "requiredScopes": [], "skills": ["inspect", "seer", "docs", "triage", "project-management"], @@ -3038,6 +2978,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -3046,9 +2987,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { "type": "string", @@ -3076,6 +3015,7 @@ "rateLimitCount": { "type": "integer", "minimum": 0, + "maximum": 9007199254740991, "description": "The maximum number of errors allowed within the rate limit window." }, "disableRateLimit": { @@ -3107,9 +3047,7 @@ "description": "Configure Logs and Metrics for the Javascript Loader Script (requires SDK >= 10.0.0)." } }, - "required": ["organizationSlug", "projectSlug", "keyId"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug", "keyId"] }, "requiredScopes": ["project:write"], "skills": ["project-management"], @@ -3126,6 +3064,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -3134,9 +3073,7 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "issueId": { "type": "string", @@ -3175,11 +3112,13 @@ "ignoreDurationMinutes": { "type": "integer", "exclusiveMinimum": 0, + "maximum": 9007199254740991, "description": "How many minutes to ignore the issue when ignoreMode is 'forDuration'." }, "ignoreCount": { "type": "integer", "exclusiveMinimum": 0, + "maximum": 9007199254740991, "description": "How many times the issue must occur before it stops being ignored when ignoreMode is 'untilOccurrenceCount'." }, "ignoreWindowMinutes": { @@ -3191,6 +3130,7 @@ "ignoreUserCount": { "type": "integer", "exclusiveMinimum": 0, + "maximum": 9007199254740991, "description": "How many users must be affected before the issue stops being ignored when ignoreMode is 'untilUserCount'." }, "ignoreUserWindowMinutes": { @@ -3204,9 +3144,7 @@ "minLength": 1, "description": "Optional reason for taking this action. When provided, it will be posted as a comment on the issue's activity feed." } - }, - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + } }, "requiredScopes": ["event:write"], "skills": ["triage"], @@ -3223,6 +3161,7 @@ "description": "The organization's slug. You can find a existing list of organizations you have access to using the `find_organizations()` tool." }, "regionUrl": { + "default": null, "anyOf": [ { "type": "string", @@ -3231,15 +3170,14 @@ { "type": "null" } - ], - "description": "The region URL for the organization you're querying, if known. For Sentry's Cloud Service (sentry.io), this is typically the region-specific URL like 'https://us.sentry.io'. For self-hosted Sentry installations, this parameter is usually not needed and should be omitted. You can find the correct regionUrl from the organization details using the `find_organizations()` tool.", - "default": null + ] }, "projectSlug": { "type": "string", "description": "The project's slug. You can find a list of existing projects in an organization using the `find_projects()` tool." }, "name": { + "default": null, "anyOf": [ { "type": "string", @@ -3248,11 +3186,10 @@ { "type": "null" } - ], - "description": "The new name for the project", - "default": null + ] }, "slug": { + "default": null, "anyOf": [ { "type": "string", @@ -3261,11 +3198,10 @@ { "type": "null" } - ], - "description": "The new slug for the project (must be unique)", - "default": null + ] }, "platform": { + "default": null, "anyOf": [ { "type": "string", @@ -3274,14 +3210,10 @@ { "type": "null" } - ], - "description": "The platform for the project. e.g., python, javascript, react, etc.", - "default": null + ] } }, - "required": ["organizationSlug", "projectSlug"], - "additionalProperties": false, - "$schema": "http://json-schema.org/draft-07/schema#" + "required": ["organizationSlug", "projectSlug"] }, "requiredScopes": ["project:write"], "skills": ["project-management"], diff --git a/packages/mcp-core/src/tools/catalog-runtime/schema.ts b/packages/mcp-core/src/tools/catalog-runtime/schema.ts index 7da387357..e9bddb9aa 100644 --- a/packages/mcp-core/src/tools/catalog-runtime/schema.ts +++ b/packages/mcp-core/src/tools/catalog-runtime/schema.ts @@ -1,5 +1,4 @@ import { z, type ZodTypeAny } from "zod"; -import { zodToJsonSchema } from "zod-to-json-schema"; export function zodFieldMapToJsonSchema( fieldMap: Record, @@ -7,9 +6,10 @@ export function zodFieldMapToJsonSchema( const zodObject = Object.keys(fieldMap).length > 0 ? z.object(fieldMap) : z.object({}); - return zodToJsonSchema(zodObject, { - $refStrategy: "none", - strictUnions: true, - pipeStrategy: "input", - }) as Record; + const { $schema: _, ...jsonSchema } = z.toJSONSchema(zodObject, { + io: "input", + target: "draft-7", + unrepresentable: "any", + }); + return jsonSchema; } diff --git a/packages/mcp-core/src/tools/special/execute-tool.ts b/packages/mcp-core/src/tools/special/execute-tool.ts index 95108b273..6030ebb06 100644 --- a/packages/mcp-core/src/tools/special/execute-tool.ts +++ b/packages/mcp-core/src/tools/special/execute-tool.ts @@ -98,7 +98,7 @@ export function createExecuteTool(getTools: () => ToolRegistry) { .min(1) .describe("The name of the available tool to execute."), arguments: z - .record(z.unknown()) + .record(z.string(), z.unknown()) .default({}) .describe( "Arguments for the target tool, matching the schema returned by search_sentry_tools.", diff --git a/packages/mcp-core/src/tools/special/search-tools.ts b/packages/mcp-core/src/tools/special/search-tools.ts index ec291119e..a98e81982 100644 --- a/packages/mcp-core/src/tools/special/search-tools.ts +++ b/packages/mcp-core/src/tools/special/search-tools.ts @@ -24,7 +24,7 @@ export const searchToolsOutputSchema = z.object({ name: z.string(), description: z.string(), inputSchema: z - .record(z.unknown()) + .record(z.string(), z.unknown()) .describe( "JSON Schema for the matching tool's arguments. Session-constrained parameters are omitted.", ), diff --git a/packages/mcp-server-evals/src/evals/utils/toolPredictionScorer.ts b/packages/mcp-server-evals/src/evals/utils/toolPredictionScorer.ts index c1104787f..d199bebc7 100644 --- a/packages/mcp-server-evals/src/evals/utils/toolPredictionScorer.ts +++ b/packages/mcp-server-evals/src/evals/utils/toolPredictionScorer.ts @@ -73,7 +73,7 @@ const predictionSchema = z.object({ .array( z.object({ name: z.string(), - arguments: z.record(z.any()).optional().default({}), + arguments: z.record(z.string(), z.any()).optional().default({}), }), ) .describe("What tools the AI would likely call"), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2bb5fb86d..430657e6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,11 +169,8 @@ catalogs: specifier: 0.1.0-3 version: 0.1.0-3 zod: - specifier: ^3.25.67 - version: 3.25.76 - zod-to-json-schema: - specifier: ^3.24.6 - version: 3.25.0 + specifier: ^4.4.3 + version: 4.4.3 overrides: '@modelcontextprotocol/sdk': ^1.26.0 @@ -257,19 +254,19 @@ importers: dependencies: '@ai-sdk/mcp': specifier: 'catalog:' - version: 1.0.16(zod@3.25.76) + version: 1.0.16(zod@4.4.3) '@ai-sdk/openai': specifier: 'catalog:' - version: 3.0.23(zod@3.25.76) + version: 3.0.23(zod@4.4.3) '@ai-sdk/react': specifier: 'catalog:' - version: 3.0.66(react@19.1.0)(zod@3.25.76) + version: 3.0.66(react@19.1.0)(zod@4.4.3) '@cloudflare/workers-oauth-provider': specifier: 'catalog:' version: 0.3.0 '@modelcontextprotocol/sdk': specifier: ^1.26.0 - version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@radix-ui/react-accordion': specifier: 'catalog:' version: 1.2.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -284,10 +281,10 @@ importers: version: 10.54.0(react@19.1.0) agents: specifier: 'catalog:' - version: 0.3.10(@ai-sdk/openai@3.0.23(zod@3.25.76))(@ai-sdk/react@3.0.66(react@19.1.0)(zod@3.25.76))(@cloudflare/ai-chat@0.0.4)(@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ai@6.0.64(zod@3.25.76))(zod@3.25.76))(@cloudflare/workers-types@4.20260405.1)(ai@6.0.64(zod@3.25.76))(react@19.1.0)(zod@3.25.76) + version: 0.3.10(@ai-sdk/openai@3.0.23(zod@4.4.3))(@ai-sdk/react@3.0.66(react@19.1.0)(zod@4.4.3))(@cloudflare/ai-chat@0.0.4)(@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(ai@6.0.64(zod@4.4.3))(zod@4.4.3))(@cloudflare/workers-types@4.20260405.1)(ai@6.0.64(zod@4.4.3))(react@19.1.0)(zod@4.4.3) ai: specifier: 'catalog:' - version: 6.0.64(zod@3.25.76) + version: 6.0.64(zod@4.4.3) asciinema-player: specifier: ^3.10.0 version: 3.12.1 @@ -332,10 +329,10 @@ importers: version: 1.3.5 workers-mcp: specifier: 'catalog:' - version: 0.1.0-3(@cfworker/json-schema@4.1.1)(zod@3.25.76) + version: 0.1.0-3(@cfworker/json-schema@4.1.1)(zod@4.4.3) zod: specifier: 'catalog:' - version: 3.25.76 + version: 4.4.3 devDependencies: '@cloudflare/vite-plugin': specifier: ^1.13.15 @@ -399,13 +396,13 @@ importers: dependencies: '@ai-sdk/anthropic': specifier: 'catalog:' - version: 3.0.33(zod@3.25.76) + version: 3.0.33(zod@4.4.3) '@ai-sdk/mcp': specifier: 'catalog:' - version: 1.0.16(zod@3.25.76) + version: 1.0.16(zod@4.4.3) '@ai-sdk/openai': specifier: 'catalog:' - version: 3.0.23(zod@3.25.76) + version: 3.0.23(zod@4.4.3) '@logtape/logtape': specifier: ^1.1.1 version: 1.1.1 @@ -414,13 +411,13 @@ importers: version: 1.1.1(@logtape/logtape@1.1.1) '@modelcontextprotocol/sdk': specifier: ^1.26.0 - version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' version: 10.54.0 ai: specifier: 'catalog:' - version: 6.0.64(zod@3.25.76) + version: 6.0.64(zod@4.4.3) dotenv: specifier: 'catalog:' version: 16.6.1 @@ -432,14 +429,14 @@ importers: version: 0.4.4 zod: specifier: 'catalog:' - version: 3.25.76 + version: 4.4.3 devDependencies: '@ai-sdk/provider': specifier: ^3.0.6 version: 3.0.6 '@ai-sdk/provider-utils': specifier: ^4.0.11 - version: 4.0.11(zod@3.25.76) + version: 4.0.11(zod@4.4.3) '@sentry/mcp-server-mocks': specifier: workspace:* version: link:../mcp-server-mocks @@ -455,15 +452,12 @@ importers: yaml: specifier: ^2.8.3 version: 2.8.3 - zod-to-json-schema: - specifier: 'catalog:' - version: 3.25.0(zod@3.25.76) packages/mcp-server: dependencies: '@modelcontextprotocol/sdk': specifier: ^1.26.0 - version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' version: 10.54.0 @@ -475,7 +469,7 @@ importers: version: 16.6.1 zod: specifier: 'catalog:' - version: 3.25.76 + version: 4.4.3 devDependencies: '@sentry/mcp-core': specifier: workspace:* @@ -506,13 +500,13 @@ importers: dependencies: '@ai-sdk/mcp': specifier: 'catalog:' - version: 1.0.16(zod@3.25.76) + version: 1.0.16(zod@4.4.3) '@ai-sdk/openai': specifier: 'catalog:' - version: 3.0.23(zod@3.25.76) + version: 3.0.23(zod@4.4.3) '@modelcontextprotocol/sdk': specifier: ^1.26.0 - version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/mcp-core': specifier: workspace:* version: link:../mcp-core @@ -527,7 +521,7 @@ importers: version: link:../mcp-server-tsconfig ai: specifier: 'catalog:' - version: 6.0.64(zod@3.25.76) + version: 6.0.64(zod@4.4.3) dotenv: specifier: 'catalog:' version: 16.6.1 @@ -545,7 +539,7 @@ importers: version: 0.4.0(tinyrainbow@3.1.0)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.0.10)(msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.3))) zod: specifier: 'catalog:' - version: 3.25.76 + version: 4.4.3 packages/mcp-server-mocks: dependencies: @@ -566,13 +560,13 @@ importers: dependencies: '@ai-sdk/mcp': specifier: 'catalog:' - version: 1.0.16(zod@3.25.76) + version: 1.0.16(zod@4.4.3) '@ai-sdk/openai': specifier: 'catalog:' - version: 3.0.23(zod@3.25.76) + version: 3.0.23(zod@4.4.3) '@modelcontextprotocol/sdk': specifier: ^1.26.0 - version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + version: 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' version: 10.54.0 @@ -584,7 +578,7 @@ importers: version: 10.54.0 ai: specifier: 'catalog:' - version: 6.0.64(zod@3.25.76) + version: 6.0.64(zod@4.4.3) chalk: specifier: 'catalog:' version: 5.4.1 @@ -599,7 +593,7 @@ importers: version: 10.1.2 zod: specifier: 'catalog:' - version: 3.25.76 + version: 4.4.3 devDependencies: tsdown: specifier: 'catalog:' @@ -690,12 +684,14 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@ast-grep/cli-linux-x64-gnu@0.43.0': resolution: {integrity: sha512-r/o9Mag6OZmGevY9OJjatuUKDOX1rSvgo29qSfxpMbIciiH3hkzEW/2w1xTPZI8xnM7iC+k+CkGoknmoXVTYGg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@ast-grep/cli-win32-arm64-msvc@0.43.0': resolution: {integrity: sha512-oHa4ruD87xccnqFuR+Pmx6F/suHV0YtibuyZ6SxUqgpNJAFZiUNAiFblzhEgQ5gp03e8B012P/Yy/7GYOvxOLg==} @@ -837,24 +833,28 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@1.9.4': resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@1.9.4': resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@1.9.4': resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@1.9.4': resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} @@ -1427,155 +1427,183 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -1959,21 +1987,25 @@ packages: resolution: {integrity: sha512-PFBBnj9JqLOL8gjZtoVGfOXe0PSpnPUXE+JuMcWz568K/p4Zzk7lDDHl7guD95wVtV89TmfaRwK2PWd9vKxHtg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-beta.23': resolution: {integrity: sha512-KyQRLofVP78yUCXT90YmEzxK6I9VCBeOTSyOrs40Qx0Q0XwaGVwxo7sKj2SmnqxribdcouBA3CfNZC4ZNcyEnQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-x64-gnu@1.0.0-beta.23': resolution: {integrity: sha512-EubfEsJyjQbKK9j3Ez1hhbIOsttABb07Z7PhMRcVYW0wrVr8SfKLew9pULIMfcSNnoz8QqzoI4lOSmezJ9bYWw==} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-beta.23': resolution: {integrity: sha512-MUAthvl3I/+hySltZuj5ClKiq8fAMqExeBnxadLFShwWCbdHKFd+aRjBxxzarPcnqbDlTaOCUaAaYmQTOTOHSg==} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-wasm32-wasi@1.0.0-beta.23': resolution: {integrity: sha512-YI7QMQU01QFVNTEaQt3ysrq+wGBwLdFVFEGO64CoZ3gTsr/HulU8gvgR+67coQOlQC9iO/Hm1bvkBtceLxKrnA==} @@ -2035,56 +2067,67 @@ packages: resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.44.1': resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.44.1': resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.44.1': resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.44.1': resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.44.1': resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.44.1': resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.44.1': resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.44.1': resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.44.1': resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.44.1': resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} @@ -2311,24 +2354,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.11': resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.11': resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.11': resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.11': resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} @@ -3526,24 +3573,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} @@ -5005,11 +5056,6 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - zod-to-json-schema@3.25.0: - resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} - peerDependencies: - zod: ^3.25 || ^4 - zod-to-json-schema@3.25.1: resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: @@ -5021,52 +5067,55 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/anthropic@3.0.33(zod@3.25.76)': + '@ai-sdk/anthropic@3.0.33(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.6 - '@ai-sdk/provider-utils': 4.0.11(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 4.0.11(zod@4.4.3) + zod: 4.4.3 - '@ai-sdk/gateway@3.0.29(zod@3.25.76)': + '@ai-sdk/gateway@3.0.29(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.6 - '@ai-sdk/provider-utils': 4.0.11(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.11(zod@4.4.3) '@vercel/oidc': 3.1.0 - zod: 3.25.76 + zod: 4.4.3 - '@ai-sdk/mcp@1.0.16(zod@3.25.76)': + '@ai-sdk/mcp@1.0.16(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.6 - '@ai-sdk/provider-utils': 4.0.11(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.11(zod@4.4.3) pkce-challenge: 5.0.0 - zod: 3.25.76 + zod: 4.4.3 - '@ai-sdk/openai@3.0.23(zod@3.25.76)': + '@ai-sdk/openai@3.0.23(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.6 - '@ai-sdk/provider-utils': 4.0.11(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 4.0.11(zod@4.4.3) + zod: 4.4.3 - '@ai-sdk/provider-utils@4.0.11(zod@3.25.76)': + '@ai-sdk/provider-utils@4.0.11(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.6 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 - zod: 3.25.76 + zod: 4.4.3 '@ai-sdk/provider@3.0.6': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@3.0.66(react@19.1.0)(zod@3.25.76)': + '@ai-sdk/react@3.0.66(react@19.1.0)(zod@4.4.3)': dependencies: - '@ai-sdk/provider-utils': 4.0.11(zod@3.25.76) - ai: 6.0.64(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.11(zod@4.4.3) + ai: 6.0.64(zod@4.4.3) react: 19.1.0 swr: 2.3.4(react@19.1.0) throttleit: 2.1.0 @@ -5138,7 +5187,7 @@ snapshots: '@babel/traverse': 7.28.0 '@babel/types': 7.28.0 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5230,7 +5279,7 @@ snapshots: '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/types': 7.28.0 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -5300,21 +5349,21 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - '@cloudflare/ai-chat@0.0.4(agents@0.3.10)(ai@6.0.64(zod@3.25.76))(react@19.1.0)(zod@3.25.76)': + '@cloudflare/ai-chat@0.0.4(agents@0.3.10)(ai@6.0.64(zod@4.4.3))(react@19.1.0)(zod@4.4.3)': dependencies: - agents: 0.3.10(@ai-sdk/openai@3.0.23(zod@3.25.76))(@ai-sdk/react@3.0.66(react@19.1.0)(zod@3.25.76))(@cloudflare/ai-chat@0.0.4)(@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ai@6.0.64(zod@3.25.76))(zod@3.25.76))(@cloudflare/workers-types@4.20260405.1)(ai@6.0.64(zod@3.25.76))(react@19.1.0)(zod@3.25.76) - ai: 6.0.64(zod@3.25.76) + agents: 0.3.10(@ai-sdk/openai@3.0.23(zod@4.4.3))(@ai-sdk/react@3.0.66(react@19.1.0)(zod@4.4.3))(@cloudflare/ai-chat@0.0.4)(@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(ai@6.0.64(zod@4.4.3))(zod@4.4.3))(@cloudflare/workers-types@4.20260405.1)(ai@6.0.64(zod@4.4.3))(react@19.1.0)(zod@4.4.3) + ai: 6.0.64(zod@4.4.3) react: 19.1.0 - zod: 3.25.76 + zod: 4.4.3 - '@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ai@6.0.64(zod@3.25.76))(zod@3.25.76)': + '@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(ai@6.0.64(zod@4.4.3))(zod@4.4.3)': dependencies: '@types/json-schema': 7.0.15 acorn: 8.16.0 optionalDependencies: - '@modelcontextprotocol/sdk': 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) - ai: 6.0.64(zod@3.25.76) - zod: 3.25.76 + '@modelcontextprotocol/sdk': 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + ai: 6.0.64(zod@4.4.3) + zod: 4.4.3 '@cloudflare/kv-asset-handler@0.4.2': {} @@ -5873,7 +5922,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} @@ -5885,7 +5934,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: @@ -5905,7 +5954,7 @@ snapshots: '@logtape/logtape': 1.1.1 '@sentry/core': 9.34.0 - '@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3)': dependencies: '@hono/node-server': 1.19.9(hono@4.11.4) ajv: 8.17.1 @@ -5922,8 +5971,8 @@ snapshots: json-schema-typed: 8.0.2 pkce-challenge: 5.0.0 raw-body: 3.0.1 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod: 4.4.3 + zod-to-json-schema: 3.25.1(zod@4.4.3) optionalDependencies: '@cfworker/json-schema': 4.1.1 transitivePeerDependencies: @@ -6701,13 +6750,13 @@ snapshots: transitivePeerDependencies: - supports-color - agents@0.3.10(@ai-sdk/openai@3.0.23(zod@3.25.76))(@ai-sdk/react@3.0.66(react@19.1.0)(zod@3.25.76))(@cloudflare/ai-chat@0.0.4)(@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ai@6.0.64(zod@3.25.76))(zod@3.25.76))(@cloudflare/workers-types@4.20260405.1)(ai@6.0.64(zod@3.25.76))(react@19.1.0)(zod@3.25.76): + agents@0.3.10(@ai-sdk/openai@3.0.23(zod@4.4.3))(@ai-sdk/react@3.0.66(react@19.1.0)(zod@4.4.3))(@cloudflare/ai-chat@0.0.4)(@cloudflare/codemode@0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(ai@6.0.64(zod@4.4.3))(zod@4.4.3))(@cloudflare/workers-types@4.20260405.1)(ai@6.0.64(zod@4.4.3))(react@19.1.0)(zod@4.4.3): dependencies: '@cfworker/json-schema': 4.1.1 - '@cloudflare/ai-chat': 0.0.4(agents@0.3.10)(ai@6.0.64(zod@3.25.76))(react@19.1.0)(zod@3.25.76) - '@cloudflare/codemode': 0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(ai@6.0.64(zod@3.25.76))(zod@3.25.76) - '@modelcontextprotocol/sdk': 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) - ai: 6.0.64(zod@3.25.76) + '@cloudflare/ai-chat': 0.0.4(agents@0.3.10)(ai@6.0.64(zod@4.4.3))(react@19.1.0)(zod@4.4.3) + '@cloudflare/codemode': 0.3.4(@modelcontextprotocol/sdk@1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(ai@6.0.64(zod@4.4.3))(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + ai: 6.0.64(zod@4.4.3) cron-schedule: 6.0.0 escape-html: 1.0.3 json-schema: 0.4.0 @@ -6718,21 +6767,21 @@ snapshots: partysocket: 1.1.11 react: 19.1.0 yargs: 18.0.0 - zod: 3.25.76 + zod: 4.4.3 optionalDependencies: - '@ai-sdk/openai': 3.0.23(zod@3.25.76) - '@ai-sdk/react': 3.0.66(react@19.1.0)(zod@3.25.76) + '@ai-sdk/openai': 3.0.23(zod@4.4.3) + '@ai-sdk/react': 3.0.66(react@19.1.0)(zod@4.4.3) transitivePeerDependencies: - '@cloudflare/workers-types' - supports-color - ai@6.0.64(zod@3.25.76): + ai@6.0.64(zod@4.4.3): dependencies: - '@ai-sdk/gateway': 3.0.29(zod@3.25.76) + '@ai-sdk/gateway': 3.0.29(zod@4.4.3) '@ai-sdk/provider': 3.0.6 - '@ai-sdk/provider-utils': 4.0.11(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.11(zod@4.4.3) '@opentelemetry/api': 1.9.0 - zod: 3.25.76 + zod: 4.4.3 ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: @@ -7681,7 +7730,7 @@ snapshots: lightningcss@1.30.1: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 @@ -9553,10 +9602,10 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260401.1 '@cloudflare/workerd-windows-64': 1.20260401.1 - workers-mcp@0.1.0-3(@cfworker/json-schema@4.1.1)(zod@3.25.76): + workers-mcp@0.1.0-3(@cfworker/json-schema@4.1.1)(zod@4.4.3): dependencies: '@clack/prompts': 0.8.2 - '@modelcontextprotocol/sdk': 1.26.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.26.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@silvia-odwyer/photon-node': 0.3.4 chalk: 5.4.1 fs-extra: 11.3.0 @@ -9671,16 +9720,14 @@ snapshots: cookie: 1.0.2 youch-core: 0.3.3 - zod-to-json-schema@3.25.0(zod@3.25.76): + zod-to-json-schema@3.25.1(zod@4.4.3): dependencies: - zod: 3.25.76 - - zod-to-json-schema@3.25.1(zod@3.25.76): - dependencies: - zod: 3.25.76 + zod: 4.4.3 zod@3.22.3: {} zod@3.25.76: {} + zod@4.4.3: {} + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 64a214fcb..6bb6fc242 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -80,5 +80,4 @@ catalog: vitest-evals: ^0.4.0 workers-mcp: 0.1.0-3 wrangler: 4.80.0 - zod: ^3.25.67 - zod-to-json-schema: ^3.24.6 + zod: ^4.4.3