{"slug": "your-mcp-server-s-tool-descriptions-are-the-product-a-40-line-node-script-to-and", "title": "Your MCP server's tool descriptions are the product: a 40-line Node script to dump and review them", "summary": "A developer published a dependency-free 40-line Node script that spawns any stdio MCP server, performs the initialize handshake, calls tools/list, and prints each tool's name, description and inputSchema parameters so authors can see what an agent actually reads. The post argues that vague tool descriptions cause models to pick the wrong tool or skip the right one, citing Glama's TDQS spec for scoring tool-definition quality, and offers a pay-what-you-want CLI, MCP Tool Docs Generator, that writes TOOLS.md, per-tool Markdown pages and tools.json.", "body_md": "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](https://tdqs.dev)), and the main complaint it addresses is inconsistent tool definitions.\n\nBefore 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.\n\n``` js\n// dump-tools.mjs  -  usage: node dump-tools.mjs <command> [args...]\nimport { spawn } from \"node:child_process\";\n\nconst [cmd, ...args] = process.argv.slice(2);\nconst p = spawn(cmd, args, { stdio: [\"pipe\", \"pipe\", \"inherit\"] });\nlet buf = \"\";\nconst pending = new Map();\nlet id = 0;\n\np.stdout.on(\"data\", (d) => {\n  buf += d;\n  let i;\n  while ((i = buf.indexOf(\"\\n\")) >= 0) {\n    const line = buf.slice(0, i).trim();\n    buf = buf.slice(i + 1);\n    if (!line) continue;\n    try {\n      const m = JSON.parse(line);\n      if (m.id != null && pending.has(m.id)) pending.get(m.id)(m);\n    } catch {}\n  }\n});\n\nconst send = (method, params) =>\n  new Promise((res) => {\n    const myId = ++id;\n    pending.set(myId, res);\n    p.stdin.write(JSON.stringify({ jsonrpc: \"2.0\", id: myId, method, params }) + \"\\n\");\n  });\n\nawait send(\"initialize\", {\n  protocolVersion: \"2024-11-05\",\n  capabilities: {},\n  clientInfo: { name: \"dump-tools\", version: \"0.1.0\" },\n});\np.stdin.write(JSON.stringify({ jsonrpc: \"2.0\", method: \"notifications/initialized\" }) + \"\\n\");\n\nconst { result } = await send(\"tools/list\", {});\nfor (const t of result.tools) {\n  const props = Object.keys(t.inputSchema?.properties ?? {});\n  console.log(`## ${t.name}\\n${t.description ?? \"(NO DESCRIPTION)\"}\\nparams: ${props.join(\", \") || \"none\"}\\n`);\n}\np.kill();\n```\n\n`(NO DESCRIPTION)` line is a tool the model has to guess about.`get_user: Gets a user` tells the model nothing. Say what it returns and when to use it instead of a sibling tool.`inputSchema` for its own `description`, units and an example.\nA 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](https://renevibe76.gumroad.com/l/bmzwpm)\n\nThe 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.", "url": "https://wpnews.pro/news/your-mcp-server-s-tool-descriptions-are-the-product-a-40-line-node-script-to-and", "canonical_source": "https://dev.to/renev3408/your-mcp-servers-tool-descriptions-are-the-product-a-40-line-node-script-to-dump-and-review-them-4ki2", "published_at": "2026-10-12 23:16:19+00:00", "updated_at": "2026-10-12 23:25:39.350135+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "developer-tools", "ai-tools"], "entities": ["Glama", "TDQS", "MCP Tool Docs Generator", "Gumroad"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/your-mcp-server-s-tool-descriptions-are-the-product-a-40-line-node-script-to-and", "markdown": "https://wpnews.pro/news/your-mcp-server-s-tool-descriptions-are-the-product-a-40-line-node-script-to-and.md", "text": "https://wpnews.pro/news/your-mcp-server-s-tool-descriptions-are-the-product-a-40-line-node-script-to-and.txt", "jsonld": "https://wpnews.pro/news/your-mcp-server-s-tool-descriptions-are-the-product-a-40-line-node-script-to-and.jsonld"}}