Créer un MCP Server de zéro : guide complet du développeur
Un grand modèle de langage, aussi brillant soit-il, ne peut ni interroger votre base de données, ni invoquer vos API internes, ni lire vos fichiers locaux — faute d'un canal d'outillage standardisé. Le Model Context Protocol (MCP), protocole open source d'Anthropic, comble cet écart : Claude, Cursor et GPT accèdent à des capacités externes via une interface unique. Ce guide vous mène de la première ligne de code au déploiement production, en couvrant Tools, Resources, Prompts et le transport HTTP distant — avec une attention particulière à l'écosystème Apple qui alimente les workflows créatifs et techniques.
1. Trois freins : pourquoi l'IA a besoin d'un MCP Server
Avant d'écrire du code, clarifions les problèmes concrets :
- Îlots d'outils : Function Calling, Plugins, LangChain Tools — chacun son format. Changer de fournisseur de modèle implique de réécrire la couche d'intégration : le classique problème N×M.
- Données hors de portée : date limite d'entraînement, pas de configuration en temps réel, pas de documentation interne accessible au modèle.
- Actions impossibles : un chat pur ne peut envoyer de requêtes HTTP, écrire des fichiers ou exécuter du SQL — sans couche d'outils standardisée.
Si vous avez lu notre guide de décision MCP, cet article entre directement dans l'implémentation. Public visé : développeurs backend et ingénieurs IA maîtrisant Python ou TypeScript.
2. Qu'est-ce que MCP : principes et architecture
2.1 Genèse et standardisation
L'intégration d'outils a progressé de Function Calling (format propriétaire OpenAI) aux Plugins (écosystème ChatGPT fermé), jusqu'à MCP (novembre 2024, Anthropic, ouvert). Objectif : une implémentation, plusieurs clients — sous gouvernance AAIF en 2026, avec plus de 10 000 serveurs référencés.
2.2 Architecture : Client ↔ Server ↔ trois capacités
┌────────────────────┐ ┌─────────────────────┐
│ MCP Client │ ◄─────► │ MCP Server │
│ (Claude / Cursor) │ JSON │ (votre développement)│
│ │ -RPC │ │
└────────────────────┘ └─────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Tools Resources Prompts
(actions) (lecture données) (modèles)
- Client : côté modèle — Claude Desktop, Cursor, VS Code, agents personnalisés.
- Server : votre couche de capacités — Tools, Resources, Prompts.
- Tools : fonctions exécutables (recherche, calcul, requête base).
- Resources : données en lecture seule, adressées par URI.
- Prompts : gabarits paramétrables pour l'homogénéité des équipes.
2.3 Communication
MCP repose sur JSON-RPC 2.0 :
- stdio : sous-processus local, latence inférieure à 1 ms — idéal pour l'atelier de développement.
- HTTP + SSE / Streamable HTTP : service distant, clients multiples.
Cycle de vie : initialisation → négociation des capacités → requêtes/réponses → fermeture.
2.4 Matrice comparative
| Dimension | MCP | Function Calling OpenAI | LangChain Tools |
|---|---|---|---|
| Standardisation | Protocole ouvert | Propriétaire | Lié au framework |
| Transport | stdio / HTTP | HTTP | HTTP |
| Multi-modèles | Oui | Non | Partiel |
| Resources / Prompts | Natif | Non | Non |
| Écosystème 2026 | 10 000+ serveurs, AAIF | Mature mais fermé | Mature, Python-centric |
3. Environnement de développement et structure de projet
3.1 Choix du langage
- Python (langue principale) : SDK
mcp, décorateursFastMCP. - TypeScript : SDK
@modelcontextprotocol/sdkpour Node et full-stack.
3.2 Installation
python -m venv .venv
source .venv/bin/activate
pip install mcp httpx pydantic
npm init -y
npm install @modelcontextprotocol/sdk
3.3 Structure recommandée
my-mcp-server/
├── server.py
├── tools/
├── resources/
├── prompts/
├── tests/
├── pyproject.toml
└── README.md
3.4 Outils de débogage
- MCP Inspector : interface officielle.
- Claude Desktop :
claude_desktop_config.json. - Cursor : Settings → MCP ou
.cursor/mcp.json.
4. Premier MCP Server : Hello World
4.1 Code 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}! Votre premier outil MCP."
if __name__ == "__main__":
mcp.run()
4.2 Exécution et vérification
python server.py
npx @modelcontextprotocol/inspector python server.py
Dans l'Inspector : tools/list doit retourner say_hello ; tools/call avec {"name": "Développeur"} valide la chaîne complète.
4.3 Connexion Cursor / Claude Desktop
{
"mcpServers": {
"my-first-server": {
"command": "python",
"args": ["/chemin/absolu/vers/server.py"]
}
}
}
5. Tools : fonctions invocables par l'IA
5.1 Signature et documentation
Types, docstring et schéma JSON sont générés automatiquement. Convention : snake_case, verbe en tête.
5.2 Paramètres Pydantic
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="Terme de recherche")
max_results: int = Field(default=5)
language: str = Field(default="fr")
@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
"""Recherche web structurée"""
...
5.3 Cinq outils utiles
- Calculatrice : sous-ensemble sûr d'évaluation.
- Fichiers : répertoire autorisé, protection path traversal.
- HTTP :
httpx, timeout 30 s. - SQL : SELECT paramétré uniquement.
- Temps : UTC et fuseaux.
5.4 Outils asynchrones
import httpx
@mcp.tool()
async def fetch_url(url: str) -> str:
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.get(url)
response.raise_for_status()
return response.text
6. Resources : contenus dynamiques pour l'IA
6.1 Resource vs Tool
La Resource fournit des données ; le Tool exécute une action. Lecture sans effet de bord — essentiel pour les pipelines créatifs où l'on expose des assets, pas des mutations.
6.2 Exemples
import json
@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:
return json.dumps(db.query_user(user_id))
7. Prompts : modèles réutilisables
7.1 Prompts MCP en équipe
Fragments paramétrables pour harmoniser revues de code, briefs créatifs et documentation — particulièrement précieux dans les studios où plusieurs agents Cursor coexistent.
7.2 Exemple 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"""Revue de code {language} :
1. Lisibilité
2. Sécurité
3. Performance
```{language}
{code}
```"""
)
)
]
8. Transport HTTP : MCP Server distant
8.1 stdio vs HTTP+SSE
| Caractéristique | stdio | HTTP + SSE |
|---|---|---|
| Déploiement | Processus local | Serveur distant |
| Latence | <1 ms | 10–200 ms |
| Clients multiples | Non | Oui |
| Usage | Développement personnel | Équipe, SaaS, production 7×24 |
8.2 Implémentation HTTP
mcp = FastMCP("remote-server", transport="streamable-http")
if __name__ == "__main__":
mcp.run(host="0.0.0.0", port=8000)
8.3 Sécurité
- Bearer Token, liste blanche IP, CORS restreint.
- Limitation de débit : ~10 tools/call/s.
9. Débogage, tests et erreurs courantes
9.1 Workflow Inspector
- Lancer l'Inspector.
- Vérifier listes Tools / Resources / Prompts.
- Tester tools/call et scénarios d'erreur.
9.2 Test unitaire
@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 Matrice d'erreurs
| Symptôme | Cause | Solution |
|---|---|---|
| Outil absent | Chemin ou redémarrage client | Chemin absolu, relancer Cursor |
| JSON invalide | Type non sérialisable | Convertir en str/dict |
| Timeout | Exécution trop longue | async + découpage |
10. Production : Docker et observabilité
10.1 Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "server.py"]
10.2 Hébergement 2026
- Railway / Render : 5–20 USD/mois, démarrage rapide.
- Cloud Run : serverless, cold start à anticiper.
- Mac distant Apple Silicon : launchd, écosystème natif pour les créateurs et ingénieurs sur Final Cut, Xcode et Cursor.
10.3 Monitoring
- Journaux structurés par tools/call.
- Métriques Prometheus : P99, taux d'erreur.
GET /health.
11. Projet pratique : base de connaissances personnelle
11.1 Besoins
- Recherche sémantique dans notes Markdown.
- Création et mise à jour de notes.
11.2 Stack
- ChromaDB ou Qdrant, embeddings OpenAI ou
nomic-embed-text. watchfilespour réindexation automatique.
11.3 Outils clés
- index_notes : indexation vectorielle.
- search_notes : Top-K sémantique.
- write_note : écriture contrôlée.
- notes://{path} : lecture intégrale.
Économie de tokens typique : plus de 90 % par rapport à l'injection brute du corpus.
12. Écosystème MCP et perspectives 2026
12.1 Serveurs recommandés
- mcp-server-filesystem, github, brave-search, postgres, slack.
Documentation : modelcontextprotocol.io.
12.2 Tendances
- Support natif dans Cursor, Claude Desktop, VS Code, Gemini CLI.
- Marketplace MCP, certification AAIF, OAuth 2.1 entreprise.
12.3 Poursuivre
- Lire la spécification complète.
- Publier votre serveur sur GitHub.
- Combiner MCP et agents (Cursor Agent Skills).
13. Conclusion : de l'expérience locale au nœud de production
Ce guide couvre la chaîne complète — du protocole au déploiement Docker, en passant par la base de connaissances vectorielle. MCP s'impose comme le langage commun de l'outillage IA en 2026.
Le mode stdio sur un MacBook portable atteint vite ses limites : fermeture du capot, mémoire partagée entre index vectoriel et applications créatives, concurrence entre plusieurs serveurs. Les workflows exigeants — recherche sémantique, sessions Agent prolongées, outils partagés en studio — gagnent en fluidité sur un Mac Apple Silicon distant, toujours allumé, où la mémoire unifiée accueille embeddings et runtime Python sans compromettre Final Cut ou Xcode.
SFTPMAC propose la location de Mac distants 7×24, pensée pour les MCP Server et pipelines Agent : HTTP+SSE à faible latence, Python/Node natifs, synchronisation SFTP/rsync de vos notes et configurations — une alternative élégante au « Mac personnel comme serveur de production ». Quel outil allez-vous construire en premier ? Hello World suffit pour commencer aujourd'hui.