-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Open
Labels
mcp[Component] Issues about MCP support[Component] Issues about MCP supporttools[Component] This issue is related to tools[Component] This issue is related to tools
Description
Inconsistency between FunctionTool implementation and MCPTool with respect to require_confirmation.
FunctionTool inspects the signature of the function and injects accordingly:
google/adk/tools/function_tool.py:LN157
@override
async def run_async(
self, *, args: dict[str, Any], tool_context: ToolContext
) -> Any:
# Preprocess arguments (includes Pydantic model conversion)
args_to_call = self._preprocess_args(args)
signature = inspect.signature(self.func)
valid_params = {param for param in signature.parameters}
if 'tool_context' in valid_params:
args_to_call['tool_context'] = tool_context
# Filter args_to_call to only include valid parameters for the function
args_to_call = {k: v for k, v in args_to_call.items() if k in valid_params}
# Before invoking the function, we check for if the list of args passed in
# has all the mandatory arguments or not.
# If the check fails, then we don't invoke the tool and let the Agent know
# that there was a missing input parameter. This will basically help
# the underlying model fix the issue and retry.
mandatory_args = self._get_mandatory_args()
missing_mandatory_args = [
arg for arg in mandatory_args if arg not in args_to_call
]
if missing_mandatory_args:
missing_mandatory_args_str = '\n'.join(missing_mandatory_args)
error_str = f"""Invoking `{self.name}()` failed as the following mandatory input parameters are not present:
{missing_mandatory_args_str}
You could retry calling this tool, but it is IMPORTANT for you to provide all the mandatory parameters."""
return {'error': error_str}
if isinstance(self._require_confirmation, Callable):
require_confirmation = await self._invoke_callable(
self._require_confirmation, args_to_call
)
else:
require_confirmation = bool(self._require_confirmation)
In contrast, MCPTool only passes args to the require confirmation function:
google/adk/tools/mcp_tool/mcp_tool.py:LN150
@override
async def run_async(
self, *, args: dict[str, Any], tool_context: ToolContext
) -> Any:
if isinstance(self._require_confirmation, Callable):
require_confirmation = await self._invoke_callable(
self._require_confirmation, args
)
else:
require_confirmation = bool(self._require_confirmation)
Metadata
Metadata
Assignees
Labels
mcp[Component] Issues about MCP support[Component] Issues about MCP supporttools[Component] This issue is related to tools[Component] This issue is related to tools