MCP, Temps Réel · · per Michael Wybraniec

Serveurs MCP : Connecter l'IA aux Données en Temps Réel

Apprenez à créer un serveur Model Context Protocol (MCP) en utilisant Python et l'API Open-Meteo pour fournir des données météorologiques aux modèles de langage comme GPT-4 et Claude.

Les serveurs MCP révolutionnent la façon dont les modèles de langage interagissent avec les sources de données externes. Considérez-les comme des plugins sophistiqués qui étendent les capacités de l'IA au-delà de leurs données d'entraînement. Dans ce tutoriel complet, nous construirons un serveur MCP météorologique qui connecte Claude, GPT-4, ou tout autre LLM aux informations météorologiques en temps réel en utilisant Python et l'API Open-Meteo.

Les serveurs MCP étendent les capacités des modèles de langage en les connectant aux sources de données et services. Ce sont des applications agnostiques qui facilitent l'intégration avec n'importe quelle donnée ou service que vous pouvez imaginer. Pensez aux appels de fonction, mais les fonctions sont des plugins qui peuvent virtuellement tout faire.

Les serveurs MCP exposent trois primitives principales :

  • Ressources (contrôlées par le client) : Exposition passive de données pour le contexte
  • Outils (contrôlés par le modèle) : Fonctionnalité exécutable pour les actions
  • Prompts (contrôlés par l'utilisateur) : Workflows réutilisables et modèles

Les données météorologiques fournissent un excellent exemple pour le développement de serveurs MCP car elles démontrent l'intégration d'API du monde réel avec des applications pratiques. Les modèles de langage excellent à transformer les données météorologiques brutes (température, vitesse du vent, humidité) en descriptions en langage naturel et recommandations actionnables.

Nous utiliserons l'API Open-Meteo car elle est :

  • Gratuite pour un usage non commercial
  • Aucune clé API requise
  • Facilement configurable via les paramètres de requête
  • Parfaite pour l'intégration LLM

Avant de plonger dans le code, assurez-vous d'avoir les outils nécessaires installés. Nous utiliserons uv, un gestionnaire de paquets Python basé sur Rust qui rend la gestion des dépendances transparente.

# Créer le répertoire du projet
mkdir mcp-server-weather
cd mcp-server-weather

# Initialiser le projet uv
uv init

# Créer et activer l'environnement virtuel
uv venv
source .venv/bin/activate

# Installer les dépendances
uv add "mcp[cli]" httpx
  [{"type": "text", "text": "Prévisions pour 40.7128, -74.006 :\n\nAujourd'hui :\nTempérature : 66°F\nVent : 13 à 16 mph O\nPrincipalement Ensoleillé\n---\nCe soir :\nTempérature : 55°F\nVent : 5 à 13 mph O\nPartiellement Nuageux\n---\nLundi :\nTempérature : 71°F\nVent : 8 mph O\nEnsoleillé\n---\nLundi Soir :\nTempérature : 59°F\nVent : 3 à 8 mph O\nPrincipalement Dégagé\n---\nMardi :\nTempérature : 77°F\nVent : 3 à 7 mph SO\nEnsoleillé\n---\nMardi Soir :\nTempérature : 65°F\nVent : 5 à 8 mph S\nPrincipalement Dégagé\n---\nMercredi :\nTempérature : 82°F\nVent : 5 à 12 mph SO\nEnsoleillé\n---\nMercredi Soir :\nTempérature : 69°F\nVent : 8 à 12 mph SO\nPrincipalement Dégagé\n---\nJeudi :\nTempérature : 85°F\nVent : 7 à 12 mph SO\nPrincipalement Ensoleillé\n---\nJeudi Soir :\nTempérature : 72°F\nVent : 7 à 12 mph SO\nPartiellement Nuageux\n---\nVendredi :\nTempérature : 82°F\nVent : 7 à 12 mph SO\nPossibilité d'Averses\n---\nVendredi Soir :\nTempérature : 70°F\nVent : 7 à 12 mph SO\nPossibilité d'Averses\n---\nSamedi :\nTempérature : 76°F\nVent : 9 mph O\nPossibilité d'Averses\n---\nSamedi Soir :\nTempérature : 67°F\nVent : 6 à 9 mph NO\nPossibilité d'Averses\n---", "uuid": "fb196843-938b-4a75-b1a5-b660892f9817"}]

Ici vous pouvez voir une réponse de l'API get-weather d'un serveur MCP !

Commencez par créer l'échafaudage du serveur. Cela établit la fondation pour notre serveur MCP en utilisant FastMCP, qui simplifie la création et la gestion de serveurs.

FastMCP fournit une interface simplifiée pour définir les outils, ressources et prompts. En tirant parti de ses fonctionnalités intégrées, vous pouvez vous concentrer sur l'implémentation de la fonctionnalité sans vous soucier des détails de serveur de bas niveau.

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Initialiser le serveur FastMCP
mcp = FastMCP("weather")

# Constantes
OPENMETEO_API_BASE = "https://api.open-meteo.com/v1"
USER_AGENT = "weather-app/1.0"

# Fonction d'aide pour les requêtes API
async def make_openmeteo_request(url: str) -> dict[str, Any] | None:
    """Effectuer une requête vers l'API Open-Meteo avec gestion d'erreur appropriée."""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

if __name__ == "__main__":
    mcp.run(transport='stdio')

Les outils sont le cœur des serveurs MCP. Ils exposent des fonctionnalités exécutables que les modèles de langage peuvent invoquer. Notre outil météorologique récupérera les conditions actuelles et les prévisions basées sur les coordonnées géographiques.

@mcp.tool()
async def get_current_weather(latitude: float, longitude: float) -> str:
    """Obtenir la météo actuelle pour un emplacement.

    Args:
        latitude: Latitude de l'emplacement
        longitude: Longitude de l'emplacement
    """
    
    url = f"{OPENMETEO_API_BASE}/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m,is_day,showers,cloud_cover,wind_speed_10m,wind_direction_10m,pressure_msl,snowfall,precipitation,relative_humidity_2m,apparent_temperature,rain,weather_code,surface_pressure,wind_gusts_10m"
    
    data = await make_openmeteo_request(url)

    if not data:
        return "Impossible de récupérer les données météorologiques actuelles pour cet emplacement."

    return data

@mcp.tool()
async def get_forecast(latitude: float, longitude: float, days: int = 7) -> str:
    """Obtenir les prévisions météorologiques pour un emplacement.

    Args:
        latitude: Latitude de l'emplacement
        longitude: Longitude de l'emplacement  
        days: Nombre de jours à prévoir (1-16)
    """
    
    url = f"{OPENMETEO_API_BASE}/forecast?latitude={latitude}&longitude={longitude}&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,wind_speed_10m_max,weather_code&forecast_days={days}"
    
    data = await make_openmeteo_request(url)
    
    if not data:
        return "Impossible de récupérer les données de prévision pour cet emplacement."
    
    return data

Le MCP Inspector fournit une interface web pour tester votre serveur avant de l'intégrer avec les modèles de langage. Cet outil est inestimable pour le débogage et la validation.

# Démarrer le serveur MCP en mode développement
mcp dev server.py

# Ouvrir le navigateur sur http://localhost:5173
# Se connecter au serveur
# Naviguer vers l'onglet Outils
# Tester get_current_weather avec des coordonnées
# Exemple : latitude=63.4463991, longitude=10.8127596

Lors de la construction de serveurs MCP, résistez à la tentation de formater les données retournées dans vos outils. Au lieu de cela, retournez les données brutes et laissez le modèle de langage les traiter et les formater de manière appropriée. Cette approche tire parti des capacités de langage naturel du LLM tout en maintenant l'intégrité des données.

Meilleures Pratiques :

  • Retourner des jeux de données complets plutôt que des résumés filtrés
  • Utiliser des noms d'outils descriptifs et de la documentation
  • Implémenter une gestion d'erreur appropriée pour les échecs d'API
  • Garder les outils focalisés sur des responsabilités uniques
  • Tirer parti d'async/await pour de meilleures performances

Une fois que vous avez un serveur météorologique de base fonctionnel, considérez l'ajout de ces améliorations :

Services de Localisation : Intégrer l'API de Géocodage Open-Meteo pour convertir les noms de villes en coordonnées, réduisant la dépendance au LLM pour la génération de coordonnées.

Données Historiques : Ajouter des outils pour accéder aux modèles météorologiques historiques et aux données climatiques.

Alertes et Avertissements : Implémenter la surveillance d'alertes météorologiques pour les conditions météorologiques sévères.

Emplacements Multiples : Supporter les requêtes par lot pour comparer la météo à travers plusieurs emplacements.

@mcp.tool()
async def get_location(city: str, country: str = "") -> str:
    """Obtenir les coordonnées d'une ville en utilisant le géocodage.
    
    Args:
        city: Nom de la ville
        country: Nom du pays optionnel pour désambiguïsation
    """
    
    query = f"{city},{country}" if country else city
    url = f"https://geocoding-api.open-meteo.com/v1/search?name={query}&count=1&language=fr&format=json"
    
    data = await make_openmeteo_request(url)
    
    if not data or not data.get('results'):
        return "Emplacement non trouvé."
    
    return data['results'][0]

Votre serveur MCP peut s'intégrer avec divers modèles de langage incluant Claude Desktop, GPT-4 à travers des clients compatibles, et d'autres applications compatibles MCP. Le serveur communique à travers l'entrée/sortie standard (stdio), le rendant universellement compatible.

Pour utiliser avec Claude Desktop, ajoutez votre configuration de serveur au fichier de paramètres MCP, typiquement situé à ~/Library/Application Support/Claude/claude_desktop_config.json sur macOS.

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": ["run", "python", "server.py"],
      "cwd": "/chemin/vers/votre/mcp-server-weather"
    }
  }
}

La construction de serveurs MCP ouvre de nouvelles possibilités pour l'intégration de l'IA avec les sources de données du monde réel. Ce serveur météorologique démontre les concepts fondamentaux qui s'appliquent à toute intégration d'API externe ou de service. Le Model Context Protocol représente un pas significatif vers des systèmes d'IA plus capables et connectés.

Le code source complet pour ce tutoriel est disponible dans le dépôt des fichiers d'exercice. Expérimentez avec différentes APIs, ajoutez de nouveaux outils, et explorez les possibilités infinies du développement de serveurs MCP.

Michael Wybraniec

Michael Wybraniec

Freelance, Serveurs MCP, Développement Full-Stack, Architecture