Skip to content

[v2] docs: Client callbacks page doesn't say list_changed needs client.listen() #3845

Open

Description

@paolocostanzo

What happened?

I ran into the client side of this in goose (aaif-goose/goose#13055), which never received tools/list_changed from 2026-07-28 servers because it doesn't open subscriptions/listen, so I checked how the Python SDK docs explain it.

The Client callbacks page calls message_handler "the catch-all: every server notification the session surfaces reaches it". By default (mode="auto"), Client(...) negotiates 2026-07-28 with any server that supports it. On such a connection, spec-compliant servers send the list_changed notifications and notifications/resources/updated only on a subscriptions/listen stream the client opened (migration guide); MCPServer drops the v1-style send_*_list_changed() calls there. So a client that registers only message_handler, as v1 clients did, gets no change notifications from those servers.

The page mentions client.listen() only to say its acknowledgment is consumed by the stream. It doesn't say change notifications need one, and doesn't link Subscriptions. The Caching page already has this pointer.

What did you expect?

Two sentences in the message_handler paragraph, after "…is consumed by that stream.", for example:

On a 2026-07-28 connection, change notifications (notifications/tools/list_changed, its prompts and resources siblings, and notifications/resources/updated) arrive only on a stream you open with client.listen(...). They reach message_handler from there, for the kinds that stream asked for; Subscriptions has the details.

Related: #3173 (open, last updated in July) rewrites the same paragraph but doesn't add this; the sentence could go there instead. I'd like to fix this myself (a one-sentence docs PR) if you take an outside PR for it.

AI disclosure: text drafted with AI assistance; the goose finding is mine, and I checked the behavior against src/mcp/client/session.py and the docs myself.

Code to reproduce

# Docs feedback: https://github.com/modelcontextprotocol/python-sdk/blob/77001c9/docs/client/callbacks.md#the-notification-callbacks

SDK version

v2.3.0; docs checked on main @ 77001c9

Area

Documentation

Activity

  1. added
    documentationImprovements or additions to documentation
    spec-2026-07-28Concerns the SDK's implementation of the 2026-07-28 MCP spec revision
    on Nov 9, 2026
  2. rohandravid commented on Nov 9, 2026

    @rohandravid

    I’d like to take this. I’ll add a note to the notification callbacks section of callbacks.md explaining that list_changed notifications require client.listen() on 2026-07-28 connections, with a link to the Subscriptions page (matching how caching.md handles it).

  3. rohandravid commented on Nov 10, 2026

    @rohandravid

    Hi! I have a fix ready on my fork. Could you assign this issue to me so I can open the PR? Thanks!

  4. paolocostanzo commented on Nov 10, 2026

    @paolocostanzo
    Author

    Thanks @rohandravid, your plan matches what I had in mind. I also have a fix ready, but I'm happy for yours to be the one that goes in, and I'll review it. One thing to include: the same applies to notifications/resources/updated, not only the list_changed notifications.

    I can't assign issues in this repo, so could a maintainer assign this to Rohan so he can open the PR?

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationspec-2026-07-28Concerns the SDK's implementation of the 2026-07-28 MCP spec revisionv2Affects the v2 line (2.x on main)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions