Which JSON Schema features do MCP servers actually use?
default appears on 17.2% of parameters — more than enum. format is 2.1%, pattern 1.6%, and examples 0.3%. Most of JSON Schema goes unused.
inputSchema is JSON Schema, so a parameter can carry a great deal more than a type and a description. Almost none of it does.
Across 257,287 parameters on 4,749 public MCP servers:
| Keyword | Parameters | Share |
|---|---|---|
default |
44,156 | 17.2% |
enum |
20,263 | 7.9% |
title |
19,788 | 7.7% |
minimum |
14,464 | 5.6% |
items |
13,903 | 5.4% |
maximum |
12,121 | 4.7% |
minLength |
8,862 | 3.4% |
maxLength |
8,434 | 3.3% |
format |
5,326 | 2.1% |
pattern |
4,116 | 1.6% |
examples |
768 | 0.3% |
const |
130 | 0.1% |
default is the most-used feature, and that is interesting
More parameters carry a default than an enum. That is not what we expected, and it says something about how these schemas get built: default is the keyword that survives generation from a typed source, because a function signature with limit = 20 has somewhere obvious to put it.
It is also the keyword with the least ambiguous payoff. A parameter with a sensible default is a parameter the model does not have to invent a value for — which removes a whole category of argument error rather than documenting it. If you are adding one keyword to your schemas, this is a better candidate than most.
One caveat worth knowing: default in JSON Schema is annotation, not behaviour. It does not fill the value in — the client or your handler has to. A default the model reads and your server ignores is a mismatch that only shows up under traffic.
examples at 0.3% is the real gap
768 parameters out of 257,287.
That is striking because an example is the single most useful thing you can hand a model that is filling in a field. A description says what the field means; an example shows the exact string that works. And the corpus’s most common fault is parameters with no description at all — so the field that would help most is used least, in a population where the baseline field is missing a fifth of the time.
The comparison that makes the point: format (2.1%) is used seven times more often than examples, and format: "date-time" tells a model far less than "examples": ["2026-08-25T14:22:31Z"]. One names a standard; the other shows the string.
format and pattern are barely used, and that is defensible
2.1% and 1.6%.
format is the weaker case for adoption than it looks. Most JSON Schema validators treat it as annotation by default, so format: "email" frequently enforces nothing — it is a hint dressed as a constraint. If you want an email validated, your handler validates it.
pattern genuinely constrains, and 1.6% is probably about right. A regex in a schema is read by the model as text, and a model that gets a regex wrong produces a rejected call it cannot diagnose — the same failure mode as a closed set written in prose. For a truly rigid format it earns its place; for most fields a described example does more.
minimum and maximum are the quiet win
5.6% and 4.7% — and unlike format, these do exactly what they say with no interpretation.
A limit parameter with minimum: 1, maximum: 100 cannot receive 10,000, so the model cannot ask for a payload that will be rejected or, worse, silently truncated. On a numeric parameter this is close to free and it is used on roughly one in twenty.
What we would actually add
In order, given the corpus:
- A
descriptionon every parameter. 21.5% do not have one. Nothing below matters until this is done. - An
examplesentry on anything with a format — dates, IDs, query syntax. 0.3% usage, and the highest information per byte in the whole keyword list. - A
defaultwherever one is sensible. Already the most-used feature; it removes the guess entirely. minimum/maximumon numbers. Free, unambiguous, prevents a request that cannot be served.- An
enumwherever the set is closed — and particularly on the 857 parameters that name their values in prose and leave the schema open.
And the ones to be relaxed about: title (7.7%, and it duplicates a good name), format (annotation, not enforcement), const (a constant is a parameter that should not exist).
What this cannot tell you
We counted keywords on top-level inputSchema.properties. Nested fields are excluded, for the same comparability reason as everywhere else in the survey.
Presence is not correctness. A pattern that does not match the values the server accepts is worse than no pattern, and we cannot evaluate that from outside. Same for default — we can see one is declared, not whether anything applies it.
And no model was run against these servers, so the ranking above is reasoning from what each keyword tells a model, not a measurement of which ones reduce errors. That ordering is exactly the kind of thing the follow-up study should overturn.
Measuring your own
The schema checker reports your enum coverage and flags the parameters that describe a closed set without constraining it. It runs in your browser and nothing is uploaded.
Data in getmcpulse/mcp-schema-study.