matt2dev cb2041fc56 Scope down to local Docker testing, drop Gitea/K3s plumbing for now
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>
2026-07-21 20:48:30 +03:00

agent-news

Telegram-бот на Dart: по команде /news (или /news <тема>) запускает Claude Code для ресёрча и присылает выжимку в чат. Тестовый/учебный проект — пока гоняем локально в Docker, без деплоя в кластер.

Как это работает

Один контейнер, три процесса:

  1. agent-news-bot (Dart, long polling) — слушает /news, спавнит claude как сабпроцесс.
  2. claude (Claude Code CLI) — делает ресёрч, в конце вызывает MCP-тул send_to_telegram.
  3. 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)
Description
Telegram-бот: ресёрч новостей LLM-агентом
Readme 54 KiB
Languages
Dart 87.3%
Dockerfile 12.7%