FastMCP : Le guide complet pour la création de serveurs et clients MCP

FastMCP : Le guide complet pour la création de serveurs et clients MCP

Un tutoriel complet sur FastMCP 2.0, la manière rapide et inspirée de Python de construire des serveurs et clients MCP (Model Context Protocol). Apprenez à créer des outils, des ressources et des invites pour les applications LLM.

Leçon 6 2025-07-03 07:21

Intégrer FastMCP à l'EDI Cursor

Intégration de FastMCP avec l'IDE Cursor

L'IDE Cursor offre un excellent support pour les serveurs Model Context Protocol (MCP), vous permettant d'intégrer en toute transparence vos serveurs FastMCP directement dans votre flux de travail de développement. Ce guide vous expliquera comment configurer et utiliser les serveurs FastMCP avec Cursor.

Qu'est-ce que le protocole MCP dans Cursor ?

Le Model Context Protocol (MCP) est un protocole permettant de connecter Cursor à des outils externes et des sources de données. Au lieu d'expliquer la structure de votre projet à plusieurs reprises, vous pouvez l'intégrer directement avec vos outils.

Cursor prend en charge les serveurs MCP écrits dans n'importe quel langage capable d'imprimer sur stdout ou de servir un point de terminaison HTTP – faisant de FastMCP (Python) un choix parfait !

Pourquoi utiliser FastMCP avec Cursor ?

La simplicité et les fonctionnalités puissantes de FastMCP en font un outil idéal pour l'intégration avec Cursor :

  • Développement rapide : Créez des serveurs MCP avec un minimum de code répétitif.
  • Outils enrichis : Créez des outils sophistiqués avec une sécurité de type.
  • Accès aux ressources : Fournissez des données contextuelles à votre assistant IA.
  • Déploiement facile : Plusieurs options de transport pour différents cas d'utilisation.

Méthodes de transport

Cursor prend en charge trois méthodes de transport pour les serveurs MCP :

Transport Exécution Déploiement Utilisateurs Entrée Authentification
stdio Local Géré par Cursor Un seul utilisateur Commande Shell Manuelle
SSE Local/Distant Déploiement en tant que serveur Plusieurs utilisateurs URL du point de terminaison SSE OAuth
Streamable HTTP Local/Distant Déploiement en tant que serveur Plusieurs utilisateurs URL du point de terminaison HTTP OAuth

Pour les serveurs FastMCP, nous nous concentrerons sur la méthode stdio pour le développement et les tests locaux.

Configuration de FastMCP avec Cursor

Étape 1 : Créer votre serveur FastMCP

Premièrement, créons un simple serveur FastMCP qui fournit des outils de développement :

# cursor_dev_tools.py
import asyncio
import subprocess
from pathlib import Path
from fastmcp import FastMCP

# Créer le serveur MCP
mcp = FastMCP("Cursor Development Tools")

@mcp.tool()
def get_project_structure(max_depth: int = 2) -> str:
    """Obtenir la structure actuelle du projet jusqu'à une profondeur spécifiée."""
    try:
        result = subprocess.run(
            ["find", ".", "-type", "f", "-name", "*.py", "-o", "-name", "*.js", "-o", "-name", "*.ts", "-o", "-name", "*.json"],
            capture_output=True,
            text=True,
            cwd="."
        )
        files = result.stdout.strip().split('\n')

        # Organiser par répertoire
        structure = {}
        for file in files:
            if file:
                parts = Path(file).parts
                current = structure
                for part in parts[:-1]:
                    if part not in current:
                        current[part] = {}
                    current = current[part]
                current[parts[-1]] = "file"

        return f"Structure du projet :\n{_format_structure(structure)}"
    except Exception as e:
        return f"Erreur lors de l'obtention de la structure du projet : {str(e)}"

