Ce qui se passe
L'auteur de mcp-era-probe,
une sonde en lecture seule qui détecte la version du protocole MCP parlée par
un serveur, a ajouté une vérification dans sa version 0.8 : que répond un
serveur quand un client appelle un outil qui n'existe pas ? La sonde envoie un
tools/call sur un nom impossible, era-probe-nonexistent-tool, et ne touche
jamais à un vrai outil.
Les trois réponses
- Erreur de protocole. Une erreur JSON-RPC standard, en pratique
-32602« Unknown tool ». C'est la forme que montre l'exemple de gestion d'erreurs de la spécification. - Erreur d'exécution. Une réponse réussie dont le résultat porte
isError: true. La spécification place les échecs d'exécution ainsi, mais une faute de frappe sur le nom n'est pas un échec d'exécution : c'est une requête malformée. - Succès qui porte l'erreur en texte. HTTP 200,
isErrorabsent, et un bloc de contenu qui dit « Unknown tool: X ». Un client qui testeisErrorpuis lit le contenu prend le message pour la sortie de l'outil.
Ce que onze cibles ont répondu
| Serveur | Ère | Réponse | Code |
|---|---|---|---|
| goji.agency | moderne, strict | erreur de protocole | -32602 |
| projectory.ae | moderne, strict | erreur de protocole | -32602 |
| botinfo.ai | moderne, strict | erreur de protocole | -32602 |
| bidclub.ai | moderne, strict | erreur de protocole | -32602 |
| bizmoon.ai | moderne, strict | erreur de protocole | -32602 |
| context7 (npm, stdio) | moderne, strict | erreur de protocole | -32602 |
| getle.ad | moderne, double ère | erreur de protocole | 401 (appels protégés, liste publique) |
| askmiles.ai | moderne, souple | erreur d'exécution | isError: true |
| mcp.aivonic.ai | ancien | erreur d'exécution (en session) | isError: true |
| mcp.autonomad.ai | ancien | erreur d'exécution (en session) | isError: true |
| agentberg.ai | ancien | succès + texte d'erreur (en session) | aucun, isError absent |
Les trois serveurs anciens ne répondent pas sur la route moderne sans état : ils exigent une session. Avec un second nom impossible, les six serveurs retestés donnent le même classement. Seul goji.agency a divergé au premier passage, parce qu'il limitait les appels rapprochés ; un second essai espacé a concordé.
Un détail de la révision du 28 juillet
D'après l'auteur, la révision 2026-07-28 du transport HTTP exige que l'en-tête
Mcp-Name d'un tools/call reprenne le nom de l'outil du corps. Sa sonde
envoyait son propre nom client : les cinq serveurs stricts ont refusé avec
l'erreur -32020 (en-têtes et corps en désaccord), un serveur souple l'a
acceptée en silence.
Les limites, écrites par l'auteur
- Les serveurs ne sont pas indépendants : les cinq qui rejettent l'en-tête le font avec le même texte à l'octet près, et plusieurs partagent vraisemblablement un SDK. La mesure donne une filiation d'implémentations, pas dix lectures indépendantes de la spécification.
- L'ère n'explique pas tout : un serveur moderne répond côté exécution.
- Onze cibles recensent ce que l'auteur pouvait joindre, pas l'écosystème.
- Les détails de la révision 2026-07-28 sont rapportés tels que l'auteur les énonce, sans recoupement avec la spécification.
Comment s'y prendre
Côté client, dans cet ordre de confiance :
- l'erreur de protocole d'abord (requête malformée) ;
- puis
isError(échec d'exécution) ; - seulement ensuite, lire le contenu.
Pour fermer le troisième cas, qu'aucun code d'erreur ne signale, vérifier le nom
de l'outil contre la liste de tools/list avant l'appel : c'est un ajout de la
rédaction, pas de l'auteur. Côté serveur, répondre à un outil inconnu par une erreur de
protocole suffit à coller à l'exemple de la spécification.
Source : I asked MCP servers for a tool that doesn't exist. I got three kinds of answer., DEV Community, 11 octobre 2026.