Skip to main content
Glama
README.md
# yandex-eda-mcp

MCP-сервер для **Яндекс Еды** на базе [Playwright](https://playwright.dev) (headless).
Позволяет из любого MCP-клиента (Claude Desktop, Claude Code и т.п.):

- проверять статус авторизации;
- задавать адрес доставки;
- искать рестораны и смотреть меню;
- собирать корзину;
- оформлять заказ (с защитой от случайного подтверждения).

Работает через **персистентный профиль Chromium**: вы логинитесь один раз в
видимом браузере, дальше сервер ходит на сайт headless в том же профиле.

Профиль хранится **вне папки с кодом** — в `~/.yandex-eda-mcp/profile`, поэтому
переживает обновления кода и работает даже при запуске через `npx`.

---

## Установка

### Вариант A — через npx (без клонирования, рекомендуется)

Клонировать и собирать ничего не нужно. Нужен только **Node.js ≥ 20**.
Пропишите сервер в конфиг MCP-клиента:

```json
{
  "mcpServers": {
    "yandex-eda": {
      "command": "npx",
      "args": ["-y", "yandex-eda-mcp"]
    }
  }
}
```

Или одной командой через CLI Claude Code (сразу в user-scope — сервер доступен
в любой сессии, а не только в текущей папке):

```bash
claude mcp add -s user yandex-eda -- npx -y yandex-eda-mcp
```

При первом запуске `npx` сам скачает пакет и Chromium (~150 МБ, разово).
Вход в аккаунт Яндекса — автоматически при первом обращении к сайту (см. ниже).
Это единственная настройка: раздел «Подключение к MCP-клиенту» ниже нужен
только при установке из исходников (Вариант B).

### Вариант B — из исходников

```bash
git clone <repo> && cd yandex-eda-mcp
npm install          # ставит зависимости, Chromium и собирает dist/ (скрипт prepare)
```

Отдельный `npm run build` больше не нужен — сборка идёт автоматически при
`npm install` (скрипт `prepare`).

## Авторизация — автоматически при первом использовании

Как только вы впервые обратитесь к
сайту (например, `search_restaurants`), сервер сам увидит, что профиль не
авторизован, и **откроет видимое окно браузера** для входа. Войдите в свой
аккаунт Яндекса (логин/пароль/SMS/капча), окно закроется само, дальше всё
работает headless. Вход нужен один раз на компьютере.

Можно и явно — вызвав MCP-инструмент `login` (или из терминала `npm run login`).

> Профиль и авторизация индивидуальны для каждого пользователя: чужую сессию
> шарить нельзя, каждый входит в свой аккаунт.

## Подключение к MCP-клиенту (только для установки из исходников, Вариант B)

Если вы поставили сервер через `npx` (Вариант A) — этот раздел пропустите,
настройка уже готова. При установке из исходников укажите путь к собранному
`dist/index.js`:

```json
{
  "mcpServers": {
    "yandex-eda": {
      "command": "node",
      "args": ["/абсолютный/путь/к/yandex-eda-mcp/dist/index.js"]
    }
  }
}
```

Через CLI:

```bash
claude mcp add yandex-eda -- node /абсолютный/путь/к/yandex-eda-mcp/dist/index.js
```

---

## Инструменты (MCP tools)

| Инструмент | Назначение |
|---|---|
| `login_status` | Проверить, авторизован ли профиль |
| `login` | Открыть окно входа в Яндекс (обычно вызывается сам) |
| `get_address` | Текущий адрес доставки (метка «Дом» или улица) |
| `list_saved_addresses` | Сохранённые в аккаунте адреса (с подъездом/квартирой) |
| `set_address` | Задать адрес: сперва ищет среди сохранённых, иначе новый по карте |
| `search_restaurants` | Поиск ресторанов / каталог |
| `get_menu` | Меню ресторана по URL или slug |
| `add_to_cart` | Добавить блюдо в корзину (навигация по категории → карточка → модалка) |
| `view_cart` | Показать корзину и сумму |
| `list_payment_methods` | Способы оплаты (карты/Карта Пэй/СБП) и текущий выбранный |
| `place_order` | Оформить заказ (по умолчанию dry-run; выбор оплаты через `payment`) |
| `navigate` | Перейти по пути/URL внутри сайта |
| `debug_snapshot` | URL + текст + скриншот страницы для отладки |

### Сохранённые адреса

`set_address` по умолчанию сначала ищет совпадение среди адресов, уже
сохранённых в аккаунте Яндекс Еды (по метке или улице), и выбирает его
**мгновенно, сохраняя квартиру/подъезд/этаж** — без повторного тыканья по карте.

```
set_address «домой»        → выбирает сохранённый «Дом» со всеми деталями
set_address «на работу»    → выбирает сохранённый «На работу»
set_address «Казань, Баумана 10» → нет в сохранённых → вводит новый по карте
```

Посмотреть список — `list_saved_addresses`. Форсировать ввод нового адреса
(минуя сохранённые) — `set_address` с `preferSaved: false`.

### Безопасность оформления заказа

`place_order` по умолчанию работает в режиме **dry-run**: доходит до кнопки
«Оформить заказ», но НЕ нажимает её и не списывает деньги. Чтобы реально
оформить заказ, нужно явно передать `confirm: true`.

Типичный сценарий:

1. `set_address` → «домой» (или «Москва, Тверская 1»)
2. `search_restaurants` → «пицца»
3. `get_menu` → выбранный ресторан
4. `add_to_cart` → нужные блюда
5. `view_cart` → проверить состав и сумму
6. `place_order` (dry-run) → убедиться, что всё готово
7. `place_order` с `confirm: true` → оформить

### Оплата и выбор карты

`list_payment_methods` показывает доступные способы (карты, «Карта Пэй», СБП) и
текущий выбранный. Выбрать способ на оформлении можно параметром `payment` у
`place_order` (напр. `payment: "Карта Пэй"`).

> **Важно:** оплата через **СБП** требует ручного подтверждения в приложении
> банка, поэтому автоматически заказ по ней НЕ оформится (Яндекс создаёт заказ и
> отменяет его без оплаты). Для автоматического оформления выбирайте **карту**
> (`payment: "Карта Пэй"` или добавьте карту в аккаунте).

---

## Переменные окружения

| Переменная | По умолчанию | Описание |
|---|---|---|
| `YANDEX_EDA_HEADLESS` | `1` | `0`/`false` — показывать браузер |
| `YANDEX_EDA_AUTO_LOGIN` | `1` | `0` — не открывать окно входа автоматически |
| `YANDEX_EDA_LOGIN_TIMEOUT` | `180000` | Сколько ждать входа в окне, мс |
| `YANDEX_EDA_DATA_DIR` | `~/.yandex-eda-mcp` | Каталог данных (профиль + скриншоты) |
| `YANDEX_EDA_PROFILE` | `<DATA_DIR>/profile` | Каталог профиля с авторизацией |
| `YANDEX_EDA_SCREENSHOT_DIR` | `<DATA_DIR>/screenshots` | Куда сохранять скриншоты |
| `YANDEX_EDA_BASE_URL` | `https://eda.yandex.ru` | Базовый URL |
| `YANDEX_EDA_TIMEOUT` | `30000` | Таймаут ожиданий, мс |
| `YANDEX_EDA_USER_AGENT` | Chrome 131 | User-Agent |

---

## Обслуживание селекторов

Яндекс использует хешированные CSS-классы, поэтому данные читаются в первую
очередь из **внутреннего JSON-API** сайта (перехват сетевых ответов) — это
устойчиво к смене вёрстки. Действия (адрес, корзина, кнопки) выполняются по
DOM-селекторам, собранным в `src/eda.ts` → `SELECTORS` и `API`.

Если что-то перестало работать:

1. Вызовите `debug_snapshot` — получите текст и скриншот текущей страницы.
2. Подправьте нужные селекторы/паттерны в `src/eda.ts`.
3. `npm run build`.

---

## Дисклеймер

Проект автоматизирует **ваш собственный** аккаунт для личного использования.
Соблюдайте условия использования Яндекс Еды. Автор не несёт ответственности за
списания и заказы, совершённые автоматизацией.

TDQS

A4.3/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct resource/action: auth, addresses, restaurant search, menu, product search, cart management, and ordering. Even similar tools like add_product vs add_to_cart and remove_from_cart vs clear_cart are explicitly differentiated by domain (shop vs restaurant) and scope (single vs all). No ambiguous overlaps exist.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern in snake_case (get_menu, set_address, remove_from_cart, search_restaurants). Two bare verbs (login, navigate) are acceptable as unambiguous actions, and the overall style is uniform.

Tool Count4/5

18 tools is on the heavier side but justified by the dual restaurant/shop domains and full order lifecycle (auth, addresses, search, cart, payment, ordering). Each tool serves a clear purpose, though a few utility tools (navigate, debug_snapshot) could be seen as auxiliary.

Completeness4/5

Covers the entire ordering flow from login and address setup through search, menu browsing, cart management, and order placement with payment. Minor gaps exist: no direct quantity editing in cart (workaround via remove/add) and no order history, but these don't block the primary use case.

Maintenance

ActivityStale
ResponsivenessNo issues