Accueil / Étendre : compétences, MCP, sous-agents, hooks, plugins
Construire son propre serveur MCP
Un serveur MCP maison se lance en processus enfant par transport stdio, déclare dans inputSchema un schéma JSON que le serveur doit lui même valider, et une description précise décide quand Claude l'appelle.
Un serveur MCP construit maison n'est rien de plus qu'un programme ordinaire qui lit et écrit sur son entrée et sa sortie standard en suivant le protocole MCP. Claude Code le lance lui-même comme processus enfant, via le transport stdio, sans que ce programme n'écoute jamais un port réseau. Le même mécanisme sert pour un outil interne, connecté à une base de données privée, qu'aucun serveur public ne pourrait exposer sans risque.
Le déclarer auprès de Claude Code
La commande d'enregistrement sépare clairement ce qui appartient à Claude Code de ce qui appartient au serveur : claude mcp add --env CLE=valeur --transport stdio nom-du-serveur -- commande arguments. Tout ce qui suit le double tiret est transmis tel quel au serveur, sans interprétation ; tout ce qui le précède, --transport ou --env, configure la connexion côté Claude Code.
claude mcp add --env DEPOT=./donnees --transport stdio compteur -- node ./serveurs/compteur.js
Le processus compteur.js démarre alors à chaque session qui en a besoin, reçoit la variable DEPOT dans son environnement, et communique avec Claude Code par des messages écrits sur sa sortie standard.
Le schéma décide ce qui entre, la description décide si on l'appelle
Chaque outil déclare un schéma JSON qui borne ses arguments valides. Un outil qui compte les mots d'un texte peut exiger une chaîne obligatoire et refuser tout autre type :
{
"name": "compter_mots",
"description": "Compte le nombre de mots dans un texte fourni en argument.",
"inputSchema": {
"type": "object",
"properties": {
"texte": { "type": "string" }
},
"required": ["texte"]
}
}
Ce schéma déclare ce que l'outil attend, un argument manquant ou du mauvais type n'y est pas conforme, mais la validation reste due par le serveur : la spécification MCP impose au serveur de valider chaque entrée d'outil, le schéma n'est pas une garantie appliquée côté client avant l'appel. Le schéma ne décide pas non plus si Claude choisit cet outil plutôt qu'un autre : c'est le champ description qui joue ce rôle, exactement comme pour une skill. Une description qui promet plus que ce que l'outil fait réellement, par exemple compter les mots de n'importe quel document sans préciser qu'il ne lit qu'un argument texte déjà fourni, se retourne contre vous dès que Claude s'y fie pour un cas qu'elle ne couvre pas.
La leçon précédente montre comment vérifier qu'un serveur ainsi déclaré apparaît bien connecté avant de lui faire confiance.
De la demande à l'appel d'outil MCP
Un ingénieur enregistre un serveur MCP maison avec claude mcp add --transport stdio compteur -- node ./serveurs/compteur.js, dont le seul outil déclaré exige un argument texte de type chaîne. Il demande ensuite à Claude de compter les mots d'un nombre entier qu'il tape directement dans la conversation.
Écrivez en une phrase ce que cette situation établit, et en une phrase ce qu'elle n'établit pas.
Ce que cela établit : Cette situation établit que l'outil compteur exige un argument de type chaîne, déclaré dans son schéma, et que la demande fournit un nombre entier plutôt qu'une chaîne.
Ce que cela n’établit pas : Elle n'établit pas si Claude a effectivement tenté d'appeler cet outil avec ce nombre, ni comment le schéma a réagi à cette tentative précise.
Les trois calibrages faux les plus courants
- Trop large Cette situation prouve que le schéma a rejeté l'appel et que Claude a signalé l'erreur de type à l'ingénieur.
- Trop étroit Cette situation ne dit rien du tout, puisqu'un seul outil parmi ceux possibles a été déclaré sur ce serveur.
- À côté Cette situation confirme que le transport stdio choisi pour ce serveur est le bon choix face à un transport réseau.
- Un serveur MCP maison est un programme ordinaire lancé en processus enfant par Claude Code via le transport stdio, sans jamais ouvrir de port réseau.
- Le double tiret dans la commande claude mcp add sépare les options de Claude Code, --transport et --env, de la commande et des arguments transmis tels quels au serveur.
- Un schéma JSON, dans le champ inputSchema, déclare les arguments valides d'un outil, mais c'est au code du serveur, jamais au client, que la spécification impose de valider chaque appel reçu.
- La description d'un outil, pas son schéma, décide si Claude le choisit pour une tâche donnée, exactement comme pour une skill.
Écrivez, dans un fichier texte de votre poste, le schéma JSON d'un outil imaginaire à un seul argument obligatoire, en vous inspirant de l'exemple de cette leçon, sans l'enregistrer auprès de Claude Code.
Chaque affirmation datable de cette leçon renvoie ici au texte public qui la porte. Une source qui ne s’ouvre pas ne prouve rien.
- Claude Code, documentation du Model Context Protocol, serveurs locaux et transport stdio consultée le 2026-09-02