MCP toolset: in-model built-ins (e.g. google_search) can be shadowed by a server tool; a server tool named set_model_response aborts the run
Los mantenedores suelen responder en 1 día
Evaluación
Este issue todavía no se ha evaluado.
Descripción
Summary
Same two defects as the Go port, reproduced locally against adk-java (4ee155b2, core). No live service was contacted.
- In-model built-in tools do not occupy their name, so a server-provided tool can shadow them.
GoogleSearchTool(andGoogleMapsTool,UrlContextTool,VertexAiSearchTool,BuiltInCodeExecutionTool) overrideprocessLlmRequestto append only toconfig.Tools, never callingappendTools. So the duplicate-name guard inLlmRequest.Builder.appendToolsnever sees them, and a callable MCP tool advertisinggoogle_searchis accepted and wins dispatch —Functions.handleFunctionCallsresolves by name from a map where the MCP tool overwrote the built-in. - A server-provided tool named
set_model_responseaborts the whole run on an agent with an output schema (IllegalArgumentException: Duplicate tool name: set_model_response). Availability, not silent displacement — but a malicious/untrusted MCP server can deny service.
Evidence
- MCP tools take the server's name, unfiltered by default —
tools/mcp/McpToolset.java:260-279;tools/BaseToolset.java:60-64(if (toolFilter == null) return true;); name sourcetools/mcp/AbstractMcpTool.java:52-56. - Callable-vs-callable is fail-closed —
models/LlmRequest.java:204-222(appendTools, throwing merger); all tools enter viatools/BaseTool.java:187-193. set_model_responseis in the guarded class —flows/llmflows/OutputSchema.java:60-65;SetModelResponseTool.java:33-45(extendsBaseTool, does not overrideprocessLlmRequest). Processor order:SingleFlow.java:27-36,BaseLlmFlow.java:103-104.- Built-ins bypass the guard —
tools/GoogleSearchTool.java:45-76(override that appendsTool.builder().googleSearch(...)only); same inGoogleMapsTool.java:65,UrlContextTool.java:46,VertexAiSearchTool.java:60,BuiltInCodeExecutionTool.java:44. - Dispatch by name —
BaseLlmFlow.java:765-766;Functions.java:295(tools.get(functionCall.name().get())).
Local reproduction
[probe] registered tool map keys: [google_search]
[probe] config.Tool googleSearch=true functionDeclarations=[]
[probe] config.Tool googleSearch=false functionDeclarations=[google_search]
[probe] google_search: NO ERROR. dispatch map maps google_search -> FakeMcpTool
[probe] set_model_response: REJECTED -> Duplicate tool name: set_model_response
Suggested fix
Preferred (availability-first): reject the server-provided tool via a reserved-name check in AbstractMcpTool's constructor or in McpToolset.getTools / McpAsyncToolset.getTools, covering set_model_response, transfer_to_agent, google_search, google_maps, url_context, vertex_ai_search, code_execution, load_artifacts.
Alternative: make the in-model tools call appendTools so the existing duplicate guard applies (note: google_search would then need a clean-failing runAsync).
Same class as the Go port (google/adk-go#1605) and a separately-triaged adk-js report.
- Lenguaje dominante
- Java
- Estrellas
- 1.7k
- Forks
- 433
- Merge medio
- 2 d 21 h
- PR fusionados (30 d)
- 40
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de google/adk-java
-
GeminiUtil placeholder user turn ("Continue output. DO NOT look at this line ...") is flagged by prompt injection filtersPosiblemente ocupada @hemasekhar-p la tomó hace 4 días. Abiertoneeds review
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
google/adk-java#1628 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
[spring-ai] ToolConverter silently drops enum and items from tool parameter schemasPosiblemente ocupada @hirematha la tomó hace 6 días. Abiertoneeds review
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
google/adk-java#1609 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
[spring-ai] Streaming responses ending with CJK punctuation (。!?) are misclassified as partial and never persisted to the sessionPosiblemente ocupada @hirematha la tomó hace 6 días. Abiertoneeds review
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
google/adk-java#1608 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
runLive passes partial events to appendEvent and never aggregates text chunks, unlike ADK PythonAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
Los mantenedores suelen responder en 1 día
-
FirestoreSessionService compares event timestamps as text, reordering or skipping same-second eventsAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 50/100
Los mantenedores suelen responder en 1 día
Todos los issues de google/adk-java
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
lugassawan/swe-workbench#799 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
Vakore/ZappierGames#89 ·
-
1.20.1-FORGE Module-Enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
MehVahdJukaar/WoodGood#1340 · 1 comentario ·
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
PssbleTrngle/dye_depot#123 ·
-
bug question
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100