MCP & AI InfrastructurePattern Posts

MCP Tool Naming: Why Names Are Your Most Important API Decision

How AI models interpret tool names, and why it matters.

The Prompt Engineering Project February 28, 2025 6 min read

Quick Answer

MCP tool naming directly affects how reliably AI models select and invoke the correct tool. Use verb-noun format like "search_documents" or "create_user", keep names under 40 characters, be specific rather than generic, avoid abbreviations, and write descriptions that explain when to use the tool versus alternatives. Good MCP tool naming is the difference between reliable tool use and frequent misselection.

In traditional API design, the name of an endpoint is a convenience for developers. It matters for readability and documentation, but the code calling it is written by a human who read the docs and understands the purpose. In MCP, the consumer of your API is not a human. It is a language model that uses the tool name -- along with its description -- to decide whether and how to invoke it. This makes tool naming the most consequential API design decision you will make.

A well-named tool gets called correctly in the right situations. A poorly named tool gets called at the wrong time, with the wrong arguments, or not at all. And unlike a human developer who can be retrained or can read updated documentation, a model makes its tool selection decision fresh on every request, based almost entirely on the name and description you gave it. There are no second impressions.

Principle 1: Verb-Noun Pattern

Every tool name should follow a verb-noun pattern that describes what the tool does and what it acts on. The verb communicates the action. The noun communicates the target. Together, they form a self-documenting name that a model can interpret without reading the description.

Instead of

documentSearcher, emailManager, dataProcessor

Try this

search_documents, send_email, process_invoice

The verb-noun pattern works because it aligns with how language models parse intent. When a user says "find me the latest sales report," the model maps "find" to a search verb and "sales report" to a document noun. A tool named search_documents is a direct match. A tool named documentSearcher requires the model to parse the compound word, reverse the order, and infer the action -- an unnecessary cognitive load that reduces selection accuracy.

Use snake_case, not camelCase. Most MCP implementations follow this convention, and models have seen far more snake_case tool names in their training data than camelCase alternatives.

Principle 2: Specific Over Generic

Generic names create ambiguity. When a model sees a tool called get_data, it has no way to know whether that tool retrieves customer records, product inventory, or server metrics. It will either guess wrong or avoid using the tool entirely because it cannot determine relevance with confidence.

Specific names eliminate this problem. get_customer_by_email tells the model exactly what the tool does, what it needs as input, and what it returns. The model can match this against user intent with high confidence.

Instead of

get_data, update_record, run_query

Try this

get_customer_by_email, update_ticket_status, search_knowledge_base

There is a reasonable objection here: what about tools that genuinely serve multiple purposes? The answer is that multi-purpose tools should be split into single-purpose tools. A tool that retrieves customers, products, and orders based on a type parameter is one tool for humans and three tools for models. Define get_customer, get_product, and get_order separately. The model selects the right one. The implementation can share code underneath.

A model choosing between three specific tools is more reliable than a model choosing the right parameter for one generic tool.

Principle 3: Consistent Vocabulary

Pick a verb vocabulary and use it everywhere. If you use create for one resource, do not use add for another and new for a third. Consistency allows the model to learn your API's conventions from the tool list itself, improving selection accuracy across the entire set.

consistent-vocabulary.txt
Recommended verb vocabulary for CRUD operations:

  create_*    -- Create a new resource
  get_*       -- Retrieve a single resource by identifier
  list_*      -- Retrieve a collection of resources
  update_*    -- Modify an existing resource
  delete_*    -- Remove a resource

Recommended verb vocabulary for actions:

  search_*    -- Query with filters, return ranked results
  send_*      -- Dispatch a message or notification
  validate_*  -- Check input against rules, return pass/fail
  generate_*  -- Produce new content or artifacts
  analyze_*   -- Examine data, return insights

Avoid mixing:

  create_ticket + add_comment + new_project     -- inconsistent
  create_ticket + create_comment + create_project -- consistent

This consistency principle extends to nouns as well. If your data model calls it a "ticket" in one place and a "case" in another, the model must figure out that they refer to the same concept. Standardize on one term per entity across all tool names.

Principle 4: Avoid Ambiguity

The most dangerous tool names are the ones that sound clear to you but are ambiguous to the model. send is a perfect example. Send what? An email? A Slack message? A push notification? A webhook payload? If your server has all four, a tool named send will be selected incorrectly roughly half the time.

The test for ambiguity is simple: look at your tool list as a flat set of names, without descriptions. Can you tell what each tool does and when to use it from the name alone? If two tools could plausibly handle the same user request based on their names, at least one of them needs to be renamed.

pep-mcp-server-tools.ts
// Real tool definitions from the PEP MCP server
// Note: each name is unambiguous even without descriptions

const tools = [
  { name: 'search_prompt_library',     description: 'Search prompts by keyword, tag, or category' },
  { name: 'get_prompt_by_id',          description: 'Retrieve a single prompt with full metadata' },
  { name: 'list_prompt_categories',    description: 'List all available prompt categories' },
  { name: 'validate_prompt_structure', description: 'Check a prompt against best-practice rules' },
  { name: 'get_model_recommendations', description: 'Suggest which model to use for a given task' },
  { name: 'analyze_token_usage',       description: 'Count tokens and estimate cost for a prompt' },
]

// Anti-pattern: ambiguous names that cause mis-selection
const badTools = [
  { name: 'search',   description: 'Search for things' },         // search what?
  { name: 'get',      description: 'Get a resource' },            // which resource?
  { name: 'validate', description: 'Validate input' },            // what kind of input?
  { name: 'analyze',  description: 'Analyze something' },         // analyze what?
]
The description field is your second chance to disambiguate. If two tools have similar names, their descriptions must make the distinction crystal clear. But do not use descriptions as a crutch for lazy naming. The name should carry as much meaning as possible on its own.

When Bad Names Cause Real Failures

Bad tool naming does not produce error messages. It produces incorrect tool selection -- the model confidently calls the wrong tool, gets an unexpected result, and either returns a confusing response to the user or enters a retry loop that burns tokens and adds latency.

Consider a server with two tools: get_user and get_account. In your data model, a user is an individual person and an account is the organization they belong to. But the model does not know your data model. When a user says "look up Acme Corp," the model has to guess whether Acme Corp is a user or an account. It guesses wrong 40% of the time.

The fix is to encode the distinguishing information into the name: get_user_by_email and get_organization_by_name. Now the model knows that users are identified by email and organizations by name. When the user says "look up Acme Corp," the model selects the organization tool because a company name is obviously not an email address. Selection accuracy jumps from 60% to 98%.

This is not a hypothetical improvement. In our testing across production MCP servers, renaming tools from generic to specific patterns reduced incorrect tool selection by an average of 35%. That translates directly to fewer failed requests, lower token costs from retries, and better user experience.

Renaming your tools costs nothing. Incorrect tool selection costs tokens, latency, and user trust on every failed request.


Key Takeaways

1

Tool names are the primary signal models use for tool selection. A clear name is worth more than a detailed description.

2

Use verb_noun pattern with snake_case: search_documents, create_ticket, get_customer_by_email. The name should be self-documenting.

3

Specific beats generic. Split multi-purpose tools into single-purpose tools. Three specific tools are more reliable than one generic tool with a type parameter.

4

Standardize your verb vocabulary (create/get/list/update/delete) and use it consistently across every tool in your server.

5

Test for ambiguity by reading your tool list as names only. If two tools could plausibly match the same request, rename until they cannot.

Frequently Asked Questions

Common questions about this topic

Context Delivery Patterns: Feeding AI the Right InformationDebugging Prompts: A Systematic Approach

Related Articles

MCP & AI Infrastructure

The MCP Pattern: Giving AI Tools It Can Actually Use

What problem MCP solves, how our server works, and the tool design patterns that make AI agents actually useful.

MCP & AI Infrastructure

Building an MCP Server: Architecture Decisions

Language choice, transport layer, tool registration, error handling, security model, testing, and deployment for a produ...

MCP & AI Infrastructure

Context Delivery Patterns: Feeding AI the Right Information

The information you feed an AI agent matters as much as the instructions you give it. Four patterns for getting context ...

All Articles