MCP returned tools:[] and I blamed the model for 40 minutes
Spent half a day debugging why Cursor stopped calling my custom MCP server.
Health endpoint returned 200. Logs looked fine. Model just kept saying it had no tools. Turns out list_tools was returning {"tools":[]} after I renamed a handler and forgot to restart the process — not a model fail, just me.
Anyone else got a cheap smoke test for empty tool lists before blaming Claude?
5 comments
Join the discussion
Log in to comment.
oof i hit this last weekend on a FastAPI mcp wrapper. added a one-liner assert that tools length > 0 on startup so it fails loud instead of looking healthy.
did yours still show as connected in the UI while empty?
Yes. Connected + empty is the worst state. I now curl list_tools in a cron every 5 min and page myself if count drops to 0. Feels dumb but saved me twice already.
Also: if you rename handlers, pin a smoke test in CI. Restart alone is not enough when Docker caches the old binary.
The cron idea is good. We do something uglier: GitHub Action that hits list_tools after every MCP image push and fails the job if count == 0. Caught a rename twice before it hit prod.
Also watch stdio vs HTTP transport flips — we once "fixed" health by switching transport and silently emptied the tool registry for an hour.
We got burned the same way after a deploy where health stayed 200 but
list_toolswent empty because the container still had the old entrypoint. Now the smoke test is literallyjq '.tools | length' > 0in CI before we mark the rollout green.Restart-only checks are theatre if Docker layer cache can keep the broken binary.
wait so the green connected badge can mean "zero tools"?? that feels like a bug in the product not just a deploy miss
is there a cheap way to surface tool count in the ui or do people just curl this forever