Créer un MCP Server de zéro : guide complet pour les développeurs

En 2026, l'écosystème MCP dépasse les 10 000 serveurs ; Cursor, Claude Desktop et VS Code le supportent nativement. De la théorie du protocole aux trois capacités Tools / Resources / Prompts, en passant par le déploiement HTTP distant et un projet de base de connaissances personnelle, ce guide vous permet de livrer un MCP Server prêt pour la production.

Un grand modèle, aussi performant soit-il, ne peut pas interroger votre base de données, appeler vos API internes ni lire vos fichiers locaux sans un canal standardisé d'appel d'outils. Le Model Context Protocol (MCP), protocole ouvert d'Anthropic, permet à Claude, GPT ou Cursor de découvrir et d'invoquer vos serveurs via JSON-RPC. Ce guide s'adresse aux ingénieurs backend et IA maîtrisant Python ou TypeScript : (1) comprendre l'architecture MCP et ses mécanismes de communication ; (2) monter l'environnement et écrire un Hello World ; (3) développer les trois capacités Tools, Resources et Prompts ; (4) passer au transport HTTP et au déploiement production ; (5) réaliser un projet concret de base de connaissances. Pour le contexte protocolaire, croisez avec notre analyse MCP en profondeur et le guide Cursor Agent Skills.

00Pourquoi l'IA a besoin de MCP : du Function Calling au protocole ouvert

Les modèles actuels peinent à accéder aux outils externes et aux données en temps réel — c'est précisément le vide que MCP comble. Vous voulez que Claude interroge une base, que GPT appelle une API REST, que Cursor manipule le système de fichiers : MCP fournit un contrat commun. L'appel d'outils a suivi l'évolution Function Calling → Plugins → MCP : Function Calling reste lié à un éditeur ; les plugins restent fermés ; MCP, lui, est un standard ouvert multi-modèle et multi-client.

Conçu par Anthropic en novembre 2024, MCP vise à standardiser la communication entre l'IA et les outils externes, en sortant du piège N modèles × M outils = N×M intégrations sur mesure. À la fin de ce guide, vous serez capable de développer et déployer un MCP Server prêt pour la production.

ÉcueilsSans MCP, l'intégration d'outils devient un cauchemar

  • Duplication permanente : réécrire la logique d'accès au système de fichiers pour Cursor, Claude Desktop et VS Code.
  • Changement de modèle = réécriture : migrer de Claude vers GPT implique de reconstruire toute la couche d'intégration.
  • Pas de standard pour ressources et prompts : Function Calling ne gère que l'invocation de fonctions, sans exposer nativement des ressources en lecture seule ni des modèles de prompt réutilisables.
  • Débogage opaque : en cas d'échec d'appel d'outil, aucun inspecteur unifié ni journal JSON-RPC partagé.

01Architecture MCP : Client, Server et les trois capacités

Le Client vit côté modèle (Claude Desktop, Cursor, client personnalisé) ; le Server est le fournisseur de capacités que vous développez. Ils communiquent en JSON-RPC 2.0, via stdio (processus local) ou HTTP + SSE (service distant). Le cycle de vie suit : poignée de main d'initialisation → négociation des capacités → requêtes/réponses → fermeture.

Le Server expose trois capacités fondamentales :

  • Tools : fonctions invocables par l'IA (recherche, calcul, requête base de données)
  • Resources : contenus lisibles par l'IA (fichiers, URL, flux de données)
  • Prompts : modèles de prompt prédéfinis
DimensionMCPOpenAI Function CallingLangChain Tools
StandardisationProtocole ouvertPropriétaire éditeurLié au framework
Transportstdio / HTTPHTTPHTTP
Multi-modèleOuiNonPartiel
Ressources / promptsSupport natifNon supportéNon supporté
ÉcosystèmeCroissance rapide (10 000+ serveurs)MatureMature

02Préparer l'environnement : Python en priorité, TypeScript en miroir

Python (recommandé pour débuter) : SDK officiel mcp, syntaxe concise avec FastMCP. TypeScript (recommandé pour front-end et full-stack) : SDK officiel @modelcontextprotocol/sdk. Ce guide privilégie Python ; TypeScript est indiqué en parallèle lorsque pertinent.

Configuration de l'environnement
# Python
python -m venv .venv
source .venv/bin/activate
pip install mcp

# TypeScript (miroir)
npm init -y
npm install @modelcontextprotocol/sdk

Structure de projet recommandée :

my-mcp-server/
my-mcp-server/
├── server.py
├── tools/
│   ├── calculator.py
│   └── web_search.py
├── resources/
│   └── file_reader.py
├── prompts/
│   └── templates.py
├── tests/
│   └── test_tools.py
├── pyproject.toml
└── README.md

Outils de débogage : MCP Inspector (interface officielle), Claude Desktop pour les tests locaux, configuration .cursor/mcp.json dans Cursor. Documentation officielle sur modelcontextprotocol.io.

