Développement MCP 16 juin 2026 env. 22 min Model Context Protocol Appels outils IA

Développer un MCP Server from scratch :
guide complet des appels d'outils IA

Protocole · Tools / Resources / Prompts · débogage & déploiement · base de connaissances

Développer un MCP Server from scratch pour les appels d'outils IA

Les développeurs backend / IA avec des bases Python ou TypeScript partagent un blocage : Claude et GPT sont puissants, mais n'accèdent ni à votre base, ni à vos API internes, ni à vos fichiers locaux — il manque un canal standardisé vers les outils externes. Le Model Context Protocol (MCP) d'Anthropic est un protocole ouvert : les clients IA (Cursor, Claude Desktop) dialoguent en JSON-RPC avec votre serveur. À la fin de cet article, vous saurez développer et déployer un MCP Server prêt pour la production : architecture → environnement → Hello World → Tools / Resources / Prompts → transport HTTP → débogage → Docker → projet base de connaissances → écosystème 2026.

01

Introduction : pourquoi l'IA a besoin de MCP ?

Même les grands modèles ignorent vos clients CRM et les logs d'hier. La trajectoire est claire : Function Calling → Plugins → MCP. Les deux premiers restent souvent propriétaires ; MCP standardise la découverte et l'appel d'outils — écrire une fois, réutiliser sur plusieurs clients.

  1. 01

    Douleur : Claude / GPT doit interroger DB, API et fichiers — chaque format diffère.

  2. 02

    Scénario : lire vos notes Markdown dans Cursor, consulter GitHub Issues dans Claude Desktop.

  3. 03

    Promesse : du dossier vide au serveur déployable — code complet et tableau de dépannage.

02

Qu'est-ce que MCP ? Comprendre le protocole avant de coder

2.1 Genèse

Anthropic a publié MCP en novembre 2024 pour standardiser la communication IA-outils et résoudre le problème N×M d'adaptateurs. Contexte dans notre article MCP et HTTP.

2.2 Architecture

Modèle Client ↔ Server : le Client côté IA (Claude Desktop, Cursor) ; le Server expose les capacités en JSON-RPC :

  • T

    Tools : fonctions appelables — recherche, calcul, requête DB.

  • R

    Resources : données lisibles — fichiers, URLs, config.

  • P

    Prompts : modèles de prompts paramétrables.

2.3 Communication

Base JSON-RPC 2.0. Transport : stdio (sous-processus local, défaut Cursor) ou HTTP + SSE / Streamable HTTP (distant). Cycle : poignée de main → initialize → requêtes → fermeture.

2.4 Comparaison

DimensionMCPOpenAI Function CallingLangChain Tools
StandardProtocole ouvertPropriétaireLié au framework
Transportstdio / HTTPHTTPHTTP
Multi-modèleOuiNonPartiel
Resources / PromptsNatifNonNon
Écosystème 202610 000+ serveursMatureMature
03

Préparer l'environnement de développement

3.1 Choisir le langage

Python (mcp, FastMCP) pour débuter ; TypeScript (@modelcontextprotocol/sdk) pour frontend/full-stack. Cet article privilégie Python, TS en référence.

Environnement
# Python
python -m venv .venv && source .venv/bin/activate
pip install mcp httpx pydantic

# TypeScript (référence)
npm init -y && npm install @modelcontextprotocol/sdk

3.2 Structure du projet

my-mcp-server/
my-mcp-server/
├── server.py            # point d'entrée
├── tools/               # calculator.py, web_search.py
├── resources/           # file_reader.py
├── prompts/             # templates.py
├── tests/test_tools.py
├── pyproject.toml
└── README.md

3.3 Outils de débogage

  1. 1

    MCP Inspector : npx @modelcontextprotocol/inspector python server.py

  2. 2

    Claude Desktop : éditer claude_desktop_config.json.

  3. 3

    Cursor : Settings → MCP → ajouter command + args.

04

Premier MCP Server : Hello World

server.py · serveur minimal
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("my-first-server")

