Skip to main content
Glama

Search UK Police Stop and Search

ukcrime_search_stops
Read-onlyIdempotent

Search police stop and search records for 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 location_id from an earlier result, or a police neighbourhood — or across a whole force with area 'force', which includes stops the force could not place. Returns the total and counts by search type, self-defined and officer-defined ethnicity, outcome, object of search, legislation, age range, gender, whether the outcome was linked to the object of search, and whether more than outer clothing was removed, each month's total for a range, and a page of stops. filters narrow the counts and the page together, so filtering one field and reading another's breakdown gives a cross-tab. Forces skip months and some publish none; the result names each force it finds for the area that did not publish, with the months it skipped.

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' (force alone: every stop the force published for the month or range, placed or not). 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' (alone), where 'btp' (British Transport Police) is also accepted.
limitNoStops on this page, 1–200. Default 15.
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.
filtersNoUp to 8 filters, all of which a stop must match; they narrow the counts and the page together. Fields: type, self_defined_ethnicity, officer_defined_ethnicity, outcome, object_of_search, legislation, age_range, gender, outcome_linked_to_object_of_search, removal_of_more_than_outer_clothing.
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.
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.
stopsNoThis page of matched stops, oldest first, then by location_id.
totalNoStops matched after filters, over the month or range.
noticeNoDefaulted month, coverage gaps, why a result is empty, and how to page on.
by_typeNoMatched stops by search type, most first.
filtersNoFilters applied, case-insensitively; empty when none.
by_monthNoStops matched in each month of the range, oldest first; their totals sum to total. Present only when month_from was given.
unplacedNoMatched stops with no location — the force's unplaced stops, for area 'force'.
by_genderNoMatched stops by gender, most first.
data_noteNoWhat these records can and cannot say; read it first.
truncatedNoTrue when more rows remain after this page.
by_outcomeNoMatched stops by outcome, most first; '(not recorded)' is often the largest.
month_fromNoFirst month of the range searched, YYYY-MM; present only when month_from was given.
attributionNoOpen Government Licence attribution.
next_offsetNoPass as offset for the next page; absent on the last page.
by_age_rangeNoMatched stops by age range, most first.
by_legislationNoMatched stops by legislation, most first.
force_publishedNoWhether every force found for the area (the one it names, or each located at a point, a polygon's centre and outermost vertices, or a location's map point) published stop and search this month, or in every month of a range: false when any month was missed. Otherwise absent when no force was found, when a month has no row in the publication list, or when none of those found is missing yet a polygon point could not be looked up.
unfiltered_totalNoStops in the area over the month or range, before filters.
by_object_of_searchNoMatched stops by object of search, most first.
by_self_defined_ethnicityNoMatched stops by ethnicity as the person defined it, most first.
by_officer_defined_ethnicityNoMatched stops by ethnicity as the officer perceived it, most first.
by_outcome_linked_to_object_of_searchNoMatched stops by whether the outcome was linked to the object of search ('true', 'false' or '(not recorded)'), most first.
by_removal_of_more_than_outer_clothingNoMatched stops by whether more than outer clothing was removed ('true', 'false' or '(not recorded)' where the force sent no value, as some do for vehicle-only searches), most first.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/openWorld/idempotent annotations, it discloses genuinely non-obvious behavior: filters narrow the counts and the page together so cross-tabs are possible, and forces skip months or publish none with the gaps named in the result. These data-quality caveats are exactly what an agent cannot infer from structured fields.

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?

The core operation is front-loaded in the first clause and the three sentences carry almost no filler. However the second sentence is a sprawling enumeration of return fields that is partly redundant given the output schema, making the prose dense rather than tight.

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?

With an output schema present and annotations covering safety, the description supplies everything else an agent needs: area-mode selection, the month/range relationship, filter cross-tab behavior, and the force-publishing caveat. Nothing material for correct invocation 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 description coverage is 100%, so a 3 is the floor; the description earns above that by tying parameters together (month_from pairs with month for a range, location_id comes from an earlier result, neighbourhood needs force) and clarifying how filters interact with breakdowns. The individual field semantics still live largely in the schema.

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?

The opening states a specific verb and resource ('Search police stop and search records') and immediately bounds scope by month/range and area mode. An agent can distinguish it from search_crimes and search_outcomes without opening any schema, since the data domain is named explicitly.

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

Usage Guidelines4/5

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

It explains the conditions that select each area mode ('point' with a 1-mile radius, 'polygon', 'location_id', 'neighbourhood', 'force', the last of which 'includes stops the force could not place'). It gives clear context but never names a sibling tool or says when to prefer this over ukcrime_search_crimes/search_outcomes, so it stops short of explicit alternatives.

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.