ripwire is a code analysis MCP server with 33 tools, but the provided source code reveals almost no tool definitions, parameter schemas, or descriptions. The code samples show only test fixtures (package.json files, TOML configs, shell scripts for routing/testing) and hook implementations, not the actual tool registration. No JSON Schema definitions are visible for any of the 33 tools. No tool descriptions appear in the provided source. Without seeing tool_calls, tool_schema blocks, or explicit schema registration, scores must default to 0 per the hard rules. The hooks/ripwire-claude-toolroute.sh script documents routing logic and decision rules but contains NO tool definitions. Even though the server clearly has substantial backend logic (code analysis, symbol resolution, impact analysis), that logic is NOT exposed in a form the rubric can verify. The few tool names visible (affected, analyze, batch, cochange, etc.) are tersely named but lack accompanying schemas or descriptions in the provided code.
Locate and provide the actual tool registration code (src/tools.ts or equivalent) that defines all 33 tools with input schemas, descriptions, and output specs. Current source does not include this.
For EACH tool, write a 50-200 character description following the pattern: 'ACTION: what it does. WHEN: when to use vs similar tools. RETURNS: what info you get.' Example: 'Find all code symbols that reference a given symbol. Use when tracing impact of a function or tracking dependencies. Returns symbol names, file paths, line numbers.'
Define JSON Schema for every tool's input parameters. Include type (string|number|boolean|array|object), description for each param, constraints (enum, minLength, pattern, min, max), and required array. Example for 'find_symbol': {type: 'object', required: ['symbol'], properties: {symbol: {type: 'string', description: 'The symbol name to locate (e.g., function, class, variable), case-sensitive'}, file_path: {type: 'string', description: 'Optional: limit search to this file or directory path'}}}.
Rename vague tools to verb_noun format: 'batch' → 'batch_analyze' or 'batch_retrieve' (specify action); 'for' → 'iterate_over_results' or 'apply_to_each'; 'lego' → 'compose_results' or 'build_solution'; 'slice' → 'slice_code_range' or 'extract_lines'; 'flags' → 'list_flags' or 'get_configuration'; 'whereis' → 'find_symbol_location' or 'locate_definition'.
Document output schemas for each tool. Specify return type (object, array, string, etc.), field names, field types, and field descriptions. Especially for list tools, include pagination fields (total_count, next_cursor, page_size).
NO PARAMETER DOCUMENTATION. The source code provided does not show tool definitions with parameter lists, types, or constraints. LLMs cannot infer parameter meaning from tool names alone (e.g., what does 'batch' accept? what are the semantics of 'for', 'slice', 'rank_by'?).
GENERIC/VAGUE TOOL NAMES limit LLM ability to infer intent. Names like 'batch', 'for', 'lego', 'slice', 'flags', 'grep', 'whereis' lack verb_noun clarity. E.g., 'grep' is a Unix command name, not a description; what does it search, and how? 'batch' could mean batch retrieve, batch write, batch analyze, unclear. 'for' is a reserved word, not a verb_noun pattern.
TOOL DEFINITIONS NOT VISIBLE in source code. The provided samples are test fixtures and routing hooks, not tool registration code. Tool names are inferred from test assertions and shell scripts, but no explicit tool_calls, input schemas, or handler registrations appear. Cannot verify tool metadata, output format, or error handling.
NO ERROR HANDLING GUIDANCE. Source code does not show error responses or recovery paths. LLMs have no guidance on what to do if a tool fails (is it retryable? user-fixable? fatal?).
DESTRUCTIVE TOOLS ('insert_after_symbol', 'insert_before_symbol', 'replace_symbol_body') marked as WRITE risk but no dry-run, confirmation, or rollback mechanism visible in source. No confirmation-request pattern implemented.
Add error handling to tool responses. Return specific error codes and actionable messages: 'Symbol "foo" not found in /src. Try search_symbols() with a partial name or check spelling.' Not: 'Error: symbol not found'.
For destructive tools (insert_*, replace_*), implement a dry-run mode or confirmation step. Example: add optional 'dry_run: boolean' param; if true, return what would change without modifying. Or require 'confirm: true' flag after showing a preview.
Add tool annotations (tool_metadata in MCP spec) for risk levels. Mark 'insert_*' and 'replace_*' with destructiveHint=true; mark read-only tools with readOnlyHint=true. This guides agent planning.
Document which tools chain together. E.g., 'find_symbol returns symbol_id; use that with impact to see callers. To edit, pass symbol_id to insert_after_symbol.' Eliminates discovery detours.
Add pagination to list-returning tools (mentions, owners, uses, etc.). Accept limit (1-100) and offset/cursor params. Return total_count and next_cursor so the agent can fetch large result sets without token waste.
Provide integration guidance: which tools are entry points vs helper tools? What's the typical workflow (find → analyze → edit)? Add to server docs, not tool descriptions.