@mcp.tool()
def say_hello(name: str) -> str:
    """Salue une personne"""
    return f"Hello, {name}! Voici votre premier outil MCP."

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

Après python server.py, configurez Cursor avec {"command":"python","args":["/chemin/absolu/server.py"]}say_hello doit apparaître dans la liste d'outils.

Cursor / Claude Desktop

  • Chemins absolus vers server.py et le Python du venv.

  • Après modification, redémarrer la connexion MCP ou la fenêtre Cursor.

  • Demander explicitement l'appel d'outil dans le chat pour valider l'enregistrement.

05

Tools : fonctions invocables par l'IA

5.1 Structure de base

La signature sert de documentation : types, retour et docstring guident le choix d'outil. Nommage : snake_case, verbe en tête (search_web). Retourner du JSON structuré plutôt que des exceptions brutes.

5.2 Paramètres complexes (Pydantic)

Outil de recherche avec schéma
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description="Terme de recherche")
    max_results: int = Field(default=5, description="Nombre max de résultats")
    language: str = Field(default="fr", description="Langue des résultats")

@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
    """Recherche web, retourne une liste de résultats"""
    ...

5.3 Cinq outils utiles

OutilUsageAttention
CalculatriceExpressions mathast.literal_eval, pas eval
FichiersLecture/écriture localeListe blanche, normalisation de chemin
HTTPAPIs externesTimeout, retry, limite de taille
Requête DBSQL lecture seuleParamètres, pas de DDL
TempsNow, fuseauxRetour ISO 8601

5.4 Outils async

async fetch_url
@mcp.tool()
async def fetch_url(url: str) -> str:
    """Récupère le contenu d'une URL"""
    async with httpx.AsyncClient(timeout=30.0) as client:
        response = await client.get(url)
        return response.text

5.5 Gestion d'erreurs

  • !

    Réseau/IO : timeout 15–30 s.

  • !

    Ops sensibles : auth (clé API, chemins autorisés).

  • !

    {"error": "...", "hint": "..."} pour retry du modèle.

06

Resources : contenu dynamique pour l'IA

Resource vs Tool : la Resource est un fournisseur de données (lecture) ; le Tool exécute une action. Adressage URI : file://, http://, custom://.

Resources statiques et dynamiques
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
    """Configuration applicative"""
    return json.dumps({"version": "1.0", "env": "production"})

@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
    """Profil utilisateur par ID"""
    return json.dumps(db.query_user(user_id))

Types : texte (text/plain, JSON), binaire (images, PDF), flux (données live). Cas pratique : serveur filesystem avec listing, lecture, watch optionnel.

07

Prompts : modèles réutilisables

Les Prompts MCP sont des fragments paramétrables pour harmoniser les prompts d'équipe.

Prompt de revue de code
from mcp.types import PromptMessage, TextContent

@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
    """Modèle de revue de code"""
    return [PromptMessage(
        role="user",
        content=TextContent(type="text", text=f"""Revoyez ce code {language} :
1. Qualité  2. Bugs & sécurité  3. Performance

```{language}
{code}
```""")
    )]

Modèles multi-tours (user + assistant) pour entretiens ou assistant debug. Le client appelle prompts/get.

08

Avancé : transport HTTP (MCP distant)

CaractéristiquestdioHTTP + SSE
DéploiementLocalServeur distant
LatenceTrès faibleRéseau
Multi-clientNonOui
ScénarioIDE localSaaS / équipe
Streamable HTTP
mcp = FastMCP("remote-server", transport="streamable-http")

if __name__ == "__main__":
    mcp.run(host="0.0.0.0", port=8000)

Production : Bearer Token, CORS, rate limiting. Ne pas exposer un MCP HTTP non authentifié sur Internet.

09

Débogage et tests

9.1 MCP Inspector

Tester graphiquement tools/list, tools/call, logs JSON-RPC et scénarios d'erreur.

9.2 Tests unitaires (pytest + ClientSession)

test_calculator_tool
@pytest.mark.asyncio
async def test_calculator_tool():
    server_params = StdioServerParameters(command="python", args=["server.py"])
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool("calculate", {"expression": "2 + 2"})
            assert result.content[0].text == "4"

