Hello mesdames zé messieurs ! J’espère que tout le monde va bien chez vous. Aujourd’hui, un Article assez nouveau pour moi, mais un article dont vous pouvez régulièrement lire des équivalents chez d’autres blogueurs technophiles comme moi : mes premiers pas avec les MCP, dans leur installation technique autant que dans leur réelle utilités au quotidien.

Depuis quelques mois, impossible d’ouvrir un fil d’actu sans tomber sur trois acronymes : LLM, agents et agentique ainsi que forcément les MCP. Pour les deux premiers, je pense que vous commencez à connaitre ^^. Le troisième est plus « nébuleux » en général, si vous n’êtes pas un taré comme moi.

Le fait est que la gestion des MCP avec des IA qu’elle soient locales ou cloud, m’a donné un peu de fil à retordre. Du coup, aujourd’hui, je vais vous montrer, via un exemple très concret que ce n’est pas si compliqué que cela.

Mais dis moi Jammy : comment piloter mon Gitea (celui de mon vLab) en langage naturel depuis Claude Desktop. Pas besoin d’être développeur pour suivre, rassurez-vous, mais un peu d’admin-sys peut aider, comme d’habitude ^^

MCP, un connecteur universel pour l’IA Générative

Un modèle de langage, tout seul, ne sait faire qu’une chose : produire du texte (je pense que je ne vous apprends rien en vous disant cela). Il ne voit ni vos dépôts, ni vos serveurs, ni vos fichiers ni encore moins votre environnement de production. Pour qu’il agisse sur « le monde réel », il faut lui prêter des « mains » pour agir. Jusqu’ici, chaque éditeur bricolait ses propres connecteurs : un plugin par outil, par application, par modèle. Un joyeux bordel, en somme.

MCP (Model Context Protocol), proposé fin 2024 par Anthropic et ensuite adopté largement depuis pour devenir une sorte de standard de fait, est un protocole ouvert qui standardise les conversations entre LLM et monde extérieur. L’image qu’on utilise souvent est celle de l’USB-C : une seule prise, des milliers d’appareils. Concrètement, il y a trois acteurs : l’hôte (ici Claude Desktop, qui embarque l’interface avec le modèle Cloud et un client MCP), le serveur MCP (un petit programme qui connaît un outil précis, ici Gitea) et le service final (votre instance Gitea). Le serveur MCP annonce au modèle la liste de ses outils et fonctions disponibles (lister les dépôts, lire un fichier, créer une PR etc.), le modèle décide d’en appeler un avec des paramètres éventuels, et le serveur l’exécute pour lui. Le modèle ne touche jamais Gitea directement : il demande, le serveur exécute.

Le serveur MCP de Gitea

Gitea fournit un serveur MCP officiel, gitea-mcp, écrit en Go. Il existe en binaire, en image Docker, ou à compiler soi-même. De mon côté, j’ai fait au plus simple sur mon mac via un brew install gitea-mcp-server.

Pas de service à lancer, pas de port à ouvrir : Claude Desktop démarrera lui-même ce binaire quand il en aura besoin. Un petit gitea-mcp --help permet de vérifier qu’il répond et de découvrir les options :

… transport (stdio ou http), URL de l’instance, mode lecture seule etc. Plein de choses !

Maintenant il nous faut un jeton d’accès (et un peu de paranoïa)

Le serveur MCP a besoin de se faire passer pour vous auprès de Gitea (ou d’une user spécifique, c’est le mieux d’ailleurs). Cela passe par un jeton d’accès personnel : dans Gitea, Paramètres → Applications → Générer un nouveau jeton :

Premier réflexe à avoir : ne cocher que les droits nécessaires (comme toujours, en fait). Si vous voulez juste lire vos dépôts et vos tickets, inutile de donner l’écriture sur tout. Deuxième réflexe : ne pas coller ce jeton dans la conversation avec l’IA bien évidemment, ni dans un fichier synchronisé. Je le range dans un fichier à part (en chmod 600) que le serveur lit au démarrage, via la variable GITEA_ACCESS_TOKEN_FILE. C’est un peu plus de travail qu’une variable d’environnement en clair dans la config, mais c’est le genre d’habitude qu’on est très content d’avoir prise le jour où l’on partage un écran par exemple 🙂

Déclarer le serveur dans Claude Desktop

Tout se passe dans un fichier JSON, claude_desktop_config.json.

On y déclare un bloc MCP Servers : un nom, la commande à lancer, ses arguments et ses variables d’environnement. Pour moi, cela donne la commande gitea-mcp, les arguments -t stdio -H https://gitea.vlab.bzh et la variable qui pointe vers le fichier du jeton. Et c’est là que j’ai perdu pas mal de temps : mettez le chemin absolu du binaire.

Voici la partie du claude_desktop_config.json pour la déclaration du MCP Gitea :

Claude Desktop est une application graphique, elle n’hérite pas du PATH de votre Terminal. Un gitea-mcp peut directement fonctionner dans votre shell … et échouer lamentablement dans l’appli. Bref soyez précis et le rigoureux possible (pas comme moi …)

Redémarrer Claude !

Le fichier n’est lu qu’au démarrage : on quitte complètement Claude Desktop (pas juste la fenêtre) et on le relance. Si tout va bien, le serveur apparaît dans les outils disponibles de la conversation, avec la liste de ce qu’il sait faire. S’il est en erreur, direction les journaux de l’application (~/Library/Logs/Claude/ sur Mac), où chaque serveur MCP a son propre fichier. C’est là qu’on lit les vraies erreurs : binaire introuvable, jeton refusé, certificat TLS douteux sur une instance interne… Vous pouvez aussi lancer le binaire à la main avec l’option -d (debug) pour voir ce qu’il raconte. Bref, RTFM et logs, comme toujours.

