Skip to content

Fix MCP 2026-07-28 listings failing for resources, templates and prompts registered as plain objects - #10244

Merged
tim-smart merged 3 commits into
Effect-TS:mainfrom
Marve10s:fix/mcp-v2026-plain-descriptors
Nov 1, 2026
Merged

tim-smart merged 3 commits into
Effect-TS:mainfrom
Marve10s:fix/mcp-v2026-plain-descriptors

Conversation

@Marve10s

@Marve10s Marve10s commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

On the 2026-07-28 protocol, resources/list, resources/templates/list and prompts/list fail with -32603 MCP feature handler failed when a resource, template or prompt was registered as a plain object through the McpServer service:

const server = yield* McpServer.McpServer
yield* server.addResource({
  resource: { uri: "demo://r", name: "r" }, // type-correct
  annotations: Context.empty(),
  handle: Effect.succeed({ contents: [] })
})
// resources/list on 2026-07-28: -32603; on 2025-11-25: ok

One such registration hides every resource. Resources and templates listed fine in 4.1.0; prompts already failed there.

#10082 changed the 2026-07-28 projections to McpProtocol.transcode(PublicMcpSchema.Resource, …) (and likewise for templates), and prompts already worked that way. These public schemas are Schema.Class, so encoding rejects anything that is not an instance. addResource, addResourceTemplate and addPrompt store what they are given, unlike addTool, which normalizes with new McpTool(...), and the older protocol adapters accept plain objects.

The projections now encode by the classes' fields, with icons encoded by the Icon fields as well, since Icon is also a class. Annotations and PromptArgument are opaque structs and already accept plain objects. Instances encode as before, and optional fields given as undefined are still dropped. The test registers a plain resource, template and prompt, each with a plain icon, and lists them on 2026-07-28.

Closes EFF-3252

@changeset-bot

changeset-bot Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: ce57b91

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

This PR includes changesets to release 33 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-cloudflare Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/ai-typesafe Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/graphql-generator Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@effect-janitor effect-janitor Bot added the 4.0 label Oct 31, 2026
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 39.41 KB 39.41 KB 0.00 KB (0.00%)
basic.ts 7.23 KB 7.23 KB 0.00 KB (0.00%)
batching.ts 11.08 KB 11.08 KB 0.00 KB (0.00%)
brand.ts 6.87 KB 6.87 KB 0.00 KB (0.00%)
cache.ts 11.54 KB 11.54 KB 0.00 KB (0.00%)
config.ts 22.84 KB 22.84 KB 0.00 KB (0.00%)
differ.ts 22.00 KB 22.00 KB 0.00 KB (0.00%)
http-client.ts 26.93 KB 26.93 KB 0.00 KB (0.00%)
http-router.ts 37.00 KB 37.00 KB 0.00 KB (0.00%)
logger.ts 12.01 KB 12.01 KB 0.00 KB (0.00%)
metric.ts 9.47 KB 9.47 KB 0.00 KB (0.00%)
optic.ts 7.10 KB 7.10 KB 0.00 KB (0.00%)
pubsub.ts 16.02 KB 16.02 KB 0.00 KB (0.00%)
queue.ts 12.82 KB 12.82 KB 0.00 KB (0.00%)
schedule.ts 11.80 KB 11.80 KB 0.00 KB (0.00%)
schema-bigdecimal.ts 14.14 KB 14.14 KB 0.00 KB (0.00%)
schema-binary.ts 41.26 KB 41.26 KB 0.00 KB (0.00%)
schema-class.ts 21.73 KB 21.73 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 29.60 KB 29.60 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 27.99 KB 27.99 KB 0.00 KB (0.00%)
schema-string-transformation.ts 15.35 KB 15.35 KB 0.00 KB (0.00%)
schema-string.ts 12.34 KB 12.34 KB 0.00 KB (0.00%)
schema-template-literal.ts 16.27 KB 16.27 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 38.95 KB 38.95 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 26.15 KB 26.15 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 20.90 KB 20.90 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 21.05 KB 21.05 KB 0.00 KB (0.00%)
schema-toFormatter.ts 21.14 KB 21.14 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 26.17 KB 26.17 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 21.23 KB 21.23 KB 0.00 KB (0.00%)
schema.ts 20.82 KB 20.82 KB 0.00 KB (0.00%)
stm.ts 14.20 KB 14.20 KB 0.00 KB (0.00%)
stream.ts 10.38 KB 10.38 KB 0.00 KB (0.00%)

@tim-smart
tim-smart merged commit 60be011 into Effect-TS:main Nov 1, 2026
14 of 15 checks passed
@effect-bot effect-bot mentioned this pull request Nov 1, 2026

This branch is waiting to be deployed

1 waiting deployment
fork — ce57b915 Waiting Oct 31, 2026 by effect-bot via approval-gate #24506
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants