Make tools match real tasks
A good tool names the job, not the plumbing behind it.
Is Agenticis-agentic.com
The score is an at-a-glance summary; the individual checks and evidence are the useful part of the report.
Notes from the Is Agentic checks and report format.
Pick a tool for the request
Change the request and compare the plans.
Generic primitivesBad
get_recordpatch_recordsend_request
send_request(method, path, body)Task-shaped toolsGood
refund_orderget_order_statusreschedule_delivery
refund_order(orderId, reason)const refundOrder = tool({
description: 'Refund one paid order after checking eligibility.',
inputSchema: z.object({
orderId: z.string().describe('The public order ID'),
reason: z.enum(['duplicate', 'late', 'customer_request']),
}),
outputSchema: z.object({
refundId: z.string(),
status: z.literal('pending'),
}),
needsApproval: true,
});
Why it matters, pros and cons
Why it matters
Generic primitives expose your database shape and make the model reconstruct business rules. A task-shaped tool keeps those rules on your side.
Pros
- Fewer calls and fewer invented fields.
- Descriptions can state real preconditions.
- Authorization sits behind one business action.
Cons
- Huge tools can become vague mini-APIs.
- New tasks still need new capabilities.
- Read-only primitives can be useful for exploration.