{"slug": "laisser-un-agent-deployer-le-mcp-de-zerolith-dans-claude-code", "title": "Laisser un agent déployer : le MCP de Zerolith dans Claude Code", "summary": "Zerolith has released a Model Context Protocol (MCP) server that integrates with Claude Code, enabling AI agents to deploy, call, and debug serverless functions directly from the conversation. The MCP exposes 41 tools, uses OAuth 2.1 with PKCE and resource-bound tokens, and requires no API keys. Setup is a single command: 'claude mcp add --transport http zerolith https://zerolith.io/mcp'.", "body_md": "# Laisser un agent déployer : le MCP de Zerolith dans Claude Code\n\nUn assistant écrit le handler, puis c'est vous qui copiez, collez et relancez. Le MCP supprime cet aller-retour : une commande pour connecter Claude Code, un OAuth sans clé d'API, et un agent qui referme la boucle déployer–appeler–lire les logs–corriger. Avec ce qu'il ne verra jamais, et ce que ça coûte.\n\nUn assistant écrit très bien un handler Python. Il sait aussi vous dire quelle commande `curl`\n\nlancer pour le déployer. Entre les deux, il y a vous : vous copiez le code dans un fichier, vous\ncollez la commande, vous récupérez l'URL, vous la lui rendez, il lit l'erreur, il corrige, et vous\nrecommencez. Le modèle réfléchit, et vous faites les mains.\n\nLe Model Context Protocol supprime cet aller-retour. C'est un standard par lequel un assistant découvre des outils et les appelle lui-même. Zerolith en expose un : quarante et un outils, tous bornés à votre compte, et le déploiement devient une phrase dans la conversation plutôt qu'une suite de commandes recopiées.\n\nVoici comment on le branche à Claude Code, ce que ça donne vraiment une fois en place, et les quelques choses qui valent d'être sues avant de laisser un agent appuyer sur les boutons.\n\n## Une commande pour se connecter\n\nLe serveur est distant : il tourne chez nous, en HTTP. Il n'y a donc rien à installer, aucun processus local, aucun binaire à maintenir à jour.\n\n```\nclaude mcp add --transport http zerolith https://zerolith.io/mcp\n```\n\nOuvrez ensuite Claude Code et tapez `/mcp`\n\n: le serveur apparaît, vous choisissez de vous\nauthentifier, votre navigateur s'ouvre sur la page d'autorisation Zerolith. Vous vous connectez,\nvous validez, et les outils sont là.\n\nCe qui n'apparaît nulle part dans cette procédure : une clé d'API. Le flux est un OAuth 2.1 complet, et il vaut la peine de dire pourquoi, parce que c'est exactement ce qui manque à la plupart des intégrations « collez votre clé ici » :\n\n**L'agent s'enregistre lui-même**(RFC 7591). Vous n'avez aucun identifiant applicatif à créer, à copier ni à ranger quelque part.** PKCE en S256, obligatoire.**Un code d'autorisation intercepté ne sert à rien sans le vérificateur, qui ne quitte jamais votre poste.** Le jeton est lié à sa ressource**(RFC 8707). Un jeton émis pour Zerolith ne vaut rien ailleurs, et un jeton émis pour un autre service ne vaut rien ici.** Le jeton d'accès vit une heure**, le jeton de rafraîchissement quatorze jours, et chaque renouvellement invalide le précédent. Un jeton dérobé puis rejoué se signale de lui-même.\n\nAucun secret longue durée ne traîne dans un fichier de configuration. Sur un poste de travail, ce n'est pas un détail : un fichier de config finit toujours par être sauvegardé, synchronisé ou partagé par accident.\n\n## La première question à poser à l'agent\n\nAvant de lui demander de déployer quoi que ce soit, demandez-lui ce qu'il voit. Deux outils en lecture répondent, et ce sont ceux qui cadrent toute la suite.\n\n`whoami`\n\nrenvoie le compte et le solde. `get_catalog`\n\nrenvoie les langages disponibles, les gabarits\net les tarifs — voici la réponse réelle du serveur de production, abrégée :\n\n```\n{\"languages\": [{\"name\": \"python\",    \"code_filename\": \"main.py\", \"default_handler\": \"main.handler\"},\n               {\"name\": \"python313\", \"code_filename\": \"main.py\", \"default_handler\": \"main.handler\"},\n               {\"name\": \"python314\", \"code_filename\": \"main.py\", \"default_handler\": \"main.handler\"},\n               {\"name\": \"nodejs20\",  \"code_filename\": \"main.js\", \"default_handler\": \"main.handler\"},\n               {\"name\": \"nodejs22\",  \"code_filename\": \"main.js\", \"default_handler\": \"main.handler\"},\n               {\"name\": \"nodejs24\",  \"code_filename\": \"main.js\", \"default_handler\": \"main.handler\"}],\n \"sizes\": [{\"name\": \"small\",  \"memory\": \"128Mi\", \"cpu\": \"100m\"},\n           {\"name\": \"medium\", \"memory\": \"256Mi\", \"cpu\": \"250m\"}, \"…\"],\n \"defaults\": {\"language\": \"python\", \"size\": \"small\", \"min_scale\": 0, \"max_scale\": 2,\n              \"stable_window\": \"60s\", \"timeout_seconds\": 120},\n \"pricing\": {\"price_per_gb_second\": 0.000004, \"price_per_vcpu_second\": 0.0000125,\n             \"price_per_invocation\": 0.0000004}}\n```\n\nCe n'est pas une politesse d'introduction, c'est la parade au défaut le plus fréquent d'un agent :\nil déduit de sa mémoire ce que la plateforme accepte. Un modèle a lu des milliers de fichiers\n`serverless.yml`\n\net vous proposera volontiers un runtime `python3.11`\n\n, un gabarit `xlarge`\n\nou une\noption qui n'existe pas ici.\n\nLe catalogue est la source de vérité, et il bouge. Notez les identifiants : `python`\n\nest 3.12 et le\nreste, parce qu'une révision Knative est immuable et que repointer `python`\n\ndéplacerait du code\ntiers sur un interpréteur qu'il n'a jamais choisi — 3.13 a supprimé une douzaine de modules de la\nbibliothèque standard, c'est une rupture réelle. Les versions récentes sont donc des identifiants à\npart, `python313`\n\net `python314`\n\n, qu'on choisit. Et un langage dont l'image n'est pas déployée en\nproduction n'est pas annoncé du tout, plutôt que d'être offert puis refusé au déploiement : la\nliste ci-dessus est celle de ce qui tourne aujourd'hui, pas celle de ce que le code sait faire.\n\n## La boucle qui change vraiment quelque chose\n\nLe déploiement n'est pas le sujet. Ce qui compte, c'est que l'agent puisse **refermer la boucle**\ntout seul : déployer, appeler, lire ce qui s'est passé, corriger, redéployer.\n\nUne demande en langage naturel suffit :\n\n```\n> Déploie une fonction Python \"taux\" qui renvoie le taux EUR/USD du jour\n  depuis l'API de la BCE, en JSON. Rends-la publique, appelle-la, et\n  montre-moi la réponse.\n```\n\nCe que l'agent enchaîne derrière, outil par outil :\n\n`get_catalog`\n\n— quel langage, quel gabarit, quels défauts.`deploy_function`\n\n— le code, le nom,`public: true`\n\n. Réponse : l'identifiant et l'URL.`invoke_function`\n\n— un appel réel, qui réveille un pod et renvoie le statut HTTP et le corps.`get_function_logs`\n\n— si le statut est 500, la trace Python est là.`update_function`\n\n— le correctif, qui produit une nouvelle révision.`invoke_function`\n\n— de nouveau, pour vérifier.\n\nLes étapes 3 à 6 sont l'intérêt de la manœuvre. Un assistant sans MCP s'arrête à l'étape 2 et vous\nrend un bloc de code en espérant qu'il marche ; ici il constate l'échec, lit la trace et corrige,\nsans que vous ayez ouvert un terminal. Sur une erreur bête — un champ JSON mal nommé, un décodage\nde date, un `timeout`\n\ntrop court — la boucle se referme en une minute.\n\nEt le reste du périmètre suit le même chemin. Les variables d'environnement, les URL signées, les\ndomaines sur mesure, les bases privées : dix-neuf des quarante et un outils concernent la\n[base de données privée](/base-de-donnees), assez pour qu'un agent la crée, y pose un schéma par une\nfonction migratrice, l'attache à votre API et déclenche un export — la marche complète, décrite à\nla main, est dans [l'article précédent](/blog/api-base-de-donnees).\n\n## Ce que l'agent ne voit jamais\n\nC'est la question qu'il faut se poser avant de brancher quoi que ce soit sur un compte : jusqu'où va\nla délégation. Ici, elle porte sur les **actions**, pas sur les secrets.\n\n**Vos clés d'API restent invisibles.** Elles sont stockées hachées et ne s'affichent qu'une fois, à leur création, dans l'interface. Aucun outil MCP ne les renvoie, et l'agent n'en a pas besoin : il s'authentifie avec son propre jeton.**Une variable d'environnement de type** L'agent peut la créer, la remplacer, la supprimer — pas en lire la valeur. Vous non plus, d'ailleurs : la valeur n'existe que dans l'objet du cluster, et le backend n'a pas le droit de lecture dessus.`secret`\n\nne se relit pas.**Le jeton de votre base de données ne sort pas.** L'agent peut créer la base, l'attacher à une fonction et lancer une migration sans jamais recevoir l'identifiant qui l'ouvre. La fonction, elle, le trouve dans son environnement.**Une ressource qui ne vous appartient pas répond « introuvable »**, jamais « interdit ». L'agent n'apprend même pas qu'elle existe.\n\nIl y a deux portées, et pas davantage : `mcp:read`\n\npour consulter, `mcp:write`\n\npour agir. Chaque\noutil déclare aussi s'il modifie l'état et s'il est destructeur, ce qui permet à Claude Code de vous\ndemander confirmation avant un `delete_function`\n\ntout en laissant passer un `list_functions`\n\n. Le\nserveur tourne d'ailleurs sur exactement le même code que l'API REST et l'interface web : il n'existe\npas de chemin privilégié réservé aux agents, donc un outil MCP ne peut jamais faire ce que votre\ncompte ne peut pas faire lui-même.\n\n## Ce que ça coûte\n\nLe MCP n'est pas facturé. Lister vos fonctions, lire vos métriques, créer une variable, déclencher un export : ce sont des appels d'administration, ils passent par la même API que l'interface web et ne coûtent rien.\n\nCe qui est facturé, c'est l'exécution — à l'identique, qu'elle vienne d'un agent, d'un `curl`\n\nou\nd'un navigateur. Aux tarifs publics, un pod `small`\n\ncoûte **0,00000175 €/s** (0,125 Gio à\n0,000004 €/Gio-seconde, plus 0,1 vCPU à 0,0000125 €/vCPU-seconde) et chaque invocation\n**0,0000004 €**.\n\nUne séance de mise au point typique — un déploiement, une vingtaine d'appels étalés sur un quart\nd'heure, le pod restant éveillé quelques minutes en tout — se chiffre donc **en fractions de\ncentime**. Le facteur qui compte n'est pas le nombre d'appels de l'agent, c'est le temps pendant\nlequel un pod reste debout : après le dernier appel, l'autoscaler observe sa fenêtre de stabilité\n(60 s par défaut) puis laisse un délai de grâce. Vingt appels dans la même minute coûtent moins\nqu'un appel toutes les cinq minutes.\n\nEt si le crédit s'épuise, un agent qui boucle ne creuse pas un trou : l'appel est refusé **en\nbordure**, avant même que le pod ne démarre. C'est la même garantie que pour le reste de la\nplateforme, elle ne s'assouplit pas parce qu'un agent est au clavier. Le détail est sur\n[la page tarifs](/pricing).\n\n## Trois choses apprises en s'en servant\n\n**Faites-lui lire avant d'écrire.** `update_function`\n\nremplace le code, il ne le fusionne pas. Un\nagent qui n'a pas rappelé `get_function`\n\nrécrit le handler de mémoire, et efface au passage la\ncorrection que vous aviez faite à la main dans l'interface il y a deux jours. La description de\nl'outil le dit d'ailleurs explicitement — encore faut-il que la demande ne l'invite pas à aller\nplus vite.\n\n**La plateforme ne garde pas d'historique de votre code.** Elle garde le code courant, lisible par\n`get_function`\n\n, et son empreinte. Pas la version d'avant. Une conversation n'est pas un dépôt :\nce que l'agent déploie doit finir dans votre `git`\n\n, sinon la seule copie de votre handler est celle\nqui tourne.\n\n**Un compte non vérifié ne peut rien écrire.** L'agent reçoit un refus propre et poli, qu'il vous\nrapportera comme une erreur mystérieuse ; il s'agit simplement de l'email d'inscription à valider.\nMême chose pour une invocation refusée en 402 : ce n'est pas une panne, c'est le solde.\n\n## Couper l'accès\n\nLa révocation se fait depuis la page MCP de votre tableau de bord, et elle invalide **immédiatement\nle jeton d'accès déjà émis**, pas seulement son renouvellement. La nuance a l'air théorique et ne\nl'est pas : sans elle, un agent garderait la main jusqu'à l'expiration de son jeton — jusqu'à une\nheure — pendant que l'interface afficherait « déconnecté ». Réinitialiser votre mot de passe coupe\nlui aussi tout accès MCP en cours, en plus de vos sessions web.\n\n## Ce que ça ne remplace pas\n\nTrois limites, honnêtement :\n\n**Ce n'est pas un accès administrateur.** L'agent a exactement votre périmètre, ni plus, ni moins. Si vous attendiez qu'il règle un problème que vous ne pouvez pas régler vous-même, non.**Ce n'est pas une revue de code.** Un handler déployé par un agent est du code en production. Il mérite le même œil que le vôtre, surtout s'il est public et qu'il manipule ce qui arrive dans la requête.**Quarante et un outils, c'est du contexte.** Sur une conversation déjà longue, mieux vaut un client qui ne charge le détail d'un outil qu'au moment de s'en servir. Claude Code le fait.\n\nLe reste tient en une phrase : la partie fastidieuse du déploiement — copier, coller, relancer, relire les logs — n'a jamais eu besoin d'un humain. Elle avait besoin d'une interface qu'une machine puisse appeler.\n\nLa référence complète du serveur, avec le tableau des outils et leurs portées, est sur\n[la page MCP](/mcp-server) ; le tutoriel pas à pas, en quatre étapes, sur\n[la page Claude Code](/claude-code). Et si vous préférez tout faire à la main, la\n[documentation](/docs#mcp) décrit la même chose côté API.\n\n## Essayez sur votre propre compte\n\nL'inscription vient avec du crédit, de quoi déployer, planifier et mesurer tout ce qui précède sans sortir de carte bancaire.\n\n[Commencer »](/register)", "url": "https://wpnews.pro/news/laisser-un-agent-deployer-le-mcp-de-zerolith-dans-claude-code", "canonical_source": "https://zerolith.io/blog/mcp-claude-code", "published_at": "2026-08-19 00:00:00+00:00", "updated_at": "2026-08-27 19:19:32.324231+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "developer-tools", "ai-infrastructure"], "entities": ["Zerolith", "Claude Code", "Model Context Protocol"], "alternates": {"html": "https://wpnews.pro/news/laisser-un-agent-deployer-le-mcp-de-zerolith-dans-claude-code", "markdown": "https://wpnews.pro/news/laisser-un-agent-deployer-le-mcp-de-zerolith-dans-claude-code.md", "text": "https://wpnews.pro/news/laisser-un-agent-deployer-le-mcp-de-zerolith-dans-claude-code.txt", "jsonld": "https://wpnews.pro/news/laisser-un-agent-deployer-le-mcp-de-zerolith-dans-claude-code.jsonld"}}