03Premier MCP Server : Hello World

server.py
from mcp.server.fastmcp import FastMCP

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

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

if __name__ == "__main__":
    mcp.run()
Lancement et vérification
python server.py
npx @modelcontextprotocol/inspector python server.py

Dans .cursor/mcp.json (Cursor) ou claude_desktop_config.json (Claude Desktop), configurez command et args pour pointer vers python server.py. Redémarrez le client et vérifiez que l'outil apparaît dans le contexte IA.

04Tools : développer des outils invocables par l'IA

La signature de fonction sert de documentation : types de paramètres, type de retour et docstring sont convertis par MCP en JSON Schema pour le modèle. Utilisez snake_case pour les noms ; renvoyez des erreurs structurées plutôt que des exceptions brutes.

Paramètres d'entrée Pydantic
from pydantic import BaseModel, Field

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

@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
    """Effectuer une recherche web et retourner une liste de résultats"""
    ...

Cinq outils pratiques à implémenter pour s'entraîner :

  • Calculatrice : évaluation d'expressions mathématiques (eval nécessite un bac à sable)
  • Lecture/écriture de fichiers : accès aux fichiers locaux dans un répertoire autorisé
  • Requêtes HTTP : appel d'API REST externes
  • Requête base de données : exécution de SQL en lecture seule
  • Outil horaire : heure courante, conversion de fuseau horaire
Outil asynchrone
import httpx

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

Bonnes pratiques : renvoyer des erreurs structurées, définir un timeout (recommandé 30 s), valider les permissions côté Server et ne jamais exposer les identifiants dans la configuration client.

05Resources : permettre à l'IA de lire du contenu dynamique

Resource vs Tool : une Resource fournit des données (lecture seule) ; un Tool exécute une action. Adressage par URI : file://, http://, custom://.

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

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

Types de ressources : texte (text/plain, application/json), binaire (images, PDF) et flux (données temps réel). Un serveur de ressources système de fichiers peut lister des répertoires, lire des fichiers et écouter les changements (abonnement aux ressources).

06Prompts : définir des modèles de prompt réutilisables

Un Prompt MCP est un fragment de prompt prédéfini, avec injection dynamique de paramètres, pour garantir cohérence et maintenabilité. Vous pouvez définir des modèles multi-tours incluant user et assistant — idéal pour revue de code, simulation d'entretien ou assistant de débogage.

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

@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
    return [
        PromptMessage(
            role="user",
            content=TextContent(
                type="text",
                text=f"Veuillez examiner le code {language} suivant..."
            )
        )
    ]

07Avancé : mode transport HTTP (MCP Server distant)

CaractéristiquestdioHTTP + SSE
DéploiementProcessus localServeur distant
LatenceTrès faibleDépend du réseau
Multi-clientsNonOui
Cas d'usageOutils locauxSaaS / partage d'équipe
Démarrage en mode HTTP
mcp = FastMCP("remote-server", transport="streamable-http")

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

En production, configurez l'authentification Bearer Token, un middleware de validation de clé API, CORS et la limitation de débit. Centralisez les identifiants côté Server, pas dans chaque client.

Point de référence 1 : en 2026, l'écosystème MCP compte plus de 10 000 serveurs.

Point de référence 2 : après adoption de MCP, les entreprises constatent une baisse de 38 à 55 % du coût de développement d'intégrations d'outils (fourchette observée dans les études sectorielles).

Point de référence 3 : le SDK Python MCP dépasse 5 millions de téléchargements mensuels sur PyPI (T2 2026).

08Débogage et tests

Utilisez MCP Inspector pour lancer l'interface de débogage, tester les appels Tools, consulter les journaux JSON-RPC et simuler des scénarios d'erreur. Les tests unitaires peuvent démarrer le Server en sous-processus et appeler via ClientSession :

Test fumée pytest
from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client

async with stdio_client(StdioServerParameters(
    command="python", args=["server.py"]
)) 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"
ErreurCauseSolution
Outil absent dans l'IAChemin de configuration incorrectVérifier config.json, command et args
Échec de sérialisation JSONType de retour non supportéConvertir en chaîne ou dictionnaire
Déconnexion par timeoutExécution trop lentePasser en async + contrôle de timeout
Permission refuséeChemin de fichier restreintConfigurer une liste blanche de répertoires

09Déploiement production : Docker, cloud et observabilité

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

Options de déploiement : Railway / Render (déploiement rapide pour projets personnels), AWS Lambda / Google Cloud Run (serverless), VPS dédié (avec proxy inverse Nginx). Observabilité recommandée : journaux structurés, métriques Prometheus sur les appels d'outils, alertes Sentry, endpoint de health check. Déclarez la version du protocole MCP et adoptez une stratégie de mise à jour d'outils rétrocompatible.

