Uk Police Crime Mcp Server

io.github.cyanheadsv0.1.1更新於 Oct 1, 2026

Search UK street crime, outcomes, stop and search, and neighbourhood teams (Scotland: BTP only).

概覽

AI 產生的概覽

讓助理查詢英國街頭犯罪、警方處理結果、攔截搜查紀錄以及社區警政團隊,資料來自 data.police.uk。

功能
以開放的 data.police.uk 資料集提供六個工具:查詢參考資料(警力、犯罪類別、已發布月份、社區編號),依座標點、多邊形、地點、社區或整個警力範圍檢索某月的街頭犯罪,檢索警方處理結果,依 persistent_id 取得最多 25 件犯罪的完整處理歷程,依最多八個篩選條件檢索攔截搜查紀錄,以及查找某地所屬警力與社區警政團隊。結果包含計數、類別與處理結果分布、分頁和具型別的失敗原因。涵蓋英格蘭、威爾斯、北愛爾蘭與英國交通警察;蘇格蘭僅有交通警察駐點紀錄。
適用情境
適合需要回答英格蘭、威爾斯或北愛爾蘭已記錄犯罪、警方處理結果、攔截搜查或地方警政團隊相關問題的情境,也適合依族裔、結果、法律依據等欄位對攔截搜查紀錄做交叉統計。適用於研究、新聞與社區層級的分析,而非即時警情或緊急資訊。
執行需求
以 stdio 本機程序(或本機 Streamable HTTP 伺服器)執行,透過 npm 套件 @cyanheads/uk-police-crime-mcp-server 安裝,需要 Bun v1.4.0+ 或 Node.js v24+,也可使用 Docker。不需要 API 金鑰,但需要連線至 data.police.uk 的網路存取。選用環境變數包括 MCP_AUTH_MODE、MCP_HTTP_HOST、MCP_HTTP_PORT、MCP_HTTP_ENDPOINT_PATH 與 MCP_LOG_LEVEL。
安裝前請注意
僅對公開資料集進行唯讀查詢,不寫入、不涉及付款或憑證。資料經匿名化:位置是涵蓋至少八個地址的地圖點,並非實際案發地點。僅提供最近 36 個月;大曼徹斯特警察局不發布犯罪、處理結果或攔截搜查資料;北愛爾蘭沒有處理結果與攔截搜查;2019 年 6 月起的法院結果不公開。計數偏低或為零可能代表資料缺失,而非沒有事件發生。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Uk Police Crime Mcp Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

@cyanheads/uk-police-crime-mcp-server

