Repository navigation
[BUG] Windows MSIX 1.32352.1.0: local filesystem MCP server unusable in Cowork sessions - draft-07 outputSchema rejected, and no server version passes both checks #87633
Description
Summary
After a silent MSIX auto-update to Claude Desktop 1.32352.1.0, the local filesystem MCP server can no longer be used by Cowork/Code sessions, which spawn their own copy of the server. The client rejects the server at registration because its schemas declare JSON Schema draft-07.
Critically, no version of @modelcontextprotocol/server-filesystem works: recent versions are rejected for their draft-07 outputSchema, and older versions are rejected because their inputSchema lacks type: "object". The two defects swap places in the same release, so downgrading is not a workaround.
This appears to be the Cowork-proxy variant of the regression cluster reported in #80094, #79986 and anthropics/claude-ai-mcp#664, with the added data point of an exact install timestamp correlated with the moment of breakage.
Environment
| Claude Desktop | 1.32352.1.0 (MSIX, Claude_1.32352.1.0_x64__pzs8sxrjxfjjc) |
| OS | Windows x64 |
| Surface | Cowork session (remote container reaching the local MCP server through the desktop bridge) |
| MCP server | @modelcontextprotocol/server-filesystem, launched via npx |
The inputSchema fix and the outputSchema introduction landed in the same release (2025.11.25). There is no version in between to pin.
This violates the spec the client implements
SEP-1613 (status: Final) establishes 2020-12 as the default dialect, but explicitly states that schemas MAY declare a different dialect via $schema, and that clients MUST "validate schemas according to declared or default dialect".
Rejecting a schema because it declares draft-07 is therefore non-conformant. The underlying SDK bug is tracked in modelcontextprotocol/typescript-sdk#2532 — classified as a regression introduced in @modelcontextprotocol/client@2.0.0-beta.4, still open. As that issue notes, zod-to-json-schema stamps draft-07 on every schema produced by v1-era servers, so there is no server-side remedy.
Reproduction
- Configure a local MCP server: command
npx, args-y @modelcontextprotocol/server-filesystem@2026.1.14 <some folder>. - Confirm it works from a normal chat session (it does — the chat path does not apply this validation).
- Open a Cowork session and call any filesystem tool.
- Observe the
unsupported dialecterror; no request ever reaches the server process. - Re-pin to
@2025.8.21and restart: the server now fails to register at all with theinputSchemaerror.
Workaround
A thin stdio proxy that spawns the real server, passes everything through unchanged, and rewrites only the $schema field of outputSchema to https://json-schema.org/draft/2020-12/schema in the tools/list response. Verified end-to-end: 14 tools exposed, valid inputSchema, accepted dialect, real tools/call succeeding.
This matches the finding in #80094 that a custom server declaring only inputSchema works fine in the same session — the schemas themselves are not the problem, only the declared dialect is.
Expected behavior
The client should accept schemas that explicitly declare draft-07, as SEP-1613 requires — for example by dispatching to a validator matching the declared $schema instead of assuming 2020-12.
Secondarily: a schema-validation failure should not be reported to users as "Couldn't start this server", and internal validator instructions (pass a pre-configured Ajv instance) should not appear in user-facing error text.
Additional notes
- The bridge enumerates local MCP servers at session start and does not re-register them live: after any connector change, a brand-new Cowork session is required to see the effect. This makes the failure considerably harder to diagnose.
- Because updates arrive through MSIX in the background, there is no visible signal connecting the breakage to an app update. The only reliable check is
(Get-Item "<InstallLocation>").CreationTime.
Related
- [BUG] Claude Desktop macOS: filesystem MCP server unusable in both package generations - new schema never dispatched, old schema dropped at registration #80094 — macOS, filesystem MCP unusable in both package generations
- [BUG] Claude Desktop: external stdio MCP tools announced but never dispatched in Chat mode (zero tools/call) — Windows/macOS/Linux, all install types #79986 — Windows MSIX 1.24012.1,
tools/callnever sent - [BUG] MCP client silently drops all tools when third-party server includes outputSchema in tools/list response #25081 — client drops all tools when server includes
outputSchema - MCP tool calls never reach Filesystem-type servers after Desktop update — server healthy, tools/call never sent by client claude-ai-mcp#664 — tool calls never reach filesystem servers
- Default JSON Schema validators reject declared draft-07, which the spec permits modelcontextprotocol/typescript-sdk#2532 — root cause in the default validator
After a silent MSIX auto-update to Claude Desktop 1.32352.1.0, the local filesystem MCP server can no longer be used by Cowork/Code sessions, which spawn their own copy of the server. The client rejects the server at registration because its schemas declare JSON Schema draft-07.
Critically, no version of @modelcontextprotocol/server-filesystem works: recent versions are rejected for their draft-07 outputSchema, and older versions are rejected because their inputSchema lacks type: "object". The two defects swap places in the same release, so downgrading is not a workaround.
This appears to be the Cowork-proxy variant of the regression cluster reported in #80094, #79986 and anthropics/claude-ai-mcp#664, with the added data point of an exact install timestamp correlated with the moment of breakage.
Environment
| Claude Desktop | 1.32352.1.0 (MSIX, Claude_1.32352.1.0_x64__pzs8sxrjxfjjc) |
| OS | Windows x64 |
| Surface | Cowork session (remote container reaching the local MCP server through the desktop bridge) |
| MCP server | @modelcontextprotocol/server-filesystem, launched via npx |
Timeline (exact)
| Time (2026-08-18, local) | Event |
|---|---|
| before ~09:59 | Local filesystem connector working normally from Cowork sessions, config without a version pin |
| 09:59:29 | Claude 1.32352.1.0 installed — (Get-Item <InstallLocation>).CreationTime. Silent MSIX background update, no prompt, no notification |
| 10:15:47 | %LOCALAPPDATA%\Claude-Data created (first launch of the new build) |
| after | Connector no longer usable from Cowork sessions |
No configuration was changed by the user between the working and broken states. Every other Claude installation directory on the machine dates from March–May 2026; only these two artifacts are from this morning.
Errors observed
With any version ≥ 2025.11.25 (tools appear, then every call fails):
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 Ajv...
With any version ≤ 2025.8.21 (server fails to register at all):
MCP filesystem: Couldn't start this server for Cowork and Code sessions (they run their
own copy of it), so they can't use its tools: Invalid result for tools/list:
[ { "code": "invalid_value", "values": [ "object" ],
"path": [ "tools", 0, "inputSchema", "type" ],
"message": "Invalid input: expected \"object\"" }, ... ]
Note the leaked internal validator message (pass a pre-configured Ajv instance) — this surfaces AjvJsonSchemaValidator from the TypeScript SDK directly to the end user.
Version matrix — no version passes both checks
Measured by launching each version and inspecting its tools/list response over raw stdio:
| version | tools | inputSchema missing type: "object" |
outputSchema |
|---|---|---|---|
| 2025.7.1 | 12 | 11 of 12 | none |
| 2025.7.29 | 14 | 13 of 14 | none |
| 2025.8.18 | 14 | 13 of 14 | none |
| 2025.8.21 | 14 | 13 of 14 | none |
| 2025.11.25 | 14 | 0 | 14, draft-07 |
| 2025.12.18 | 14 | 0 | 14, draft-07 |
| 2026.1.14 | 14 | 0 | 14, draft-07 |
| 2026.7.10 | 14 | 0 | 14, draft-07 |
The inputSchema fix and the outputSchema introduction landed in the same release (2025.11.25). There is no version in between to pin.
This violates the spec the client implements
[SEP-1613](https://modelcontextprotocol.io/seps/1613-establish-json-schema-2020-12-as-default-dialect-f) (status: Final) establishes 2020-12 as the default dialect, but explicitly states that schemas MAY declare a different dialect via $schema, and that clients MUST "validate schemas according to declared or default dialect".
Rejecting a schema because it declares draft-07 is therefore non-conformant. The underlying SDK bug is tracked in [modelcontextprotocol/typescript-sdk#2532](modelcontextprotocol/typescript-sdk#2532) — classified as a regression introduced in @modelcontextprotocol/client@2.0.0-beta.4, still open. As that issue notes, zod-to-json-schema stamps draft-07 on every schema produced by v1-era servers, so there is no server-side remedy.
Reproduction
- Configure a local MCP server: command
npx, args-y @modelcontextprotocol/server-filesystem@2026.1.14 <some folder>. - Confirm it works from a normal chat session (it does — the chat path does not apply this validation).
- Open a Cowork session and call any filesystem tool.
- Observe the
unsupported dialecterror; no request ever reaches the server process. - Re-pin to
@2025.8.21and restart: the server now fails to register at all with theinputSchemaerror.
Workaround
A thin stdio proxy that spawns the real server, passes everything through unchanged, and rewrites only the $schema field of outputSchema to https://json-schema.org/draft/2020-12/schema in the tools/list response. Verified end-to-end: 14 tools exposed, valid inputSchema, accepted dialect, real tools/call succeeding.
This matches the finding in #80094 that a custom server declaring only inputSchema works fine in the same session — the schemas themselves are not the problem, only the declared dialect is.
Expected behavior
The client should accept schemas that explicitly declare draft-07, as SEP-1613 requires — for example by dispatching to a validator matching the declared $schema instead of assuming 2020-12.
Secondarily: a schema-validation failure should not be reported to users as "Couldn't start this server", and internal validator instructions (pass a pre-configured Ajv instance) should not appear in user-facing error text.
Additional notes
- The bridge enumerates local MCP servers at session start and does not re-register them live: after any connector change, a brand-new Cowork session is required to see the effect. This makes the failure considerably harder to diagnose.
- Because updates arrive through MSIX in the background, there is no visible signal connecting the breakage to an app update. The only reliable check is
(Get-Item "<InstallLocation>").CreationTime.
Related
- [BUG] Claude Desktop macOS: filesystem MCP server unusable in both package generations - new schema never dispatched, old schema dropped at registration #80094 — macOS, filesystem MCP unusable in both package generations
- [BUG] Claude Desktop: external stdio MCP tools announced but never dispatched in Chat mode (zero tools/call) — Windows/macOS/Linux, all install types #79986 — Windows MSIX 1.24012.1,
tools/callnever sent - [BUG] MCP client silently drops all tools when third-party server includes outputSchema in tools/list response #25081 — client drops all tools when server includes
outputSchema - MCP tool calls never reach Filesystem-type servers after Desktop update — server healthy, tools/call never sent by client claude-ai-mcp#664 — tool calls never reach filesystem servers
- Default JSON Schema validators reject declared draft-07, which the spec permits modelcontextprotocol/typescript-sdk#2532 — root cause in the default validator
Activity
MilkyWay008 commentedon Aug 18, 2026
The draft-07 vs 2020-12
$schemaerror is the MCP client's Ajv validator getting stricter in the new build, not your config...... so re-adding the filesystem server isn't going to fix it, that's why it keeps failing the same way. The thin stdio proxy you wrote that rewrites$schemais honestly the cleanest workaround until @modelcontextprotocol/client beta.4 gets patched, I'd stick with that for now. Oh also, btw, I built a portable Hermes OTG and keep it on a USB stick as my rescue agent, super handy for poking at half-broken installs like this, check it, imo it'll help you. https://github.com/MilkyWay008/Hermes-OTGbrunotorresdigital commentedon Aug 20, 2026
Confirming this on a second, unrelated MCP server, with a new data point: on the same day, the same schemas pass in one bundled client and fail in the other — direct evidence this splits by client build, not by anything in the schemas themselves.
Upstream status changed
This issue cites modelcontextprotocol/typescript-sdk#2532 as still open. It was closed as completed on 2026-08-19: fixed in modelcontextprotocol/typescript-sdk#2534, merged 2026-07-27 and released in
@modelcontextprotocol/client@2.0.0. Both default validators now dispatch on the declared dialect — declared draft-07/06 compiles with classic Ajv, 2020-12 stays the default when$schemais absent, and only genuinely unknown dialects still throw.The closing note asks anyone still hitting it on
client@2.0.0or later to open a new issue. Test below shows that's exactly what's going on here: two different bundled copies of the client, two different outcomes.Split confirmed: Claude Code's client accepts draft-07, the desktop app's client (serving Chat and Cowork) still rejects it
Both rows below hit the same n8n MCP server (
/mcp-server/http), on the same day (2026-08-20), with the same unmodified schemas — 33 tools, 66 schema declarations, every one stamping"$schema": "http://json-schema.org/draft-07/schema#"on bothinputSchemaandoutputSchema..mcp.json, rawmcp-remote, no proxysearch_workflowsreturns real data (92 workflows)mcp__remote-devices__<server>__*bridge)claude_desktop_config.json→mcpServers, rawmcp-remote, no proxyThe failing case's literal error, from a Cowork (cloud) session calling through the bridge:
get_sdk_reference— a static reference lookup that never contacts the n8n instance — fails identically, isolating the failure to client-side registration, independent of server, credentials, or network.Reverting that same desktop-app config entry to the workaround below (same server, same schemas, only the proxy layer added) registers all 33 tools cleanly. That rules out anything server- or credential-specific and leaves the client build as the only variable.
This is the cleanest evidence I have that the remaining gap is a client-bundling lag, not a validator regression: identical schemas, same day, two different bundled copies of
@modelcontextprotocol/clientin the same desktop install, two different outcomes. Claude Code appears to already ship ≥2.0.0; the desktop app's own client (which Chat and Cowork both sit behind) does not yet.The declared dialect is the only incompatibility
Inspecting those same schemas for constructs that actually differ between draft-07 and 2020-12:
$ref, all plain JSON Pointers into#/properties/...— none resolve throughdefinitionsexclusiveMinimumpresent 10 times, all in the numeric (draft-06+) form, identical in both dialectsdependencies, no$defsSo the schema bodies are already valid under 2020-12. Only the
$schemastring causes the rejection — which matches this issue's finding that a server declaring onlyinputSchemaworks fine in the same session.Independent confirmation of the workaround
A stdio proxy arrived at independently before finding this report, now in daily use on the surfaces that still need it (Chat, Cowork). A ~100-line wrapper that spawns
mcp-remote, passes stdin through untouched, and deletes$schemafrom each tool'sinputSchema/outputSchemaintools/listresponses restores all 33 tools, with realtools/callsucceeding. Deleting the key is enough; rewriting it to the 2020-12 URI is not required. On Claude Code itself the proxy has since become unnecessary (see the table above), so it's now scoped to only the surfaces that still need it.Three operational details that made this expensive to diagnose — the first matches a note already in this report:
claude_desktop_config.jsonis read at launch and held in memory, and any preference change writes that in-memory copy back over the file. An edit made while the app is running is therefore ignored and silently erased later — in my case restoring an inline credential I had just moved out of it. Quitting the app completely before editing is what finally made a config change take effect..mcp.json. They consume the app's local MCP servers through the desktop bridge — the tools surface asmcp__remote-devices__<server>__*in a cloud session — so whateverclaude_desktop_config.jsonpoints at is what both Chat and Cowork inherit, for better or worse.Investigation, measurements and draft produced in a Claude Code session; reviewed and posted by me.
Loosp258 commentedon Sep 14, 2026
Confirming this is still present in Claude Desktop 1.52386.6.0. I inspected the bundled app.asar / .vite/build/mcp-runtime/directMcpHost.js; the Desktop runtime still contains the pre-#2534 validator behavior that rejects declared draft-07 schemas.
Comparing it against the published MCP client builds and upstream history, the relevant client/validator path is runtime-equivalent to the beta.5-era implementation and predates f130e1a / #2534. So the bundling lag described above appears to still be present in 1.52386.6.0.
usethedata commentedon Sep 18, 2026
I confirm that this issue is still present in Claude Desktop for Mac version 2.2553.1 (c38127) 2026-09-18T00:41:58.000Z
KDiamantidis commentedon Sep 23, 2026
Confirming this on Windows desktop app 2.7032.0 — still fully reproducible.
Environment
Config (
claude_desktop_config.json, paths redacted):{ "mcpServers": { "my-vault": { "command": "npx.cmd", "args": [ "-y", "@modelcontextprotocol/server-filesystem", "C:/Users/<user>/<some-folder>" ] } } }No version pinned, so npx resolves to the current published version.
Behaviour
The server starts and reports healthy — the host reports the server in
announcedstate, and all 14 tools appear in the tool list. But every tool call fails client-side before dispatch with a byte-identical error. Verified on 5 different tools:list_allowed_directorieslist_directoryget_file_infosearch_filesread_text_fileTried, no effect
npx clear-npx-cachefollowed by a full app restart (not just closing the window) — the error afterwards was identical, ruling out a stale cached package.Possibly useful signal
In the same session, the same directory is fully readable through the device file tools — a full recursive listing of the folder works without any issue. So the filesystem access itself, the path grant, and the folder connection are all fine; the failure is isolated to the MCP tool-schema validation layer.
Workaround confirmed working
The thin stdio proxy approach described above does resolve it. I wrapped the server in a ~100-line Node proxy that forwards everything verbatim except
tools/listresponses, where it deletes the$schemakey from each tool's input/output schema (letting the client fall back to its 2020-12 default). It also setstype: "object"on schemas that havepropertiesbut notype, which covers the other half of the version trap described in this issue.Before the proxy: 28 draft-07
$schemaoccurrences intools/list, every call rejected.After: 0 occurrences, all 14 tools accepted, and real
tools/calloperations return correct results.Also worth flagging
#86142 was closed as non-reproducing after testing on Claude Code CLI (Linux), which uses the v1 validator that accepts draft-07. That path doesn't exercise the v2 desktop validator where this actually occurs, so the closure doesn't reflect the desktop behaviour reported here.
usethedata commentedon Oct 6, 2026
MCP is working for me now in Claude Desktop for Mac version Claude 2.19675.1 (861368) 2026-10-05T16:14:31.000Z.