Chicago and Milwaukee crime data: query incidents, stats, and map-linked MCP UI resources.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer token when CUFFTRACKER_MCP_API_KEY is set on the server.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Start here for any neighborhood or trend question. Pass city and place, such as Milwaukee and Harbor View. Returns counts by crime type versus the city, counts by month, noon-to-midnight share, top streets, and a few notable incidents. One call covers up to 450 days. A lat/lon box is optional. Do not download citywide incidents and filter them yourself.
City the area is in.
Days ending at the newest incident in the city. Default 90. Use 400 for about 14 months.
Neighborhood or rough area, such as Harbor View or Logan Square. Omit if you pass a box.
North edge of the box. Geographic filter.
South edge of the box. Geographic filter.
East edge of the box. Geographic filter.
West edge of the box. Geographic filter.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 23, 2026.
Start here for any neighborhood or trend question. Pass city and place, such as Milwaukee and Harbor View. Returns counts by crime type versus the city, counts by month, noon-to-midnight share, top streets, and a few notable incidents. One call covers up to 450 days. A lat/lon box is optional. Do not download citywide incidents and filter them yourself.
| Argument | Type | Description |
|---|---|---|
| city* | string | City the area is in. |
| days | integer | Days ending at the newest incident in the city. Default 90. Use 400 for about 14 months. |
| place | string | Neighborhood or rough area, such as Harbor View or Logan Square. Omit if you pass a box. |
| lat_max | number | North edge of the box. Geographic filter. |
| lat_min | number | South edge of the box. Geographic filter. |
| lon_max | number | East edge of the box. Geographic filter. |
| lon_min | number | West edge of the box. Geographic filter. |
{
"type": "object",
"required": [
"city"
],
"properties": {
"city": {
"enum": [
"chicago",
"milwaukee",
"new york",
"minneapolis",
"denver"
],
"type": "string",
"description": "City the area is in."
},
"days": {
"type": "integer",
"maximum": 450,
"minimum": 7,
"description": "Days ending at the newest incident in the city. Default 90. Use 400 for about 14 months."
},
"place": {
"type": "string",
"description": "Neighborhood or rough area, such as Harbor View or Logan Square. Omit if you pass a box."
},
"lat_max": {
"type": "number",
"description": "North edge of the box. Geographic filter."
},
"lat_min": {
"type": "number",
"description": "South edge of the box. Geographic filter."
},
"lon_max": {
"type": "number",
"description": "East edge of the box. Geographic filter."
},
"lon_min": {
"type": "number",
"description": "West edge of the box. Geographic filter."
}
}
}One page of individual incidents inside a lat/lon box. Counts, shares, months, and streets belong on get_area_trends. A window longer than 45 days without lat_min, lat_max, lon_min, and lon_max is refused. Chicago's portal withholds about the last seven days. New York publishes complaints after a quarter closes.
| Argument | Type | Description |
|---|---|---|
| city | string | City to query. |
| limit | integer | Max records to return (1-500). |
| place | string | Address text, such as a street name, matched against location, block, and community area. This is not a neighborhood boundary. Harbor View and other neighborhood names need the lat/lon box, or get_area_trends. |
| offset | integer | Records to skip for pagination. |
| lat_max | number | North edge. Required geographic filter for a long window. |
| lat_min | number | South edge. Required geographic filter for a long window. |
| lon_max | number | East edge. Required geographic filter for a long window. |
| lon_min | number | West edge. Required geographic filter for a long window. |
| end_date |
Citywide counts, date range, and top crime types. There is no neighborhood or lat/lon filter. For a place, call get_area_trends.
| Argument | Type | Description |
|---|---|---|
| city | string | City to get stats for. Use 'all' for cross-city comparison. |
| top_n | integer | Number of top items to return. |
{
"type": "object",
"properties": {
"city": {
"enum": [
"all",
"chicago",
"milwaukee",
"new york",
"minneapolis",
"denver"
],
"type": "string",
"default": "all",
"description": "City to get stats for. Use 'all' for cross-city comparison."
},
"top_n": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Number of top items to return."
}
}
}Return the lat/lon edges of a neighborhood or rough area. Call this only when you need those edges. For trends, call get_area_trends with the place name and skip this tool. The suggested query is a short incident list, not a trend summary.
| Argument | Type | Description |
|---|---|---|
| city* | string | City the place is in. |
| days | integer | Days for the suggested incident list. Omit for a short default. Year-long trend windows belong on get_area_trends. |
| place* | string | Neighborhood, street, borough, or a rough area such as downtown or north side. |
| primary_types | array | Optional crime types to carry into the suggested query. |
{
"type": "object",
"required": [
"city",
"place"
],
"properties": {
"city": {
"enum": [
"chicago",
"milwaukee",
"new york",
"minneapolis",
"denver"
],
"type": "string",
"description": "City the place is in."
},
"days": {
"type": "integer",
"maximum": 90,
"minimum": 1,
"description": "Days for the suggested incident list. Omit for a short default. Year-long trend windows belong on get_area_trends."
},
"place": {
"type": "string",
"description": "Neighborhood, street, borough, or a rough area such as downtown or north side."
},
"primary_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional crime types to carry into the suggested query."
}
}
}Text search of crime types and descriptions. There is no neighborhood box. A place name such as Harbor View is usually absent from the incident text. For a place, call get_area_trends.
| Argument | Type | Description |
|---|---|---|
| city | string | City to search. Use 'all' for every city. |
| limit | integer | Max results (1-200). |
| query* | string | Search text (e.g., 'armed robbery', 'domestic battery'). |
{
"type": "object",
"required": [
"query"
],
"properties": {
"city": {
"enum": [
"all",
"chicago",
"milwaukee",
"new york",
"minneapolis",
"denver"
],
"type": "string",
"default": "all",
"description": "City to search. Use 'all' for every city."
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 200,
"minimum": 1,
"description": "Max results (1-200)."
},
"query": {
"type": "string",
"description": "Search text (e.g., 'armed robbery', 'domestic battery')."
}
}
}| string |
| End date in YYYY-MM-DD format. |
| start_date | string | Start date in YYYY-MM-DD format. |
| search_text | string | Text search across primary_type and description fields. |
| primary_types | array | Filter by crime types (e.g., ['THEFT', 'BATTERY', 'NARCOTICS']). Omit for all types. |
| location_descriptions | array | Filter by location descriptions (e.g., ['STREET', 'RESIDENCE']). Omit for all. |
{
"type": "object",
"properties": {
"city": {
"enum": [
"chicago",
"milwaukee",
"new york",
"minneapolis",
"denver"
],
"type": "string",
"default": "chicago",
"description": "City to query."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 500,
"minimum": 1,
"description": "Max records to return (1-500)."
},
"place": {
"type": "string",
"description": "Address text, such as a street name, matched against location, block, and community area. This is not a neighborhood boundary. Harbor View and other neighborhood names need the lat/lon box, or get_area_trends."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Records to skip for pagination."
},
"lat_max": {
"type": "number",
"description": "North edge. Required geographic filter for a long window."
},
"lat_min": {
"type": "number",
"description": "South edge. Required geographic filter for a long window."
},
"lon_max": {
"type": "number",
"description": "East edge. Required geographic filter for a long window."
},
"lon_min": {
"type": "number",
"description": "West edge. Required geographic filter for a long window."
},
"end_date": {
"type": "string",
"description": "End date in YYYY-MM-DD format."
},
"start_date": {
"type": "string",
"description": "Start date in YYYY-MM-DD format."
},
"search_text": {
"type": "string",
"description": "Text search across primary_type and description fields."
},
"primary_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by crime types (e.g., ['THEFT', 'BATTERY', 'NARCOTICS']). Omit for all types."
},
"location_descriptions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by location descriptions (e.g., ['STREET', 'RESIDENCE']). Omit for all."
}
}
}