Skip to main content
Glama

Search UK Street-Level Crimes

ukcrime_search_crimes
Read-onlyIdempotent

Search street-level crimes recorded in one month, or with month_from a range of up to 12 months, inside an area — a point with a 1-mile radius, a polygon, a snapped location_id from an earlier result, or a police neighbourhood — or list the crimes a force could not place on the map (area 'force_unplaced'). Returns the total, counts by category and by latest police outcome, the busiest map points, each month's total for a range, and a page of crimes, each with the persistent_id that ukcrime_get_crime_outcomes takes; for what police resolved in a month, whenever the crime was recorded, use ukcrime_search_outcomes. Locations are anonymised map points, not crime sites. data.police.uk can refuse an area holding more than about 10,000 crimes, whatever the category — then search smaller polygons.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latNoLatitude, WGS84 decimal degrees, for area 'point'.
lngNoLongitude, WGS84 decimal degrees, for area 'point'.
areaYesArea to search: 'point' (lat and lng; a 1-mile radius), 'polygon' (polygon), 'location' (location_id), 'neighbourhood' (force and neighbourhood_id), or 'force_unplaced' (force alone: the crimes that force could not place on the map). An area field the chosen area does not use is rejected.
forceNoForce id such as 'leicestershire', or its name such as 'Leicestershire Police' (ukcrime_list_reference topic 'forces' lists both); case-insensitive, spaces, underscores and hyphens match each other, '&' matches 'and', and a trailing 'Police', 'Police Service' or 'Constabulary' is optional. For area 'neighbourhood' (with neighbourhood_id) and 'force_unplaced' (alone), where 'btp' (British Transport Police) is also accepted.
limitNoCrimes on this page, 1–200. Default 25.
monthNoMonth as YYYY-MM, or the last month of the range with month_from. Omitted: the latest published month, echoed as month in the result.
offsetNoRows to skip before this page; pass next_offset from the previous result. Default 0.
polygonNoFor area 'polygon': 3–2,500 vertices as { lat, lng } objects, or the string 'lat,lng:lat,lng:…'. The ring closes itself (the last vertex joins the first). [lng, lat] pairs are not accepted.
categoryNoCrime category slug such as 'burglary', or its display name such as 'Violence and sexual offences'; case-insensitive, and spaces, underscores and hyphens match each other ('vehicle_crime' finds 'vehicle-crime'). Omitted: every category (all-crime). ukcrime_list_reference topic 'categories' lists them.
month_fromNoFirst month of a range, YYYY-MM, searched through month — up to 12 months, with a total for each in by_month. Omitted: month alone.
location_idNoFor area 'location': location.location_id from an earlier result — one anonymised map point.
neighbourhood_idNoFor area 'neighbourhood', with force: a neighbourhood id from ukcrime_list_reference topic 'neighbourhoods', or from ukcrime_find_neighbourhood for a point. Case-sensitive; only trimmed.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoPage limit applied.
areaNoThe area as the server searched it.
errorNoPresent when the call failed. Absent on success.
monthNoThe month searched, or the last month of the range, YYYY-MM.
shownNoRows on this page.
totalNoCrimes matched in the area over the month or range.
crimesNoThis page of matched crimes: oldest month first over a range, then by category, then location_id, then id.
noticeNoDefaulted month, coverage gaps, why a result is empty, and how to page on.
by_monthNoCrimes matched in each month of the range, oldest first; their totals sum to total. Present only when month_from was given.
categoryNoThe crime category searched.
data_noteNoWhat these records can and cannot say; read it first.
truncatedNoTrue when more rows remain after this page.
by_outcomeNoMatched crimes by latest police outcome, most first; anti-social behaviour is always '(not recorded)'.
month_fromNoFirst month of the range searched, YYYY-MM; present only when month_from was given.
attributionNoOpen Government Licence attribution.
by_categoryNoMatched crimes by category slug, most first.
next_offsetNoPass as offset for the next page; absent on the last page.
top_locationsNoUp to 10 map points holding the most matched crimes. Absent for area 'force_unplaced'.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnly, idempotent, openWorld), so the description adds context the structured fields cannot: a service-side refusal threshold with a workaround, the anonymisation caveat that locations are map points rather than crime sites, and the shape of the aggregated response. This is behavior beyond the annotations, not a restatement of them.

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?

A single dense paragraph, front-loaded with the core search scope before the returns list and the sibling routing. It is long and slightly run-on, but nearly every clause carries distinct information (area modes, aggregation contents, chaining, limits) rather than filler.

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?

For a 12-parameter, multi-modal search tool with an output schema, the description covers area modes, range semantics, cross-tool chaining, and the operational limit. Return-value detail is present but not required, and nothing an agent needs to invoke it correctly is missing.

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 3 is the floor, but the description adds relational meaning the schema states only per-field: month_from pairs with month to form a range, month omitted defaults to the latest published month (echoed back), and location_id is a 'snapped location_id from an earlier result'. It stops short of clarifying the area-specific parameter combinations in full, which the schema handles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (search street-level crimes) and immediately bounds the scope: one month or a range up to 12 months, inside one of four area types or 'force_unplaced'. It explicitly distinguishes itself from the sibling ukcrime_search_outcomes by contrasting recorded-vs-resolved crimes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use routing ('for what police resolved in a month, whenever the crime was recorded, use ukcrime_search_outcomes'), explains how outputs chain into ukcrime_get_crime_outcomes via persistent_id, and states the failure condition (>~10,000 crimes refused) with the corrective action (search smaller polygons).

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.