def _format_structure(structure, indent=0):
    """Formater le dictionnaire de structure en tant qu'arbre."""
    result = []
    for key, value in structure.items():
        prefix = "  " * indent + "├── "
        if isinstance(value, dict):
            result.append(f"{prefix}{key}/")
            result.append(_format_structure(value, indent + 1))
        else:
            result.append(f"{prefix}{key}")
    return "\n".join(result)

@mcp.tool()
def run_command(command: str, working_dir: str = ".") -> str:
    """Exécuter une commande shell dans le répertoire spécifié."""
    try:
        result = subprocess.run(
            command,
            shell=True,
            capture_output=True,
            text=True,
            cwd=working_dir,
            timeout=30
        )

        output = []
        if result.stdout:
            output.append(f"SORTIE STANDARD :\n{result.stdout}")
        if result.stderr:
            output.append(f"ERREUR STANDARD :\n{result.stderr}")

        output.append(f"Code de retour : {result.returncode}")
        return "\n\n".join(output)

    except subprocess.TimeoutExpired:
        return "La commande a expiré après 30 secondes"
    except Exception as e:
        return f"Erreur lors de l'exécution de la commande : {str(e)}"

@mcp.tool()
def search_code(pattern: str, file_extension: str = "py") -> str:
    """Rechercher des motifs de code dans les fichiers du projet."""
    try:
        result = subprocess.run(
            ["grep", "-r", "--include", f"*.{file_extension}", pattern, "."],
            capture_output=True,
            text=True
        )

        if result.returncode == 0:
            return f"Correspondances trouvées pour '{pattern}' :\n\n{result.stdout}"
        else:
            return f"Aucune correspondance trouvée pour le motif '{pattern}' dans les fichiers *.{file_extension}"

    except Exception as e:
        return f"Erreur lors de la recherche de code : {str(e)}"

@mcp.resource("file://project-docs")
async def get_project_docs():
    """Fournit la documentation du projet et les fichiers README."""
    docs = []

    # Rechercher les fichiers de documentation courants
    doc_files = ["README.md", "README.rst", "docs/README.md", "CONTRIBUTING.md"]

    for doc_file in doc_files:
        path = Path(doc_file)
        if path.exists():
            try:
                content = path.read_text()
                docs.append(f"=== {doc_file} ===\n{content}\n")
            except Exception as e:
                docs.append(f"=== {doc_file} ===\nErreur lors de la lecture du fichier : {str(e)}\n")

    if not docs:
        docs.append("Aucun fichier de documentation trouvé à la racine du projet.")

    return "\n".join(docs)

if __name__ == "__main__":
    mcp.run()

Étape 2 : Configurer le protocole MCP dans Cursor

Vous avez deux options de configuration :

Option A : Configuration spécifique au projet

Créez .cursor/mcp.json à la racine de votre projet :

{
  "mcpServers": {
    "fastmcp-dev-tools": {
      "command": "python",
      "args": ["cursor_dev_tools.py"],
      "env": {}
    }
  }
}

Option B : Configuration globale

Créez ~/.cursor/mcp.json dans votre répertoire personnel pour un accès global :

{
  "mcpServers": {
    "fastmcp-dev-tools": {
      "command": "python",
      "args": ["/chemin/vers/votre/cursor_dev_tools.py"],
      "env": {}
    }
  }
}

Étape 3 : Utilisation des variables d'environnement

Pour les serveurs qui nécessitent des clés API ou une configuration :

{
  "mcpServers": {
    "fastmcp-api-server": {
      "command": "python",
      "args": ["api_server.py"],
      "env": {
        "API_KEY": "votre-cle-api-ici",
        "DEBUG": "true"
      }
    }
  }
}

Utilisation des outils MCP dans Cursor

Utilisation automatique des outils

L'Agent Cursor Composer utilise automatiquement les outils MCP listés sous "Outils disponibles" lorsque cela est pertinent. Vos outils FastMCP apparaîtront dans l'interface de chat.

Invocation manuelle d'outils

Vous pouvez également demander des outils spécifiques par leur nom : - "Utilisez l'outil get_project_structure pour me montrer l'agencement du projet" - "Exécutez l'outil search_code pour trouver toutes les fonctions asynchrones" - "Exécutez run_command pour installer les dépendances"

