fbi-crime-mcp-server
Tools
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.
Active tools (CDE API)
Tool | Description |
| 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. |
| Same CDE summarized endpoint, scoped to a single agency by ORI code. Returns month-by-month rates and counts for that agency. |
| Law Enforcement Officers Killed and Assaulted (LEOKA) — fatality and assault counts with circumstance and weapon detail, by month or year-to-date. |
| Redirects to |
Decommissioned tools (always return error)
Tool | Status |
| UCR agency search backend decommissioned |
| UCR agency lookup backend decommissioned |
| UCR arrests backend decommissioned |
| UCR hate crimes backend decommissioned |
| UCR participation backend decommissioned |
| UCR human trafficking backend decommissioned |
| NIBRS backend decommissioned |
| UCR code table backend decommissioned |
For decommissioned data, consult cde.ucr.cjis.gov or download FBI bulk CSV files.
fbi_get_crime_estimates
Monthly offense rates and raw counts from the FBI CDE summarized endpoint.
Scope:
national,state(requiresstate_abbr), oragency(requires ORI)Offense types:
violent-crime,property-crime,robbery,burglary,larceny,motor-vehicle-theft,arson,aggravated-assault,rape,homicideReturns per-100k rates and raw actuals by month for the requested date range
fbi_get_agency_offenses
Same CDE summarized endpoint scoped to a single agency, state, or national level.
Functionally equivalent to
fbi_get_crime_estimateswithscope="agency"— useful when the agent's mental model is "offenses for this agency" rather than "crime trends"Provide ORI for agency scope;
state_abbrfor state scope
fbi_get_leoka
Law Enforcement Officers Killed and Assaulted (LEOKA) data.
Two period modes:
monthly(by month) orytd(year-to-date)Returns feloniously killed, accidentally killed, and assault counts with circumstance and weapon detail
fbi_get_arson
Redirects to fbi_get_crime_estimates with offense="arson". The dedicated UCR arson endpoint is decommissioned; arson data remains available via the CDE summarized endpoint.
Resources
Type | Name | Description |
Resource |
| [UNAVAILABLE] The UCR agency profile backend has been decommissioned; reading this resource returns a |
Resource |
| [UNAVAILABLE] The CDE state participation backend has been decommissioned; reading this resource returns a |
Features
Built on @cyanheads/mcp-ts-core:
Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
Unified error handling — handlers throw, framework catches, classifies, and formats
Pluggable auth:
none,jwt,oauthSwappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1Structured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
FBI Crime Data Explorer-specific:
CDE API (
/cde/summarized/,/cde/leoka/) — the surviving FBI endpoints post-UCR decommissionDecommissioned tools return a
ServiceUnavailableerror with a recovery hint pointing to cde.ucr.cjis.gov — agents can report the gap rather than silently failingDEMO_KEYworks without signing up (rate-limited shared pool); a registered api.data.gov key for production throughput
Getting started
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.3.2 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. |
|
| 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. |
|
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 ( |
| Resource definitions ( |
| FBI API service layer — UCR and CDE clients with 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 via the barrels in
src/mcp-server/*/definitions/index.tsActive tools call the CDE API (
/cde/summarized/,/cde/leoka/); decommissioned tools throwserviceUnavailablewith a recovery hintWrap FBI API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/fbi-crime-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server