Search UK street-level crime, police outcomes, stop and search, and neighbourhood teams from data.police.uk: England, Wales and Northern Ireland forces, plus British Transport Police (Scotland's only coverage), via MCP. STDIO or Streamable HTTP.

6 Tools


Overview

Monthly street-level crime, police outcomes, and stop and search records from data.police.uk, plus the neighbourhood policing teams behind them. Coverage is the 43 territorial forces of England and Wales and the Police Service of Northern Ireland, plus British Transport Police, whose station records are the only coverage of Scotland. Search by point, polygon, map point, neighbourhood, or whole force; follow a crime's outcome history; find who polices a place. Runs as a stdio process or a local Streamable HTTP server. No API key required.

Tools

ToolDescription
ukcrime_list_referenceDecode force ids, crime categories, a force's neighbourhood ids, and which months and forces are published
ukcrime_search_crimesSearch the street-level crimes recorded in one month inside an area, with counts by category and latest outcome
ukcrime_search_outcomesList the police outcomes recorded in one month inside an area, for crimes from that month or earlier
ukcrime_get_crime_outcomesFetch the full outcome history of up to 25 crimes by persistent_id
ukcrime_search_stopsSearch stop and search records for one month inside an area or across a whole force, with breakdowns and filters
ukcrime_find_neighbourhoodFind the force and neighbourhood policing team for a point, or look one up by id

Capability reference

ukcrime_list_reference tool

  • topic: forces, categories, availability, or neighbourhoods (needs force); name_contains filters forces and neighbourhoods by name, and month narrows availability to one row
  • availability returns latest_month, earliest_month, and which forces published stop and search each month; with force, the months that force did and did not publish
  • forces adds British Transport Police (btp) and each force's known coverage gaps; errors are typed (force_required, unknown_force, invalid_filter)

ukcrime_search_crimes tool

  • area: point (lat, lng; a 1-mile radius), polygon (3–2,500 vertices), location (location_id), neighbourhood (force + neighbourhood_id), or force_unplaced (force: the crimes it could not place); optional month (default: latest published) and category (default: every category)
  • Returns total, by_category, by_outcome, up to 10 top_locations, and a page of crimes, each with the persistent_id that ukcrime_get_crime_outcomes takes; limit defaults to 25 (max 200), and next_offset continues
  • Failures carry a typed reason, such as month_not_published, unknown_category, or area_too_large

ukcrime_search_outcomes tool

  • Same areas as ukcrime_search_crimes except force_unplaced; month is when the outcome was recorded, and category counts only outcomes for crimes in that category
  • Returns total, unfiltered_total, by_outcome (code, name, count), by_crime_month, and a page of outcomes, each with its crime; limit defaults to 20 (max 200)
  • Police outcomes only: court results are not published, and the result says when a force publishes no outcomes

ukcrime_get_crime_outcomes tool

  • persistent_ids: 1–25 64-character ids from ukcrime_search_crimes or ukcrime_search_outcomes; anti-social behaviour records carry none
  • Each crime comes back with every outcome, oldest first; history_available: false marks a crime with no published history
  • Ids data.police.uk does not hold land in not_found, failed lookups in failed, so one bad id never fails the batch

ukcrime_search_stops tool

  • area: point, polygon, location, neighbourhood, or force (every stop the force published, placed or not); up to 8 filters on type, self_defined_ethnicity, officer_defined_ethnicity, outcome, object_of_search, legislation, age_range, or gender
  • Returns total, unfiltered_total, unplaced, force_published, a breakdown per filterable field, and a page of stops; limit defaults to 15 (max 200)
  • Filters narrow the breakdowns and the page together, so filtering one field and reading another's breakdown is a cross-tab

ukcrime_find_neighbourhood tool

  • Look up by lat + lng or by force + neighbourhood_id; include picks priorities, team, events (the default three) and boundary
  • Returns the force, the team's description, contact channels and stations, current priorities, up to 10 upcoming events (events_total counts all), and the boundary as a polygon string the search tools accept
  • Team entries carry only each officer's rank and name, as forces publish them; biographies and personal contact details are dropped by design. A point outside coverage returns found: false with guidance

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

data.police.uk-specific:

  • Every location is an anonymised map point covering at least eight addresses, never the place a crime or stop happened; outputs label it that way
  • Validates locally what the upstream would silently widen: unknown categories, months outside the window, misspelled force ids, and area fields the chosen area does not use
  • Omitting month searches the latest published month and echoes it; coverage gaps per force are dated and named in each result's notice
  • One process-wide request pacer under data.police.uk's rate limit, with retries and in-process caches for reference data and area responses

Agent-friendly output:

  • Every response carries the Open Government Licence attribution and a data_note on what the records can and cannot say
  • Counts come with the page: totals and breakdowns cover every matched record, while limit / offset / next_offset page the rows
  • Typed failure reasons with a recovery hint, and a notice that separates "no data published" from "nothing happened"

Known limitations

  • Only the latest 36 months are served; longer trends need the bulk archive at data.police.uk, which this server does not read
  • Greater Manchester Police publishes no crime, outcome or stop and search data; searches there return only other forces' or British Transport Police records
  • Northern Ireland has no outcomes and no stop and search, and every crime other than anti-social behaviour carries the placeholder outcome Under investigation
  • Scotland is covered only by British Transport Police station records
  • Court outcomes from June 2019 onward are not published
  • data.police.uk can refuse an area holding more than about 10,000 records, whatever the category, and the point radius is fixed at one mile; dense city centres need polygons smaller than a borough
  • The API says which forces published stop and search each month, but not which supplied crime data, so a force that skipped a month shows as a thin or empty area; a low or zero count can mean missing data
  • Many stops carry a blank outcome, reported as (not recorded); stop datetime is UTC while months follow UK local time

Getting started

Add the following to your MCP client configuration file.

json
{  "mcpServers": {    "uk-police-crime-mcp-server": {      "type": "stdio",      "command": "bunx",      "args": ["@cyanheads/uk-police-crime-mcp-server@latest"],      "env": {        "MCP_TRANSPORT_TYPE": "stdio",        "MCP_LOG_LEVEL": "info"      }    }  }}

Or with npx (no Bun required):

json
{  "mcpServers": {    "uk-police-crime-mcp-server": {      "type": "stdio",      "command": "npx",      "args": ["-y", "@cyanheads/uk-police-crime-mcp-server@latest"],      "env": {        "MCP_TRANSPORT_TYPE": "stdio",        "MCP_LOG_LEVEL": "info"      }    }  }}

Or with Docker:

json
{  "mcpServers": {    "uk-police-crime-mcp-server": {      "type": "stdio",      "command": "docker",      "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/uk-police-crime-mcp-server:latest"]    }  }}

For Streamable HTTP, set the transport and start the server:

sh
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http# Server listens at http://localhost:3010/mcp

Prerequisites

  • Bun v1.4.0 or higher (or Node.js v24+).
  • No API key: data.police.uk is open and keyless.

Installation

  1. Clone the repository:
sh
git clone https://github.com/cyanheads/uk-police-crime-mcp-server.git
  1. Navigate into the directory:
sh
cd uk-police-crime-mcp-server
  1. Install dependencies:
sh
bun install

Configuration

The server reads no environment variables of its own. data.police.uk allows 15 requests a second with a burst of 30 per client IP; the server paces every request process-wide under that limit, so a hosted deployment shares one budget behind its egress IP, and requests queue for their turn.

VariableDescriptionDefault
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTHTTP server port.3010
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
LOGS_DIRDirectory for log files (Node.js only).<app-root>/logs
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1.in-memory
OTEL_ENABLEDEnable OpenTelemetry.false

See .env.example for the common framework overrides.

Running the server

Local development

  • Build and run the production version:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:http# orbun run start:stdio
  • Run checks and tests:

    sh
    bun run devcheck  # Lints, formats, type-checks, and morebun run test      # Runs the test suite

Project structure

DirectoryPurpose
src/mcp-server/toolsTool definitions (*.tool.ts), plus the area handling, input vocabulary and output shapes the three search tools share.
src/services/police-apidata.police.uk client — request pacer, retries, caches, upstream schemas, record normalization, and the dated coverage-gaps table.
tests/Unit and integration tests, mirroring the src/ structure.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for logging, ctx.state for storage
  • Register new tools and resources in the createApp() arrays in src/index.ts
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

This project is licensed under the Apache 2.0 License. See the LICENSE file for details.

Data: Contains public sector information licensed under the Open Government Licence v3.0. Source: data.police.uk. Every tool response carries this attribution; storing, caching and redistributing the data are permitted with it. This project is independent of the Home Office, data.police.uk and the police forces.

來源:README.md,提交 6e42476

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v0.1.1最新Oct 1, 2026