9.3 Erreurs fréquentes

ErreurCauseSolution
Outil absentChemin config incorrectVérifier chemin absolu
Échec JSONType non sérialisableConvertir en str ou dict
TimeoutExécution lenteAsync + timeout
Permission refuséeChemin / TCCWhitelist / VNC pour dialogue
10

Déploiement en production

10.1 Docker

Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "server.py"]

10.2 Options cloud

  • Railway / Render : projets personnels rapides.

  • Lambda / Cloud Run : serverless — cold start, limites stdio.

  • VPS + Nginx : reverse proxy, TLS, rate limit.

10.3 Observabilité

Logs structurés, métriques Prometheus, Sentry, /health. Déclarer la version MCP, étendre les outils de façon rétrocompatible.

11

Cas pratique : MCP Server base de connaissances

Objectif : l'IA recherche vos notes Markdown locales, index sémantique, création de notes. Dans Cursor : « Qu'ai-je noté sur MCP la semaine dernière ? »

Stack

ComposantRecommandation
Base vectorielleChromaDB / Qdrant (local)
Embeddingstext-embedding-3-small
Surveillance fichierswatchfiles pour index incrémental

Tools principaux

  1. 1

    index_notes : scanner le répertoire, index vectoriel.

  2. 2

    semantic_search : recherche sémantique.

  3. 3

    write_note : créer ou ajouter du Markdown.

  4. 4

    Resource : notes://{path} pour une note.

semantic_search économise des tokens vs injecter toute la bibliothèque et améliore la précision.

12

Écosystème MCP et perspectives 2026

Serveurs open source recommandés

  • mcp-server-filesystem — système de fichiers

  • mcp-server-github — GitHub

  • mcp-server-brave-search — recherche web

  • mcp-server-postgres — base de données

  • mcp-server-slack — Slack

En 2026, Cursor, Claude Desktop, OpenAI, Google Gemini et Microsoft supportent MCP ; marketplace et sécurité entreprise (OAuth 2.1, audit) mûrissent. Docs : modelcontextprotocol.io ; SDK Python : github.com/modelcontextprotocol/python-sdk.

Cinq étapes (Mac distant inclus)

  1. 1

    Choisir l'hôte (Cursor / Claude Desktop), vérifier le support MCP en version 2026.

  2. 2

    Développer en stdio local, valider tools/list avec Inspector.

  3. 3

    Enregistrer dans Cursor MCP, smoke test Hello World.

  4. 4

    Serveurs navigateur, trousseau, capture d'écran : session GUI macOS pour TCC (SSH insuffisant).

  5. 5

    HTTP + Docker + auth en prod ; lier au guide Agent Skill et au MCP navigateur.

13

FAQ

Python (mcp + FastMCP) le plus rapide ; TypeScript (@modelcontextprotocol/sdk) pour les équipes Node. Couche protocole identique.

IDE local : stdio. Multi-utilisateur / SaaS : HTTP + SSE / Streamable HTTP avec authentification.

Tools exécutent des actions ; Resources fournissent des données en lecture via des URI.

MCP navigateur, trousseau et capture d'écran déclenchent les dialogues TCC macOS. SSH ne peut pas cliquer « Toujours autoriser » — session VNC sur l'hôte requise.

Conclusion

MCP est le protocole standard du tooling IA — maîtriser la chaîne du Hello World à la production est une compétence clé en 2026. Quel outil allez-vous construire ensuite ?

Le coût caché est rarement le code, mais l'environnement d'exécution : Windows + Mac cloud + Cursor MCP exige dialogues TCC, venv et logs Inspector dans une même session bureau. Un Mac mini personnel ajoute veille, mises à jour et amortissement ; 8 Go de RAM suffisent mal avec index vectoriel et serveurs parallèles.

Pour valider MCP à l'heure avec GUI sur la même machine que Cursor, louez un Mac distant via VNCMac — bouton principal vers les tarifs, offres sur l'accueil.