AI
АНКИИ - обучение ИИ-компетенциям / A+I - внедрение ИИ для бизнеса
Codex MCP · VPS · рабочие сервисы
Инструкция

Яндекс-сервисы и Codex: Почта, Диск и Календарь с записью

Как подключить Яндекс.Почту, Яндекс.Диск и Яндекс.Календарь к Codex на VPS через терминал. В инструкции есть режимы чтения, записи, загрузки файлов, создания событий и отправки писем.

Yandex OAuth · Disk API · IMAP/SMTP · CalDAV · MCP
01 / ВЫБОР

Два варианта подключения

Для одного личного аккаунта проще начать с OAuth-токена пользователя. Для корпоративной почты на домене лучше использовать Yandex 360 service applications.

Личный OAuth-токенБыстрый старт для одного аккаунта. Codex работает от имени конкретного пользователя.
Yandex 360Корпоративный контур для организации, сотрудников и централизованного управления правами.
Write/send режимПозволяет отправлять письма, создавать события, загружать и удалять файлы. Нужны явные подтверждения.
MCP-оберткаЛучше разделить инструменты на read, draft и write, чтобы опасные действия не выполнялись случайно.
02 / БЕЗОПАСНОСТЬ

Правила для записи и отправки

В отличие от Google read-only инструкции, здесь агент получает возможность менять данные. Поэтому подтверждение операций нужно заложить в интерфейс и MCP tools.

Codex не должен отправлять письма, удалять письма или файлы, менять календарь и загружать документы без явной команды владельца в текущем диалоге.

ReadПоиск писем, список файлов, события календаря. Обычно подтверждение не требуется.
DraftПодготовить письмо, ICS-событие или план загрузки файла. Без внешнего действия.
WriteОтправка письма, загрузка, удаление, создание или изменение события. Требуется confirm:true и явная фраза пользователя.
ЛогиВсе write/send действия стоит писать в журнал: кто попросил, что изменено, когда и каким tool.
03 / СЕРВЕР

Подготовка VPS

Секреты Яндекса лучше хранить в отдельном env-файле вне репозитория.

Проверить окружение

node --version
npm --version
codex --version
curl --version
openssl version

Создать каталоги

mkdir -p /root/codexclaw/.secrets/yandex
mkdir -p /root/codexclaw/workspace/tools/yandex-mcp
chmod 700 /root/codexclaw/.secrets
chmod 700 /root/codexclaw/.secrets/yandex

Секреты

nano /root/codexclaw/.secrets/yandex/env
chmod 600 /root/codexclaw/.secrets/yandex/env

Шаблон env

YANDEX_EMAIL="user@yandex.ru"
YANDEX_OAUTH_TOKEN="paste_token_here"
YANDEX_CLIENT_ID="paste_client_id_here"
YANDEX_CLIENT_SECRET="paste_client_secret_here"
YANDEX_ORG_ID=""
04 / OAUTH

Создать OAuth-приложение Яндекса

Приложение создается в кабинете OAuth. Для терминального теста удобно использовать verification_code redirect.

Страница создания

https://oauth.yandex.ru/client/new

Платформа

Тип: Веб-сервисы
Redirect URI для отладки: https://oauth.yandex.ru/verification_code

Scopes для полного контура

cloud_api:disk.read
cloud_api:disk.write
cloud_api:disk.info
mail:imap_full
mail:smtp
calendar:events.read
calendar:events.write
calendar:calendars.read
calendar:calendars.write
calendar:free_busy.read
05 / ЛИЧНЫЙ ТОКЕН

Быстрый сценарий для одного аккаунта

После создания OAuth-приложения откройте ссылку авторизации и сохраните полученный токен в secrets/env.

OAuth URL

https://oauth.yandex.ru/authorize?response_type=token&client_id=YANDEX_CLIENT_ID

Сохранить токен

YANDEX_EMAIL="user@yandex.ru"
YANDEX_OAUTH_TOKEN="y0_AgAAAA..."
YANDEX_CLIENT_ID="..."
YANDEX_CLIENT_SECRET="..."
06 / YANDEX 360

