Un token MCP e parola contului tău, cu un API atașat. Dă-l unui agent și ai un utilizator care nu obosește niciodată, citește fiecare pagină web spre care îl îndrepți și face exact ce spunea ultima instrucțiune din contextul lui. De cele mai multe ori, asta vrei. Pagina de față e despre restul timpului.
Tot ce urmează a fost verificat pe serverul live la data de sus: lista uneltelor vine din tools/list pe https://mcp.eqvps.com/mcp, limitele din API-ul însuși. Dacă ești nou pe server, începe cu conectarea unui client MCP și tokenurile API, apoi revino.
Modelul de amenințare: ce merge de fapt prost
Trei lucruri, în ordinea în care le vedem:
- Agentul înțelege greșit. „Curăță mașina de test” devine reinstalarea serverului greșit. Fără rea-voință, doar un model care umple un gol din instrucțiune.
- Prompt injection. Agentul citește un text pe care nu l-ai scris tu (un README, un răspuns de la suport, o pagină colectată) și acel text îi spune să facă ceva. Dacă agentul are un token cu drepturi depline, le are și instrucțiunea injectată.
- Tokenul se scurge. Ajunge într-un istoric de shell, într-un repo public, într-o configurație MCP dată altora sau într-o linie de log.
Serverul MCP verifică dacă tokenul e valid și dacă serverul aparține acelui cont (sau îi e delegat). Nu știe ce ai vrut să spui. Fiecare guardrail de mai jos lucrează pe o singură întrebare: câtă pagubă e posibilă când instrucțiunea e greșită?
Fiecare unealtă MCP, pe niveluri de risc
Un token de client vede 45 de unelte (serverul MCP 1.6.0). Un token de reseller (rk_…) vede un set separat de 30 de unelte pentru reselleri și niciuna dintre acestea, așa că endpointul are 75 în total. Clientul tău primește din tools/list doar propriul set.
Pagina asta ordonează uneltele după risc. Pentru parametrii fiecărei unelte și exemple de apeluri, vezi referința de parametri; toate uneltele pe câte un rând, inclusiv cele 30 pentru reselleri, sunt în lista completă.
Nu livrăm încă adnotări pentru uneltele MCP (readOnlyHint, destructiveHint), așa că clientul tău nu le poate ordona singur. Folosește nivelurile de mai jos ca să setezi aprobările manual.
Nivelul 0 — publice, fără token (5)
| Unealta | Ce face |
|---|---|
get_started | Tot fluxul într-un singur răspuns: ce unelte să apelezi și în ce ordine |
list_plans | Planuri, prețuri, imagini de OS |
sandbox_pricing | Tarifele sandboxurilor |
register_account | Creează un cont nou și îi returnează tokenul |
login | E-mail + parolă → token |
Nivelul 1 — citirea contului, fără efecte secundare (15)
| Unealta | Ce face | Atenție |
|---|---|---|
whoami | Id-ul contului, numele, e-mailul | |
get_balance | Soldul preplătit | |
list_vps | Serverele active, în pregătire și suspendate | |
get_vps_status | Starea, specificațiile, datele de acces | Cu reveal: true returnează parola root |
get_vps_metrics | CPU, memorie, rețea, disc în timp | |
get_upgrade_options | Planurile pe care le poate schimba serverul pe loc | |
list_delegations | Cui i-ai oferit acces | |
list_delegated_to_me | Serverele pe care alții ți le-au delegat | |
list_tickets | Tichetele tale de suport | |
get_ticket | Un tichet cu firul lui | Textul tichetului e o intrare nesigură pentru agent |
list_sandboxes | Sandboxurile tale | |
get_sandbox | Un sandbox și consumul lui | |
get_task | Rezultatul unei sarcini de fundal | |
download_file | Citește un fișier mic dintr-un sandbox | |
get_download_url | Link de scurtă durată spre un fișier din sandbox | Oricine are linkul poate descărca până expiră |
Nivelul 2 — schimbă starea, nu cheltuie nimic (17)
| Unealta | Ce face | Atenție |
|---|---|---|
power_vps | pornire / oprire / repornire | O oprire e o oprire: serviciile cad |
set_hostname | Redenumește serverul | Schimbă valoarea cu care e comparat confirm |
undo_cancel | Elimină o anulare programată la sfârșitul perioadei | |
refresh_token | Token nou, cel vechi revocat imediat | Actualizează apoi orice configurație statică |
set_password | Setează parola contului dacă nu există una | Cine are tokenul o poate seta primul |
topup_balance | Creează o factură de alimentare + un link de checkout cripto | Plata ei cere un portofel |
pay_invoice | Link de checkout pentru o factură neplătită | La fel |
accept_delegation | Acceptă o invitație | |
revoke_delegation | Încheie o delegare | |
create_ticket / reply_ticket / close_ticket | Tichete de suport | Agentul scrie suportului în numele tău |
run_code / exec_command | Rulează cod într-un sandbox | Doar în sandbox, nu pe VPS-ul tău |
kill_task | Oprește o sarcină de fundal din sandbox | |
upload_file / get_upload_url | Pune un fișier într-un sandbox |
Nivelul 3 — cheltuie bani, distruge date sau oferă acces (8)
| Unealta | Ce face | Verificarea pe server |
|---|---|---|
order_vps | Comandă un server, plătit din sold | Sold insuficient → factură neplătită, nu se taxează nimic |
change_plan | Schimbare de plan pe loc, diferența taxată din sold | confirm: true; sold insuficient → 402 |
create_sandbox | Pornește un sandbox facturat | Sold gol → 402 |
reinstall_vps | Șterge discul și instalează un OS nou | confirm = numele de host exact sau DELETE; 4 apeluri/min |
reset_password | Parolă root nouă, cea veche nu mai merge | confirm = numele de host sau DELETE; 6 apeluri/min |
cancel_service | end_of_period (implicit, reversibil) sau immediate (distruge serverul acum) | immediate cere confirm = numele de host |
kill_sandbox | Șterge un sandbox și fișierele lui | niciuna |
delegate_service | Îi oferă altei persoane acces de operator la un server | Doar proprietarul; persoana trebuie să accepte |
Jurnalul schimbărilor setului de unelte
| Data | Versiunea serverului | Schimbare | Impactul asupra riscului |
|---|---|---|---|
| 2026-10-03 | 1.6.0 | adăugat refresh_token; tokenurile trăiesc implicit 1 an | Nivelul 2 |
| 2026-10-03 | 1.5.0 | undo_cancel, get_upgrade_options, change_plan | change_plan cheltuie din sold → nivelul 3 |
| 2026-10-03 | 1.1.0 | 13 unelte pentru sandboxuri | create_sandbox cheltuie, kill_sandbox distruge → nivelul 3 |
Versiunea care rulează e publică: curl -s https://mcp.eqvps.com/healthz. Când se schimbă, se schimbă și tabelul.
Soldul e plafonul de cheltuieli
EQVPS e preplătit. Nu există card salvat, linie de credit sau descoperit de cont, așa că maximul pe care îl poate cheltui vreodată un agent e cât stă în sold. Trei unelte cheltuie: order_vps, change_plan și create_sandbox. Reînnoirile serverelor existente ies din același sold.
Agentul poate crea cereri de bani, dar nu le poate plăti. topup_balance și pay_invoice returnează un link de checkout cripto, iar un link nu face nimic fără un portofel în spate. Nu există nici endpoint de retragere: banii din sold pot cumpăra servicii în contul tău și nu pot fi trimiși în afară. Și banii pentru timpul nefolosit, la o anulare imediată, se întorc tot în sold.
O precizare, și e una reală. Dacă ții soldul foarte mic ca să limitezi agentul, propriile reînnoiri încep să eșueze și serverele intră în perioada de grație. Regula noastră practică: un ciclu de reînnoire pentru ce rulezi deja, plus bugetul sarcinii curente a agentului. Ghidul bugetului pentru agenți arată cum îl dimensionezi. Iar dacă îi dai agentului propriul portofel alimentat, acel portofel devine un al doilea plafon la care trebuie să fii atent.
Privilegiul minim: nu există (încă) token doar de citire
Răspunsul direct: fiecare token de client are aceleași drepturi ca, în panou, contul. Numele și durata de viață ale tokenurilor se pot configura; domeniile de acces, nu.
Cel mai îngust lucru disponibil azi e delegarea. Îi dai agentului propriul cont, cu sold zero, și îi delegi un server:
delegate_service { "service_id": "EQ-XXXX", "email": "agent@yourdomain.com", "expires_days": 30 }
Același lucru prin 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}'
Invitația trebuie acceptată fiind autentificat cu acel e-mail (accept_delegation), iar expires_days poate fi între 1 și 365. Pas cu pas, cu capturi de ecran: delegarea accesului și accesul în documentație.
| Un cont delegat poate | Un cont delegat nu poate |
|---|---|
| Să vadă starea, metricile și istoricul acelui server | Să vadă celelalte servere, soldul sau facturile tale |
| Să pornească, să oprească, să repornească | Să anuleze, să reînnoiască sau să schimbe planul |
| Să seteze numele de host și reverse DNS | Să cumpere add-on-uri sau IP-uri |
| Să reseteze parola root | Să deschidă consola web |
| Să reinstaleze OS-ul | Să delege serverul altcuiva |
Observă ultimele două rânduri din stânga. Un delegat nu-ți poate cheltui banii, dar poate șterge acel server. Pornește backup-urile pe orice server pe care un agent îl poate reinstala.
Igiena tokenurilor
Un token pentru fiecare agent, cu un nume. Creează-l în Panou → Setări → Tokenuri API pentru agenți sau:
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}'
Tokenul e afișat o singură dată. Durata de viață e între 1 și 1825 de zile, 365 dacă nu o setezi. Pentru agenți am alege 90.
Ține-l într-un fișier pe care doar tu îl poți citi, nu în repo, nu în prompt, nu într-o variabilă de shell pe care o lipești peste tot:
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 # expect -rw-------
Apoi încarcă-l în serviciul agentului cu EnvironmentFile= (systemd) sau set -a; . ~/.config/eqvps/agent.env; set +a.
Rotește-l înainte să expire. Unealta refresh_token sau POST /auth/tokens/{id}/refresh emite un token nou cu același nume și îl revocă imediat pe cel vechi. Dacă clientul tău MCP are tokenul scris direct în configurație, actualizează-l imediat după, altfel următoarea sesiune primește 401.
Verifică cine folosește ce: GET /auth/tokens listează fiecare token cu numele, expirarea și last_used_at. Un token pe care nu-l recunoști sau unul folosit după ce ai oprit agentul e semnalul tău.
Dacă se scurge un token
În ordinea asta:
- Revocă-l. Panou → Setări → Tokenuri API pentru agenți → Revocă sau
curl -s -X DELETE -H "Authorization: Bearer $EQVPS_TOKEN" https://api.eqvps.com/api/v1/eqvps/auth/tokens/<id>. Nu mai merge de la următoarea cerere. - Caută tokenuri noi pe care nu le-ai creat și revocă-le și pe ele.
- Verifică suprafața pagubei: Istoricul serviciului fiecărui server, facturile și soldul și
list_delegationspentru acces pe care nu l-ai oferit. - Schimbă parolele root pe fiecare server pe care îl putea vedea tokenul.
get_vps_statuscureveal: truedă parola root, așa că un token scurs e o parolă root scursă. Verifică și~/.ssh/authorized_keyscât ești acolo. - Închide ușa parolei. Dacă contul tău n-a avut niciodată o parolă, cine avea tokenul putea seta una cu
set_password. Autentifică-te cu un cod pe e-mail și schimb-o.
Prevenția pentru pasul 5 e ieftină: setează-ți chiar acum o parolă de cont, iar set_password va returna 409 pentru oricine după tine.
Omul în buclă
Ce impune serverul:
reinstall_vps,reset_passwordșicancel_servicecutype: immediatecerconfirmegal cu numele de host exact (DELETEmerge și pentru reinstalare și resetare).change_plancereconfirm: true.- Anularea implicită e
end_of_period: serverul rulează până la sfârșitul perioadei plătite, iarundo_cancelo întoarce. - Limite de rată pe cont: reinstalare 4/min, resetarea parolei 6/min, pornire/oprire 20/min, comenzi 20/min. Destul cât să oprească o buclă să facă asta de cincizeci de ori, nu destul cât să oprească un singur apel greșit.
Fii lămurit ce e confirm. Oprește un agent să acționeze pe „curăță tot”. Nu oprește un atacator, pentru că numele de host e la un apel get_vps_status distanță. Pasul real de aprobare stă în clientul tău MCP. Majoritatea clienților pot întreba înaintea fiecărui apel de unealtă; lasă nivelurile 0 și 1 să ruleze liber și pune nivelul 3 să întrebe mereu. În clienții cu permisiuni pe unealtă, cum e settings.json din Claude Code (serverul înregistrat ca 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"]
}
}
Adaugă și un rând în instrucțiunile agentului. Nu e un control de securitate în sine, dar taie cazurile de neînțelegere:
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.
Dacă agentul se autentifică printr-un cod pe e-mail în loc să țină un token de lungă durată, vezi autentificarea agentului prin MCP.
Auditul: ce poți vedea după aceea
- Lista tokenurilor (
GET /auth/tokenssau Setări → Tokenuri API pentru agenți): nume, creare, expirare,last_used_at. De aceea contează să dai câte un nume tokenului fiecărui agent. - Istoricul serviciului (panou, pagina serverului): porniri, opriri și reporniri, reinstalări, resetări de parolă, schimbări de plan, plăți, fiecare cu ora și cu autorul: tu, suportul sau automat. Nu-ți spune ce token sau delegat a acționat, doar că a venit din partea ta.
- Facturile și soldul: fiecare taxare și fiecare sumă întoarsă în sold.
list_delegations: cine are acces la ce și până când.
Golul din Istoricul serviciului e limita cinstită a auditului pe server, azi. Dacă trebuie să știi ce agent a făcut ce, loghează pe partea agentului fiecare apel de unealtă, cu argumentele lui (fără secrete).
Configurarea pe care am folosi-o noi
Pentru un agent care administrează un server de producție:
- Un cont separat pentru agent, cu sold zero, cu serverul delegat cu
expires_days: 90. - Tokenul tău de proprietar rămâne la tine, în nicio configurație de agent.
- Backup-uri pe acel server, pentru că un delegat poate reinstala.
- Uneltele de nivelul 3 pe „ask” sau „deny” în client.
- Tokenul agentului într-un fișier
600, reîmprospătat înainte să expire.
Pentru un agent care trebuie să comande servere sau să ruleze sandboxuri, delegarea nu ajunge, pentru că are nevoie de sold. Acolo soldul e plafonul tău: alimentează-l pentru fiecare sarcină, dă un nume tokenului și citește last_used_at o dată pe săptămână. Dacă un token doar de citire ți-ar schimba felul în care pui agenții în producție, spune-ne la suport: genul ăsta de feedback decide ce construim mai departe.
Comentarii
Încă nu există comentarii. Fii primul.