Wraps the FBI Crime Data Explorer API so Claude can pull UCR estimates, LEOKA officer safety stats, and agency-level offense data. Four tools are live (crime estimates, agency offenses, LEOKA, arson), hitting the CDE summarized and LEOKA endpoints. Eight legacy tools (arrests, hate crimes, NIBRS, agency search) are decommissioned and return errors pointing to the FBI's bulk CSV downloads. You get per-100k rates and raw counts by month for violent crime, property crime, robbery, burglary, larceny, motor vehicle theft, arson, assault, rape, and homicide at national, state, or agency scope. Built on the mcp-ts-core framework with STDIO and Streamable HTTP transports. Requires an api.data.gov key, though DEMO_KEY works for light exploration.
Exposes the FBI Crime Data Explorer API — crime estimates, agency offense rates, and LEOKA officer safety data via MCP. STDIO or Streamable HTTP.
12 tools defined. 4 are active via the FBI CDE API; 8 are decommissioned — the legacy UCR backend (crime-data-api.fr.cloud.gov) was shut down, and those tools return a ServiceUnavailable error on every call with guidance to the FBI CDE website.
| Tool | Description |
|---|---|
fbi_get_crime_estimates | Monthly offense rates (per 100k) and raw counts from the FBI CDE summarized endpoint. National, state, or agency scope. Covers violent-crime, property-crime, robbery, burglary, larceny, motor-vehicle-theft, arson, aggravated-assault, rape, homicide. |
fbi_get_agency_offenses | Same CDE summarized endpoint, scoped to a single agency by ORI code. Returns month-by-month rates and counts for that agency. |
fbi_get_leoka | Law Enforcement Officers Killed and Assaulted (LEOKA) — fatality and assault counts with circumstance and weapon detail, by month or year-to-date. |
fbi_get_arson | Redirects to fbi_get_crime_estimates with offense="arson" — arson data is available via the CDE summarized endpoint. |
| Tool | Status |
|---|---|
fbi_search_agencies | UCR agency search backend decommissioned |
fbi_get_agency | UCR agency lookup backend decommissioned |
fbi_get_arrests | UCR arrests backend decommissioned |
fbi_get_hate_crimes | UCR hate crimes backend decommissioned |
fbi_get_participation | UCR participation backend decommissioned |
fbi_get_human_trafficking | UCR human trafficking backend decommissioned |
fbi_get_nibrs_breakdown | NIBRS backend decommissioned |
fbi_list_code_table | UCR code table backend decommissioned |
For decommissioned data, consult cde.ucr.cjis.gov or download FBI bulk CSV files.
fbi_get_crime_estimatesMonthly offense rates and raw counts from the FBI CDE summarized endpoint.
national, state (requires state_abbr), or agency (requires ORI)violent-crime, property-crime, robbery, burglary, larceny, motor-vehicle-theft, arson, aggravated-assault, rape, homicidefbi_get_agency_offensesSame CDE summarized endpoint scoped to a single agency, state, or national level.
fbi_get_crime_estimates with scope="agency" — useful when the agent's mental model is "offenses for this agency" rather than "crime trends"state_abbr for state scopefbi_get_leokaLaw Enforcement Officers Killed and Assaulted (LEOKA) data.
monthly (by month) or ytd (year-to-date)fbi_get_arsonRedirects to fbi_get_crime_estimates with offense="arson". The dedicated UCR arson endpoint is decommissioned; arson data remains available via the CDE summarized endpoint.
| Type | Name | Description |
|---|---|---|
| Resource | fbi://agency/{ori} | [UNAVAILABLE] The UCR agency profile backend has been decommissioned; reading this resource returns a ServiceUnavailable error. |
| Resource | fbi://state/{state_abbr} | [UNAVAILABLE] The CDE state participation backend has been decommissioned; reading this resource returns a ServiceUnavailable error. |
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1FBI Crime Data Explorer-specific:
/cde/summarized/, /cde/leoka/) — the surviving FBI endpoints post-UCR decommissionServiceUnavailable error with a recovery hint pointing to cde.ucr.cjis.gov — agents can report the gap rather than silently failingAdd 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/mcp
DEMO_KEY works for testing but is rate-limited to ~1,000 req/hr from a shared pool.git clone https://github.com/cyanheads/fbi-crime-mcp-server.git
cd fbi-crime-mcp-server
bun install
cp .env.example .env
# edit .env and set FBI_API_KEY
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
| Variable | Description | Default |
|---|---|---|
FBI_API_KEY | Required. api.data.gov API key for the FBI CDE API. Use DEMO_KEY for limited testing. | — |
FBI_API_BASE_UCR | Override UCR base URL. | https://api.usa.gov/crime/fbi/ucr |
FBI_API_BASE_CDE | Override CDE base URL. | https://api.usa.gov/crime/fbi/cde |
FBI_REQUEST_TIMEOUT_MS | Per-request timeout in milliseconds. | 15000 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path. | /mcp |
MCP_PUBLIC_URL | Public origin override for TLS-terminating reverse-proxy deployments. | none |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
MCP_GC_PRESSURE_INTERVAL_MS | Opt-in Bun-only forced-GC pressure interval (ms). Try 60000 if RSS grows under sustained HTTP load. | 0 |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run 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 build -t fbi-crime-mcp-server .
docker run --rm -e FBI_API_KEY=your-key -p 3010:3010 fbi-crime-mcp-server
The 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.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools, resources, and inits services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). 12 tools — 4 active via CDE API, 8 decommissioned. |
src/mcp-server/resources | Resource definitions (*.resource.ts). Agency and state overview resources. |
src/services | FBI API service layer — UCR and CDE clients with shared retry/timeout logic. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/*/definitions/index.ts/cde/summarized/, /cde/leoka/); decommissioned tools throw serviceUnavailable with a recovery hintIssues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.
com.mcparmory/google-sheets
domdomegg/google-sheets-mcp
henilcalagiya/google-sheets-mcp
cct15/war-dashboard-data
moooonad/mcp-google-sheets-full
io.github.br0ski777/csv-to-json