MCP server for the FBI Crime Data Explorer API
Server has 4 tools with complete input schemas and descriptions. Naming follows verb_noun convention (lookup_, get_, manage_). Descriptions are present (60-150 chars) but lack actionable context for LLM selection. Parameters are typed and mostly described, but lack enums for constrained values (e.g., lookup_type, level, data_type accept free-form strings). Output schemas are not documented in the visible code. Error handling and recovery guidance are absent. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles.
Get arrest statistics by offense, optionally broken down by demographics.
Get law enforcement employee data including officer/civilian counts by gender, rates per 1,000 population.
Look up law enforcement agencies by state, ORI code, or judicial district code.
Manage the FBI Crime Data response cache.
No output schemas documented. LLMs cannot plan downstream calls or extract required fields without knowing response structure.
Constrained parameters use free-form strings instead of enums. E.g., lookup_type accepts 'by_state'|'by_ori'|'by_district' but is typed as string; level accepts 'national'|'state'|'agency'|'region' but lacks enum constraint. LLMs will hallucinate invalid values.
No error handling or recovery guidance. Tool descriptions do not explain what to do if a lookup fails, API rate-limits, or invalid parameters are passed. Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Tool annotations missing. manage_cache is WRITE (destructive) but has no destructiveHint. lookup_agency and get_* are READ_ONLY but lack readOnlyHint. Agents cannot reason about side effects.
Descriptions lack actionable context. E.g., 'Get arrest statistics by offense...' does not explain WHEN to use this vs get_summarized_crime_data, what format offense codes must be in, or what the response contains. LLMs cannot reliably select the right tool.