This is a pilot project — running it via docker compose locally is enough for now. Deploy/CI can come back once the project is greenlit for real use. Also fixes claude invocation: add --strict-mcp-config (verified against the actual installed claude-code CLI --help) so only agent-news' own MCP server is loaded, not whatever else might be discoverable in the environment. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.9 KiB
agent-news
Telegram-бот на Dart: по команде /news (или /news <тема>) запускает Claude Code
для ресёрча и присылает выжимку в чат. Тестовый/учебный проект — пока гоняем локально
в Docker, без деплоя в кластер.
Как это работает
Один контейнер, три процесса:
agent-news-bot(Dart, long polling) — слушает/news, спавнитclaudeкак сабпроцесс.claude(Claude Code CLI) — делает ресёрч, в конце вызывает MCP-тулsend_to_telegram.agent-news-mcp(Dart, stdio MCP-сервер) — спавнится самимclaude, шлёт готовый текст в Telegram Bot API.
Запуск локально
cp .env.example .env
# заполнить TELEGRAM_BOT_TOKEN и ALLOWED_CHAT_IDS (через запятую)
docker compose up -d --build
~/.claude (авторизация Claude Code) хранится в именованном volume claude-home —
переживает пересборку и рестарт контейнера.
Первичная авторизация Claude Code
Claude Code CLI использует OAuth-логин через Claude.ai (подписка, не API-ключ). Один раз после первого запуска нужно зайти в контейнер и залогиниться:
docker compose exec agent-news claude
CLI напечатает ссылку — открой её в браузере, авторизуйся. Токен сохранится в
~/.claude на volume, так что после docker compose restart логин не слетит.
Проверка
Напиши боту /news (или /news <тема>) из чата с id из ALLOWED_CHAT_IDS — бот
ответит "ищу…", а через 1-3 минуты Claude сам пришлёт выжимку через send_to_telegram.
docker compose logs -f agent-news
Локальная разработка (без Docker)
cd bot && dart pub get && dart analyze
cd ../mcp_server && dart pub get && dart analyze
Переменные окружения
| Переменная | Обязательна | Назначение |
|---|---|---|
TELEGRAM_BOT_TOKEN |
да | токен бота, используется и ботом, и MCP-сервером |
ALLOWED_CHAT_IDS |
да | список chat_id через запятую — кому отвечает бот |
NEWS_PROMPT |
нет | промпт по умолчанию для /news без темы |
CLAUDE_TIMEOUT_SECONDS |
нет | таймаут на ресёрч (по умолчанию 360) |
MCP_CONFIG_PATH |
нет | путь к mcp.json (по умолчанию /home/agent/claude-config/mcp.json) |