MCP-токен — это пароль от аккаунта, к которому приделали API. Отдали его агенту — и у вас появился пользователь, который не устаёт, читает любую страницу, на которую его направили, и делает ровно то, что сказала последняя инструкция в его контексте. Чаще всего это именно то, что нужно. Эта страница — про остальные случаи.
Всё ниже сверено с живым сервером на дату вверху страницы: список инструментов взят из tools/list на https://mcp.eqvps.com/mcp, лимиты — из самого API. Если вы только начинаете, сначала посмотрите подключение MCP-клиента и API-токены, потом возвращайтесь.
Модель угроз: что реально идёт не так
Три сценария — в том порядке, в каком мы их встречаем:
- Агент неправильно понял. «Почисти тестовый сервер» превращается в переустановку не того сервера. Злого умысла нет, модель просто достроила недосказанное.
- Prompt injection. Агент читает текст, который писали не вы (README, ответ в тикете, страницу из интернета), и этот текст говорит ему что-то сделать. Если у агента токен с полными правами, они есть и у внедрённой инструкции.
- Токен утёк. В историю shell, в публичный репозиторий, в общий конфиг MCP или в строку лога.
MCP-сервер проверяет, что токен действителен и что сервер принадлежит этому аккаунту (или делегирован ему). Чего вы хотели на самом деле, он не знает. Все защиты ниже отвечают на один вопрос: сколько можно наломать, если инструкция неверная?
Все MCP-инструменты по уровням риска
Клиентский токен видит 45 инструментов (MCP-сервер 1.6.0). Реселлерский токен (rk_…) видит отдельный набор из 30 реселлерских инструментов и ни одного из этих, так что всего на эндпоинте 75. tools/list отдаёт клиенту только его набор.
Здесь инструменты разложены по уровню риска. Параметры и примеры вызовов каждого — в справочнике параметров; все инструменты одной строкой, включая 30 реселлерских, — в полном списке.
Аннотаций MCP-инструментов (readOnlyHint, destructiveHint) у нас пока нет, поэтому клиент сам их не рассортирует. Настройте подтверждения вручную по уровням ниже.
Уровень 0 — публичные, без токена (5)
| Инструмент | Что делает |
|---|---|
get_started | Весь сценарий в одном ответе: какие инструменты вызывать и в каком порядке |
list_plans | Тарифы, цены, образы ОС |
sandbox_pricing | Тарифы песочниц |
register_account | Создаёт новый аккаунт и возвращает его токен |
login | Email + пароль → токен |
Уровень 1 — чтение аккаунта, без побочных эффектов (15)
| Инструмент | Что делает | На что смотреть |
|---|---|---|
whoami | id, имя, email аккаунта | |
get_balance | Предоплаченный баланс | |
list_vps | Активные, создающиеся и приостановленные серверы | |
get_vps_status | Статус, характеристики, данные доступа | С reveal: true возвращает root-пароль |
get_vps_metrics | CPU, память, сеть, диск за период | |
get_upgrade_options | На какие тарифы сервер можно перевести без переустановки | |
list_delegations | Кому вы выдали доступ | |
list_delegated_to_me | Серверы, делегированные вам | |
list_tickets | Ваши тикеты в поддержку | |
get_ticket | Один тикет с перепиской | Текст тикета для агента — недоверенный ввод |
list_sandboxes | Ваши песочницы | |
get_sandbox | Одна песочница и её расход | |
get_task | Вывод фоновой задачи | |
download_file | Читает небольшой файл из песочницы | |
get_download_url | Временная ссылка на один файл песочницы | Скачать может любой, у кого ссылка, пока она не истекла |
Уровень 2 — меняют состояние, ничего не тратят (17)
| Инструмент | Что делает | На что смотреть |
|---|---|---|
power_vps | start / stop / reboot | stop — это stop: сервисы лягут |
set_hostname | Меняет имя сервера | Меняет то самое значение, которое сверяет confirm |
undo_cancel | Снимает запланированную отмену в конце периода | |
refresh_token | Новый токен, старый отзывается сразу | Обновите статичный конфиг после этого |
set_password | Задаёт пароль аккаунта, если его ещё нет | Тот, у кого токен, может успеть первым |
topup_balance | Счёт на пополнение + ссылка на криптооплату | Для оплаты нужен кошелёк |
pay_invoice | Ссылка на оплату неоплаченного счёта | То же |
accept_delegation | Принимает приглашение | |
revoke_delegation | Завершает делегирование | |
create_ticket / reply_ticket / close_ticket | Тикеты в поддержку | Агент пишет в поддержку от вашего имени |
run_code / exec_command | Запускает код в песочнице | Только в песочнице, не на вашем VPS |
kill_task | Останавливает фоновую задачу песочницы | |
upload_file / get_upload_url | Кладёт файл в песочницу |
Уровень 3 — тратят деньги, уничтожают данные или выдают доступ (8)
| Инструмент | Что делает | Проверка на сервере |
|---|---|---|
order_vps | Заказывает сервер, оплата с баланса | Не хватает баланса → неоплаченный счёт, ничего не списано |
change_plan | Смена тарифа без переустановки, разница списывается с баланса | confirm: true; не хватает баланса → 402 |
create_sandbox | Запускает платную песочницу | Пустой баланс → 402 |
reinstall_vps | Стирает диск и ставит новую ОС | confirm = точный hostname или DELETE; 4 вызова/мин |
reset_password | Новый root-пароль, старый перестаёт работать | confirm = hostname или DELETE; 6 вызовов/мин |
cancel_service | end_of_period (по умолчанию, отменяемо) или immediate (удаляет сервер сразу) | для immediate нужен confirm = hostname |
kill_sandbox | Удаляет песочницу вместе с файлами | нет |
delegate_service | Даёт другому человеку операторский доступ к серверу | Только владелец; приглашённый должен принять |
Журнал изменений набора инструментов
| Дата | Версия сервера | Изменение | Влияние на риск |
|---|---|---|---|
| 2026-10-03 | 1.6.0 | Добавлен refresh_token; токены по умолчанию живут 1 год | Уровень 2 |
| 2026-10-03 | 1.5.0 | undo_cancel, get_upgrade_options, change_plan | change_plan тратит баланс → уровень 3 |
| 2026-10-03 | 1.1.0 | 13 инструментов песочниц | create_sandbox тратит, kill_sandbox уничтожает → уровень 3 |
Текущая версия публична: curl -s https://mcp.eqvps.com/healthz. Сменится она — обновится и эта таблица.
Баланс — это потолок трат
EQVPS работает по предоплате. Привязанной карты, кредитной линии и ухода в минус нет, так что больше, чем лежит на балансе, агент не потратит никогда. Тратят три инструмента: order_vps, change_plan и create_sandbox. Продления ваших текущих серверов списываются с того же баланса.
Создавать запросы на деньги агент может, оплачивать — нет. topup_balance и pay_invoice возвращают ссылку на криптооплату, а без кошелька ссылка ничего не делает. Эндпоинта для вывода средств тоже нет: деньги с баланса можно потратить на услуги в вашем аккаунте, вывести их наружу нельзя. Возврат при немедленной отмене тоже приходит на баланс.
Одна оговорка, и она серьёзная. Если держать баланс совсем маленьким, чтобы ограничить агента, начнут срываться продления ваших же серверов, и они уйдут в grace-период. Наше правило: один цикл продления того, что у вас уже работает, плюс бюджет текущей задачи агента. Как это посчитать, разобрано в гайде по бюджету агента. А если дать агенту собственный кошелёк с деньгами, он станет вторым потолком, за которым тоже придётся следить.
Минимальные права: токена только на чтение (пока) нет
Если прямо: любой клиентский токен имеет те же права, что аккаунт в кабинете. Имя и срок жизни токена настраиваются, области доступа (scopes) — нет.
Самое узкое, что есть сегодня, — делегирование. Заводите агенту собственный аккаунт с нулевым балансом и делегируете ему один сервер:
delegate_service { "service_id": "EQ-XXXX", "email": "agent@yourdomain.com", "expires_days": 30 }
То же через REST:
curl -s -X POST "https://api.eqvps.com/api/v1/eqvps/services/EQ-XXXX/delegations" \
-H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
-d '{"email":"agent@yourdomain.com","expires_days":30}'
Приглашение нужно принять, войдя под этим email (accept_delegation), а expires_days — от 1 до 365. Пошагово со скриншотами: делегирование доступа и раздел «Доступ» в документации.
| Делегированный аккаунт может | Делегированный аккаунт не может |
|---|---|
| Видеть статус, метрики и историю этого одного сервера | Видеть другие ваши серверы, баланс и счета |
| Включать, выключать, перезагружать | Отменять, продлевать, менять тариф |
| Менять hostname и обратный DNS | Покупать дополнения и IP |
| Сбрасывать root-пароль | Открывать веб-консоль |
| Переустанавливать ОС | Передавать сервер кому-то ещё |
Обратите внимание на две последние строки слева. Потратить ваши деньги делегат не может, а вот стереть сервер — может. Включите бэкапы на любом сервере, который агент способен переустановить.
Гигиена токенов
Один токен на агента, с именем. Создайте его в Кабинет → Настройки → API-токены для агентов или так:
curl -s -X POST "https://api.eqvps.com/api/v1/eqvps/auth/tokens" \
-H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
-d '{"name":"backup-agent","expires_in_days":90}'
Токен показывается один раз. Срок жизни — от 1 до 1825 дней, по умолчанию 365. Для агентов мы бы ставили 90.
Храните его в файле, который читаете только вы — не в репозитории, не в промпте и не в переменной shell, которую копируете туда-сюда:
mkdir -p ~/.config/eqvps && chmod 700 ~/.config/eqvps
( umask 077; read -rsp 'EQVPS token: ' T; echo; printf 'EQVPS_TOKEN=%s\n' "$T" > ~/.config/eqvps/agent.env )
ls -l ~/.config/eqvps/agent.env # ожидаем -rw-------
Дальше подключите его в сервисе агента через EnvironmentFile= (systemd) или set -a; . ~/.config/eqvps/agent.env; set +a.
Ротируйте до истечения срока. Инструмент refresh_token или POST /auth/tokens/{id}/refresh выдаёт новый токен с тем же именем и сразу отзывает старый. Если токен вписан в конфиг MCP-клиента, обновите его сразу после этого, иначе следующая сессия получит 401.
Проверяйте, кто чем пользуется: GET /auth/tokens показывает все токены с именем, сроком и last_used_at. Незнакомый токен или токен, которым пользовались после отключения агента, — это сигнал.
Если токен утёк
По порядку:
- Отзовите его. Кабинет → Настройки → API-токены для агентов → отозвать, или
curl -s -X DELETE -H "Authorization: Bearer $EQVPS_TOKEN" https://api.eqvps.com/api/v1/eqvps/auth/tokens/<id>. Он перестаёт работать со следующего запроса. - Поищите новые токены, которые создавали не вы, и отзовите их тоже.
- Оцените, что могли задеть: «История услуги» каждого сервера, счета и баланс,
list_delegations— нет ли доступа, который вы не выдавали. - Смените root-пароли на всех серверах, которые видел этот токен.
get_vps_statusсreveal: trueотдаёт root-пароль, так что утёкший токен — это утёкший root-пароль. Заодно проверьте~/.ssh/authorized_keys. - Закройте дверь с паролем. Если у аккаунта никогда не было пароля, владелец токена мог задать его через
set_password. Войдите по коду из письма и смените пароль.
Профилактика для пятого пункта ничего не стоит: задайте пароль аккаунта сами прямо сейчас, и set_password для всех остальных будет возвращать 409.
Подтверждение человеком
Что сервер проверяет сам:
reinstall_vps,reset_passwordиcancel_serviceсtype: immediateтребуютconfirm, равный точному hostname (для переустановки и сброса пароля подходит иDELETE).change_planтребуетconfirm: true.- По умолчанию отмена —
end_of_period: сервер работает до конца оплаченного периода, аundo_cancelвсё возвращает. - Лимиты на аккаунт: переустановка 4/мин, сброс пароля 6/мин, питание 20/мин, заказы 20/мин. Этого хватит, чтобы зациклившийся агент не сделал одно и то же пятьдесят раз, но одну неверную команду лимит не остановит.
Важно понимать, что такое confirm. Он не даёт агенту выполнить расплывчатое «почисти там». Злоумышленника он не остановит: hostname добывается одним вызовом get_vps_status. Настоящее подтверждение живёт в вашем MCP-клиенте. Большинство клиентов умеют спрашивать перед каждым вызовом: уровни 0 и 1 пускайте свободно, уровень 3 — только с вопросом. В клиентах с правами на отдельные инструменты, например в settings.json у Claude Code (сервер зарегистрирован как eqvps):
{
"permissions": {
"ask": ["mcp__eqvps__order_vps", "mcp__eqvps__change_plan", "mcp__eqvps__create_sandbox", "mcp__eqvps__reset_password", "mcp__eqvps__delegate_service"],
"deny": ["mcp__eqvps__reinstall_vps", "mcp__eqvps__cancel_service", "mcp__eqvps__kill_sandbox"]
}
}
И добавьте строку в инструкции агента. Сама по себе это не защита, но случаев «не так понял» станет меньше (оставьте её на английском — модели понимают её одинаково):
Never call reinstall_vps, reset_password, cancel_service (type=immediate), change_plan,
order_vps, create_sandbox, kill_sandbox or delegate_service unless the human has typed
the target server's hostname in this conversation for that specific action.
Если агент входит по коду из письма, а не держит долгоживущий токен, смотрите вход агента через MCP.
Аудит: что видно потом
- Список токенов (
GET /auth/tokensили Настройки → API-токены для агентов): имя, дата создания, срок,last_used_at. Вот зачем давать токенам имена по агентам. - «История услуги» (кабинет, страница сервера): включения и выключения, переустановки, сбросы пароля, смены тарифа, платежи — с временем и источником: вы, поддержка или автоматически. Какой именно токен или делегат это сделал, она не покажет — только что действие пришло с вашей стороны.
- Счета и баланс: каждое списание и возврат.
list_delegations: у кого есть доступ, к чему и до какого числа.
Этот пробел в «Истории услуги» — честный предел серверного аудита на сегодня. Если нужно знать, какой агент что сделал, логируйте каждый вызов инструмента с аргументами (без секретов) на стороне агента.
Какую схему выбрали бы мы
Для агента, который обслуживает один боевой сервер:
- Отдельный аккаунт для агента с нулевым балансом, сервер делегирован с
expires_days: 90. - Ваш токен владельца остаётся у вас и не лежит ни в одном конфиге агента.
- Бэкапы на этом сервере — делегат может его переустановить.
- Инструменты уровня 3 в клиенте — на «ask» или «deny».
- Токен агента в файле с правами
600, обновляется до истечения срока.
Агенту, которому нужно заказывать серверы или запускать песочницы, делегирования мало — ему нужен баланс. Тогда потолок — баланс: пополняйте его под задачу, давайте токену имя и раз в неделю смотрите last_used_at. Если токен только на чтение изменил бы то, как вы запускаете агентов, напишите нам в поддержку: именно такие отзывы решают, что мы делаем дальше.
Комментарии
Пока нет комментариев. Будьте первым.