Mcp Selectel Billing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Selectel Billing (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MVP MCP-сервера для получения балансов Selectel через сервисного пользователя.
.env, REST API или MCP toolconnect_selectel_account, get_balance и get_balance_predictionapp/
├── main.py # FastAPI + MCP mount
├── mcp_stdio.py # Stdio entry point для Hermes Agent
├── config.py # Настройки из env
├── db.py # SQLAlchemy engine/session
├── models.py # ORM-модели
├── schemas.py # Pydantic-схемы API
├── selectel_client.py # Клиент Selectel API
├── mcp_tools.py # MCP tools
├── api/
│ └── users.py # REST API подключения аккаунта
├── services/
│ ├── balance_formatter.py
│ └── credentials_service.py
└── tests/
└── test_balance_formatter.py
alembic/ # Миграции БД
Dockerfile
docker-compose.yml
requirements.txt.envcp .env.example .envЗаполните учётные данные Selectel (один раз):
DEFAULT_USER_ID=default
SELECTEL_ACCOUNT_ID=12345
SELECTEL_SERVICE_USER_NAME=svc-user
SELECTEL_SERVICE_USER_PASSWORD=your-passwordПри старте сервис сохранит их в БД. Дальше авторизация и обновление токена выполняются автоматически.
docker compose up --buildСервисы:
app — http://localhost:8000postgres — localhost:5432Миграции применяются автоматически при старте контейнера app.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# PostgreSQL должен быть доступен
export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/selectel_mcp
alembic upgrade head
uvicorn app.main:app --reloadВы передаёте account_id, service_user_name и service_user_password один раз. Сервер:
401 сбрасывает токен и запрашивает новый без вашего участия.env (рекомендуется для одного аккаунта)DEFAULT_USER_ID=default
SELECTEL_ACCOUNT_ID=12345
SELECTEL_SERVICE_USER_NAME=svc-user
SELECTEL_SERVICE_USER_PASSWORD=your-passwordconnect_selectel_account{
"account_id": "12345",
"service_user_name": "svc-user",
"service_user_password": "your-password"
}user_id опционален, если задан DEFAULT_USER_ID в .env.
curl -X POST http://localhost:8000/users/demo-user/selectel-credentials \
-H "Content-Type: application/json" \
-d '{
"account_id": "12345",
"service_user_name": "svc-user",
"service_user_password": "password"
}'После любого из способов достаточно вызывать get_balance — без повторной передачи пароля.
curl -X POST http://localhost:8000/users/demo-user/selectel-credentials \
-H "Content-Type: application/json" \
-d '{
"account_id": "12345",
"service_user_name": "svc-user",
"service_user_password": "password"
}'Логика endpoint:
Возможные ошибки:
400 — неверный логин или пароль403 — нет доступа к балансу502 — проблемы с Selectel APIdocker compose up --build.env или вызовите connect_selectel_account один раз.cursor/mcp.json:{
"mcpServers": {
"selectel": {
"url": "http://localhost:8000/mcp"
}
}
}selectel в ~/.cursor/mcp.json для всех проектов)selectel в статусе connected (зелёный)curl http://localhost:8000/healthВ чате можно спросить: «Проверь мой баланс в Selectel» — агент вызовет get_balance без передачи пароля.
Нужен Cursor 0.48+ (поддержка Streamable HTTP).
Hermes удобнее подключается через stdio — агент сам запускает MCP-процесс, без Docker и PostgreSQL.
git clone https://github.com/EduardGuselnikov/mcp_selectel_billing.git
cd mcp_selectel_billing
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtДобавьте в ~/.hermes/config.yaml:
mcp_servers:
selectel:
command: "/absolute/path/to/mcp_selectel_billing/.venv/bin/python"
args: ["-m", "app.mcp_stdio"]
env:
DATABASE_URL: "sqlite:////Users/you/.hermes/selectel-mcp.db"
DEFAULT_USER_ID: "default"
SELECTEL_ACCOUNT_ID: "12345"
SELECTEL_SERVICE_USER_NAME: "svc-user"
SELECTEL_SERVICE_USER_PASSWORD: "your-password"
tools:
resources: false
prompts: falseИли через CLI:
hermes mcp add selectel \
--command /absolute/path/to/mcp_selectel_billing/.venv/bin/python \
--args -m app.mcp_stdio \
--env DATABASE_URL=sqlite:////Users/you/.hermes/selectel-mcp.db \
--env DEFAULT_USER_ID=default \
--env SELECTEL_ACCOUNT_ID=12345 \
--env SELECTEL_SERVICE_USER_NAME=svc-user \
--env SELECTEL_SERVICE_USER_PASSWORD=your-passwordПроверка:
hermes mcp test selectel
hermes mcp listВ чате Hermes: «Проверь мой баланс в Selectel».
Готовый манифест для каталога Hermes: hermes/manifest.yaml. Примеры конфигурации: hermes/config.example.yaml.
mcp_servers:
selectel:
url: "http://localhost:8000/mcp"Перед использованием: docker compose up --build и credentials в .env.
MCP endpoint: http://localhost:8000/mcp
Открытие /mcp в браузере может не показать страницу — это нормально, MCP работает через POST (JSON-RPC), а не через обычный GET.connect_selectel_account (один раз){
"account_id": "12345",
"service_user_name": "svc-user",
"service_user_password": "password"
}get_balance{}или с явным user_id:
{
"user_id": "demo-user"
}Если задан DEFAULT_USER_ID в .env, user_id можно не передавать.
get_balance_predictionОценка, на сколько хватит текущего баланса (в часах по категориям услуг). API: GET /v2/billing/prediction (документация Selectel).
{}Пример ответа:
Прогноз: на сколько хватит текущего баланса при текущем потреблении.
• Облачные серверы и основные услуги: 4 дн. 4 ч.
• Объектное хранилище: средств недостаточно
• VMware: 1 дн.
• VPC: 5 ч.Возвращает человекочитаемый текст с балансами по agreement_id.
Пример ответа:
На аккаунте Selectel найдены балансы в валюте RUB.
ID договора: 263632, тип биллинга: primary
• Бонусный баланс: 36 614,64 ₽
• VK-баланс: 0 ₽
• Основной баланс: 5,14 ₽
Сумма балансов: 36 619,78 ₽
Задолженность: 0 ₽
Итоговый доступный баланс: 36 619,78 ₽
Режим оплаты: prepaycurl http://localhost:8000/healthpytest| Переменная | Описание |
|---|---|
DATABASE_URL | URL PostgreSQL |
DEFAULT_USER_ID | Пользователь по умолчанию для get_balance |
SELECTEL_ACCOUNT_ID | ID аккаунта Selectel (одноразовая настройка через .env) |
SELECTEL_SERVICE_USER_NAME | Логин сервисного пользователя |
SELECTEL_SERVICE_USER_PASSWORD | Пароль сервисного пользователя |
SELECTEL_IDENTITY_URL | URL авторизации Selectel |
SELECTEL_BALANCES_URL | URL API балансов |
SELECTEL_BALANCE_PREDICTION_URL | URL API прогноза баланса |
HTTP_TIMEOUT_SECONDS | Таймаут HTTP-запросов |
now() + 23 hours (запас 1 час до обновления)401 Unauthorized токен сбрасывается и запрос повторяется автоматическиАрхитектура готова к добавлению:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.