Yandex Eats MCP
Yandex Eats MCP
ChatGPT용 단일 사용자 Streamable HTTP MCP 서버입니다. https://eats.yandex.com에서 사용하는 비공개 웹 API와 직접 통신하며, 브라우저 자동화는 사용하지 않습니다.
현재 릴리스 기능:
서버에 구성된 배달 지점 주변의 레스토랑과 일치하는 항목을 검색합니다.
레스토랑 이용 가능 여부와 전체 메뉴를 불러옵니다.
서버 측 장바구니를 나열하고 읽습니다.
서버 지향 폴링, 영구 이벤트 커서, 선택적 Telegram 전송으로 활성 주문을 모니터링합니다.
명시적 기능 플래그가 활성화된 후 성인 표시 항목을 포함한 레스토랑 장바구니 항목을 추가, 업데이트, 제거할 수 있습니다.
영구 단일 사용자 OAuth 2.1 + PKCE 흐름으로 공개 MCP 엔드포인트를 보호합니다.
Yandex 쿠키, 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는 (예: Scheduled Task에서) 주기적으로 get_order_events를 호출할 수 있으며, Telegram은 거의 실시간 푸시 채널을 제공합니다.
MCP 엔드포인트는 /mcp입니다. OAuth 검색, 클라이언트 등록, 인증, 토큰 및 보호 리소스 메타데이터 엔드포인트는 동일한 컨테이너에서 제공됩니다. OAuth 클라이언트와 해시된 액세스/리프레시 토큰은 yandex-eats-state Docker 볼륨에 영구 저장됩니다. 소유자 비밀번호는 Docker secret이며 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를 확인한 다음, 두 원시 값을 별도의 무시되는 파일에 넣습니다:
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을/mcp나 후행 경로 없이 외부 HTTPS 오리진과 동일하게 유지하십시오.
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 소유자 페이지는 검색/장바구니 접근 권한만 부여한다고 명시적으로 안내합니다.
도구
도구 | 상태 변경 | 참고 |
| 아니요 | 정제된 쿠키 세션 상태만 표시 |
| 아니요 | 도시/라벨만, 정확한 좌표는 절대 아님 |
| 아니요 | 불투명 커서가 있는 전체 텍스트 검색 |
| 아니요 | 이용 가능 여부 및 예상 도착 시간 |
| 아니요 | 선택적 로컬 쿼리/카테고리 필터링 |
| 아니요 | 장바구니 나열 또는 새 장바구니 하나 로드 |
| 아니요 | 정제된 캐시 활성 주문 및 모니터 상태 |
| 아니요 | 캐시된 상태 또는 명시적 읽기 전용 새로고침 |
| 아니요 | 독점 시퀀스 커서 이후의 영구 이벤트 |
| 예 | 현재 메뉴, 필수 옵션 및 이용 가능 여부를 검증함; 성인 표시 항목 지원 |
| 예 | 명시적 사용자 요청만 가능 |
| 예, 파괴적 | 절대 자동 최적화로 사용하지 않음 |
| 아니요 | 활성화된 안전 경계를 보고 |
모든 변경 작업은 선택적 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은 monitor.auth_expired 이벤트 하나를 생성합니다. 쿠키가 교체된 후 SIGHUP이 모니터를 즉시 깨우고 복구 시 monitor.recovered가 생성됩니다.
첫 번째 성공적인 스냅샷은 기준선이므로 모니터를 배포해도 과거 주문에 대해 알리지 않습니다. 이후의 발견 및 지문 변경은 단조 증가 시퀀스 이벤트를 생성합니다. Telegram 메시지는 주문 번호를 마스킹하고 주소, 좌표, 전화번호, 결제, 지도 페이로드 및 배달 기사 신원을 생략합니다.
ChatGPT에서 폴링하려면 get_order_events의 nextSequence를 보관하고 afterSequence로 다시 전달하십시오. 커서는 독점적이며 읽기가 다른 클라이언트의 이벤트를 확인하지 않습니다.
장바구니 변경 활성화
초기 배포 동안에는 비활성화된 상태로 두십시오:
YANDEX_EATS_ENABLE_MUTATIONS=false먼저 auth_status, search, get_menu 및 get_cart를 확인합니다. 그런 다음 필수 수정자가 없는 일회용 레스토랑 항목 하나를 준비하고, 플래그를 활성화한 후 통제된 add_to_cart를 수행하고 get_cart를 호출한 다음 새로 생성된 cartItemId만 제거합니다.
YANDEX_EATS_ENABLE_MUTATIONS=true플래그를 변경한 후 컨테이너를 다시 시작하십시오. 전체 장바구니 비우기를 테스트로 사용하지 마십시오. 의도적으로 노출되지 않았습니다.
쿠키 새로고침
auth_status가 AUTH_EXPIRED 또는 needsRefresh: true를 보고하면 secrets/yandex_eats_cookie를 새 한 줄 Cookie 값으로 교체하고 Docker secret 마운트를 다시 생성합니다:
chown root:1000 secrets/yandex_eats_cookie
chmod 640 secrets/yandex_eats_cookie
docker compose up -d --force-recreate mcp마운트된 시크릿이 제자리에서 업데이트되는 비-Compose 배포 내부에서는 SIGHUP이 쿠키를 다시 로드합니다:
docker compose kill -s HUP mcp자동 Passport 로그인, OTP, CAPTCHA 처리 또는 토큰 수집은 구현되지 않습니다.
개발 및 테스트
npm install
npm run check
docker compose config
docker compose build일반 테스트 스위트는 정제된 픽스처와 모의 업스트림 응답을 사용합니다. 매퍼 허용 오차, 정확한 요청 배선, 모호한 변경에 대한 재시도 없음, 변경 직렬화/멱등성, 인증 영구 저장 및 MCP 도구 주석을 검증합니다.
읽기 전용 라이브 계약 테스트는 선택 사항이며 로컬 쿠키와 좌표가 필요합니다:
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아래의 상태에는 민감한 쿠키 저장소 및 OAuth 데이터가 포함됩니다. 백업하고 Docker 호스트를 그에 따라 보호하십시오./readyz는 업스트림 요청을 하거나 주문 ID를 노출하지 않고 모니터 상태를 보고합니다.로그에는 엔드포인트, 상태, 기간 및 Yandex 상관관계 ID가 포함됩니다. 요청/응답 본문, 쿠키, 인증 헤더, 세션 ID, 전화번호, 주소 및 결제 필드는 삭제되거나 기록되지 않습니다.
AUTH_NOT_CONFIGURED: 쿠키 시크릿이 없거나 읽을 수 없습니다.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