Architecture MCP : JSON-RPC 2.0 sous le capot
Le Model Context Protocol (MCP), publie par Anthropic en fin 2024 et stabilise en 2026, repose sur JSON-RPC 2.0 sur un transport stdio ou HTTP+SSE. Cette specification ouverte permet a n'importe quel LLM compatible (pas seulement Claude) de dialoguer avec des serveurs d'outils tiers. En 2026, MCP est implemente par Claude Code, Cursor, Continue, Zed, et plusieurs IDE JetBrains.
Les trois primitives fondamentales :
- Resources : donnees exposees en lecture (fichiers, rows de DB, documents)
- Tools : actions executables par le LLM (requete SQL, appel API, commande shell)
- Prompts : templates de prompts reutilisables fournis par le serveur
Chaque echange suit le format JSON-RPC : {"jsonrpc":"2.0","method":"tools/call","params":{...},"id":1}. Le serveur repond avec {"jsonrpc":"2.0","result":{...},"id":1} ou une erreur structuree.
Exemple : serveur MCP custom en Python
#!/usr/bin/env python3
"""Serveur MCP minimal exposant un outil 'search_docs'."""
import asyncio
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
server = Server("docs-search")
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="search_docs",
description="Cherche dans la documentation interne",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string"}
},
"required": ["query"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "search_docs":
query = arguments["query"]
# TODO: brancher sur un index Qdrant / Elastic / SQLite FTS
results = f"Resultats simulés pour: {query}"
return [TextContent(type="text", text=results)]
raise ValueError(f"Outil inconnu: {name}")
async def main():
async with stdio_server() as (read, write):
await server.run(read, write, server.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
Exemple : serveur MCP custom en TypeScript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{ name: "docs-search", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [{
name: "search_docs",
description: "Cherche dans la documentation interne",
inputSchema: {
type: "object",
properties: { query: { type: "string" } },
required: ["query"]
}
}]
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "search_docs") {
const { query } = request.params.arguments as { query: string };
return { content: [{ type: "text", text: `Resultats pour: ${query}` }] };
}
throw new Error("Outil inconnu");
});
const transport = new StdioServerTransport();
await server.connect(transport);
Securite et sandboxing MCP
Un serveur MCP tourne en processus local avec les droits de l'utilisateur qui le lance. Regles de securite a appliquer systematiquement :
- Principe de moindre privilege : ne donner au serveur que les permissions minimales (read-only DB, scopes OAuth limites, tokens GitHub a portee restreinte)
- Secrets hors du code : jamais de cle API en dur, toujours des variables d'environnement ou un vault (1Password, Vault, AWS Secrets Manager)
- Whitelist d'operations : ne pas exposer
rm -rf ou des DELETE FROM sans confirmation utilisateur
- Journalisation : chaque appel d'outil doit etre loggue (timestamp, nom, parametres anonymises)
- Sandboxing : pour les serveurs executant du code, utiliser un conteneur Docker ou un environnement virtualise
- Signature : en 2026, un registre MCP signe par Anthropic se met en place — privilegier les serveurs signes pour les installations en entreprise
Debugger avec MCP Inspector
MCP Inspector est l'outil officiel fourni par Anthropic pour tester un serveur MCP en isolation avant de le brancher a Claude Code. Il offre une interface web locale pour :
- Lister les tools, resources et prompts exposes
- Appeler un tool avec des parametres custom et voir la reponse JSON-RPC complete
- Verifier la conformite au schema declare
- Mesurer les temps de reponse
# Lancement de MCP Inspector sur un serveur local
npx @modelcontextprotocol/inspector node dist/mon-serveur.js
# Ou pour un serveur Python
npx @modelcontextprotocol/inspector python mon-serveur.py
# Puis ouvrir http://localhost:5173
FAQ MCP Claude Code
MCP est-il specifique a Claude ou universel ?
Universel. MCP est une specification ouverte publiee par Anthropic mais adoptee par de nombreux outils (Cursor, Continue, Zed). N'importe quel LLM compatible (Claude Sonnet 4.6, Opus 4.7, Haiku 4.5 ou tout modele externe) peut consommer un serveur MCP.
Mes donnees transitent-elles par Anthropic avec MCP ?
Les serveurs MCP tournent en local ou sur votre infra. Les donnees echangees avec le LLM sont envoyees a Anthropic uniquement via les appels API classiques de Claude — ce qui est le cas de toute utilisation d'un LLM. MCP ne cree pas de flux reseau supplementaire vers Anthropic.
Combien de serveurs MCP peut-on lancer simultanement ?
En pratique, 10 a 20 serveurs chargés en parallele sans impact perceptible sur une machine moderne. Chaque serveur consomme peu de memoire au repos. Au-dela, surveiller la RAM et envisager un loader lazy.
Quels serveurs MCP sont prets a l'emploi en 2026 ?
Plus de 200 serveurs maintenus : PostgreSQL, MySQL, SQLite, GitHub, GitLab, Slack, Linear, Notion, Google Workspace, Filesystem, Puppeteer, Brave Search, Sentry, Stripe, AWS, etc. Le repo officiel modelcontextprotocol/servers liste l'ecosysteme.
Faut-il un backend pour creer un serveur MCP ?
Non. Un serveur MCP peut etre un simple script Python ou Node.js en stdio, sans port reseau. Pour des usages multi-utilisateurs ou distants, une variante HTTP+SSE est possible mais rarement necessaire.
Comment partager un serveur MCP avec une equipe ?
Publier sur un repo Git interne + un fichier .mcp.json versionne a la racine du projet decrivant les serveurs requis. Claude Code lit automatiquement .mcp.json au demarrage et propose l'installation.