Repository: mastra-ai/mastra
Pull request #4200: Fix jsonSchema on vercel tools
Author: login: abhiaiyer91
Created: 2025-05-11T00:15:57Z | Merged: 2025-05-12T03:53:44Z

## Description

<!-- Provide a brief description of the changes in this PR -->

## Related Issue(s)

<!-- Link to the issue(s) this PR addresses, using hashtag notation: #123 -->

## Type of Change

- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Documentation update
- [ ] Code refactoring
- [ ] Performance improvement
- [ ] Test update

## Checklist

- [ ] I have performed a self-review of my own code
- [ ] I have made corresponding changes to the documentation (if applicable)
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] I have generated a changeset for this PR



Diff:
diff --git a/.changeset/proud-parrots-learn.md b/.changeset/proud-parrots-learn.md
new file mode 100644
index 00000000000..f7e60520fd7
--- /dev/null
+++ b/.changeset/proud-parrots-learn.md
@@ -0,0 +1,5 @@
+---
+"@mastra/core": patch
+---
+
+Fix jsonSchema on vercel tools
diff --git a/examples/agent/package.json b/examples/agent/package.json
index 784ef9bfbe5..0309c93799c 100644
--- a/examples/agent/package.json
+++ b/examples/agent/package.json
@@ -12,6 +12,7 @@
     "@mastra/mcp": "latest",
     "@mastra/memory": "latest",
     "@mastra/voice-openai": "latest",
+    "ai": "^4.3.15",
     "fetch-to-node": "^2.1.0",
     "mastra": "latest",
     "zod": "^3.24.2"
diff --git a/examples/agent/pnpm-lock.yaml b/examples/agent/pnpm-lock.yaml
index 351e4409aca..181f1454095 100644
--- a/examples/agent/pnpm-lock.yaml
+++ b/examples/agent/pnpm-lock.yaml
@@ -34,6 +34,9 @@ importers:
       '@mastra/voice-openai':
         specifier: link:../../voice/openai
         version: link:../../voice/openai
+      ai:
+        specifier: ^4.3.15
+        version: 4.3.15(react@19.1.0)(zod@3.24.3)
       fetch-to-node:
         specifier: ^2.1.0
         version: 2.1.0
@@ -58,24 +61,102 @@ packages:
     peerDependencies:
       zod: ^3.23.8
 
+  '@ai-sdk/provider-utils@2.2.8':
+    resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.23.8
+
   '@ai-sdk/provider@1.1.3':
     resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==}
     engines: {node: '>=18'}
 
+  '@ai-sdk/react@1.2.12':
+    resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      react: ^18 || ^19 || ^19.0.0-rc
+      zod: ^3.23.8
+    peerDependenciesMeta:
+      zod:
+        optional: true
+
+  '@ai-sdk/ui-utils@1.2.11':
+    resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.23.8
+
+  '@opentelemetry/api@1.9.0':
+    resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
+    engines: {node: '>=8.0.0'}
+
+  '@types/diff-match-patch@1.0.36':
+    resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==}
+
+  ai@4.3.15:
+    resolution: {integrity: sha512-TYKRzbWg6mx/pmTadlAEIhuQtzfHUV0BbLY72+zkovXwq/9xhcH24IlQmkyBpElK6/4ArS0dHdOOtR1jOPVwtg==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      react: ^18 || ^19 || ^19.0.0-rc
+      zod: ^3.23.8
+    peerDependenciesMeta:
+      react:
+        optional: true
+
+  chalk@5.4.1:
+    resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+  dequal@2.0.3:
+    resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+    engines: {node: '>=6'}
+
+  diff-match-patch@1.0.5:
+    resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==}
+
   fetch-to-node@2.1.0:
     resolution: {integrity: sha512-Wq05j6LE1GrWpT2t1YbCkyFY6xKRJq3hx/oRJdWEJpZlik3g25MmdJS6RFm49iiMJw6zpZuBOrgihOgy2jGyAA==}
 
   json-schema@0.4.0:
     resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
 
