[bot] Anthropic: MCP connector tool calls (`mcp_tool_use`/`mcp_tool_result`) are silently dropped from tool spans
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 75/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- python
- Domínio
- devtools, observability-sre
Direção de pesquisa
O problema está em py/src/braintrust/integrations/anthropic/tracing.py. Comece lendo a função _log_server_tool_spans por volta da linha 1455 e as definições de _SERVER_TOOL_USE_TYPE e _is_server_tool_result_type. A correção é estender a verificação do lado da chamada para também corresponder a "mcp_tool_use". Certifique-se de que os blocos mcp_tool_result sejam corretamente emparelhados com suas chamadas. Execute os testes existentes para a integração Anthropic para verificar a correção.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Summary
Anthropic's MCP connector feature (tools=[{"type": "mcp_toolset", ...}] on client.messages.create(), gated by the mcp-client-2025-11-20 beta header) returns mcp_tool_use and mcp_tool_result content blocks when Claude calls a remote MCP server's tools. The repo's Anthropic tracing does not recognize mcp_tool_use as a tool call at all, so:
- MCP tool calls are never captured into a span (no input, no tool name, no call metadata).
- MCP tool results are still detected (because the result-type check is suffix-based) but are logged as orphaned spans with no call context, since the corresponding call was never registered.
This is a correctness gap, not just missing-coverage: half of each MCP tool exchange is dropped and the other half is logged incompletely/incorrectly.
What is missing
In py/src/braintrust/integrations/anthropic/tracing.py:
_SERVER_TOOL_USE_TYPE = "server_tool_use" # line 1337
def _is_server_tool_result_type(item_type: Any) -> bool: # line 1340
return isinstance(item_type, str) and item_type.endswith("_tool_result") and item_type != "tool_result"
_log_server_tool_spans (line 1455) pairs calls and results by walking response content:
item_type = item.get("type")
if item_type == _SERVER_TOOL_USE_TYPE: # line 1470 — only matches "server_tool_use"
...
continue
if not _is_server_tool_result_type(item_type): # line 1481
continue
- The call-side check only matches the literal string
"server_tool_use"(used for built-in server tools like web search / code execution). It does not match"mcp_tool_use", somcp_tool_useblocks fall through the loop entirely and are never added tocalls_by_id. - The result-side check (
_is_server_tool_result_type) matches anything ending in_tool_resultexcept the literaltool_result, somcp_tool_resultdoes pass this check — but since no matching call was ever registered, it's appended as(None, item), producing a tool span with output only and no input/tool name.
Separately, _MANAGED_AGENTS_CALL_TYPES (line 905) does include "agent.mcp_tool_use" — but that's the distinct, agent.-prefixed type used by the Managed Agents API (client.beta.agents/client.beta.sessions), not the plain mcp_tool_use/mcp_tool_result types returned by the standard Messages API's MCP connector.
Braintrust docs status: unclear / not_found
The Anthropic integration page mentions mcp_servers exactly once, as one of many request parameters captured in span metadata for the Go SDK's request-param list. It does not mention mcp_toolset, mcp_tool_use, or mcp_tool_result anywhere, and does not document any tool-span behavior specific to the MCP connector for any language. The only documented span-splitting for server-side tools is generic ("server-side tool calls ... appear as child tool spans"), described for the Java SDK, and is not confirmed to apply to MCP connector blocks specifically.
Upstream sources
- Anthropic MCP connector docs: https://platform.claude.com/docs/en/agents-and-tools/mcp-connector — confirms the
mcp_toolsettool type, themcp-client-2025-11-20beta header, and the exact response content block types"mcp_tool_use"and"mcp_tool_result"(example response blocks shown verbatim in the "How MCP connector tool calls work" section).
Local repo files inspected
py/src/braintrust/integrations/anthropic/tracing.py(full file, 1627 lines) — specifically_SERVER_TOOL_USE_TYPE(line 1337),_is_server_tool_result_type(line 1340),_log_server_tool_spans(line 1455),_MANAGED_AGENTS_CALL_TYPES(line 905)py/src/braintrust/integrations/anthropic/integration.pypy/src/braintrust/integrations/anthropic/patchers.py
- Linguagem predominante
- Python
- Estrelas
- 20
- Forks
- 18
- Merge médio
- 1d 1h
- PRs com merge (30d)
- 82
Preparar o ambiente
- Inclui um Dockerfile ou arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de braintrustdata/braintrust-sdk-python
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
braintrustdata/braintrust-sdk-python#774 ·
Mantenedores costumam responder em até 1 dia
-
Track new instrumentable SDK features from weekly dependency update (#805)Talvez já em andamento @AbhiPrasad assumiu há 2 dias. Abertafeature python
braintrustdata/braintrust-sdk-python#812 · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
new-integration
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 68/100
braintrustdata/braintrust-sdk-python#808 ·
Mantenedores costumam responder em até 1 dia
-
new-integration
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
braintrustdata/braintrust-sdk-python#807 ·
Mantenedores costumam responder em até 1 dia
-
new-integration
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 45/100
braintrustdata/braintrust-sdk-python#806 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de braintrustdata/braintrust-sdk-python
Issues semelhantes
-
bug server
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
sportsdataverse/sportsdataverse-py#641 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
googleapis/google-cloud-python#18532 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 1 dia