Skip to main content
Glama

fbi-crime-mcp-server

Server Details

FBI Crime Data Explorer — offense rates, hate crime, arrests, NIBRS, LEOKA stats, agency search.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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 tools
fbi_get_arrestsFBI Get ArrestsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
oriNoNine 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.
scopeYesGeographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori).
offenseNoCDE 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_yearYesEnd year of the data range (inclusive), 1985 through the current year.
to_monthNoEnd month (1–12). Defaults to December.
from_yearYesStart year of the data range (inclusive), 1985 through the current year. The API uses monthly granularity.
from_monthNoStart month (1–12). Defaults to January.
state_abbrNoTwo ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope.

Output Schema

NameRequiredDescription
toNoLast month of the summed window (MM-YYYY).
oriNoUppercased ORI code; present only for agency scope.
fromNoFirst month of the summed window (MM-YYYY).
errorNoPresent when the call failed. Absent on success.
scopeNoGeographic scope queried.
noticeNoPresent when every count is zero; says whether zeros can also mean an unrecognized state or ORI.
offenseNoArrest offense code applied, or all.
state_abbrNoUppercased state abbreviation; present only for state scope.
arrestee_sexNoArrests by arrestee sex.
offense_nameNoArrests by offense name.
arrestee_raceNoArrests by arrestee race.
max_data_dateNoLatest data month CDE reports (MM/YYYY); absent when CDE omits it.
offense_labelNoCDE label for the applied offense code; "All offenses" for all.
offense_categoryNoArrests by offense category.
data_last_updatedNoDate CDE last refreshed arrest data; absent when CDE omits it.
offense_breakdownNoArrests by detailed offense breakdown.
male_arrests_by_ageNoArrests of male arrestees by age group.
female_arrests_by_ageNoArrests of female arrestees by age group.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EstimatesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
oriNoNine 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.
scopeYesGeographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori).
offenseYesOffense type: violent-crime, property-crime, robbery, burglary, larceny, motor-vehicle-theft, arson, aggravated-assault, rape, or homicide.
to_yearYesEnd year of the data range (inclusive), 1985 through the current year.
to_monthNoEnd month (1–12). Defaults to December.
from_yearYesStart year of the data range (inclusive), 1985 through the current year. The API uses monthly granularity.
from_monthNoStart month (1–12). Defaults to January.
state_abbrNoTwo ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope.
include_comparisonsNoAlso 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

NameRequiredDescription
toNoEnd of data range (MM-YYYY).
oriNoORI code when scope is "agency".
fromNoStart of data range (MM-YYYY).
errorNoPresent when the call failed. Absent on success.
scopeNoGeographic scope.
monthsNoMonthly data rows sorted chronologically.
offenseNoOffense type queried.
next_fromNoContinue with these start fields, keeping the scope, identifiers, offense, comparison flag and original end date.
state_abbrNoState abbreviation when scope is "state".
comparisonsNoPresent 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_nameNoProvider entity selected from scoped offense actuals.
total_monthsNoNumber of months returned.
max_data_dateNoLatest data date reported by CDE, in the provider format.
oversize_noticeNoPresent when one indivisible month with its metadata exceeds the 24,000-byte serialized tool-payload budget and is returned intact.
data_last_updatedNoDate the CDE last refreshed this data.

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 CrimesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
oriNoNine 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.
biasNoBias 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
scopeYesGeographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori).
to_yearYesEnd year of the data range (inclusive), 1991 through the current year.
to_monthNoEnd month (1–12). Defaults to December.
from_yearYesStart year of the data range (inclusive), 1991 through the current year. The API uses monthly granularity.
from_monthNoStart month (1–12). Defaults to January.
state_abbrNoTwo ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope.

Output Schema

