fbi-crime-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fbi-crime-mcp-servershow me crime estimates for violent crime in California"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://fbi-crime.caseyjhand.com/mcp
Overview
US crime statistics from the FBI Crime Data Explorer: monthly offense rates and counts with population and reporting coverage at the national, state, or agency level, plus statistics on law enforcement officers killed and assaulted (LEOKA).
Tools
Tool | Description |
| Monthly UCR offense rates and counts by national, state, or agency scope, from the CDE summarized endpoint |
| Officer fatality, weapon, and circumstance data (LEOKA) by month or year-to-date |
| [DISABLED] Use |
| [DISABLED] UCR agency search backend decommissioned |
| [DISABLED] UCR agency profile backend decommissioned |
| [DISABLED] UCR arrests backend decommissioned |
| [DISABLED] UCR hate crimes backend decommissioned |
| [DISABLED] UCR human trafficking backend decommissioned |
| [DISABLED] UCR NIBRS breakdown backend decommissioned |
| [DISABLED] UCR and CDE participation backends decommissioned |
| [DISABLED] UCR code table backend decommissioned |
The nine unavailable entries above are disabled operator records, not callable tools. Visit FBI CDE for retired datasets.
Related MCP server: mcp-fbi-crime
Capability reference
fbi_get_crime_estimates tool
scope:national(no identifiers),state(onlystate_abbr, two letters), oragency(onlyori, nine letters/digits). Case is normalized to uppercase.offense:violent-crime,property-crime,robbery,burglary,larceny,motor-vehicle-theft,arson,aggravated-assault,rape, orhomicide. Date range runsfrom_year/from_monththroughto_year/to_month(2000–2030; months default to January and December), and the start must not be later than the end.Returns
entity_name, per-100k rates, actual/clearance counts, and nullablepopulation,participated_population, andpopulation_coverage_percentfor each offense month, plusdata_last_updatedandmax_data_datewhen the provider supplies them.Typed errors:
scope_param_missing,scope_param_incompatible,invalid_date_range,no_data(also returned for a well-formed identifier the provider doesn't know).
fbi_get_leoka tool
period:ytd(year-to-date; omitmonth) ormonthly(requiresmonth, 1–12);yearis required (2000–2030)totalscarriestotal_officers,total_incidents,total_officers_dod,total_officers_doi,total_incidents_dod, andtotal_incidents_doifrom the CDE year-to-date block. It appears for both periods and is not a requested-month total. The upstream does not definedod/doi; they replace the removedtotal_*_feloniousandtotal_*_accidentalfields with the same values.Category-to-count maps:
weapons,officer_activity,lighting_conditions,body_armor_worn,location_of_attack,offender_previously_known_to_agency,offender_prior_mental_illness,offender_prior_relationship,officer_circumstances_time_of_attack,officer_incident_type,officer_type_of_assignment,weather_conditions,offender_demographic,officer_demographic,officer_death_by_time_of_day, andofficer_death_by_month.deaths_by_regionand optionaldeaths_by_yearbreak out killing types such asFelonious/Accidental; monthly responses omit the annual series. Absent sections are omitted, null counts mean unavailable, and zero stays zero.Typed errors:
month_required(monthly period withoutmonth),month_not_applicable(YTD withmonth),no_data
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
FBI CDE-specific:
CDE summarized endpoint (
/cde/summarized/) for national, state, and per-agency offense rates and counts across 10 offense typesCDE LEOKA endpoint (
/cde/leoka/) for officer fatality, weapon, and circumstance data by month or year-to-dateDEMO_KEYworks without registration (shared, rate-limited pool); a registered api.data.gov key raises throughputNine retired tools retain disabled reasons on the HTTP landing page; MCP clients discover only the two callable tools and no resources
Agent-friendly output:
Typed error reasons carry recovery hints for scope, date and period corrections, or unavailable data
Sparse upstream rates, clearances, counts, populations and coverage surface as
nullrather than fabricated zerosdata_last_updatedandmax_data_dateecho the CDE's own dates
Getting started
Public Hosted Instance
A public instance is available at https://fbi-crime.caseyjhand.com/mcp — no installation required. No API key needed; the instance supplies its own. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"fbi-crime-mcp-server": {
"type": "streamable-http",
"url": "https://fbi-crime.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file. See the FBI CDE API key registration to obtain a key — DEMO_KEY works for exploration but is rate-limited.
{
"mcpServers": {
"fbi-crime-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/fbi-crime-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"FBI_API_KEY": "your-api-key"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"fbi-crime-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/fbi-crime-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"FBI_API_KEY": "your-api-key"
}
}
}
}Or with Docker:
{
"mcpServers": {
"fbi-crime-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "FBI_API_KEY=your-api-key",
"ghcr.io/cyanheads/fbi-crime-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 FBI_API_KEY=... bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
An api.data.gov API key for the FBI CDE API.
DEMO_KEYworks for testing but is rate-limited to ~1,000 req/hr from a shared pool.
Installation
Clone the repository:
git clone https://github.com/cyanheads/fbi-crime-mcp-server.gitNavigate into the directory:
cd fbi-crime-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set FBI_API_KEYConfiguration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
Variable | Description | Default |
| Required. api.data.gov API key for the FBI CDE API. Use | — |
| Override UCR base URL. |
|
| Override CDE base URL. |
|
| Per-request timeout in milliseconds. |
|
| Transport: |
|
| Port for HTTP server. |
|
| HTTP endpoint path. |
|
| HTTP session mode: |
|
| Public origin override for TLS-terminating reverse-proxy deployments. | none |
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Opt-in Bun-only forced-GC pressure interval (ms). Try |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry instrumentation. |
|
| OTLP base URL for trace and metric export; does not enable log export. | none |
| Explicit OTLP log export endpoint; the Docker image includes the required optional peers. | none |
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t fbi-crime-mcp-server .
docker run --rm -e FBI_API_KEY=your-key -p 3010:3010 fbi-crime-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/fbi-crime-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Retired agency/state definitions, not registered. |
| FBI CDE API service with response validation and shared retry/timeout logic. |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources in the arrays passed to
createApp()insrc/index.tsActive tools call the CDE API (
/cde/summarized/,/cde/leoka/); retired definitions are wrapped withdisabledTooland omitted from MCP registrationWrap FBI API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
FBI Crime Data Explorer MCP — UCR/NIBRS statistics
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
UK Police MCP — wraps the UK Police Data API (free, no auth)
Chicago and Milwaukee crime data: query incidents, stats, and map-linked MCP UI resources.
1
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.147 npm2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables querying FBI crime data using UCR/NIBRS statistics through a simple MCP interface.24 npmMIT
- AlicenseNot gradedqualityAmaintenanceBrowse and query the U.S. Energy Information Administration API v2 — electricity, petroleum, natural gas, coal, forecasts, and more via MCP. STDIO or Streamable HTTP.249 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceSearch and fetch ~800K Federal Reserve economic time-series from the FRED API via MCP, with STDIO or Streamable HTTP transport.94 npm1Apache 2.0