Skip to content

Commit 022d680

Browse files
committed
fix: update example to use streamable_http_client
The deprecated streamablehttp_client was removed from main during the rebase. Update the example to use streamable_http_client with create_mcp_http_client for connection-level headers.
1 parent 0d2839e commit 022d680

File tree

3 files changed

+101
-91
lines changed

3 files changed

+101
-91
lines changed

README.md

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,7 +2284,8 @@ tracing, A/B testing, and multi-tenant applications.
22842284
import asyncio
22852285

22862286
from 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

22902291
async 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

23442348
if __name__ == "__main__":

examples/snippets/clients/per_request_headers_example.py

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import asyncio
1010

1111
from mcp import ClientSession
12-
from mcp.client.streamable_http import streamablehttp_client
12+
from mcp.client.streamable_http import streamable_http_client
13+
from mcp.shared._httpx_utils import create_mcp_http_client
1314

1415

1516
async def main():
@@ -18,52 +19,55 @@ async def main():
1819
# Connection-level headers (static for the entire session)
1920
connection_headers = {"Authorization": "Bearer org-level-token", "X-Org-ID": "org-123"}
2021

21-
async with streamablehttp_client("https://mcp.example.com/mcp", headers=connection_headers) as (
22-
read_stream,
23-
write_stream,
24-
_,
25-
):
26-
async with ClientSession(read_stream, write_stream) as session:
27-
await session.initialize()
22+
async with create_mcp_http_client(headers=connection_headers) as httpx_client:
23+
async with streamable_http_client("https://mcp.example.com/mcp", http_client=httpx_client) as (
24+
read_stream,
25+
write_stream,
26+
_,
27+
):
28+
async with ClientSession(read_stream, write_stream) as session:
29+
await session.initialize()
2830

29-
# Example 1: Request tracing
30-
tracing_headers = {
31-
"X-Request-ID": "req-12345",
32-
"X-Trace-ID": "trace-abc-456",
33-
}
34-
result = await session.call_tool("process_data", {"type": "analytics"}, extra_headers=tracing_headers)
35-
print(f"Traced request result: {result}")
31+
# Example 1: Request tracing
32+
tracing_headers = {
33+
"X-Request-ID": "req-12345",
34+
"X-Trace-ID": "trace-abc-456",
35+
}
36+
result = await session.call_tool("process_data", {"type": "analytics"}, extra_headers=tracing_headers)
37+
print(f"Traced request result: {result}")
3638

37-
# Example 2: User-specific authentication
38-
user_headers = {
39-
"X-User-ID": "alice",
40-
"X-Auth-Token": "user-token-12345",
41-
}
42-
result = await session.call_tool("get_user_data", {"fields": ["profile"]}, extra_headers=user_headers)
43-
print(f"User-specific result: {result}")
39+
# Example 2: User-specific authentication
40+
user_headers = {
41+
"X-User-ID": "alice",
42+
"X-Auth-Token": "user-token-12345",
43+
}
44+
result = await session.call_tool("get_user_data", {"fields": ["profile"]}, extra_headers=user_headers)
45+
print(f"User-specific result: {result}")
4446

45-
# Example 3: A/B testing
46-
experiment_headers = {
47-
"X-Experiment-ID": "new-ui-test",
48-
"X-Variant": "variant-b",
49-
}
50-
result = await session.call_tool(
51-
"get_recommendations", {"user_id": "user123"}, extra_headers=experiment_headers
52-
)
53-
print(f"A/B test result: {result}")
47+
# Example 3: A/B testing
48+
experiment_headers = {
49+
"X-Experiment-ID": "new-ui-test",
50+
"X-Variant": "variant-b",
51+
}
52+
result = await session.call_tool(
53+
"get_recommendations", {"user_id": "user123"}, extra_headers=experiment_headers
54+
)
55+
print(f"A/B test result: {result}")
5456

55-
# Example 4: Override connection-level headers
56-
override_headers = {
57-
"Authorization": "Bearer user-specific-token", # Overrides connection-level
58-
"X-Special-Permission": "admin",
59-
}
60-
result = await session.call_tool("admin_operation", {"operation": "reset"}, extra_headers=override_headers)
61-
print(f"Admin operation result: {result}")
57+
# Example 4: Override connection-level headers
58+
override_headers = {
59+
"Authorization": "Bearer user-specific-token", # Overrides connection-level
60+
"X-Special-Permission": "admin",
61+
}
62+
result = await session.call_tool(
63+
"admin_operation", {"operation": "reset"}, extra_headers=override_headers
64+
)
65+
print(f"Admin operation result: {result}")
6266

63-
# Example 5: Works with all ClientSession methods
64-
await session.list_resources(extra_headers={"X-Resource-Filter": "public"})
65-
await session.get_prompt("template", extra_headers={"X-Context": "help"})
66-
await session.set_logging_level("debug", extra_headers={"X-Debug-Session": "true"})
67+
# Example 5: Works with all ClientSession methods
68+
await session.list_resources(extra_headers={"X-Resource-Filter": "public"})
69+
await session.get_prompt("template", extra_headers={"X-Context": "help"})
70+
await session.set_logging_level("debug", extra_headers={"X-Debug-Session": "true"})
6771

6872

6973
if __name__ == "__main__":

tests/shared/test_streamable_http.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,13 +1433,15 @@ async def message_handler( # pragma: no branch
14331433
if captured_protocol_version: # pragma: no cover
14341434
headers[MCP_PROTOCOL_VERSION_HEADER] = captured_protocol_version
14351435

1436-
async with create_mcp_http_client(headers=headers) as httpx_client:
1437-
async with streamable_http_client(f"{server_url}/mcp", http_client=httpx_client) as (
1436+
async with create_mcp_http_client(headers=headers) as httpx_client: # pragma: no branch
1437+
async with streamable_http_client(f"{server_url}/mcp", http_client=httpx_client) as ( # pragma: no branch
14381438
read_stream,
14391439
write_stream,
14401440
_,
14411441
):
1442-
async with ClientSession(read_stream, write_stream, message_handler=message_handler) as session:
1442+
async with ClientSession( # pragma: no branch
1443+
read_stream, write_stream, message_handler=message_handler
1444+
) as session:
14431445
result = await session.send_request(
14441446
types.ClientRequest(
14451447
types.CallToolRequest(

0 commit comments

Comments
 (0)