Comment fonctionne MCP ? Sous le capot avec Claude et les agents d’IA
Model Context Protocol ressemble à de la magie quand Claude lit un fichier ou appelle seul une API d’images. Cet article en ouvre le capot : hôtes, clients et serveurs, la poignée de main JSON-RPC, outils, ressources et prompts, la boucle d’agent qui répète les appels d’outils, et les contrôles de sécurité qui le protègent.
Vous tapez une demande : Claude lit un fichier, interroge une base de données ou génère une image, et quelques secondes plus tard le résultat apparaît dans le chat. Rien dans les poids du modèle ne sait comment atteindre votre base de données. Quelque chose se trouve au milieu, et ce quelque chose est le Model Context Protocol, abrégé en MCP. Si vous vous demandez comment fonctionne MCP dans les coulisses, voici la version courte : un format de message commun permet à une application d’IA de demander à des programmes externes ce qu’ils savent faire, puis de les appeler pour le compte du modèle. La suite de cet article suit une seule requête, de la première poignée de main jusqu’au résultat final de l’outil, avec de vrais formats de messages, pour que vous puissiez visualiser chaque étape.
Ce qu’est vraiment MCP
MCP est un standard ouvert introduit par Anthropic en novembre 2024. Il définit comment une application d’IA se connecte à des outils et à des données externes grâce à un ensemble unique de règles partagées, au lieu d’une intégration sur mesure pour chaque paire de produits. Pensez à la façon dont l’USB-C permet à un seul câble de relier un microphone, un disque et un écran. MCP joue ce rôle entre les modèles de langage et les logiciels qui les entourent.
Le problème qu’il résout
Avant MCP, chaque application d’IA qui voulait lire un agenda, rechercher dans une base de code ou appeler une API d’images avait besoin de son propre code de liaison. Avec N applications et M outils, les équipes faisaient face à jusqu’à N × M intégrations distinctes, chacune avec ses particularités d’authentification, ses formats d’erreur et ses calendriers de mise à jour. Un bug corrigé dans un connecteur ne profitait jamais aux autres, et chaque nouveau modèle ou outil multipliait le travail.
Pourquoi un seul protocole l’emporte
Un protocole commun fait passer le calcul de N × M à N + M. Un auteur d’outil écrit un serveur. Un auteur d’application écrit un client. Tout le reste se connecte sans code supplémentaire.
Réutilisation : un seul serveur pour une base de données fonctionne dans Claude Desktop, Claude Code, un éditeur ou un agent personnalisé.
Liberté de changement : changez le modèle derrière votre application et les connexions aux outils continuent de fonctionner.
Isolation : chaque serveur tourne dans son propre processus, si bien qu’un plantage ou un bug reste contenu.
Recherche à l’exécution : les clients demandent aux serveurs ce qu’ils proposent au moment de la connexion, si bien que de nouveaux outils apparaissent sans nouvelle version de l’hôte.
💡 À retenir : MCP ne rend pas un modèle plus intelligent. Il lui donne des mains. Le raisonnement se fait toujours dans le modèle, et le protocole se contente d’acheminer les demandes et de rapporter les résultats.
Les trois acteurs de chaque session
Imaginez un restaurant. La salle est l’hôte, le garçon de salle est le client, et chaque poste de cuisine est un serveur. Le convive ne parle jamais aux fourneaux, et les fourneaux ne parlent jamais au convive. Tout passe par un relais défini, et c’est exactement le rôle de MCP.
Les hôtes
L’hôte est l’application que vous ouvrez réellement : Claude Desktop, Claude Code, un éditeur doté de fonctions d’IA, ou un agent que vous avez écrit vous-même. Il gère la conversation avec le modèle, affiche les demandes d’autorisation et décide quels serveurs démarrer.
Les clients
Dans l’hôte, un objet client gère une connexion avec un serveur. Si vous vous connectez à cinq serveurs, l’hôte gère cinq clients. Chaque client conserve son propre état de session, négocie les capacités et traduit les appels internes de l’hôte en messages du protocole.
Les serveurs
Un serveur est un petit programme qui expose des capacités. Il peut tourner sur votre ordinateur sous forme de processus enfant, ou sur une autre machine derrière une URL. Il peut envelopper un système de fichiers, un compte GitHub, une base de données ou un générateur d’images.
Rôle
Où il se trouve
Ce dont il est responsable
Exemple
Hôte
Votre appareil ou une application cloud
Conversation avec le modèle, demandes de consentement, démarrage des serveurs
Claude Desktop, Claude Code
Client
À l’intérieur de l’hôte
Une connexion et une session par serveur
Un objet de connexion issu d’un SDK MCP
Serveur
Processus local ou URL distante
Exposer des outils, des ressources et des prompts
Un serveur de système de fichiers, un serveur de base de données
À l’intérieur des messages du protocole
Chaque échange entre un client et un serveur est un flux de petits messages simples et prévisibles. Cette prévisibilité est tout l’intérêt.
JSON-RPC sur le réseau
Chaque message MCP est en JSON-RPC 2.0, ce qui donne au protocole exactement trois formats de message :
Une requête comporte id et method, et attend une réponse.
Une réponse reprend id et renvoie soit result, soit error.
Une notification ne comporte pas id et n’attend rien en retour.
Voici un appel d’outil tel qu’il voyage du client vers le serveur :
Le id partagé permet au client de faire correspondre une réponse à sa question, même lorsque plusieurs appels sont en cours en même temps.
La poignée de main, étape par étape
Avant qu’un outil ne s’exécute, le client et le serveur conviennent de leur façon de communiquer. La séquence est courte et toujours la même :
initialize (requête) : le client envoie la version du protocole qu’il souhaite, les capacités qu’il prend en charge, ainsi que son propre nom et sa version.
initialize (réponse) : le serveur répond avec la version qu’il utilisera, ses propres capacités et, éventuellement, des instructions écrites destinées au modèle.
notifications/initialized : le client confirme, et la session est ouverte.
tools/list, resources/list, prompts/list : le client demande ce que le serveur propose, dans la limite des capacités déclarées par les deux parties.
Trafic normal : appels, lectures et, de temps en temps, un notifications/tools/list_changed lorsqu’un serveur ajoute ou retire un outil en cours de session.
💡 Version incompatible : si un serveur ne prend pas en charge la version demandée par un client, il répond avec une version qu’il prend en charge. Le client accepte alors cette version ou se déconnecte proprement.
stdio ou Streamable HTTP
Les mêmes messages JSON-RPC peuvent circuler par deux transports officiels.
Avec stdio, l’hôte lance le serveur comme processus enfant et échange du JSON délimité par des retours à la ligne via l’entrée et la sortie standard. Les journaux doivent aller vers l’erreur standard, car un seul affichage parasite sur la sortie standard corrompt le flux. Avec Streamable HTTP, le serveur se trouve derrière une URL unique, le client envoie ses messages par requêtes POST, et le serveur répond soit par du JSON simple, soit en ouvrant une réponse en flux lorsqu’il doit renvoyer plusieurs messages. Streamable HTTP a remplacé l’ancien transport HTTP plus SSE dans la révision de mars 2025 de la spécification.
Caractéristique
stdio
Streamable HTTP
Lieu d’exécution du serveur
Votre machine, sous forme de processus enfant
Partout où il est joignable par URL
Installation
Une commande dans un fichier de configuration
Un point de terminaison déployé
Authentification
Hérite de vos permissions utilisateur
Autorisation basée sur OAuth
Utilisateurs typiques
Développeurs solo, outils locaux
Équipes, services hébergés, connecteurs partagés
Clients simultanés
Un seul
Plusieurs
Une entrée type de Claude Desktop pour un serveur local ressemble à ceci :
Les serveurs exposent trois briques de base. Elles diffèrent surtout par qui décide de les utiliser, et quand.
Primitive
Contrôlée par
Rôle
Exemple
Méthodes
Outils
Le modèle
Effectuer une action ou un calcul
generate_image, run_query
tools/list, tools/call
Ressources
L’application
Fournir un contexte en lecture seule
Un fichier, le schéma d’une base de données
resources/list, resources/read
Prompts
L’utilisateur
Proposer des modèles réutilisables
Une commande « relire cette pull request »
prompts/list, prompts/get
Les outils agissent
Un outil comporte name, description et inputSchema, décrit en JSON Schema. La description est ce que le modèle lit réellement pour décider d’appeler ou non l’outil. Une description vague produit donc des appels erronés ou absents. Rédigez-la comme un court mode d’emploi destiné à un collègue qui n’a jamais vu votre système.
Les vrais connecteurs illustrent bien ce schéma. Le connecteur PicassoIA de claude.ai expose des outils tels que generate_image, edit_image, generate_video_picassoia, generate_video_seedance, get_generation et list_models. Un outil de génération renvoie immédiatement un identifiant de prédiction, puis le modèle appelle get_generation encore et encore jusqu’à ce que le statut affiche succeeded. C’est une seule demande de l’utilisateur qui devient plusieurs appels d’outils enchaînés, et le protocole n’a jamais eu besoin d’une fonction spéciale pour cela.
Les ressources fournissent du contexte
Les ressources sont adressées par URI, comme file:///project/README.md. L’hôte décide lesquelles attacher à la conversation, et resources/read renvoie leur contenu avec un type MIME. Les serveurs peuvent aussi publier des modèles de ressources paramétrés, et les clients peuvent s’abonner aux modifications pour que le contexte reste à jour.
Les prompts regroupent des flux de travail
Les prompts sont des modèles que l’utilisateur déclenche volontairement, généralement sous forme de commandes slash. Un prompt peut recevoir des arguments et renvoyer un ensemble de messages prêts à l’emploi. Une équipe peut ainsi écrire une fois sa meilleure formulation pour « résumer cet incident » ou « rédiger les notes de version », puis la réutiliser partout.
Ce qui se passe lorsque Claude appelle un outil
Voici la partie que l’on confond le plus souvent : le modèle ne parle jamais MCP. C’est l’hôte qui le fait. Claude ne voit que les définitions d’outils dans son propre format d’utilisation d’outils, et il émet des demandes structurées. Tout le reste relève de la plomberie.
De la question à l’appel d’outil
Vous demandez. « Redimensionnez la photo principale et enregistrez-la dans le dossier de mon projet. »
L’hôte envoie le contexte. Il transmet à l’API du modèle votre message ainsi que les définitions d’outils recueillies auprès de chaque serveur connecté.
Claude décide. Au lieu d’un texte final, il renvoie un bloc tool_use qui nomme un outil et ses arguments.
L’hôte vérifie le consentement. Il peut afficher une demande d’approbation, puis achemine l’appel vers le client qui possède cet outil.
Le client appelle le serveur. Une requête tools/call part, le serveur fait le travail et renvoie des blocs content.
L’hôte rend compte. Le résultat est transmis à Claude sous forme de bloc tool_result, avec la conversation jusque-là.
Claude poursuit. Il appelle un autre outil ou rédige la réponse finale.
Où vit la boucle d’agent
Les étapes 3 à 7 se répètent jusqu’à ce que Claude cesse de demander des outils. Cette répétition est la boucle d’agent, et elle se trouve dans l’hôte, et non dans le protocole. MCP définit les portes. L’hôte décide combien de fois les franchir. Un agent d’IA est simplement un hôte qui exécute cette boucle avec des plans plus longs, moins d’interruptions et, parfois, ses propres agents auxiliaires.
💡 Coût caché : chaque définition d’outil occupe de la place dans la fenêtre de contexte. Cinquante outils peuvent consommer des milliers de tokens avant même la lecture du premier mot de votre question. Les bons hôtes chargent les schémas à la demande ou vous laissent désactiver les serveurs par projet.
Sécurité et permissions
Un serveur capable d’exécuter des commandes ou de toucher aux fichiers est puissant, et c’est précisément pour cela qu’il a besoin de garde-fous.
Le consentement d’abord
La spécification demande aux hôtes d’obtenir le consentement explicite de l’utilisateur avant d’invoquer des outils ou de partager des données, et les hôtes matures vont jusqu’au bout avec des demandes d’approbation et des listes d’autorisation par outil. N’oubliez pas qu’un serveur stdio local s’exécute avec vos permissions d’utilisateur : traitez donc son installation comme celle de n’importe quel programme. Les serveurs distants ajoutent OAuth, qui vous permet d’accorder un accès limité et de le révoquer plus tard.
Points de défaillance courants
Injection de prompt via les résultats : une page web, un ticket ou un e-mail renvoyé par un outil peut contenir un texte qui tente de donner de nouveaux ordres au modèle.
Descriptions d’outils empoisonnées : un serveur malveillant peut cacher des instructions dans ses propres descriptions.
Identifiants trop larges : un jeton capable de tout supprimer finira par être utilisé pour tout supprimer. Privilégiez un accès en lecture seule.
Sortie standard parasite : les affichages de débogage dans un serveur stdio cassent le flux JSON.
Trop d’outils : avec des dizaines d’outils disponibles, le modèle choisit plus souvent le mauvais. Gardez chaque serveur ciblé.
Tâches longues : un appel unique qui dure dix minutes expire. Renvoyez un identifiant et laissez le modèle interroger le statut, comme le font les générateurs d’images et de vidéos.
Utiliser Claude Sonnet 5 sur PicassoIA
Si vous voulez créer votre propre serveur, Claude Sonnet 5 sur PicassoIA est un binôme de programmation bien pratique. Il est conçu pour les tâches de programmation en plusieurs étapes et d’utilisation d’outils, et il lit les images, de sorte qu’une capture d’écran d’erreur peut servir d’entrée.
Ouvrez la page du modèle. Rendez-vous sur la page de Claude Sonnet 5 dans la collection des grands modèles de langage.
Rédigez le prompt. C’est le seul champ obligatoire. Soyez précis sur le langage, le SDK et l’outil souhaités.
Réglez l’effort. La valeur par défaut est low, qui évite la réflexion étendue pour des réponses rapides. Augmentez-la pour un bug qui s’étend sur plusieurs fichiers.
Ajustez les limites.max_tokens vaut 8192 par défaut, et un system_prompt facultatif fixe un rôle ou un style de code pour la session.
Joignez une image si utile. Le champ image accepte une capture d’écran, et max_image_resolution (0,5 mégapixel par défaut) la garde légère.
Générez et relisez. Copiez le code dans votre projet et testez-le avec le MCP Inspector avant de lui faire confiance.
Un prompt qui fonctionne bien :
Write a minimal MCP server in TypeScript using the official SDK. It exposes one tool,
word_count, that takes a string and returns the number of words. Use the stdio transport
and log only to stderr. Include the claude_desktop_config.json entry to register it.
PicassoIA parle aussi MCP lui-même. Son connecteur claude.ai propose quatre modèles : PicassoIA Image, PicassoIA Image Editor Pro, PicassoIA Video et Seedance 2.5 Lite, qui produit une vidéo avec son. Les prédictions sont asynchrones, et un compte peut en exécuter cinq à la fois sur l’ensemble de ses connexions, donc gardez chaque lot petit. Consultez la page des tarifs pour savoir ce que comprend votre forfait.
Créez vos visuels dès aujourd’hui
Derrière chaque instant fluide « Claude, créez-moi une image », il y a une poignée de main, un schéma et une boucle. La façon la plus rapide de le ressentir est de produire quelque chose. Ouvrez PicassoIA Image et décrivez une scène, passez à Seedream 4.5 ou FLUX 2 Pro pour un rendu différent, puis confiez le résultat à Seedance 2.0 pour transformer une image fixe en courte séquence vidéo. Connectez le connecteur PicassoIA à Claude et vous pourrez tout demander en langage courant, puis observer en temps réel les appels d’outils décrits dans cet article.
Choisissez une idée parmi les sections ci-dessus, écrivez une seule phrase décrivant ce que vous voulez voir, et lancez-la. Votre première image est à quelques secondes sur picassoia.com.