Approbation des outils et exécution automatique

Par défaut, Cursor demande votre approbation avant d'utiliser les outils MCP. Vous pouvez :

  1. Approbation manuelle : Cliquez sur la flèche à côté des noms d'outils pour voir les arguments et approuver.
  2. Mode d'exécution automatique : Activez le "Mode Yolo" pour l'exécution automatique des outils sans approbation.

Fonctionnalités avancées de FastMCP pour Cursor

Retourner des images

Les serveurs FastMCP peuvent retourner des images que Cursor affichera dans le chat :

import base64
from fastmcp import FastMCP

mcp = FastMCP("Générateur d'images")

@mcp.tool()
def generate_diagram() -> dict:
    """Génère un diagramme simple et le retourne en tant qu'image."""
    # Créer ou générer votre image
    with open("diagram.png", "rb") as f:
        image_data = base64.b64encode(f.read()).decode()

    return {
        "content": [
            {
                "type": "image",
                "data": image_data,
                "mimeType": "image/png"
            }
        ]
    }

Fournisseurs de ressources complexes

Utilisez le système de ressources de FastMCP pour fournir des données contextuelles riches :

@mcp.resource("file://git-status")
async def get_git_status():
    """Fournit le statut actuel du dépôt Git."""
    try:
        # Obtenir le statut Git
        status_result = subprocess.run(
            ["git", "status", "--porcelain"],
            capture_output=True,
            text=True
        )

        # Obtenir les commits récents
        log_result = subprocess.run(
            ["git", "log", "--oneline", "-10"],
            capture_output=True,
            text=True
        )

        return f"Statut Git :\n{status_result.stdout}\n\nCommits récents :\n{log_result.stdout}"

    except Exception as e:
        return f"Erreur lors de l'obtention du statut Git : {str(e)}"

Débogage et dépannage

Affichage des journaux MCP

Pour déboguer les problèmes de serveur MCP dans Cursor :

  1. Ouvrez le panneau de sortie (⌘⇧U sur Mac, Ctrl+Shift+U sur Windows/Linux).
  2. Sélectionnez "Journaux MCP" dans le menu déroulant.
  3. Vérifiez les erreurs de connexion, les problèmes d'authentification ou les plantages du serveur.

Problèmes courants

Le serveur ne démarre pas - Vérifiez que Python et votre script sont dans le bon chemin. - Vérifiez la syntaxe de la configuration mcp.json. - Assurez-vous que toutes les dépendances sont installées.

Les outils n'apparaissent pas - Redémarrez Cursor après les modifications de configuration. - Vérifiez les journaux MCP pour les messages d'erreur. - Vérifiez que votre serveur FastMCP fonctionne correctement depuis la ligne de commande.

Erreurs de permission - Assurez-vous que le script Python a les permissions d'exécution. - Vérifiez que Cursor a accès aux répertoires spécifiés.

Test de votre serveur

Testez votre serveur FastMCP indépendamment :

# Exécutez votre serveur directement
python cursor_dev_tools.py

# Testez avec les outils clients MCP
npx @modelcontextprotocol/inspector cursor_dev_tools.py

Bonnes pratiques de sécurité

Lorsque vous utilisez des serveurs FastMCP avec Cursor :

  1. Vérifiez les sources : Utilisez uniquement des serveurs MCP provenant de développeurs de confiance.
  2. Examinez le code : Auditez le code du serveur avant l'installation, en particulier pour les projets sensibles.
  3. Limitez les permissions : Utilisez des clés API restreintes avec des permissions minimales requises.
  4. Variables d'environnement : Stockez les secrets dans des variables d'environnement, ne les codez jamais en dur.
  5. Développement local : Utilisez le transport stdio pour le travail de développement sensible.

Exemples concrets

Intégration du flux de développement

# Serveur d'outils de développement améliorés
from fastmcp import FastMCP
import subprocess
import json