Корпоративный сценарий

Для доменной почты и нескольких сотрудников используйте service applications и временные токены на конкретного пользователя.

Активировать service applications

curl --request POST "https://api360.yandex.net/security/v1/org/${YANDEX_ORG_ID}/service_applications/activate" \
  --header "Authorization: OAuth ${YANDEX_OWNER_TOKEN}"

Получить временный токен сотрудника

curl --location --request POST 'https://oauth.yandex.ru/token' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
  --data-urlencode "client_id=${YANDEX_SERVICE_APP_CLIENT_ID}" \
  --data-urlencode "client_secret=${YANDEX_SERVICE_APP_CLIENT_SECRET}" \
  --data-urlencode 'subject_token=user@company.ru' \
  --data-urlencode 'subject_token_type=urn:yandex:params:oauth:token-type:email'
07 / ДИСК

Проверить Яндекс.Диск

Перед MCP проверьте, что OAuth token видит Диск и может выполнять запись.

Информация о диске

set -a; source /root/codexclaw/.secrets/yandex/env; set +a
curl -sS "https://cloud-api.yandex.net/v1/disk" \
  -H "Accept: application/json" \
  -H "Authorization: OAuth ${YANDEX_OAUTH_TOKEN}" | jq .

Создать папку

curl -sS -X PUT "https://cloud-api.yandex.net/v1/disk/resources?path=disk:/CodexTest" \
  -H "Authorization: OAuth ${YANDEX_OAUTH_TOKEN}" | jq .

Загрузить файл

echo "Codex Yandex Disk test" > /tmp/codex-yandex-test.txt
UPLOAD_URL=$(curl -sS "https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk:/CodexTest/codex-yandex-test.txt&overwrite=true" \
  -H "Authorization: OAuth ${YANDEX_OAUTH_TOKEN}" | jq -r .href)
curl -sS -T /tmp/codex-yandex-test.txt "$UPLOAD_URL"
08 / ПОЧТА

Проверить Яндекс.Почту IMAP и SMTP

IMAP нужен для чтения и поиска, SMTP для отправки. Для OAuth используется XOAUTH2.

IMAP XOAUTH2

python3 - <<'PY'
import os, imaplib
from pathlib import Path
for line in Path('/root/codexclaw/.secrets/yandex/env').read_text().splitlines():
    if '=' in line and not line.strip().startswith('#'):
        k,v=line.split('=',1); os.environ[k]=v.strip().strip('"')
email=os.environ['YANDEX_EMAIL']
token=os.environ['YANDEX_OAUTH_TOKEN']
auth=f'user={email}\1auth=Bearer {token}\1\1'
imap=imaplib.IMAP4_SSL('imap.yandex.com', 993)
imap.authenticate('XOAUTH2', lambda _: auth.encode())
print(imap.select('INBOX', readonly=True))
imap.logout()
PY

SMTP XOAUTH2 без отправки

python3 - <<'PY'
import os, smtplib, base64
from pathlib import Path
for line in Path('/root/codexclaw/.secrets/yandex/env').read_text().splitlines():
    if '=' in line and not line.strip().startswith('#'):
        k,v=line.split('=',1); os.environ[k]=v.strip().strip('"')
email=os.environ['YANDEX_EMAIL']
token=os.environ['YANDEX_OAUTH_TOKEN']
auth=base64.b64encode(f'user={email}\1auth=Bearer {token}\1\1'.encode()).decode()
s=smtplib.SMTP_SSL('smtp.yandex.com', 465)
s.ehlo()
code, msg = s.docmd('AUTH', 'XOAUTH2 ' + auth)
print(code, msg.decode(errors='ignore'))
s.quit()
PY
09 / КАЛЕНДАРЬ

Проверить CalDAV

Календарь можно подключить через CalDAV. Тест ниже создает реальное событие.

EVENT_UID="codex-test-$(date +%s)"
START_UTC=$(date -u -d '+1 hour' +%Y%m%dT%H%M%SZ)
END_UTC=$(date -u -d '+2 hour' +%Y%m%dT%H%M%SZ)

