Skip to main content
Glama
sptmru

Yandex Eats MCP

by sptmru

Yandex Eats MCP

Ein Single-User-Streamable-HTTP-MCP-Server für ChatGPT. Er spricht direkt die private Web-API an, die von https://eats.yandex.com verwendet wird; es wird keine Browser-Automatisierung eingesetzt.

Aktuelle Version:

  • durchsucht Restaurants und passende Artikel in der Nähe eines serverkonfigurierten Lieferpunkts;

  • lädt Verfügbarkeit und vollständige Menüs von Restaurants;

  • listet und liest serverseitige Warenkörbe;

  • überwacht aktive Bestellungen mit servergesteuertem Polling, einem persistenten Ereignis-Cursor und optionaler Telegram-Zustellung;

  • kann nach Aktivierung eines expliziten Feature-Flags Restaurant-Warenkorbartikel hinzufügen, aktualisieren und entfernen, einschließlich als „Erwachsen“ markierter Artikel;

  • schützt den öffentlichen MCP-Endpunkt mit einem persistenten Single-User-OAuth-2.1- und PKCE-Flow;

  • gibt das Yandex-Cookie, das Passport-Token, exakte Koordinaten, Telefon, Adresse oder Zahlungsdaten niemals als MCP-Ergebnisse aus.

Checkout, place_order, Abholung, SKU-/Einzelhandels-Warenkörbe und Multiorder sind bewusst nicht implementiert. Produkte für Erwachsene können zu einem Restaurant-Warenkorb hinzugefügt werden, aber der MCP umgeht keine Berechtigungsprüfungen und führt keine Altersverifikation durch; diese Anforderungen werden weiterhin von Yandex Eats durchgesetzt. Ein Warenkorb ist keine Bestellung.

Risikohinweis

Dieses Projekt hängt von einer undokumentierten privaten API ab. Endpunkte und Antwortstrukturen können sich ohne Vorankündigung ändern, das Verhalten kann durch A/B-Flags gesteuert werden, und die automatisierte Nutzung kann durch die Yandex-Bedingungen oder Anti-Bot-Kontrollen eingeschränkt sein. Automatisieren Sie niemals CAPTCHA oder OTP. Verwenden Sie nach Möglichkeit ein dediziertes Konto und veröffentlichen Sie diesen Dienst nicht für andere Benutzer ohne eine separate rechtliche und sicherheitstechnische Prüfung.

Der kopierte Cookie-Header kann Zugriff auf mehr als nur Yandex Eats gewähren. Behandeln Sie ihn wie ein Kontopasswort.

Related MCP server: doordash-mcp

Architektur

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

Der prozessweite OrderMonitor ist unabhängig von MCP-Anfragesitzungen. Er pollt die schreibgeschützten Bestell-Endpunkte von Yandex, schreibt bereinigten Zustand nach /app/state/order-monitor-state.json, hängt cursor-adressierbare Ereignisse an /app/state/order-events.jsonl an und sendet optional eine minimale Telegram-Nachricht.

Ein MCP-Server kann in einer schlafenden ChatGPT-Konversation keine Nachricht initiieren. ChatGPT kann get_order_events regelmäßig aufrufen (zum Beispiel über eine geplante Aufgabe), während Telegram den nahezu Echtzeit-Push-Kanal bereitstellt.

Der MCP-Endpunkt ist /mcp. OAuth-Discovery, Client-Registrierung, Autorisierungs-, Token- und Metadaten-Endpunkte für geschützte Ressourcen werden vom selben Container bereitgestellt. OAuth-Clients und gehashte Access-/Refresh-Tokens werden im Docker-Volume yandex-eats-state persistiert. Das Besitzer-Passwort ist ein Docker-Secret und wird niemals im OAuth-Zustand persistiert.

Voraussetzungen

  • Docker Engine mit Compose;

  • ein bestehender Cloudflare Tunnel und ein Hostname, den Sie kontrollieren;

  • eine angemeldete Browser-Sitzung für eats.yandex.com;

  • Liefer-Breitengrad/Längengrad für die gewünschte Adresse.

