Contenu
Dans quelle situation un serveur MCP est pertinent?
Un modèle LLM comme ChatGPT est généraliste et a été entrainé sur un dataset limité bien que grand. Il ne dispose pas d’une connaissance universelle. Mais avez vous remarqué qu’une IA a toujours réponse à tous néanmoins? quitte à vous sortir des insanités? qu’on appelle des hallucinations.
Pour éviter ce phénomène d’hallucination, qui résulte d’un trou dans sa connaissance, il faut pouvoir compléter avec des données supplémentaires. Seulement voilà, le modèle de chatGPT a été entrainé déjà (et c’est ultra coûteux d’entrainer une IA, tout le monde ne dispose pas les moyens de le faire.
La solution du RAG (Retrieval Augmented Generation)
Le principe repose sur le stockage dans une base vectorielle des données, avec une base de données vectorielle comme FAISS ou ChromaDB, puis de prompter la base au lieu de prompter chatGPT, le résultat de ce prompt est envoyé à chatGPT. (prompt augmenté).
C’est une bonne solution, et vraiment adapté à certaines situation comme chatPDF. Cependant c’est un peu lourd. Nous allons voir qu’Anthropic propose une solution qui marche dans le sens inverse mais qui semble être plus légère et performante (quoique différent).
La solution MCP (Model Context Protocol)
Cette solution à base de données structurée (et c’est là la différence avec la RAG) requiert à Claude (et non chatGPT puisque qu’au moment d’écrire cet article chatGPT ne le prend pas encore en charge), de faire un sorte de requête AJAX avec un serveur MCP pour contextualiser la réponse à un prompt.
MCP ouvre tout un univers de champs d’application très intéressant, tout en préservant l’anonymat des données.
Exemple de code en Python d’un serveur MCP
Assistant RH intelligent
rh-assistant-mcp/ ├── employee_db.json ├── mcp_server.py ├── mcp_manifest.json
Notre serveur MCP est simplement un serveur REST, le différence c’est ce n’est pas vous qui requêtez en AJAX mais c’est Claude qui va le requêter (on comprend mieux pourquoi les autres vendors d’IA ne l’ont pas encore implémenté)
employee_db.json est la base de données, mcp_manifest/json va décrire la façon dont les données seront formatées en input (venant de Claude) et en output (allant vers Claude).
{
"employees": [
{
"id": "E001",
"name": "Alice Dupont",
"role": "Développeuse Backend",
"hire_date": "2021-06-12",
"skills": ["Python", "Django", "PostgreSQL"]
},
{
"id": "E002",
"name": "Bruno Martin",
"role": "Data Analyst",
"hire_date": "2022-01-20",
"skills": ["SQL", "Power BI", "Python"]
}
]
}
Le fichier manifest.json qui décrit les format d’entrée et sortie
{
"name": "employee-context",
"description": "Provides structured context about employees from the HR database.",
"version": "1.0",
"input_schema": {
"type": "object",
"properties": {
"employee_name": {
"type": "string",
"description": "Name of the employee to look up"
}
},
"required": ["employee_name"]
},
"output_schema": {
"type": "object",
"properties": {
"employee_info": {
"type": "object",
"properties": {
"role": { "type": "string" },
"hire_date": { "type": "string" },
"skills": { "type": "array", "items": { "type": "string" } }
}
}
}
}
}
Le fichier serveur avec FastAPI
from fastapi import FastAPI, Request
import json
app = FastAPI()
with open("employee_db.json", "r") as f:
db = json.load(f)
@app.post("/mcp/context")
async def provide_context(request: Request):
body = await request.json()
name = body.get("employee_name", "").lower()
for emp in db["employees"]:
if emp["name"].lower() == name:
return {
"employee_info": {
"role": emp["role"],
"hire_date": emp["hire_date"],
"skills": emp["skills"]
}
}
return {"employee_info": None}
Pour tester rapidement le serveur:
curl -X POST http://localhost:8000/mcp/context -H "Content-Type: application/json" -d '{"employee_name": "alice dupont"}'
Comment déployer ce système
Pour que Claude puisse lire le manifest.json, on peut le stocker sur une github page, ou un serveur accessible publiquement. On va notifier cette url à Claude via son interface graphique ou par API.
Le serveur REST doit être accessible publiquement, si vous le déployez en local il faut faire un tunnel vers votre serveur.
Comment utiliser ce système
Il faut que ce soit clair que dans ce cas de figure vous ne pouvez requêter Claude que par API. Quand est ce que Claude va savoir qu’il va avoir besoin de requêter le serveur MCP? C’est lui qui détermine quand il faut requêter le serveur MCP, quand il va s’apercevoir que le contexte lui manque et qu’il existe un serveur MCP décrit par le manifest.json existe.
Exemple de requête faite à Claude
vous pouvez faire en Javascript cette requête POST
POST /v1/messages
{
"model": "claude-3-opus-20240229",
"messages": [
{ "role": "user", "content": "Peux-tu me dire ce que fait Bruno Martin ?" }
],
"context_providers": [
{ "url": "https://ton-domaine.com/mcp_manifest.json" }
]
}
Pour exposer le site sur un serveur il suffit de simplement déployer sur un serveur. Une alternative serait de créer un tunnel SSH pour exposer votre site local à Claude.