Your MCP unit tests pass, but did the agent call the tool? M3 runs your server through real Claude Code, Codex, OpenCode or Pi and asserts on the calls they actually made, in plain pytest. Direct tests need no API key. m3 ui shows every trace and tool call; m3 ci test --upload gates PRs and keeps runs on app.m3.sineframe.com. Open source, Apache-2.0.
Hey Product Hunt 👋 This is Rishav and Utkarsh, and we built SineFrame M3.
Here's the gap we kept hitting: your MCP server's unit tests pass, then a real agent answers from memory, picks the wrong tool, or calls it with the wrong arguments. Nothing in the test suite sees it.
M3 is pytest for that gap:
🔌 Direct tests: call your server over stdio or Streamable HTTP and assert on the structured results. No model, no API key. 🤖 Agent tests: run real Claude Code, Codex, OpenCode, Pi or any ACP agent against your server, then assert on the tool calls recorded on the wire, not on what the agent says it did. 🔍 m3 ui: every run saved locally, with traces, tool calls, arguments and a timeline. ✅ m3 ci test --upload: the same tests gate your pull requests, and runs land on app.m3.sineframe.com for the team.
How it's different: an inspector is for poking at a server by hand, and eval platforms grade your own LLM app. M3 is test code in your repo that checks your server and the real agents that call it.
Free and open source (Apache-2.0): uv tool install sf-m3-cli
Free account for hosted runs: sineframe.com
I'm here all day. What's the hardest MCP behavior for you to test today?
My server uses elicitation (asks the user for input mid tool-call). How do agent tests handle that? Can I stub the client's elicitation response in the test?
About SineFrame M3 on Product Hunt
“Test MCP servers and the agents that call them in pytest”
SineFrame M3 launched on Product Hunt on October 8th, 2026 and earned 63 upvotes and 3 comments, placing #46 on the daily leaderboard. Your MCP unit tests pass, but did the agent call the tool? M3 runs your server through real Claude Code, Codex, OpenCode or Pi and asserts on the calls they actually made, in plain pytest. Direct tests need no API key. m3 ui shows every trace and tool call; m3 ci test --upload gates PRs and keeps runs on app.m3.sineframe.com. Open source, Apache-2.0.
SineFrame M3 was featured in Open Source (69k followers), Developer Tools (521.5k followers), Artificial Intelligence (481.6k followers) and GitHub (41.4k followers) on Product Hunt. Together, these topics include over 269.3k products, making this a competitive space to launch in.
Who hunted SineFrame M3?
SineFrame M3 was hunted by Rishav katoch. A “hunter” on Product Hunt is the community member who submits a product to the platform — uploading the images, the link, and tagging the makers behind it. Hunters typically write the first comment explaining why a product is worth attention, and their followers are notified the moment they post. Around 79% of featured launches on Product Hunt are self-hunted by their makers, but a well-known hunter still acts as a signal of quality to the rest of the community. See the full all-time top hunters leaderboard to discover who is shaping the Product Hunt ecosystem.
Want to see how SineFrame M3 stacked up against nearby launches in real time? Check out the live launch dashboard for upvote speed charts, proximity comparisons, and more analytics.
Hey Product Hunt 👋 This is Rishav and Utkarsh, and we built SineFrame M3.
Here's the gap we kept hitting: your MCP server's unit tests pass, then a real agent answers from memory, picks the wrong tool, or calls it with the wrong arguments. Nothing in the test suite sees it.
M3 is pytest for that gap:
🔌 Direct tests: call your server over stdio or Streamable HTTP and assert on the structured results. No model, no API key.
🤖 Agent tests: run real Claude Code, Codex, OpenCode, Pi or any ACP agent against your server, then assert on the tool calls recorded on the wire, not on what the agent says it did.
🔍 m3 ui: every run saved locally, with traces, tool calls, arguments and a timeline.
✅ m3 ci test --upload: the same tests gate your pull requests, and runs land on app.m3.sineframe.com for the team.
How it's different: an inspector is for poking at a server by hand, and eval platforms grade your own LLM app. M3 is test code in your repo that checks your server and the real agents that call it.
Free and open source (Apache-2.0):
uv tool install sf-m3-cli
Free account for hosted runs: sineframe.com
I'm here all day. What's the hardest MCP behavior for you to test today?