Will your tool schema compile?
Strict mode rejects a schema that looks perfectly valid in your editor. Paste one tool definition, a bare schema, or your whole toolset as a JSON array — then hit Fix it and get a repaired schema back.
What fails the request
additionalProperties: falsemissing on any object, nested ones included — the single most common 400. The API says "For 'object' type, 'additionalProperties' must be explicitly set to false"; OpenAI words it "additionalProperties is required to be supplied and to be false".- A property not listed in
required. Strict mode has no optional fields — express optionality as a union with null. oneOf/allOf— commonly rejected.anyOfworks, but not at the root.- Too much complexity — the per-request caps (20 strict tools, 24 optional parameters, 16 union-typed) and the compiled-grammar budget. The API answers "Schema is too complex for compilation." Paste the whole toolset to check the caps.
What compiles but gets silently dropped
- Bounds and patterns —
minimum,maximum,multipleOf,minLength,maxLength,pattern. The request succeeds and the constraint never reaches the model, so a length limit you thought you had isn't there. Enforce these yourself at the boundary. formatoutside the supported set — dropped without an error.$ref— support varies by vendor; verify it against your provider before relying on it.
That split is the point: a warning here means your schema will be accepted but is not doing what it says. Only the first list stops the request.
The rules above are the ones documented in Tool-calling JSON schemas, explained. Strict mode constrains the shape — it never checks your business rules, so validate those yourself at the boundary.
Prefer the terminal? The same checks ship as a zero-dependency CLI with CI-friendly exit codes — strict-schema-check on GitHub.
Also in this tool
- Fix it — applies the mechanical repairs (adds
additionalProperties: false, completesrequired, strips dropped keywords) and re-checks the result. Anything that would change meaning (oneOf,allOf, a rootanyOf) is reported for you to decide, never silently rewritten. - Toolset mode — paste a JSON array of tools and the per-request caps are checked across the whole set, which is the only way they mean anything.
- Non-strict aware — a tool definition that isn't marked
"strict": trueisn't rejected for any of this. Its findings are still shown, labelled as what you'd need to fix to turn strict mode on. - Shareable — the check is encoded into the page URL, so you can send someone a link to the exact schema that's failing. Nothing is uploaded: the schema lives in the fragment, which browsers never send to a server.
Going further than one schema
Tool schemas, memory, and a deployment path — the full $9 guide takes the loop from working to shippable.
See the guide