Python: fix(ag-ui): add MCP tool support for AG-UI approval flows (#3212)

* add MCP tool support for AG-UI approval flows

* use attribute in place of property
This commit is contained in:
Evan Mattson
2026-01-15 11:34:11 +09:00
committed by GitHub
Unverified
parent 80b25a782b
commit 620da7a829
7 changed files with 234 additions and 111 deletions
@@ -678,7 +678,7 @@ class ChatAgent(BaseAgent, Generic[TOptions_co]): # type: ignore[misc]
normalized_tools: list[ToolProtocol | Callable[..., Any] | MutableMapping[str, Any]] = ( # type:ignore[reportUnknownVariableType]
[] if tools_ is None else tools_ if isinstance(tools_, list) else [tools_] # type: ignore[list-item]
)
self._local_mcp_tools = [tool for tool in normalized_tools if isinstance(tool, MCPTool)]
self.mcp_tools: list[MCPTool] = [tool for tool in normalized_tools if isinstance(tool, MCPTool)]
agent_tools = [tool for tool in normalized_tools if not isinstance(tool, MCPTool)]
# Build chat options dict
@@ -720,7 +720,7 @@ class ChatAgent(BaseAgent, Generic[TOptions_co]): # type: ignore[misc]
Returns:
The ChatAgent instance.
"""
for context_manager in chain([self.chat_client], self._local_mcp_tools):
for context_manager in chain([self.chat_client], self.mcp_tools):
if isinstance(context_manager, AbstractAsyncContextManager):
await self._async_exit_stack.enter_async_context(context_manager)
return self
@@ -817,7 +817,7 @@ class ChatAgent(BaseAgent, Generic[TOptions_co]): # type: ignore[misc]
else:
final_tools.append(tool) # type: ignore
for mcp_server in self._local_mcp_tools:
for mcp_server in self.mcp_tools:
if not mcp_server.is_connected:
await self._async_exit_stack.enter_async_context(mcp_server)
final_tools.extend(mcp_server.functions)
@@ -944,7 +944,7 @@ class ChatAgent(BaseAgent, Generic[TOptions_co]): # type: ignore[misc]
else:
final_tools.append(tool)
for mcp_server in self._local_mcp_tools:
for mcp_server in self.mcp_tools:
if not mcp_server.is_connected:
await self._async_exit_stack.enter_async_context(mcp_server)
final_tools.extend(mcp_server.functions)
@@ -275,13 +275,13 @@ class HandoffAgentExecutor(AgentExecutor):
middleware = list(agent.middleware or [])
# Reconstruct the original tools list by combining regular tools with MCP tools.
# ChatAgent.__init__ separates MCP tools into _local_mcp_tools during initialization,
# ChatAgent.__init__ separates MCP tools during initialization,
# so we need to recombine them here to pass the complete tools list to the constructor.
# This makes sure MCP tools are preserved when cloning agents for handoff workflows.
tools_from_options = options.get("tools")
all_tools = list(tools_from_options) if tools_from_options else []
if agent._local_mcp_tools: # type: ignore
all_tools.extend(agent._local_mcp_tools) # type: ignore
if agent.mcp_tools:
all_tools.extend(agent.mcp_tools)
logit_bias = options.get("logit_bias")
metadata = options.get("metadata")