uk-police-crime-mcp-server について
uk-police-crime-mcp-serverは、分析担当者や研究者、公共サービスアプリ向けにdata.police.ukの記録を提供します。対象はイングランド、ウェールズ、北アイルランドと、スコットランドのBritish Transport Policeです。地域別の犯罪・職務質問検索、犯罪の処理履歴、地域警察チームの確認ができます。
主な機能
- 01街頭犯罪記録の検索
- 02犯罪の処理結果と履歴の確認
- 03職務質問記録の検索
- 04地域警察チームと警察組織データの確認
- 05公開状況と参照データの確認
活用シーン
- 01地域内の犯罪カテゴリを比較
- 02個別犯罪の処理履歴を追跡
- 03属性で職務質問記録を絞り込み
- 04地点を担当する地域警察チームを特定
MCP 対応
data.police.ukの犯罪、処理結果、職務質問、地域警察情報を検索する6つのツールをMCPクライアントに公開します。STDIOとStreamable HTTPに対応し、ホスト型エンドポイントも利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://uk-police-crime.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-uk-police-crime https://uk-police-crime.caseyjhand.com/mcp{"mcpServers":{"cyanheads-uk-police-crime":{"type":"http","url":"https://uk-police-crime.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-uk-police-crime":{"type":"http","url":"https://uk-police-crime.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-uk-police-crime":{"type":"http","url":"https://uk-police-crime.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-uk-police-crime":{"serverUrl":"https://uk-police-crime.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
6| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| force | string | いいえ | 'leicestershire' などの警察組織 ID、または 'Leicestershire Police' などの名称です。大文字と小文字は区別されず、スペース、アンダースコア、ハイフンは相互に一致します。'&' は 'and' に一致し、末尾の 'Police'、'Police Service'、'Constabulary' は省略できます。topic が 'neighbourhoods' の場合は必須です。'availability' では 'btp'(British Transport Police)も指定でき、その警察組織がストップ・アンド・サーチのデータを公開した月と公開しなかった月が追加されます。'forces' と 'categories' では使用できません。 |
| month | string | いいえ | YYYY-MM 形式の月です。topic 'availability' のみで使用でき、その月の行だけを返します。 |
| topic | enum | はい | 一覧表示する内容:'forces'(警察組織 ID)、'categories'(犯罪カテゴリの slug)、'availability'(公開済みの月とストップ・アンド・サーチの公開状況)、または 'neighbourhoods'(1 つの警察組織の近隣地域 ID。force が必要)。forces | categories | availability | neighbourhoods |
| name_contains | string | いいえ | 名前に含まれる必要がある単語を、順不同で指定します。大文字と小文字、アクセント記号、句読点は無視されるため、値には少なくとも 1 つの英字または数字が必要です。topic 'forces' と 'neighbourhoods' のみで使用できます。 |
詳細
@cyanheads/uk-police-crime-mcp-server
data.police.uk のデータを利用して、英国の街頭犯罪、警察の対応結果、職務質問、地域警察チームを検索します。イングランド、ウェールズ、北アイルランドの警察組織に加え、British Transport Police(スコットランドで唯一対象となる警察組織)にも MCP 経由で対応します。STDIO または Streamable HTTP を使用できます。
公開ホストサーバー: https://uk-police-crime.caseyjhand.com/mcp
概要
イングランド、ウェールズ、北アイルランドの街頭犯罪、警察の対応結果、職務質問の記録を data.police.uk から取得します。地点、エリア、地域、警察組織で検索できるほか、犯罪の対応結果の履歴をたどり、どのチームがその場所を管轄しているかを確認できます。
ツール
| ツール | 説明 |
|---|---|
ukcrime_list_reference | 警察組織 ID、犯罪カテゴリ、警察組織の地域 ID、公開済みの月と警察組織を確認します |
ukcrime_search_crimes | 1 か月分、または最大 12 か月分の記録済み街頭犯罪をエリア内で検索し、カテゴリ別件数と最新の対応結果を表示します |
ukcrime_search_outcomes | 1 か月分のエリア内で記録された警察の対応結果を一覧表示します。対象は、その月以前の犯罪です |
ukcrime_get_crime_outcomes | persistent_id を指定して、最大 25 件の犯罪の対応結果履歴全体を取得します |
ukcrime_search_stops | 1 か月分、または最大 12 か月分の職務質問記録を、エリア内または警察組織全体から検索し、内訳とフィルターを表示します |
ukcrime_find_neighbourhood | 地点から警察組織と地域警察チームを特定するか、ID で検索します |
機能リファレンス
ukcrime_list_reference tool
topic:forces、categories、availability、またはneighbourhoods(forceが必要です)。name_containsはforcesとneighbourhoodsを名前で絞り込み、monthはavailabilityを1行に絞り込みますavailabilityはlatest_month、earliest_month、および各月に警察組織が発表したストップ・アンド・サーチの情報を返します。forceを指定すると、その警察組織が発表した月と発表しなかった月を返しますforcesには British Transport Police(btp)と、各警察組織で判明している対象範囲のgapsが含まれます。型付きエラー:force_required、unknown_force、invalid_filter
ukcrime_search_crimes tool
area:point(lat、lng。半径1マイル)、polygon(頂点数3~2,500)、location(location_id)、neighbourhood(force+neighbourhood_id)、またはforce_unplaced(force:位置を特定できなかった犯罪)。任意のmonth(デフォルト:最新の公開月)、monthで終了する最大12か月の範囲を指定するmonth_from、およびcategory(デフォルト:すべてのカテゴリー)total、by_category、by_outcome、最大10件のtop_locations、およびukcrime_get_crime_outcomesで使用するpersistent_idを含むcrimesのページを返します。limitのデフォルトは25で、1~10,000を受け付け、最大200が適用されます。適用上限はcapとして返されます。next_offsetで続きから取得できますmonth_fromを指定すると、合計、内訳、top_locationsは範囲全体を対象とし、by_monthは各月の合計を示します。行は古い月から順にページ分割されます- エラーには、
month_not_published、unknown_category、area_too_largeなどの型付きreasonが含まれます。1回の呼び出しで範囲全体を取得できない場合は、range_incompleteで失敗します(再度呼び出してください。取得済みの月はキャッシュされます)。またはrange_too_largeで失敗します
ukcrime_search_outcomes tool
force_unplacedを除き、ukcrime_search_crimesと同じエリアを指定します。monthは結果が記録された月で、categoryを指定すると、そのカテゴリーの犯罪に対する結果のみがカウントされますtotal、unfiltered_total、by_category(犯罪カテゴリーと件数)、by_outcome(コード、名前、件数)、by_crime_month、およびそれぞれの犯罪情報を含むoutcomesのページを返します。limitのデフォルトは20で、1~10,000を受け付け、最大200が適用されます。適用上限はcapとして返されます- 警察が公表した結果のみです。裁判所の結果は公表されていません。また、警察組織が結果を公表していない場合は、その旨が返されます
ukcrime_get_crime_outcomes tool
persistent_ids:ukcrime_search_crimesまたはukcrime_search_outcomesの64文字のID。配列、またはカンマ/空白区切りの文字列で指定します。配列の生要素は最大1,000件、重複排除前の空でないトークンは最大1,000件、合計UTF-16コード単位数は最大128,000です。反社会的行動の記録にはIDがありません- クエリを実行する前にすべてのIDを検証します。先頭から最大25件の重複のないIDを処理し、次回の呼び出しで
persistent_idsとして送信する順序付きのremaining_idsを返します(すべて処理済みの場合は空の配列) - 各犯罪について、すべての結果を古い順に返します。
history_available: falseは、公表された履歴がない犯罪を示します - 不明なIDは
not_foundに、取得に失敗したIDはfailedに含まれます。処理対象の検索がすべて失敗した場合も、呼び出しは失敗します
ukcrime_search_stops ツール
area:point、polygon、location、neighbourhood、またはforce(配置の有無を問わず、その警察組織が公開したすべての職務質問);ukcrime_search_crimesと同様に、monthとmonth_fromは省略可能です。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のうち最大 8 項目をfiltersで指定できます(最後の 2 項目には'true'、'false'、または'(not recorded)'を指定します。JSON の真偽値も使用できます)total、unfiltered_total、unplaced、force_published(対象エリアで見つかったすべての警察組織が、その月または期間内のすべての月について職務質問を公開したかどうかを示します。対象エリアとは、指定した警察組織、地点・ポリゴンの中心点と最外周の頂点・場所の地図上の地点に位置する警察組織を指します)、フィルター指定可能な各項目の内訳、stopsのページを返します。limitのデフォルトは 15 で、1~10,000 を指定できますが、適用される上限は 200 で、capとして返されますmonth_fromを指定すると、by_monthに月ごとの合計とそれぞれのforce_publishedが表示されます。ある月に警察組織がデータを公開しなかった場合、件数の減少ではなく欠落として表示されます。通知には、各警察組織が公開を見送った月が記載されます- 期間内のすべての月について、フィルターは内訳とページの両方を絞り込みます。ある項目でフィルターを指定し、別の項目の内訳を確認することで、クロス集計を行えます
- 公開済みの
outcome: falseはNothing foundを意味します。空欄、null、または値がない結果は、発見率フラグとは独立して(not recorded)のままです
ukcrime_find_neighbourhood ツール
latとlng、またはforceとneighbourhood_idで検索します。includeではpriorities、team、events(デフォルトの 3 項目)、およびboundaryを選択できます- 地区の検索と照会では、まず ID を完全一致で検索し、見つからない場合はキャッシュされた警察組織一覧から大文字と小文字を区別しない一意の一致を再試行します。一致候補が複数ある場合は、候補の ID を示して失敗します。結果には正規の表記が返されます。
- 警察組織、そのチームの説明、連絡手段と警察署、現在の優先事項、警察組織が公開した今後のイベントすべて(開催日時の早い順)、および検索ツールで使用できるポリゴン文字列としての境界を返します
- チームの情報には役職と名前のみが含まれます。略歴や個人の連絡先情報は返されません。対象範囲外の地点では、
found: falseとguidanceが返されます
機能
@cyanheads/mcp-ts-core を基盤としており、stdio と Streamable HTTP のトランスポート、プラグイン可能な認証(none / jwt / oauth)、交換可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。
data.police.uk 固有の機能:
- すべての位置情報は、少なくとも8つの住所をカバーする匿名化された地図上の地点であり、犯罪や職務質問が発生した場所そのものではありません。出力にはその旨が明記されます。
- 上流 API が黙って検索範囲を広げてしまう条件をローカルで検証します。未知のカテゴリ、対象期間外の月、IDにも名前にも一致しない警察組織(
Leicestershire Policeでもleicestershireでも指定できます)、選択した地域で使用されていない地域フィールドが対象です。 monthを省略すると、最新の公開月を検索して結果に含めます。警察組織ごとのデータ公開状況に空白がある場合は、その年月と警察組織名が各結果のnoticeに記載されます。- データ公開状況の確認に失敗した場合やタイムアウトした場合でも、検索記録は保持され、警察組織が見つからない場合も含め、公開状況を確認できなかったことを明示します。公開状況が不明な場合に
force_published: trueと報告することはありません。 - ほとんどの地域では、犯罪または職務質問の12か月分の傾向を1回の呼び出しで取得できます。
month_fromは月を2か月ずつ取得し、それぞれを15分間キャッシュするため、ページングや再送信では地域情報へのリクエストが発生しません。大きな地域で時間が足りなくなるとrange_incompleteエラーになり、再取得では未取得の月だけを取得します。 - data.police.uk のレート制限に従って、プロセス全体でリクエストを調整し、再試行とプロセス内キャッシュを行います。
エージェントに適した出力:
- すべての応答に Open Government Licence の帰属表示が含まれます。
ukcrime_list_reference以外のすべてのツールでは、記録から分かることと分からないことを示すdata_noteも追加されます。 - 合計値と内訳は一致するすべての記録を対象とし、
limit/offset/next_offsetで行をページ分割できます。 - 復旧方法のヒントを含む型付きの失敗理由と、「データが公開されていない」状態と「何も起きていない」状態を区別する
noticeを返します。
既知の制限事項
- 提供されるのは最新の36か月分のみです。それより長い期間の傾向を調べるには、data.police.uk の一括アーカイブが必要ですが、このサーバーはアーカイブを読み取りません。
- 範囲は最大12か月分です。また、
ukcrime_search_outcomesは一度に1か月分のみを取得します。最近リクエストされていない月の結果は、data.police.uk からの応答に10〜53秒かかる場合があります。 - Greater Manchester Police は犯罪、結果、職務質問のデータを公開していません。この地域の検索で返されるのは、他の警察組織または British Transport Police の記録のみです。
- Northern Ireland では、結果と職務質問のデータがありません。また、反社会的行為以外のすべての犯罪に、プレースホルダーの結果
Under investigationが付与されます。 - 2019年6月以降の裁判結果は公開されていません。
- data.police.uk は、カテゴリにかかわらず約10,000件を超える記録を含む地域へのリクエストを拒否する場合があります。また、地点の検索半径は1マイルに固定されているため、都市中心部などの人口密集地域では、自治区より小さいポリゴンが必要です。
- API は、毎月どの警察組織が職務質問データを公開したかは報告しますが、犯罪データを提供した警察組織は報告しません。そのため、ある月のデータを提供しなかった警察組織の地域は、データが少ない、または空になることがあります。件数が少ない、またはゼロの場合は、データが欠けている可能性があります。
- 多くの職務質問記録では結果が空欄であり、
(not recorded)として報告されます。職務質問のdatetimeは UTC ですが、月の区切りには英国の現地時間が使われます。
はじめに
公開ホストインスタンス
公開インスタンスは https://uk-police-crime.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP 経由で、任意の MCP クライアントから接続できます。
{
"mcpServers": {
"uk-police-crime-mcp-server": {
"type": "streamable-http",
"url": "https://uk-police-crime.caseyjhand.com/mcp"
}
}
}
セルフホスト / ローカル
MCP クライアントの設定ファイルに、以下を追加します。
{
"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"
}
}
}
}
または、npx を使用します(Bun は不要です)。
{
"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"
}
}
}
}
または、Docker を使用します。
{
"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"]
}
}
}
Streamable HTTP を使用する場合は、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。
- API キーは不要です。data.police.uk はオープンで、キーなしで利用できます。
インストール
- リポジトリをクローンします。
git clone https://github.com/cyanheads/uk-police-crime-mcp-server.git
- ディレクトリに移動します。
cd uk-police-crime-mcp-server
- 依存関係をインストールします。
bun install
設定
このサーバーは独自の環境変数を読み取りません。data.police.uk の制限(毎秒 15 件、バースト 30 件)に従って、プロセス全体でリクエストのペースを調整します。呼び出しは順番が来るまでキューに入ります。data.police.uk がサーバーをレート制限した場合、別の試行を行う時間が残る Retry-After は、その時間が経過するまで待機します。それより長い場合、またはレート制限が再試行の期限を超えて続く場合は、待機時間を示して呼び出しが rate_limited として失敗します。このサーバーのキューが混雑すると pacer_shed、サービス停止が発生すると upstream_unavailable、呼び出しが時間切れになると retry_deadline_exceeded として失敗します。これら 4 つはすべて再試行可能で、待機時間がわかっている場合はヒントにその時間が示されます。
| 変数 | 説明 | デフォルト |
|---|---|---|
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモード:stateless、stateful、または auto。 | auto(.env.example と Docker イメージでは stateless に設定されています) |
MCP_AUTH_MODE | 認証:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、warning、error など)。 | info |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ)。 | <app-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
共通のフレームワーク設定の上書きについては、.env.example を参照してください。
サーバーの実行
ローカル開発
-
本番バージョンをビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行する:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/mcp-server/tools | ツール定義(*.tool.ts)と、検索ツールで共有するエリア処理、入力語彙、出力形式。 |
src/services/police-api | data.police.uk クライアント:リクエストペーサー、再試行、キャッシュ、上流スキーマ、レコードの正規化、日付付きのカバレッジギャップテーブル。 |
tests/ | 単体テストと統合テスト。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで
try/catchは使用しません - ログには
ctx.log、ストレージにはctx.stateを使用します - 新しいツールは
allToolDefinitions(src/mcp-server/tools/definitions/index.ts)に登録します。これはsrc/index.tsからcreateApp()に渡されます - 外部 API 呼び出しは、未加工データの検証 → ドメイン型への正規化 → 出力スキーマの返却、という流れでラップします。不足しているフィールドを捏造してはいけません
貢献
問題の報告を歓迎します。提出前にチェックとテストを実行してください:
bun run devcheck
bun run test
ライセンス
このプロジェクトは Apache 2.0 License の下でライセンスされています。詳細については LICENSE ファイルを参照してください。
データ: Open Government Licence v3.0 に基づいてライセンスされた公共部門情報を含みます。出典:data.police.uk。すべてのツールの応答にはこの帰属表示が含まれます。帰属表示を付ければ、データの保存、キャッシュ、再配布が許可されています。このプロジェクトは Home Office、data.police.uk、および各警察組織から独立しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。