MP010: generic-tool-name¶
Tool names like
search,get, orruncarry no information.
At a glance¶
| Category | naming |
| Default severity | warning |
| Auto-fixable | no |
| LLM-gated | no |
| Stable since | v0.1.0 |
What this rule checks¶
mcpolish keeps a built-in list of words that, on their own, do not tell an agent what the tool does. The default list:
search, query, get, list, fetch, run, do, call, execute,
process, handle, request, send, load, save, update, delete,
create, read, write, go
If a tool's name (lowercased) is exactly one of these words, MP010 fires.
Why it matters¶
Wang et al. (2026) section 4.3 catalogued the "low-information name" smell. Their controlled experiment showed an 8.8 percentage point increase in wrong-tool selection (p<0.001) when a tool used a single-verb name. The agent has nothing to disambiguate search from another server's search except the descriptions, which is the wrong place to do that work.
Example: code that triggers this rule¶
@mcp.tool()
def search(q: str) -> list:
"""Use this when the user wants to find an item. Returns a list of ids."""
return [q]
MP010 fires because search is on the generic list.
Example: how to fix it¶
@mcp.tool()
def search_memories(query: str) -> list:
"""Use this when the user wants to find a stored memory.
Args:
query: Search terms. Example: "kubernetes".
Returns: a list of matching memory ids.
"""
return [query]
The name now carries information about what is being searched.
Configuration¶
[tool.mcpolish.MP010]
allow = ["search"] # whitelist this one
extra = ["dispatch", "invoke"] # extend the generic list
allow removes a name from the generic list for this project. extra adds names that mcpolish does not flag by default.
When to disable this rule¶
If your server's only tool genuinely is the canonical search (and your namespace provides full context), whitelist via allow. Disable globally only if your team's naming convention is intentionally short across the board.
How the check works under the hood¶
For each tool, mcpolish lowercases the name and compares it to the union of the built-in list and extra, minus allow. Exact match fires the rule.
Multi-word names like search_notes do not match because the lookup is on the whole name, not on tokens.
Related rules¶
- MP011 redundant-prefix: namespace prefixes that bloat without adding information.
- MP013 name-collision-cross-server: when your name collides with public servers.
References¶
- Wang et al., 2026. arXiv:2602.18914, section 4.3.