Skip to main content
Glama
dathere

FBI Crime Data MCP Server

by dathere

FBI Crime Data MCP Server

PyPI CI codecov

An MCP (Model Context Protocol) server that provides access to the FBI's Crime Data Explorer API.

Query crime statistics, arrest data, hate crimes, NIBRS incidents, law enforcement employment, and more — directly from any MCP-compatible client.

Created for data journalists, researchers, and anyone interested in exploring US crime data with the power of language models. Initially created for use by the Policy Analyst Agent of the qsv Claude Cowork plugin.

Features

  • 17 tools covering a wide range of crime data topics

    • Crime trends and Summary Reporting System (SRS) crime data

    • National Incident Based Reporting System (NIBRS) incident-based data and national estimates

    • Arrest statistics with demographic breakdowns

    • Hate crime incidents by bias motivation

    • Expanded homicide and property crime details

    • Police employment, Law Enforcement Officers Killed and Assaulted (LEOKA), Law Enforcement Suicide Data Collection (LESDC), and use of force

    • Agency lookup, reference data, cache management, and spillover reading

  • Geographic query levels — national, state, and agency for most tools; some also support region (get_police_employment, get_nibrs_estimation) or agency-type / population-size breakdowns (get_nibrs_estimation) — all with automatic parameter validation

  • Smart yearly aggregation — monthly API data is automatically rolled up into yearly totals (sums for counts, unweighted averages for rates, last value for population), with an option for monthly granularity. Years with fewer than 12 months of data are flagged in a _partial_years key so partial-year sums are never mistaken for annual totals

  • Tiered disk-backed caching — 90-day time-to-live (TTL) for stable data (trends, reference, summaries, NIBRS estimation), 30-day TTL for dynamic data (incidents, arrests, agency lookups), and 1-day TTL for the homepage summary (refresh dates change frequently). Transient errors (timeouts, HTTP 5xx, rate-limit responses) are never cached

  • Spillover handling — responses exceeding 128K characters are saved to disk with a preview returned, so large queries are never silently truncated

  • Input validation — date format/ordering checks, offense and bias code validation, and level-based parameter requirements with clear error messages

  • Sliding-window rate limiting — 1,000 requests/hour with transparent wait-time feedback

  • Reference tools for agency lookups (by state, Originating Agency Identifier (ORI), or district with name filtering) and code translations

Related MCP server: MCP Server Police UK

Quick Start

  1. Get a free API key from api.data.gov

  2. Run with Claude Desktop — add to your claude_desktop_config.json:

{
  "mcpServers": {
    "fbi-crime-data": {
      "command": "uvx",
      "args": ["fbi-crime-data-mcp"],
      "env": {
        "FBI_API_KEY": "your-api-key-here"
      }
    }
  }
}
  1. Or run directly:

FBI_API_KEY=your-key uvx fbi-crime-data-mcp

Available Tools (17)

Core Crime Data

Tool

Description

get_summarized_crime_data

SRS crime data — rates, actuals, clearances for violent crime, property crime, homicide, rape, robbery, assault, burglary, larceny, motor vehicle theft, arson

get_nibrs_data

NIBRS incident-based data for 70+ offense types

get_arrest_data

Arrest statistics by offense with optional demographic breakdowns (male, female, sex, race)

get_crime_trends

National crime trend percent changes across 10 crime types

get_nibrs_estimation

NIBRS national estimates by state, region, agency type, or population size

Specialized Crime Data

Tool

Description

get_hate_crime_data

Hate crime incidents by bias motivation (30+ categories)

get_expanded_homicide_data

Supplementary Homicide Reports — victim/offender demographics, weapons, circumstances

get_expanded_property_data

Expanded property crime details — stolen/recovered values for burglary, larceny, motor vehicle theft (MVT), robbery

Law Enforcement Data

Tool

Description

get_police_employment

Officer and civilian employee counts by gender, rates per 1,000 population

get_leoka_data

Officers killed and assaulted — weapons, circumstances, demographics

get_lesdc_data

Law enforcement suicide data — demographics, race, duty status, and more

get_use_of_force_data

Use of force incidents resulting in death, serious injury, or firearm discharge

Overview

Tool

Description

get_cde_homepage_summary

CDE homepage summary — mission statement, navigation, data freshness, date ranges, and national crime trends

Reference & Lookup

Tool

Description

lookup_agency

Find law enforcement agencies by state, ORI code, or judicial district

get_reference_data

State lists, offense/bias code lookups, data refresh dates

manage_cache

View cache stats, clear all entries, or clear only expired entries

read_spillover

Read spillover files saved when tool responses exceed the size limit

Large Responses

When a tool response exceeds 128,000 characters, the full result is saved to ~/.cache/fbi-crime-data-mcp/spillover/ and a truncated preview is returned with the file path. To avoid this, narrow your query (shorter date range, specific state/agency).

The preview, not the full payload, is what gets cached, so the cache and the spillover directory belong together. Clear both with manage_cache action="clear" rather than deleting the spillover directory by hand; otherwise cached previews point at files that no longer exist until the cache entry expires.

Data Sources

All data comes from the FBI's Crime Data Explorer API, which provides Uniform Crime Reporting (UCR) data including both the Summary Reporting System (SRS) and the National Incident-Based Reporting System (NIBRS).

API Rate Limits

  • Registered key: 1,000 requests per hour (rolling window)

  • DEMO_KEY: 30 requests per IP per hour

The server includes a built-in rate limiter (1,000 req/hr). The DEMO_KEY limit is enforced API-side.

For more info on the FBI's Crime Data API, see https://cde.ucr.cjis.gov/LATEST/webapp/#/pages/docApi.

Development

# Install dependencies
uv sync

# Run the server locally
FBI_API_KEY=your-key uv run fbi-crime-data-mcp

# Run tests (offline by default — never hits the network)
uv run pytest

# Run integration tests against the live API.
# DEMO_KEY works, but is capped at 30 requests per IP per hour.
FBI_API_KEY=your-key uv run pytest -m integration

License

MIT

Available Tools

17 tools
get_arrest_dataA

Get arrest statistics by offense, optionally broken down by demographics.

Args: offense: Arrest offense code (e.g., "all", "11" for murder, "30" for robbery, "150" for drug abuse). Use get_reference_data with data_type="offenses" and offense_type="arrest" for full list. level: Geographic level — "national", "state", or "agency" data_type: "counts" for time series or "totals" for demographic breakdowns from_date: Start date in mm-yyyy format (e.g., "01-2020") to_date: End date in mm-yyyy format (e.g., "12-2022") state: Two-letter state abbreviation (required when level is "state") ori: Agency ORI code (required when level is "agency") category: Optional demographic breakdown — "male", "female", "race", or "sex" aggregate: Aggregation level — "yearly" (default, sums monthly into yearly) or "monthly" (monthly granularity). Only applies when data_type is "counts". Years with fewer than 12 months of data are flagged in a top-level "_partial_years" key (rates are unweighted averages of the available months).

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
levelYes
stateNo
offenseYes
to_dateYes
categoryNo
aggregateNoyearly
data_typeYes
from_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose genuinely useful behavior: the aggregate default ('yearly', summing monthly), that it only applies to data_type='counts', and that incomplete years are flagged in a top-level '_partial_years' key with unweighted rate averaging. It omits any mention of permissions, rate limits, or error conditions, leaving real gaps for a query tool with no annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A one-line summary is front-loaded above an Args list in which each entry adds distinct value (formats, examples, conditional requirements). It is verbose but not padded; nearly every clause earns its place, though the argument list is long enough that it could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is largely unnecessary, and the description instead explains the one non-obvious output feature ('_partial_years'). For a nine-parameter, five-required query tool with no annotations, coverage of inputs and aggregation behavior is solid, with only permission/error context missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: it documents all nine parameters with formats and examples ('mm-yyyy', offense codes like '11'/'30'/'150', level values, data_type 'counts'/'totals', category values, aggregate semantics). A few semantics remain thin (e.g., the 'sex' vs 'race' category distinction, valid level/category enumerations), but far more meaning is added than the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb and resource: 'Get arrest statistics by offense, optionally broken down by demographics.' The scope (offense-level arrest counts, optional demographic breakdown) is clear enough to separate it from siblings like get_nibrs_data or get_hate_crime_data. It does not, however, explicitly name or contrast against any sibling, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description routes the agent to a sibling for offense codes ('Use get_reference_data with data_type="offenses" ...'), which is a concrete usage instruction, and it states when state/ori are required. But there is no guidance on when to choose this tool over other crime-data siblings (e.g., get_summarized_crime_data, get_crime_trends), so usage is implied rather than fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cde_homepage_summaryA

Get a summary of the FBI Crime Data Explorer (CDE) homepage.

Returns the CDE mission statement, navigation structure, data freshness (last refresh dates), available data date ranges, and the full national crime trends response (percent changes across 10 crime types, matching the trends section displayed on the CDE homepage). Provides orientation on what the CDE offers and how current its data is.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description takes full burden. It clearly states the tool returns a summary including specific elements, which is appropriate for a read-only operation. No side effects or limitations are disclosed, but the description is transparent about what the tool provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, each adding value: first states purpose, second lists contents, third explains crime trends detail, fourth provides overall orientation. It is front-loaded and concise with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists, the description does not need to detail the output format. It covers the key aspects of what the summary includes, making it complete for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the schema coverage is 100%. The description adds no parameter info because none are needed, which is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get a summary of the FBI Crime Data Explorer (CDE) homepage' and lists specific contents (mission statement, navigation, data freshness, date ranges, crime trends), which distinguishes it from sibling tools like get_crime_trends or get_summarized_crime_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. While the purpose implies it is for an overview, there is no direct comparison or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_expanded_homicide_dataA

Get Supplementary Homicide Report (SHR) data with expanded details on homicides including victim/offender demographics, weapons, and circumstances.

Args: level: Geographic level — "national", "state", or "agency" data_type: "counts" for time series or "totals" for demographic/detail breakdowns from_date: Start date in mm-yyyy format (e.g., "01-2020") to_date: End date in mm-yyyy format (e.g., "12-2022") state: Two-letter state abbreviation (required when level is "state") ori: Agency ORI code (required when level is "agency") aggregate: Aggregation level — "yearly" (default, sums monthly into yearly) or "monthly" (monthly granularity). Only applies when data_type is "counts". Years with fewer than 12 months of data are flagged in a top-level "_partial_years" key (rates are unweighted averages of the available months).

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
levelYes
stateNo
to_dateYes
aggregateNoyearly
data_typeYes
from_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does fairly well: it discloses that '_partial_years' flags years with fewer than 12 months and that rates in those cases are unweighted averages of available months, plus the constraint that 'aggregate' only applies to counts. It omits permission/auth or rate-limit context, but the retrieval-affecting behavior is substantially disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in one sentence and the args list is compact with no filler. It is appropriately sized for a 7-parameter tool, though the parenthetical detail in the aggregate note is slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, and the description still usefully flags the '_partial_years' output key. Combined with full parameter documentation, the definition is complete enough for an agent to invoke it correctly; only cross-tool routing guidance is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the 7 parameters gets meaning plus format guidance (mm-yyyy, two-letter abbreviation, ORI code, conditional requirements tied to 'level', enum-like values for level/data_type/aggregate). This is far beyond what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Get Supplementary Homicide Report (SHR) data') and enumerates the detail categories it returns (demographics, weapons, circumstances). It is clearly distinguishable from generic siblings like get_summarized_crime_data, though it never explicitly names an alternative, which keeps it short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to choose this tool over siblings such as get_summarized_crime_data or get_expanded_property_data. The parameter notes imply usage contexts, but the agent must infer the routing decision entirely on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_expanded_property_dataA

Get expanded property crime data with details on stolen/recovered property values.

Args: offense: Property offense code — "NB" (Burglary), "NL" (Larceny), "NMVT" (Motor Vehicle Theft), "NROB" (Robbery). level: Geographic level — "national", "state", or "agency" data_type: "counts" for time series or "totals" for property value breakdowns from_date: Start date in mm-yyyy format (e.g., "01-2020") to_date: End date in mm-yyyy format (e.g., "12-2022") state: Two-letter state abbreviation (required when level is "state") ori: Agency ORI code (required when level is "agency") aggregate: Aggregation level — "yearly" (default, sums monthly into yearly) or "monthly" (monthly granularity). Only applies when data_type is "counts". Years with fewer than 12 months of data are flagged in a top-level "_partial_years" key (rates are unweighted averages of the available months).

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
levelYes
stateNo
offenseYes
to_dateYes
aggregateNoyearly
data_typeYes
from_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose a genuinely non-obvious behavioral trait: years with fewer than 12 months are flagged in a top-level '_partial_years' key and rates are unweighted averages of available months. It also documents aggregation behavior and defaults. It stops short of describing the read-only nature, data freshness, or rate/coverage limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in a single sentence, followed by a compact Args list where each entry earns its place. The aggregate line is somewhat run-on, bundling the aggregation semantics with the _partial_years caveat, but no content is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All 8 parameters are documented, an output schema exists so return values need not be re-explained, and the description even calls out the _partial_years output key. The only gap is routing guidance relative to the many sibling crime-data tools, which an agent would need to select this tool confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the schema gives an agent nothing but names and types. The description fully compensates: it enumerates offense codes (NB/NL/NMVT/NROB), geographic levels, the counts-vs-totals meaning of data_type, date formats (mm-yyyy), conditional requirements for state and ori, and the aggregate default with its special semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (property crime data with stolen/recovered property values), which is clearly narrower than siblings like get_summarized_crime_data or get_crime_trends. It never explicitly names or contrasts with those siblings, so an agent must infer the boundary. Clear but no sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly guides usage through parameter semantics (data_type 'counts' for time series vs 'totals' for value breakdowns; state required at level 'state'; ori required at level 'agency'). However, it never says when to choose this tool over alternative crime-data tools, nor states any exclusions. Implied usage only.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hate_crime_dataA

Get hate crime statistics, optionally filtered by bias motivation. Returns incident counts, victim types, offense types, offender demographics, and locations.

Args: level: Geographic level — "national", "state", or "agency" from_date: Start date in mm-yyyy format (e.g., "01-2020") to_date: End date in mm-yyyy format (e.g., "12-2022") bias: Bias code to filter by (e.g., "12" for Anti-Black, "21" for Anti-Jewish, "24" for Anti-Islamic). Use get_reference_data with offense_type="hate-crime" for full list. If omitted, returns all biases. data_type: "counts" for time series or "totals" for aggregate data (default: "counts") state: Two-letter state abbreviation (required when level is "state") ori: Agency ORI code (required when level is "agency") aggregate: Aggregation level — "yearly" (default, sums monthly into yearly) or "monthly" (monthly granularity). Only applies when data_type is "counts". Years with fewer than 12 months of data are flagged in a top-level "_partial_years" key (rates are unweighted averages of the available months).

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
biasNo
levelYes
stateNo
to_dateYes
aggregateNoyearly
data_typeNocounts
from_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it steps up: it explains the _partial_years flagging behavior and that rates are unweighted averages of available months, which is meaningful edge-case disclosure. It omits auth, rate limits, and default-vs-explicit behavior on some fields, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line summary, then a clean Args block; each entry earns its place. Slightly verbose in a few spots (e.g., repeating default semantics), but no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-param tool with an output schema and no annotations, the description covers formats, conditional requirements, defaults, edge cases, and a reference-data pointer. What remains missing is confirmation of return structure beyond the short summary, but the output schema covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: every parameter gets meaning, formats (mm-yyyy), conditional requirements (state required when level='state'), example values for bias codes with a lookup tool pointer, and an explicit cross-parameter constraint (aggregate applies only when data_type='counts').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get hate crime statistics') and enumerates the returned data domains (incidents, victim types, offense types, offender demographics, locations). It does not explicitly contrast with siblings like get_nibrs_data or get_arrest_data, so sibling differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through parameter descriptions (e.g., required state/ori per level, bias lookup pointing to get_reference_data). There is no explicit when-to-use versus when-to-use-instead guidance relative to the many similarly-scoped crime-data siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_leoka_dataB

Get LEOKA data on law enforcement officers killed and assaulted, including weapons used, circumstances, officer demographics, and offender demographics.

Args: report_type: "monthly" for a specific month or "ytd" for year-to-date summary year: Year for the data (e.g., 2022) month: Month number 1-12 (January=1, December=12). Required when report_type is "monthly".

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
monthNo
report_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses data content but omits behavioral traits like authentication, rate limits, or side effects. Adequate for a read-only retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with a brief overview and structured parameter list. Front-loaded with key information, no redundant sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists but isn't shown; description mentions data categories but not structure or field names. Complete enough for basic use but could detail return format given 3 parameters and no output schema in description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description compensates well. Explains each parameter clearly: report_type values, year, month dependency on report_type. Adds meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves LEOKA data on law enforcement officers killed and assaulted, specifying the resource and verbs. It distinguishes from siblings by focusing on a specific dataset, though it could explicitly differentiate from similar tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives or prerequisites. The description explains parameters but lacks context on when to choose this tool over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_lesdc_dataA

Get law enforcement suicide data with breakdowns by demographics, race, location, duty status, and more.

Args: year: Year for the data (e.g., 2022) chart_type: Chart/breakdown type. Use get_reference_data or see error message for valid values.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
chart_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that invalid chart_type will result in an error, but omits other behavioral traits like data freshness, read-only nature, or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first clearly states purpose, second covers parameters. No wasted words; front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Description provides basic purpose and parameter meanings, but lacks context about data coverage (e.g., year range, source) and output format. However, an output schema exists, reducing the need to describe return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, description adds value by explaining year as 'Year for the data (e.g., 2022)' and chart_type as 'Chart/breakdown type' with hint to use get_reference_data. It compensates well for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it retrieves law enforcement suicide data with breakdowns by specific categories (demographics, race, location, duty status). This distinguishes it from siblings like get_leoka_data (assaults/killings) and get_use_of_force_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. It does mention using get_reference_data for valid chart_type values, but no when-not or comparative context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_nibrs_dataA

Get NIBRS incident-based crime data for 70+ offense types.

Args: offense: NIBRS offense code (e.g., "13A" for aggravated assault, "09A" for murder, "11A" for rape, "120" for robbery, "220" for burglary). Use get_reference_data for full list. level: Geographic level — "national", "state", or "agency" from_date: Start date in mm-yyyy format (e.g., "01-2020") to_date: End date in mm-yyyy format (e.g., "12-2022") data_type: "counts" for time series data or "totals" for aggregate breakdowns (default: "counts") state: Two-letter state abbreviation (required when level is "state") ori: Agency ORI code (required when level is "agency") aggregate: Aggregation level — "yearly" (default, sums monthly into yearly) or "monthly" (monthly granularity). Only applies when data_type is "counts". Years with fewer than 12 months of data are flagged in a top-level "_partial_years" key (rates are unweighted averages of the available months).

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
levelYes
stateNo
offenseYes
to_dateYes
aggregateNoyearly
data_typeNocounts
from_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses a meaningful behavioral trait: partial-year flagging via a top-level '_partial_years' key and that rates are unweighted averages over available months. These are genuinely useful and not derivable from the schema. But it omits permissions, error behavior, pagination/rate limits, and whether results are cached.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single summary sentence followed by a structured Args block mirroring the schema. Front-loaded purpose with parameter detail in a scannable format. Slightly verbose in repeating schema field names, but the added semantics justify the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, no annotations, and an output schema already present, the description covers parameter semantics well and adds behavioral context about partial years. It stops short of describing auth requirements, error cases, or how the output is shaped, but the output schema reduces that need.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it explains offense codes with examples, level values, date format (mm-yyyy), data_type semantics, state/ori conditionality on level, and aggregate behavior. This substantially covers 8 parameters. It's not a 5 only because some ancillary parameters (e.g., defaults interplay, null handling for state/ori) are not fully spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: fetching NIBRS incident-based crime data across 70+ offense types. It distinguishes itself from siblings like get_summarized_crime_data or get_crime_trends by naming NIBRS specifically, though it doesn't explicitly say how it differs from get_nibrs_estimation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It points the agent to get_reference_data for the full offense list, which is a useful routing hint. However, it provides no guidance on when to prefer this tool over get_nibrs_estimation or other crime-data siblings, leaving the agent to infer boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_nibrs_estimationA

Get NIBRS national crime estimates derived from incident data. Supports breakdowns by state, region, agency type, and population size.

Args: offense: NIBRS offense code (e.g., "13A", "09A"). Use get_nibrs_data docs for codes. level: "national", "state", "region", "agency-type", or "size" year: Year for estimation data state: Two-letter state abbreviation (required when level is "state") region: Region code — "M" (Midwest), "N" (Northeast), "S" (South), "W" (West). Required when level is "region". agency_type: "S" (Size) or "T" (Agency Type). Required when level is "agency-type" or "size". agency_type_location: "C" (City) or "N" (County). Required when level is "agency-type". size_group: Size group "1"-"8" (1=Cities 250K+, 6=Cities under 10K, 7=MSA Counties, 8=Non-MSA Counties). Required when level is "size".

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
levelYes
stateNo
regionNo
offenseYes
size_groupNo
agency_typeNo
agency_type_locationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden for behavioral transparency. The description does not disclose whether the operation is read-only, whether it requires special permissions, if there are rate limits, or any side effects. It focuses solely on parameter definitions, missing key behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief overview followed by an 'Args' section. Each parameter gets a clear, concise explanation. The length is justified by the complexity (8 parameters with conditions). No superfluous sentences, though the external reference to 'get_nibrs_data docs' could be integrated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (context signal: has output schema = true), the description need not cover return values. It thoroughly documents all 8 input parameters with constraints and defaults. The description is complete for the tool's complexity, covering all necessary input guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, meaning the description must fully explain parameters. It does so exceptionally: provides examples for offense codes, lists exact level options, and clarifies conditional requirements (e.g., state, region, agency_type). This adds substantial value beyond the schema's bare property definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves NIBRS national crime estimates with breakdowns. It specifies the verb 'Get' and the resource 'NIBRS national crime estimates'. While it doesn't explicitly distinguish from sibling tools like get_nibrs_data, the context of 'estimates derived from incident data' implies an aggregated view, setting it apart from raw data retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides detailed parameter conditions (e.g., state required when level='state'), which guides usage. However, it does not explicitly state when to use this tool versus alternatives like get_crime_trends or get_nibrs_data, nor does it mention when not to use it. The guidance is implicit through parameter requirements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_police_employmentA

Get law enforcement employee data including officer/civilian counts by gender, rates per 1,000 population.

Args: level: Geographic level — "national", "state", "agency", or "region" from_year: Start year in yyyy format (e.g., "2015") to_year: End year in yyyy format (e.g., "2022") state: Two-letter state abbreviation (required for "state" and "agency" levels) ori: Agency ORI code (required for "agency" level) region: Region name — "midwest", "south", "northeast", or "west" (required for "region" level)

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
levelYes
stateNo
regionNo
to_yearYes
from_yearYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description conveys the nature of the data returned (counts by gender, rates) and implies a read-only operation via 'get'. It does not mention permissions or rate limits, but the behavioral scope is well-covered for a read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: a one-sentence summary followed by a clear Args list. No wasted words, and information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the parameter count (6) and the existence of an output schema, the description fully covers the input parameters' semantics. No additional context is needed for a read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates fully by explaining each parameter's meaning, format (e.g., yyyy), and required context (e.g., state for 'agency' level). This adds significant value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves law enforcement employee data, specifying officer/civilian counts by gender and rates per 1,000 population. This verb+resource is distinct from sibling tools (e.g., crime, arrest data).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for employment data but does not explicitly state when to use this tool versus alternatives or when not to use it. There is no guidance on exclusions or context for selecting this over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reference_dataA

Get reference data: state lists, offense/bias code lookups, data properties, or data refresh dates.

Args: data_type: Type of reference data — "states" (list of states/territories), "offenses" (offense or bias code lookup), "cde_properties" (data date ranges), or "refresh_date" (last data refresh dates) offense_type: Required when data_type is "offenses" — "arrest" for arrest offense codes or "hate-crime" for hate crime bias codes

ParametersJSON Schema
NameRequiredDescriptionDefault
data_typeYes
offense_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It implies a read-only retrieval but does not explicitly state side effects, permissions, or response behavior beyond listing what each data_type returns. Adequate but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then structured parameter details. Slightly verbose due to formal Args format, but every sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all data types and parameter conditions. Output schema exists, so return value details are not needed. Could mention that offense_type is ignored for non-offenses, but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description fully explains both parameters: data_type with four enumerated values and offense_type with conditional requirement. Adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool retrieves reference data (state lists, offense/bias code lookups, data properties, refresh dates). The verb 'Get' and specific resource types distinguish it from sibling tools that focus on crime statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on data_type options and conditionally required offense_type. However, no explicit comparison to siblings or when-not-to-use advice, though context makes it clear this is for reference data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_summarized_crime_dataA

Get summarized (SRS) crime data including offense rates, actuals, clearances, and population coverage.

Args: offense: SRS offense code (e.g., "V" for Violent Crime, "P" for Property Crime, "HOM", "RPE", "ROB", "ASS", "BUR", "LAR", "MVT", "ARS"). Use get_reference_data for full list. level: Geographic level — "national", "state", or "agency" from_date: Start date in mm-yyyy format (e.g., "01-2020") to_date: End date in mm-yyyy format (e.g., "12-2022") state: Two-letter state abbreviation (required when level is "state") ori: Agency ORI code (required when level is "agency") aggregate: Aggregation level — "yearly" (default, sums monthly into yearly) or "monthly" (monthly granularity). Years with fewer than 12 months of data are flagged in a top-level "_partial_years" key (rates are unweighted averages of the available months).

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
levelYes
stateNo
offenseYes
to_dateYes
aggregateNoyearly
from_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does so well: it discloses the default aggregation mode, that partial years are flagged under '_partial_years', and that rates are unweighted averages of available months. It stops short of describing pagination, rate limits, or return structure, but the behavioral detail is notably above baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary line is front-loaded and each Args entry earns its place with concrete examples. It is somewhat long, but the added length is informational rather than redundant, so the size is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because an output schema exists, return values need not be explained, and the description covers all inputs, defaults, and conditional requirements. It could add a brief note on data vintage or caching behavior relative to manage_cache, but for the tool's complexity it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and it does: every one of the 7 parameters is documented with format examples ('mm-yyyy'), enumerated offense codes, valid level values, and cross-parameter dependencies between level and state/ori. This is exactly what a low-coverage schema needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get summarized (SRS) crime data') and enumerates the data domains returned (offense rates, actuals, clearances, population coverage). It partially differentiates from siblings by naming SRS data and pointing to get_reference_data, though it doesn't explicitly contrast with get_arrest_data or get_nibrs_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete conditional guidance: 'state' is required when level is 'state', and 'ori' is required when level is 'agency', plus a pointer to get_reference_data for the offense list. No explicit when-not-to-use guidance or sibling comparison is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_use_of_force_dataA

Get use of force data from law enforcement agencies. Covers incidents resulting in death, serious bodily injury, or firearm discharge.

Args: report_type: "summary" for participation/submission data, "questions" for detailed question data, "reports" for report data year: Year for the data. Required for "summary" and "questions" types. location: "national" or a two-letter state abbreviation. Required for "summary" type. group: Group identifier for "questions" or "reports" types. quarter: Quarter (1-4) for "questions" type. spec: Report specification for "reports" type.

ParametersJSON Schema
NameRequiredDescriptionDefault
specNo
yearNo
groupNo
quarterNo
locationNo
report_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the data scope and parameter dependencies (e.g., year required for summary). However, it does not mention read-only nature, rate limits, or data source details. The behavioral traits are partially transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, starting with a clear purpose statement, followed by a structured Args list. Every sentence adds value, and there is no redundancy. The front-loaded summary aids quick understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 6 parameters, 1 required, and an output schema present, the description covers all parameters' roles and some constraints. However, it lacks guidance on valid parameter combinations and error conditions. The presence of an output schema reduces the burden for return value documentation, but additional context would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the tool description explains each parameter's meaning and constraints (e.g., location: 'national or two-letter state abbreviation'). This adds significant value beyond the schema's type definitions. However, some format details (e.g., year range) are missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get use of force data from law enforcement agencies' and specifies the scope: incidents resulting in death, serious bodily injury, or firearm discharge. This distinguishes it from sibling tools like get_arrest_data, which focus on different data types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains parameter requirements (e.g., which params are required for each report_type) but does not provide explicit guidance on when to use this tool vs. siblings. No 'when to use' or 'alternatives' section is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_agencyA

Look up law enforcement agencies by state, ORI code, or judicial district code.

Args: lookup_type: How to look up — "by_state" (list agencies in a state), "by_ori" (specific agency by ORI), or "by_district" (agencies by judicial district code) state: Two-letter state abbreviation (required for by_state and by_ori) ori: Agency ORI identifier (required for by_ori) district_code: Judicial district code (required for by_district) name_filter: Optional substring to filter results by agency name (case-insensitive). Only applies to by_state and by_district lookups. offset: Number of results to skip (for pagination). Applied after name_filter. limit: Maximum number of results to return (for pagination). Applied after name_filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
oriNo
limitNo
stateNo
offsetNo
lookup_typeYes
name_filterNo
district_codeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully carries the burden. It explains the behavior for each lookup type, pagination (offset, limit order), and name_filter application. It does not cover error handling or rate limits, but the core behavior is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear Args section and front-loaded purpose. It is thorough but not overly verbose; every sentence adds value. Minor redundancy (e.g., repeating 'required for' multiple times) could be trimmed, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters and an output schema present, the description covers all parameter relationships, pagination order, and usage details. It does not need to explain return values since the output schema exists. The description is fully complete for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, meaning the properties have no descriptions. The tool's description fully compensates by explaining each parameter's purpose, requirements, and constraints (e.g., required for certain lookup_type). This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to look up law enforcement agencies by state, ORI code, or judicial district code. It distinguishes itself from sibling tools, which focus on crime data, by being the sole agency lookup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies three lookup types and their required parameters, guiding when to use each. It does not explicitly mention when not to use this tool or alternatives, but sibling tools are distinctly different, so the guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_cacheA

Manage the FBI Crime Data response cache.

Args: action: "status" (show cache stats), "clear" (wipe entire cache), or "clear_expired" (remove only expired entries)

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that 'clear' wipes the entire cache, which is a significant destructive behavior. No annotations are provided, so the description carries the transparency burden. It lacks details on auth requirements, rate limits, or what cache stats include.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, with a clear opening statement and a structured args list. Every sentence adds value, and there is no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, clear actions) and the presence of an output schema (so return values are handled externally), the description is complete. It covers what each action does, which is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully explains the single 'action' parameter by enumerating the three possible values ('status', 'clear', 'clear_expired') and describing what each does. This adds essential meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Manage' with the resource 'FBI Crime Data response cache', and lists three distinct actions (status, clear, clear_expired). It clearly distinguishes from sibling tools which are all data retrieval or lookup tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for cache management via the actions listed, but does not explicitly state when to use or exclude alternatives. However, the context of sibling tools makes the differentiation clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_spilloverA

Read a spillover file that was saved when a tool response exceeded the size limit.

Use this to retrieve data beyond the preview shown in a truncated response. The filename is provided in the spillover notice (e.g., "get_nibrs_data_a1b2c3d4.json").

Args: filename: Name of the spillover file (e.g., "get_nibrs_data_a1b2c3d4.json"). Use "list" to see all available spillover files. offset: Character position to start reading from (default: 0). limit: Maximum number of characters to return (default: 50000, max: 100000).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
filenameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses that the tool reads spillover files, explains the 'list' special value, and details offset/limit behavior. It is transparent about defaults and limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a short purpose statement, a usage hint, then parameter descriptions. Every sentence adds value, and it is front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 parameters, no annotations, and an existing output schema, the description covers all necessary aspects: what the tool does, when to use it, and detailed parameter semantics. It is fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must add meaning. It explains filename with an example and the 'list' option, offset as character position with default 0, and limit with default and maximum. This goes well beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads spillover files saved when tool responses exceed size limits. It distinguishes from sibling tools that retrieve specific data categories, making its unique purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool when a truncated response provides a spillover notice, and mentions the filename is from that notice. It does not discuss when not to use it or offer direct alternatives, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 17 tool updatesv0.4.0
    • First observedget_arrest_data
    • First observedget_cde_homepage_summary
    • First observedget_crime_trends
    • First observedget_expanded_homicide_data
    • First observedget_expanded_property_data
    • First observedget_hate_crime_data
    • First observedget_leoka_data
    • First observedget_lesdc_data
    • First observedget_nibrs_data
    • First observedget_nibrs_estimation
    • First observedget_police_employment
    • First observedget_reference_data
    • First observedget_summarized_crime_data
    • First observedget_use_of_force_data
    • First observedlookup_agency
    • First observedmanage_cache
    • First observedread_spillover

TDQS

A3.9/5.0

Scored across 17 tools

Disambiguation4/5

Most tools map to distinct FBI datasets or utilities, but get_nibrs_data vs get_nibrs_estimation and get_summarized_crime_data vs get_crime_trends require careful reading to avoid misselection. Descriptions generally clarify scope.

Naming Consistency5/5

All names use snake_case verb_noun structure (get_*, lookup_agency, manage_cache, read_spillover), with a predictable get_ prefix for data retrieval tools. No mixed conventions.

Tool Count3/5

17 tools is on the heavy side for a data-access MCP server, falling in the borderline 16-25 range. Each tool maps to a distinct dataset, but the surface is large enough to feel sprawling.

Completeness5/5

The server covers the major FBI Crime Data Explorer domains: trends, summarized, NIBRS, NIBRS estimates, arrests, hate crime, expanded homicide/property, LEOKA, police employment, suicide, use of force, agency lookup, reference data, and spillover handling. No obvious lifecycle gaps for a read-only data server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides access to the police.uk API with 21 tools to query UK crime data, police forces, neighbourhoods, and stop-and-search incidents. Enables retrieval of street-level crimes, force details, neighbourhood teams, and policing priorities across England, Wales, and Northern Ireland.
    21
    18 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Wraps the UK Police Data API to enable querying crime data, police forces, and other UK police information through natural language.
    1 npm
    MIT