Public example — a fictional catalog server with deliberate design smells. No install or paste required.

Audit your own server
~1,479 tokens per conversation
21 tools, injected before the user says anything · o200k_base, approximate
C
79/100
example-catalog v1.0.0
surface85
naming90
descriptions81
schemas82
annotations88
design49

Findings

1 errors · 34 warnings · 8 info

warnannotations/missing-hintscreate_record
Mutating tool "create_record" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.
warnannotations/missing-hintsupdate_record
Mutating tool "update_record" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.
warnannotations/missing-hintsdelete_record
Mutating tool "delete_record" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.
Mutating tool "create_entry" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.
Mutating tool "update_entry" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.
Mutating tool "delete_entry" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.
Description is 1601 chars (maximum 1500) — move detail into parameter descriptions.
warndescriptions/too-shortupdate_record
Description is 7 chars (minimum 20) — too short to disambiguate.

Update.

warndescriptions/too-shortfetchAllItems
Description is 12 chars (minimum 20) — too short to disambiguate.

Fetch items.

warndesign/client-directivessearch_widgets
Description contains 3 client-directive sentence(s) (~34 tokens) about rendering or other tools, duplicated across multiple tools — move shared guidance to one server-level place.

IMPORTANT: RENDER RESULTS IMMEDIATELY. Always display the map widget and format every widget link as markdown. Do not call get_widget after this tool returns.

warndesign/client-directivessearch_widgets_by_text
Description contains 3 client-directive sentence(s) (~34 tokens) about rendering or other tools, duplicated across multiple tools — move shared guidance to one server-level place.

IMPORTANT: RENDER RESULTS IMMEDIATELY. Always display the map widget and format every widget link as markdown. Do not call get_widget after this tool returns.

warndesign/client-directivessearch_widgets_nearby
Description contains 3 client-directive sentence(s) (~34 tokens) about rendering or other tools, duplicated across multiple tools — move shared guidance to one server-level place.

IMPORTANT: RENDER RESULTS IMMEDIATELY. Always display the map widget and format every widget link as markdown. Do not call get_widget after this tool returns.

Same parameter spelled 2 ways across tools — pick one spelling.

"widget_id" (get_widget, get_widget_images, get_widget_reviews, create_record) vs "widgetId" (get_record)

CRUD mirror over "record": 5 tools spanning 4 verb classes — one-tool-per-endpoint shape. Consider a workflow-shaped consolidation.

create_record, get_record, list_records, update_record, delete_record

CRUD mirror over "entry": 4 tools spanning 4 verb classes — one-tool-per-endpoint shape. Consider a workflow-shaped consolidation.

create_entry, get_entry, update_entry, delete_entry

3 tools open with the same 15 words (~45 tokens duplicated across the surface) — move the shared block to one place and lead with what each tool does.

search_widgets, search_widgets_by_text, search_widgets_nearby — "important render results immediately always display the map widget and format every widget link as…"

warndesign/enum-in-prosesearch_widgets
Parameter "sort" enumerates its values in prose but declares no enum.

Sort order. One of: relevance, price, rating.

warndesign/list-no-limitsearch_widgets_by_text
"search_widgets_by_text" implies list/search output but has no limit or pagination parameter — result size is unbounded.
warndesign/list-no-limitsearch_widgets_nearby
"search_widgets_nearby" implies list/search output but has no limit or pagination parameter — result size is unbounded.
warndesign/list-no-limitlist_records
"list_records" implies list/search output but has no limit or pagination parameter — result size is unbounded.
warndesign/list-no-limitlist_entries
"list_entries" implies list/search output but has no limit or pagination parameter — result size is unbounded.
3 tools share the name prefix "search_widgets" — likely one tool with include-flags or a mode parameter.

search_widgets, search_widgets_by_text, search_widgets_nearby

3 tools share the name prefix "get_widget" — likely one tool with include-flags or a mode parameter.

get_widget, get_widget_images, get_widget_reviews

3 tools have overlapping descriptions (trigram Jaccard up to 0.81) — consolidation candidates.

search_widgets, search_widgets_by_text, search_widgets_nearby

warnnaming/conventionexportData
Tool "exportData" is camelCase while the dominant convention is snake_case (19 tools).
warnnaming/conventionfetchAllItems
Tool "fetchAllItems" is camelCase while the dominant convention is snake_case (19 tools).
warnschemas/looseget_entry
Bare "type: object" with no properties at /inputSchema — the model has nothing to go on.
warnschemas/looselist_records
Untyped array at /inputSchema/properties/ids — declare "items".
warnschemas/looselist_entries
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.
Server exposes 21 tools (warn threshold 20 exceeded). Consider consolidating into fewer intent-shaped tools.
infoannotations/missing-hintscreate_record
Mutating tool "create_record" has no title — clients show the raw name in confirmation prompts.
infoannotations/missing-hintsupdate_record
Mutating tool "update_record" has no title — clients show the raw name in confirmation prompts.
infoannotations/missing-hintsdelete_record
Mutating tool "delete_record" has no title — clients show the raw name in confirmation prompts.
Mutating tool "create_entry" has no title — clients show the raw name in confirmation prompts.
Mutating tool "update_entry" has no title — clients show the raw name in confirmation prompts.
Mutating tool "delete_entry" has no title — clients show the raw name in confirmation prompts.
Enum [basic, pro, max] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

shared_enum_a/properties/tier; shared_enum_b/properties/tier

Good pattern: "get_widget" documents when NOT to use it. Preserve this in any consolidation.

Only call when the user explicitly asks for details about a specific widget.