Déployer un serveur MCP avec FastMCP pour exposer vos outils internes aux agents IA
Le Model Context Protocol (MCP) est un standard ouvert initié par Anthropic qui permet à des agents IA — comme Claude — d’interagir avec des services externes via des outils définis. Plutôt que de tout coder dans le prompt, vous exposez des fonctions structurées que l’agent peut appeler à la demande.
Dans cet article, nous voyons comment créer un serveur MCP simple en Python avec la bibliothèque FastMCP, le sécuriser derrière Nginx, et le connecter à Claude Desktop ou à un agent custom.
Pourquoi MCP plutôt qu’une simple API ?
Une API REST classique peut être consommée par n’importe quel client HTTP. Mais un agent IA a besoin de comprendre ce qu’une fonction fait, quand l’appeler, et comment interpréter le résultat. MCP fournit ce contrat sémantique :
- Chaque outil est décrit avec un nom, une description en langage naturel, et un schéma JSON des paramètres.
- Le LLM décide lui-même d’appeler l’outil selon le contexte de la conversation.
- Le serveur MCP reste découplé du modèle : vous pouvez l’utiliser avec Claude, GPT-4, Mistral, ou votre propre agent.
Prérequis
- Python 3.11+
- Un serveur Linux (Debian/Ubuntu) avec Nginx installé
- Claude Desktop ou un client MCP compatible
1. Installer FastMCP
pip install fastmcp
FastMCP est une surcouche légère au SDK MCP officiel. Elle utilise des décorateurs Python pour déclarer les outils, ce qui rend le code très lisible.
2. Créer un serveur MCP minimal
Créez un fichier server.py :
from fastmcp import FastMCP
mcp = FastMCP("Outils internes Askem")
@mcp.tool()
def lister_projets() -> list[str]:
"""Retourne la liste des projets actifs."""
# Ici vous pouvez interroger une BDD, un fichier, une API interne...
return ["Portail open data", "Migration Drupal 10", "Keycloak SSO"]
@mcp.tool()
def statut_serveur(nom: str) -> dict:
"""Retourne le statut d'un serveur par son nom."""
serveurs = {
"web01": {"statut": "actif", "charge": "23%"},
"data01": {"statut": "maintenance", "charge": "0%"},
}
return serveurs.get(nom, {"statut": "inconnu"})
if __name__ == "__main__":
mcp.run(transport="sse", host="127.0.0.1", port=8765)
Le transport sse (Server-Sent Events) est recommandé pour les déploiements distants. Le serveur écoute uniquement en local — Nginx se chargera d’exposer le point d’entrée vers l’extérieur.
3. Lancer le serveur en tant que service systemd
Créez /etc/systemd/system/mcp-askem.service :
[Unit]
Description=Serveur MCP Askem
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/mcp-askem
ExecStart=/usr/bin/python3 /opt/mcp-askem/server.py
Restart=always
[Install]
WantedBy=multi-user.target
systemctl enable --now mcp-askem
4. Configurer Nginx en reverse proxy
Ajoutez un bloc location dans votre vhost Nginx :
location /mcp/ {
proxy_pass http://127.0.0.1:8765/;
proxy_http_version 1.1;
# Nécessaire pour SSE
proxy_set_header Connection '';
proxy_buffering off;
chunked_transfer_encoding on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Rechargez Nginx :
nginx -t && systemctl reload nginx
Votre serveur MCP est maintenant accessible sur https://votre-domaine.eu/mcp/sse.
5. Connecter Claude Desktop
Dans le fichier de configuration de Claude Desktop (~/.config/claude/claude_desktop_config.json sur Linux, ou ~/Library/Application Support/Claude/claude_desktop_config.json sur macOS) :
{
"mcpServers": {
"askem": {
"url": "https://votre-domaine.eu/mcp/sse"
}
}
}
Redémarrez Claude Desktop. Les outils lister_projets et statut_serveur apparaissent automatiquement dans l’interface.
6. Sécuriser l’accès
Pour un usage en production, ajoutez une authentification simple par token dans Nginx :
location /mcp/ {
# Vérification d'un token Bearer
if ($http_authorization != "Bearer MON_TOKEN_SECRET") {
return 401;
}
proxy_pass http://127.0.0.1:8765/;
# ... reste de la config
}
Côté Claude Desktop, ajoutez le header dans la config :
{
"mcpServers": {
"askem": {
"url": "https://votre-domaine.eu/mcp/sse",
"headers": {
"Authorization": "Bearer MON_TOKEN_SECRET"
}
}
}
}
Aller plus loin
- Exposer des requêtes CKAN pour permettre à l’agent d’interroger votre portail open data en langage naturel.
- Connecter un outil MCP à l’API Gitea pour créer des issues ou consulter des dépôts depuis une conversation.
- Utiliser
fastmcpavec des ressources (lecture de fichiers, logs) en plus des outils. - Déployer plusieurs serveurs MCP spécialisés et les agréger via un proxy MCP.
Cet article fait partie de la série Agents IA en pratique sur askem.eu. Pour toute question : louis@askem.eu
