Tu utilises Claude ou ChatGPT tous les jours. Tu gères — prompts, relances, toute la danse. Mais dès que tu as besoin de données depuis le CRM de ta boîte, le gestionnaire de projets ou la base interne, tu te transformes en câble USB humain : copier depuis l'onglet A, coller dans l'onglet B du chatbot, rincer, répéter jusqu'à ce que ton âme quitte ton corps.

Voilà ce que la plupart des tutos ne te diront jamais clairement : l'écart entre « une IA qui connaît internet » et « une IA qui connaît ton entreprise », c'est exactement un fichier Python. Pas une migration de plateforme. Pas un contrat fournisseur à six chiffres. Un seul fichier avec un décorateur et une docstring. Le protocole existe déjà, tous les grands acteurs de l'IA l'ont adopté, et tu peux le brancher en un après-midi. Je te montre.

Pourquoi les solutions évidentes ne marchent pas

« Utilise l'API » — super conseil, sauf que ton IA n'a pas de mains. Elle ne peut pas appeler l'API REST de ta boîte (une URL qui renvoie des données quand tu lui demandes gentiment) toute seule. Tu pourrais coller la doc de l'API dans le chat, mais ça dévore ta fenêtre de contexte — la quantité de texte que l'IA peut « voir » en même temps, sa mémoire de travail — et c'est toujours toi qui fais le copier-coller. Les intégrations style Zapier existent, mais elles sont rigides : déclencheurs prédéfinis, actions prédéfinies, et une grille tarifaire qui fait pleurer ton DAF.

Ce qu'il te faut vraiment, c'est un moyen de laisser ton IA découvrir et appeler tes outils internes directement — sans que tu serves d'intermédiaire.

MCP : le standard qui a résolu le problème

MCP (Model Context Protocol), c'est une prise universelle pour les outils d'IA — imagine l'USB-C, mais pour connecter l'IA à tes données. Anthropic l'a rendu open-source en novembre 2024. En mars 2026, il a atteint 97 millions de téléchargements mensuels du SDK. OpenAI, Google et Microsoft l'ont tous adopté. Au 26 avril 2026, plus de 17 000 serveurs MCP sont indexés dans les registres.

Le SDK Python te permet de construire un serveur fonctionnel dans un seul fichier. Voici comment.

Étape 1 : Installer le SDK

Il te faut Python 3.10+ et soit uv (le gestionnaire de paquets recommandé par Anthropic), soit bon vieux pip.

# Option A : uv (recommandé)
uv init my-mcp-server && cd my-mcp-server
uv add "mcp[cli]" httpx

# Option B : pip
pip install "mcp[cli]" httpx

httpx est une bibliothèque HTTP Python — c'est ce que ton serveur utilise pour récupérer des données depuis des API externes. Si tes données vivent dans une base, remplace-le par ton driver de base de données.

Étape 2 : Écrire le serveur

Crée server.py. Voici un serveur MCP complet qui récupère les alertes météo du National Weather Service américain — une vraie API, pas besoin de clé d'auth, parfait pour apprendre :

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

# FastMCP — un wrapper haut niveau qui transforme
# de simples fonctions Python en outils MCP
mcp = FastMCP("weather")

NWS_API_BASE = "https://api.weather.gov"

