MCP server that exposes Rocq (Coq proof assistant) proof checking via three tools: check_to_end, check, and close_file
The rocq-mcp server provides three tools with explicit schemas and descriptions visible in mcp/server.go. All tools have non-empty descriptions (10-20 words each). Input schemas are present and typed (string, integer, boolean). However, descriptions lack depth and context, they state WHAT but not WHEN or WHY an agent should call each tool. Parameter descriptions are minimal (e.g., 'path to the .v file' is functional but doesn't explain file format constraints or error conditions). Output schema is documented via CheckResult struct with clear fields (CheckedTo, Errors, ProofGoals). Error handling is present but limited, the code calls fmt.Errorf with context, but error messages lack recovery guidance. No parameter validation is visible (e.g., checking file extensions, path validity). Security is reasonable (no secrets exposed), but the close_file tool's WRITE risk is not prominently warned in the description. Overall: functional definitions with basic quality, but missing LLM-optimization guidance and actionable error messages expected in production tools.
Check a Rocq (.v) file up to a given line
Check a Rocq (.v) file to the end
Free vsrocq incremental-checking cache for a file
Tool descriptions lack WHEN/WHY context. Descriptions state WHAT the tool does (e.g., 'Check a Rocq file') but not when the LLM should invoke it or what problem it solves. For example, check_to_end vs check differ by scope, but description doesn't explain which to call for incremental checking vs full validation.
Parameter 'omit' in check tool has a cryptic description: 'if true, skip proof bodies (DelegationSkip); proofs are admitted and Qed failures appear as diagnostics'. The term 'DelegationSkip' is internal jargon; LLMs need plain language explaining the trade-off (e.g., 'faster checking but misses proof errors' or 'use for quick syntax validation').
close_file description does not warn that it has side effects (WRITE risk). The description says 'Free vsrocq incremental-checking cache' but omits that this is irreversible state mutation. The idempotentHint or destructiveHint annotation is missing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
No enum constraints for the 'omit' parameter. Although it is boolean (implicitly constrained to true/false), the description does not mention defaults or the consequence of omission. A best-practice description would be: 'if true, skip proof bodies for speed; defaults to false for full validation'.
Error messages in code (e.g., 'InterpretToEnd: %w', 'start vsrocq: %w') are not actionable for LLMs. They lack recovery guidance. For example, if vsrocq fails to start, the agent should be told 'vsrocq not found or not executable, ensure the binary is installed and in PATH', not a raw wrapping error.
No documentation of output schema in parameter descriptions or return type. While CheckResult struct is defined with fields (CheckedTo, Errors, ProofGoals), the tool descriptions do not tell the LLM what to expect in the response. An LLM cannot plan downstream actions without knowing the shape of the result.
Tool names use underscores (check_to_end, check, close_file) but lack a leading verb-noun pattern. 'check_to_end' is clear, but 'close_file' could be confused with file I/O operations. More explicit names like 'check_rocq_file_to_end', 'free_rocq_cache_for_file' would reduce ambiguity.