MCP server for checking CVEs against CISA's Known Exploited Vulnerabilities (KEV) catalog
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names follow verb_noun convention (check-cve, recent-cves). Descriptions are present but minimal (18-52 chars, below the 50-200 char LLM-optimized baseline). Input schemas visible with type definitions, but parameter descriptions are sparse. No output schema documentation. No error handling guidance. No tool annotations (readOnlyHint). Composition is sound (single responsibility per tool), but parameter constraints and recovery paths are missing.
Check if a given CVE exists in the list.
Get all CVEs added in the last X days.
Descriptions are too short (18-52 chars vs. 50-200 char baseline). 'Check if a given CVE exists in the list' lacks context on when to use this vs. recent-cves, what format CVE IDs must follow, and what the response structure contains.
Output schemas are not documented. CVEResponse and RecentCVEsResponse are defined in code but not exposed in tool registration. LLMs cannot plan downstream calls or extract fields without knowing response structure.
No error handling guidance. If a CVE ID is malformed or the CISA API is unreachable, the tool will fail silently or return a generic error. No recovery hints (e.g., 'Try a different CVE format') or categorization (retryable vs. user-fixable).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
Parameter 'cve_id' in check-cve lacks format constraints. Description says 'e.g., CVE-2024-1234' but does not enforce the pattern. LLMs may pass 'CVE-2024-1234', 'cve-2024-1234', or '2024-1234', all will fail.
No tool annotations. Both tools are read-only (risk: READ_ONLY), but this is not declared via readOnlyHint in the schema. Agents cannot distinguish safe tools from destructive ones without explicit hints.