A tool schema carries two different kinds of content. The JSON structure says what a valid call looks like: property names, types, required keys, nesting. The natural-language surface says what the tool is for and when to reach for it. Models use both, but selection lives almost entirely in the second one. When a model decides whether to call a tool at all, and which of several candidates fits, it is matching the user's sentence against the name string, the description block and the enum values it can see.
The mechanics are ordinary function calling. You describe available tools as schemas in the request, the model decides whether to call one, and it returns structured arguments that your application executes (OpenAI's function calling guide). The same pattern appears across providers with small syntax differences: in the Anthropic API the schema arrives under input_schema; in OpenAI's it sits under parameters inside a function object (Prefect's MCP vs function calling comparison). That portability gap is one reason the Model Context Protocol exists at all: a server publishes tools once and any compatible client discovers them at runtime, so the same names and descriptions travel across hosts (MCP specification overview).
That runtime discovery makes the wording more important, not less. With function calling you control the tool list on every request. With MCP, tools arrive from a server you may not have written, and the client surfaces whatever name, title and description that server publishes (MCP resources and discovery patterns). The protocol itself treats tool descriptions as untrusted material and asks hosts to get explicit consent before invoking anything (MCP security principles). In other words: the model reads the description, but you should not assume it is honest or well written.
Here is the decision rule that follows. If a request could plausibly match two tools, the fix is almost never in the JSON Schema. It is in the name, the description or the enum. Rewrite those three first, re-run your test prompts, and only then look at parameters.



