SMSC MCP
# SMSC MCP
[](https://github.com/heist1337/smsc-analytics-mcp/actions/workflows/check.yml)
[](https://gofastmcp.com/)
[](LICENSE)

Чтение SMSC и аналитика расходов через **FastMCP**.
Состояние хранится в одном приватном **SQLite** файле.
Отправки SMS, платежей, платных проверок и изменений аккаунта в коде нет.
## Быстрый старт
Установить [uv](https://docs.astral.sh/uv/getting-started/installation/), затем:
```bash
git clone https://github.com/heist1337/smsc-analytics-mcp.git
cd smsc-analytics-mcp
cp .env.example .env
# Записать API-ключ SMSC в приватный .env.
uv run --locked --env-file .env smsc-mcp
```
По умолчанию используется **stdio**: сервер запускается самим MCP-клиентом.
Python и зависимости устанавливает uv.
Готовый шаблон подключения: [mcp.example.json](mcp.example.json).
## Инструменты
| Инструмент | Действие |
| --- | --- |
| `smsc_read` | Каталог разрешённых чтений; живые чтения и обезличенные локальные снимки |
| `smsc_history` | Одна страница исходящих с явным продолжением |
| `smsc_cost_report` | Анализ одной живой страницы; не итог большого периода |
| `smsc_refresh` | Одна страница в локальную историю, checkpoint и защита конкуренции |
| `smsc_analytics` | Аналитика SQLite без API-ключа и запросов к SMSC |
Начать с `smsc_read(operation="catalog")`: ключ для каталога не нужен.
Даты — `DD.MM.YYYY`. Проверять `complete`, `next_cursor`, `coverage` и
`truncated`; пустой или неполный кеш не означает отсутствие расходов.
Стоимость сообщений отличается от всех списаний со счёта. Валюты не смешиваются,
суммы считаются Decimal. Тексты и персональные данные по умолчанию скрыты.
## Настройки
| Переменная | Назначение |
| --- | --- |
| `SMSC_API_TOKEN` | API-ключ SMSC; alias `SMSC_API_KEY` |
| `SMSC_CURRENCY` | Подтверждённая валюта аккаунта; без настройки `unknown` |
| `SMSC_TIMEZONE` | По умолчанию `Europe/Moscow` |
| `SMSC_DATABASE` | По умолчанию `~/.local/share/smsc-mcp/state.sqlite3` |
| `SMSC_HISTORY_CURRENCY_VERIFIED` | По умолчанию false; подтвердить валюту поля cost перед накопленной загрузкой |
| `SMSC_STORE_MESSAGE_TEXT` | По умолчанию false; хранение текстов требует отдельного решения |
| `SMSC_REDACTION_KEY` | Необязательный прежний HMAC-секрет; иначе создаётся и сохраняется в SQLite |
| `SMSC_SERVER` | `primary` или `backup`; произвольный endpoint запрещён |
| `SMSC_CONFIG_FILE` | Необязательный приватный JSON вместо env; поддерживает прежние login/psw |
`refresh` принимает только закрытые дни и проверенную валюту cost.
Нет автоматической загрузки истории и расписаний. Изменение валюты, зоны или
HMAC-ключа после загрузки блокируется до согласования данных.
Все экземпляры одного аккаунта должны использовать **один SQLite файл**:
в нём общий rolling budget, CAS/checkpoints и leases. Лимит истории —
20 запросов/час с интервалом минимум 21 секунда; неудачные запросы не возвращают
резерв. Другие потребители SMSC на других машинах требуют координации отдельно.
## HTTP и Docker
Для HTTP задать `MCP_TOKEN` длиной от 32 символов:
```bash
uv run --locked --env-file .env smsc-mcp --transport http --port 18092
```
URL: `http://127.0.0.1:18092/mcp/`, `Authorization: Bearer <MCP_TOKEN>`.
Сервер слушает loopback; доступ извне требует приватного транспорта/HTTPS.
```bash
docker build -t smsc-mcp .
docker run --rm -i --env-file .env -v smsc-state:/state smsc-mcp
```
Контейнер работает UID 1000. Том `/state` нужно сохранять между запусками:
бюджет, checkpoints и HMAC-ключ не должны пропадать. Docker Desktop не требуется.
## Перенос и разработка
Остановить процессы и перенести checkout, приватный env и SQLite файл.
Для живого backup использовать штатный SQLite backup API. База содержит
финансовые данные и HMAC-секрет: файл 0600, каталог 0700, вне Git.
Нет зависимости от Personal Context, Windmill, PostgreSQL или другого MCP.
```bash
uv sync --locked
uv run ruff check src tests
uv run python -m unittest discover -b -s tests
uv build
```
[Передача коллегам и проверка](SHARING.md) · [MIT](LICENSE)
TDQS
Scored across 5 tools
smsc_history and smsc_cost_report both operate on a live history page, and smsc_read is a broad catalog/discovery tool, but the descriptions clarify live vs local and read vs analyze/ingest. Boundaries are mostly distinct with only minor overlap.
All names use the smsc_ prefix and snake_case, which is readable and predictable. However, suffixes mix verbs (read, refresh) and nouns (history, cost_report, analytics), so there is no consistent verb_noun pattern.
Five tools are well-scoped for a read-only SMS history/cost analytics server. Each tool covers a distinct stage: discovery, retrieval, reporting, ingestion, and analysis.
The core read-only workflow is covered: catalog discovery, paged history retrieval, cost reporting, local ingestion, and analytics with coverage/reconcile operations. Minor gaps around cache maintenance/reset and explicit checkpoint inspection limit it slightly.