Le premier vrai prompt

Après l’effort, le réconfort : on commence à discuter. « Liste mes dépôts », « Montre-moi le README de tel projet », « Quelles sont les issues ouvertes ? ». Claude choisit l’outil, vous demande l’autorisation de l’exécuter (par défaut, chaque appel est validé, et c’est très bien ainsi), et vous répond avec les données réelles. En allant plus loin : créer une branche, modifier un fichier, ouvrir une pull request. Premier « dingo ! » chez moi : demander une relecture d’une PR et voir le modèle aller chercher lui-même le diff, les commits, les commentaires … ou tu simplement commit un PR après une modification du code d’un projet donné, automatiquement bien sûr … and, it works guys !

Ceci étant …

Un outil capable d’écrire dans vos dépôts est un outil capable de faire des bêtises aussi, vite, très vite même. Quelques garde-fous simples : démarrer en lecture seule (-r) tant qu’on n’est pas à l’aise, et interdisez explicitement toute modification sans un mot clef impossible à ne pas connaître, genre « tu ne modifie rien sans une réponse exacte de ma part : ok, tu ne commit rien dans le main, jamais. c’est toujours moi qui le ferai compris ? » … en français dans le chat, si j’ose dire.

Limiter les outils exposés est aussi une bonne pratique ; Je vous en ai déja parlé, mais utiliser un compte ou un jeton dédié à l’IA plutôt que le vôtre. Et relire ce que le modèle s’apprête à faire avant de cliquer sur « Autoriser ». Ça paraît évident, jusqu’au jour où l’on valide dix demandes d’affilée en pilote automatique parce que « il ne fait jamais d’erreur » …. sauf aujourd’hui …

Ce que ce petit exemple nous apprend

Sur le papier, on vient juste de « brancher un outil » sur un autre. En réalité, on vient de franchir une marche importante : on est passé d’une IA qui discute à une IA qui agit. Et toutes les vraies questions de l’IA générative se posent à partir de là.

Security First. Un serveur MCP est un programme tiers qui s’exécute sur votre machine avec vos droits (ou des droits voisins), et qui détient vos jetons. Installer un MCP trouvé au hasard d’un dépôt, c’est exécuter du code inconnu avec vos clés. S’y ajoute l’injection de prompt : si le modèle lit un ticket, une page web ou un fichier piégé contenant des instructions cachées, il peut être manipulé pour appeler des outils à votre place. Et oui ! Rappelez-vous qu’un LLM ne fait pas la différence entre un prompt via vos interfaces dédiées d’un prompt qui existe au sein d’une source externe. Si on dit à un serveur MCP « va sur le web sur le site trucmuche et exécute ce qui y est publié » … il le fera. Plus on donne de pouvoirs, plus la surface d’attaque grandit.

Bref, principe de moindre privilège, validation humaine, isolation : l’hygiène de l’administrateur s’applique comme toujours systématiquement, même en lab, pour que cela devienne une seconde nature.

La souveraineté et les données. Chaque outil appelé renvoie des données au modèle, donc au fournisseur de l’IA, donc souvent à l’étranger. (sauf les LLM locaux, mais ce sera pour un autre article …). Mes dépôts privés, mes tickets, mes configurations passent dans le contexte. Où sont traitées ces données ? Pour combien de temps ? Avec quels engagements ? Pour un hôpital, une collectivité ou une entreprise, ce n’est pas un détail. Heureusement, MCP est un standard ouvert : rien n’empêche, à terme, de le brancher sur des modèles européens ou hébergés chez soi. C’est même un des gros atouts du protocole, et un sujet que je compte creuser à l’avenir.

La responsabilité. Si un agent supprime une branche ou publie un secret, qui est responsable ? Celui qui a rédigé le prompt, celui qui a validé l’action, celui qui a configuré les droits ? Traçabilité, journalisation, droit à l’erreur : on n’a pas encore de réponses toutes faites, mais on a déjà les bons outils, des jetons dédiés et des journaux d’audit côté Gitea me paraisse la voie à suivre.

La fiabilité et la dépendance. Ha, l’hallucination ! Un modèle reste avant tout probabiliste : il se trompe, parfois (qui a dit souvent ?) avec aplomb. Lui confier des actions, c’est accepter de contrôler. Et plus on s’habitue à déléguer, plus on risque de perdre la main sur nos propres outils. Sans oublier le coût, financier et écologique, de tout ça. Soyez scolaire, autoritaire même, et extrêmement strict avec vos LLM. Il vous le rendront bien en étant beaucoup plus fiables. si vous voulez faire un truc blanc. Dite « je VEUX un truc blanc. » pas « j’aimerais », pas « je me disais que ce serait bien » de etc. …

Voilà. Mon petit Gitea m’aura servi de bac à sable, et il m’a surtout donné envie de parler de tout le reste : MCP et sécurité, modèles souverains, agents, garde-fous. A vous, car je suis certain que je n’ai pas été le seul à m’arracher les cheveux et à, découvrir les joies de l’IA aujourd’hui 🙂 …

Référence :
– Mon Gitea (avec ses repos publics) : https://gitea.vlab.bzh
– MCP, chez Anthropic : https://www.anthropic.com/news/model-context-protocol
– Le MCP de Gitea sur GitHub : https://gitea.com/gitea/gitea-mcp

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *