Tool Definition Linter
Paste a tool definition, a tools array, or an entire request body. Every rule checked here corresponds to something the API enforces or something that quietly changes how the model behaves — this is a validator, not a style guide.
Output appears here as you type.
Runs entirely in your browser. Nothing you paste here is uploaded or stored.
Questions
Is what I paste sent anywhere?
No — and it is worth being concrete about why that matters here. A prompt, a captured response and a tool definition all contain the things people are most careful with: system instructions, customer data, internal endpoints. Every tool on this page is a pure function running in your tab, on a page whose Content-Security-Policy sets connect-src to ‘none’, so the browser will not let it open a network connection at all.
Which API do these target?
The Anthropic Messages API. Other providers use different shapes for the same concepts, and emitting a format from memory is exactly how a tool ends up confidently wrong — so rather than guess, this section covers the one it can be precise about.
What does it actually check?
Strict mode requiring a closed schema and a required array; required entries naming properties that exist; custom tools reusing the name of an Anthropic-defined tool such as bash or memory, which produces a different tool than the author expects; server-defined tools carrying an input_schema they should not have; duplicate names; every tool being deferred, or the tool-search tool deferring itself, both of which return a 400; and mcp_servers declared without the matching mcp_toolset entry.
Why is naming a tool "bash" an error?
Because the built-in bash tool is identified by its type, not its name, and takes no schema of yours. A custom tool that merely borrows the name is a completely separate tool — the model does not get the built-in behaviour, and nothing in the response says so.