Serveur MCP d'infrastructure
Donner des mains à un agent sur de l'infrastructure réelle — et lui poser des garde-fous.
Mon rôle
Serveur écrit seul de bout en bout : les huit clients d'API tierces, les 76 outils exposés au modèle, le moteur de diagnostic, la couche d'approbation humaine, le suivi post-action, la stratégie de cache, le tableau de bord web, la conteneurisation et l'exploitation sur NAS. Aucune ligne ne vient de quelqu'un d'autre, et je le fais tourner en continu chez moi : c'est mon banc d'essai sur la sécurité agentique.

Le problème
Huit services auto-hébergés exposent chacun leur API, et leurs états se contredisent : l'un annonce un échec, l'autre un blocage à l'import, et seul un troisième sait qu'une ressource ne sera jamais retentée. Aucun ne répond seul à la question « est-ce que ça fonctionne vraiment ? ». Brancher un agent IA là-dessus demandait deux choses : une couche de corrélation, et un frein.
Ce que j'ai livré
- Soixante-seize outils typés, exposés en protocole MCP sur un transport HTTP authentifié par jeton.
- Un processus unique servant quatre surfaces sur un seul port : le protocole MCP, un second serveur MCP dédié aux approbations, une API REST et un tableau de bord web.
- Moteur de diagnostic rendant un verdict unique parmi douze états, obtenu en croisant quatre sources, accompagné de ses preuves et des actions possibles.
- Validation humaine des actions sensibles : l'agent demande l'autorisation, la requête est poussée au navigateur en flux serveur, l'utilisateur tranche, avec expiration et sessions isolées par onglet.
- Suivi autonome après action : un état persisté par téléchargement, rediagnostiqué à intervalles croissants, avec corrections appliquées sans demander la permission puisqu'il n'y a plus personne à qui demander.
- Projections qui réduisent les charges utiles avant de les rendre au modèle, sous un contrat borné qui garde le décompte total sans rapatrier la liste.
- Cache mensuel persistant à clé versionnée, préchauffage des douze mois glissants et revalidation sélective — conçu autour d'un quota d'API tierce de mille appels par jour.
- Tableau de bord en JavaScript sans framework : grille d'affiches, fiche détaillée, recherche catalogue, navigation clavier avec piège de focus.
- Dégradation asymétrique : la panne d'un service annexe appauvrit la réponse sans jamais la fausser, mais un outil dédié à ce service lève une erreur explicite.
- Conteneurisation avec sonde de santé et assistant en ligne de commande embarqué, authentifié par abonnement plutôt que par clé facturée.
Les points durs
Corréler des sources qui se contredisent
Le cœur du projet n'est pas l'exposition d'API, c'est la modélisation. Pour répondre honnêtement à « est-ce que ça avance ? », j'ai dû interroger quatre services, comprendre pourquoi aucun ne suffit seul, et rendre un état unique et défendable. J'ai défini douze états typés, chacun avec ses preuves et ses remédiations, et j'ai fait cette corrélation une fois pour toutes plutôt que de la laisser au modèle.
Sécurité agentique : l'humain dans la boucle
Un agent autonome sur de l'infrastructure a besoin d'un frein explicite. Seuls les outils d'une liste sûre s'exécutent directement ; tout le reste déclenche une demande d'approbation poussée en temps réel à l'interface, et l'appel reste suspendu jusqu'au clic ou à l'expiration. C'est le garde-fou qui rend l'automatisation acceptable — et il m'a coûté de comprendre qu'un refus mal formé était silencieusement converti en erreur technique, donc en action bloquée sans que personne le sache.
Un seuil qui échoue sans rien dire
Certains réglages de qualité cherchaient un fichier meilleur que tout ce qu'ils savaient reconnaître — indéfiniment, sans le moindre avertissement. J'ai remplacé la lecture à l'œil par deux inégalités calculées depuis l'API : le seuil visé doit rester atteignable, le seuil d'exclusion doit être strictement supérieur à la pénalité qu'il prétend écarter. Onze réglages sur dix-sept étaient fautifs, dont les deux qui portaient les quatre cinquièmes du parc.
Vérifier une jointure sur tout le corpus, pas sur un exemple
Rapprocher deux catalogues qui ne partagent aucun identifiant se fait par replis successifs — et un repli trop permissif déclarait des épisodes vus à tort. J'en ai tiré une règle : un repli ne relâche qu'une contrainte, il en conserve toujours une discriminante. Et je ne valide plus une jointure sur un échantillon : je compare le compteur agrégé au décompte détaillé sur l'ensemble du corpus, puis j'explique chaque écart restant au lieu de l'arrondir.
Concevoir sous contrainte de quota
Une API tierce limitée à mille appels quotidiens interdit de recalculer naïvement. J'ai découpé le cache au mois, persisté sur volume monté pour survivre aux reconstructions du conteneur, préchauffé en tâche de fond, et je ne revalide que ce qui bouge encore. La clé est versionnée : un mois clos étant mis en cache sans expiration, un changement de format ne l'aurait jamais atteint.
Aperçus
