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>
65 lines
2.9 KiB
Markdown
65 lines
2.9 KiB
Markdown
# 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.
|
||
|
||
## Запуск локально
|
||
|
||
```bash
|
||
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-ключ). Один раз
|
||
после первого запуска нужно зайти в контейнер и залогиниться:
|
||
|
||
```bash
|
||
docker compose exec agent-news claude
|
||
```
|
||
|
||
CLI напечатает ссылку — открой её в браузере, авторизуйся. Токен сохранится в
|
||
`~/.claude` на volume, так что после `docker compose restart` логин не слетит.
|
||
|
||
### Проверка
|
||
|
||
Напиши боту `/news` (или `/news <тема>`) из чата с id из `ALLOWED_CHAT_IDS` — бот
|
||
ответит "ищу…", а через 1-3 минуты Claude сам пришлёт выжимку через `send_to_telegram`.
|
||
|
||
```bash
|
||
docker compose logs -f agent-news
|
||
```
|
||
|
||
## Локальная разработка (без Docker)
|
||
|
||
```bash
|
||
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`) |
|