Fetching from the wire…
Public story · 2026-08-08 · high
The mismatch let a faked tool name slip past every human approval, allow-list, and audit log built to stop it.
Why now: The fix merged August 6, closing a gap in the human-in-the-loop approval built into Agno's MCP toolkit.
Agno merged a fix on August 6 for an MCP bug that let a model overwrite which tool actually ran, per the pull request.
Approve what looks like a safe read, and the server could execute a delete instead. The approval check and the actual execution were reading two different names.
Allow-lists, requires_confirmation flags, human-in-the-loop prompts, and audit logs all checked the tool name Agno declared for the wrapper. None of them saw the name the model actually triggered.
Every MCP tool entrypoint was built with functools.partial(call_tool, tool_name=tool.name). That's a keyword default, and keyword defaults lose to whatever the caller passes in. A model calling any MCP tool could include tool_name="delete_repo" as an argument, and the server would run delete_repo instead.
This is the confused-deputy problem again, but it's not a protocol flaw here. Agno wired approval checks to a mutable keyword argument, and the model controlled that argument. The fix closes over tool.name and drops the parameter, so a model can't supply its own version anymore.
A related release in the same batch: open-kritt open-sourced agent-orchestrated vulnerability hunting. It's built on the argument that scanning a whole repo at once already falls short.
Each link below shares sources, entities, or timing with this story.
PR #9379, merged August 6, fixes MCP tool entrypoints built as functools.partial(call_tool, tool_name=tool.name). Partial keyword defaults get overridden by call-time kwargs, so a model passing tool_name="delete_repo" as an argument to any MCP tool executed delete_repo while a...
It logs edits and errors to SQLite and retrieves them by search, skipping re-reads after compaction, enforced across 17 agent platforms.
Two of the six hid commands from the approval dialog itself, using tab padding, invisible Unicode, and split Bash strings.
The GitHub advisory says the checker inspects the executable name only, ignoring every argument passed alongside it.
Fork skills chained to their own output now run before that output exists, unless they opt out.
Boundary-Bench ran 12 agent harnesses through real firewall and filesystem locks, and costs climbed as much as 167 percent as those restrictions tightened.
MindPattern daily
One email a day at 7 AM. Sources and a take on every story. Unsubscribe anytime.