Tool-description linter
Lint MCP and function-calling tool definitions — names, missing or short descriptions, undocumented parameters, provider schema rules and token cost.
What it does
Paste the tools a model is offered — an MCP server's tools/list result, its JSON-RPC response, or the tools array of an OpenAI, Anthropic or Gemini request — and choose what they are for: an MCP server, or one provider's function calling. Every finding names the tool, the path and the line, and says what the rule rests on: the provider's own page, the specification, Salyro's engine, or a heuristic.
Try it: an MCP server's list with common mistakes, OpenAI function tools, or an Anthropic strict tool.
What it reads
The shape is read from each tool: inputSchema (MCP), function.parameters (OpenAI Chat Completions), type: "function" with parameters (OpenAI Responses), input_schema (Anthropic) and functionDeclarations (Gemini). A provider-hosted tool, such as web search, carries no definition of its own and is noted, not checked. Up to 2,000 tools are read.
Names
- Missing, or given twice. A model cannot tell two tools of one name apart; the MCP specification says names SHOULD be unique within a server.
- The target's pattern. Anthropic's page: a name must match
^[a-zA-Z0-9_-]{1,128}$. For an MCP server, the specification's SHOULD: 1 to 128 letters, digits,_,-and.. The pages of OpenAI, Google and xAI could not be read when this tool was built, so their rules are unknown here, and the linter says so instead of guessing. - Salyro's bounds, as a documented example. Salyro gives the names a model is shown the alphabet
^[a-zA-Z0-9_-]{1,64}$, read from its engine, which it takes as what its four providers all accept. Its MCP Connect refuses a server whose tool name is longer than 128 characters. Both numbers are imported from Salyro's shared package, never restated.
Descriptions
- Missing. The model decides when to call a tool from its name and description alone.
- Very short (under 20 characters) is a heuristic warning.
- Short by Anthropic's guidance: "Aim for at least 3–4 sentences for each tool description". A warning for Anthropic, a note for other targets.
- Long. Salyro's MCP Connect refuses a description over 4,000 characters, or a title over 200 — and every character is sent with every request that offers the tool.
Parameters
- An MCP tool with no
inputSchema: the specification says it MUST be a JSON Schema object, and recommends{ "type": "object", "additionalProperties": false }for no parameters. - A schema whose root is not
"type": "object". - A parameter with no
description, at any depth, and arequiredentry that names no property.
Schema compatibility
Each schema goes through the JSON Schema compatibility checker's rules for the chosen provider — a strict tool with the stricter rules — so a keyword the provider's page says it refuses is found here too. For an MCP server, the linter lists each provider whose page says it refuses the schema, since the server's tools reach whichever provider the client uses.
Shapes
A tool written in one provider's shape but checked for another — input_schema for OpenAI, say — is a warning: the other provider reads its schema from another key.
Token cost
The list is counted in your browser, for the model you choose: as compact JSON text (exact for OpenAI's models, whose tokenizer runs offline; an estimate for the others, labelled), and as the provider renders tool definitions where the provider documents it — OpenAI's cookbook formula for gpt-4o and gpt-4o-mini, itself an approximation. Elsewhere that is unknown. Every request that offers the tools pays for them again.
What it does not know
- Whether a description is accurate, or a tool does what it says. The rules are deterministic and read only the text.
- OpenAI's, Google's and xAI's name rules and description guidance: unknown until their pages can be read.
- The exact token cost at Anthropic, Google and xAI, which count through their own APIs.
FAQ
Why is a dot in a name fine for MCP but noted for a provider?
The MCP specification allows . in tool names. Anthropic's pattern does not, and Salyro's model-facing names do not either — a client passing the name through to a model has to rewrite it.
Does this connect to my MCP server?
No. It reads what you paste. Nothing is sent anywhere, and a share link carries only the settings, never your tools.
Sources
Name and description rules are Reference Data, each with the page it was read from and the date: Anthropic's "Define tools" page on platform.claude.com, and the MCP specification's source in its repository on GitHub. Salyro's bounds are MCP_CONNECT_MODEL_FACING_NAME_PATTERN and MCP_CONNECT_TOOL_*_MAX_LENGTH from Salyro's shared package.
Where the numbers come from
- Model and pricing data is a snapshot of the catalogue Salyro itself uses, taken when this site was built.
- Facts about models and providers that are not in that catalogue carry their own source and the date they were checked, and are shown as unknown where no reliable source exists.
