L LocalUse Source

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.

Show
Tool definition, array, or request body
Output

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.

More inspect tools