required is a block. every optional is a default.When you mark a parameter as required, you're telling the model: "without this, don't call the tool". The model respects that strictly. If it doesn't have the data, it'll ask the user, look in another tool, or give up. it won't invent the field (usually).
That sounds great until you required everything. Then:
That's why required isn't the "safe" choice. it's a product decision.
Mark it required only if:
transfer_credits(from, to, amount). all three required. Without amount, what are we transferring?mark_item_low_stock without reason leaves a useless record for auditing. Required by product.Leave it optional when:
list_inventory_items() with no filters returns everything. That's valid and useful.notes, tags, priority when there's a reasonable default.| Side | Cost |
|---|---|
| Required when it could be optional | The model asks the user for extra data. friction. Sometimes doesn't invoke for fear of being wrong. |
| Optional when it should be required | The model invokes with empty fields. the handler crashes or returns garbage. worse than not invoking. |
Practical rule: the bare minimum in required, the rest optional with explicit defaults. If in doubt, write it in the description: "If
categoryis not specified, returns all active items." The model reads. and respects.
On the right you have six parameters from tools you've already seen. Drag them to the correct slot.