Skip to main content
Glama
sptmru

Yandex Eats MCP

by sptmru

Yandex Eats MCP

Servidor HTTP MCP Streamable de un solo usuario para ChatGPT. Se comunica directamente con la API web privada utilizada por https://eats.yandex.com; no se utiliza automatización del navegador.

Versión actual:

  • busca restaurantes y artículos coincidentes cerca de un punto de entrega configurado en el servidor;

  • carga la disponibilidad de los restaurantes y los menús completos;

  • lista y lee carritos del lado del servidor;

  • puede añadir, actualizar y eliminar artículos del carrito del restaurante, incluidos los marcados como adultos, después de habilitar una característica explícita (feature flag);

  • protege el endpoint público MCP con un flujo OAuth 2.1 + PKCE persistente de un solo usuario;

  • nunca expone la cookie de Yandex, el token de Passport, las coordenadas exactas, el teléfono, la dirección ni los datos de pago como resultados MCP.

El checkout, place_order, la recogida, los carritos SKU/minoristas y el multiorder no se implementan deliberadamente. Los productos para adultos pueden añadirse a un carrito de restaurante, pero el MCP no omite los controles de elegibilidad ni realiza verificación de edad; esos requisitos siguen siendo aplicados por Yandex Eats. Un carrito no es un pedido.

Aviso de riesgo

Este proyecto depende de una API privada no documentada. Los endpoints y las formas de las respuestas pueden cambiar sin previo aviso, el comportamiento puede estar controlado por flags A/B, y el uso automatizado puede estar restringido por los términos de Yandex o por controles antibots. Nunca automatices CAPTCHA u OTP. Usa una cuenta dedicada si es posible y no publiques este servicio para otros usuarios sin una revisión legal y de seguridad independiente.

La cabecera Cookie copiada puede conceder acceso a más que Yandex Eats. Trátala como una contraseña de cuenta.

Related MCP server: doordash-mcp

Arquitectura

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

El endpoint MCP es /mcp. Los endpoints de descubrimiento OAuth, registro de clientes, autorización, token y metadatos de recursos protegidos los sirve el mismo contenedor. Los clientes OAuth y los tokens de acceso/actualización con hash se persisten en el volumen Docker yandex-eats-state. La contraseña del propietario es un secreto de Docker y nunca se persiste en el estado OAuth.

Requisitos

  • Docker Engine con Compose;

  • un túnel de Cloudflare existente y un nombre de host que controles;

  • una sesión de navegador iniciada en eats.yandex.com;

  • latitud/longitud de entrega para la dirección deseada.

Configurar los secretos

Crea los archivos locales ignorados. El contenedor se ejecuta como el usuario node sin privilegios con UID/GID 1000:1000, por lo que los archivos de secretos deben ser legibles por el GID 1000 y permanecer inaccesibles para otros usuarios del host:

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

Para secrets/yandex_eats_cookie:

  1. Inicia sesión en https://eats.yandex.com en Chrome.

  2. Abre DevTools → Network y recarga la página.

  3. Selecciona una solicitud autenticada y copia solo el valor de su cabecera de solicitud Cookie completa.

  4. Coloca ese valor de una sola línea en secrets/yandex_eats_cookie. No incluyas el prefijo Cookie:.

  5. Concede al grupo del contenedor acceso de solo lectura a ambos secretos:

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

Docker Compose implementa los secretos respaldados por archivos como montajes bind de solo lectura, por lo que un archivo del host propiedad de root:root con modo 0600 no puede ser leído por este contenedor sin privilegios y provoca un fallo de inicio EACCES.

No pegues ninguno de los dos secretos en ChatGPT, argumentos de comandos de shell, registros, incidencias ni commits.

Configurar el servicio

cp .env.example .env

Edita .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_ADDRESS_LABEL es texto seguro devuelto al modelo. Las coordenadas exactas permanecen dentro del cliente y nunca se incluyen en las respuestas MCP.

Inicia el servidor:

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

El puerto de Compose está vinculado a 127.0.0.1, no a todas las interfaces del host.

Túnel de Cloudflare

Crea una ruta de aplicación publicada desde tu nombre de host elegido hasta:

http://127.0.0.1:3000

Esa dirección de servicio es correcta cuando cloudflared se ejecuta en el host. Si cloudflared se ejecuta en otro contenedor, colócalo en la misma red Docker y enruta a http://mcp:3000 en lugar de a la dirección de bucle local del host.