Secrets konfigurieren

Erstellen Sie die ignorierten lokalen Dateien. Der Container läuft als unprivilegierter Benutzer node mit UID/GID 1000:1000, daher müssen die Secret-Dateien für GID 1000 lesbar sein, für andere Host-Benutzer jedoch unzugänglich bleiben:

mkdir -p secrets
chown root:1000 secrets
chmod 750 secrets
umask 077
openssl rand -base64 32 > secrets/mcp_oauth_password

Für secrets/yandex_eats_cookie:

  1. Melden Sie sich in Chrome bei https://eats.yandex.com an.

  2. Öffnen Sie DevTools → Network und laden Sie die Seite neu.

  3. Wählen Sie eine authentifizierte Anfrage aus und kopieren Sie nur den Wert des vollständigen Cookie-Anfrageheaders.

  4. Fügen Sie diesen einzeiligen Wert in secrets/yandex_eats_cookie ein. Fügen Sie das Präfix Cookie: nicht hinzu.

  5. Gewähren Sie der Gruppe des Containers Lesezugriff auf beide Secrets:

    chown root:1000 secrets/yandex_eats_cookie secrets/mcp_oauth_password
    chmod 640 secrets/yandex_eats_cookie secrets/mcp_oauth_password

Docker Compose implementiert dateibasierte Secrets als schreibgeschützte Bind-Mounts. Daher kann eine Host-Datei im Besitz von root:root mit Modus 0600 von diesem unprivilegierten Container nicht gelesen werden und führt zu einem EACCES-Startfehler.

Fügen Sie keines der beiden Secrets in ChatGPT, Shell-Befehlsargumente, Logs, Issues oder Commits ein.

Erstellen Sie für Telegram-Benachrichtigungen einen Bot mit BotFather, ermitteln Sie die Ziel-Chat-ID und legen Sie die beiden Rohwerte in separaten ignorierten Dateien ab:

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

Fügen Sie in keiner der beiden Dateien Anführungszeichen oder Variablennamen ein. Der Bot muss dem ausgewählten Chat Nachrichten senden können.

Dienst konfigurieren

cp .env.example .env

Bearbeiten Sie .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=telegram

YANDEX_EATS_ADDRESS_LABEL ist sicherer Text, der an das Modell zurückgegeben wird. Exakte Koordinaten bleiben im Client und werden niemals in MCP-Antworten aufgenommen.

Starten Sie den Server:

docker compose up -d --build
docker compose ps
curl http://127.0.0.1:3000/healthz

Der Compose-Port ist an 127.0.0.1 gebunden, nicht an alle Host-Schnittstellen.

Cloudflare Tunnel

Erstellen Sie eine veröffentlichte Anwendungsroute von Ihrem gewählten Hostnamen zu:

http://127.0.0.1:3000

Diese Dienstadresse ist korrekt, wenn cloudflared auf dem Host läuft. Wenn cloudflared in einem anderen Container läuft, platzieren Sie ihn im selben Docker-Netzwerk und routen Sie zu http://mcp:3000 anstelle der Host-Loopback-Adresse.

Wichtige Cloudflare-Einstellungen:

  • cachen Sie /mcp, /authorize, /token, /register, /revoke, /oauth/* oder /.well-known/* nicht;

  • bewahren Sie Streaming-Antworten und den öffentlichen Host-Header;

  • WAF- und Rate-Limit-Regeln sind in Ordnung, aber platzieren Sie keinen interaktiven Cloudflare-Access-Login vor diesen Pfaden – ChatGPT muss die MCP-OAuth-Discovery und Callbacks direkt erreichen;

  • halten Sie PUBLIC_BASE_URL identisch mit dem externen HTTPS-Origin, ohne /mcp oder einen nachgestellten Pfad.

Cloudflare Tunnel macht den Origin erreichbar; der MCP-OAuth-Flow bleibt die Autorisierungsgrenze auf Anwendungsebene.

Von ChatGPT aus verbinden

  1. Bestätigen Sie, dass https://your-domain.example/healthz {"status":"ok"} zurückgibt.

  2. Fügen Sie im ChatGPT-Entwicklermodus einen benutzerdefinierten MCP-/Plugin-Endpunkt hinzu:

    https://your-domain.example/mcp
  3. ChatGPT sollte die OAuth-Metadaten erkennen und die Autorisierungsseite von Yandex Eats MCP öffnen.

  4. Geben Sie den Wert aus secrets/mcp_oauth_password ein. Dies ist das MCP-Besitzer-Passwort, kein Yandex-Passwort.

  5. Überprüfen Sie die Werkzeugliste. remove_cart_item ist destruktiv; Checkout und Bestellaufgabe sollten nicht erscheinen.

Die OAuth-Besitzerseite stellt ausdrücklich klar, dass sie nur Such-/Warenkorbzugriff gewährt.

Tools

Tool

State change

Notes

auth_status

Nein

Nur bereinigter Cookie-Sitzungsstatus

get_delivery_context

Nein

Nur Stadt/Label, niemals exakte Koordinaten

search

Nein

Volltextsuche mit undurchsichtigem Cursor

get_place

Nein

Verfügbarkeit und voraussichtliche Ankunftszeit (ETA)

get_menu

Nein

Optionale lokale Abfrage-/Kategoriefilterung

get_cart

Nein

Listet Warenkörbe oder lädt einen frischen Warenkorb

get_active_orders

Nein

Bereinigte gecachte aktive Bestellungen und Monitor-Health

get_order_status

Nein

Gecachter Status oder explizite schreibgeschützte Aktualisierung

get_order_events

Nein

Persistente Ereignisse nach einem exklusiven Sequenz-Cursor

add_to_cart

Ja

Validiert aktuelles Menü, erforderliche Optionen und Verfügbarkeit; als „Erwachsen“ markierte Artikel werden unterstützt

update_cart_item

Ja

Nur auf ausdrückliche Benutzeranfrage

remove_cart_item

Ja, destruktiv

Niemals eine automatische Optimierung

server_capabilities

Nein

Meldet aktivierte Sicherheitsgrenzen

Jede Mutation akzeptiert eine optionale UUID operationId; die Wiederholung derselben Operation innerhalb von zehn Minuten liefert dasselbe prozessinterne Ergebnis, anstatt die Upstream-Mutation zu wiederholen. Die Wiederverwendung der ID mit anderen Argumenten wird abgelehnt. Unsichere Upstream-Anfragen werden niemals automatisch wiederholt. Wenn die Antwort verloren geht oder ein Timeout auftritt, gibt das Tool MUTATION_STATUS_UNKNOWN zurück; rufen Sie get_cart auf, um den Zustand abzugleichen.

Nach jeder erfolgreichen Mutation lädt der MCP den Server-Warenkorb neu und gibt ihn zurück. Budgetprüfungen müssen diese frische Summe und ihre verletzten Einschränkungen verwenden, nicht eine lokale Summe.

Bestellüberwachung und Telegram

Die Überwachung ist unabhängig von Warenkorbmutationen und verwendet nur lesende Anfragen. Aktivieren Sie sie mit:

YANDEX_EATS_ENABLE_ORDER_MONITORING=true
ORDER_NOTIFY_PROVIDER=telegram

Die Listen- und Tracking-Intervalle werden von Yandex bereitgestellt und durch YANDEX_EATS_ORDER_POLL_MIN_MS / YANDEX_EATS_ORDER_POLL_MAX_MS begrenzt. Netzwerk-, 429- und 5xx-Fehler verwenden ein begrenztes Backoff. Ein 401/403 erzeugt ein monitor.auth_expired-Ereignis; nachdem das Cookie ersetzt wurde, weckt SIGHUP den Monitor sofort auf, und die Wiederherstellung erzeugt monitor.recovered.

Der erste erfolgreiche Snapshot ist eine Basislinie, sodass die Bereitstellung des Monitors nicht über historische Bestellungen benachrichtigt. Spätere Entdeckungen und Fingerprint-Änderungen erzeugen monoton sequenzierte Ereignisse. Telegram-Nachrichten maskieren die Bestellnummer und lassen Adresse, Koordinaten, Telefon, Zahlung, Karten-Payload und Kurieridentität weg.

Um von ChatGPT aus zu pollen, behalten Sie nextSequence aus get_order_events und übergeben Sie es als afterSequence zurück. Der Cursor ist exklusiv, und das Lesen bestätigt keine Ereignisse für andere Clients.

Warenkorbmutationen aktivieren

Lassen Sie dies während der ersten Bereitstellung deaktiviert:

YANDEX_EATS_ENABLE_MUTATIONS=false

Überprüfen Sie zuerst auth_status, search, get_menu und get_cart. Bereiten Sie dann einen Wegwerf-Restaurantartikel ohne erforderliche Modifikatoren vor, aktivieren Sie das Flag und führen Sie ein kontrolliertes add_to_cart aus, gefolgt von get_cart und dem Entfernen nur der neu erstellten cartItemId.

YANDEX_EATS_ENABLE_MUTATIONS=true

Starten Sie den Container nach dem Ändern des Flags neu. Verwenden Sie clear-cart niemals als Test; es ist absichtlich nicht verfügbar.

Wenn auth_status AUTH_EXPIRED oder needsRefresh: true meldet, ersetzen Sie secrets/yandex_eats_cookie durch einen frischen einzeiligen Cookie-Wert und erstellen Sie den Docker-Secret-Mount neu:

chown root:1000 secrets/yandex_eats_cookie
chmod 640 secrets/yandex_eats_cookie
docker compose up -d --force-recreate mcp

In einer Nicht-Compose-Bereitstellung, bei der das gemountete Secret direkt aktualisiert wird, lädt SIGHUP das Cookie neu:

docker compose kill -s HUP mcp

Es ist keine automatische Passport-Anmeldung, OTP-, CAPTCHA-Behandlung oder Token-Ernte implementiert.

Entwicklung und Tests

npm install
npm run check
docker compose config
docker compose build

Die normale Testsuite verwendet bereinigte Fixtures und simulierte Upstream-Antworten. Sie prüft Mapper-Toleranz, exakte Anfrageverdrahtung, kein Retry bei mehrdeutigen Mutationen, Mutationsserialisierung/-idempotenz, Authentifizierungspersistenz und MCP-Tool-Annotationen.

Schreibgeschützte Live-Vertragstests sind optional und erfordern Ihr lokales Cookie und Ihre Koordinaten:

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

Kein Live-Test in diesem Repository erstellt eine Bestellung. Normale Tests kontaktieren Yandex niemals.

Betriebshinweise

  • Der Zustand unter /app/state enthält sensible Cookie-Jar- und OAuth-Daten; sichern Sie ihn und schützen Sie den Docker-Host entsprechend.

  • /readyz meldet den Gesundheitszustand des Monitors, ohne eine Upstream-Anfrage zu stellen oder Bestell-IDs offenzulegen.

  • Logs enthalten Endpunkt, Status, Dauer und Yandex-Korrelations-IDs. Anfrage-/Antworttexte, Cookies, Autorisierungsheader, Sitzungs-IDs, Telefon-, Adress- und Zahlungsfelder werden geschwärzt oder nicht protokolliert.

  • AUTH_NOT_CONFIGURED: Das Cookie-Secret fehlt oder ist nicht lesbar.

  • AUTH_EXPIRED: Kopieren Sie einen frischen Browser-Cookie-Header.

  • DELIVERY_LOCATION_NOT_CONFIGURED: Konfigurieren Sie sowohl Breitengrad als auch Längengrad.

  • MUTATIONS_DISABLED: Erwartet, bis das Feature-Flag bewusst aktiviert wird.

  • REQUIRES_CONFIGURATION: Prüfen Sie get_menu und bitten Sie den Benutzer, die erforderlichen Optionen auszuwählen.

  • UNSUPPORTED_CART_MODE: Die aktuelle Version lehnt nicht unterstützte SKU-/Abhol-Warenkorbabläufe ab.

  • MUTATION_STATUS_UNKNOWN: Nicht blind wiederholen; gleichen Sie mit get_cart ab.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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