René's URL Explorer Experiment


Title: fix: send error to client when SSE stream disconnects without response by skyvanguard · Pull Request #1949 · modelcontextprotocol/python-sdk · GitHub

Open Graph Title: fix: send error to client when SSE stream disconnects without response by skyvanguard · Pull Request #1949 · modelcontextprotocol/python-sdk

X Title: fix: send error to client when SSE stream disconnects without response by skyvanguard · Pull Request #1949 · modelcontextprotocol/python-sdk

Description: Summary Fixes #1811 When the SSE stream disconnects before the server sends a response (e.g., due to a read timeout on long-running tool calls), and no event ID has been received (making reconnection impossible), the client was left hanging indefinitely on read_stream.receive(). The post_writer task had already returned from _handle_sse_response() without sending anything to read_stream_writer, leaving the session layer permanently blocked. Changes Added _send_disconnect_error() method to StreamableHTTPTransport that sends a JSONRPCError (code -32000) to the read_stream_writer, unblocking the client. This is called in two scenarios: _handle_sse_response(): When the SSE stream ends without receiving a response and last_event_id is None (no event ID to reconnect with) _handle_reconnection(): When maximum reconnection attempts are exhausted without receiving a response The error surfaces as an McpError at the session layer, allowing the caller to handle the failure gracefully instead of hanging forever. Root Cause The issue was introduced when reconnection support was added. The reconnection logic correctly handles the case where last_event_id is not None (reconnect using Last-Event-ID), but the else branch (no event ID available) was missing, causing a silent return that left the client blocked. Test plan Added 2 regression tests in tests/issues/test_1811_sse_disconnect_hang.py: test_client_receives_error_on_sse_disconnect: Server has a 30s tool, client has 0.5s read timeout. Verifies the client receives McpError with "SSE stream disconnected" message instead of hanging. test_fast_tool_still_works_normally: Ensures fast tool calls continue to work correctly with the fix in place.

Open Graph Description: Summary Fixes #1811 When the SSE stream disconnects before the server sends a response (e.g., due to a read timeout on long-running tool calls), and no event ID has been received (making reconnecti...

X Description: Summary Fixes #1811 When the SSE stream disconnects before the server sends a response (e.g., due to a read timeout on long-running tool calls), and no event ID has been received (making reconnecti...

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

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:75bb6a48-ed1d-c308-4d06-b3e9c421199a
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idE840:3A432B:275913B:375BEAA:6A5F5FE4
html-safe-noncedae786beb6e4de3a22d9873aa54c70133d5d7f71d1380489c53a0050ace54f14
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFODQwOjNBNDMyQjoyNzU5MTNCOjM3NUJFQUE6NkE1RjVGRTQiLCJ2aXNpdG9yX2lkIjoiMzg5MjU5MjY0MjQxMzc4MDk2NCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmac4a22b9bfb2721ef81786be625a854436f1418a6a2f6883f349983d894bc1add9
hovercard-subject-tagpull_request:3206486185
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/1949/files
twitter:imagehttps://avatars.githubusercontent.com/u/237478962?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/237478962?s=400&v=4
og:image:altSummary Fixes #1811 When the SSE stream disconnects before the server sends a response (e.g., due to a read timeout on long-running tool calls), and no event ID has been received (making reconnecti...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None9a0797c11799dbfd7df57fa3de31c7ea3a4c4bd055eb1a0427a5cde1d4d7ba3f
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
releaseb099d96da147aea31036cd16b2fba0083a6defe4
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fpull%2F1949%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
Code QualityEnforce quality at mergehttps://github.com/features/code-quality
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%2F1949%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/1949/files
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/1949/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.7k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Code https://github.com/modelcontextprotocol/python-sdk
Issues 264 https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests 311 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
skyvanguardhttps://github.com/skyvanguard
modelcontextprotocol:mainhttps://github.com/modelcontextprotocol/python-sdk/tree/main
skyvanguard:fix/sse-disconnect-hanghttps://github.com/skyvanguard/python-sdk/tree/fix/sse-disconnect-hang
Conversation 1 https://github.com/modelcontextprotocol/python-sdk/pull/1949
Commits 4 https://github.com/modelcontextprotocol/python-sdk/pull/1949/commits
Checks 26 https://github.com/modelcontextprotocol/python-sdk/pull/1949/checks
Files changed https://github.com/modelcontextprotocol/python-sdk/pull/1949/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files
fix: send error to client when SSE stream disconnects without response https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#top
Show all changes 4 commits https://github.com/modelcontextprotocol/python-sdk/pull/1949/files
8577e9f fix: send error to client when SSE stream disconnects without response Jan 24, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/1949/commits/8577e9fb0f8e57bd138682a657adfc26e68f3251
355584b fix: add coverage pragmas for untestable code paths Jan 24, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/1949/commits/355584bdda8d440be53c3d0a0dc083df005a11db
25a20a2 fix: remove unnecessary pragma on now-covered exception handler Jan 24, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/1949/commits/25a20a29a8da8591714798546b0e38a8d36e68b1
5fc777d fix: add pragma for pytest.raises branch that never falls through Jan 24, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/1949/commits/5fc777d15561a3d64037af87db6ef883ecd2d9fa
Clear filters https://github.com/modelcontextprotocol/python-sdk/pull/1949/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files
streamable_http.py https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
test_1811_sse_disconnect_hang.py https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-97ed2af2bd2b03e5c6892378d7a4b2bec9e1cbaef82951bfa1de883ffbc75027
src/mcp/client/streamable_http.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
View file https://github.com/skyvanguard/python-sdk/blob/5fc777d15561a3d64037af87db6ef883ecd2d9fa/src/mcp/client/streamable_http.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/1949/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
https://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-e8c18a3067a9b157c5c39a947f53d395afeb00e7026dad2d5a279011da943b5e
tests/issues/test_1811_sse_disconnect_hang.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/1949/files#diff-97ed2af2bd2b03e5c6892378d7a4b2bec9e1cbaef82951bfa1de883ffbc75027
View file https://github.com/skyvanguard/python-sdk/blob/5fc777d15561a3d64037af87db6ef883ecd2d9fa/tests/issues/test_1811_sse_disconnect_hang.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/1949/{{ revealButtonHref }}
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/1949/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.