+  jsondiffpatch@0.6.0:
+    resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+
   nanoid@3.3.11:
     resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
+  react@19.1.0:
+    resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
+    engines: {node: '>=0.10.0'}
+
   secure-json-parse@2.7.0:
     resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
 
+  swr@2.3.3:
+    resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==}
+    peerDependencies:
+      react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  throttleit@2.1.0:
+    resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==}
+    engines: {node: '>=18'}
+
+  use-sync-external-store@1.5.0:
+    resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  zod-to-json-schema@3.24.5:
+    resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==}
+    peerDependencies:
+      zod: ^3.24.1
+
   zod@3.24.3:
     resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==}
 
@@ -94,16 +175,86 @@ snapshots:
       secure-json-parse: 2.7.0
       zod: 3.24.3
 
+  '@ai-sdk/provider-utils@2.2.8(zod@3.24.3)':
+    dependencies:
+      '@ai-sdk/provider': 1.1.3
+      nanoid: 3.3.11
+      secure-json-parse: 2.7.0
+      zod: 3.24.3
+
   '@ai-sdk/provider@1.1.3':
     dependencies:
       json-schema: 0.4.0
 
+  '@ai-sdk/react@1.2.12(react@19.1.0)(zod@3.24.3)':
+    dependencies:
+      '@ai-sdk/provider-utils': 2.2.8(zod@3.24.3)
+      '@ai-sdk/ui-utils': 1.2.11(zod@3.24.3)
+      react: 19.1.0
+      swr: 2.3.3(react@19.1.0)
+      throttleit: 2.1.0
+    optionalDependencies:
+      zod: 3.24.3
+
+  '@ai-sdk/ui-utils@1.2.11(zod@3.24.3)':
+    dependencies:
+      '@ai-sdk/provider': 1.1.3
+      '@ai-sdk/provider-utils': 2.2.8(zod@3.24.3)
+      zod: 3.24.3
+      zod-to-json-schema: 3.24.5(zod@3.24.3)
+
+  '@opentelemetry/api@1.9.0': {}
+
+  '@types/diff-match-patch@1.0.36': {}
+
+  ai@4.3.15(react@19.1.0)(zod@3.24.3):
+    dependencies:
+      '@ai-sdk/provider': 1.1.3
+      '@ai-sdk/provider-utils': 2.2.8(zod@3.24.3)
+      '@ai-sdk/react': 1.2.12(react@19.1.0)(zod@3.24.3)
+      '@ai-sdk/ui-utils': 1.2.11(zod@3.24.3)
+      '@opentelemetry/api': 1.9.0
+      jsondiffpatch: 0.6.0
+      zod: 3.24.3
+    optionalDependencies:
+      react: 19.1.0
+
+  chalk@5.4.1: {}
+
+  dequal@2.0.3: {}
+
+  diff-match-patch@1.0.5: {}
+
   fetch-to-node@2.1.0: {}
 
   json-schema@0.4.0: {}
 
+  jsondiffpatch@0.6.0:
+    dependencies:
+      '@types/diff-match-patch': 1.0.36
+      chalk: 5.4.1
+      diff-match-patch: 1.0.5
+
   nanoid@3.3.11: {}
 
+  react@19.1.0: {}
+
   secure-json-parse@2.7.0: {}
 
+  swr@2.3.3(react@19.1.0):
+    dependencies:
+      dequal: 2.0.3
+      react: 19.1.0
+      use-sync-external-store: 1.5.0(react@19.1.0)
+
+  throttleit@2.1.0: {}
+
+  use-sync-external-store@1.5.0(react@19.1.0):
+    dependencies:
+      react: 19.1.0
+
+  zod-to-json-schema@3.24.5(zod@3.24.3):
+    dependencies:
+      zod: 3.24.3
+
   zod@3.24.3: {}
