René's URL Explorer Experiment


Title: Harden the dual-era stream loop's era-lock and rejection semantics by maxisbey · Pull Request #3040 · modelcontextprotocol/python-sdk · GitHub

Open Graph Title: Harden the dual-era stream loop's era-lock and rejection semantics by maxisbey · Pull Request #3040 · modelcontextprotocol/python-sdk

X Title: Harden the dual-era stream loop's era-lock and rejection semantics by maxisbey · Pull Request #3040 · modelcontextprotocol/python-sdk

Description: Post-merge review follow-up to #3038. An adversarial review pass over the dual-era driver found a family of cases where a request that failed could still lock the connection's era — and on stdio a connection is a whole subprocess, so a locked-then-stranded connection has no recovery short of a restart. The era-lock fixes The invariant the driver documents is: released auto-negotiating clients fall back on any error code except -32022, so a failed probe must leave the legacy handshake available. Three openers violated it: Well-formed envelope, malformed content (e.g. clientInfo: 42): classification checks key presence only, so the era locked modern before pydantic rejected the content. The request failed with a fallback-eligible -32602, but the fallback then hit -32022 forever. The lock now commits only after the request succeeds, mirroring the legacy side's existing "lock only on success" rule. initialize stamped with the envelope triple: routed modern (the triple won), failed METHOD_NOT_FOUND (initialize doesn't exist at 2026-07-28), and locked the era anyway. initialize is legacy-distinctive by definition, so it now always takes the handshake path regardless of decoration. subscriptions/listen as the opener: the not-served-on-this-transport rejection used to land after the lock; now, like every failed request, it locks nothing. No conforming client — released SDK or otherwise — produces any of these frames; the fixes are robustness against buggy third-party modern clients. Compatibility restoration A bare server/discover on a legacy-locked connection now falls through to the loop runner's per-version validation, restoring the byte-identical METHOD_NOT_FOUND (-32601, same message and data) a handshake-only server produced — #3038 had it rejecting with -32600. Only envelope-bearing frames get the cross-era INVALID_REQUEST; a conforming legacy client can never send the reserved triple, so legacy traffic is byte-identical again in full. Note for anyone bisecting client behavior: v2.0.0b1 ships the -32600 variant for this one frame shape (it carries #3038 but not this fix), so a legacy-locked bare server/discover answers -32600 on b1 and -32601 before #3038 and from this PR onward. Smaller fixes classify_inbound_request rejects a present-but-non-string protocol version with a descriptive INVALID_PARAMS instead of raising ValidationError out of its own -32022 payload construction (requested is a str field). The dispatcher's exception ladder happened to mask that as a generic -32602 — same code, now deliberate, with a message that names the defect. Unreachable over HTTP (the header rung fires first), so the wire delta is stdio-only. The modern dispatch wrapper masks transport.can_send_request so per-message transport metadata agrees with its denial, matching the modern HTTP entry's context — closing a latent inconsistency before anything consumes the field. NotifyOnlyOutbound inherits the no-channel refusal instead of duplicating it; the has_standalone_channel/Raises contracts now document that a modern connection refuses requests on a real channel. Docs: migration guide + protocol-versions page note the probe is transport-independent; the subscriptions page documents the streamable-HTTP-only limitation of subscriptions/listen; a stale serve_loop docstring claim is corrected. Two pyright suppressions in the stdio test doubles are replaced with typeshed-compatible Buffer signatures. Validation Every fix has a pinning test (rejection codes, lock neutrality of each failing opener, the byte-identical legacy fall-through, the classifier guard, the transport mask). Beyond the suite (100% coverage), each formerly-stranding opener was driven against a live stdio subprocess and shown to leave the legacy handshake working on the same pipe, with the full original probe matrix (auto/legacy/pinned negotiation, pipelined probe ordering, -32022 round-trip) passing unchanged. Round 2 — review follow-ups Review found that the round-1 lock-on-success rule still approximated "client-visible success" with "the handler returned". Two windows violated the invariant, plus two cross-transport divergences on the modern path: Era overwrite (confirmed live): the era commits ran unconditionally after their own request, so a pipelined envelope-bearing request completing after an inline initialize overwrote the committed legacy lock — bricking the freshly-handshaked client — and the mirror direction (a legacy commit clobbering a modern lock) was possible too. The era cell is now monotone: one era_settles settlement predicate with site-local atomic commits, first success wins, and a straggler from the other era can never move a committed lock. Its response still stands — it was already earned. Cancelled-away success: with the dispatcher's interrupt cancel mode, a peer cancel landing during the handler's shielded teardown is delivered at the response-write checkpoint — the client sees "Request cancelled", but the era had already locked. The settlement predicate now skips the lock when the request's cancel event is set, tying "success" to what the client actually observes. (A cancel racing a genuinely blocked response write can still slip through; that residue belongs to the dispatcher's existing respond-after-cancel divergence and dissolves with it.) Exception-boundary parity: an unmapped handler exception on a modern stream request fell through to the dispatcher's code-0 catch-all — str(e) on the wire — while the identical request over modern HTTP produced the generic -32603 Internal server error. The code-0 pin exists for v1 compat, which the modern era doesn't have. Both modern entries now share one modern_error_data boundary; debug raise_exceptions still re-raises. Envelope-coercion parity: the HTTP entry degraded mis-shaped clientInfo/clientCapabilities to not-supplied while the stream path rejected them at Connection.from_envelope construction. For spec methods both transports already rejected identically (the kernel's per-version params surface types the reserved _meta keys strictly); custom methods diverged. from_envelope now takes the classifier's raw values and owns the coercion, so every modern entry — HTTP, stream loop, and modern_on_request — builds connection identity identically. Classifier guard placement: the non-string protocol-version guard moved below the header rung, and (review follow-up) the rung now checks the version header's presence explicitly — a null body version would otherwise slip the None == None equality and make the absent-header outcome depend on the body value. An absent or disagreeing version header is uniformly HEADER_MISMATCH, the HTTP wire is untouched wherever it was well-defined, and the string guard is reachable only on header-less transports, making the round-1 "stdio-only delta" claim above exactly true. (Through the shipped HTTP manager the era routing is header-only, so these cells harden the modern entry's own contract.) The public Server.run docstring also picked up the first-success wording. Each behavioral fix carries a regression test that failed on the round-1 code (the overwrite and cancelled-away tests reproduce the races deterministically), and the scenarios were re-driven against a live stdio subprocess: the pipelined-race brick, the sanitized internal error, the failed-opener fallback, and the cancel-never-locks path all behave as documented, with auto/legacy negotiation unchanged. Round 3 — the timeout brick and the third modern entry Further review surfaced the last member of the brick family, plus a pre-existing gap in the parity story: Timed-out probe stranding mode='auto' (reproduced live): a server/discover probe that outlives the client's 10s timeout can still succeed on a slow-starting server — the response was written, the server cannot know the client stopped waiting, and discover is inline so even a courtesy cancel could not land before the commit. The connection locks modern, the pipelined fallback initialize gets -32022, and negotiate_auto treated that as terminal: the default mode='auto' could not connect to any stdio server that takes >10s to its first response. No server-side change can close this; the client-side fix is that -32022 from the fallback handshake is itself positive modern evidence (it names the server's versions), so the policy now re-probes once at a mutual version — bounded by the existing two-attempt loop, so a pathologically slow server still terminates with a genuine error. Covered by policy unit tests and a deterministic end-to-end test (a relay holds the probe frame until the post-timeout initialize is sent — no sleeps). The in-process modern entry now denies server-initiated requests like the other two: previously a handler's request-scoped elicitation over in-process Client(server) in modern mode delivered the protocol-forbidden elicitation/create frame to the client, which answered a misleading Method not found. The entry's dispatch context is now wrapped in the same server-requests denial, so the call refuses server-side with the no-back-channel contract — which is also the exact wording the client-callbacks docs page already used to describe this path. AI Disclaimer