10Projet pratique : MCP Server de base de connaissances personnelle

Besoin : permettre à l'IA de rechercher des notes Markdown locales, d'effectuer une recherche sémantique (vectorielle) et de créer ou mettre à jour des notes.

Stack technique : base vectorielle locale ChromaDB / Qdrant ; modèle d'embedding text-embedding-3-small ; surveillance de fichiers watchfiles.

  • Outil d'indexation : scanner un répertoire, découper en blocs et écrire dans la base vectorielle
  • Outil de recherche sémantique : retourner les Top-K fragments pertinents pour une requête
  • Outil d'écriture : créer ou compléter des fichiers Markdown
  • Service de ressources fichiers : exposer le contenu intégral des notes via Resource URI

Démonstration : dans Cursor, demandez « Qu'ai-je noté la semaine dernière sur MCP ? » — l'IA invoque l'outil de recherche MCP et renvoie les extraits pertinents.

11Écosystème MCP et perspectives

Serveurs communautaires de référence : mcp-server-filesystem (système de fichiers), mcp-server-github (dépôts GitHub), mcp-server-brave-search (recherche web), mcp-server-postgres (base de données), mcp-server-slack (messages Slack).

Tendances 2026 : OpenAI, Google et Microsoft ont annoncé le support MCP ; gouvernance transférée à l'AAIF de la Linux Foundation ; MCP Marketplace en croissance ; standards de sécurité entreprise (OAuth 2.1) en cours d'intégration à la feuille de route.

Prochaines étapes : approfondir la spécification MCP ; développer et publier un serveur public ; explorer la combinaison MCP + Agent ; contribuer à l'écosystème open source (Python SDK, TypeScript SDK, Inspector).

12Runbook en six étapes : faire tourner un MCP Server 7×24 sur Mac cloud

  1. 01
    Choisir le mode de transport : stdio pour le développement local ; HTTP+SSE pour le partage d'équipe ou l'appel distant Claude Code — centralisez les clés API côté Server.
  2. 02
    Provisionner un Mac cloud depuis la console : connectez-vous à la console NUKCLOUD, choisissez 16 Go+ de mémoire (32 Go recommandés pour plusieurs serveurs en parallèle) ; essai horaire sur la page tarifs.
  3. 03
    Installer Python 3.12 + mcp : après connexion SSH, exécutez pip install mcp httpx pydantic ; validez avec MCP Inspector en test fumée local.
  4. 04
    Déployer le Server HTTP et exposer le port : mcp.run(host="0.0.0.0", port=8000) ; configurez middleware Bearer Token et CORS.
  5. 05
    Valider l'intégration client : dans .cursor/mcp.json, pointez vers l'URL cloud ; confirmez que tools/list et tools/call passent les tests fumée.
  6. 06
    Résidence launchd et abonnement fixe : rédigez un plist LaunchAgents pour maintenir le service 7×24 ; après le pilote, verrouillez la spec sur la page commander. Voir le runbook production NUKCLOUD.

Faire tourner un MCP Server HTTP sur un portable local ou un VPS partagé expose à des interruptions de session à la mise en veille, des déconnexions SSE liées à la bande passante et des conflits entre développeurs sur le même processus. Pour une connexion longue stable — Background Agents Cursor ou serveur de base de connaissances 7×24 — les nœuds Mac cloud NUKCLOUD multi-régions offrent une isolation locataire et une élasticité de spec mieux alignées avec les workflows MCP.

13Questions fréquentes

Python ou TypeScript pour écrire un MCP Server ?
Pour débuter, privilégiez Python + FastMCP — la syntaxe par décorateurs est la plus directe. Les équipes front-end/full-stack peuvent choisir le SDK TypeScript, cohérent avec l'écosystème Node. Les deux SDK sont maintenus officiellement et compatibles au niveau protocole.
Comment répartir Tools, Resources et Prompts ?
Tools exécutent des actions (écriture en base, appel API) ; Resources fournissent des données en lecture seule (configuration, contenu de fichiers) ; Prompts offrent des modèles de prompt réutilisables. Les trois se complètent et couvrent l'extension de contexte nécessaire aux agents.
stdio ou HTTP : comment choisir ?
Développement local et usage Cursor mono-utilisateur : stdio. Partage d'équipe, SaaS ou accès distant multi-clients : HTTP+SSE. Voir le tableau comparatif de la section 07.
Quelle différence avec l'article d'analyse MCP ?
Notre analyse MCP en profondeur traite l'essence du protocole et l'analogie HTTP ; cet article est un tutoriel pratique de développement from scratch, avec code complet, déploiement et projet de base de connaissances.
Quel outil comptez-vous développer avec MCP ?
Partagez votre idée de MCP Server en commentaire. MCP est le protocole standard de l'outillage IA — le maîtriser est l'un des atouts clés des ingénieurs IA en 2026.