Les prompts côté client
Mis à jour le 29 juillet 2026
Il ne reste qu’une pièce à poser pour terminer notre client MCP : les fonctionnalités de prompts. Deux méthodes suffisent, l’une pour lister tous les prompts disponibles sur le serveur, l’autre pour récupérer un prompt précis avec ses variables déjà remplies.
Découvrir les prompts disponibles
La méthode list_prompts ne réserve aucune surprise et reprend mot pour mot la structure de list_tools écrite plus tôt : elle appelle la fonction de liste de prompts de la session et retourne les prompts.
async def list_prompts(self) -> list[types.Prompt]:
result = await self.session().list_prompts()
return result.prompts
C’est cette méthode qui alimentera le menu des commandes slash de votre CLI. Le serveur reste ainsi la source unique de vérité : ajoutez un prompt côté serveur, il apparaît côté client sans qu’une ligne de l’application n’ait été modifiée.
Récupérer un prompt instancié
La méthode get_prompt est plus intéressante, car c’est elle qui gère l’interpolation de variables. Quand vous demandez un prompt, vous fournissez des arguments qui sont passés à la fonction de prompt comme arguments mot-clé.
async def get_prompt(self, prompt_name, args: dict[str, str]):
result = await self.session().get_prompt(prompt_name, args)
return result.messages
Reprenons le prompt de la leçon précédente. Si votre serveur expose un prompt format_document qui attend un paramètre doc_id, le dictionnaire d’arguments contiendra {"doc_id": "plan.md"}. Cette valeur est interpolée dans le template du prompt côté serveur, et ce que vous récupérez n’est donc pas un modèle à trous mais des messages complets, prêts à partir vers Claude. Remarquez que la méthode retourne result.messages et non le résultat brut : votre application n’a plus qu’à ajouter ces messages à la conversation en cours.
Essayer depuis la ligne de commande
Une fois les deux méthodes implémentées, testez la fonctionnalité via la CLI. Tapez un slash (/) et les prompts disponibles apparaissent sous forme de commandes. Sélectionnez « format » : l’interface vous invite alors à choisir parmi les documents disponibles, en s’appuyant sur la ressource d’autocomplétion construite deux leçons plus tôt.
Après la sélection du document, le système envoie le prompt complet à Claude. Le modèle reçoit à la fois les instructions de formatage et l’identifiant du document, puis mobilise les outils disponibles pour récupérer et traiter le contenu. Vous voyez ici les trois primitives coopérer dans une seule action de l’utilisateur : un prompt déclenché par un slash, une ressource qui remplit la liste de choix, et des outils appelés par Claude pour faire le travail.
Le trajet complet d’un prompt
Serveur MCP
└─► Définit le prompt avec @mcp.prompt
└─► Template avec variables (doc_id, etc.)
Client MCP
└─► Appelle list_prompts() pour découvrir les prompts
└─► Appelle get_prompt(name, args) pour récupérer un prompt instancié
└─► Reçoit les messages prêts à envoyer à Claude
Application
└─► Présente les prompts à l'utilisateur (ex: commandes slash)
└─► Envoie les messages à Claude
Le cycle de vie se lit dans le même ordre. Tout commence par un travail d’auteur : vous écrivez et évaluez un prompt pertinent pour votre domaine, puis vous le définissez dans votre serveur MCP avec @mcp.prompt. À partir de là, les clients peuvent demander ce prompt à tout moment via list_prompts(). Lorsqu’un client en instancie un, les arguments qu’il fournit deviennent des arguments mot-clé dans votre fonction Python, et celle-ci retourne des messages formatés, prêts pour le modèle IA.
Les trois primitives, réunies
Avec les prompts côté client, vous avez implémenté l’intégralité du protocole vu dans ce cours. Le tableau ci-dessous rassemble ce que vous avez écrit et rappelle qui décide de quoi.
| Primitive | Contrôlée par | Méthodes client |
|---|---|---|
| Outils | Claude | list_tools(), call_tool() |
| Ressources | L’application | read_resource() |
| Prompts | L’utilisateur | list_prompts(), get_prompt() |
Ce que vous obtenez au bout du compte, ce sont des prompts réutilisables et paramétrés, qui maintiennent la cohérence tout en autorisant la personnalisation par les variables. C’est particulièrement précieux pour les workflows complexes, là où vous voulez garantir que l’IA reçoit à chaque fois des instructions correctement structurées.