ax-check rule
AXC-D001: Missing description
A tool, operation, command or skill has no description, so an agent has nothing to choose it by.
ax-check is a checker being prepared for release. This page documents the rule ahead of that release; see all 50 rules.
| Severity | error |
| Kind | Conformance. A finding is a fact about the input. |
| Mode | ax-check lint |
| Applies to | MCP tool lists, OpenAPI, SKILL.md, CLI help |
| Pattern tags | description, selection, discovery |
| Fix in one line | Write a description that says what the item does, when to use it and when to use a neighbour instead. |
A tool, operation, command or skill has no description. An agent chooses what to call by reading descriptions, so an item without one can only be picked by guessing from its name. This is the most basic gap on an agent-facing surface, and it is cheap to fix.
What it checks
For each item an agent can select, ax-check looks for description text:
- MCP: the tool’s
descriptionfield. - OpenAPI: the operation’s
summaryanddescription, joined. The rule fires only when both are missing or blank. - SKILL.md: a skill with no
descriptionin its frontmatter is reported once, by AXC-D022, rather than by this rule. - CLI help: the text next to a subcommand in the list of commands.
An empty string, or a string of only spaces, counts as missing.
Why it matters
In MCP, a client hands the model each tool’s name, description and input schema, and the model picks a tool from that list. A name such as create_invoice hints at the purpose, but it does not say what the tool needs, what it returns or when another tool is the better choice.
For skills the gap is stricter. The Agent Skills specification makes description a required, non-empty field that “Describes what the skill does and when to use it.” Anthropic’s skill authoring guidance (vendor guidance) says the description “enables Skill discovery”. A skill with no description may never be loaded at all, which is why ax-check treats it as invalid frontmatter (AXC-D022).
How to fix
Write a description that says what the item does, when to use it, and when to use a neighbour instead. Two or three short sentences are usually enough. See Write tool descriptions an agent can act on.
Example
Before
{
"name": "create_invoice",
"inputSchema": {
"type": "object",
"properties": {
"customer_id": { "type": "string", "description": "ID of an existing customer." },
"amount_pence": { "type": "integer", "description": "Invoice total in pence, at least 1." }
},
"required": ["customer_id", "amount_pence"],
"additionalProperties": false
}
}
After
{
"name": "create_invoice",
"description": "Creates a draft invoice for an existing customer and returns its ID. Use this when the user asks to bill a customer. Do not use this to change an invoice that already exists; use update_invoice instead.",
"inputSchema": {
"type": "object",
"properties": {
"customer_id": { "type": "string", "description": "ID of an existing customer." },
"amount_pence": { "type": "integer", "description": "Invoice total in pence, at least 1." }
},
"required": ["customer_id", "amount_pence"],
"additionalProperties": false
}
}
How ax-check detects it
The check is a plain presence test. ax-check trims the description and fires when nothing is left. For OpenAPI, an operation is named by its operationId, or by its method and path when there is no operationId.
What it deliberately leaves to other rules:
- The root of a CLI is checked for its flags only, so a program with no tagline does not trigger this rule.
- A skill with no description, or with frontmatter that is missing or does not parse, is reported by AXC-D022 instead, so one problem does not produce two findings. In practice this rule fires for MCP tools, OpenAPI operations and CLI subcommands.
- Text that is present but empty of meaning, such as “TODO”, is reported by AXC-D002, not here.
Known false negatives: any non-empty text passes this rule, however weak. AXC-D002, AXC-D003 and AXC-D015 catch some weak descriptions. False positives are rare. If an item is deliberately hidden from agents and never offered to a model, silence the rule with --disable AXC-D001 (the flag can be repeated, or given a comma-separated list), but a short description is usually the better answer.
Sources
- Specification: Tools, Model Context Protocol specification, revision 2026-07-28. https://modelcontextprotocol.io/specification/2026-07-28/server/tools . Defines a tool by its name, description and input schema, which a client passes to the model.
- Specification: Agent Skills specification, agentskills.io, retrieved 2026-10-08. https://agentskills.io/specification . Makes
descriptionrequired and non-empty, and says it “Describes what the skill does and when to use it.” - Vendor guidance: Skill authoring best practices, Anthropic, retrieved 2026-10-08. https://docs.claude.com/en/docs/agents-and-tools/agent-skills/best-practices . Says the description “enables Skill discovery and should include both what the Skill does and when to use it.”
- Site guide: Write tool descriptions an agent can act on, agentexperience.tech. https://agentexperience.tech/insights/tool-descriptions/ . Explains what a useful description contains.
Related evidence
Records in the AX evidence register that share a pattern tag with this rule. A shared tag means the record is about the same pattern, not that it tests this rule. Read the evidence class before the number.
- EV-0019: Skill selection precision collapses as the skill pool grows (Preprint). A preprint reports that as the pool of available skills grew from 5 to 100, the precision with which agents actually used the right skill fell from 29.6% to 3.3%.
- EV-0020: Praise and list order move tool selection (Preprint). A preregistered preprint with two small OpenAI models found that stacked praise in a tool description raised its pick rate by about 43 percentage points, and that with identical listings the first-listed tool was picked about 72 points more often.
- EV-0001: An enum in the schema ends silent failures from example-only vocabularies (Preprint). SilentProbe (preprint) reports that a vocabulary a parameter description only exemplified ("e.g.") was missed on 88 of 88 attempts across twelve models, and that promoting it into the schema cut the failure to 0 of 89.
- EV-0003: Error text that names the next tool lifts recovery (Preprint). A preprint testing five OpenAI models reports that an expired-credential error naming a terminal command left 45% of tasks recovered, naming the server's login tool instead raised recovery to 84%, and on rate limits naming the call to repeat raised recovery from 6% to 88%.
- EV-0013: FAQ blocks and structured data showed no citation effect within a domain (Preprint). An observational study of about 2 million AI-engine citations (preprint) found that FAQ blocks, structured data and Core Web Vitals had positive effects on citation in pooled data that reversed or fell to zero once domain fixed effects were applied.
- EV-0018: Skill rules that name a command or path change what agents do (Preprint). A study of 3,159 skills (preprint) found that adding a checkable rule raised the rate at which four coding agents took the required action by +0.23 on average, with the gain coming mainly from rules naming a command or path the old skill did not mention.
