Agents pick MCP tools by reading name, description and inputSchema from tools/list. If those are vague, the model picks the wrong tool, or skips the right one. Glama recently published an open spec for scoring this (TDQS, https://tdqs.dev), and the main complaint it addresses is inconsistent tool definitions.
Before you submit a server to a directory, read what an agent actually sees. Here is a dependency-free Node script that spawns any stdio MCP server, runs the handshake, and prints every tool.
// dump-tools.mjs - usage: node dump-tools.mjs <command> [args...]
import { spawn } from "node:child_process";
const [cmd, ...args] = process.argv.slice(2);
const p = spawn(cmd, args, { stdio: ["pipe", "pipe", "inherit"] });
let buf = "";
const pending = new Map();
let id = 0;
p.stdout.on("data", (d) => {
buf += d;
let i;
while ((i = buf.indexOf("\n")) >= 0) {
const line = buf.slice(0, i).trim();
buf = buf.slice(i + 1);
if (!line) continue;
try {
const m = JSON.parse(line);
if (m.id != null && pending.has(m.id)) pending.get(m.id)(m);
} catch {}
}
});
const send = (method, params) =>
new Promise((res) => {
const myId = ++id;
pending.set(myId, res);
p.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: myId, method, params }) + "\n");
});
await send("initialize", {
protocolVersion: "2024-11-05",
capabilities: {},
clientInfo: { name: "dump-tools", version: "0.1.0" },
});
p.stdin.write(JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" }) + "\n");
const { result } = await send("tools/list", {});
for (const t of result.tools) {
const props = Object.keys(t.inputSchema?.properties ?? {});
console.log(`## ${t.name}\n${t.description ?? "(NO DESCRIPTION)"}\nparams: ${props.join(", ") || "none"}\n`);
}
p.kill();
What to look for in the output
-
Missing descriptions. Any
(NO DESCRIPTION)line is a tool the model has to guess about. -
Descriptions that only restate the name.
get_user: Gets a usertells the model nothing. Say what it returns and when to use it instead of a sibling tool. -
Undescribed parameters. Check each property in
inputSchemafor its owndescription, units and an example. - Overlapping tools. If two descriptions could apply to the same request, add "use this when... not for..." wording.
Making it a deliverable
A terminal dump is fine for you, but reviewers and users want a readable page. I packaged the same idea as a small zero-dependency CLI called MCP Tool Docs Generator. It connects to a stdio MCP server, calls initialize and tools/list, and writes a TOOLS.md, one Markdown page per tool, and a tools.json. It is pay-what-you-want with a $1 minimum: https://renevibe76.gumroad.com/l/bmzwpm
The script above is free to copy and enough to audit your own server. The packaged version is for when you want the files generated for your README.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.