Tool Surface Map
Reference / evidence, not a decision. This document maps the MCP tool surface and scores it against current tool-call best practices so removal and refactor candidates are visible in one place. It authorises nothing. Which tools exist is decided by ADR-023; consolidation of the deferred clusters by ADR-024; tool-call conformance by ADR-026. Any actual removal runs through an ADR Decision, then
retirement.pyper asset, then its own admission. Candidates below are discoveries.
Measured on main, 2026-09-02. Line references drift; re-verify with the command in
each row before relying on one.
How the surface worksโ
| Concern | Where | Note |
|---|---|---|
Wire registration (tools/list) | src/mcp-adr-analysis-server.ts:235 | Calls getToolListForMCP({ mode: 'full' }), which returns the canonical MCP_TOOL_SCHEMAS array (src/tools/mcp-tool-schemas.ts) = 72 tools over the wire. src/index.ts is now a 79-line shim โ the tool list is no longer hardcoded there. |
Catalog (metadata for search_tools) | src/tools/tool-catalog.ts | 68 declared TOOL_CATALOG.set(...) entries (category, tokenCost, requiresAI, hasCEMCPDirective, inputSchema) + 4 backfilled from the wire by the loop at :2103 = 72 at runtime. |
| Dispatch + CE-MCP gating | src/mcp-adr-analysis-server.ts:241-304 | CallToolRequestSchema handler; CE-MCP directive check (shouldUseCEMCPDirective) at :266-300 short-circuits 12 directive tools before dispatchTool() at :304 (src/tools/tool-dispatch.ts:30). |
| CE-MCP directives | src/tools/ce-mcp-tools.ts:1406-1447 | 12 case entries. |
Lightweight listing (exists, wired in, configured full) | src/tools/tool-dispatcher.ts:139-171 | getToolListForMCP({mode}) is the live tools/list source (#1416). It is called with mode: 'full' (all 72 full schemas); a mode: 'lightweight' path (:151-166) already exists but is unused. Not dead code โ a configuration choice. |
search_tools meta-tool | getSearchToolsDefinition() in src/tools/mcp-tool-schemas.ts:9; executor executeSearchTools at src/tools/tool-dispatcher.ts:77 | Category enum at mcp-tool-schemas.ts:19-30 lists 10 categories and omits aggregator. |
Best-practices scorecardโ
Basis: MCP Client Best Practices, 2026-07-28 ยท Tools spec.
| Practice | Verdict | Evidence (reproduce) |
|---|---|---|
outputSchema on tools (enables code mode / typed calling) | โ 0 of 72 | rg -n "outputSchema" src โ only prompt-composition.ts:232-255, an unrelated helper. |
MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint, title) | โ none | rg -c "readOnlyHint|destructiveHint|idempotentHint|openWorldHint" src โ 0. read_file is read-only, write_file/smart_git_push are destructive โ unmarked. |
| Progressive discovery deferred to host | โ reimplemented | Server ships search_tools/load_prompt; spec assigns this to the host (OpenAI/Anthropic ship it). |
| Token budget < 1โ5% of context | โ 3โ12ร over | ~94,571 B / ~24K tokens (ADR-023:38); 11.8% of 200K, 2.4% of 1M. |
| Uses lightweight listing when over budget | โ configured to full | getToolListForMCP() (tool-dispatcher.ts:139) is the live wire source and ships all 72 full schemas; its mode: 'lightweight' path (:151-166) exists but is not selected. One-line config, not dead code. |
| Catalog integrity (every wire tool discoverable) | โ ๏ธ backfilled, not classified | get_gaps, search_codebase, set_project_path, update_knowledge have no explicit catalog entry; the backfill loop (tool-catalog.ts:2103) folds them in with default utility metadata, so search_tools does find them โ but mis-categorised and under-described (get_gaps duplicates analyze_gaps). search_tools enum still drops aggregator (10 tools unfilterable). |
| Tool count within selection-accuracy band | โ 72 (band is ~30โ50) | Anthropic: tool-selection accuracy degrades past ~30โ50 tools; under ~10 the full list is fine; above, use host tool search. ADR-023's 54 is still at the top of the band; ADR-024 consolidation gets inside it. |
| Fewer, single-domain tools | โ ๏ธ 72 tools, 11 categories | Spec: "five well-described tools beat fifty." ADR-023 cuts to 54 supported. |
Per-tool inventoryโ
72 over the wire (68 explicitly declared in TOOL_CATALOG + 4 backfilled from the
wire at load, so 72 catalogued at runtime). outputSchema = false and
annotations = none for every tool โ omitted from the table as uniform. Cand. =
candidate disposition (discovery): K keep ยท Rm remove (host-native / dead) ยท
Rf refactor (needs directive/schema/annotations/consolidation) ยท D deferred
to ADR-024 ยท Agg aggregator (ADR-023 "separate commercial question").
analysis (4) โ tool-catalog.ts:132-233โ
| tool | what it does | tokens | AI | CE-MCP | Cand. |
|---|---|---|---|---|---|
| analyze_project_ecosystem | Comprehensive project + architectural analysis | 8000-15000 | โ | โ | K/Rf |
| get_architectural_context | Retrieve architectural context + knowledge graph | 2000-5000 | โ | โ | K |
| analyze_environment | Analyse deployment environment config | 2000-4000 | โ | โ | K |
| smart_score | Code-quality / architecture scores | 3000-6000 | โ | โ | K |
adr (12) โ tool-catalog.ts:234-451, 758-767โ
| tool | what it does | tokens | AI | CE-MCP | Cand. |
|---|---|---|---|---|---|
| suggest_adrs | ADR suggestions from analysis | 3000-6000 | โ | โ | K |
| generate_adr_from_decision | ADR from a decision | 2000-4000 | โ | โ | Rf |
| generate_adrs_from_prd | ADRs from a PRD | 4000-8000 | โ | โ | K |
| discover_existing_adrs | Find + index ADRs | 500-1500 | โ | โ | K |
| validate_adr | Validate one ADR | 500-1500 | โ | โ | K |
| validate_all_adrs | Validate all ADRs | 1000-3000 | โ | โ | K |
| analyze_adr_timeline | ADR evolution over time | 1500-3000 | โ | โ | Rf |
| compare_adr_progress | Compare implementation progress | 2000-4000 | โ | โ | Rf |
| review_existing_adrs | Review existing ADRs | 2000-4000 | โ | โ | Rf |
| generate_adr_bootstrap | Bootstrap ADR infra | 500-1500 | โ | โ | K |
| interactive_adr_planning | Interactive planning session | 3000-6000 | โ | โ | K |
| generate_adr_todo | TODO.md from ADRs (TDD pairing) | 800-3000 | โ | โ | K |
content-security (6) โ tool-catalog.ts:469-583โ
| tool | what it does | tokens | AI | CE-MCP | Cand. |
|---|---|---|---|---|---|
| analyze_content_security | Scan content for security concerns | 1500-3000 | โ | โ | Rf |
| generate_content_masking | Generate masking rules | 1000-2500 | โ | โ | Rf |
| apply_basic_content_masking | Apply basic masking | 200-500 | โ | โ | K |
| configure_custom_patterns | Configure masking patterns | 200-500 | โ | โ | K |
| validate_content_masking | Validate masking | 300-800 | โ | โ | K |
| configure_output_masking | Configure output masking | 200-400 | โ | โ | K |
research (4) โ tool-catalog.ts:598-671โ
| tool | what it does | tokens | AI | CE-MCP | Cand. |
|---|---|---|---|---|---|
| perform_research | Research a topic | 4000-10000 | โ | โ | K/Rf |
| incorporate_research | Incorporate findings | 2000-4000 | โ |