The number that actually matters
TDQS blends Tool Definition Quality (70%) and Server Coherence (30%). Each tool is scored 1–5 across six dimensions, but the part that bit us is how the per-tool scores roll up into the server score:server definition quality = 60% × mean TDQS + 40% × minimum TDQSThat 40%-on-the-minimum is the whole game. Our average tool was already ~4.1 — solidly A. Most tools scored 4.3–4.7. But the grade was a B, because our single weakest tool,
cancel_job,
scored 3.1 and dragged everything down with it.
One vague tool caps your whole server. So the highest-leverage work isn’t polishing your best
tools — it’s finding and fixing your worst one.
The pattern hiding in the dimensions
Expanding the low scorers, the same two dimensions were weak almost everywhere — even on otherwise-strong tools:- Usage Guidelines (2/5 at worst): the description never said when to use this tool versus a sibling that does something similar.
- Behavior (2/5): it didn’t disclose side effects, preconditions, or whether the tool is even read-only.
What we changed
We rewrote descriptions against three rules: 1. Disambiguate against siblings. If you ship three ways to cancel things, say which is which. 2. Disclose behavior up front. Read-only? Mutates disk? Requires a running server? Asynchronous (returns an id you poll later)? Local-only vs. works-against-remote? Destructive and irreversible? 3. Add meaning beyond the schema. Units, valid ranges, what omitting an optional param does, and what comes back. Here’scancel_job, our 3.1, before and after:
Before: “Cancel or interrupt a running ComfyUI job. Optionally target by prompt_id.”
After: “Interrupt the currently running ComfyUI job, optionally only when its prompt_id matches. Stops in-progress execution — the partial result is discarded and not recoverable — and does not remove pending/queued jobs. Requires a reachable ComfyUI server. Use this for the job executing right now; useSame tool, same parameters. The second version tells an agent when to reach for it, what it does to the world, and what not to use it for.cancel_queued_jobto remove one specific pending job, orclear_queueto drop all pending jobs.”
A gotcha: score what the checker actually sees
One of the lowest-scoring definitions in our own audit was the template behind auto-loaded workflow tools — tools the server generates from*.json files a user drops in a directory. We
almost spent time polishing it. But TDQS scores the tools the running server actually exposes,
and Glama boots the server in a clean environment with no workflow files — so those tools never
register and never get scored.
Lesson: audit against the tool list your server emits on a fresh boot, not the theoretical
maximum.
Keeping it from rotting
Descriptions drift. To keep ours honest, the tool reference is generated from the live schemas — a script boots the server with a capturing mock, reads each tool’s name, description, and zod schema, and emits the docs. One source of truth for both the agent and humans, so a sloppy edit shows up immediately. (These docs are built that way.)The result
Raising the floor —cancel_job, list_local_models, search_models, and the rest of the
sub-3.5 cluster — plus the cross-cutting Usage/Behavior pass took the minimum from 3.1 to ~4.0.
With the 60/40 split, that pulls the server out of B and into A on the next re-index.
Takeaways for MCP authors
- Fix your worst tool first — the 40%-minimum weighting means it sets your grade.
- Every description should answer three questions: what does this do to the world, when do I use it instead of a sibling, and what do the parameters mean beyond their types?
- Don’t just echo the schema — it already covers structure; prose should add intent.
- Audit the fresh-boot tool list, not your theoretical one.
- Generate the reference from the schema so quality can’t silently regress.
comfyui-mcp is open source on GitHub — browse the full, schema-generated tool reference.