Skip to content

Python: [Bug]: mcp server can not receive self-define header #7161

Closed

Description

@changyao-han

Description

I define mcp and function_middleware below, but when "tools/call", mcp server can not receive self-define header Authorization:

mcp_server = MCPStreamableHTTPTool(
    name="powergridcasemcp",
    load_prompts=False,
    url="http://127.0.0.1:8000/mcp",
    header_provider=header_provider=lambda kwargs: {"Authorization": f"Bearer {kwargs['mcp_api_key']}"},
)


@function_middleware
async def function_inject_kwargs(context, call_next) -> None:
    """Middleware that adds tool-only runtime values before execution."""
    context.kwargs.setdefault("mcp_api_key", "123")
    await call_next()

i debug find:
_mcp.py 3106 token = _mcp_call_headers.set(headers) exec set success
_mcp.py 3074 headers = _mcp_call_headers.get({}) exec get {}

_mcp.py 113 _mcp_call_headers: contextvars.ContextVar[dict[str, str]] = contextvars.ContextVar("_mcp_call_headers")

Code Sample

Error Messages / Stack Traces

Package Versions

agent-framework-core: 1.11.0

Python Version

No response

Additional Context

No response

Activity

  1. added theissue type on Jul 17, 2026
  2. added
    pythonUsage: [Issues, PRs], Target: Python
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Jul 17, 2026
  3. added
    reproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow
    on Jul 17, 2026
  4. github-actions commented on Jul 17, 2026

    @github-actions
    Contributor

    🤖 Automated triage reproduction notes (agent-authored — trust but verify)

    Agent analysis

    Repro: MCPStreamableHTTPTool.call_tool() in packages/core/agent_framework/_mcp.py sets _mcp_call_headers ContextVar at line 3106, but the _inject_headers httpx event hook at line 3074 reads it in the MCP transport's post_writer task context (spawned during connect via streamable_http_client), which never has the var set. Minimal repro: create an MCPStreamableHTTPTool with a header_provider, connect it, then call call_tool—the headers will be empty in the actual HTTP request because the transport's task group was created before call_tool set the ContextVar. A fix must propagate headers through a mechanism that crosses task boundaries (e.g., attaching headers to the session message metadata or write stream rather than relying on contextvars).

    • Failing test: python/packages/core/tests/core/test_mcp_header_contextvar_bug.py
    • Files examined: python/packages/core/agent_framework/_mcp.py, python/.venv/lib/python3.13/site-packages/mcp/client/streamable_http.py, python/packages/core/tests/core/test_mcp.py
    • Tests run: python/packages/core/tests/core/test_mcp_header_contextvar_bug.py::test_contextvar_not_visible_in_separate_task, python/packages/core/tests/core/test_mcp_header_contextvar_bug.py::test_mcp_header_not_received_real_scenario
    • Reported version: 1.11.0
    • Current version: 1.11.0
  5. robbiebusinessacc commented on Jul 17, 2026

    @robbiebusinessacc
    Contributor

    I'd like to take this one — could you assign it to me?
    The reporter's debugging and the triage notes match what I see in the code: _inject_headers runs inside the transport's post_writer task, which got its own copy of the context when the connection was opened, so the _mcp_call_headers.set() that happens later in call_tool() is never visible there and the hook reads {}. Since a ContextVar can't cross that task boundary, the headers need to travel another way — either a per-call snapshot on the tool instance that the hook falls back to, or propagation through the request metadata as the triage notes suggest. I'll start with a regression test that fails on current main, and can go with whichever fix shape you prefer.

  6. removed
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Jul 20, 2026
  7. moonbox3 commented on Jul 20, 2026

    @moonbox3
    Contributor

    Please have at it, Robbie Walmsley (@robbiebusinessacc). Let us know when there's a PR to review. Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

pythonUsage: [Issues, PRs], Target: PythonreproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions