fbi-crime-mcp-server
Server Details
FBI Crime Data Explorer — offense rates, hate crime, arrests, NIBRS, LEOKA stats, agency search.
- Status
- Healthy
- Uptime
- 99.9% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/fbi-crime-mcp-server
- GitHub Stars
- 1
- Server Listing
- fbi-crime-mcp-server
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 6 tools
Each tool targets a clearly distinct FBI CDE dataset: arrests, crime estimates, hate crimes, LEOKA, NIBRS breakdowns, and agency lookup. Although several tools share state/agency/offense parameters, their descriptions make the dataset boundaries unambiguous. fbi_search_agencies is clearly auxiliary and identifies ORIs needed by the data tools.
All tool names follow a consistent snake_case fbi_<verb>_<noun> pattern: fbi_get_* for data retrieval and fbi_search_agencies for lookup. The acronym nouns (leoka, nibrs) do not break the convention.
Six tools is well within a sensible range and each maps to a distinct major FBI CDE data area or required lookup function. There is no obvious redundancy or filler.
The set covers several major FBI CDE datasets and includes agency/ORI lookup needed to use agency-scoped queries. However, the broader FBI crime data domain has additional datasets and metadata/offense-code discovery paths not exposed here, so some gaps remain for agents exploring beyond the covered endpoints.
Available Tools
6 toolsfbi_get_arrestsFBI Get ArrestsARead-onlyIdempotentInspect
Arrest counts reported to FBI CDE for the nation, a state, or an agency, summed over a month window from January 1985 through the current year. Returns arrests by offense name, offense category, and detailed offense breakdown, by arrestee sex and race, and by age group for male and female arrestees, with every category CDE reports, zeros included. Each grouping is tallied separately and their sums can differ (arrestee sex and race often total less than the offense groupings), so no grouping stands in for another's total. Narrow to one offense with offense. National scope omits identifiers; state requires only state_abbr; agency requires only ori (look it up with fbi_search_agencies). CDE returns zeros both when nothing was reported and when it does not recognize a state or ORI.
| Name | Required | Description | Default |
|---|---|---|---|
| ori | No | Nine ASCII-letter/digit ORI code (e.g. CA0010400, DCMPD0000); case-insensitive. Find an agency's ORI with fbi_search_agencies. Only permitted and required for agency scope. | |
| scope | Yes | Geographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori). | |
| offense | No | CDE arrest offense code to narrow the counts to, or all (default). Codes: 11 Murder and Nonnegligent Homicide; 12 Manslaughter by Negligence; 20 Rape - Not Specified (Legacy); 30 Robbery; 50 Assault - Not Specified; 55 Simple Assault; 60 Burglary; 70 Larceny - Theft; 90 Motor Vehicle Theft; 101 Commercial Sex Acts; 102 Involuntary Servitude; 110 Arson; 140 Prostitution and Commercialized Vice; 141 Prostitution and Commercialized Vice - Prostitution; 142 Prostitution and Commercialized Vice - Assisting or Promoting Prostitution; 143 Prostitution and Commercialized Vice - Purchasing Prostitution; 150 Drug Abuse Violations; 151 Drug Sale/Manufacturing (Unspecified); 152 Drug Sale/Manufacturing - Opium or Cocaine or Their Derivatives; 153 Drug Sale/Manufacturing - Marijuana; 154 Drug Sale/Manufacturing - Synthetic Narcotics; 155 Drug Sale/Manufacturing - Other - Dangerous Nonnarcotic Drugs; 156 Drug Possession (Unspecified); 157 Drug Possession - Opium or Cocaine or Their Derivatives; 158 Drug Possession - Marijuana; 159 Drug Possession - Synthetic Narcotics; 160 Drug Possession - Other - Dangerous Nonnarcotic Drugs; 170 Gambling (Unspecified); 171 Gambling - Bookmaking (Horse and Sport Book); 172 Gambling - Numbers and Lottery; 173 Gambling - All Other Gambling; 180 Forgery and Counterfeiting; 190 Fraud; 200 Embezzlement; 210 Stolen Property: Buying, Receiving, Possessing; 220 Vandalism; 230 Weapons: Carrying, Possessing, Etc.; 240 Sex Offenses (Except Rape, and Prostitution and Commercialized Vice); 250 Offenses Against the Family and Children; 260 Driving Under the Influence; 270 Liquor Law Violations; 280 Drunkenness; 290 Disorderly Conduct; 300 Vagrancy; 310 All Other Offenses (Except Traffic); 330 Curfew and Loitering Law Violations. | all |
| to_year | Yes | End year of the data range (inclusive), 1985 through the current year. | |
| to_month | No | End month (1–12). Defaults to December. | |
| from_year | Yes | Start year of the data range (inclusive), 1985 through the current year. The API uses monthly granularity. | |
| from_month | No | Start month (1–12). Defaults to January. | |
| state_abbr | No | Two ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | Last month of the summed window (MM-YYYY). |
| ori | No | Uppercased ORI code; present only for agency scope. |
| from | No | First month of the summed window (MM-YYYY). |
| error | No | Present when the call failed. Absent on success. |
| scope | No | Geographic scope queried. |
| notice | No | Present when every count is zero; says whether zeros can also mean an unrecognized state or ORI. |
| offense | No | Arrest offense code applied, or all. |
| state_abbr | No | Uppercased state abbreviation; present only for state scope. |
| arrestee_sex | No | Arrests by arrestee sex. |
| offense_name | No | Arrests by offense name. |
| arrestee_race | No | Arrests by arrestee race. |
| max_data_date | No | Latest data month CDE reports (MM/YYYY); absent when CDE omits it. |
| offense_label | No | CDE label for the applied offense code; "All offenses" for all. |
| offense_category | No | Arrests by offense category. |
| data_last_updated | No | Date CDE last refreshed arrest data; absent when CDE omits it. |
| offense_breakdown | No | Arrests by detailed offense breakdown. |
| male_arrests_by_age | No | Arrests of male arrestees by age group. |
| female_arrests_by_age | No | Arrests of female arrestees by age group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the readOnly/idempotent annotations: zeros are included for every CDE category, groupings are tallied separately and their totals can differ (so one grouping cannot substitute for another), and unrecognized state/ORI values silently return zeros. That last point is a real trap the agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each carrying distinct load: what is returned, the grouping-total caveat, the scope/identifier mapping, and the zero-ambiguity warning. Lead sentence establishes resource and time range before drilling into caveats; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, multi-scope aggregation tool this covers everything an agent needs: scope requirements, date semantics, offense narrowing, and the two caveats (differing grouping totals, silent zeros) that would otherwise cause misinterpretation. An output schema exists, so return shape needs no explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by noting the offense parameter narrows results, tying each scope to its one permitted identifier, and warning that bad state_abbr/ori values yield zeros rather than errors — meaning that goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: arrest counts reported to FBI CDE, scoped to nation/state/agency over a monthly window, with named breakdowns (offense, sex, race, age group). The resource is clearly distinct from siblings like fbi_get_crime_estimates or fbi_get_hate_crimes, and fbi_search_agencies is named as the ORI lookup path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete scoping rules (national omits identifiers, state needs only state_abbr, agency needs only ori) and routes the agent to fbi_search_agencies for the ORI. It does not explicitly say when to prefer this over sibling datasets such as crime estimates, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fbi_get_crime_estimatesFBI Get Crime EstimatesARead-onlyIdempotentInspect
Monthly offense rates (per 100,000 participating population), raw counts, population denominators and provider reporting coverage from FBI CDE, January 1985 through the current year; current-year months past the latest data return null values. National scope omits identifiers; state requires only state_abbr; agency requires only ori. Identifiers are case-insensitive; start must be no later than end. Set include_comparisons on state or agency scope to also get the comparison rates CDE sends for the same months (an agency's state and the United States, or a state's United States). Results use the largest chronological prefix within 24,000 UTF-8 bytes of serialized {content, structuredContent}, excluding SDK protocol metadata and transport framing; next_from supplies the next start with the same scope, identifiers, offense, comparison flag and original end date. An indivisible oversize month and its metadata are returned intact with oversize_notice. Missing coverage stays null and participation may be incomplete. Offenses: violent-crime, property-crime, robbery, burglary, larceny, motor-vehicle-theft, arson, aggravated-assault, rape, homicide.
| Name | Required | Description | Default |
|---|---|---|---|
| ori | No | Nine ASCII-letter/digit ORI code (e.g. CA0010400, DCMPD0000); case-insensitive. Find an agency's ORI with fbi_search_agencies. Only permitted and required for agency scope. | |
| scope | Yes | Geographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori). | |
| offense | Yes | Offense type: violent-crime, property-crime, robbery, burglary, larceny, motor-vehicle-theft, arson, aggravated-assault, rape, or homicide. | |
| to_year | Yes | End year of the data range (inclusive), 1985 through the current year. | |
| to_month | No | End month (1–12). Defaults to December. | |
| from_year | Yes | Start year of the data range (inclusive), 1985 through the current year. The API uses monthly granularity. | |
| from_month | No | Start month (1–12). Defaults to January. | |
| state_abbr | No | Two ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope. | |
| include_comparisons | No | Also return the comparison entities CDE sends with state or agency data (an agency's state and the United States, or a state's United States) as monthly rates, populations and coverage for the scoped months. Must be false or omitted for national scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | End of data range (MM-YYYY). |
| ori | No | ORI code when scope is "agency". |
| from | No | Start of data range (MM-YYYY). |
| error | No | Present when the call failed. Absent on success. |
| scope | No | Geographic scope. |
| months | No | Monthly data rows sorted chronologically. |
| offense | No | Offense type queried. |
| next_from | No | Continue with these start fields, keeping the scope, identifiers, offense, comparison flag and original end date. |
| state_abbr | No | State abbreviation when scope is "state". |
| comparisons | No | Present only when include_comparisons is true: the comparison entities in CDE's order (an agency's state, then the United States; a state's United States). Empty when CDE sent none. CDE sends no counts for comparison entities. |
| entity_name | No | Provider entity selected from scoped offense actuals. |
| total_months | No | Number of months returned. |
| max_data_date | No | Latest data date reported by CDE, in the provider format. |
| oversize_notice | No | Present when one indivisible month with its metadata exceeds the 24,000-byte serialized tool-payload budget and is returned intact. |
| data_last_updated | No | Date the CDE last refreshed this data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses rich behavioral details: pagination via the 24,000-byte prefix rule, next_from behavior, oversize_notice handling, null values for current-year missing data, case-insensitivity, validation (start ≤ end), and incomplete participation caveats. This is exactly the kind of context that helps an agent use the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but mostly front-loaded and each sentence serves a purpose. Some redundancy exists—the offense list is repeated from the schema enum—but overall it is appropriately sized for a tool with this complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema already describing return structure, the description focuses on operational behavior, edge cases, and parameter dependencies. It covers everything an agent needs to call the tool correctly, including pagination, null semantics, and scope-specific requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds cross-parameter constraints not fully captured in the schema: it ties scope to permitted identifiers, states that identifiers are case-insensitive, and enforces start no later than end. These additions meaningfully improve parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific data returned: monthly offense rates, raw counts, population denominators, and provider coverage from FBI CDE. It doesn't explicitly name sibling tools or contrast them, but the unique resource and scope details make its purpose distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides conditional parameter rules (e.g., national scope omits identifiers; state requires state_abbr; agency requires ori) and explains include_comparisons. However, it never explicitly states when to choose this tool over siblings like fbi_get_arrests or fbi_get_hate_crimes, leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fbi_get_hate_crimesFBI Get Hate CrimesARead-onlyIdempotentInspect
Hate crime counts reported to FBI CDE for the nation, a state, or an agency, summed over a month window from January 1991 through the current year. Returns incidents by bias motivation and bias category, plus counts by offense type, location type, offender race, offender ethnicity, and federal judicial district, with every category CDE reports, zeros included. Narrow to one bias motivation with bias. National scope omits identifiers; state requires only state_abbr; agency requires only ori (look it up with fbi_search_agencies). CDE returns zeros both when nothing was reported and when it does not recognize a state or ORI.
| Name | Required | Description | Default |
|---|---|---|---|
| ori | No | Nine ASCII-letter/digit ORI code (e.g. CA0010400, DCMPD0000); case-insensitive. Find an agency's ORI with fbi_search_agencies. Only permitted and required for agency scope. | |
| bias | No | Bias motivation code to narrow the counts to, or all (default). With a code, incidents count that motivation plus multiple-bias incidents that include it. Codes: 11 Anti-White; 12 Anti-Black or African American; 13 Anti-American Indian or Alaska Native; 14 Anti-Asian; 15 Anti-Multiple Races, Group; 16 Anti-Native Hawaiian or Other Pacific Islander; 21 Anti-Jewish; 22 Anti-Catholic; 23 Anti-Protestant; 24 Anti-Islamic (Muslim); 25 Anti-Other Religion; 26 Anti-Multiple Religions, Group; 27 Anti-Atheism/Agnosticism; 28 Anti-Church of Jesus Christ; 29 Anti-Jehovah's Witness; 31 Anti-Arab; 32 Anti-Hispanic or Latino; 33 Anti-Other Race/Ethnicity/Ancestry; 41 Anti-Gay (Male); 42 Anti-Lesbian (Female); 43 Anti-Lesbian, Gay, Bisexual, or Transgender (Mixed Group); 44 Anti-Heterosexual; 45 Anti-Bisexual; 51 Anti-Physical Disability; 52 Anti-Mental Disability; 61 Anti-Male; 62 Anti-Female; 71 Anti-Transgender; 72 Anti-Gender Non-Conforming; 81 Anti-Eastern Orthodox (Russian, Greek, Other); 82 Anti-Other Christian; 83 Anti-Buddhist; 84 Anti-Hindu; 85 Anti-Sikh. | all |
| scope | Yes | Geographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori). | |
| to_year | Yes | End year of the data range (inclusive), 1991 through the current year. | |
| to_month | No | End month (1–12). Defaults to December. | |
| from_year | Yes | Start year of the data range (inclusive), 1991 through the current year. The API uses monthly granularity. | |
| from_month | No | Start month (1–12). Defaults to January. | |
| state_abbr | No | Two ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | Last month of the summed window (MM-YYYY). |
| ori | No | Uppercased ORI code; present only for agency scope. |
| bias | No | Bias motivation code applied, or all. |
| from | No | First month of the summed window (MM-YYYY). |
| error | No | Present when the call failed. Absent on success. |
| scope | No | Geographic scope queried. |
| notice | No | Present when every count is zero; says whether zeros can also mean an unrecognized state or ORI. |
| bias_label | No | CDE label for the applied bias code; "All bias motivations" for all. |
| state_abbr | No | Uppercased state abbreviation; present only for state scope. |
| bias_section | No | CDE's bias_section breakdowns summed over the window. Each dimension is counted on its own basis, so the dimensions do not sum to one total or to the incident count. |
| incident_section | No | Incident counts summed over the window. |
| data_last_updated | No | Date CDE last refreshed hate crime data; absent when CDE omits it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, but the description adds a genuinely important behavioral warning: CDE returns zeros both when nothing was reported and when a state or ORI is unrecognized, so zeros are ambiguous. It also discloses that every CDE category is emitted with zeros included, which affects how results must be interpreted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the resource and time window, then return contents, then scope/parameter rules and the zero caveat. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description only needs to cover interpretation risks and scoping rules—which it does, including the zero-vs-unrecognized ambiguity that an agent could not infer from structured fields alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description adds the conditional applicability rule across the three scopes in one place and clarifies that bias narrows counts (including multiple-bias incidents containing the code). Most of that detail is still duplicated from the per-parameter schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (hate crime counts from FBI CDE) plus scope (nation/state/agency), time granularity (monthly, Jan 1991–present), and the exact breakdowns returned. That is clearly distinguishable from the arrest, crime-estimate, LEOKA and NIBRS siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions for each scope mode ("national omits identifiers; state requires only state_abbr; agency requires only ori") and routes ORI lookup to the sibling fbi_search_agencies. It stops short of saying when to prefer a different FBI dataset over this one, so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fbi_get_leokaFBI Get LEOKAARead-onlyIdempotentInspect
LEOKA officer fatality trends, weapons, activity, circumstances, demographics, geographic regions, and time-of-day/month breakdowns, 2020 through the current year. Period "ytd" requests a year; "monthly" requires month and includes the same month of the comparison year. Both periods return the CDE YTD totals block, separately from month-specific breakdowns. Raw dod/doi totals have unspecified interpretation; classified deaths remain in the trend and region series.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Year to retrieve LEOKA data for, 2020 through the current year. Required — the API does not default to a year. | |
| month | No | Month number (1–12). Required for monthly; must be omitted for YTD. | |
| period | Yes | Data period: ytd for the year, monthly for month-specific breakdowns and comparison years. Both include the CDE YTD totals block. |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | No | The data year requested. |
| error | No | Present when the call failed. Absent on success. |
| month | No | The data month, when period is "monthly". |
| period | No | The requested data period. |
| totals | No | Raw incidents_victim_officer_totals_ytd block, including in monthly responses. Not combined fatalities or requested-month totals. |
| weapons | No | Count by weapon type (e.g. Handguns, Rifles, Vehicle). |
| deaths_by_year | No | Annual officer death totals by type over the window CDE returns, which can include years after the requested one (YTD 2023 returns 2018–2026); the current year's entry is year-to-date. Keys: "Felonious", "Accidental". Values: { "2022": 61, ... } |
| body_armor_worn | No | Body armor worn category to count; null counts are unavailable. |
| deaths_by_region | No | Officer death counts by killing type then region. Keys: "Felonious", "Accidental". Values: { "South": 31, "West": 12, ... } |
| officer_activity | No | Count by what the officer was doing at the time of the incident. |
| location_of_attack | No | Location of attack category to count; all reported categories are retained. |
| weather_conditions | No | Weather condition to count. |
| lighting_conditions | No | Count by lighting conditions at time of incident. |
| officer_demographic | No | Officer demographic dimension to category to count; null groups and counts are unavailable. |
| offender_demographic | No | Offender demographic dimension to category to count; null groups and counts are unavailable. |
| officer_incident_type | No | Officer incident type to count. |
| officer_death_by_month | No | Killing type to year to month to count, for the requested year and the comparison year CDE returns. Only months CDE covers are present: monthly responses hold the requested month under each year, current-year YTD responses hold months through the current UTC month, and past-year YTD responses keep the series as returned. Zeros are reported counts; null means unavailable. |
| officer_type_of_assignment | No | Officer assignment type to count. |
| offender_prior_relationship | No | Offender prior relationship category to count. |
| officer_death_by_time_of_day | No | Killing type to hour key to count. Hour keys, including -1, are preserved literally. |
| offender_prior_mental_illness | No | Offender prior mental illness category to count. |
| offender_previously_known_to_agency | No | Previously known offender category to count. |
| officer_circumstances_time_of_attack | No | Circumstance at time of attack category to count. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, open-world behavior. The description adds meaningful data caveats: both periods return a CDE YTD totals block separately from month-specific breakdowns, raw dod/doi totals have unspecified interpretation, and classified deaths remain in the trend/region series. These are useful behavioral disclosures beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the resource scope, then period semantics, then data caveats. Every sentence contributes useful information, though the long opening sentence could be slightly more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers the key caller-facing concerns: supported time range, period/month interaction, comparison-year behavior, and caveats about dod/doi and classified deaths. It is largely complete for a three-parameter analytical tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by clarifying the relational semantics of period and month: monthly includes the same month of the comparison year, and both periods return the CDE YTD totals block. This adds value beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as LEOKA officer fatality data and enumerates the included dimensions (trends, weapons, activity, circumstances, demographics, regions, time breakdowns). It does not explicitly differentiate itself from sibling FBI tools such as fbi_get_arrests or fbi_get_hate_crimes, but the subject matter is specific enough to distinguish it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how the period parameter works ('ytd' requests a year; 'monthly' requires month and includes comparison-year data), which gives operational guidance. However, it does not state when to choose this tool over alternative FBI datasets or any exclusions/preconditions beyond period mechanics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fbi_get_nibrs_breakdownFBI Get NIBRS BreakdownARead-onlyIdempotentInspect
NIBRS incident breakdowns reported to FBI CDE for one offense, for the nation, a state, or an agency, summed over a month window from January 1991 through the current year. Returns victim counts by age, sex, race, location, ethnicity, and relationship to the offender; offender counts by age, sex, race, and ethnicity; and offense counts by weapon and related offense, with every category CDE reports, zeros included. Each dimension is tallied separately and their sums can differ, so no dimension stands in for another's total. offense is required (codes are listed on the field). National scope omits identifiers; state requires only state_abbr; agency requires only ori (look it up with fbi_search_agencies). When CDE has no value for any category, as for an unrecognized state or ORI, a window with no NIBRS data, or an offense with no reported incidents in the window, the call fails with no_data.
| Name | Required | Description | Default |
|---|---|---|---|
| ori | No | Nine ASCII-letter/digit ORI code (e.g. CA0010400, DCMPD0000); case-insensitive. Find an agency's ORI with fbi_search_agencies. Only permitted and required for agency scope. | |
| scope | Yes | Geographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori). | |
| offense | Yes | NIBRS offense code to break down (required; case-insensitive). Codes: 100 Kidnapping/Abduction; 101 Treason; 103 Espionage; 120 Robbery; 200 Arson; 210 Extortion/Blackmail; 220 Burglary/Breaking & Entering; 240 Motor Vehicle Theft; 250 Counterfeiting/Forgery; 270 Embezzlement; 280 Stolen Property Offenses; 290 Destruction/Damage/Vandalism of Property; 360 Failure to Register as a Sex Offender; 370 Pornography/Obscene Material; 510 Bribery; 520 Weapon Law Violations; 521 Violation of National Firearm Act of 1934; 522 Weapons of Mass Destruction; 526 Explosives Violation; 620 Wildlife Trafficking; 720 Animal Cruelty; 09A Murder and Nonnegligent Manslaughter; 09B Negligent Manslaughter; 09C Justifiable Homicide; 11A Rape; 11B Sodomy; 11C Sexual Assault With An Object; 11D Criminal Sexual Contact; 13A Aggravated Assault; 13B Simple Assault; 13C Intimidation; 23A Pocket-picking; 23B Purse-snatching; 23C Shoplifting; 23D Theft From Building; 23E Theft From Coin-Operated Machine or Device; 23F Theft From Motor Vehicle; 23G Theft of Motor Vehicle Parts or Accessories; 23H All Other Larceny; 26A False Pretenses/Swindle/Confidence Game; 26B Credit Card/Automated Teller Machine Fraud; 26C Impersonation; 26D Welfare Fraud; 26E Wire Fraud; 26F Identity Theft; 26G Hacking/Computer Invasion; 26H Money Laundering; 30A Illegal Entry into the United States; 30B False Citizenship; 30C Smuggling Aliens; 30D Re-entry after Deportation; 35A Drug/Narcotic Violations; 35B Drug Equipment Violations; 36A Incest; 36B Statutory Rape; 39A Betting/Wagering; 39B Operating/Promoting/Assisting Gambling; 39C Gambling Equipment Violation; 39D Sports Tampering; 40A Prostitution; 40B Assisting or Promoting Prostitution; 40C Purchasing Prostitution; 49A Harboring Escapee/Concealing from Arrest; 49B Flight to Avoid Prosecution; 49C Flight to Avoid Deportation; 58A Import Violations; 58B Export Violations; 61A Federal Liquor Offenses; 61B Federal Tobacco Offenses; 64A Human Trafficking, Commercial Sex Acts; 64B Human Trafficking, Involuntary Servitude. | |
| to_year | Yes | End year of the data range (inclusive), 1991 through the current year. | |
| to_month | No | End month (1–12). Defaults to December. | |
| from_year | Yes | Start year of the data range (inclusive), 1991 through the current year. The API uses monthly granularity. | |
| from_month | No | Start month (1–12). Defaults to January. | |
| state_abbr | No | Two ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | Last month of the summed window (MM-YYYY). |
| ori | No | Uppercased ORI code; present only for agency scope. |
| from | No | First month of the summed window (MM-YYYY). |
| error | No | Present when the call failed. Absent on success. |
| scope | No | Geographic scope queried. |
| victim | No | Victim counts summed over the window. |
| offense | No | NIBRS offense code applied. |
| offender | No | Offender counts summed over the window. |
| state_abbr | No | Uppercased state abbreviation; present only for state scope. |
| max_data_date | No | Latest data month CDE reports (MM/YYYY); absent when CDE omits it. |
| offense_label | No | CDE label for the applied offense code. |
| offense_details | No | CDE's offense section (weapons and related offenses) summed over the window. |
| data_last_updated | No | Date CDE last refreshed NIBRS data; absent when CDE omits it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent/open-world annotations, it discloses the returned breakdown dimensions, zero-inclusion behavior, independent tallies per dimension, and concrete no_data failure cases. This is substantial behavioral context for an agent invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with purpose, return shape, scope rules, and failure behavior. Every clause carries operational value for this relatively complex query tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers scope selection, required offense, temporal range, returned breakdown dimensions, and expected failure behavior. With the output schema and annotations also present, an agent has enough context to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the parameters thoroughly. The description reinforces required offense, scope-specific identifier rules, and ORI lookup, but mostly repeats information available in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation and resource: NIBRS incident breakdowns for one offense across national, state, or agency scope. It clearly distinguishes the tool from broad crime, arrest, hate crime, and LEOKA siblings by focusing on NIBRS incident breakdown dimensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage conditions for each scope and explicitly directs agency lookup to fbi_search_agencies, plus failure conditions for no_data. It does not explicitly compare when to use this versus each sibling analysis tool, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fbi_search_agenciesFBI Search AgenciesARead-onlyIdempotentInspect
Find law enforcement agencies in one state and their nine-character ORI codes, the identifier agency scope needs in fbi_get_crime_estimates, fbi_get_hate_crimes, fbi_get_arrests, and fbi_get_nibrs_breakdown. Fetches the state's full FBI CDE agency directory, filters it by words in the agency name, county, and agency type, sorts by agency name then ORI, and returns one page with the total match count and next_offset for the following page. Each agency carries its type, counties, and NIBRS reporting status. A code CDE has no directory for (AS, MP, or an unrecognized code) returns zero agencies with a notice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Agencies per page (1–200). Defaults to 50. | |
| county | No | County name, case-insensitive (e.g. Bexar). Matches an agency when it equals any of the agency's counties, so an agency serving several counties matches each of them. | |
| offset | No | Zero-based position in the sorted matches; pass next_offset from the previous page. Defaults to 0. | |
| state_abbr | Yes | Two ASCII-letter state abbreviation (e.g. TX, DC, PR); case-insensitive. | |
| agency_type | No | Agency type: City, County, Other State Agency, Other, State Police, University or College, or Tribal. | |
| name_contains | No | Words or word fragments that must all appear in the agency name, in any order, case-insensitively (e.g. "san antonio police"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this page. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Agencies on this page. |
| total | No | Agencies matching the filters across the whole state directory, before paging. |
| notice | No | Why the page is empty or partial, and the call to make next. |
| offset | No | Zero-based position of the first agency on this page. |
| agencies | No | This page of matching agencies, sorted by agency name, then ORI. |
| truncated | No | True when more matching agencies follow this page; continue from next_offset. |
| state_abbr | No | State code the directory was fetched for, uppercased. |
| next_offset | No | Offset of the next page; absent on the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides significant behavioral context beyond the annotations. It details the pagination mechanism (total match count, next_offset), specific data fields returned for each agency (NIBRS status), and a precise edge case handling protocol for unrecognized CDE codes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly informative, which necessitates some density. However, it is well-structured by front-loading the core purpose and then detailing the mechanism and outcomes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex directory service with multiple inputs and paginated results, the definition is extremely complete. It covers the function, the filtering, the data fields, and the termination condition (unrecognized code), leaving minimal ambiguity for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds critical semantic value by detailing the filtering scope (name, county, and type) and specifying the sorting order (agency name then ORI). This helps the agent refine complex input parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('law enforcement agencies') and the primary output ('nine-character ORI codes'). It also explicitly links the result to the dependent sibling tools (fbi_get_crime_estimates, etc.), providing strong context for selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is highly guided because the description outlines its function as a necessary prerequisite for several other tools. By stating that it provides the specific 'ORIs' needed for other API calls, it defines the essential use case for the agent.
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 tool update
- Changed
fbi_get_crime_estimates2 fields changed- added
Output schema / properties / next_fromAdded value: +{ + "additionalProperties": false, + "description": "Continue with these start fields, keeping the scope, identifiers, offense, comparison flag and original end date.", + "properties": { + "from_month": { + "description": "Month of the first unreturned scoped month (1–12).", + "maximum": 12, + "minimum": 1, + "type": "integer" + }, + "from_year": { + "description": "Year of the first unreturned scoped month.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "from_year", + "from_month" + ], + "type": "object" +} - added
Output schema / properties / oversize_noticeAdded value: +{ + "description": "Present when one indivisible month with its metadata exceeds the 24,000-byte serialized tool-payload budget and is returned intact.", + "type": "string" +}
6 tool updates
- Added
fbi_get_arrests - Changed
fbi_get_crime_estimates13 fields changed- changed
Input schema / properties / from_year / descriptionPrevious value: -"Start year of the data range (inclusive). The API uses monthly granularity."New value: +"Start year of the data range (inclusive), 1985 through the current year. The API uses monthly granularity." - changed
Input schema / properties / from_year / maximumPrevious value: -2030New value: +9007199254740991 - changed
Input schema / properties / from_year / minimumPrevious value: -2000New value: +1985 - added
Input schema / properties / include_comparisonsAdded value: +{ + "default": false, + "description": "Also return the comparison entities CDE sends with state or agency data (an agency's state and the United States, or a state's United States) as monthly rates, populations and coverage for the scoped months. Must be false or omitted for national scope.", + "type": "boolean" +} - changed
Input schema / properties / ori / descriptionPrevious value: -"Nine ASCII-letter/digit ORI code (e.g. CA0010400, DCMPD0000); case-insensitive. Only permitted and required for agency scope."New value: +"Nine ASCII-letter/digit ORI code (e.g. CA0010400, DCMPD0000); case-insensitive. Find an agency's ORI with fbi_search_agencies. Only permitted and required for agency scope." - changed
Input schema / properties / to_year / descriptionPrevious value: -"End year of the data range (inclusive)."New value: +"End year of the data range (inclusive), 1985 through the current year." - changed
Input schema / properties / to_year / maximumPrevious value: -2030New value: +9007199254740991 - changed
Input schema / properties / to_year / minimumPrevious value: -2000New value: +1985 - added
Output schema / properties / comparisonsAdded value: +{ + "description": "Present only when include_comparisons is true: the comparison entities in CDE's order (an agency's state, then the United States; a state's United States). Empty when CDE sent none. CDE sends no counts for comparison entities.", + "items": { + "additionalProperties": false, + "description": "Rates, populations and coverage CDE sent for one comparison entity.", + "properties": { + "entity_name": { + "description": "Comparison entity name as CDE labels it.", + "type": "string" + }, + "months": { + "description": "One row per scoped month, in the same order as months.", + "items": { + "additionalProperties": false, + "description": "One month of comparison rates, matching a scoped month.", + "properties": { + "clearance_rate_per_100k": { + "description": "Comparison entity clearance rate per 100,000 participating population; null when unavailable.", + "type": [ + "number", + "null" + ] + }, + "month": { + "description": "Month (1–12).", + "type": "number" + }, + "participated_population": { + "description": "Provider participating population for the comparison entity and month; null when unavailable.", + "type": [ + "number", + "null" + ] + }, + "population": { + "description": "Provider population for the comparison entity and month; null when unavailable.", + "type": [ + "number", + "null" + ] + }, + "population_coverage_percent": { + "description": "Provider reporting coverage percentage for the comparison entity and month; never calculated, null when unavailable.", + "type": [ + "number", + "null" + ] + }, + "rate_per_100k": { + "description": "Comparison entity offense rate per 100,000 participating population; null when unavailable.", + "type": [ + "number", + "null" + ] + }, + "year": { + "description": "Year.", + "type": "number" + } + }, + "required": [ + "year", + "month", + "rate_per_100k", + "clearance_rate_per_100k", + "population", + "participated_population", + "population_coverage_percent" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "entity_name", + "months" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: The complete starting year/month is later than the ending year/month. `scope_param_incompatible`: Identifiers are supplied for a scope that does not apply them. `scope_param_missing`: scope is \"state\" but state_abbr is missing, or scope is \"agency\" but ori is missing. `no_data`: No data was returned for the requested offense and date range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: The complete starting year/month is later than the ending year/month. `scope_param_incompatible`: Identifiers are supplied for a scope that does not apply them, or include_comparisons is true for national scope. `scope_param_missing`: scope is \"state\" but state_abbr is missing, or scope is \"agency\" but ori is missing. `year_out_of_range`: from_year or to_year is after the current UTC year. `no_data`: No data was returned for the requested offense and date range. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "scope_param_incompatible", - "scope_param_missing", - "no_data" -]New value: +[ + "invalid_date_range", + "scope_param_incompatible", + "scope_param_missing", + "year_out_of_range", + "no_data" +] - changed
Output schema / properties / months / items / properties / clearance_rate_per_100k / descriptionPrevious value: -"Clearance rate per 100,000 population."New value: +"Clearance rate per 100,000 participating population." - changed
Output schema / properties / months / items / properties / rate_per_100k / descriptionPrevious value: -"Offense rate per 100,000 population."New value: +"Offense rate per 100,000 participating population."
- Added
fbi_get_hate_crimes - Changed
fbi_get_leoka7 fields changed- changed
Input schema / properties / year / descriptionPrevious value: -"Year to retrieve LEOKA data for. Required — the API does not default to a year."New value: +"Year to retrieve LEOKA data for, 2020 through the current year. Required — the API does not default to a year." - changed
Input schema / properties / year / maximumPrevious value: -2030New value: +9007199254740991 - changed
Input schema / properties / year / minimumPrevious value: -2000New value: +2020 - changed
Output schema / properties / deaths_by_year / descriptionPrevious value: -"Annual officer death totals by type. Keys: \"Felonious\", \"Accidental\". Values: { \"2022\": 61, ... }"New value: +"Annual officer death totals by type over the window CDE returns, which can include years after the requested one (YTD 2023 returns 2018–2026); the current year's entry is year-to-date. Keys: \"Felonious\", \"Accidental\". Values: { \"2022\": 61, ... }" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `month_not_applicable`: period is \"ytd\" but a month was supplied. `month_required`: period is \"monthly\" but the month parameter was not provided. `no_data`: The API returned no LEOKA data for the requested year/month. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `month_not_applicable`: period is \"ytd\" but a month was supplied. `month_required`: period is \"monthly\" but the month parameter was not provided. `year_out_of_range`: year is after the current UTC year. `no_data`: The API returned no LEOKA data for the requested year/month. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "month_not_applicable", - "month_required", - "no_data" -]New value: +[ + "month_not_applicable", + "month_required", + "year_out_of_range", + "no_data" +] - changed
Output schema / properties / officer_death_by_month / descriptionPrevious value: -"Killing type to year to month to count. Includes returned comparison years and zero values without filtering."New value: +"Killing type to year to month to count, for the requested year and the comparison year CDE returns. Only months CDE covers are present: monthly responses hold the requested month under each year, current-year YTD responses hold months through the current UTC month, and past-year YTD responses keep the series as returned. Zeros are reported counts; null means unavailable."
- Added
fbi_get_nibrs_breakdown - Added
fbi_search_agencies
2 tool updates
- First observed
fbi_get_crime_estimates - First observed
fbi_get_leoka
Related MCP Connectors
FBI Crime Data Explorer MCP — UCR/NIBRS statistics
Crime estimates by type, state arrest data, and national crime trends from the FBI UCR
National crime incident estimates from NIBRS by offense type, weapon, and location
US crime scores, incidents, neighborhood demographics, rent data, and offender search by address.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables users to browse, search, and retrieve over 800,000 economic time series with category, release, source, keyword, date-range, frequency, and transformation options.349 npmAGPL 3.0
- AlicenseNot gradedqualityAmaintenanceProvides universal access to 800,000+ Federal Reserve economic time series through tools for browsing categories, releases, and sources; searching indicators; and retrieving series data with transformations and date ranges.349 npmAGPL 3.0
- FlicenseNot gradedqualityDmaintenanceProvides access to over 800,000 economic time series from the Federal Reserve Bank of St. Louis, including data on GDP, inflation, and employment. It enables users to search for, retrieve, and analyze various economic indicators and state-level statistics.1-
- AlicenseNot gradedqualityAmaintenanceEnables users to browse, search, and retrieve Federal Reserve economic time series, including categories, releases, sources, and series observations with transformations and date ranges. It provides access to over 800,000 indicators such as GDP, unemployment, inflation, and interest rates through tools for discovery and analysis.349 npmAGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.