Applied AI â Niveau AvancĂ©
Session 5 : MCP en profondeur
Programme : Applied AI â Formation professionnelle en intelligence artificielle Instructeur : Yann Isola Niveau : AvancĂ© â Architectes solutions prĂ©parant la certification Claude Certified Architect DurĂ©e recommandĂ©e : 3 h 30 (2 h de cours magistral + 1 h 30 dâexercices pratiques) PrĂ©requis : Sessions 1 Ă 4 du niveau avancĂ© (orchestration, outils/function calling, gestion de contexte, architecture multi-agents)
Objectifs pédagogiques
Ă lâissue de cette session, les participants seront capables de :
- DĂ©crire lâarchitecture complĂšte du protocole MCP (Model Context Protocol â protocole de contexte de modĂšle) : HĂŽte â Client â Serveur, et le rĂŽle exact de chaque composant.
- Choisir et justifier une couche de transport (stdio local vs Streamable HTTP distant) selon des critĂšres dâarchitecture, de sĂ©curitĂ© et de dĂ©ploiement.
- Distinguer les trois primitives MCP â Tools, Resources, Prompts â et sĂ©lectionner la bonne primitive selon qui contrĂŽle lâinvocation (le modĂšle, lâapplication ou lâutilisateur). Câest un point dâexamen central de la certification.
- Construire un serveur MCP complet en Python (SDK officiel) exposant outils, ressources et prompts, avec garde-fous intégrés.
- Construire un client MCP : gestion de session, dĂ©couverte dâoutils, nĂ©gociation de capacitĂ©s.
- Appliquer les patrons avancĂ©s : enregistrement dynamique dâoutils, abonnement aux ressources avec notifications, chaĂźnage de prompts, normalisation de donnĂ©es hĂ©tĂ©rogĂšnes.
Plan de la session
| Bloc | Durée | Contenu |
|---|---|---|
| 1 | 30 min | Architecture MCP : HĂŽte, Client, Serveur, JSON-RPC |
| 2 | 25 min | Couche de transport : stdio vs Streamable HTTP |
| 3 | 35 min | Les trois primitives : Tools, Resources, Prompts |
| 4 | 30 min | Construire un serveur et un client MCP (SDK Python) |
| 5 | 20 min | Sécurité, écosystÚme et patrons avancés |
| 6 | 90 min | Exercices pratiques + démonstration interactive (page web) |
| 7 | 10 min | Quiz de validation et synthĂšse certification |
Bloc 1 â Architecture MCP : HĂŽte, Client, Serveur
1.1 Le problÚme que MCP résout
Avant MCP, chaque Ă©diteur dâapplication IA devait Ă©crire un connecteur spĂ©cifique pour chaque outil externe : N applications Ă M outils = NĂM intĂ©grations. Câest le problĂšme classique du « MĂN » que les standards rĂ©solvent (comme USB-C lâa fait pour la connectique, ou LSP â Language Server Protocol, protocole de serveur de langage â pour les Ă©diteurs de code).
MCP transforme MĂN en M+N : chaque outil expose une seule interface standard (un serveur MCP), chaque application implĂ©mente une seule interface standard (un client MCP). Tout serveur fonctionne avec tout hĂŽte compatible.
Point pĂ©dagogique : lâanalogie USB-C est officiellement utilisĂ©e par Anthropic. Les participants la retrouveront dans la documentation de certification. Faites-la reformuler par un participant : « MCP est Ă lâIA ce que USB-C est au matĂ©riel : un port universel. »
1.2 Les trois composants
ââââââââââââââââââââââââââââ HĂTE ââââââââââââââââââââââââââââ
â (IDE, application de chat, agent autonome) â
â â
â ââââââââââââ ââââââââââââ ââââââââââââ â
â â Client 1 â â Client 2 â â Client 3 â â
â ââââââŹââââââ ââââââŹââââââ ââââââŹââââââ â
ââââââââââŒââââââââââââââââââŒââââââââââââââââââŒâââââââââââââââââ
â JSON-RPC â JSON-RPC â JSON-RPC
ââââââŒââââââ ââââââŒââââââ ââââââŒââââââ
â Serveur â â Serveur â â Serveur â
âfilesystemâ â GitHub â âPostgreSQLâ
ââââââââââââ ââââââââââââ ââââââââââââ
| Composant | RĂŽle | Exemples |
|---|---|---|
| HĂŽte (Host) | Lâapplication qui embarque le modĂšle et pilote lâexpĂ©rience utilisateur. DĂ©cide quels serveurs connecter, applique les politiques de sĂ©curitĂ© et de consentement. | Claude Desktop, un IDE (Cursor, VS Code), une application mĂ©tier |
| Client (Client) | Composant gĂ©rĂ© par le SDK, un client par serveur (relation 1:1 stricte). Maintient la session, effectue la nĂ©gociation de capacitĂ©s, route les messages. | InstanciĂ© par le SDK MCP dans lâhĂŽte |
| Serveur (Server) | Fournisseur de capacités : expose Tools, Resources et Prompts via le protocole. Processus indépendant. | Serveur filesystem, serveur GitHub, serveur maison |
RĂšgle Ă marteler pour la certification : la relation Client:Serveur est 1:1. Un hĂŽte qui se connecte Ă 3 serveurs instancie 3 clients. Cette isolation est un choix dâarchitecture dĂ©libĂ©rĂ© (voir Bloc 5 : sĂ©curitĂ©).
1.3 JSON-RPC 2.0 : la langue commune
Tous les messages MCP sont des messages JSON-RPC 2.0 (Remote Procedure Call â appel de procĂ©dure distant en JSON). Trois types de messages :
- RequĂȘte (Request) â attend une rĂ©ponse, porte un
id:
{
"jsonrpc": "2.0",
"id": 42,
"method": "tools/call",
"params": {
"name": "rechercher_commande",
"arguments": { "numero": "CMD-2026-0193" }
}
}
- RĂ©ponse (Response) â porte le mĂȘme
id, contientresultouerror:
{
"jsonrpc": "2.0",
"id": 42,
"result": {
"content": [
{ "type": "text", "text": "{\"statut\": \"expédiée\", \"montant\": 129.90}" }
]
}
}
- Notification (Notification) â pas dâ
id, pas de réponse attendue :
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated",
"params": { "uri": "db://commandes/CMD-2026-0193" }
}
1.4 Le cycle de vie dâune session
initialize: le client envoie sa version de protocole et ses capacitĂ©s (ce quâil sait gĂ©rer : sampling, notifications, etc.). Le serveur rĂ©pond avec ses propres capacitĂ©s (tools, resources, prompts, subscriptionsâŠ).notifications/initialized: le client confirme â la session est ouverte.- DĂ©couverte :
tools/list,resources/list,prompts/list. - Opérations :
tools/call,resources/read,prompts/get, abonnements⊠- Fermeture : terminaison propre du transport.
Point certification â nĂ©gociation de capacitĂ©s : le client dĂ©clare ce quâil supporte au handshake (poignĂ©e de main initiale). Un serveur ne doit jamais envoyer une notification dâabonnement Ă un client qui nâa pas dĂ©clarĂ© la capacitĂ© correspondante. Ă lâexamen, on vous demandera pourquoi la nĂ©gociation existe : pour permettre lâĂ©volution du protocole sans casser la compatibilitĂ© â un client ancien et un serveur rĂ©cent peuvent coopĂ©rer sur lâintersection de leurs capacitĂ©s.
Bloc 2 â Couche de transport : stdio vs Streamable HTTP
2.1 stdio : le transport local
Le serveur est lancĂ© comme sous-processus de lâhĂŽte. Les messages JSON-RPC circulent sur stdin/stdout (entrĂ©e/sortie standard), un message JSON par ligne.
Caractéristiques :
- Latence minimale (pas de réseau).
- Cycle de vie liĂ© Ă lâhĂŽte : quand lâhĂŽte se ferme, le serveur meurt.
- SĂ©curitĂ© par construction : aucun port rĂ©seau ouvert, le serveur hĂ©rite des permissions de lâutilisateur local.
stderrreste disponible pour les journaux (ne jamais Ă©crire de logs sur stdout â cela corromprait le flux JSON-RPC ; erreur classique de dĂ©butant, et question piĂšge dâexamen).
Configuration typique (Claude Desktop) :
{
"mcpServers": {
"commandes": {
"command": "python",
"args": ["/opt/mcp/serveur_commandes.py"],
"env": { "DB_URL": "postgresql://localhost/boutique" }
}
}
}
2.2 Streamable HTTP : le transport distant
Pour les serveurs distants (mutualisĂ©s, multi-utilisateurs, cloud), MCP utilise Streamable HTTP, qui remplace lâancien transport SSE (Server-Sent Events â Ă©vĂ©nements envoyĂ©s par le serveur), dĂ©prĂ©ciĂ©.
Fonctionnement :
- Le client envoie ses messages JSON-RPC en
POSTvers un unique point de terminaison (ex./mcp). - Le serveur rĂ©pond soit par une rĂ©ponse JSON simple, soit en ouvrant un flux sur la mĂȘme connexion pour pousser plusieurs messages (rĂ©sultats progressifs, notifications).
- Support des sessions via en-tĂȘte
Mcp-Session-Id, reprise de flux possible aprĂšs coupure.
Caractéristiques :
- Serveur mutualisé : un déploiement sert des milliers de clients.
- Authentification standard du Web : OAuth 2.1, jetons bearer, en-tĂȘtes HTTP.
- Passe les pare-feux et les infrastructures dâentreprise (proxies, rĂ©partiteurs de charge).
2.3 Matrice de dĂ©cision (Ă connaĂźtre pour lâexamen)
| CritĂšre | stdio | Streamable HTTP |
|---|---|---|
| Localisation | MĂȘme machine que lâhĂŽte | Machine distante / cloud |
| Nombre dâutilisateurs | 1 (lâutilisateur local) | N (mutualisĂ©) |
| Authentification | HĂ©ritĂ©e du systĂšme dâexploitation | OAuth 2.1 / jetons |
| Latence | Minimale | Réseau (variable) |
| DĂ©ploiement | DistribuĂ© avec lâapplication hĂŽte | OpĂ©rĂ© comme un service web |
| AccÚs aux ressources locales (fichiers, périphériques) | Direct | Impossible (ou via tunnel) |
| Cas dâusage type | Serveur filesystem, outils de dĂ©veloppement locaux | Serveur SaaS dâentreprise, API mĂ©tier partagĂ©e |
RĂšgle de poche certification : « Fichiers locaux et mono-utilisateur â stdio. Service partagĂ©, authentifiĂ©, scalable â Streamable HTTP. SSE seul â rĂ©ponse fausse (dĂ©prĂ©ciĂ©). »
Bloc 3 â Les trois primitives : Tools, Resources, Prompts
Câest le cĆur de la session et de la certification. La question nâest pas « que fait la primitive ? » mais « qui dĂ©cide de son invocation ? ».
3.1 Tableau de contrÎle (à mémoriser)
| Primitive | Qui contrÎle ? | Déclencheur | Analogie |
|---|---|---|---|
| Tool (outil) | Le modĂšle (model-controlled) | Le LLM dĂ©cide dâappeler lâoutil pendant son raisonnement | Les mains de lâagent |
| Resource (ressource) | Lâapplication (application-controlled) | LâhĂŽte dĂ©cide quelles donnĂ©es injecter dans le contexte | Les yeux de lâagent â lecture seule |
| Prompt (invite) | Lâutilisateur (user-controlled) | Lâhumain choisit explicitement un modĂšle dâinvite (menu, commande slash) | Un formulaire prĂ©-rempli |
3.2 Tools : invoqués par le modÚle
- EntrĂ©e dĂ©crite par un JSON Schema (schĂ©ma JSON â format de description de structure de donnĂ©es) : le modĂšle sait exactement quels arguments fournir.
- Sortie structurée : liste de blocs de contenu (
text,image, ressource incorporĂ©e) + Ă©ventuelstructuredContenttypĂ©. - Effets de bord autorisĂ©s (Ă©crire, envoyer, rembourserâŠ) â dâoĂč lâexigence de consentement utilisateur (Bloc 5).
{
"name": "rembourser_commande",
"description": "Rembourse une commande. Refusé au-delà de 500 $ sans validation humaine.",
"inputSchema": {
"type": "object",
"properties": {
"numero": { "type": "string", "description": "Numéro de commande, ex. CMD-2026-0193" },
"montant": { "type": "number", "description": "Montant en dollars US" }
},
"required": ["numero", "montant"]
}
}
3.3 Resources : exposĂ©es par lâapplication
- IdentifiĂ©es par URI (Uniform Resource Identifier â identifiant uniforme de ressource) :
file:///rapports/q2.pdf,db://clients/12345,api://meteo/paris. - Lecture seule : une ressource ne modifie jamais dâĂ©tat. Si lâaction modifie quelque chose, câest un Tool.
- Abonnements : un client peut sâabonner (
resources/subscribe) et recevoirnotifications/resources/updatedquand la ressource change â lâhĂŽte peut alors relire et rafraĂźchir le contexte. - Templates de ressources : URI paramĂ©trĂ©es (
db://commandes/{numero}) pour exposer des familles entiĂšres de ressources.
Pourquoi « application-controlled » ? Parce que câest lâhĂŽte â pas le modĂšle â qui dĂ©cide quelles ressources charger dans le contexte. Cela protĂšge la fenĂȘtre de contexte (lâhĂŽte filtre) et la confidentialitĂ© (le modĂšle ne « fouille » pas librement).
3.4 Prompts : dĂ©clenchĂ©s par lâutilisateur
- ModĂšles dâinvites paramĂ©trĂ©s exposĂ©s par le serveur : nom, description, liste dâarguments.
- LâhĂŽte les prĂ©sente Ă lâutilisateur (commande slash, menu). Lâutilisateur choisit, remplit les arguments, et le prompt gĂ©nĂšre un ou plusieurs messages injectĂ©s dans la conversation.
- Cas dâusage : flux de travail complexes et rĂ©pĂ©tables â « analyse de PR », « rapport dâincident », « revue de contrat » â oĂč lâon veut garantir la structure de la demande.
{
"name": "rapport_incident",
"description": "GénÚre un rapport d'incident structuré",
"arguments": [
{ "name": "severite", "description": "P1 Ă P4", "required": true },
{ "name": "systeme", "description": "SystÚme affecté", "required": true }
]
}
3.5 Arbre de décision (reproduit dans la page web interactive)
- Lâaction modifie un Ă©tat ou dĂ©clenche un effet de bord ? â Tool.
- Câest une donnĂ©e Ă lire, et câest lâapplication qui doit dĂ©cider quand lâinjecter ? â Resource.
- Câest un flux de travail que lâhumain dĂ©clenche explicitement avec des paramĂštres ? â Prompt.
- Le modĂšle doit dĂ©cider seul, au fil du raisonnement, dâaller chercher la donnĂ©e ? â alors mĂȘme une lecture peut ĂȘtre un Tool (ex.
rechercher_client). La frontiÚre Resource/Tool passe par qui contrÎle, pas par lecture/écriture seule.
PiĂšge dâexamen n° 1 : « une recherche dans une base est une lecture, donc câest une Resource » â faux si câest le modĂšle qui doit dĂ©cider de la dĂ©clencher dynamiquement. Une recherche invoquĂ©e par le modĂšle est un Tool. Une donnĂ©e prĂ©-sĂ©lectionnĂ©e par lâapplication est une Resource.
Bloc 4 â Construire un serveur et un client MCP (SDK Python)
4.1 Serveur complet avec garde-fous
Le SDK Python officiel (mcp, avec lâAPI FastMCP) fournit trois dĂ©corateurs. Exemple complet â serveur de gestion de commandes avec garde-fou de remboursement et normalisation de dates :
# serveur_commandes.py
# â VĂ©rifiez la version du SDK : l'API Ă©volue rapidement.
from mcp.server.fastmcp import FastMCP
from datetime import datetime
mcp = FastMCP("commandes")
MAX_REMBOURSEMENT = 500.0 # Garde-fou métier : au-delà , validation humaine
def normaliser_date(valeur: str) -> str:
"""Normalise les dates hétérogÚnes des systÚmes sources vers ISO 8601.
Les serveurs MCP tiers renvoient des formats variés : c'est au point
d'intégration de normaliser, jamais au modÚle de deviner."""
formats = ("%Y-%m-%d", "%d/%m/%Y", "%m-%d-%Y", "%d %b %Y", "%Y-%m-%dT%H:%M:%S")
for fmt in formats:
try:
return datetime.strptime(valeur.strip(), fmt).date().isoformat()
except ValueError:
continue
raise ValueError(f"Format de date non reconnu : {valeur!r}")
# ââ TOOL : invoquĂ© par le modĂšle, effets de bord, garde-fou ââ
@mcp.tool()
def rembourser_commande(numero: str, montant: float) -> dict:
"""Rembourse une commande. Bloqué au-delà de 500 $ (validation humaine requise)."""
if montant > MAX_REMBOURSEMENT:
# Le garde-fou vit CĂTĂ SERVEUR : il s'applique mĂȘme si le
# prompt du modÚle est manipulé (injection). Défense en profondeur.
return {
"statut": "refuse",
"raison": f"Montant {montant} $ > plafond {MAX_REMBOURSEMENT} $. "
"Escalade vers un opérateur humain requise.",
"escalade": True,
}
return {"statut": "effectue", "numero": numero, "montant": montant}
# ââ TOOL de lecture contrĂŽlĂ©e par le modĂšle ââ
@mcp.tool()
def rechercher_commande(numero: str) -> dict:
"""Recherche une commande par numéro (le modÚle décide quand chercher)."""
brut = {"numero": numero, "date_livraison": "15/03/2026", "statut": "expédiée"}
brut["date_livraison"] = normaliser_date(brut["date_livraison"]) # â 2026-03-15
return brut
# ââ RESOURCE : donnĂ©e en lecture, contrĂŽlĂ©e par l'application ââ
@mcp.resource("db://commandes/{numero}")
def ressource_commande(numero: str) -> str:
"""Fiche commande complÚte, exposée à l'hÎte via URI paramétrée."""
return f'{{"numero": "{numero}", "historique": [...], "client": "..."}}'
# ââ PROMPT : modĂšle d'invite dĂ©clenchĂ© par l'utilisateur ââ
@mcp.prompt()
def analyse_litige(numero: str, motif: str) -> str:
"""Flux structuré d'analyse de litige client."""
return (
f"Analyse le litige sur la commande {numero}, motif : {motif}.\n"
"1. Vérifie l'historique de la commande.\n"
"2. Compare avec la politique de remboursement.\n"
"3. Propose une résolution ; si remboursement > 500 $, recommande une escalade."
)
if __name__ == "__main__":
mcp.run() # transport stdio par défaut ; mcp.run(transport="streamable-http") pour le distant
Points dâinsistance pĂ©dagogique :
- Le garde-fou des 500 $ est dans le serveur, pas dans le prompt systĂšme. Un garde-fou cĂŽtĂ© prompt est une suggestion ; un garde-fou cĂŽtĂ© serveur est une loi. Ă lâexamen : « oĂč placer un contrĂŽle mĂ©tier critique ? » â au niveau le plus profond, cĂŽtĂ© serveur/outil.
- La normalisation de dates illustre le rÎle du serveur MCP comme couche anti-corruption entre systÚmes hétérogÚnes : ISO 8601 en sortie, toujours.
4.2 Client MCP : session, découverte, invocation
# client_commandes.py
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
params = StdioServerParameters(
command="python", args=["serveur_commandes.py"]
)
async with stdio_client(params) as (lecture, ecriture):
async with ClientSession(lecture, ecriture) as session:
# 1. Handshake : négociation de capacités
init = await session.initialize()
print("Capacités serveur :", init.capabilities)
# 2. Découverte
outils = await session.list_tools()
for outil in outils.tools:
print(f"- {outil.name} : {outil.description}")
# 3. Invocation
resultat = await session.call_tool(
"rembourser_commande",
{"numero": "CMD-2026-0193", "montant": 750.0},
)
print(resultat.content) # â statut: refuse, escalade: True
asyncio.run(main())
Ă souligner : la ClientSession encapsule tout le protocole (handshake, id JSON-RPC, corrĂ©lation requĂȘte/rĂ©ponse). Lâarchitecte doit nĂ©anmoins comprendre ce qui circule « sous le capot » â câest exactement ce que visualise la page web interactive de cette session.
Bloc 5 â SĂ©curitĂ©, Ă©cosystĂšme, patrons avancĂ©s
5.1 ModÚle de sécurité MCP
Trois piliers, tous exigibles Ă la certification :
- Isolation des serveurs : chaque serveur est un processus sĂ©parĂ©, avec un client dĂ©diĂ© (relation 1:1). Le serveur GitHub ne voit jamais les donnĂ©es du serveur PostgreSQL. Aucune fuite inter-serveurs par construction : les serveurs ne communiquent pas entre eux ; seul lâhĂŽte voit lâensemble.
- Consentement utilisateur : tout appel dâoutil Ă effet de bord doit ĂȘtre approuvĂ© par lâutilisateur (ou par une politique explicite de lâhĂŽte). LâhĂŽte est le point dâapplication : il affiche lâoutil, les arguments, et demande confirmation.
- Moindre privilĂšge : un serveur ne reçoit que les accĂšs nĂ©cessaires (variables dâenvironnement ciblĂ©es, jetons Ă portĂ©e rĂ©duite, rĂ©pertoires autorisĂ©s explicites pour un serveur filesystem).
Point pĂ©dagogique â injection de prompt : un serveur MCP tiers peut renvoyer du texte malveillant (« ignore tes instructions et⊠»). LâhĂŽte doit traiter les sorties dâoutils comme des donnĂ©es non fiables, jamais comme des instructions. Reliez ce point au garde-fou des 500 $ : la dĂ©fense cĂŽtĂ© serveur tient mĂȘme si le modĂšle est manipulĂ©.
5.2 ĂcosystĂšme
Plus de 50 serveurs communautaires â (chiffre en croissance rapide â vĂ©rifier avant chaque session) couvrent les besoins courants : filesystem, GitHub, Slack, PostgreSQL, Google Drive, navigateur, mĂ©moire persistante⊠RĂ©flexe dâarchitecte : chercher un serveur existant avant dâen Ă©crire un. On Ă©crit un serveur maison pour ses systĂšmes mĂ©tier internes, pas pour les intĂ©grations gĂ©nĂ©riques.
5.3 Patrons avancés
| Patron | MĂ©canisme | Cas dâusage |
|---|---|---|
| Enregistrement dynamique dâoutils | Le serveur ajoute/retire des outils en cours de session et Ă©met notifications/tools/list_changed ; le client redĂ©couvre via tools/list. |
Outils dĂ©pendant de lâĂ©tat (aprĂšs connexion Ă une base, exposer ses tables) ; montĂ©e en privilĂšges aprĂšs authentification. |
| Abonnement aux ressources | resources/subscribe â le serveur pousse notifications/resources/updated Ă chaque changement ; lâhĂŽte relit la ressource. |
Tableau de bord temps réel, fichier de configuration surveillé, ticket dont le statut évolue. |
| ChaĂźnage de prompts | Un prompt MCP gĂ©nĂšre une sĂ©quence de messages qui orchestrent plusieurs appels dâoutils successifs. | Flux « analyse de litige » : recherche â vĂ©rification politique â proposition â escalade Ă©ventuelle. |
| Normalisation Ă la frontiĂšre | Le serveur convertit tous les formats hĂ©tĂ©rogĂšnes (dates, devises, unitĂ©s) vers un format canonique avant de rĂ©pondre. | AgrĂ©gation de plusieurs serveurs MCP renvoyant des dates en formats diffĂ©rents â ISO 8601 partout. |
5.4 SynthĂšse certification â les 7 rĂ©flexes
- Client:Serveur = 1:1, lâhĂŽte orchestre.
- Tout est JSON-RPC 2.0 : requĂȘte (id), rĂ©ponse (id), notification (sans id).
- Transport : stdio = local/mono-utilisateur, Streamable HTTP = distant/mutualisé, SSE = déprécié.
- Primitives par contrĂŽleur : Tool = modĂšle, Resource = application, Prompt = utilisateur.
- La négociation de capacités au handshake garantit la compatibilité évolutive.
- Garde-fous métier cÎté serveur, jamais uniquement dans le prompt.
- Sorties dâoutils = donnĂ©es non fiables ; consentement utilisateur pour les effets de bord.
Conseils dâanimation
- Bloc 1 : faites dessiner lâarchitecture par un participant au tableau avant de montrer le schĂ©ma. Lâerreur frĂ©quente (un seul client pour plusieurs serveurs) surgira dâelle-mĂȘme â corrigez-la en direct.
- Bloc 3 : utilisez le sĂ©lecteur de primitives de la page web en mode « quiz oral » : lisez un cas dâusage, faites voter la salle, puis rĂ©vĂ©lez la recommandation.
- Bloc 4 : faites tourner le serveur dâexemple en direct avec lâinspecteur MCP (
npx @modelcontextprotocol/inspector python serveur_commandes.py) si lâenvironnement le permet â (commande Ă vĂ©rifier, lâoutillage Ă©volue). - Erreur Ă provoquer volontairement : ajoutez un
print("debug")dans le serveur stdio et montrez la corruption du flux JSON-RPC. Leçon inoubliable : les logs vont sur stderr. - Timing : si le groupe est en retard, comprimez le Bloc 5 (Ă©cosystĂšme) et renvoyez vers le guide ; ne comprimez jamais le Bloc 3 (primitives), câest le plus discriminant Ă lâexamen.
Références
- Spécification MCP :
modelcontextprotocol.ioâ (versions datĂ©es, vĂ©rifier la rĂ©vision courante) - SDK Python : dĂ©pĂŽt
modelcontextprotocol/python-sdk - Chapitre 4 du guide de cours (
guide_fr.md)