MCP servers declaring draft-07 outputSchema are entirely unusable: "unsupported dialect" rejected client-side before dispatch
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Every tool on an MCP server that declares outputSchema with the JSON Schema draft-07 dialect is now unusable. The call fails at schema registration, before any request reaches the server, with:
Tool '<name>' has an invalid outputSchema: JSON Schema declares an unsupported dialect
("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports
JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
This affects the entire server, not one tool: count, aggregate, find, and list-collections on mongodb-mcp-server all fail identically. The server process is never contacted — this is purely client-side.
The MCP specification does not require outputSchema to use 2020-12, and declaring $schema: draft-07 is valid. MongoDB has explicitly declined to remove the field (closed 2026-08-06, internal ref MCP-101), calling it "an internal field documented on the JsonSchema spec and it's standard." So this cannot be resolved server-side, and any MCP server using a draft-07 schema generator is affected — mongodb-mcp-server is likely just the most visible instance.
The error text itself (pass a pre-configured Ajv instance to AjvJs) reads like an internal Ajv message surfacing directly to users.
What Should Happen?
Claude Code should validate outputSchema documents that declare draft-07 (and ideally draft-04/06/2019-09), e.g. by registering the corresponding meta-schemas on the Ajv instance, or by falling back to skipping structured-output validation rather than disabling the tool entirely.
Disabling every tool on a server is a severe failure mode for what is a validator configuration gap — the previous behavior (accepting these servers) was strictly more useful.
Error Messages/Logs
Error: Tool 'count' has an invalid outputSchema: JSON Schema declares an unsupported dialect
("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports
JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
Identical for aggregate, find, list-collections.
Steps to Reproduce
- Configure any MCP server whose tools declare
outputSchemawith"$schema": "http://json-schema.org/draft-07/schema#". Minimal config:
{
"mongodb": {
"command": "npx",
"args": ["-y", "mongodb-mcp-server@2.1.0", "--readOnly"],
"env": { "MDB_MCP_CONNECTION_STRING": "mongodb://127.0.0.1:27017" }
}
}
- Call any of its tools. All fail with the error above; the server logs show no incoming request.
To confirm the payload is draft-07 independently of Claude Code, this script speaks JSON-RPC to the server over stdio and prints the declared dialects. It needs no reachable database — tools/list responds regardless:
import json, subprocess, sys, os
def probe(ver):
env = dict(os.environ, MDB_MCP_CONNECTION_STRING="mongodb://127.0.0.1:27099/?serverSelectionTimeoutMS=200")
p = subprocess.Popen(["npx", "-y", f"mongodb-mcp-server@{ver}", "--readOnly"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, env=env)
def send(o): p.stdin.write(json.dumps(o) + "\n"); p.stdin.flush()
send({"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}})
send({"jsonrpc":"2.0","method":"notifications/initialized"})
send({"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}})
tools = None
try:
for _ in range(200):
line = p.stdout.readline()
if not line: break
try: m = json.loads(line)
except: continue
if m.get("id") == 2:
tools = m.get("result", {}).get("tools", []); break
finally:
p.kill()
withos = [t for t in tools or [] if "outputSchema" in t]
dialects = {t["outputSchema"].get("$schema", "<none>") for t in withos}
return f"v{ver}: {len(tools or [])} tools, {len(withos)} with outputSchema, dialects={dialects or '-'}"
for v in sys.argv[1:]:
print(probe(v))
Output — note that the version working before the regression emits the identical payload:
$ python3 probe.py 1.14.0 2.0.0 2.1.0
v1.14.0: 16 tools, 13 with outputSchema, dialects={'http://json-schema.org/draft-07/schema#'}
v2.0.0: 18 tools, 15 with outputSchema, dialects={'http://json-schema.org/draft-07/schema#'}
v2.1.0: 18 tools, 15 with outputSchema, dialects={'http://json-schema.org/draft-07/schema#'}
Is this a regression?
Yes — this worked before and broke recently.
Last Working Version
Last successful MCP call: 2026-08-04. First failure: 2026-08-12. Same machine, same MCP config, unchanged throughout.
The MongoDB server was upgraded from 1.14.0 to 2.1.0 on 2026-08-11 (the config pins @latest), which initially looked like the cause. The probe above rules it out: 1.14.0 — the version in use during the working period — declares the same draft-07 outputSchema. The server payload is unchanged; the client's handling of it changed.
Claude Code Version
Claude.app 1.28929.0
Platform
Claude Desktop (macOS)
Operating System
macOS (Darwin 25.6.0, Apple Silicon)
Additional Context
Possibly related, same subsystem:
- #76257 —
outputSchemaservers fail wholesale; validation appears to run against the wholeCallToolResultenvelope instead ofstructuredContent. - #80105 — tools declaring
outputSchemaare never dispatched to the server, while tools without it work on the same server. - #80402 — the inverse polarity:
--json-schemarejects schemas declaring the 2020-12 meta-schema, reported as a regression since 2.1.214.
The presence of both polarities (draft-07 rejected here, 2020-12 rejected in #80402) suggests inconsistent meta-schema registration across the different Ajv instances in the codebase, rather than one isolated bug.
32 Comments
Follow-up: I traced where the draft-07 dialect actually originates, and it significantly widens the scope of this bug.
It is not a MongoDB-specific choice. It is the default in the MCP TypeScript SDK. From
@modelcontextprotocol/sdk@1.30.0,dist/esm/server/zod-json-schema-compat.js:mongodb-mcp-serverpasses notarget, so it inherits'draft-7'. Under zod 4.4.3 that emits exactly the dialect this client now rejects:Implication for severity: any MCP server built on the TypeScript SDK with zod v4 that declares
outputSchemaand does not explicitly passtarget: 'draft-2020-12'will emit draft-07 and be entirely unusable in Claude Code. That is the SDK's default path, so the affected set is likely broad rather than one vendor —mongodb-mcp-serveris simply where I hit it.This also means the fix cannot realistically be pushed onto server authors: it would require every SDK-based server to override an SDK default. Accepting draft-07 client-side (or registering the older meta-schemas on the Ajv instance) looks like the only fix with the right blast radius.
Tracking the server-side workaround at mongodb-js/mongodb-mcp-server#1427.
Confirming this on Windows as well — it's labelled
platform:macos, but it isn't platform-specific.Same error, different server:
mssql-mcp-node@3.0.0(@modelcontextprotocol/sdk ^1.29.0,zod ^3.24.2), launched vianpx -y. All six tools fail identically —execute_read_query,list_databases,list_views,list_tables,describe_database,describe_table— and four separately-configured instances of that server broke simultaneously.Version data point in case it helps narrow the window: working on Claude Desktop 1.24012.9, broken on 1.28929.0, with no change to the MCP server, its version or its config in between — the app updated underneath it. Electron 42.7.0, app-bundled Node 24.18.0, Windows x64.
Also ruled out on this end:
mssql-mcp-node@3.0.0is current, and@modelcontextprotocol/sdk@1.30.0still depends onzod ^3.23.8andzod-to-json-schema ^3.24.1, both of which emit draft-07. There is no server-side version available today that emits 2020-12, so users can't work around this by upgrading — which is worth weighing when prioritising.Agreed on the suggested fix: registering the draft-07 meta-schema on the Ajv instance, or skipping structured-output validation for an unrecognised dialect, both beat disabling the tool outright.
Reproducing with a different server family, which widens this beyond mongodb-mcp-server: an n8n instance-level MCP server (33 tools, built on the MCP TS SDK). All 33 tools fail identically — the message differs only by tool name. Verified on get_workflow_details, search_workflows, search_projects, get_sdk_reference, get_execution, execute_workflow. Same build 1.28929.0 (d1a6bc, built 2026-08-11T18:58:06Z), Windows x64, Electron 42.7.0, Node 24.18.0. Last known good on this end: 2026-08-11.
Transport does not matter either: here the server runs locally and is proxied into a cloud session over the desktop bridge, and it fails the same way — the schema is rejected at registration, so nothing is dispatched.
Three earlier reports that look like the same seam and are not linked here yet:
Counting this one, outputSchema handling has now failed fatally in four different ways. Each was addressed (or not) as its own case, and the fixes have not generalised. The fallback requested in this issue — skip validation rather than disable the tool — is the one change that would have covered all four.
Another data point, and one that widens the blast radius: Anthropic's own reference server is affected.
@modelcontextprotocol/server-filesystem@2026.7.10(current), launched vianpx -y, on Windows. All of its tools fail identically at registration:Confirms @amitfin's root cause: the package itself contains zero
draft-07strings — the dialect comes from the SDK default.mapMiniTarget()in@modelcontextprotocol/sdk@1.30.0returns'draft-7'when notargetis passed, andserver-filesystempasses none. Worth noting for anyone grepping to confirm this on their own setup: the SDK source uses'draft-7'(no leading zero), so grepping fordraft-07indist/returns nothing and looks like a clean bill of health.Independent confirmation of @StableSoftwareDev's version boundary. Same transition observed here, with no change to any MCP server config:
| Date | Claude Desktop | server-filesystem |
|---|---|---|
| 2026-08-02 | 1.24012.9 | working |
| 2026-08-13 | 1.28929.0 | all tools rejected |
The app auto-updated in between. Also confirms this is not macOS-specific (label says
platform:macos); this is the second Windows report in this thread.Ruled out on this end, in case it saves anyone time:
2026.7.10is current, andoutputSchemahas been declared since at least2026.1.14, so there is no "fixed" version to move to.list_allowed_directoriestouches no filesystem path at all and still fails, so this is not a permissions issue.One impact angle not yet raised in this thread. For filesystem-type servers, the allowed-directories sandbox is a security boundary, not a convenience. When the server dies at registration, the natural workaround is to fall back to the client's built-in file tools — which have no path restriction at all. So the failure mode isn't just "a server is unavailable": it silently removes a containment guarantee and substitutes an unrestricted one, with nothing surfacing that the boundary is gone. In our case the sandbox was scoped to a single vault directory precisely to prevent cross-project writes.
That makes the graceful-fallback behaviour referenced in #41361 (pre-2.1.88) meaningfully safer than a hard reject: a tool that still works under a relaxed output-validation is strictly better than a tool that disappears and gets replaced by an unsandboxed equivalent.
Either suggested fix works from here — registering the draft-07 meta-schema on the Ajv instance, or skipping structured-output validation for an unrecognised dialect.
All my MCPs are no longer working with Claude Desktop and Claude Code
Confirming this same regression on a different MCP server — the IBM i connector (mcp__remote-devices__ibm-i__*) exposed through Cowork. So far, Chat seems to work so indicates that our MCP server is functioning at least correctly.
Every tool on this connector fails identically before dispatch:
Tool 'system_status' has an invalid outputSchema: JSON Schema declares an unsupported dialect
("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports
JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
Confirmed affected tools: system-status, execute_sql (likely all tools on the connector, since it appears to be a connector-wide schema declaration). This makes the entire connector unusable, not just one tool.
This matches the pattern described above — client-side rejection prior to any request reaching the server, and not caused by any change on the server/connector side. Adding as a second data point since it suggests this isn't isolated to mongodb-mcp-server but affects any MCP server declaring draft-07 outputSchema.
Would strongly support the proposed fix of registering draft-07 (and ideally draft-04/06/2019-09) meta-schemas on the Ajv instance, or falling back to skipping output validation rather than disabling the tool entirely.
Could not reproduce on Claude Code CLI v2.1.233 (macOS). Note the report and both confirmations are against Claude Desktop 1.28929.0, which we did not test here.
Steps (CLI):
countwhoseoutputSchemadeclares"$schema": "http://json-schema.org/draft-07/schema#"(plustype: object,properties,required), returningstructuredContent: {"count": 42}.{"mcpServers":{"draft07":{"command":"node","args":["server.mjs"]}}}claude -p --strict-mcp-config --mcp-config mcp.json --allowedTools mcp__draft07__count "Call mcp__draft07__count with what='apples' and report the exact result or error"Observed: the call reached the server and succeeded; the model reported
{"count":42}, and no "unsupported dialect" error appeared anywhere, including the debug log. Same result with a draft-07 schema using$ref/definitions.Expected: same. The CLI tolerates draft-04/06/07/2019-09
$schemadeclarations onoutputSchema(it drops the dialect marker and validates the structure under the default rules), so servers built on the MCP TypeScript SDK's default zod target work.Assessment: this looks like a genuine bug, but in Claude Desktop's MCP client rather than the Claude Code CLI. The error text is the MCP SDK's stock validator message, which is exactly what you get when a client uses that validator unmodified; the CLI ships a wrapper that avoids it. Based on the versions above it regressed in Desktop somewhere between 1.24012.9 and 1.28929.0. It should be routed to the Claude Desktop team; a longer-term upstream fix (a dialect-aware default validator in the MCP TypeScript SDK) would cover every client. If you do hit this in the CLI itself, please share
claude --versionandclaude --debugoutput around the failing call.🤖 Generated with Claude Code
We weren't able to reproduce this. Could you provide steps to trigger the issue — what you ran, what happened, and what you expected? This issue will be closed automatically if there's no activity within 7 days.
@bcherny thanks for testing — that's a useful narrowing, and I don't think it conflicts with the report. Confirming the surface explicitly, since the template didn't have a field that distinguishes them:
This is Claude Desktop, not the CLI. The original report is Claude Desktop 1.28929.0 on macOS (the "Platform: Claude Desktop (macOS)" field), and the confirmations above are also Desktop — @StableSoftwareDev on Windows Desktop, @Vantso, @SebCool, @ymeskini ("Claude Desktop and Claude Code"), @Tigershawk via Cowork. Nobody has claimed a CLI reproduction, so a green CLI run is consistent with every data point here rather than contradicting them.
Your result actually sharpens the diagnosis in a useful way. If the CLI drops the dialect marker and validates structurally, while Desktop passes the document to a stock Ajv instance, then the two clients have materially different
outputSchemahandling — and the user-visible error is Ajv's own text, including the internal-sounding tailpass a pre-configured Ajv instance to AjvJs. That reads like the Desktop stack constructs Ajv without registering the older meta-schemas, which is exactly the fix suggested in the original report.@Tigershawk's observation is probably the sharpest lead: Chat works, agent-mode fails, same machine. That's a within-Desktop split, which points at one specific client path rather than the app as a whole. #80174 describes chat vs agent-mode MCP routing differences that may be the same seam.
Why closing would be premature
The blast radius is the thing I'd weigh here. The dialect is not a quirk of any one server — it's the MCP TypeScript SDK's default for Zod v4 (
mapMiniTargetreturns'draft-7'when no target is passed, and no target is reachable throughregisterTool). So every SDK-based server on Zod v4 that declaresoutputSchemais affected on Desktop. Confirmed in this thread acrossmongodb-mcp-server,mssql-mcp-node, an n8n server with 33 tools, an IBM i connector — and Anthropic's own@modelcontextprotocol/server-filesystem(@SebCool above).Upstream I've opened modelcontextprotocol/typescript-sdk#2653 to move the SDK default to
draft-2020-12. That reduces exposure once it ships, but it doesn't fix Desktop: draft-07 remains valid JSON Schema, the MCP spec explicitly permits an explicit$schema, and the v2 SDK's own validator accepts draft-07/06/2019-09/2020-12. Any server that legitimately declares draft-07 will keep failing on Desktop.Repro on Desktop
Same minimal server you built, loaded through Desktop instead of the CLI:
~/Library/Application Support/Claude/claude_desktop_config.json:``
json
``{ "mcpServers": { "draft07": { "command": "node", "args": ["/abs/path/server.mjs"] } } }
draft07:count.Observed on 1.28929.0: the call fails before dispatch with
Tool 'count' has an invalid outputSchema: … unsupported dialect …, and the server logs notools/call. Tools on the same server withoutoutputSchemawork normally — that contrast is the tell.If it's easier to reproduce against a published server,
npx -y mongodb-mcp-server@2.1.0 --readOnlywith anyMDB_MCP_CONNECTION_STRINGfails on all tools;@1.13.0fails on exactly the 8 of its 16 tools that declareoutputSchemaand works for the other 8, which isolates the trigger cleanly without needing a reachable database.Happy to gather Desktop logs if that helps — could this be relabelled to the Desktop client rather than auto-closed?
the fallback in your suggested fix, skip structured-output validation instead of disabling the tool, trades a loud reject for a quiet one. once validation is skipped, a tool returning malformed structuredContent looks identical to one returning a clean result, and the draft-07 vs 2020-12 mismatch that's the actual bug goes silent. registering the draft-07 meta-schema on the Ajv instance keeps the check firing; skipping just pushes the failure downstream where nothing surfaces it.
Thanks for the detailed report — I tried to reproduce this on 2.1.233 (Linux) and could not.
I configured a stdio MCP server whose tool declares
outputSchemawith"$schema": "http://json-schema.org/draft-07/schema#"and returnsstructuredContent, then called it viaclaude -p --mcp-config. The call reached the server and succeeded, with the structured result validated — no "unsupported dialect" error. I also verified this on the exact code path that performs the strict schema validation.This looks already fixed in a recent release: Claude Code now accepts
outputSchemadocuments declaring the draft-04/06/07 and 2019-09 dialects (it validates them under the common structural keywords instead of rejecting the tool), which matches the behavior you asked for. Older builds from around when you filed this did reject them.Please update to the latest version (2.1.233 or newer) and re-try your mongodb-mcp-server setup. Changelog: https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
Closing — reply here if you still see this on the latest version and we'll reopen.
🤖 Generated with Claude Code
Requesting a reopen — GitHub won't let me reopen this myself (both
gh issue reopenand a RESTstate=openPATCH are rejected for non-collaborators on this repo), so I'm asking here. The close was based on a non-repro, and I can now point at the code. Still failing for me today on Claude Desktop 1.30096.5 (much newer than the 1.28929.0 I filed against), samemongodb-mcp-serverconfig, unchanged:@bcherny — your CLI run was green for a real reason, but it isn't a fix. There are two MCP client stacks in the shipped binary, picked at runtime by a rollout flag. You landed on the lenient one; Desktop puts me on the strict one.
1. The arm selector
From the shipped
claudebinary, 2.1.233 (minified, symbols are the build's own):Default is
v1;v2comes from the GrowthBook flagtengu_brindle_causeway. So which validator a given user hits is a flag arm, not a version — which is exactly why a CLI run and a Desktop run of the same build disagree.2. The two validators — only one has the gate
v1 (lenient), the arm your CLI run used — compiles whatever it's given, no dialect check at all:
v2 (strict), the arm Desktop puts me on — same shape, plus a two-entry allowlist that throws the exact string users see:
Two things stand out:
validateSchema: !1. The instance never checks a document against a meta-schema, so the missing draft-07 meta-schema isn't actually what blocks anything. The rejection is a bare string comparison on$schemain front of a compiler that was never going to consult it.Ajvis already bundled in that same module — the build has bothPib.Ajv2020andLib = Iib.Ajvside by side. The draft-07-capable compiler is sitting right there, unused on this path.3. Why the whole server dies
v2's
callToolturns a compile failure into a pre-dispatch throw:i()runs beforethis.request, which is precisely the "the server process is never contacted" symptom in the original report, and why tools withoutoutputSchemaon the same server keep working.4. Version evidence
I pulled the real darwin-arm64 binaries from npm and ran the minimal draft-07 server through each:
| CLI build | draft-07
outputSchemacall || --- | --- |
| 2.1.214 | works —
{"count":42}|| 2.1.221 | works |
| 2.1.229 | works |
| 2.1.233 ("already fixed") | works |
2.1.229 is the build Claude Desktop embeds and where this fails for me right now (
Claude.app/…/claude-code/2.1.229/…/claude). Same binary, both outcomes — version isn't the variable. I also ran the realmongodb-mcp-server@1.13.0through the 2.1.229 CLI: the call reached the server and returned MongoDB's own connection error, i.e. dispatch succeeded.And the rejecting code is unchanged in 2.1.233 — the error string is present verbatim, 4 occurrences, in the binary published as the fix. Nothing in CHANGELOG.md matches
dialect|draft|ajv|2020-12|meta-schemafor any release in this window.One thing I could not do: force the failure from the CLI with
MCP_SDK_GENERATION=v2— that run still succeeded against a stdio server negotiating2025-06-18. So the strict path appears to need the v2 client's modern-era/bridged connection, which is what Desktop uses. I'm reporting that as an open gap rather than claiming a full bisect; someone with the flag internals can close it in a minute.5. Same gap, second copy, in the Desktop bundle
Claude.app/Contents/Resources/ion-dist/assets/v1/c2a6d07ee-BdDPXPoZ.jsships an independent validator with the identical assumption:Different library, different message, same two-URI allowlist — which supports the "inconsistent meta-schema registration across validator instances" read in the original report, and is presumably the other polarity behind #80402.
6. Suggested fix
Primary — dispatch on dialect instead of rejecting (v2
AjvJsonSchemaValidator.getValidator). Both compilers are already bundled; key off$schemaand memoize one instance per dialect:Same
{strict:false, validateFormats:true, validateSchema:false, allErrors:true}options; no behavior change for schemas that already work. This is what the v2 SDK's own validator does, and it's the outcome @m13v argued for — validation keeps firing, it just fires under the right dialect.Secondary — don't let a validator gap disable a working tool. In
_compileOutputValidator's consumer, a compile failure should degrade to "no structured-output validation for this tool", logged loudly, instead of throwingInvalidParamsbefore dispatch. I'd apply this only as the safety net behind the primary fix, not instead of it — @m13v's objection to skipping validation is correct, and with dispatch-on-dialect there's nothing left to skip for the dialects that matter.Third — same treatment for
CfWorkerJsonSchemaValidatorin the Desktop bundle: derive{ draft }from$schemarather than throwing on anything that isn't 2020-12.The blast radius argument from the original report is unchanged and is the reason this is worth fixing rather than closing: draft-07 is the MCP TypeScript SDK's default for Zod v4 (
mapMiniTarget→'draft-7'when no target is passed, and no target is reachable throughregisterTool), so every SDK-based server on that path is affected in the v2 arm — confirmed in this thread acrossmongodb-mcp-server,mssql-mcp-node, an n8n server, an IBM i connector, and Anthropic's own@modelcontextprotocol/server-filesystem.🤖 Generated with Claude Code
Still seeing issue on Claude Code. This is version Version 1.30096.5 (6e1346) on Windows Claude Desktop app. I originally was seeing the issue in Cowork, but to satisfy complaints that this issue was originally opened for Code, I'm also seeing it in Claude Code. Error is as follows. Chat continues to work.
I tried to pull the IBM i system status, but the call failed before it could return any data:
This is a bug in the mcp__ibm-i__system-status tool's schema definition (draft-07 vs. the 2020-12 dialect the client validator expects) — not something I can work around from here, and not related to permissions or connectivity. It'll need a fix on the MCP server/connector side.
A couple of related tools are available if useful in the meantime: list-active-jobs and recent-job-log-entries. Want me to try one of those instead, or do you want me to flag this tool issue somewhere?
Still reproducing on the latest Claude Desktop, so requesting a reopen — adding a data point from a different MCP server than the ones already reported here.
Failing server: the Cypress Cloud MCP connector (Cypress Cloud, org-level connector configured in the desktop app, not via .mcp.json). Every tool on it is disabled — the call fails client-side before anything reaches the server:
Error: Tool 'cypress_get_runs' has an invalid outputSchema: JSON Schema declares an unsupported
dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports
JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
Environment
Claude Desktop 1.30096.5 (macOS 26.6.1, Apple silicon / arm64)
MCP server: Cypress Cloud connector
Reproduces 100% — 7 calls across 3 tools (cypress_get_runs, cypress_get_flaky_tests, cypress_get_projects), varying parameters, and again after a full app restart
All 5 tools the connector exposes declare "$schema": "http://json-schema.org/draft-07/schema#", so the whole server is unusable, not just one tool. Restarting doesn't help — after a restart the tool list is re-fetched and still declares draft-07, which is what the client then rejects. There's nothing to configure on our end and no newer connector version to move to.
One detail that might explain the earlier non-repro: the error I get ends in pass a pre-configured Ajv instance to AjvJs, which is different wording from the dialect error that appears in the desktop app bundle itself (pass an explicit { draft } to CfWorkerJsonSchemaValidator). That suggests more than one validator path, and that a fix verified on one may not cover the other — worth checking both call sites.
Still reproducing, adding a data point that differs from the ones already in this thread: a remote HTTP MCP server, not stdio.
Failing server: the MCP endpoint that n8n serves itself, at
/mcp-server/httpon a self-hosted instance running n8n 2.34.5 (current release, not an outdated install). Configured in.claude.jsonas{"type": "http", "url": "https://…/mcp-server/http"}, Bearer/OAuth auth.Every tool on the server is unusable — I tried
search_workflows,list_credentials,search_projectsandsearch_nodes, all failing identically before any request leaves the client:Two things that may matter for the non-repro on 2.1.233: this is an HTTP transport server rather than stdio, and the server side is fully up to date, so there is no server-side upgrade available as a workaround. The tools are listed but every call is dead on arrival.
Reproducing this on Claude Code CLI 2.1.235 (native install, Windows) — newer than 2.1.233, which @bcherny reported as fixed above.
Steps: updated from 2.1.209 → 2.1.235 via
claude update, started a fresh session, asked it to read a note via themcp-obsidianMCP server (obsidian-mcp-serveron npm, unrelated to MongoDB's server). Same failure on every tool call, identical to before the update.@amitfin noted nobody had claimed a CLI reproduction yet, and traced the split to the
MCP_SDK_GENERATIONv1/v2 arm (gated by thetengu_brindle_causewayGrowthBook flag) rather than OS/version — CLI 2.1.214/221/229/233 all worked for them, only Desktop failed. For what it's worth, on this machinetengu_brindle_causewayistruein the cached GrowthBook features (~/.claude.json), yet the CLI still fails here — so if this is the first confirmed CLI-side repro, the v1/v2 split may not be as clean as it looked. Happy to attachclaude --debugoutput from a repro run if that'd help narrow it down.Confirming this also breaks the official Perplexity MCP server (@perplexity-ai/mcp-server, run via npx -y @perplexity-ai/mcp-server) — every tool (perplexity_ask, perplexity_search, etc.) fails on the very first call with the identical error:
Error: Tool '<tool_name>' has an invalid outputSchema: JSON Schema declares an unsupported dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
One data point that may be useful for the fix: I downloaded and diffed the published tarballs for @perplexity-ai/mcp-server at v0.9.0, v1.0.0, and v1.2.0 (latest) to check whether pinning an older server version would work around this. It doesn't — the server package never touches JSON Schema generation itself, it just hands a Zod shape to server.registerTool(). The draft-07 $schema is produced by @modelcontextprotocol/sdk's internal use of zod-to-json-schema, which has defaulted to draft-07 output across its entire 3.x line regardless of SDK version (checked SDK 1.21.1 → zod-to-json-schema@^3.24.1, SDK 1.29.0/1.30.0 → zod-to-json-schema@^3.25.1, both draft-07 by default).
So this isn't something individual MCP server authors can fix by bumping/pinning versions — it really does need the fix on the Claude Code / Ajv-instance side described above (register draft-07 meta-schema and/or fall back to skipping structured validation instead of disabling the tool). This confirms the issue is systemic to any SDK-based MCP server with a Zod outputSchema, not limited to mongodb-mcp-server.
FileSystem plugin is now unusable for me in Claude, and it was much more convenient than the built in way of handling directories, where you need to accept every access..
Adding another data point: this also breaks Cowork (not just the Claude Code CLI), via the
remote-devicesMCP bridge to a local Obsidian Local REST API / MCP server. Every tool call against that server (obsidian_get_note,obsidian_list_notes,obsidian_search_notes, etc.) now fails client-side with:This was a production integration that had worked reliably for months without any change on the user's end (no plugin update, no config change) — it started failing between Aug 4 and Aug 12, 2026, matching the timeline already reported here. Restarting the Obsidian plugin, updating it to the latest version, and reconnecting the device bridge had no effect, which confirms the regression is entirely client-side, as already established in this thread.
The practical impact is that a previously-working, spec-compliant MCP server became silently unusable overnight, with no warning and no fallback — the only workaround is bypassing the MCP server entirely and reading/writing vault files directly over a raw file bridge, which loses live-sync with the Obsidian UI, structured section/frontmatter editing, and indexed search.
Given draft-07 is explicitly valid per the MCP spec and multiple independent servers are affected (mongodb-mcp-server, Obsidian Local REST API, presumably many others), this reads as a broad, high-severity regression rather than an edge case. Would appreciate a status update on timeline — registering the older meta-schemas (draft-04/06/07, 2019-09) on the Ajv instance seems like a narrowly-scoped fix.
Corroborating report with a minimal repro, plus one data point the thread doesn't have yet: which Claude surfaces are affected appear to differ.
Summary
Any MCP tool that declares an
outputSchemabuilt with the current reference TypeScript SDK (@modelcontextprotocol/sdk@1.30.0, the latest release, viazod-to-json-schema@3.25.2) is rejected client-side before the call is dispatched:The server is unmodified reference-SDK output — the draft-07
$schemamarker is what the SDK emits for every zod-registered schema. A validator that only accepts 2020-12 therefore rejects the entire current reference-SDK server ecosystem, not misbehaving servers.Minimal reproduction
server.mjs(deps:npm i @modelcontextprotocol/sdk@1.30.0 zod@3.25.76;"type": "module"in package.json):claude_desktop_config.json:Steps: restart Claude Desktop → open a Cowork session → ask Claude to call the
echotool. The call fails with the error above; the error is raised client-side by the schema validator, before dispatch to the server.Surface matrix (all same machine, same server, same day — macOS)
| Surface | Result |
|---|---|
| Claude Desktop, Cowork session (local-MCP bridge relay) | ❌ rejected with the error above;
tools/listsucceeds, everytools/callfails || Claude Desktop, plain chat | ✅ works |
| Claude Code (CLI, this machine's installed version) | ✅ works |
The original issue reports Claude Code affected since ~2026-08-12; on this machine (2026-08-20) Claude Code accepted the same schemas while the Cowork bridge rejected them — so the strict validator configuration appears to vary by surface and/or version rather than being uniform. That may help localise which component picked up the 2020-12-only Ajv configuration.
Why this should be fixed client-side
Environment: macOS, Claude Desktop (current as of 2026-08-20), server under Node 22.x,
@modelcontextprotocol/sdk@1.30.0(npmlatest),zod@3.25.76,zod-to-json-schema@3.25.2.Still reproducing on Claude Code CLI 2.1.241 (macOS, Darwin 25.5.0) — eight builds past the 2.1.233 that was reported as a non-repro when this was closed.
Server:
mongodb-mcp-server, pinned to1.12.0in.mcp.jsonvianpx -y mongodb-mcp-server@1.12.0 --connectionString <...> --readOnly.2.1.0reproduces identically; both emit draft-07, so the pin makes no difference.Every tool declaring an
outputSchema(count,find,aggregate,list-databases,list-connections) fails client-side before dispatch:One new data point: the rejection timing changed between 2.1.233 and 2.1.241.
list-databasescame back with a server-side-32602about a missingconnectionId, i.e. the server received and processed it. Every subsequent call, including to that same tool, was rejected client-side with the error above.So the code path has been touched between those builds, but only to move the rejection earlier. That the same tool could be dispatched once and then blocked also suggests the strict Ajv instance is constructed on first structured response rather than at tool registration, which may help localise it.
Requesting a reopen — this has been broken continuously here since 2026-08-12, and the version it was closed against still fails.
Confirming this also reproduces with a different MCP server via Cowork's desktop
extension path:
anki-mcp-server(@ankimcp/anki-mcp-server v0.22.2), installed asa Claude Desktop extension (.mcpb) rather than a manual claude_desktop_config.json
entry.
Every tool call fails identically before dispatch, e.g.:
Tool 'listDecks' has an invalid outputSchema: JSON Schema declares an unsupported
dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default
validator supports JSON Schema 2020-12 only; pass a pre-configured Ajv instance
to AjvJs
Confirmed tools affected: listDecks, modelNames, collection_stats — same error
across all, reachable through the remote-devices/Cowork bridge, so the same v2
strict-validator path already reported by @mikezieg and @akristiansson for
other servers.
Environment: Claude Desktop 1.34493.1, Electron 42.9.2, macOS (Apple Silicon).
Local server unmodified, AnkiConnect reachable directly at localhost:8765
independent of this — confirms client-side rejection, not a connectivity issue.
Also hitting this in Claude Desktop (macOS) as of 2026-08-24, with a different MCP server, which confirms it isn't MongoDB-specific and matches the report's prediction that any draft-07 schema generator is affected.
Server: @cyanheads/git-mcp-server (latest, v2.15.1). Every tool is rejected at registration before any request reaches the server, e.g.:
Tool 'git_set_working_dir' has an invalid outputSchema: JSON Schema declares an unsupported dialect
("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports
JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
Same failure mode as the original report: the whole server is disabled and nothing is dispatched.
Still present on a newer build than the original report. Claude Desktop version: 1.34493.1 (255293), build 2026-08-21 (report was on 1.28929.0).
Verified client-side, not server-side. The same server, same machine, loads fine and all its tools register and execute end-to-end in Claude Code (CLI). Only Claude Desktop rejects it. So the git logic and the schemas are sound; the two clients just handle the same payload differently, consistent with the "inconsistent meta-schema registration across different Ajv instances" note above.
To be precise about the mechanism: this is the tool's outputSchema declaring the draft-07 dialect ("$schema": ".../draft-07/schema#"), not an unsupported schema construct. Desktop's Ajv validator only has the 2020-12 meta-schema registered, so it throws on the dialect label before inspecting the schema body. Per the MCP spec an explicitly declared draft-07 outputSchema is valid, so this is a client-side meta-schema registration gap in Desktop, not something the server can resolve.
Impact note: git-mcp-server is one of the few git MCP servers that supports remote push/pull/fetch, so there's no drop-in replacement (the official Python git server is local-only). The fallback is running git outside MCP entirely, which defeats the point of the integration.
@bcherny Looks like this is still causing issues. Can we get a reopen? Thanks
I'm not sure if this is the right place but my Claude Desktop indicates 86142 is what Anthropic needs to ship a fix for.
+1 request for getting this fixed in Claude Desktop.
The previously working Filesystem connector to the Project files on my Windows D drive no longer works because of this bug in Claude Desktop's Ajv validator.
{
"path": "D:\\Projects\\<Project Name Goes Here>"
}
Results in:
Error: Tool 'list_directory' has an invalid outputSchema: JSON Schema declares an unsupported dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
{}
Results in:
Error: Tool 'list_allowed_directories' has an invalid outputSchema: JSON Schema declares an unsupported dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
And so on. The tool will change but the rest of the error for each attempt by Claude is the same:
Error: Tool 'read_multiple_files' has an invalid outputSchema: JSON Schema declares an unsupported dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
@jordy-dam-inqdo I've implemented a workaround in git-mcp-server to explicitly advertise JSON Schema 2020-12 instead of draft-07 in the tools/list call. Please update git-mcp-server to v2.15.2 and let me know if you continue having issues.
@niino-atsuko @mikezieg In obsidian-mcp-server v3.3.0 I've updated to the latest mcp-ts-core which includes the explicit 2020-12 schema as well as MCP SDK v2 support. Please update to the latest obsidian-mcp-server and let me know if you continue having issues.
Also hitting this via the bundled Filesystem extension (
ant.dir.ant.anthropic.filesystemv2026.7.10), reached through a Cowork session — so this isn't limited to third-party MCP servers, it affects Anthropic's own shipped extension too.Environment: Claude Desktop 1.34493.1, macOS 26.6.2 (Apple Silicon).
Tool
move_filerejected before dispatch:Checked the extension's source (
dist/index.js): every tool it registers (read_file,write_file,list_directory,move_file, etc.) uses the sameoutputSchema: { content: z.string() }shape, generated via zod-to-json-schema, which stamps$schema: draft-07by default. So this likely isn't specific tomove_file— any tool call through this extension that goes through output-schema validation should hit the same wall.Given the extension is Anthropic's own and ships in the base Desktop/Cowork install, seems like a reasonable candidate for the fix to land in first — either have Desktop's Ajv instance register draft-07 (and ideally draft-04/06/2019-09) alongside 2020-12, or have the bundled extension stop emitting a
$schemafield on its output schemas. Requesting a reopen given it's still reproducing on the latest build.Confirming this also fully breaks third-party MCP servers beyond the MongoDB case already mentioned here — same failure mode with bezata/kObsidian (npm kobsidian-mcp, 66 tools across notes., wiki., vault.*, etc.). It uses
@modelcontextprotocol/sdk@1.29.0, which still emits outputSchema as draft-07 by default via zod-to-json-schema, and since the client rejects the whole server at registration time, all tools go down — not just ones exercising structured output. Opened bezata/kObsidian#35 on their side for a server-side mitigation, but the underlying issue is the same one tracked here. Any update on priority/ETA? This is silently taking out entire third-party servers with zero indication to the end user beyond a cryptic schema error.Issue is happening to me and my team too with Triple Whale MCP from https://triplewhale.com
---
Confirming this on a second, unrelated server: Triple Whale's Moby MCP (commercial analytics/SQL server). Every tool fails client-side with the identical error before the request reaches the server:
```Error: Tool '<name>' has an invalid outputSchema: JSON Schema declares an unsupported dialect
("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports
JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJs
@cyanheads: with the new version the issue has been resolved regarding the git-mcp-server! Thanks!
Just to clarify this comment, I believe the new version is referring to an update to a specific MCP server to workaround the regression introduced by Anthropic, so, this update is only to git-mcp-server, not a fix to the issue other MCP servers are experiencing with Claude.
Still reproducing after closure, on a different platform and path. Cowork mode on Windows: the MCP server is the reference filesystem server running locally under the desktop app and proxied to a cloud Cowork session through the linked-device bridge. Every tool on the server is rejected before dispatch with the identical error:
Tool 'list_directory' has an invalid outputSchema: JSON Schema declares an unsupported dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator supports JSON Schema 2020-12 only; pass a pre-configured Ajv instance to AjvJsThis confirms the validation failure also lives in the Cowork device-bridge path, not only direct desktop MCP registration on macOS. Per the comments above, the git-mcp-server change was a server-side workaround, not a client fix, and other draft-07 servers remain broken. Observed 2026-08-28, Claude desktop app on Windows.