@@ -2284,7 +2284,8 @@ tracing, A/B testing, and multi-tenant applications.
22842284import asyncio
22852285
22862286from mcp import ClientSession
2287- from mcp.client.streamable_http import streamablehttp_client
2287+ from mcp.client.streamable_http import streamable_http_client
2288+ from mcp.shared._httpx_utils import create_mcp_http_client
22882289
22892290
22902291async def main ():
@@ -2293,52 +2294,55 @@ async def main():
22932294 # Connection-level headers (static for the entire session)
22942295 connection_headers = {" Authorization" : " Bearer org-level-token" , " X-Org-ID" : " org-123" }
22952296
2296- async with streamablehttp_client(" https://mcp.example.com/mcp" , headers = connection_headers) as (
2297- read_stream,
2298- write_stream,
2299- _,
2300- ):
2301- async with ClientSession(read_stream, write_stream) as session:
2302- await session.initialize()
2297+ async with create_mcp_http_client(headers = connection_headers) as httpx_client:
2298+ async with streamable_http_client(" https://mcp.example.com/mcp" , http_client = httpx_client) as (
2299+ read_stream,
2300+ write_stream,
2301+ _,
2302+ ):
2303+ async with ClientSession(read_stream, write_stream) as session:
2304+ await session.initialize()
23032305
2304- # Example 1: Request tracing
2305- tracing_headers = {
2306- " X-Request-ID" : " req-12345" ,
2307- " X-Trace-ID" : " trace-abc-456" ,
2308- }
2309- result = await session.call_tool(" process_data" , {" type" : " analytics" }, extra_headers = tracing_headers)
2310- print (f " Traced request result: { result} " )
2311-
2312- # Example 2: User-specific authentication
2313- user_headers = {
2314- " X-User-ID" : " alice" ,
2315- " X-Auth-Token" : " user-token-12345" ,
2316- }
2317- result = await session.call_tool(" get_user_data" , {" fields" : [" profile" ]}, extra_headers = user_headers)
2318- print (f " User-specific result: { result} " )
2319-
2320- # Example 3: A/B testing
2321- experiment_headers = {
2322- " X-Experiment-ID" : " new-ui-test" ,
2323- " X-Variant" : " variant-b" ,
2324- }
2325- result = await session.call_tool(
2326- " get_recommendations" , {" user_id" : " user123" }, extra_headers = experiment_headers
2327- )
2328- print (f " A/B test result: { result} " )
2329-
2330- # Example 4: Override connection-level headers
2331- override_headers = {
2332- " Authorization" : " Bearer user-specific-token" , # Overrides connection-level
2333- " X-Special-Permission" : " admin" ,
2334- }
2335- result = await session.call_tool(" admin_operation" , {" operation" : " reset" }, extra_headers = override_headers)
2336- print (f " Admin operation result: { result} " )
2337-
2338- # Example 5: Works with all ClientSession methods
2339- await session.list_resources(extra_headers = {" X-Resource-Filter" : " public" })
2340- await session.get_prompt(" template" , extra_headers = {" X-Context" : " help" })
2341- await session.set_logging_level(" debug" , extra_headers = {" X-Debug-Session" : " true" })
2306+ # Example 1: Request tracing
2307+ tracing_headers = {
2308+ " X-Request-ID" : " req-12345" ,
2309+ " X-Trace-ID" : " trace-abc-456" ,
2310+ }
2311+ result = await session.call_tool(" process_data" , {" type" : " analytics" }, extra_headers = tracing_headers)
2312+ print (f " Traced request result: { result} " )
2313+
2314+ # Example 2: User-specific authentication
2315+ user_headers = {
2316+ " X-User-ID" : " alice" ,
2317+ " X-Auth-Token" : " user-token-12345" ,
2318+ }
2319+ result = await session.call_tool(" get_user_data" , {" fields" : [" profile" ]}, extra_headers = user_headers)
2320+ print (f " User-specific result: { result} " )
2321+
2322+ # Example 3: A/B testing
2323+ experiment_headers = {
2324+ " X-Experiment-ID" : " new-ui-test" ,
2325+ " X-Variant" : " variant-b" ,
2326+ }
2327+ result = await session.call_tool(
2328+ " get_recommendations" , {" user_id" : " user123" }, extra_headers = experiment_headers
2329+ )
2330+ print (f " A/B test result: { result} " )
2331+
2332+ # Example 4: Override connection-level headers
2333+ override_headers = {
2334+ " Authorization" : " Bearer user-specific-token" , # Overrides connection-level
2335+ " X-Special-Permission" : " admin" ,
2336+ }
2337+ result = await session.call_tool(
2338+ " admin_operation" , {" operation" : " reset" }, extra_headers = override_headers
2339+ )
2340+ print (f " Admin operation result: { result} " )
2341+
2342+ # Example 5: Works with all ClientSession methods
2343+ await session.list_resources(extra_headers = {" X-Resource-Filter" : " public" })
2344+ await session.get_prompt(" template" , extra_headers = {" X-Context" : " help" })
2345+ await session.set_logging_level(" debug" , extra_headers = {" X-Debug-Session" : " true" })
23422346
23432347
23442348if __name__ == " __main__" :
0 commit comments