Skip to content

fix(mcp): propagate trace context in default streamable HTTP client#4769

Open
pandego wants to merge 2 commits intogoogle:mainfrom
pandego:fix/4768-mcp-traceparent
Open

fix(mcp): propagate trace context in default streamable HTTP client#4769
pandego wants to merge 2 commits intogoogle:mainfrom
pandego:fix/4768-mcp-traceparent

Conversation

@pandego
Copy link

@pandego pandego commented Mar 9, 2026

Related issue

Fixes #4768

What this changes

  • wraps the default MCP httpx_client_factory so outbound streamable HTTP MCP requests use the existing OTel context when OTel HTTPX instrumentation is installed
  • keeps behavior unchanged when OTel instrumentation is not installed (graceful no-op)
  • preserves the existing customization path via httpx_client_factory

Testing

  • uv run pytest tests/unittests/tools/mcp_tool/test_mcp_session_manager.py tests/unittests/tools/mcp_tool/test_mcp_toolset.py

Notes

  • this targets only the default factory path used by StreamableHTTPConnectionParams

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses an issue where OpenTelemetry trace context was not being propagated in streamable HTTP requests made by the MCP tool. It introduces a wrapper around the default HTTPX client factory to automatically instrument the client with OpenTelemetry when available, ensuring that trace context is correctly forwarded. The changes are designed to be non-breaking, falling back to uninstrumented behavior if OpenTelemetry is not present.

Highlights

  • OpenTelemetry Integration: Integrated OpenTelemetry trace context propagation into the default streamable HTTP client factory for outbound MCP requests.
  • Graceful Degradation: Ensured that the system gracefully handles cases where OpenTelemetry instrumentation is not installed, maintaining existing behavior without errors.
  • Customization Preservation: Maintained the existing customization path for httpx_client_factory, allowing users to continue providing their own client factories.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • src/google/adk/tools/mcp_tool/mcp_session_manager.py
    • Renamed the import of create_mcp_http_client to _create_mcp_http_client to avoid naming conflicts.
    • Implemented a new create_mcp_http_client function that wraps the original client creation and conditionally applies OpenTelemetry HTTPX instrumentation.
  • tests/unittests/tools/mcp_tool/test_mcp_session_manager.py
    • Added an import for builtins to facilitate mocking __import__.
    • Included a new test case to verify that the create_mcp_http_client function successfully instruments the HTTPX client when OpenTelemetry is present.
    • Added another test case to confirm that the create_mcp_http_client function operates correctly without instrumentation when OpenTelemetry is not installed.
Activity
  • Addressed issue MCPToolset does not propagate trace headers if present #4768, which concerned the propagation of trace context.
  • Implemented changes to wrap the default MCP httpx_client_factory for OTel context propagation.
  • Ensured existing customization paths for httpx_client_factory are preserved.
  • Verified changes with unit tests covering both OTel availability and absence.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request correctly adds OpenTelemetry trace context propagation for the default streamable HTTP client in MCP. The implementation is sound, and the tests cover both scenarios where OTel is present and absent. I've added one suggestion to simplify the test code for better readability and maintainability.

@rohityan rohityan self-assigned this Mar 9, 2026
@saschabuehrle
Copy link

Nice improvement — propagating context in the default MCP HTTP client is a strong step for distributed tracing.

Suggestion for follow-up robustness: define an end-to-end tracing checklist and validate it as one contract across boundaries:

  1. inbound HTTP (traceparent extracted),
  2. agent internal spans,
  3. outbound MCP HTTP (traceparent injected),
  4. downstream service joins the same trace ID.

If this contract is validated in CI (even with a lightweight integration test), it should prevent future partial regressions where one hop drops context.

@pandego pandego force-pushed the fix/4768-mcp-traceparent branch from 0bdcb05 to c002ade Compare March 10, 2026 17:32
@pandego
Copy link
Author

pandego commented Mar 11, 2026

Thanks - this is a helpful suggestion.

I agree that an end-to-end tracing contract would be a good follow-up to catch partial regressions across the full path. I kept this PR scoped to propagating trace context in the default outbound MCP HTTP client, but validating the full inbound -> agent -> outbound -> downstream chain in CI would be a solid next step.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MCPToolset does not propagate trace headers if present

3 participants