Ajustes importantes de Cloudflare:

  • no almacenes en caché /mcp, /authorize, /token, /register, /revoke, /oauth/* ni /.well-known/*;

  • conserva las respuestas de streaming y la cabecera pública Host;

  • las reglas WAF y de límite de tasa están bien, pero no pongas un inicio de sesión interactivo de Cloudflare Access delante de estas rutas: ChatGPT debe alcanzar el descubrimiento y las devoluciones de llamada de MCP OAuth directamente;

  • mantén PUBLIC_BASE_URL idéntica al origen HTTPS externo, sin /mcp ni una ruta final.

El túnel de Cloudflare hace accesible el origen; el flujo OAuth de MCP sigue siendo el límite de autorización a nivel de aplicación.

Conectarse desde ChatGPT

  1. Confirma que https://your-domain.example/healthz devuelve {"status":"ok"}.

  2. En el modo desarrollador de ChatGPT, añade un endpoint MCP/plugin personalizado:

https://your-domain.example/mcp
  1. ChatGPT debería descubrir los metadatos OAuth y abrir la página de autorización de Yandex Eats MCP.

  2. Introduce el valor de secrets/mcp_oauth_password. Esta es la contraseña del propietario MCP, no una contraseña de Yandex.

  3. Revisa la lista de herramientas. remove_cart_item es destructiva; el checkout y la realización de pedidos no deberían aparecer.

La página del propietario de OAuth indica explícitamente que solo concede acceso a búsqueda/carrito.

Herramientas

Herramienta

Cambio de estado

Notas

auth_status

No

Solo estado de sesión de cookie saneado

get_delivery_context

No

Solo ciudad/etiqueta, nunca coordenadas exactas

search

No

Búsqueda de texto completo con cursor opaco

get_place

No

Disponibilidad y ETA

get_menu

No

Filtrado opcional local por consulta/categoría

get_cart

No

Lista carritos o carga un carrito nuevo

add_to_cart

Valida el menú actual, las opciones obligatorias y la disponibilidad; se admiten artículos marcados para adultos

update_cart_item

Solo solicitud explícita del usuario

remove_cart_item

Sí, destructiva

Nunca una optimización automática

server_capabilities

No

Informa de los límites de seguridad habilitados

Cada mutación acepta un operationId UUID opcional; repetir la misma operación en un plazo de diez minutos devuelve el mismo resultado en proceso en lugar de repetir la mutación upstream. Reutilizar el ID con argumentos diferentes se rechaza. Las solicitudes upstream no seguras nunca se reintentan automáticamente. Si la respuesta se pierde o agota el tiempo, la herramienta devuelve MUTATION_STATUS_UNKNOWN; llama a get_cart para conciliar.

Después de cualquier mutación correcta, el MCP recarga y devuelve el carrito del servidor. Las comprobaciones de presupuesto deben usar ese total reciente y sus restricciones incumplidas, no una suma local.

Habilitar mutaciones de carrito

Mantén esto deshabilitado durante el despliegue inicial:

YANDEX_EATS_ENABLE_MUTATIONS=false

Primero verifica auth_status, search, get_menu y get_cart. Luego prepara un artículo de restaurante desechable sin modificadores obligatorios, habilita el flag y realiza un add_to_cart controlado seguido de get_cart y la eliminación únicamente del cartItemId recién creado.

YANDEX_EATS_ENABLE_MUTATIONS=true

Reinicia el contenedor después de cambiar el flag. Nunca uses clear-cart como prueba; no está expuesta intencionadamente.

Si auth_status informa AUTH_EXPIRED o needsRefresh: true, sustituye secrets/yandex_eats_cookie por un valor de Cookie fresco de una sola línea y vuelve a crear el montaje del secreto Docker:

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

En un despliegue sin Compose donde el secreto montado se actualiza en caliente, SIGHUP recarga la cookie:

docker compose kill -s HUP mcp

No se implementa inicio de sesión automático de Passport, ni manejo de OTP, CAPTCHA ni recolección de tokens.

Desarrollo y pruebas

npm install
npm run check
docker compose config
docker compose build

La suite de pruebas normal utiliza fixtures saneados y respuestas upstream simuladas. Verifica la tolerancia del mapeador, el cableado exacto de las solicitudes, la ausencia de reintentos para mutaciones ambiguas, la serialización/idempotencia de mutaciones, la persistencia de autenticación y las anotaciones de herramientas MCP.

Las pruebas de contrato en vivo de solo lectura son opcionales y requieren tu cookie y coordenadas locales:

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

Ninguna prueba en vivo de este repositorio crea un pedido. Las pruebas normales nunca contactan con Yandex.

Notas operativas

  • El estado en /app/state incluye datos sensibles de la cookie jar y de OAuth; haz una copia de seguridad y protege el host Docker en consecuencia.

  • Los registros incluyen endpoint, estado, duración e IDs de correlación de Yandex. Los cuerpos de solicitud/respuesta, cookies, cabeceras de autorización, IDs de sesión, teléfono, dirección y campos de pago se redactan o no se registran.

  • AUTH_NOT_CONFIGURED: falta el secreto de cookie o no se puede leer.

  • AUTH_EXPIRED: copia una cabecera Cookie de navegador reciente.

  • DELIVERY_LOCATION_NOT_CONFIGURED: configura tanto la latitud como la longitud.

  • MUTATIONS_DISABLED: esperado hasta que el feature flag se habilite deliberadamente.

  • REQUIRES_CONFIGURATION: inspecciona get_menu y pide al usuario que elija las opciones obligatorias.

  • UNSUPPORTED_CART_MODE: la versión actual rechaza los flujos de carrito SKU/recogida no admitidos.

  • MUTATION_STATUS_UNKNOWN: no reintentes a ciegas; concilia con get_cart.

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