Проверить окружение
node --version
npm --version
codex --version
curl --version
openssl versionКак подключить Яндекс.Почту, Яндекс.Диск и Яндекс.Календарь к Codex на VPS через терминал. В инструкции есть режимы чтения, записи, загрузки файлов, создания событий и отправки писем.
Для одного личного аккаунта проще начать с OAuth-токена пользователя. Для корпоративной почты на домене лучше использовать Yandex 360 service applications.
В отличие от Google read-only инструкции, здесь агент получает возможность менять данные. Поэтому подтверждение операций нужно заложить в интерфейс и MCP tools.
Codex не должен отправлять письма, удалять письма или файлы, менять календарь и загружать документы без явной команды владельца в текущем диалоге.
Секреты Яндекса лучше хранить в отдельном env-файле вне репозитория.
node --version
npm --version
codex --version
curl --version
openssl versionmkdir -p /root/codexclaw/.secrets/yandex
mkdir -p /root/codexclaw/workspace/tools/yandex-mcp
chmod 700 /root/codexclaw/.secrets
chmod 700 /root/codexclaw/.secrets/yandexnano /root/codexclaw/.secrets/yandex/env
chmod 600 /root/codexclaw/.secrets/yandex/envYANDEX_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=""Приложение создается в кабинете OAuth. Для терминального теста удобно использовать verification_code redirect.
https://oauth.yandex.ru/client/newТип: Веб-сервисы
Redirect URI для отладки: https://oauth.yandex.ru/verification_codecloud_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После создания OAuth-приложения откройте ссылку авторизации и сохраните полученный токен в secrets/env.
https://oauth.yandex.ru/authorize?response_type=token&client_id=YANDEX_CLIENT_IDYANDEX_EMAIL="user@yandex.ru"
YANDEX_OAUTH_TOKEN="y0_AgAAAA..."
YANDEX_CLIENT_ID="..."
YANDEX_CLIENT_SECRET="..."Для доменной почты и нескольких сотрудников используйте 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'Перед 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"IMAP нужен для чтения и поиска, SMTP для отправки. Для OAuth используется 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()
PYpython3 - <<'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Календарь можно подключить через 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.
Для записи и отправки важно разделить подготовку действия и само выполнение.
Yandex MCP должен стартовать с env-файлом секретов.
nano /root/codexclaw/workspace/tools/yandex-mcp/server.mjs
chmod +x /root/codexclaw/workspace/tools/yandex-mcp/server.mjs[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Для read задач можно просить результат сразу. Для write/send задач сначала просите показать план и ждать подтверждения.
Найди в Яндекс.Почте последние письма от example@company.ru. Покажи только дату, отправителя и тему.Подготовь письмо Ивану по итогам встречи. Не отправляй, сначала покажи тему, текст и адресатов.Создай папку на Яндекс.Диске /Проекты/ДОМ.РФ и загрузи туда файл. Сначала покажи точный план операции и жди подтверждения.Создай событие в Яндекс.Календаре на пятницу 15:00. Сначала покажи карточку события и жди подтверждения.Для Яндекса чаще всего проблема в scopes, отключенном доступе почтовых клиентов или несовпадении email и токена.
Перед production-запуском проверьте актуальные страницы Яндекса, потому что scopes и корпоративные настройки могут меняться.
Для write/send режима главный продуктовый вопрос не “как дать агенту доступ”, а где он обязан остановиться и запросить подтверждение.
Сравнить с инструкцией для Google Workspace