NameRequiredDescription
toNoLast month of the summed window (MM-YYYY).
oriNoUppercased ORI code; present only for agency scope.
biasNoBias motivation code applied, or all.
fromNoFirst month of the summed window (MM-YYYY).
errorNoPresent when the call failed. Absent on success.
scopeNoGeographic scope queried.
noticeNoPresent when every count is zero; says whether zeros can also mean an unrecognized state or ORI.
bias_labelNoCDE label for the applied bias code; "All bias motivations" for all.
state_abbrNoUppercased state abbreviation; present only for state scope.
bias_sectionNoCDE'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_sectionNoIncident counts summed over the window.
data_last_updatedNoDate CDE last refreshed hate crime data; absent when CDE omits it.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 LEOKAA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
yearYesYear to retrieve LEOKA data for, 2020 through the current year. Required — the API does not default to a year.
monthNoMonth number (1–12). Required for monthly; must be omitted for YTD.
periodYesData period: ytd for the year, monthly for month-specific breakdowns and comparison years. Both include the CDE YTD totals block.

Output Schema

NameRequiredDescription
yearNoThe data year requested.
errorNoPresent when the call failed. Absent on success.
monthNoThe data month, when period is "monthly".
periodNoThe requested data period.
totalsNoRaw incidents_victim_officer_totals_ytd block, including in monthly responses. Not combined fatalities or requested-month totals.
weaponsNoCount by weapon type (e.g. Handguns, Rifles, Vehicle).
deaths_by_yearNoAnnual 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_wornNoBody armor worn category to count; null counts are unavailable.
deaths_by_regionNoOfficer death counts by killing type then region. Keys: "Felonious", "Accidental". Values: { "South": 31, "West": 12, ... }
officer_activityNoCount by what the officer was doing at the time of the incident.
location_of_attackNoLocation of attack category to count; all reported categories are retained.
weather_conditionsNoWeather condition to count.
lighting_conditionsNoCount by lighting conditions at time of incident.
officer_demographicNoOfficer demographic dimension to category to count; null groups and counts are unavailable.
offender_demographicNoOffender demographic dimension to category to count; null groups and counts are unavailable.
officer_incident_typeNoOfficer incident type to count.
officer_death_by_monthNoKilling 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_assignmentNoOfficer assignment type to count.
offender_prior_relationshipNoOffender prior relationship category to count.
officer_death_by_time_of_dayNoKilling type to hour key to count. Hour keys, including -1, are preserved literally.
offender_prior_mental_illnessNoOffender prior mental illness category to count.
offender_previously_known_to_agencyNoPreviously known offender category to count.
officer_circumstances_time_of_attackNoCircumstance at time of attack category to count.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 BreakdownA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
oriNoNine 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.
scopeYesGeographic scope: national (omit identifiers), state (only state_abbr), or agency (only ori).
offenseYesNIBRS 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_yearYesEnd year of the data range (inclusive), 1991 through the current year.
to_monthNoEnd month (1–12). Defaults to December.
from_yearYesStart year of the data range (inclusive), 1991 through the current year. The API uses monthly granularity.
from_monthNoStart month (1–12). Defaults to January.
state_abbrNoTwo ASCII-letter state abbreviation (e.g. CA, DC, PR); case-insensitive. Only permitted and required for state scope.

Output Schema

NameRequiredDescription
toNoLast month of the summed window (MM-YYYY).
oriNoUppercased ORI code; present only for agency scope.
fromNoFirst month of the summed window (MM-YYYY).
errorNoPresent when the call failed. Absent on success.
scopeNoGeographic scope queried.
victimNoVictim counts summed over the window.
offenseNoNIBRS offense code applied.
offenderNoOffender counts summed over the window.
state_abbrNoUppercased state abbreviation; present only for state scope.
max_data_dateNoLatest data month CDE reports (MM/YYYY); absent when CDE omits it.
offense_labelNoCDE label for the applied offense code.
offense_detailsNoCDE's offense section (weapons and related offenses) summed over the window.
data_last_updatedNoDate CDE last refreshed NIBRS data; absent when CDE omits it.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AgenciesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
limitNoAgencies per page (1–200). Defaults to 50.
countyNoCounty 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.
offsetNoZero-based position in the sorted matches; pass next_offset from the previous page. Defaults to 0.
state_abbrYesTwo ASCII-letter state abbreviation (e.g. TX, DC, PR); case-insensitive.
agency_typeNoAgency type: City, County, Other State Agency, Other, State Police, University or College, or Tribal.
name_containsNoWords or word fragments that must all appear in the agency name, in any order, case-insensitively (e.g. "san antonio police").

