Yandex Eats MCP
Yandex Eats MCP
ChatGPT用のシングルユーザーStreamable HTTP MCPサーバー。https://eats.yandex.com が使用するプライベートWeb APIと直接通信します。ブラウザ自動化は使用しません。
現在のリリース:
サーバー設定された1つの配達地点の近くのレストランと一致するアイテムを検索します。
レストランの利用可能性と完全なメニューを読み込みます。
サーバーサイドのカートを一覧表示および読み取りします。
サーバー指示のポーリング、永続的なイベントカーソル、オプションのTelegram配信でアクティブな注文を監視します。
明示的なフィーチャーフラグが有効化された後、成人向けとマークされたアイテムを含むレストランカートアイテムの追加、更新、削除ができます。
永続的なシングルユーザーOAuth 2.1 + PKCEフローで公開MCPエンドポイントを保護します。
Yandex Cookie、Passportトークン、正確な座標、電話番号、住所、支払いデータをMCP結果として公開することはありません。
チェックアウト、place_order、ピックアップ、SKU/小売カート、マルチオーダーは意図的に実装されていません。成人向け商品はレストランカートに追加できますが、MCPは資格チェックを迂回したり年齢確認を実行したりしません。これらの要件はYandex Eatsによって引き続き適用されます。カートは注文ではありません。
リスクに関する注意
このプロジェクトは文書化されていないプライベートAPIに依存しています。エンドポイントとレスポンスの形状は予告なく変更される可能性があり、動作はA/Bフラグによって制御される場合があり、自動化された使用はYandexの利用規約やアンチボット対策によって制限される場合があります。CAPTCHAやOTPを自動化しないでください。可能であれば専用アカウントを使用し、別途の法的・セキュリティレビューなしにこのサービスを他のユーザー向けに公開しないでください。
コピーしたCookieヘッダーはYandex Eats以上のアクセスを許可する可能性があります。アカウントのパスワードのように扱ってください。
Related MCP server: doordash-mcp
アーキテクチャ
ChatGPT
│ HTTPS + OAuth 2.1/PKCE
▼
Cloudflare hostname / Tunnel
│ http://127.0.0.1:3000
▼
Docker: yandex-eats-mcp
│ private Cookie + stable device/session IDs
▼
https://eats.yandex.comプロセスレベルのOrderMonitorはMCPリクエストセッションから独立しています。Yandexの読み取り専用の注文エンドポイントをポーリングし、サニタイズされた状態を/app/state/order-monitor-state.jsonに書き込み、カーソルアドレス可能なイベントを/app/state/order-events.jsonlに追記し、必要に応じて最小限のTelegramメッセージを送信します。
MCPサーバーはスリープ中のChatGPT会話でメッセージを開始できません。ChatGPTはget_order_eventsを定期的に呼び出すことができ(例:Scheduled Taskから)、Telegramはほぼリアルタイムのプッシュチャネルを提供します。
MCPエンドポイントは/mcpです。OAuthディスカバリ、クライアント登録、認可、トークン、保護リソースのメタデータエンドポイントは同じコンテナによって提供されます。OAuthクライアントとハッシュ化されたアクセス/リフレッシュトークンはyandex-eats-state Dockerボリュームに永続化されます。オーナーパスワードはDockerシークレットであり、OAuth状態に永続化されることはありません。
要件
Composeを備えたDocker Engine
既存のCloudflare Tunnelと管理下のホスト名
ログイン済みの
eats.yandex.comブラウザセッション目的の住所の配達緯度/経度
シークレットの設定
無視されるローカルファイルを作成します。コンテナはUID/GID 1000:1000の非特権nodeユーザーとして実行されるため、シークレットファイルは他のホストユーザーからアクセスできないまま、GID 1000で読み取り可能である必要があります:
mkdir -p secrets
chown root:1000 secrets
chmod 750 secrets
umask 077
openssl rand -base64 32 > secrets/mcp_oauth_passwordsecrets/yandex_eats_cookieの場合:
Chromeで
https://eats.yandex.comにサインインします。DevTools → Networkを開き、ページを再読み込みします。
認証済みリクエストを選択し、その完全な
Cookieリクエストヘッダーの値のみをコピーします。その単一行の値を
secrets/yandex_eats_cookieに入れます。Cookie:プレフィックスは含めないでください。コンテナのグループに両方のシークレットへの読み取り専用アクセスを許可します:
chown root:1000 secrets/yandex_eats_cookie secrets/mcp_oauth_password chmod 640 secrets/yandex_eats_cookie secrets/mcp_oauth_password
Docker Composeはファイルベースのシークレットを読み取り専用のバインドマウントとして実装するため、root:rootが所有しモード0600のホストファイルは、この非特権コンテナから読み取ることができず、EACCES起動失敗を引き起こします。
どちらのシークレットもChatGPT、シェルコマンドの引数、ログ、イシュー、コミットに貼り付けないでください。
Telegram通知の場合、BotFatherでボットを作成し、宛先チャットIDを確認し、2つの生の値を別々の無視されたファイルに入れます:
printf '%s\n' '<bot token>' > secrets/order_notify_telegram_token
printf '%s\n' '<chat id>' > secrets/order_notify_telegram_chat_id
chown root:1000 secrets/order_notify_telegram_token secrets/order_notify_telegram_chat_id
chmod 640 secrets/order_notify_telegram_token secrets/order_notify_telegram_chat_idどちらのファイルにも引用符や変数名を含めないでください。ボットは選択したチャットにメッセージを送信できる必要があります。
サービスの設定
cp .env.example .env.envを編集します:
PUBLIC_BASE_URL=https://eats-mcp.example.com
YANDEX_EATS_LATITUDE=40.000000
YANDEX_EATS_LONGITUDE=44.000000
YANDEX_EATS_CITY=Yerevan
YANDEX_EATS_ADDRESS_LABEL=home
YANDEX_EATS_ENABLE_MUTATIONS=false
YANDEX_EATS_ENABLE_ORDER_MONITORING=true
ORDER_NOTIFY_PROVIDER=telegramYANDEX_EATS_ADDRESS_LABELはモデルに返される安全なテキストです。正確な座標はクライアント内に留まり、MCPレスポンスに含まれることはありません。
サーバーを起動します:
docker compose up -d --build
docker compose ps
curl http://127.0.0.1:3000/healthzComposeポートは127.0.0.1にバインドされており、すべてのホストインターフェースにはバインドされていません。
Cloudflare Tunnel
選択したホスト名から以下への公開アプリケーションルートを作成します:
http://127.0.0.1:3000そのサービスアドレスは、cloudflaredがホスト上で実行されている場合に正しいです。cloudflaredが別のコンテナで実行されている場合は、同じDockerネットワークに配置し、ホストのループバックアドレスの代わりにhttp://mcp:3000にルーティングします。
重要なCloudflare設定:
/mcp、/authorize、/token、/register、/revoke、/oauth/*、/.well-known/*をキャッシュしないでください。ストリーミングレスポンスと公開
Hostヘッダーを保持します。WAFとレート制限ルールは問題ありませんが、これらのパスの前にインタラクティブなCloudflare Accessログインを配置しないでください。ChatGPTはMCP OAuthディスカバリとコールバックに直接到達する必要があります。
PUBLIC_BASE_URLを外部HTTPSオリジンと同一に保ち、/mcpや末尾のパスを含めないでください。
Cloudflare Tunnelはオリジンへの到達可能性を提供します。MCP OAuthフローは依然としてアプリケーションレベルの認可境界です。
ChatGPTから接続する
https://your-domain.example/healthzが{"status":"ok"}を返すことを確認します。ChatGPT開発者モードで、カスタムMCP/プラグインエンドポイントを追加します:
https://your-domain.example/mcpChatGPTはOAuthメタデータを検出し、Yandex Eats MCP認可ページを開くはずです。
secrets/mcp_oauth_passwordの値を入力します。これはMCPオーナーパスワードであり、Yandexパスワードではありません。ツールリストを確認します。
remove_cart_itemは破壊的です。チェックアウトと注文配置は表示されないはずです。
OAuthオーナーページは、検索/カートアクセスのみを許可することを明示的に記載しています。
ツール
ツール | 状態変更 | 備考 |
| いいえ | サニタイズされたCookieセッションステータスのみ |
| いいえ | 都市/ラベルのみ、正確な座標は決して含まれない |
| いいえ | 不透明なカーソルによる全文検索 |
| いいえ | 利用可能性とETA |
| いいえ | オプションのローカルクエリ/カテゴリフィルタリング |
| いいえ | カートの一覧表示または新しいカートの読み込み |
| いいえ | サニタイズされたキャッシュ済みアクティブ注文とモニターヘルス |
| いいえ | キャッシュされたステータスまたは明示的な読み取り専用リフレッシュ |
| いいえ | 排他的なシーケンスカーソル以降の永続イベント |
| はい | 現在のメニュー、必須オプション、利用可能性を検証。成人向けマークのアイテムに対応 |
| はい | 明示的なユーザーリクエストのみ |
| はい、破壊的 | 自動最適化は決して行わない |
| いいえ | 有効化された安全境界を報告 |
すべてのミューテーションはオプションのUUID operationIdを受け入れます。10分以内に同じ操作を繰り返すと、上流のミューテーションを繰り返す代わりに同じプロセス内結果が返されます。異なる引数でIDを再利用すると拒否されます。安全でない上流リクエストは自動的に再試行されることはありません。レスポンスが失われたりタイムアウトしたりした場合、ツールはMUTATION_STATUS_UNKNOWNを返します。調整するにはget_cartを呼び出してください。
成功したミューテーションの後、MCPは再読み込みしてサーバーカートを返します。予算チェックは、ローカルの合計ではなく、その新しい合計と違反した制約を使用する必要があります。
注文監視とTelegram
監視はカートのミューテーションから独立しており、読み取りのようなリクエストのみを使用します。以下で有効にします:
YANDEX_EATS_ENABLE_ORDER_MONITORING=true
ORDER_NOTIFY_PROVIDER=telegramリストとトラッキングの間隔はYandexによって提供され、YANDEX_EATS_ORDER_POLL_MIN_MS / YANDEX_EATS_ORDER_POLL_MAX_MSによってクランプされます。ネットワーク、429、5xxの失敗は制限付きバックオフを使用します。401/403は1つのmonitor.auth_expiredイベントを作成します。Cookieが置き換えられた後、SIGHUPはモニターを即座に起動し、回復はmonitor.recoveredを生成します。
最初の成功したスナップショットはベースラインであるため、モニターをデプロイしても過去の注文については通知されません。その後の発見とフィンガープリントの変更は、単調にシーケンスされたイベントを作成します。Telegramメッセージは注文番号をマスクし、住所、座標、電話番号、支払い、地図ペイロード、配達員の身元を省略します。
ChatGPTからポーリングするには、get_order_eventsからnextSequenceを保持し、afterSequenceとして渡し戻します。カーソルは排他的であり、読み取りは他のクライアントのイベントを確認応答しません。
カートミューテーションの有効化
初期デプロイ中はこれを無効のままにします:
YANDEX_EATS_ENABLE_MUTATIONS=falseまずauth_status、search、get_menu、get_cartを確認します。次に、必須のモディファイアがない使い捨てのレストランアイテムを1つ準備し、フラグを有効にして、制御されたadd_to_cartを実行し、続いてget_cartと新しく作成されたcartItemIdのみの削除を実行します。
YANDEX_EATS_ENABLE_MUTATIONS=trueフラグを変更した後、コンテナを再起動します。テストとしてclear-cartを使用しないでください。意図的に公開されていません。
Cookieの更新
auth_statusがAUTH_EXPIREDまたはneedsRefresh: trueを報告する場合、secrets/yandex_eats_cookieを新しい単一行のCookie値に置き換え、Dockerシークレットマウントを再作成します:
chown root:1000 secrets/yandex_eats_cookie
chmod 640 secrets/yandex_eats_cookie
docker compose up -d --force-recreate mcpマウントされたシークレットがその場で更新される非Composeデプロイメント内では、SIGHUPがCookieを再読み込みします:
docker compose kill -s HUP mcp自動のPassportログイン、OTP、CAPTCHA処理、トークン収集は実装されていません。
開発とテスト
npm install
npm run check
docker compose config
docker compose build通常のテストスイートはサニタイズされたフィクスチャとモックされた上流レスポンスを使用します。マッパーの耐性、正確なリクエスト配線、曖昧なミューテーションの再試行なし、ミューテーションのシリアライゼーション/冪等性、認証の永続化、MCPツールの注釈を検証します。
読み取り専用のライブコントラクトテストはオプトインであり、ローカルのCookieと座標が必要です:
export YANDEX_EATS_COOKIE_FILE="$PWD/secrets/yandex_eats_cookie"
export YANDEX_EATS_LATITUDE="40.000000"
export YANDEX_EATS_LONGITUDE="44.000000"
npm run test:live:readonly
npm run test:live:orders:readonlyこのリポジトリのライブテストは注文を作成しません。通常のテストはYandexに接続することはありません。
運用上の注意
/app/state配下の状態には機密性の高いCookieジャーとOAuthデータが含まれます。バックアップを取り、それに応じてDockerホストを保護してください。/readyzは上流リクエストを行わず、注文IDを公開せずにモニターのヘルスを報告します。ログにはエンドポイント、ステータス、所要時間、Yandex相関IDが含まれます。リクエスト/レスポンスボディ、Cookie、認可ヘッダー、セッションID、電話番号、住所、支払いフィールドは編集されるか、ログに記録されません。
AUTH_NOT_CONFIGURED:Cookieシークレットが存在しないか、読み取り不能です。AUTH_EXPIRED:新しいブラウザのCookieヘッダーをコピーします。DELIVERY_LOCATION_NOT_CONFIGURED:緯度と経度の両方を設定します。MUTATIONS_DISABLED:フィーチャーフラグが意図的に有効化されるまで想定されます。REQUIRES_CONFIGURATION:get_menuを確認し、ユーザーに必須オプションの選択を求めます。UNSUPPORTED_CART_MODE:現在のリリースはサポートされていないSKU/ピックアップカートフローを拒否します。MUTATION_STATUS_UNKNOWN:盲目的に再試行しないでください。get_cartで調整します。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI agents to search restaurants, browse menus, and manage DoorDash carts through structured JSON data. It leverages a background browser to handle authentication and direct GraphQL API calls for efficient interaction.72
- FlicenseBqualityDmaintenanceEnables AI agents to search restaurants, browse menus, manage carts, and place orders on DoorDash programmatically. It utilizes a headless browser to interact with DoorDash's GraphQL API and bypass anti-bot protections for the full delivery lifecycle.222
- AlicenseAqualityDmaintenanceIntegrates with Yandex Market Partner API, providing search and execute tools for managing orders, returns, shipments, offers, prices, and other seller operations via natural language.181MIT
- AlicenseNot gradedqualityDmaintenanceEnables accessing Yelp Business API to search businesses, get reviews, menus, and business details.MIT
Related MCP Connectors
AI-native restaurant discovery: verified/menu-indexed/discovered tiers + signed allergy-safety data.
Web search, AI agent, and content extraction via You.com APIs
Federated commerce search across independent WooCommerce merchants. Keyless, read-only MCP server.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sptmru/yandex-eats-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server