Certaines tâches méritent une machine propre : une suite de tests qui veut root et Docker, une compilation qui immobilise le portable une heure, du code qu'on préfère ne pas lancer chez soi. Un agent IA peut s'en charger seul, à condition de pouvoir louer la machine, s'en servir et la rendre. C'est le rôle du serveur MCP de FFxF.
Cette démo est une exécution réelle, faite le 28 septembre 2026 avec Claude Code : l'agent a commandé une Nano, l'a reçue en 42 secondes, y a travaillé en SSH, l'a détruite en 10 secondes, et le tout a coûté 0,018 CAD. Ci-dessous, chacun de ses appels, avec ce que le serveur a répondu.
1. Connecter l'agent
Le serveur est à l'adresse https://ffxf.net/mcp. Il relaie chaque appel
à l'API FFxF avec votre clé API et ne stocke rien. Créez une clé dans la console,
Compte → Clés d'API, avec seulement les périmètres dont l'agent a
besoin : pour cette démo vms.read, vms.create,
vms.action, vms.destroy, sshkeys.write et
billing.read. Placez-la ensuite dans l'environnement plutôt que dans la
conversation.
export FFXF_API_KEY="ffxf_live_…"
claude mcp add --scope user --transport http ffxf https://ffxf.net/mcp \
--header "Authorization: Bearer $FFXF_API_KEY"
claude mcp list
# ffxf: https://ffxf.net/mcp (HTTP) - ✔ Connected
Codex, Cursor et les autres clients ont leur propre commande, et il existe un chemin plus court : donnez à l'agent la phrase ci-dessous, il suit les consignes écrites pour lui dans agents.md.
Installe le serveur MCP de FFxF en suivant https://ffxf.net/agents.md. Ma clé API est dans la variable d'environnement FFXF_API_KEY.
2. La demande
L'agent reçoit une demande simple : lancer les tests du projet sur une machine neuve, puis la détruire. Le serveur lui rappelle lui-même les règles à chaque connexion : estimer avant de commander, montrer le prix, suivre l'action, demander avant d'effacer un disque.
3. Ce que fait l'agent, appel par appel
D'abord get_account, pour savoir ce qu'il peut dépenser. La réponse
donne le solde, la consommation horaire des machines déjà en marche et le budget
mensuel.
{ "credit": { "balance": "94.46" },
"hourly": { "burn_rate": "0.134", "active_machines": 2 },
"quota": { "limit": 5, "used": 3, "remaining": 2 } }
Puis add_ssh_key avec la clé publique locale, pour se connecter sans mot
de passe, et estimate_vm. L'estimation fait toutes les vérifications
d'une vraie commande (quota, stock, crédit, budget) et la chiffre, sans rien créer.
estimate_vm { "plan": "nano", "region": "montreal", "image": "coding-agent",
"hostname": "mcp-e2e-01", "billing": "hourly", "ssh_keys": ["9"] }
{ "would_succeed": true, "hourly_rate": "0.018", "currency": "CAD",
"required_credit": "0.44",
"checks": [
{ "name": "quota", "status": "pass" },
{ "name": "stock", "status": "pass" },
{ "name": "credit", "status": "pass" },
{ "name": "budget", "status": "pass" } ] }
L'image est coding-agent : une Ubuntu avec Docker, git et GitHub CLI,
Node.js, Python et uv, Claude Code et Codex CLI. Les 0,44 CAD ne sont pas dépensés :
une commande à l'heure n'est acceptée que si le solde couvre les 24 premières heures.
Après avoir montré le prix, l'agent commande.
create_vm { …même commande…, "password_delivery": "none" }
{ "vm": { "id": 105, "hostname": "mcp-e2e-01", "status": "provisioning" },
"action": { "id": 16, "type": "create", "status": "queued" } }
La création tourne en arrière-plan. L'agent interroge get_action
jusqu'à ce que l'action quitte running, puis lit la machine avec
get_vm.
+1s action 16 : running
+42s action 16 : completed
get_vm 105 : running · 1 vCPU · 2048 Mo · 20 Go · IPv4 23.159.52.x · IPv6 2602:f3a4:0:100::1b
Le disque a été agrandi aux 20 Go de l'offre au passage. L'agent se connecte et fait
le travail : cloner le dépôt dans ~/work, lancer les tests, pousser la
branche ou rapatrier les résultats.
ssh ubuntu@23.159.52.x
claude --version # 2.1.283 (Claude Code)
docker run --rm hello-world | head -2
df -h / # 19G, 3.5G utilisés
cd ~/work && git clone https://github.com/… && …
Une fois la tâche finie, destroy_vm, avec le nom d'hôte exact de la
machine en confirmation, puis get_action une dernière fois.
destroy_vm { "vm": 105, "confirm_hostname": "mcp-e2e-01" }
+0s action 17 (delete) : running
+10s action 17 (delete) : completed
get_vm 105 : deleted
4. Les limites qui ont tenu
Un agent peut se tromper de machine. Les règles vivent dans l'API, pas dans sa bonne conduite, et le serveur MCP ajoute sa propre vérification sur les deux appels qui effacent un disque. Quand on lui demande de réinstaller une autre machine avec le mauvais nom, il refuse avant même d'appeler l'API :
reinstall_vm { "vm": 102, "image": "debian-13", "confirm_hostname": "PAS-BENCH" }
{ "error": { "status": 400, "code": "confirmation_mismatch",
"message": "confirm_hostname must be \"BENCH\"." } }
- Périmètres : sans
vms.destroy, la clé ne peut rien supprimer ; sansvms.create, elle ne peut rien commander. - Crédit prépayé : le solde ne passe jamais sous zéro, et les 24 premières heures doivent être couvertes.
- Budget mensuel, réglé dans la console : les machines s'arrêtent au-delà de 120 %.
- Relances : une commande répétée après une coupure retrouve la première réponse, pas une seconde machine.
- Quota : cinq machines par compte par défaut.
5. Ce que ça a coûté
GET /v1/usage tient le relevé heure par heure. Pour cette exécution,
une ligne : une heure entamée, au tarif de la Nano.
{ "hostname": "mcp-e2e-01", "hours": 1, "rate": "0.018", "amount": "0.018", "currency": "CAD" }
Toute heure entamée est due : une machine gardée deux minutes coûte autant qu'une machine gardée cinquante-neuf. Pour un agent qui rend sa machine dès la tâche finie, c'est toute la facture.
6. En faire une habitude
Pour que l'agent le fasse sans qu'on le lui redise, ajoutez quelques lignes au
AGENTS.md ou au CLAUDE.md du projet : quand une tâche
demande une vraie machine, en louer une, montrer le prix, rester sous un plafond, la
détruire ensuite. Le bloc prêt à coller est dans
Mode distant.
- Clé limitée aux périmètres utiles, rangée dans
FFXF_API_KEY. - Budget mensuel réglé dans la console.
estimate_vmavant chaquecreate_vm, prix affiché.- Image
coding-agent, facturation à l'heure, clé SSH, sans mot de passe. destroy_vmdès la tâche finie, puisget_accountpour vérifier que rien ne tourne encore.
Les vingt outils et leurs périmètres sont listés dans Outils MCP, et l'installation client par client dans Connecter un agent IA.