Output Schema

NameRequiredDescription
capNoThe limit applied to this page.
errorNoPresent when the call failed. Absent on success.
shownNoAgencies on this page.
totalNoAgencies matching the filters across the whole state directory, before paging.
noticeNoWhy the page is empty or partial, and the call to make next.
offsetNoZero-based position of the first agency on this page.
agenciesNoThis page of matching agencies, sorted by agency name, then ORI.
truncatedNoTrue when more matching agencies follow this page; continue from next_offset.
state_abbrNoState code the directory was fetched for, uppercased.
next_offsetNoOffset of the next page; absent on the last page.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. 1 tool update
    • Changedfbi_get_crime_estimates2 fields changed
      • addedOutput schema / properties / next_from
        Added 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"
        +}
      • addedOutput schema / properties / oversize_notice
        Added 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"
        +}
  2. 6 tool updates
    • Addedfbi_get_arrests
    • Changedfbi_get_crime_estimates13 fields changed
      • changedInput schema / properties / from_year / description
        Previous 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."
      • changedInput schema / properties / from_year / maximum
        Previous value: -2030New value: +9007199254740991
      • changedInput schema / properties / from_year / minimum
        Previous value: -2000New value: +1985
      • addedInput schema / properties / include_comparisons
        Added 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"
        +}
      • changedInput schema / properties / ori / description
        Previous 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."
      • changedInput schema / properties / to_year / description
        Previous value: -"End year of the data range (inclusive)."New value: +"End year of the data range (inclusive), 1985 through the current year."
      • changedInput schema / properties / to_year / maximum
        Previous value: -2030New value: +9007199254740991
      • changedInput schema / properties / to_year / minimum
        Previous value: -2000New value: +1985
      • addedOutput schema / properties / comparisons
        Added 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"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / months / items / properties / clearance_rate_per_100k / description
        Previous value: -"Clearance rate per 100,000 population."New value: +"Clearance rate per 100,000 participating population."
      • changedOutput schema / properties / months / items / properties / rate_per_100k / description
        Previous value: -"Offense rate per 100,000 population."New value: +"Offense rate per 100,000 participating population."
    • Addedfbi_get_hate_crimes
    • Changedfbi_get_leoka7 fields changed
      • changedInput schema / properties / year / description
        Previous 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."
      • changedInput schema / properties / year / maximum
        Previous value: -2030New value: +9007199254740991
      • changedInput schema / properties / year / minimum
        Previous value: -2000New value: +2020
      • changedOutput schema / properties / deaths_by_year / description
        Previous 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, ... }"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "month_not_applicable",
        -  "month_required",
        -  "no_data"
        -]New value: +[
        +  "month_not_applicable",
        +  "month_required",
        +  "year_out_of_range",
        +  "no_data"
        +]
      • changedOutput schema / properties / officer_death_by_month / description
        Previous 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."
    • Addedfbi_get_nibrs_breakdown
    • Addedfbi_search_agencies
  3. 2 tool updates
    • First observedfbi_get_crime_estimates
    • First observedfbi_get_leoka

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables users to browse, search, and retrieve over 800,000 economic time series with category, release, source, keyword, date-range, frequency, and transformation options.
    349 npm
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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 npm
    AGPL 3.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides 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
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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 npm
    AGPL 3.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.