Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when writing an agent-facing tool/function definition: follow the fixed house docstring shape, format param, error-code vocabulary, and MCP naming.
.claude/skills/agent-tool-definition-style/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 94% | 17 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.5-flashbest | +96% | — | 0% | 24 | 86d ago |
| gemini-3.6-flash | +77% | +137% | 0% | 22 | 54d ago |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✗→✓ | ▲ Improved | — | — |
When you write a tool (function signature + docstring) that an LLM agent will call, or a prose line telling an agent which MCP tool to use, emit it in this exact house style. These are arbitrary conventions, not general advice — conform literally.
verb_noun in lowercase snake_case: get_customer,create_order, cancel_subscription, refund_payment, schedule_appointment.
customer_get), never camelCase(getCustomer), never PascalCase (GetCustomer), never a bare noun (customer).
<entity>_id: customer_id, order_id,invoice_id, user_id, ticket_id, payment_id.
id, never identifier, never customerId (camelCase), never pk.The docstring has exactly these five parts, always in this order:
record by ID."). Never "Helps with…", never "Can be used for…", never a noun phrase ("Customer retrieval.").
Use when: — a section literally headed Use when: with 2–4 bullettrigger conditions (when an agent should reach for this tool).
Args: — every parameter listed with its type AND a concrete formatexample (not just "the customer id" — Format "CUST-######", e.g. "CUST-000042").
Returns: — a description of the output shape.Errors: — the named error codes (see rule 5).format parameterformat: str = "concise"."concise" and "detailed". The default is"concise". Never invent a third value ("summary", "full", "verbose"), never default to "detailed", never use a bool like verbose=False.
UPPERCASE_SNAKE code drawn from this vocabulary:NOT_FOUND, INVALID_FORMAT, MISSING_FIELD, UNAUTHORIZED.
valid value. Never just "failed", "error", or "invalid input".
tool, write the fully qualified ServerName:tool_name with a colon: BigQuery:bigquery_schema, GitHub:create_issue.
bigquery_schema. Never a dot (BigQuery.bigquery_schema),never a slash (BigQuery/bigquery_schema).
BEFORE (base default — noun-first or camelCase):
pythondef customerGet(id): ... def customer_lookup(id): ...
AFTER (house style):
pythondef get_customer(customer_id: str, format: str = "concise"): ...
BEFORE:
pythondef get_order(id: str): ... def get_order(identifier: str): ...
AFTER:
pythondef get_order(order_id: str, format: str = "concise"): ...
BEFORE (free-form prose, no fixed sections):
pythondef get_invoice(invoice_id): """Look up an invoice. Pass the invoice id and it returns the invoice."""
AFTER:
pythondef get_invoice(invoice_id: str, format: str = "concise"): """ Retrieve an invoice by ID. Use when: - The user asks about a specific invoice's amount or status. - Invoice context is needed before issuing a refund. Args: invoice_id: Format "INV-######", e.g. "INV-000042". format: "concise" (key fields) or "detailed" (full record). Default "concise". Returns: Invoice object with the requested fields. Errors: NOT_FOUND: No invoice with that id; verify the id and retry. INVALID_FORMAT: id must match INV-######, e.g. "INV-000042". """
BEFORE:
pythondef get_account(account_id, verbose=False): ... def get_account(account_id, mode="full"): ...
AFTER:
pythondef get_account(account_id: str, format: str = "concise"): ...
BEFORE (prose, no recovery signal):
pythonreturn {"error": "Customer lookup failed."}
AFTER:
pythonreturn { "code": "INVALID_FORMAT", "message": "order_id '12345' is not valid; expected CUST-######, e.g. 'CUST-000042'. " "Reformat the id and retry.", }
BEFORE:
textUse the bigquery_schema tool to fetch table schemas.
AFTER:
textUse the BigQuery:bigquery_schema tool to fetch table schemas.
format param. Rule 4 is for reads only.create_order, cancel_subscription, refund_payment do NOT get a format parameter — only get/retrieve/lookup/fetch tools do.
<entity>_id shape: a calendar event's id isevent_id (or calendar_event_id), a support ticket's is ticket_id. The verb may have a noun suffix too (update_customer_email) — still verb-first snake_case.
send_notification keyed on a recipient)still names that recipient user_id, not to or recipient.
UPPERCASE_SNAKE code (e.g. RATE_LIMITED), with the same recovery + example rule.
Use when: with a single trigger is too thin — give 2–4 bullets. If the tooltruly has one trigger, it is probably over-narrow; consolidate, but still write ≥2.
verb_noun. DON'T put the noun first or use camelCase.<entity>_id. DON'T use bare id or identifier.Use when: heading. DON'T fold triggers into the first line.Args parameter. DON'T write"the customer id" with no example.
format: str = "concise" to read tools. DON'T use verbose=, mode=,or default to "detailed".
UPPERCASE_SNAKE error codes with a fix + valid example. DON'T return"failed" or "invalid input".
ServerName:tool_name. DON'T reference the bare tool name.customer_lookup, CustomerGet) instead ofverb-first get_customer.
id parameter instead of customer_id.Use when: heading and no fixed sectionorder.
format parameter on read tools, or invents verbose/mode/a thirdvalue.
UPPERCASE_SNAKE named codes with a valid-value example.
bigquery_schema) with no ServerName:prefix.
verb_noun snake_case.<entity>_id, never bare id.Use when: → Args: → Returns: → Errors:.format: str = "concise" (only concise/detailed).UPPERCASE_SNAKE with a fix + concrete valid example.ServerName:tool_name with a colon.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.5-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +77 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 6/27/2026 | +96% |
Other measured skills in the registry, with their headline benchmark lift.