diff --git a/examples/agent/src/mastra/agents/index.ts b/examples/agent/src/mastra/agents/index.ts
index 8d8ea3e96d7..ecf9e319ae9 100644
--- a/examples/agent/src/mastra/agents/index.ts
+++ b/examples/agent/src/mastra/agents/index.ts
@@ -1,4 +1,5 @@
 import { openai } from '@ai-sdk/openai';
+import { jsonSchema, tool } from 'ai';
 import { OpenAIVoice } from '@mastra/voice-openai';
 import { Memory } from '@mastra/memory';
 import { Agent } from '@mastra/core/agent';
@@ -7,6 +8,33 @@ import { myWorkflow } from '../workflows/index.js';
 
 const memory = new Memory();
 
+// Define schema directly compatible with OpenAI's requirements
+const mySchema = jsonSchema({
+  type: 'object',
+  properties: {
+    city: {
+      type: 'string',
+      description: 'The city to get weather information for',
+    },
+  },
+  required: ['city'],
+});
+
+export const weatherInfo = tool({
+  description: 'Fetches the current weather information for a given city',
+  parameters: mySchema,
+  execute: async ({ city }) => {
+    return {
+      city,
+      weather: 'sunny',
+      temperature_celsius: 19,
+      temperature_fahrenheit: 66,
+      humidity: 50,
+      wind: '10 mph',
+    };
+  },
+});
+
 export const chefAgent = new Agent({
   name: 'Chef Agent',
   instructions: `
@@ -18,6 +46,7 @@ export const chefAgent = new Agent({
   model: openai('gpt-4o-mini'),
   tools: {
     cookingTool,
+    weatherInfo,
   },
   workflows: {
     myWorkflow,
diff --git a/packages/core/src/tools/tool-compatibility/builder.ts b/packages/core/src/tools/tool-compatibility/builder.ts
index 574160966e8..ffb1bed2507 100644
--- a/packages/core/src/tools/tool-compatibility/builder.ts
+++ b/packages/core/src/tools/tool-compatibility/builder.ts
@@ -52,7 +52,18 @@ export function convertVercelToolParameters(tool: VercelTool): z.ZodType {
   // If the tool is a Vercel Tool, check if the parameters are already a zod object
   // If not, convert the parameters to a zod object using jsonSchemaToZod
   const schema = tool.parameters ?? z.object({});
-  return isZodType(schema) ? schema : resolveSerializedZodOutput(jsonSchemaToZod(schema));
+  if (isZodType(schema)) {
+    return schema;
+  } else {
+    let schemaToUse;
+    if ('jsonSchema' in schema) {
+      schemaToUse = schema.jsonSchema;
+    } else {
+      schemaToUse = schema;
+    }
+
+    return resolveSerializedZodOutput(jsonSchemaToZod(schemaToUse));
+  }
 }
 
 function convertInputSchema(tool: ToolAction<any, any, any>): z.ZodType {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4b151be68ae..27f322b491a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2595,7 +2595,7 @@ importers:
         version: 20.17.32
       '@vitest/coverage-v8':
         specifier: 3.0.9
-        version: 3.0.9(vitest@3.1.2)
+        version: 3.0.9(vitest@3.1.2(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.17.32)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@26.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))
       '@vitest/ui':
         specifier: 3.0.9
         version: 3.0.9(vitest@3.1.2)
@@ -13936,12 +13936,10 @@ packages:
 
   libsql@0.4.7:
     resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==}
-    cpu: [x64, arm64, wasm32]
     os: [darwin, linux, win32]
 
   libsql@0.5.6:
     resolution: {integrity: sha512-k0qHpyU47iWBplT4IJKEcMgUbms8jl9cNGE6aqsdOYmSJjtZIaYkn8f4ku5DzxRHpk1+o4FK7ZwGVCExYboZqQ==}
-    cpu: [x64, arm64, wasm32]
     os: [darwin, linux, win32]
 
   light-my-request@5.14.0:
@@ -25895,7 +25893,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/coverage-v8@3.0.9(vitest@3.1.2)':
+  '@vitest/coverage-v8@3.0.9(vitest@3.1.2(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.17.32)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@26.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 1.0.2
@@ -28131,7 +28129,7 @@ snapshots:
       eslint-config-prettier: 8.10.0(eslint@8.57.1)
       eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)
       eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)
-      eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.32)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.10(@swc/helpers@0.5.15))(@types/node@20.17.32)(typescript@5.8.3)))(typescript@5.8.3)
+      eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.32)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.10(@swc/helpers@0.5.15))(@types/node@20.17.32)(typescript@5.8.3)))(typescript@5.8.3)
       eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
       eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8)
       eslint-plugin-react: 7.37.5(eslint@8.57.1)
@@ -28791,7 +28789,7 @@ snapshots:
       - eslint-import-resolver-webpack
       - supports-color
 
-  eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.32)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.10(@swc/helpers@0.5.15))(@types/node@20.17.32)(typescript@5.8.3)))(typescript@5.8.3):
+  eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.32)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.10(@swc/helpers@0.5.15))(@types/node@20.17.32)(typescript@5.8.3)))(typescript@5.8.3):
     dependencies:
       '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3)
       eslint: 8.57.1


Reviews:
user: login: greptile-apps[bot]
body: 
## PR Summary

Enhanced JSON schema handling for Vercel tools by adding AI SDK support and improving parameter conversion logic in the tool compatibility builder.

- Added `ai` package (v4.3.15) to `/examples/agent/package.json` for Vercel AI SDK integration
- Modified `/packages/core/src/tools/tool-compatibility/builder.ts` to properly handle `jsonSchema` properties in Vercel tool parameters
- Added weather information tool with JSON schema validation in `/examples/agent/src/mastra/agents/index.ts`
- Improved schema type checking logic to handle both Zod and JSON schema formats

<sub>3 file(s) reviewed, 2 comment(s)</sub>
<sub>[Edit PR Review Bot Settings](https://app.greptile.com/review/github) | [Greptile](https://greptile.com?utm_source=greptile_expert&utm_medium=github&utm_campaign=code_reviews&utm_content=mastra_4200)</sub>
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T00:17:16Z

Review comments:
diff_hunk: @@ -52,7 +52,18 @@ export function convertVercelToolParameters(tool: VercelTool): z.ZodType {
   // If the tool is a Vercel Tool, check if the parameters are already a zod object
   // If not, convert the parameters to a zod object using jsonSchemaToZod
   const schema = tool.parameters ?? z.object({});
-  return isZodType(schema) ? schema : resolveSerializedZodOutput(jsonSchemaToZod(schema));
+  if (isZodType(schema)) {
+    return schema;
+  } else {
+    let schemaToUse;
+    if ('jsonSchema' in schema) {
+      schemaToUse = schema.jsonSchema;
+    } else {
path: packages/core/src/tools/tool-compatibility/builder.ts
user: login: greptile-apps[bot]
body: style: Consider validating that schema.jsonSchema is not undefined before using it as schemaToUse
created_at: 2025-05-11T00:16:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -18,6 +46,7 @@ export const chefAgent = new Agent({
   model: openai('gpt-4o-mini'),
   tools: {
     cookingTool,
+    weatherInfo,
   },
path: examples/agent/src/mastra/agents/index.ts
user: login: greptile-apps[bot]
body: style: weatherInfo tool is added to chefAgent but not referenced in its instructions. Agent won't know when/how to use it.
created_at: 2025-05-11T00:17:00Z
author_association: CONTRIBUTOR

PR comments:
user: login: vercel[bot]
created_at: 2025-05-11T00:15:59Z
body: [vc]: #u/CceQ93mQTziedtOfnaLej/K+fzSvdb7jxg0MYoNH4=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJ0cmF2ZWwtYWkiLCJyb290RGlyZWN0b3J5IjoiZXhhbXBsZXMvdHJhdmVsLWFwcCIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9rZXBsZXItYWIxYmY1YWIvdHJhdmVsLWFpL0EzNjlCZENFcjhMa3A4cXAzNVNyeHhBNWtqaDgiLCJwcmV2aWV3VXJsIjoiIiwibmV4dENvbW1pdFN0YXR1cyI6IkZBSUxFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiIifX0seyJuYW1lIjoiYXNzaXN0YW50LXVpIiwicm9vdERpcmVjdG9yeSI6ImV4YW1wbGVzL2Fzc2lzdGFudC11aSIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9rZXBsZXItYWIxYmY1YWIvYXNzaXN0YW50LXVpL0g2RVFXbUpaVXNEWTJVWlJ0NEFpbkNER0VYU2ciLCJwcmV2aWV3VXJsIjoiYXNzaXN0YW50LXVpLWdpdC1maXhqc29uc2NoZW1hLWtlcGxlci1hYjFiZjVhYi52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IkRFUExPWUVEIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6ImFzc2lzdGFudC11aS1naXQtZml4anNvbnNjaGVtYS1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCJ9fSx7Im5hbWUiOiJvcGVuYXBpLXNwZWMtd3JpdGVyIiwicm9vdERpcmVjdG9yeSI6ImV4YW1wbGVzL29wZW5hcGktc3BlYy13cml0ZXIiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20va2VwbGVyLWFiMWJmNWFiL29wZW5hcGktc3BlYy13cml0ZXIvRWtzajF6d3lwVWFReEptWUJhTFVmQmpub2tYUSIsInByZXZpZXdVcmwiOiIiLCJuZXh0Q29tbWl0U3RhdHVzIjoiQ0FOQ0VMRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiIn19LHsibmFtZSI6Im1hc3RyYS1kb2NzIiwicm9vdERpcmVjdG9yeSI6ImRvY3MiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20va2VwbGVyLWFiMWJmNWFiL21hc3RyYS1kb2NzL0FhVFJEN0ptZkJGS1M4NUFEZ3oyTWNyUUF4NmsiLCJwcmV2aWV3VXJsIjoiIiwibmV4dENvbW1pdFN0YXR1cyI6IkNBTkNFTEVEIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6IiJ9fV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **assistant-ui** | ✅ Ready ([Inspect](https://vercel.com/kepler-ab1bf5ab/assistant-ui/H6EQWmJZUsDY2UZRt4AinCDGEXSg)) | [Visit Preview](https://assistant-ui-git-fixjsonschema-kepler-ab1bf5ab.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/assistant-ui-git-fixjsonschema-kepler-ab1bf5ab.vercel.app?via=pr-comment-feedback-link) | May 11, 2025 2:41am |
| **mastra-docs** | 🛑 Canceled ([Inspect](https://vercel.com/kepler-ab1bf5ab/mastra-docs/AaTRD7JmfBFKS85ADgz2McrQAx6k)) |  |  | May 11, 2025 2:41am |
| **openapi-spec-writer** | 🛑 Canceled ([Inspect](https://vercel.com/kepler-ab1bf5ab/openapi-spec-writer/Eksj1zwypUaQxJmYBaLUfBjnokXQ)) |  |  | May 11, 2025 2:41am |
| **travel-ai** | ❌ Failed ([Inspect](https://vercel.com/kepler-ab1bf5ab/travel-ai/A369BdCEr8Lkp8qp35SrxxA5kjh8)) |  |  | May 11, 2025 2:41am |





author_association: NONE
user: login: codesandbox[bot]
created_at: 2025-05-11T00:16:00Z
body: #### Review or Edit in CodeSandbox

Open the branch in <a href="https://codesandbox.io/p/github/mastra-ai/mastra/fixJsonSchema?mode=review&utm_source=gh_app">Web Editor</a> &bull; <a href="https://codesandbox.io/p/vscode?owner=mastra-ai&repo=mastra&branch=fixJsonSchema&utm_source=gh_app">VS Code</a> &bull; <a href="https://codesandbox.io/p/vscode?owner=mastra-ai&repo=mastra&branch=fixJsonSchema&insiders=true&utm_source=gh_app">Insiders</a><br>
Open <a href="https://codesandbox.io/p/devtool/preview/mastra-ai/mastra/fixJsonSchema?task=preview&port=51423&redirect=true&utm_source=gh_app">Preview</a>

<!-- open-in-codesandbox:complete -->

author_association: NONE
user: login: changeset-bot[bot]
created_at: 2025-05-11T00:16:01Z
body: ###  🦋  Changeset detected

Latest commit: 0f765e912fc4b4acbe2c3b521c9910b9adb25cdb

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 59 packages</summary>

  | Name                          | Type  |
| ----------------------------- | ----- |
| @mastra/core                  | Patch |
| mastra                        | Patch |
| @mastra/cloud                 | Patch |
| @mastra/deployer              | Patch |
| @mastra/evals                 | Patch |
| @mastra/loggers               | Patch |
| @mastra/mcp-docs-server       | Patch |
| @mastra/mcp-registry-registry | Patch |
| @mastra/mcp                   | Patch |
| @mastra/memory                | Patch |
| @mastra/playground-ui         | Patch |
| @mastra/rag                   | Patch |
| @mastra/server                | Patch |
| @mastra/deployer-cloudflare   | Patch |
| @mastra/deployer-netlify      | Patch |
| @mastra/deployer-vercel       | Patch |
| @mastra/astra                 | Patch |
| @mastra/chroma                | Patch |
| @mastra/clickhouse            | Patch |
| @mastra/cloudflare-d1         | Patch |
| @mastra/cloudflare            | Patch |
| @mastra/couchbase             | Patch |
| @mastra/libsql                | Patch |
| @mastra/mongodb               | Patch |
| @mastra/opensearch            | Patch |
| @mastra/pg                    | Patch |
| @mastra/pinecone              | Patch |
| @mastra/qdrant                | Patch |
| @mastra/turbopuffer           | Patch |
| @mastra/upstash               | Patch |
| @mastra/vectorize             | Patch |
| @mastra/speech-azure          | Patch |
| @mastra/speech-deepgram       | Patch |
| @mastra/speech-elevenlabs     | Patch |
| @mastra/speech-google         | Patch |
| @mastra/speech-ibm            | Patch |
| @mastra/speech-murf           | Patch |
| @mastra/speech-openai         | Patch |
| @mastra/speech-playai         | Patch |
| @mastra/speech-replicate      | Patch |
| @mastra/speech-speechify      | Patch |
| @mastra/voice-azure           | Patch |
| @mastra/voice-cloudflare      | Patch |
| @mastra/voice-deepgram        | Patch |
| @mastra/voice-elevenlabs      | Patch |
| @mastra/voice-google          | Patch |
| @mastra/voice-murf            | Patch |
| @mastra/voice-openai-realtime | Patch |
| @mastra/voice-openai          | Patch |
| @mastra/voice-playai          | Patch |
| @mastra/voice-sarvam          | Patch |
| @mastra/voice-speechify       | Patch |
| @mastra/inngest               | Patch |
| @mastra/client-js             | Patch |
| @mastra/firecrawl             | Patch |
| @mastra/github                | Patch |
| @mastra/mem0                  | Patch |
| @mastra/ragie                 | Patch |
| @mastra/dane                  | Patch |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/mastra-ai/mastra/new/fixJsonSchema?filename=.changeset/poor-rocks-count.md&value=---%0A%22%40mastra%2Fcore%22%3A%20patch%0A---%0A%0AFix%20jsonSchema%20on%20vercel%20tools%0A)


author_association: NONE