Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: zod v4 by dclark27 · Pull Request #869 · modelcontextprotocol/typescript-sdk · GitHub
Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: zod v4 by dclark27 · Pull Request #869 · modelcontextprotocol/typescript-sdk · GitHub
Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: zod v4 by dclark27 · Pull Request #869 · modelcontextprotocol/typescript-sdk · GitHub
Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat: zod v4 by dclark27 · Pull Request #869 · modelcontextprotocol/typescript-sdk · GitHub
Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: zod v4 by dclark27 · Pull Request #869 · modelcontextprotocol/typescript-sdk · GitHub
Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat: zod v4 by dclark27 · Pull Request #869 · modelcontextprotocol/typescript-sdk · GitHub
Skip to content

feat: zod v4 - #869

Closed
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4
Closed

feat: zod v4#869
dclark27 wants to merge 26 commits into
modelcontextprotocol:mainfrom
socotra:zod-v4

Conversation

@dclark27

@dclark27dclark27 commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade to zod v4
  • Replaces zod-to-json-schema with zod v4 toJsonSchema
  • Adjust usage to be in best practice with zod v4 migration guide
  • Adjust imports to use import * as z from 'zod' instead of import { z } from 'zod' to prevent memory leaks

Motivation and Context

This has been a blocking issue for my team and many others. When versions mismatch across dependencies with older Zod versions, memory leaks become present and can slow or stall development.

This also will help unblock downstream dependencies, such as with vercel's AI SDK and mcp-tools.

#494
vercel/ai#7160
vercel/mcp-handler#93

How Has This Been Tested?

  • npm test → 37 suites / 755 tests / 0 failures (macOS, Node ≥18)
  • Published and running on Socotra's MCP server which hosts dozens of tools and completions

Breaking Changes

Users will need to use Zod 3.25.76+ or Zod 4+

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@dclark27
dclark27 requested review from a team, domdomegg and ochafikAugust 12, 2025 17:43
@dclark27dclark27 changed the title Zod v4feat: zod v4Aug 12, 2025
Comment threadsrc/server/mcp.ts Outdated
@ihrpr

Copy link
Copy Markdown
Contributor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

@ihrprihrpr added this to the v2 milestone Aug 13, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Thanks for working on this. We are preparing for Typescript V2, this potentially can be included there

Let me know if I can help! @ihrpr

Comment threadsrc/examples/server/simpleSseServer.ts Outdated
@dclark27

dclark27 commented Aug 19, 2025

Copy link
Copy Markdown
ContributorAuthor

@avivnakar / all

Updated with main, resolved conflicts, reverted to use default over prefault. I've been running since this PR went live by publishing behind our org and it's been lovely!

Comment threadsrc/server/mcp.ts Outdated
@ochafik

ochafik commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Hi @dclark27, thanks for your work on this!

I wonder if the v3 & v4 compatibility can be tested (and maybe documented)? Maybe adding v3 as a dev dependency and have some tests explicitly importing the /v3 paths?

@felixweinbergerfelixweinberger self-assigned this Oct 16, 2025
@felixweinbergerfelixweinberger added dependencies P0 Broken core functionality, security issues, critical missing feature needs maintainer Potentially serious issue - needs proactive fix and maintainer attention labels Oct 16, 2025
@dvanmali

Copy link
Copy Markdown

Another temporary fix (beyond previously mentioned "overrides" method), useful if your package wishes to use v4.

{
"resolution": {
"@modelcontextprotocol/sdk>zod": "^3.23.8",
}
}

@dclark27
dclark27 requested review from a team as code ownersOctober 20, 2025 21:50
@dclark27

dclark27 commented Oct 20, 2025

Copy link
Copy Markdown
ContributorAuthor

Thanks for everyone's patience. This PR has been updated to:

  • Implement feedback from comments on this PR (thank you!)
  • Resolved merge conflicts
  • Fix formatting
  • Changed how we import from zod to use the import * as z from 'zod'

Testing this in our own MCP server I am not seeing any memory leaks (as I was when importing from import { z } from 'zod') and it matches the guidance from Zod's migration guide.

I think the deciding factor here is around the z.toJsonSchema. Because zod-to-json-schema is no longer maintained, we need to either write our own version of it, use an aliased package that other people have forked and published, or save this PR for a v2 when we are ok with breaking changes.

In the meantime, feel free and test using npm i @socotra/modelcontextprotocol-sdk

@felixweinberger I saw your PR from 5 days ago. Feel free and take the lead on this if you'd like to implement separately.

@ihrprihrpr modified the milestones: v2, HPROct 20, 2025
@dclark27

Copy link
Copy Markdown
ContributorAuthor

Just put up a new PR with backwards compatibility after a discussion with Colin Hacks on X.

#1040

@JFrogKevinz

Copy link
Copy Markdown

Do you have ETA for release of this feature ?

@dclark27

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #1040

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs maintainerPotentially serious issue - needs proactive fix and maintainer attentionP0Broken core functionality, security issues, critical missing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ListTools request handler fails to generate inputSchema (jsonSchema) MCP SDK v1.17.5 Incompatible with Zod v4 - Breaking Changes

17 participants

@dclark27@ihrpr@ochafik@JosephAnson@KKonstantinov@punkpeye@wottpal@Scalahansolo@ardabeyazoglu@serjrd@dvanmali@JFrogKevinz@felixweinberger@domdomegg@avivnakar@pterror@mmorainville-fountain