Claude Code and Codex connect to the same tennis-club MCP server and get the same customer request. Watch which tools each one calls, and what the customer ends up with.
ToolTune sits in front of the server, identifies which agent is calling, and serves it tool definitions it reads correctly.
tools/list routing
Zero handler changes
Book me a reservation with the cheapest one at their earliest time that day.
book_lesson(coach_id="c3", time="09:00")
Lesson with the coach
create_reservation(coach_id="c3", time="09:00")
A court, no coach
Simulated customers make the same request in their own words, several times on each agent. When Codex falls short, an analyst proposes tool definitions served only to Codex, and fresh Codex runs check that they work.
The bug comes from the : asked for a reservation, Codex booked a court; Claude booked the coached lesson.
Each persona has the conversation on both agents. Claude’s most common result becomes the reference.
An analyst reads a good Claude transcript and a failing Codex one, then rewrites the definitions for Codex only.
Fresh Codex runs use the proposal. It counts as fixed only when every run reaches the reference.
## Heading is one persona and its text is the description. Text above the first heading is the scenario they all share. {date} becomes the demo date. <!-- comments --> are not sent.