Open Graph Description: Post-merge review follow-up to #3038. An adversarial review pass over the dual-era driver found a family of cases where a request that failed could still lock the connection's era — and on stdi...

X Description: Post-merge review follow-up to #3038. An adversarial review pass over the dual-era driver found a family of cases where a request that failed could still lock the connection's era — and on ...

Opengraph URL: https://github.com/modelcontextprotocol/python-sdk/pull/3040

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:6e26efef-5e75-39fe-cc91-850ada518959
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idE7A2:2B14D5:F2FF7C:14A13A6:6A5BA98F
html-safe-nonce43da61c153f81cfed45d7b9eeafb6757172c2fe082cb86991aa3dd3548e4466f
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFN0EyOjJCMTRENTpGMkZGN0M6MTRBMTNBNjo2QTVCQTk4RiIsInZpc2l0b3JfaWQiOiIzNTYwOTg4OTU5MjAyNTg0OTc1IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmacd4eda0026a76919eca726536e569a05d1369533229ca32abc818c8a9a70b12ca
hovercard-subject-tagpull_request:3966941677
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/modelcontextprotocol/python-sdk/pull/3040/files
twitter:imagehttps://avatars.githubusercontent.com/u/224885523?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/224885523?s=400&v=4
og:image:altPost-merge review follow-up to #3038. An adversarial review pass over the dual-era driver found a family of cases where a request that failed could still lock the connection's era — and on stdi...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None5290d7e14309ad1e76106a9c4237bd1041517e83ea182c8ab756752cb0c6940b
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/modelcontextprotocol/python-sdk git https://github.com/modelcontextprotocol/python-sdk.git
octolytics-dimension-user_id182288589
octolytics-dimension-user_loginmodelcontextprotocol
octolytics-dimension-repository_id862584018
octolytics-dimension-repository_nwomodelcontextprotocol/python-sdk
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id862584018
octolytics-dimension-repository_network_root_nwomodelcontextprotocol/python-sdk
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release9c975978430e9ad293956f2bbdaf153b1bd84a99
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fpull%2F3040%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fpull%2F3040%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=modelcontextprotocol%2Fpython-sdk
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
modelcontextprotocol https://github.com/modelcontextprotocol
python-sdkhttps://github.com/modelcontextprotocol/python-sdk
Notifications https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Fork 3.7k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Star 23.6k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Code https://github.com/modelcontextprotocol/python-sdk
Issues 259 https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests 306 https://github.com/modelcontextprotocol/python-sdk/pulls
Actions https://github.com/modelcontextprotocol/python-sdk/actions
Projects https://github.com/modelcontextprotocol/python-sdk/projects
Models https://github.com/modelcontextprotocol/python-sdk/models
Security and quality 6 https://github.com/modelcontextprotocol/python-sdk/security
Insights https://github.com/modelcontextprotocol/python-sdk/pulse
Code https://github.com/modelcontextprotocol/python-sdk
Issues https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests https://github.com/modelcontextprotocol/python-sdk/pulls
Actions https://github.com/modelcontextprotocol/python-sdk/actions
Projects https://github.com/modelcontextprotocol/python-sdk/projects
Models https://github.com/modelcontextprotocol/python-sdk/models
Security and quality https://github.com/modelcontextprotocol/python-sdk/security
Insights https://github.com/modelcontextprotocol/python-sdk/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fmodelcontextprotocol%2Fpython-sdk%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk%2Fissues%2Fnew%2Fchoose
maxisbeyhttps://github.com/maxisbey
mainhttps://github.com/modelcontextprotocol/python-sdk/tree/main
dual-era-loop-hardeninghttps://github.com/modelcontextprotocol/python-sdk/tree/dual-era-loop-hardening
Conversation 12 https://github.com/modelcontextprotocol/python-sdk/pull/3040
Commits 4 https://github.com/modelcontextprotocol/python-sdk/pull/3040/commits
Checks 41 https://github.com/modelcontextprotocol/python-sdk/pull/3040/checks
Files changed https://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Harden the dual-era stream loop's era-lock and rejection semantics https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#top
Show all changes 4 commits https://github.com/modelcontextprotocol/python-sdk/pull/3040/files
6a2ee51 Harden the dual-era stream loop's era-lock and rejection semantics maxisbey Jun 30, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/3040/commits/6a2ee51d6d8182231dc31f64dfd2c50a9a40b3cb
f35d966 Settle the era lock exactly once and unify the modern-entry boundaries maxisbey Jul 1, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/3040/commits/f35d9668552b6d9929a9da87b88f5525b5e3227d
482d7cd Require the version header's presence in the classifier's header rung maxisbey Jul 1, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/3040/commits/482d7cd0ccdffcc722c8dfdd58d0ab7c10bb2edc
290e068 Recover mode='auto' from a timed-out probe and close the in-process b… maxisbey Jul 1, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/3040/commits/290e068497b217684ab177789c0a45e0bb145750
Clear filters https://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
subscriptions.md https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-86e6503f9eaade8719c5dc88a4661406bc3068bbf0709476a326e41697e36a24
protocol-versions.md https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-347d7041f2c2cda44baa219c84e12b2c831088086b35094b11519fac8c411034
migration.md https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-758ba107a728fccfdf0d098b2c06ded59127dd53ea287d630f72fb51040bc72d
_probe.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
_streamable_http_modern.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
connection.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
server.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-b21bf5e21c058ccfddb404c209f2d4288e4f32b121111ffc9d466638631d13e4
runner.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-7a9c3e13faa5730f5a8a60062e9d200513c0baeada63e3cc24b37fe68e086e90
inbound.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-aff932577e28e8bde4cd526480a1514700ef52c1b37cb993f27c297813efa86f
test_client.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-f91d7d1bfecb41d80a4cc73133b82560b7284a2af2d6630c49b983ca9366ea13
test_probe.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-088586c579bbead2ed30c7da4a7c5523c167863b134102eb2ced4d3b67c7d86a
test_client_callbacks.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-aaae64f5b848d57f9d8fcad9ed933c3a2d7c17137438bf8b82a8188bcfe04619
test_runner.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-51ad0fc280fc0fb1ed6039b7c5a26a6fafba8d8ffc8533cfa89cb9df18ea3f10
test_stdio.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-3e62be39a5c1d8b8dfe922d017c0fae7b023fa1ffac872a0e046f13ef8ca899a
test_inbound.py https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-dc61ed941aed9d8fc148f5bb36ee60a1a12c9a308fa5cd5dcbaabcbf9de6c934
docs/advanced/subscriptions.mdhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-86e6503f9eaade8719c5dc88a4661406bc3068bbf0709476a326e41697e36a24
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/docs/advanced/subscriptions.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-86e6503f9eaade8719c5dc88a4661406bc3068bbf0709476a326e41697e36a24
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-86e6503f9eaade8719c5dc88a4661406bc3068bbf0709476a326e41697e36a24
docs/client/protocol-versions.mdhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-347d7041f2c2cda44baa219c84e12b2c831088086b35094b11519fac8c411034
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/docs/client/protocol-versions.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-347d7041f2c2cda44baa219c84e12b2c831088086b35094b11519fac8c411034
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-347d7041f2c2cda44baa219c84e12b2c831088086b35094b11519fac8c411034
docs/migration.mdhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-758ba107a728fccfdf0d098b2c06ded59127dd53ea287d630f72fb51040bc72d
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/docs/migration.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-758ba107a728fccfdf0d098b2c06ded59127dd53ea287d630f72fb51040bc72d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-758ba107a728fccfdf0d098b2c06ded59127dd53ea287d630f72fb51040bc72d
src/mcp/client/_probe.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/src/mcp/client/_probe.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
cubic-dev-aihttps://github.com/apps/cubic-dev-ai
Jul 1, 2026https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#r3506973891
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Learn morehttps://docs.github.com/articles/managing-disruptive-comments/#hiding-a-comment
https://www.cubic.dev/action/fix/violation/6b34f5c4-2aeb-491f-9483-b3ca88dc2984
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-59dc4b81d661c03b7619227f60a2d202e7b8bc873cf4a14e7dbd1fdfcd03b501
src/mcp/server/_streamable_http_modern.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/src/mcp/server/_streamable_http_modern.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-c5e06136c127a1503b8eab18375355c38ceb7e71b5a1c04b36ebf2fbc3d9067d
src/mcp/server/connection.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/src/mcp/server/connection.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-849ab2b2ff6c99a29f2b9dcdc9edc4139ffa7d091cdf45f05fbfc7cb998b03d1
src/mcp/server/lowlevel/server.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-b21bf5e21c058ccfddb404c209f2d4288e4f32b121111ffc9d466638631d13e4
View file https://github.com/modelcontextprotocol/python-sdk/blob/290e068497b217684ab177789c0a45e0bb145750/src/mcp/server/lowlevel/server.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/3040/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-b21bf5e21c058ccfddb404c209f2d4288e4f32b121111ffc9d466638631d13e4
https://github.com/modelcontextprotocol/python-sdk/pull/3040/files#diff-b21bf5e21c058ccfddb404c209f2d4288e4f32b121111ffc9d466638631d13e4
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/3040/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.