async def make_request(url: str) -> dict[str, Any] | None:
    headers = {
        "User-Agent": "mcp-weather-demo/1.0",
        "Accept": "application/geo+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

@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get active weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    """
    data = await make_request(
        f"{NWS_API_BASE}/alerts/active/area/{state}"
    )
    if not data or "features" not in data:
        return "No alerts found."

    alerts = []
    for feature in data["features"][:5]:
        props = feature["properties"]
        alerts.append(
            f"Event: {props.get('event', 'Unknown')}\n"
            f"Area: {props.get('areaDesc', 'Unknown')}\n"
            f"Severity: {props.get('severity', 'Unknown')}"
        )
    return "\n---\n".join(alerts) or "No active alerts."

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

Environ 40 lignes de vrai code. Le décorateur @mcp.tool() — un raccourci Python qui enregistre ta fonction comme outil appelable par l'IA — fait le gros du travail. FastMCP lit tes annotations de type (state: str) et ta docstring (la description entre triples guillemets) pour générer automatiquement les définitions d'outils que l'IA comprend.

C'est le pattern de base. Chaque serveur MCP que tu as croisé — Slack, GitHub, Figma, les 17 000+ — c'est ce même squelette avec plus d'endpoints.

Étape 3 : Le brancher à Claude Desktop

Claude Desktop lit un fichier de config JSON (un fichier de paramètres dans un format spécifique) pour savoir quels serveurs MCP lancer. Tu le trouves ici :

  • macOS : ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows : %APPDATA%\Claude\claude_desktop_config.json

Crée-le ou modifie-le :

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "/chemin/absolu/vers/my-mcp-server",
        "run",
        "server.py"
      ]
    }
  }
}

Remplace /chemin/absolu/vers/my-mcp-server par le vrai chemin complet. Les chemins relatifs ne marchent pas — c'est le piège classique du premier essai.

Redémarre Claude Desktop. Cherche l'icône marteau en bas à droite de la zone de saisie. Clique dessus — tu devrais voir get_alerts dans la liste. Si ce n'est pas le cas, vérifie ~/Library/Logs/Claude/mcp*.log sur macOS pour les erreurs.

Étape 4 : Poser une question à Claude

Tape : « Y a-t-il des alertes météo en Californie en ce moment ? »

Claude reconnaît qu'il dispose d'un outil get_alerts, te demande la permission de l'appeler, interroge ton serveur, et répond avec des données NWS en temps réel auxquelles il n'avait pas accès cinq minutes plus tôt.

C'est le moment « aha ». Ton chatbot vient d'arrêter d'être générique.

Étape 5 : Remplacer l'API météo par la tienne

Maintenant, remplace make_request par l'API qu'utilise ton équipe — Jira, Linear, ton dashboard interne. Si elle a un endpoint qui renvoie des données, elle est à une fonction de devenir un outil IA. Le pattern est toujours le même :

  1. Écris une fonction async qui récupère des données
  2. Décore-la avec @mcp.tool()
  3. Écris une docstring claire (j'explique pourquoi c'est crucial juste en dessous)
  4. Ajoute-la à ta config, redémarre

Quelques principes de design qui séparent les outils MCP utiles des outils frustrants : nomme tes outils avec des paires verbe-nom (get_alerts, search_tickets, create_issue) pour que le modèle puisse déduire l'intention rien qu'à partir du nom. Garde chaque outil centré sur une seule action — une fonction qui récupère, filtre et écrit en retour, c'est trois outils qui se font passer pour un seul. Et pour le design des paramètres, préfère des arguments typés et explicites plutôt que des strings fourre-tout ; state: str avec une docstring qui dit « Code d'état US à deux lettres » donne au modèle assez d'info pour valider lui-même ses entrées.

Les pièges qui vont te mordre

1. La description de ton outil, C'EST le produit

Une étude de Queen's University de février 2026 a analysé 856 outils MCP à travers 103 serveurs. Résultat : 97,1 % des descriptions d'outils avaient au moins un défaut de qualité. 56 % n'arrivaient même pas à formuler leur propre raison d'être. Quand les chercheurs ont amélioré les descriptions, les taux de réussite des tâches ont bondi de +5,85 points. Ta docstring, ce n'est pas de la documentation — c'est l'interface utilisateur que ton IA lit. Rédige-la comme une spec produit : objectif, explication des paramètres, limites, exemples.

2. Jamais de print() sur stdout

Pour les serveurs en mode stdio (ce qu'utilise Claude Desktop), écrire sur stdout corrompt les messages JSON-RPC — le protocole que ton IA et ton serveur utilisent pour communiquer. Ton serveur casse silencieusement et tu passes 45 minutes à fixer le vide. Utilise print("debug", file=sys.stderr) ou le module logging de Python.

3. La sécurité, c'est TON problème

MCP n'a aucune authentification intégrée pour les serveurs locaux. C'est acceptable quand ça tourne sur ton portable via stdio — juste un process local. Mais dès que tu envisages de l'exposer en HTTP : stop. Le Top 10 OWASP pour MCP, publié début 2026, existe parce que des gens ont sauté cette étape. Plus de trente CVE ont touché les outils MCP rien qu'en janvier-février 2026. FastMCP lui-même avait une vulnérabilité d'injection de commande (CVE-2025-64340, divulguée fin 2025) dans toutes les versions antérieures à 3.2.0.

Si ton serveur touche des API internes, traite-le comme n'importe quel service backend : valide chaque entrée envoyée par le modèle (il va halluciner des valeurs de paramètres — compte dessus), applique le principe du moindre privilège pour que chaque outil n'accède qu'aux données dont il a besoin, et fixe les versions de tes dépendances. Le stdio local est le seul mode sûr par défaut tant que tu n'as pas résolu l'auth correctement.

4. Le chemin dans la config doit être absolu

Les chemins relatifs dans claude_desktop_config.json échouent silencieusement. Pas d'erreur, pas de log, juste une icône marteau manquante et un développeur qui perd doucement la foi. Utilise /Users/tonnom/... sur macOS — l'expansion du tilde n'est pas fiable ici.

Ce que tu peux faire maintenant

Tu possèdes un pattern reproductible. N'importe quelle API qu'utilise déjà ton équipe — gestionnaire de projets, CRM, dashboard interne, base de données — est à un fichier Python de devenir quelque chose que ton IA peut interroger directement. Pas de liste d'attente d'intégration fournisseur. Pas de taxe Zapier. Plus de copier-coller entre les onglets comme si on était en 2019.

Le mur entre « une IA qui connaît internet » et « une IA qui connaît ton entreprise » a maintenant une porte. Tu l'as construite en moins de lignes qu'un fichier de config classique.