Turn a JSON Schema into docs people can actually read
A JSON Schema is precise but not pleasant to read, and for LLM tool definitions the parameter descriptions double as the contract the model reads to decide how to call your tool. This generator converts a schema — including OpenAI and Anthropic tool wrappers — into a clean Markdown reference table with types, required flags, allowed values, and defaults.
How it works
You paste a JSON Schema. If it is wrapped in a tool definition (OpenAI’s
function.parameters or Anthropic’s input_schema), the tool unwraps it
automatically. It then walks the properties map, recursing into nested objects
and array item schemas, and emits a Markdown table. Each row shows the parameter
name (with a dotted path for nested fields), its type, whether it is required,
any enum values or default, and the description. Invalid JSON is reported with
the parse error so you can fix it fast.
Why LLM tool schemas need human-readable docs
When you define a tool or function for an LLM to call, the parameter descriptions in the schema are not just for human readers — the model reads them at inference time to decide what arguments to pass. A schema with blank or vague descriptions is one of the most common causes of incorrect tool calls. The model cannot guess what t means or whether status should be "active" or "ACTIVE" without being told.
Converting the schema to a table makes it easy to audit:
- Which fields have missing descriptions (blank cells stand out immediately)
- Which fields use free-text strings where an
enumwould be more precise - Whether the
requiredarray matches what the code actually needs - Whether nested objects are documented or just shown as
objectwith no detail
What the output looks like
For a tool that searches a product catalog, the generator might produce:
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | The search term to match against product names and descriptions |
category | string (enum: electronics, clothing, food) | No | Filter results to a specific product category |
max_results | integer | No | Maximum number of results to return. Defaults to 10 |
filters.min_price | number | No | Minimum price in USD to include in results |
filters.in_stock | boolean | No | If true, only return products currently in stock |
This kind of reference makes it obvious that category has a fixed set of values (so a model calling this tool should not invent new ones) and that filters is a nested object.
Tips for better tool docs
- Write a description for every parameter. The model uses these to decide argument values; a blank description is a common cause of wrong tool calls.
- Use
enumfor closed sets. Documenting allowed values explicitly beats a free-text string the model has to guess at. - Mark required fields accurately. The generated table surfaces gaps where a
field is used but not listed in
required. - Include format hints in the description. If a
datefield expectsYYYY-MM-DD, say so — there is no JSON Schemaformatenforcement at call time; the model only reads the description. - Regenerate the docs whenever the schema changes so your reference never drifts from the actual contract.