Expose create_mcp_http_client and McpHttpClientFactory from mcp.client.streamable_http by ProgrammerPlus1998 · Pull Request #3239 · modelcontextprotocol/python-sdk · GitHub
Skip to content

Expose create_mcp_http_client and McpHttpClientFactory from mcp.client.streamable_http - #3239

Closed
ProgrammerPlus1998 wants to merge 2 commits into
modelcontextprotocol:mainfrom
ProgrammerPlus1998:feat/expose-httpx-client-factory-public
Closed

Expose create_mcp_http_client and McpHttpClientFactory from mcp.client.streamable_http#3239
ProgrammerPlus1998 wants to merge 2 commits into
modelcontextprotocol:mainfrom
ProgrammerPlus1998:feat/expose-httpx-client-factory-public

Conversation

@ProgrammerPlus1998

Copy link
Copy Markdown

Summary

Implements the suggestion in #3238: re-export the HTTP-client helpers from a public module so that customizing the streamable-HTTP client (headers/auth/timeout) no longer requires importing the private mcp.shared._httpx_utils.

Since 2.0 removed the headers/timeout/auth kwargs from streamable_http_client, the only supported way to build a conforming httpx2.AsyncClient is create_mcp_http_client — but it, the McpHttpClientFactory protocol, and the default-timeout constants were only reachable via the private module.

Changes

  • src/mcp/client/streamable_http.py — re-export create_mcp_http_client, McpHttpClientFactory, MCP_DEFAULT_TIMEOUT, and MCP_DEFAULT_SSE_READ_TIMEOUT from the same module that already exposes streamable_http_client, and add a module-level __all__ declaring the public surface. The redundant-alias / __all__ forms keep this a pure re-export (no behavior change) and satisfy ruff's F401.
  • tests/shared/test_httpx_utils.py — new test_public_reexport_from_streamable_http asserting the public names resolve to the same objects as the private ones.
  • docs/migration.md — point the "build the http_client" guidance at the public import path, with an example.

Notes

  • This is intentionally additive: nothing is removed or renamed, the private module still works, and existing imports are unaffected. No external code uses import * from this module (tests import names explicitly), so adding __all__ does not change any current consumer.
  • I scoped the re-export to mcp.client.streamable_http (rather than a broader mcp.shared) because that's where streamable_http_client lives and where McpHttpClientFactory was importable from in 1.x — happy to also/instead export from elsewhere if you'd prefer a different home.

Fixes #3238

Testing

  • tests/shared/test_httpx_utils.py — 3 passed (2 pre-existing + 1 new).
  • ruff check and ruff format --check clean on the changed files.

…e_http

Customizing the streamable-HTTP client's headers/auth/timeout requires
building an httpx2.AsyncClient, but the standardized factory
(create_mcp_http_client), the McpHttpClientFactory protocol, and the
default timeout constants only lived in the private
mcp.shared._httpx_utils module. Re-export them from the public
mcp.client.streamable_http module — where streamable_http_client itself
lives — so building a custom client does not require importing a private
module.

Add a regression test asserting the public names resolve to the same
objects as the private ones, and point the migration guide at the public
import path.

Refs modelcontextprotocol#3238

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 3 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src/mcp/client/streamable_http.py Outdated
Review feedback: the module-level __all__ added previously would have
replaced Python's implicit star-import behavior and dropped previously
exported names (SessionMessageOrError, DEFAULT_RECONNECTION_DELAY_MS,
etc.) for any `from mcp.client.streamable_http import *` consumer. Drop
__all__ and mark the re-exports with redundant aliases instead, which is
additive only — the star-import surface is unchanged apart from the newly
exported names.

Refs modelcontextprotocol#3238
@ProgrammerPlus1998

ProgrammerPlus1998 commented Aug 3, 2026

Copy link
Copy Markdown
Author

@github-actions github-actions Bot added the missing-issue-link Auto-closed: PR needs a linked issue assigned to its author (see CONTRIBUTING.md) label Aug 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot closed this Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

missing-issue-link Auto-closed: PR needs a linked issue assigned to its author (see CONTRIBUTING.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Expose create_mcp_http_client and McpHttpClientFactory as public API (2.0 made them private-only)

1 participant