Un article Show HN « Ableton Live MCP » a grimpé à 118 points et 78 commentaires plus tôt cette semaine. Le schéma est désormais familier : quelqu'un a écrit un serveur Model Context Protocol pour un outil improbable, la communauté de Claude Desktop l'a adoré, et une vague de publications « Devrais-je en écrire un pour X ? » a suivi. Le MCP est passé d'une expérience uniquement Anthropic à une couche d'intégration d'agent par défaut en moins d'un an.
Ce que cette croissance cache est un manque d'outillage : personne n'a proposé une méthode claire pour tester les serveurs MCP. Exécuter manuellement du JSON-RPC sur stdio avec un débogueur est acceptable pour un "hello-world" ; cela s'effondre dès que votre serveur a 12 outils, 3 invites et une API en amont instable. Ce guide vous offre un manuel pratique pour tester les serveurs MCP manuellement et automatiser ces tests avec Apidog, afin que vous puissiez déployer des serveurs MCP comme vous le feriez pour toute autre API : avec un contrat, une maquette et une suite de régression.
Si vous venez d'un contexte d'agent plus général, notre guide agents.md se marie bien avec cela ; les conventions qui y sont définies facilitent la communication des contrats de serveur MCP à votre équipe.
En bref
- Le MCP est le Model Context Protocol d'Anthropic ; c'est du JSON-RPC 2.0 sur stdio ou HTTP et il expose trois primitives : les outils, les ressources et les invites.
- Tester un serveur MCP signifie vérifier ses réponses
initialize,tools/list,tools/call,resources/readetprompts/getpar rapport à un contrat. - Commencez manuellement : pilotez le serveur depuis la ligne de commande avec stdio, confirmez les réponses visuellement et corrigez les bugs de structure avant d'ajouter des clients.
- Passez à l'automatisation : capturez le trafic JSON-RPC dans Apidog, transformez chaque appel en une requête sauvegardée, créez des assertions sur la forme et le contenu de la réponse, et exécutez la suite en CI.
- Utilisez le serveur de maquette d'Apidog pour simuler les API en amont que votre serveur MCP appelle, afin que les tests restent déterministes.
- Téléchargez Apidog pour obtenir la collection de requêtes, le serveur de maquette et le runner CI en un seul endroit.
Ce qu'est réellement le MCP, en deux minutes
La spécification du Model Context Protocol définit un format de données JSON-RPC 2.0 avec une surface réduite. Un client (Claude Desktop, Cursor, votre propre agent) démarre un serveur MCP, effectue un handshake initialize, puis émet des appels.
Les cinq appels que vous testerez 90 % de votre temps :
initialize: négociation de version et divulgation des capacités.tools/list: le serveur retourne les outils qu'il expose, y compris le schéma JSON pour les arguments.tools/call: le client invoque un outil par son nom avec des arguments.resources/listetresources/read: le serveur expose un contenu lisible adressé par URI.prompts/listetprompts/get: le serveur expose des modèles d'invites que le client peut rendre.
Le transport est soit stdio (frames JSON-RPC délimitées par des nouvelles lignes sur stdin/stdout) soit HTTP streamable (généralement POST / avec SSE pour le streaming). La plupart des serveurs locaux utilisent stdio ; les serveurs distants utilisent HTTP.
Pourquoi les tests sont importants : chaque utilisateur de Claude Desktop, chaque utilisateur de Cursor, chaque IDE qui ajoute le support MCP va appeler votre serveur. Les bugs dans la structure de tools/list cassent tous les clients simultanément. Le coût d'une régression est élevé.
Ce que vous devriez tester
Une suite de tests solide pour un serveur MCP couvre six dimensions.
- Conformité au protocole.
initializeretourne-t-il la bonneprotocolVersion? Le serveur annonce-t-il les capacités qu'il prend réellement en charge ? - Correction du schéma. Chaque outil dans
tools/lista-t-il un JSON Schema valide pour les arguments ? Les champs requis sont-ils marqués ? La description est-elle plus longue que trois mots ? Les descriptions vides empêchent la sélection d'outils sur Claude. - Comportement de l'outil. Pour chaque outil,
tools/callrenvoie-t-il des blocs de contenu du bon type (text,image,resource) ? Les cas d'erreur renvoient-ils un résultatisError: trueplutôt que de générer des erreurs JSON-RPC ? - Accès aux ressources. Les URI de
resources/listse résolvent-elles lorsqu'elles sont appelées viaresources/read? La pagination fonctionne-t-elle au-delà de la première page ? - Rendu des invites. Les invites renvoient-elles des tableaux
messagesbien formés ? Les substitutions d'arguments se placent-elles aux bons endroits ? - Modes de défaillance. Que se passe-t-il lorsqu'une API en amont est en panne ? Lorsqu'un argument d'outil est manquant ? Lorsque le client expire ? Ce sont les bugs qui apparaissent en production, pas lors d'un "hello-world".
Le reste de ce guide passe en revue chacun de ces points, d'abord manuellement, puis de manière automatisée.
Tests manuels avec stdio
Commencez avec la configuration la plus simple possible : un terminal, votre binaire de serveur, et l'inspecteur MCP ou du JSON-RPC brut à la main.
Si vous n'avez pas encore construit de serveur, échafaudez-en un avec le démarrage rapide officiel du SDK MCP en Python ou TypeScript. L'exemple météo à deux outils est suffisant pour les tests.
Exécutez le serveur en mode inspecteur :
npx @modelcontextprotocol/inspector node your-server.js
L'inspecteur démarre une interface utilisateur web locale qui communique en MCP avec votre serveur et vous montre chaque requête et réponse. C'est le moyen le plus rapide de confirmer que le serveur démarre, annonce ses capacités et répond à tools/list.
Une fois que la vue de l'inspecteur semble correcte, exécutez le même flux avec du stdio brut afin de pouvoir capturer les trames pour Apidog :
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-04-01","capabilities":{}}}' | node your-server.js
Vous obtiendrez une réponse JSON-RPC sur stdout. Enregistrez la requête et la réponse. Répétez l'opération pour tools/list, tools/call, resources/list, et le reste. À la fin de cet exercice, vous aurez entre 6 et 12 paires requête-réponse canoniques qui définissent le contrat au niveau du protocole de votre serveur.
Deux choses à surveiller.
Premièrement, les blocs de contenu. Le résultat d'un outil renvoie content: [{ type: "text", text: "..." }] ou content: [{ type: "image", data: "...", mimeType: "image/png" }]. Le mélange des types dans une seule réponse est autorisé ; les clients diffèrent sur la façon dont ils les affichent.
Deuxièmement, les erreurs. La spécification MCP est claire : les erreurs d'exécution d'outils renvoient un résultat normal avec isError: true et un bloc de contenu décrivant l'échec. Ne lancez pas de réponses d'erreur JSON-RPC depuis l'intérieur d'un outil ; cela signale une défaillance au niveau du protocole, et non au niveau de l'outil. De nombreux clients coupent la connexion en cas d'erreurs de protocole.
Du manuel à l'automatisé : construire la suite de tests dans Apidog
Les tests manuels révèlent les bugs évidents. Vous passez à l'automatisation lorsque vous commencez à vous demander « ma dernière modification a-t-elle cassé le schéma des arguments de l'outil 7 ? » et que vous ne voulez pas taper 12 commandes curl pour le savoir.
Le modèle : prenez chaque paire requête-réponse que vous avez enregistrée lors des tests manuels, collez-la dans Apidog en tant que requête sauvegardée, ajoutez des assertions et exécutez la suite à chaque push.
1. Créer un projet Apidog pour le serveur MCP
Ouvrez Apidog, créez un nouveau projet, définissez l'URL de base sur le point de terminaison HTTP de votre serveur MCP (ou l'URL du pont stdio ; voir ci-dessous). Les projets Apidog prennent en charge à la fois REST et JSON-RPC ; créez un environnement JSON-RPC.
Pour les serveurs stdio qui n'ont pas d'interface HTTP, exécutez-les derrière un mince wrapper HTTP pour les tests. L'inspecteur officiel en fournit un ; alternativement, un script Node de 30 lignes qui lit le JSON-RPC sur HTTP et le transmet à stdio fonctionne très bien. Nous utilisons le même modèle dans Tests d'API sans Postman en 2026 pour les backends non-HTTP.
2. Enregistrer les requêtes canoniques
Pour chacun des éléments initialize, tools/list, tools/call, resources/list, resources/read, prompts/list, prompts/get, enregistrez le corps JSON-RPC comme une requête. Apidog les stocke avec le corps, les en-têtes et le statut attendu.
Une requête tools/call ressemble à ceci dans la vue du corps de requête d'Apidog :
{
"jsonrpc": "2.0",
"id": 42,
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": {
"city": "Tokyo"
}
}
}
3. Ajouter des assertions
Le but de l'automatisation est d'asserter la réponse, pas d'envoyer la requête. Apidog prend en charge nativement les assertions JSONPath. Pour tools/list, vous voulez au moins :
$.result.toolsexiste$.result.tools.lengthest supérieur à zéro- Chaque outil possède
name,descriptionetinputSchema - Chaque
inputSchemaest un JSON Schema valide
Pour tools/call sur une entrée valide connue, vous voulez :
$.result.isErrorest faux (ou absent)$.result.contentest un tableau- Le premier bloc de contenu a le
typeet le contenu attendus
Pour tools/call sur une entrée invalide connue (argument requis manquant), vous voulez :
$.result.isErrorest vrai$.result.content[0].textcorrespond à votre message d'erreur attendu
Apidog stocke ces assertions par requête. Les échecs apparaissent dans le rapport d'exécution.
4. Simuler les API en amont
La plupart des serveurs MCP encapsulent une API externe : données météorologiques, GitHub, Linear, une base de données interne. Vous ne voulez pas que les exécutions de CI frappent les API en direct à chaque commit. Deux raisons : le coût et l'instabilité.
Le serveur de maquette intégré d'Apidog résout ce problème. Définissez chaque point de terminaison en amont comme une route simulée renvoyant un corps JSON réaliste. Orientez la configuration de votre serveur MCP vers l'URL de maquette pendant les tests et vers la production pendant les exécutions réelles. Nous couvrons le flux de travail de maquette en détail dans le développement d'API contract-first.
Le résultat : une suite de tests qui s'exécute en quelques secondes, ne nécessite aucun réseau externe et détecte les régressions de schéma bien avant qu'elles ne soient déployées.
5. Exécuter la suite en CI
Les projets Apidog s'exportent vers des runners CLI. La commande apidog run prend un ID de projet, exécute chaque requête sauvegardée, évalue les assertions et quitte avec un code non nul en cas d'échec. Intégrez-le à vos GitHub Actions ou à tout fournisseur de CI que vous utilisez déjà.
Un workflow minimal :
name: MCP server tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22 }
- run: npm ci
- name: Start MCP HTTP wrapper
run: node test/wrapper.js &
- name: Run Apidog suite
run: npx apidog run --project-id $APIDOG_PROJECT --env ci
env:
APIDOG_PROJECT: ${{ secrets.APIDOG_PROJECT }}
APIDOG_TOKEN: ${{ secrets.APIDOG_TOKEN }}
Chaque push exécute l'intégralité du contrat MCP. Une régression de schéma de l'outil 7 ne peut pas passer inaperçue.
À quoi ressemble une bonne couverture de test
Un plan de test complet pour un serveur MCP dans Apidog comprend généralement :
- 1 requête
initializeavec des assertions de capacité - 1 requête
tools/listavec des assertions de forme et de JSON Schema - 2 à 4 requêtes
tools/callpar outil : chemin nominal, argument manquant, type invalide, erreur en amont - 1
resources/listplus 1resources/readpar famille de ressources - 1
prompts/listplus 1prompts/getpar modèle d'invite
Pour un serveur de 10 outils avec 3 ressources et 4 invites, la suite exécute 50 à 70 requêtes. Apidog les exécute localement en moins de 10 secondes avec le serveur de maquette préchauffé.
Erreurs courantes lors du test des serveurs MCP
Voici les schémas que nous rencontrons le plus souvent.
- Sauter le cycle
initialize. Plusieurs serveurs plantent surtools/listsiinitializen'a jamais été appelé, car ils construisent paresseusement leur registre d'outils pendant le handshake. Exécutez toujoursinitializeen premier. - Affirmer sur des chaînes d'erreur brutes. Les messages d'échec des outils changeront. Affirmez sur
isError: trueet sur un code d'erreur stable ou une expression régulière, pas sur des correspondances exactes de chaînes. - Laisser la maquette s'éloigner de la production. Une maquette qui renvoie des formes que la vraie API ne renvoie jamais vous donne des tests verts sur une intégration cassée. Réenregistrez les fixtures de maquette à partir de réponses réelles à chaque version.
- Oublier le streaming. Les serveurs MCP HTTP diffusent les résultats des outils via SSE. Votre exécuteur de tests doit gérer le SSE ; Apidog le fait, mais vous devez activer le streaming sur la requête.
- Ne pas tester la concurrence. Les clients MCP envoient des requêtes
tools/callconcurrentes dans les boucles d'agent. Si votre serveur maintient un état partagé sans verrous, les tests à requête unique passent et la production est interrompue. Ajoutez un test d'exécution parallèle à la suite. - Confondre les erreurs de protocole et les erreurs d'outil. La spécification MCP les sépare volontairement ; les mélanger fait que Claude Desktop ferme la connexion. Nous avons couvert le même type de bug de contrat dans le développement d'API contract-first.
Cas d'utilisation réels
Une équipe développant un serveur MCP interne pour l'API de gestion d'incidents de leur entreprise a détecté trois régressions en une semaine en utilisant les assertions Apidog sur la forme de tools/list. Sans ce test, les bugs auraient été déployés simultanément à chaque ingénieur utilisant Claude Desktop.
Un développeur solo publiant un serveur MCP open-source pour Notion utilise les maquettes Apidog pour exécuter la suite de tests sans atteindre les limites de débit de Notion pendant la CI. Leur suite s'exécute sur chaque PR, prend 8 secondes et met en cache les fixtures de maquette d'Apidog dans le dépôt afin que les contributeurs n'aient pas besoin d'accès API pour développer.
Une équipe de plateforme gérant 14 serveurs MCP internes a construit un espace de travail Apidog partagé où réside le contrat de chaque serveur. Les nouveaux serveurs héritent d'une suite de tests de base ; les réviseurs peuvent comparer les différences de schéma côte à côte avant de fusionner. L'équipe rapporte deux pannes évitées au cours du premier trimestre, toutes deux détectées par des assertions de forme tools/list sur une PR qui aurait livré un argument renommé à chaque utilisateur de Claude Desktop au sein de l'entreprise.
Une deuxième équipe construisant un serveur MCP pour une plateforme d'observabilité interne utilise le sélecteur d'environnement d'Apidog pour exécuter la même suite contre la staging et la production. Chaque environnement pointe vers un fichier de maquette différent, de sorte que les mêmes 60 assertions confirment les deux déploiements sans réécrire une seule requête.
Conclusion
Le MCP s'est généralisé cette année, mais l'histoire des tests en est encore là où les tests d'API REST se trouvaient il y a une décennie : ad hoc, manuels, fragiles. Vous n'avez pas à attendre que l'écosystème rattrape son retard. Traitez votre serveur MCP comme l'API qu'il est, concevez un contrat, simulez les API en amont et exécutez des assertions en CI.
Cinq points à retenir :
- Un serveur MCP est une API JSON-RPC ; testez-le avec la même rigueur qu'une API REST.
- Commencez manuellement avec l'inspecteur officiel, puis capturez les requêtes canoniques et passez à l'automatisation.
- Apidog gère le JSON-RPC, les assertions, les maquettes et la CI dans un seul projet.
- Couvrez les six dimensions : conformité au protocole, correction du schéma, comportement de l'outil, accès aux ressources, rendu des invites et modes de défaillance.
- Simulez les API en amont dans Apidog afin que la suite de tests reste rapide et déterministe.
Étape suivante : ouvrez Apidog, créez un projet, collez les corps de requête que vous avez capturés manuellement, ajoutez des assertions JSONPath pour tools/list et exécutez la suite. Vous saurez en moins d'une heure si le contrat de votre serveur est suffisamment solide pour être déployé.
FAQ
Qu'est-ce que le MCP ?
Le MCP, ou Model Context Protocol, est la spécification ouverte d'Anthropic décrivant comment les clients d'IA (comme Claude Desktop) appellent des outils externes, des ressources et des invites. Il s'agit de JSON-RPC 2.0 sur stdio ou HTTP streamable. La spécification complète du MCP est publiée sur modelcontextprotocol.io.
Puis-je tester un serveur MCP sans wrapper HTTP ?
Oui. L'inspecteur MCP officiel communique directement en stdio et vous offre une interface utilisateur pour les tests manuels. Pour les tests automatisés dans Apidog, enveloppez stdio dans un serveur HTTP léger pendant la CI ; le trafic de production continue de passer par stdio.
Comment simuler les API en amont que mon serveur MCP appelle ?
Définissez chaque point de terminaison en amont comme une maquette dans votre projet Apidog, dirigez la configuration du serveur MCP vers l'URL de maquette pendant les tests, et passez aux URL de production au moment de l'exécution. Nous décrivons le même modèle dans les outils de test d'API pour les ingénieurs QA.
Qu'en est-il des résultats d'outils en streaming ?
Les serveurs MCP HTTP diffusent les résultats des outils via des événements envoyés par le serveur (SSE). Apidog prend en charge le SSE dans les requêtes enregistrées ; activez-le dans les paramètres de la requête et effectuez des assertions sur le flux assemblé.
Dois-je tester la version du protocole ?
Oui. Épinglez la protocolVersion que vous supportez dans initialize et effectuez des assertions sur celle-ci. Les incompatibilités entraînent une incompatibilité client silencieuse.
Puis-je tester mon serveur MCP avec Claude Desktop réel ?
Vous le pouvez, et vous devriez le faire au moins une fois avant chaque version. Mais ne comptez pas sur Claude Desktop comme boucle de test ; c'est lent, manuel et non déterministe. Utilisez Apidog pour la suite de régression et Claude Desktop pour le test de fumée.
Où puis-je voir des exemples réels de serveurs MCP ?
Le répertoire officiel des serveurs MCP contient des implémentations de référence pour les systèmes de fichiers, GitHub, Slack, Postgres, et des dizaines d'autres. Lisez les définitions d'outils ; c'est le moyen le plus simple de comprendre à quoi ressemble une bonne forme MCP.
