solidcodersolidcoder
Explore Courses
solidcodersolidcoder
CoursesAboutPrivacy PolicyTerms
© 2026 solidcoder · Practical courses for software engineering interviews.
Home/AI Engineering/Connection Layer (MCP)/Designing Tools People Actually Use
Chapters — Connection Layer (MCP)▾

Designing Tools People Actually Use

MCP·Building With It·7 min read·Sep 5, 2026

Why goal-oriented tools beat granular ones, and how a tool's description determines whether an AI model uses it correctly.

Design for the goal, not the operation

A common early mistake is mirroring your codebase's internal structure directly into tools, one tool per low-level operation. It maps cleanly to how a database client works, which is exactly the problem: an AI model isn't a database client. It has to plan a sequence of calls itself, and every extra step is another place for that plan to go wrong.

✕ Too granular
open_ticket(customer_id), add_comment(ticket_id, text), set_priority(ticket_id, level), close_ticket(ticket_id)
Open in ChatGPT ↗

Four separate tools for what is, from the customer's side, one action: reporting a problem. The model has to correctly sequence all four calls itself, in the right order, every time, with no room for the server to enforce that order.

✓ Goal-oriented
log_support_issue(customer_id: str, summary: str, severity: str) -> dict
Open in ChatGPT ↗

One call that creates the ticket, sets its priority, and returns both the ticket id and a suggested next step. The server owns the sequence internally, so it can't be called out of order because there's only one call to make.

This doesn't mean collapsing everything into a single giant tool either. The test is whether a tool corresponds to something a person would actually describe as one task. "Log a support issue" is one task. "Open a connection, then separately run a query, then separately close the connection" is three steps of one task, artificially separated.

The description is the interface

An AI model doesn't read your source code. It decides whether and how to call a tool based entirely on its name and its description. A vague description doesn't just look unpolished, it actively produces wrong tool calls.

✕ Vague description
@mcp.tool() async def handle_ticket(data: str) -> str: """Handle the ticket"""
Open in ChatGPT ↗

The model has no idea what "handle" means here, what shape "data" should be, or what it gets back. It will guess, and it will guess wrong at least some of the time.

✓ Complete description
@mcp.tool() async def triage_support_ticket( customer_id: str, issue_summary: str, urgency: str = "normal", ) -> dict: """Create and route a support ticket. Args: customer_id: The reporting customer's account id issue_summary: A one or two sentence description of the problem urgency: One of 'low', 'normal', 'high', or 'critical' Returns: A dict with the new ticket id, assigned queue, and estimated response time """
Open in ChatGPT ↗

Every input is named and typed, every value has a stated meaning, and the return shape is described up front. The model can construct a correct call without ever seeing the function body.

A short checklist for any tool you write
Name it after the goal
resolve_customer_issue, not process_data.
State every parameter's meaning
Not just its type. "urgency: one of low, normal, high, critical" beats "urgency: str".
Describe the return shape
So the model knows what to expect back before it calls.
Keep the scope to one real task
If explaining it takes "and then," it's probably two tools or one tool doing too much.
Up next3/3
Part 3 · Building With It
← Prev Section
How It Works
How the Pieces Fit Together
Next Section →
Running It Well
Security and Trust Boundaries
Part of a free guide

Connection Layer (MCP)

A simple guide to MCP, the protocol that lets AI tools talk to the outside world.

Browse All Guides →
On this page
  • Design for the goal, not the operation
  • The description is the interface