UK Supermarkets について
UK Supermarkets は、英国の 9 店舗で食品を比較する人向けの MCP サーバーです。複数店舗への並行検索や価格比較、商品詳細に加え、Tesco の注文履歴とバスケット機能も備えています。
主な機能
- 01複数スーパーの商品検索
- 02店舗間の価格比較
- 03カテゴリーと商品詳細の閲覧
- 04Tesco の注文履歴の取得
- 05Tesco のバスケットの確認と管理
活用シーン
- 01店舗間で食品価格を比較
- 02原材料と栄養情報の確認
- 03スーパーの商品カテゴリーの閲覧
- 04Tesco の注文確認やバスケット更新
MCP 対応
スーパーの商品検索、価格比較、商品情報、カテゴリー閲覧のツールを MCP クライアントに提供します。Tesco のログインを有効にすると、注文履歴の取得とバスケット操作も利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
supermarkets-uk-mcp
英国の9つのスーパーマーケットの食料品価格を検索・比較する MCP サーバーです。商品検索、価格比較、カテゴリーの閲覧に加え、Tesco では注文履歴とショッピングバスケットの管理ができます。各スーパーマーケットは共通インターフェースの背後にプラグイン可能なデータソースとして実装されており、サーバーは各店舗へのリクエストを並行して実行し、結果を集約します。
はじめに
要件
-
Go 1.27.3+(ソースからビルドする場合)
-
Chrome、Chromium、または Microsoft Edge — Tesco、Asda、Waitrose(ヘッドレスブラウザーでのレンダリング)および各スーパーマーケットへのログインに必要です。Sainsbury's、Ocado、Morrisons、Shopify ストアはブラウザーなしで動作します。
Linux では、snap パッケージ版の Chromium(Ubuntu のデフォルトの
chromiumパッケージ)は使用しないでください。特定の親プロセスの子孫プロセスとして起動した場合(Claude Desktop の Electron プロセスツリー内で実行した際に確認)、正常な CDP タブのクローズ時と強制終了後の OS レベルでのプロセス回収時の両方で、無期限にハングすることが知られています。このハングはその環境で再現率 100% で発生しましたが、同じコードを snap 版ではない Chrome/Chromium ビルドで実行した場合は一度も再現しませんでした。代わりに Google Chrome または snap 版ではない Chromium ビルドをインストールし、自動検出されない場合はCHROME_EXEC_PATHをそのパスに設定してください。
インストール
ビルド済みバイナリは Releases から入手できます。
ソースからインストールする場合:
go install github.com/jbeshir/mcp-servers/supermarkets-uk/cmd/supermarkets-uk-mcp@latest
または、リポジトリのルートからビルドします:
make build
ブラウザーベースの店舗がすぐに動作するよう、chromedp/headless-shell をベースにした Dockerfile も用意されています:
docker build -t supermarkets-uk-mcp ./supermarkets-uk
設定
使い始めるために必要な環境変数はありません。すべてのスーパーマーケットはログインなしで利用できます。
| 変数 | 必須 | 説明 |
|---|---|---|
CHROME_EXEC_PATH | いいえ | 起動する Chrome/Chromium バイナリのパスです。自動検出を利用する場合は設定しないでください。Linux での snap パッケージ版 Chromium については、上記の注意を参照してください。 |
インタラクティブログインを有効にする追加の変数については、以下のログインを参照してください。
Claude Desktop
{
"mcpServers": {
"supermarkets-uk": {
"command": "/path/to/supermarkets-uk-mcp"
}
}
}
Claude Code
claude mcp add supermarkets-uk /path/to/supermarkets-uk-mcp
ツール
| ツール | 説明 |
|---|---|
list_supermarkets | サポート対象のスーパーマーケットを ID とステータス付きで一覧表示します |
search_products | 1つ以上のスーパーマーケットで商品を検索します |
compare_prices | すべてのスーパーマーケットで商品の価格を比較します |
get_product_details | 商品の詳細情報(価格、説明、原材料、栄養成分)を取得します |
browse_categories | スーパーマーケットの商品カテゴリーを閲覧します |
get_order_history | 過去の注文履歴を取得します(Tesco のみ、ログインが必要) |
get_basket | 現在のショッピングバスケットの内容を取得します(Tesco のみ、ログインが必要) |
add_to_basket | バスケットに商品を追加するか、数量を変更します(Tesco のみ、ログインが必要) |
remove_from_basket | バスケットから商品を削除します(Tesco のみ、ログインが必要) |
サポート対象のスーパーマーケット
| スーパーマーケット | ID | データソース | ブラウザーが必要 |
|---|---|---|---|
| Tesco | tesco | HTML(ヘッドレスブラウザー) | はい |
| Sainsbury's | sainsburys | JSON API | いいえ |
| Ocado | ocado | サーバー側レンダリング HTML(OSP) | いいえ |
| Morrisons | morrisons | サーバー側レンダリング HTML(OSP) | いいえ |
| Asda | asda | Algolia API(検索)+ HTML(詳細) | はい |
| Waitrose | waitrose | HTML(ヘッドレスブラウザー) | はい |
| HiYoU | hiyou | Shopify 予測検索 API | いいえ |
| Tuk Tuk Mart | tuktukmart | Shopify 予測検索 API | いいえ |
| Morueats | morueats | Shopify 予測検索 API | いいえ |
商品情報の網羅状況
スーパーによって、提供される詳細情報の範囲は異なります。
| 項目 | Tesco | Sainsbury's | Ocado | Morrisons | Asda | Waitrose | Shopifyストア |
|---|---|---|---|---|---|---|---|
| 商品名/価格/URL | あり | あり | あり | あり | あり | あり | あり |
| 単位あたりの価格 | あり | あり | あり | あり | あり | あり | -- |
| プロモーション | あり | あり | あり | あり | あり | あり | -- |
| 説明 | あり | あり | あり | あり | あり | あり | あり |
| 原材料 | あり | あり | あり | あり | あり | あり | -- |
| 栄養情報 | あり | あり | あり | あり | あり | あり | -- |
| 食事に関する情報 | -- | -- | -- | -- | あり | -- | -- |
| 重量 | -- | -- | -- | あり | あり | あり | あり |
ログイン
ログインは任意です。ログインすると、パーソナライズされた結果(地域の在庫状況や配達可能状況など)、注文履歴、カート管理を利用できます。ログインするには、ブラウザーを利用できる環境でサーバーをローカル実行する必要があります。
ログインを有効にするには、ログインするスーパーごとに <SUPERMARKET>_LOGIN=true を設定します。初回利用時にブラウザーウィンドウが表示され、手動でログインできます。セッション Cookie はディスクにキャッシュされ、再起動後も再利用されます。Cookie の有効期限が切れると、サーバーは Cookie を消去し、自動的に新しいログインを開始します。
通常はブラウザーを必要としないスーパーも含め、すべてのスーパーでログインには Chrome、Chromium、または Edge が必要です。スーパーのセッションは頻繁に期限切れになる傾向があるため、定期的に再ログインを求められることを想定してください。
| 変数 | 説明 |
|---|---|
TESCO_LOGIN | Tescoのログインを有効にします |
SAINSBURYS_LOGIN | Sainsbury'sのログインを有効にします |
OCADO_LOGIN | Ocadoのログインを有効にします |
MORRISONS_LOGIN | Morrisonsのログインを有効にします |
ASDA_LOGIN | Asdaのログインを有効にします |
WAITROSE_LOGIN | Waitroseのログインを有効にします |
SUPERMARKET_COOKIE_DIR | Cookieの保存ディレクトリを上書きします(デフォルト:OSの設定ディレクトリ) |
ログインを有効にする場合の例:
{
"mcpServers": {
"supermarkets-uk": {
"command": "/path/to/supermarkets-uk-mcp",
"env": {
"TESCO_LOGIN": "true",
"WAITROSE_LOGIN": "true",
"SUPERMARKET_COOKIE_DIR": "/home/you/.supermarket-cookies"
}
}
}
}
主な概念
- データソース — 1つのスーパーに対応する、プラグイン可能なアダプターです。各データソースは、スーパーが必要とする通信方式(JSON API、サーバー側でレンダリングされたHTMLのスクレイピング、ヘッドレスChromeによるレンダリング)を用いて、共通の
ProductSourceインターフェース(検索、商品詳細、カテゴリ閲覧)を実装します。 - AuthProductSource — セッション Cookie の注入と検証に対応する、
ProductSourceの拡張インターフェースです。9つのスーパーのうち6つがこのインターフェースを実装しており、ログイン後のパーソナライズされた結果などを利用できます。Shopifyベースの3つのストアは、認証に対応しない通常のProductSource実装です。 - クライアントオーケストレーター —
client.Client型は、9つすべてのデータソースを接続します。検索時の並行リクエストの分配、セッション期限切れを検出する遅延認証、ホストごとのレート制限を管理します。 - 認証リゾルバー — スーパーごとに、遅延ログインを処理するラッパーです。ログインを有効にしたスーパーを初めて利用する際に、ブラウザーウィンドウを表示し、ユーザーが手動でログインできるようにします。セッション Cookie はディスクに保存され、再利用されます。リクエストが
ErrSessionExpiredを返した場合、リゾルバーは Cookie を消去し、新しいログインを開始します。 - 共有ブラウザー — ブラウザーを使用するすべてのデータソースで共有される、単一のヘッドレスChromeインスタンス(chromedp経由)です。各リクエストは共有ブラウザーコンテキスト内で新しいタブを開くため、ページ間の移動中も Cookie が保持されます。
- OSP(Ocado Smart Platform) — OcadoとMorrisonsは、共通のサーバー側レンダリングHTML構造を使用します。1つの
ospパッケージが、ストア固有の設定をパラメーターとして両方に対応します。
アーキテクチャ
graph TD
MCP["MCP Client<br/>(Claude Desktop, etc.)"]
SRV["MCP Server<br/>9 tools"]
ORCH["Client Orchestrator<br/>concurrent fan-out + auth"]
MCP -->|"stdio JSON-RPC"| SRV
SRV --> ORCH
subgraph "Datasource Adapters"
direction LR
BROWSER["Browser-based<br/>Tesco, Asda, Waitrose"]
HTML["HTML scraping<br/>Ocado, Morrisons"]
API["JSON API<br/>Sainsburys"]
SHOPIFY["Shopify API<br/>HiYoU, TukTukMart, Morueats"]
end
ORCH --> BROWSER
ORCH --> HTML
ORCH --> API
ORCH --> SHOPIFY
CHROME["Headless Chrome"]
BROWSER --> CHROME
外部依存関係
graph LR
SM["supermarkets-uk-mcp"]
SM -->|"Headless Chrome"| TESCO["tesco.com"]
SM -->|"Headless Chrome"| ASDA_BR["asda.com"]
SM -->|"Headless Chrome"| WAITROSE["waitrose.com"]
SM -->|"HTTP + HTML parsing"| OCADO["ocado.com"]
SM -->|"HTTP + HTML parsing"| MORR["groceries.morrisons.com"]
SM -->|"JSON API"| SAINS["sainsburys.co.uk"]
SM -->|"Shopify predictive search API"| SHOPIFY["hiyou.co / tuktukmart.co.uk / morueats.co.uk"]
データフロー
複数のスーパーを指定して search_products を呼び出すと、対象となるすべてのストアに並行リクエストが送信されます。個々のストアで発生したエラーは、リクエスト全体を失敗させるのではなく、結果ごとに記録されます。
sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant Orch as Orchestrator
participant Auth as Auth Resolver
participant DS as Datasource Adapters
participant Ext as Supermarket Sites
Client->>Server: search_products(query, stores)
Server->>Orch: SearchAll(query, stores)
par One goroutine per store
Orch->>Auth: ensureAuth(tesco)
Note over Auth: Lazy login on first use
Auth-->>Orch: ready
Orch->>DS: Tesco.SearchProducts
DS->>Ext: Headless Chrome
Ext-->>DS: Rendered HTML
and
Orch->>DS: Sainsburys.SearchProducts
DS->>Ext: JSON API
Ext-->>DS: JSON response
and
Orch->>DS: Ocado.SearchProducts
DS->>Ext: HTTP GET
Ext-->>DS: Server-rendered HTML
end
DS-->>Orch: Parsed products (per store)
Orch-->>Server: Combined results
Server-->>Client: Formatted tool response
ログイン済みのリクエストが ErrSessionExpired で失敗すると、認証リゾルバーはキャッシュ済みの Cookie を消去し、再ログイン用のブラウザーウィンドウを開いて、リクエストを透過的に再試行します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。