Skip to main content
Glama

fbi-crime-mcp-server

FBI Get Crime Estimates

fbi_get_crime_estimates
Read-onlyIdempotent

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.

Input Schema

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

NameRequiredDescriptionDefault
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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema 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. Changed13 schema 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."
  3. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.