curl -i "https://caldav.yandex.ru/calendars/${YANDEX_EMAIL}/events-default/${EVENT_UID}.ics" \
  -H "Authorization: OAuth ${YANDEX_OAUTH_TOKEN}" \
  -H "Content-Type: text/calendar; charset=utf-8" \
  -X PUT \
  --data-binary "BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Codex//Yandex MCP Test//RU
BEGIN:VEVENT
UID:${EVENT_UID}
SUMMARY:Codex test event
DTSTART:${START_UTC}
DTEND:${END_UTC}
DESCRIPTION:Created by terminal smoke test
END:VEVENT
END:VCALENDAR"

Этот тест создает событие в реальном календаре. После проверки удалите его вручную или через CalDAV DELETE.

10 / MCP

Какие инструменты сделать для Codex

Для записи и отправки важно разделить подготовку действия и само выполнение.

yandex_mail_search / getПоиск и чтение писем через IMAP. Тело письма лучше возвращать только по выбранному id.
yandex_mail_prepare_send / sendСначала собрать черновик письма, затем отправлять только при confirm:true.
yandex_disk_search / upload / deleteПоиск безопасен, загрузка и удаление требуют подтверждения.
yandex_calendar_prepare / create / update / deleteСобытие сначала показывается как карточка или ICS, запись выполняется после подтверждения.
11 / CODEX

Подключение MCP в Codex

Yandex MCP должен стартовать с env-файлом секретов.

Файл сервера

nano /root/codexclaw/workspace/tools/yandex-mcp/server.mjs
chmod +x /root/codexclaw/workspace/tools/yandex-mcp/server.mjs

Codex config

[mcp_servers.yandex_workspace]
command = "bash"
args = ["-lc", "set -a; source /root/codexclaw/.secrets/yandex/env; set +a; exec node /root/codexclaw/workspace/tools/yandex-mcp/server.mjs"]

Проверка

cd /root/codexclaw
codex mcp list
codex
12 / ЗАДАЧИ

Как формулировать команды

Для read задач можно просить результат сразу. Для write/send задач сначала просите показать план и ждать подтверждения.

Письма

Найди в Яндекс.Почте последние письма от example@company.ru. Покажи только дату, отправителя и тему.

Черновик письма

Подготовь письмо Ивану по итогам встречи. Не отправляй, сначала покажи тему, текст и адресатов.

Диск

Создай папку на Яндекс.Диске /Проекты/ДОМ.РФ и загрузи туда файл. Сначала покажи точный план операции и жди подтверждения.

Календарь

Создай событие в Яндекс.Календаре на пятницу 15:00. Сначала покажи карточку события и жди подтверждения.
13 / ОШИБКИ

Типовые проблемы

Для Яндекса чаще всего проблема в scopes, отключенном доступе почтовых клиентов или несовпадении email и токена.

401 tokenТокен не скопирован, отозван или выдан другому приложению. Получите новый токен.
403 scope missingВ OAuth-приложении нет нужного права. Добавьте scope и перевыпустите токен.
IMAP disabledПроверьте настройки доступа почтовых клиентов в Яндекс.Почте.
SMTP AUTH failedПроверьте mail:smtp, email аккаунта, токен и smtp.yandex.com:465.
14 / ИСТОЧНИКИ

Что сверить перед внедрением

Перед production-запуском проверьте актуальные страницы Яндекса, потому что scopes и корпоративные настройки могут меняться.

Yandex Disk REST API: https://yandex.com/dev/disk-api/doc/en/
OAuth apps: https://oauth.yandex.ru/client/new
Yandex 360 service applications: https://yandex.com/support/yandex-360/business/admin/en/security-service-applications.html
Yandex 360 API service applications: https://yandex.ru/dev/api360/doc/ru/ref/ServiceApplicationsService/ServiceApplicationsService_Create.html

Для write/send режима главный продуктовый вопрос не “как дать агенту доступ”, а где он обязан остановиться и запросить подтверждение.

Сравнить с инструкцией для Google Workspace