# Yacli

> CLI и MCP Apps-сервер для Яндекс Почты, Календаря и Диска для людей и AI-агентов

- **Type:** MCP server
- **Install:** `agentstack add mcp-nextstat-yacli`
- **Verified:** Pending review
- **Seller:** [NextStat](https://agentstack.voostack.com/s/nextstat)
- **Installs:** 0
- **Category:** [Productivity](https://agentstack.voostack.com/c/productivity)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [NextStat](https://github.com/NextStat)
- **Source:** https://github.com/NextStat/yacli

## Install

```sh
agentstack add mcp-nextstat-yacli
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

yacli

CLI, MCP server и MCP Apps для Яндекс Почты, Календаря и Диска

Один аккуратный продуктовый интерфейс для терминала, ИИ-агентов и MCP-хостов.

  
  
  
  
  
  

  Установка •
  Быстрый старт •
  Команды •
  Сценарии •
  MCP

`yacli` связывает Яндекс Почту, Календарь и Диск в один внятный интерфейс: в терминале, в агентских клиентах и внутри MCP Apps. Один бинарь закрывает повседневную ручную работу, агентские интеграции и составные сценарии вроде `письмо → .ics → событие` или `файл → письмо`.

  
    
      CLI для ежедневной работы
      Почта, календарь, вложения, события и приватный Диск в одном бинаре и одном конфиге.
    
    
      MCP для агентов
      Полноценный MCP-сервер с stdio, http, prompts, skills, resources, completions, roots и write-tools.
    
    
      MCP Apps для UI-хостов
      Дашборд, deep links, prompts, браузер ресурсов и живые кросс-сервисные сценарии.
    
  

  
    
      Письмо → вложение → файл
      Найти письмо, выгрузить нужное вложение и сохранить его локально без промежуточных скриптов.
    
    
      Письмо → .ics → событие
      Разобрать приглашение из письма и сразу создать встречу в нужном календаре.
    
    
      Файл → письмо
      Взять локальный файл, приложить его к письму и отправить через тот же интерфейс.
    
  

## Установка

### macOS и Linux

```bash
curl -fsSL https://raw.githubusercontent.com/NextStat/yacli/main/scripts/install.sh | sh
```

### Windows

```powershell
irm https://raw.githubusercontent.com/NextStat/yacli/main/scripts/install.ps1 | iex
```

Готовые сборки для macOS `x86_64`/`arm64`, Linux `x86_64`/`arm64` и Windows `x86_64` лежат в [GitHub Releases](https://github.com/NextStat/yacli/releases).

Из исходников / обновление / private mirror

```bash
cargo install --path .                 # сборка из исходников
yacli update                           # обновить до последнего релиза
yacli update --check                   # проверить без установки
```

Для private release mirror:

```bash
export YACLI_UPDATE_BASE_URL='https://mirror.example.test/releases/download/v0.5.5'
yacli update --check
```

## Быстрый старт

**Запуск за минуту**

```bash
curl -fsSL https://raw.githubusercontent.com/NextStat/yacli/main/scripts/install.sh | sh
yacli setup me@yandex.ru --calendar-app-password  --client claude
```

После этого у вас сразу будут:

- локальный CLI для Почты, Календаря и Диска;
- MCP server для Claude, Codex, Gemini и других клиентов;
- prompts, embedded skills, resources и dashboard для MCP Apps;
- готовые кросс-сервисные сценарии без клея из скриптов.
- live onboarding checklist в Unified Home, чтобы добить недостающие шаги без гадания.
- terminal home screen через `yacli home`, чтобы увидеть onboarding, workflows и последние действия в одном месте.
- product health-check через `yacli doctor` и `resource://yacli/doctor`, чтобы быстро понять, что ещё мешает readiness.
- safe remediation через `yacli doctor --apply-safe` и кнопку `Apply safe fixes` в Unified Home, чтобы автоматически закрыть безопасные локальные фиксы.
- ranked next actions через `yacli next` и `resource://yacli/next-actions`, чтобы сразу видеть самые выгодные следующие шаги.
- proactive suggestions через `yacli suggest` и `resource://yacli/suggestions`, чтобы получать recovery / cleanup / undo подсказки из реальной activity history и live product signals.
  В `Unified Home` эти suggestions теперь не только видны, но и ведут прямо в `undo` или канонический workflow/review path.
- `workflow show` и `resource://yacli/workflow/{workflow}` теперь отдают server-driven `execution.state` и `execution.available_actions`, чтобы CLI, MCP и Apps видели один и тот же actionable lifecycle workflow: `needs_input`, `review_ready`, `ready`, `recovery_ready`, `undo_ready`, `applied`, `undone`.
- Workflow panel в Apps теперь использует server-driven `execution.actions` для `next action`, так что `connect / review / resume / cleanup / undo / replay` идут из одного канонического workflow contract, а не из UI-эвристик.
- Для partial recovery `execution.actions` теперь по возможности несёт точный `tool_name + tool_arguments`, чтобы Apps могли открыть или применить retry-step без ручного прыжка в activity/replay shell command.

### С чего начать

| Если вам нужно | Что делать |
| --- | --- |
| **Пройти setup одним проходом** | `yacli setup me@yandex.ru --calendar-app-password  --client claude` |
| **Быстро подключить Почту и Диск** | `yacli add` → `yacli login` |
| **Подключить Календарь** | получить пароль приложения Яндекс ID → `yacli login calendar --app-password ` |
| **Поставить MCP в Claude / Codex / Gemini** | `yacli mcp install --client ` |
| **Поднять локальный HTTP MCP** | `yacli mcp --transport http --listen 127.0.0.1:8787` |

Для агентских и headless-сценариев `yacli login` теперь работает в два шага без ломкого `stdin`-диалога:

```bash
yacli login
# => status=pending, authorization_url, resume_command

yacli login --code 
```

`yacli` сохраняет pending PKCE session в локальном config dir и переиспользует её при втором вызове, поэтому код подтверждения больше не ломается из-за нового `code_verifier`.

Как получить пароль приложения для Календаря

1. Откройте [Пароли приложений Яндекс ID](https://yandex.ru/support/id/ru/authorization/app-passwords).
2. Перейдите `Безопасность` → `Доступ к вашим данным` → `Пароли приложений`.
3. Выберите тип `Календарь`.
4. Задайте имя, например `yacli calendar`, и скопируйте пароль.

Если не хотите хранить пароль локально:

```bash
export YACLI_CALENDAR_APP_PASSWORD=''
yacli login calendar --env-var YACLI_CALENDAR_APP_PASSWORD
```

В релизных сборках OAuth-токены и пароли приложений хранятся в системном keyring/keychain. В debug/test-сборках по умолчанию используется `file` backend, чтобы локальная разработка и `cargo test` не спамили keychain prompt-ами. Для явного override: `export YACLI_SECRET_BACKEND=keyring` или `export YACLI_SECRET_BACKEND=file`.

### Проверьте, что всё работает

```bash
yacli home
yacli doctor
yacli doctor --apply-safe
yacli next
yacli suggest
yacli status
yacli mail list
yacli calendar calendars
yacli disk info
```

## Живой сценарий в Claude Cowork

`yacli` уже тянет реальные составные задачи внутри агентского интерфейса, а не только отдельные команды.

**Запрос в Claude Cowork:**

> Создай событие "Ревью yacli v0.5" понедельник в 11:00 на 30 минут, отправь напоминание на почту, и создай папку на Диске для материалов

**Что получилось:**

1. Событие создано в календаре на понедельник, **16 марта 2026**, `11:00–11:30`.
2. Напоминание на почту отправлено.
3. Папка на Яндекс Диске подтверждена: `/yacli-v0.5-review`.

**Почему это важно:** один запрос связывает сразу три surface `yacli`:

- календарь для создания события;
- почту для отправки напоминания;
- диск для подготовки рабочей папки.

Именно это и является продуктовой целью `yacli`: не просто “дать tools”, а довести реальные рабочие сценарии до одного понятного контракта для людей и агентов.

## Повседневные команды

### Почта

```bash
yacli mail folders
yacli mail list
yacli mail search "смета"
yacli mail read 1353
yacli mail reply 1353 "Принято, спасибо"
yacli mail forward 1353 person@example.com "Посмотрите, пожалуйста"
yacli mail send person@example.com "Синк" "Привет"
yacli mail send person@example.com "Счёт" "Во вложении файл" --attach ./invoice.pdf
yacli mail send person@example.com "Счёт" "Во вложении файл" --attach ./invoice.pdf --dry-run
yacli mail send-link person@example.com "Материалы" "Отправляю ссылку" --source ./archive.zip --path disk:/docs/archive/archive.zip
yacli mail send-link person@example.com "Материалы" "Отправляю ссылку" --source ./archive.zip --path disk:/docs/archive/archive.zip --dry-run
yacli mail send-published-link person@example.com "Материалы" "Отправляю ссылку" --public-url https://disk.yandex.ru/i/archive-link
yacli mail send-published-link person@example.com "Материалы" "Отправляю ссылку" --public-url https://disk.yandex.ru/i/archive-link --dry-run
yacli disk upload-link --source ./archive.zip --path disk:/docs/archive/archive.zip
yacli disk upload-link --source ./archive.zip --path disk:/docs/archive/archive.zip --dry-run
```

Вложения и приглашения:

```bash
yacli mail attachment export 1353 --index 1 --output ./invoice.pdf
yacli mail invite inspect 1353 --index 1
yacli mail invite create-event 1353 --index 1
```

- Число `1353` — идентификатор письма из `mail list` или `mail search`.
- `--folder "Имя папки"` для работы не с INBOX.
- `--html`, `--cc`, `--bcc` для HTML и копий.
- `--attach` можно указать несколько раз.
- `--dry-run` показывает review отправки без реального SMTP-вызова.
- Если собранное письмо уже слишком тяжёлое для безопасной SMTP-отправки, `mail send --dry-run` честно рекомендует workflow `send-link-by-mail`, а реальный `mail send` блокируется до сетевого шага с той же подсказкой.
- `mail send-link` — правильный flow для больших файлов: upload на Диск, publish ссылки и письмо со ссылкой в одном шаге.
- Если у `mail send-link` уже случился `upload + publish`, а SMTP упал, команда возвращает `status=partial` с готовыми recovery actions: повторить только mail-step через `mail send-published-link`, вручную поделиться ссылкой или отозвать её.
- `mail send-published-link` — честный retry mail-step для уже опубликованной ссылки без повторного upload/publish.
- `disk upload-link` — правильный flow, когда нужно просто получить публичную ссылку без отправки письма.

Ещё примеры

```bash
yacli mail list --folder "Отправленные" --limit 20
yacli mail search "договор" --folder "Архив 2026"
yacli mail attachment export 1353 --name invoice.pdf --output ./invoice.pdf
yacli mail invite inspect 1353 --name invite.ics
yacli mail invite create-event 1353 --name invite.ics --calendar team --event-index 2
yacli mail send person@example.com "Счет" "Отправляю счет" --cc boss@example.com
yacli mail send person@example.com "Счет" "Отправляю счет" --attach ./invoice.pdf --attach ./spec.docx
yacli mail send-link person@example.com "Материалы" "Отправляю ссылку" --source ./archive.zip --path disk:/docs/archive/archive.zip
```

### Календарь

```bash
yacli calendar calendars
yacli calendar events
yacli calendar events 2026-03-14 2026-03-20 --limit 20
yacli calendar create "Синк команды" 2026-03-14T09:00:00Z 2026-03-14T10:00:00Z
yacli calendar create "Синк команды" 2026-03-14T09:00:00Z 2026-03-14T10:00:00Z --dry-run
yacli calendar delete 
```

- Без дат `events` показывает ближайшие 30 дней.
- `--calendar ` для работы не с default-календарём.
- `calendar create --dry-run` показывает review события без реального CalDAV PUT.

### Диск

```bash
yacli disk info
yacli disk list
yacli disk list disk:/docs --limit 50
yacli disk mkdir disk:/docs/archive
yacli disk upload ./report.pdf disk:/docs/archive/report.pdf
yacli disk upload ./report.pdf disk:/docs/archive/report.pdf --dry-run
yacli disk upload-link --source ./report.pdf --path disk:/docs/archive/report.pdf
yacli disk upload-link --source ./report.pdf --path disk:/docs/archive/report.pdf --dry-run
yacli disk download disk:/docs/archive/report.pdf --output ./report.pdf
yacli disk publish disk:/docs/archive/report.pdf
yacli disk publish disk:/docs/archive/report.pdf --dry-run
yacli disk unpublish disk:/docs/archive/report.pdf
yacli disk unpublish disk:/docs/archive/report.pdf --dry-run
```

- `disk upload --dry-run` показывает review файла и remote path без запроса upload ticket и без реальной загрузки.
- `disk upload-link` закрывает human flow `локальный файл -> Диск -> публичная ссылка` в одном шаге; `--dry-run` показывает review без upload/publish.
- `disk download` скачивает приватный файл с того же robust transfer contract: progress, retry, stats и activity replay.
- `disk publish --dry-run` показывает, что именно будет опубликовано и уже есть ли у ресурса `public_url` / `public_key`, без реального publish.
- `disk publish` публикует приватный ресурс и возвращает `public_url` / `public_key`, чтобы большой файл можно было не слать вложением, а отдать ссылкой.
- `disk unpublish --dry-run` показывает, какая публичная ссылка будет снята, без реального revoke.
- `disk unpublish` отзывает публичную ссылку и возвращает, какая `public_url` / `public_key` были сняты.
- Реальные upload/download transfer на Диск по умолчанию ждут завершения без общего short timeout на тело запроса; при необходимости жёсткий потолок можно задать через `YACLI_DISK_UPLOAD_TIMEOUT_SECS` и `YACLI_DISK_DOWNLOAD_TIMEOUT_SECS`.
- В CLI table-mode большие upload/download показывают живой progress и throughput в stderr, не ломая JSON/MCP contract.
- При transient сетевых сбоях transfer автоматически делает несколько безопасных retry-попыток: download стартует заново, upload получает новый upload ticket и повторяет отправку целиком.
- `disk public download` теперь умеет resumable download через `.part` + HTTP `Range`, если download endpoint поддерживает partial content; итоговый payload показывает `resumed_from_bytes`, `attempts` и `elapsed_ms`.

### Журнал действий

```bash
yacli activity list
yacli activity list --limit 20
yacli activity show 
yacli activity undo 
```

- В журнал попадают только успешные реальные write-операции.
- `--dry-run` в журнал не записывается.
- У каждой записи есть `replay_command`, который можно повторить или передать агенту.
- Для честно обратимых действий запись дополнительно несёт `undo_command`, а `yacli activity undo ` выполняет штатный rollback.

### Публичный Диск

```bash
yacli disk public show --public-key https://disk.yandex.ru/i/WhGpLnQWR9efCA
yacli disk public download --public-key https://disk.yandex.ru/i/WhGpLnQWR9efCA --output ./sample.pdf
```

## Кросс-сервисные сценарии

| Skill / workflow | Что связывает | Пример запроса |
| --- | --- | --- |
| `daily-briefing` | Почта + календарь | «Собери утреннюю сводку по письмам и встречам» |
| `reply-with-context` | Почта + календарь | «Ответь на письмо с учётом моего расписания» |
| `attachment-to-disk` | Почта → файл | «Найди письмо и сохрани вложение в файл» |
| `send-file-by-mail` | Файл → почта | «Отправь файл с диска по почте» |
| `send-link-by-mail` | Файл → Диск → почта | «Загрузи большой файл на Диск и отправь ссылку по почте» |
| `publish-file-link` | Файл → Диск | «Загрузи файл на Диск и дай публичную ссылку» |
| `revoke-public-link` | Диск | «Отзови публичную ссылку у файла на Диске» |
| `invite-to-calendar` | Почта → календарь | «Найди приглашение и добавь встречу в календарь» |

```bash
# утренняя сводка
yacli mail list --limit 10
yacli calendar events

# ответ с учётом расписания
yacli mail read 1353
yacli calendar events 2026-03-14 2026-03-16
yacli mail reply 1353 "Подтверждаю, это окно подходит"

# большой файл -> ссылка -> письмо
yacli mail send-link person@example.com "Материалы" "Отправляю ссылку" --source ./archive.zip --path disk:/docs/archive/archive.zip

# локальный файл -> публичная ссылка
yacli disk upload-link --source ./archive.zip --path disk:/docs/archive/archive.zip

# отозвать публичную ссылку
yacli disk unpublish disk:/docs/archive/archive.zip

# сохранить вложение
yacli mail attachment export 1353 --name invoice.pdf --output ./invoice.pdf

# отправить файл по почте
yacli mail send person@example.com "Счёт" "Во вложении файл" --attach ./invoice.pdf

# приглашение → событие
yacli mail invite inspect 1353 --index 1
yacli mail invite create-event 1353 --index 1 --calendar team
```

Для MCP-клиентов те же сценарии доступны через `prompts/get` и `resource://yacli/skill/*`.

## Несколько адресов

```bash
yacli add personal@yandex.ru
yacli login

yacli add work@company.ru work
yacli use work
yacli login

yacli mail list --account personal
yacli mail search "счет" --account work
```

У каждого адреса свои токены и настройки. `use` переключает текущую учётную запись, `--account` обращается к конкретной.

## Почему yacli

| Surface | Что это даёт |
| --- | --- |
| `Один runtime` | Почта, календарь и диск живут в одном бинаре, одном конфиге и одном агентском контракте. |
| `Apps-first MCP` | Не только too

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [NextStat](https://github.com/NextStat)
- **Source:** [NextStat/yacli](https://github.com/NextStat/yacli)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: flagged — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-nextstat-yacli
- Seller: https://agentstack.voostack.com/s/nextstat
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