mcp = FastMCP("Outils de développement avancés")

@mcp.tool()
def run_tests(test_pattern: str = "") -> str:
    """Exécute les tests du projet avec un filtrage de motif optionnel."""
    cmd = ["python", "-m", "pytest"]
    if test_pattern:
        cmd.extend(["-k", test_pattern])

    result = subprocess.run(cmd, capture_output=True, text=True)
    return f"Résultats des tests :\n{result.stdout}\n{result.stderr}"

@mcp.tool()
def format_code() -> str:
    """Formate le code Python en utilisant black."""
    result = subprocess.run(
        ["black", ".", "--check", "--diff"],
        capture_output=True,
        text=True
    )

    if result.returncode == 0:
        return "Le code est déjà formaté correctement"
    else:
        return f"Suggestions de formatage de code :\n{result.stdout}"

@mcp.tool()
def check_dependencies() -> str:
    """Vérifie les dépendances de paquets obsolètes."""
    result = subprocess.run(
        ["pip", "list", "--outdated", "--format", "json"],
        capture_output=True,
        text=True
    )

    try:
        outdated = json.loads(result.stdout)
        if outdated:
            output = "Paquets obsolètes :\n"
            for pkg in outdated:
                output += f"- {pkg['name']}: {pkg['version']} -> {pkg['latest_version']}\n"
            return output
        else:
            return "Tous les paquets sont à jour !"
    except:
        return "Erreur lors de la vérification des dépendances"

Outils d'intégration d'API

@mcp.tool()
def fetch_api_docs(api_url: str) -> str:
    """Récupère la documentation API depuis les points de terminaison OpenAPI/Swagger."""
    import requests

    try:
        response = requests.get(f"{api_url}/openapi.json", timeout=10)
        if response.status_code == 200:
            api_spec = response.json()
            return f"Documentation API pour {api_url}:\n{json.dumps(api_spec, indent=2)}"
        else:
            return f"Échec de la récupération des docs API : HTTP {response.status_code}"
    except Exception as e:
        return f"Erreur lors de la récupération des docs API : {str(e)}"

Prochaines étapes

Maintenant que FastMCP est intégré à Cursor :

  1. Explorez les outils disponibles : Consultez le répertoire d'outils MCP pour des serveurs pré-construits.
  2. Créez des outils personnalisés : Développez des outils spécifiques à votre domaine pour votre flux de travail de développement.
  3. Partagez vos serveurs : Envisagez de publier des serveurs FastMCP utiles pour la communauté.
  4. Déploiement en production : Passez au transport SSE ou HTTP pour la collaboration en équipe.

La combinaison de la facilité de développement de FastMCP et de la puissante intégration MCP de Cursor crée une expérience de développement assistée par l'IA fluide. Commencez à construire des outils qui comprennent votre codebase spécifique et votre flux de travail !

FAQ de dépannage

Q : Mon serveur FastMCP n'apparaît pas dans la liste des outils de Cursor. R : Vérifiez que la syntaxe de votre mcp.json est correcte et redémarrez Cursor. Vérifiez que le serveur fonctionne indépendamment avec python votre_serveur.py.

Q : Les outils sont appelés mais retournent des erreurs. R : Vérifiez les journaux MCP dans le panneau de sortie de Cursor. Les problèmes courants incluent des dépendances manquantes ou des répertoires de travail incorrects.

Q : Comment puis-je désactiver un serveur temporairement ? R : Allez dans Paramètres (⌘⇧J) → Fonctions → Protocole de contexte de modèle et désactivez le serveur sans supprimer la configuration.

Q : Puis-je utiliser FastMCP avec des installations Cursor distantes ? R : Pour le développement à distance, envisagez de déployer votre serveur FastMCP avec le transport SSE ou HTTP au lieu de stdio.

Avec FastMCP et Cursor, vous disposez désormais d'une plateforme puissante pour créer des outils de développement assistés par l'IA qui comprennent vos besoins spécifiques et votre base de code !