Construire un MCP Server
depuis zéro
Imaginez un studio de post-production où l'assistant IA doit consulter les métadatas Final Cut, interroger un DAM interne et rédiger des notes de version — sans exposer les masters bruts au cloud. Ce guide s'adresse aux développeurs et ingénieurs agent qui veulent livrer un serveur Model Context Protocol sur mesure avec Python et FastMCP. Vous parcourrez l'environnement, les Tools, Resources, Prompts, le transport HTTP, le débogage, le déploiement et un projet base de connaissances, avec une matrice de décision, sept étapes et des chiffres vérifiables — plus une piste Mac loué pour valider sans compromettre votre MacBook créatif.
Sommaire
01 · Pourquoi construire plutôt qu'installer
Les serveurs communautaires couvrent GitHub ou Postgres, rarement votre API de droits créatifs ou vos règles de facturation par projet. Un serveur maison expose trois à sept opérations utiles aux agents, impose des défauts read-only et évolue avec vos microservices — comme un plugin sur mesure pour votre pipeline audiovisuel ou design.
Après notre article sur le MCP comme HTTP de l'ère IA, ce tutoriel est la version mains dans le code.
02 · Trois freins au déploiement
1. Dialecte différent par hôte. OpenAI, Anthropic et Google déclarent les tools différemment. MCP unifie registration et sémantique en JSON-RPC — écrivez une fois, chargez dans Cursor, Claude Desktop et OpenClaw.
2. Frontières floues des credentials. Un serveur MCP lit fichiers, appelle APIs, porte des tokens OAuth. Mélanger une douzaine de serveurs sur le MacBook qui signe vos builds App Store est un risque opérationnel — surtout en équipe créative où les clés API tierces prolifèrent.
3. Chaîne de debug opaque. Host → Client → stdio ou HTTP : une mauvaise ligne de config se traduit par « outils indisponibles ». Sans Inspector ni tests, vous devinez.
03 · Architecture : Host, Client, Server
Le Model Context Protocol (Anthropic, nov. 2024 ; gouvernance LF 2026) structure la découverte de capacités via JSON-RPC 2.0 : initialize, tools/list, tools/call, resources/list, prompts/list.
- Tools — actions invocables (requête HTTP, écriture fichier contrôlée).
- Resources — contexte read-only (config, extraits de runbook).
- Prompts — gabarits de dialogue (« revue de montage », « synthèse changelog »).
Transports : stdio pour le bureau local ; streamable HTTP pour partager un serveur entre plusieurs postes de montage ou un gateway OpenClaw.
04 · Matrice : REST, Function Calling, MCP, LangChain
| Dimension | REST | Function Calling | MCP |
|---|---|---|---|
| Découverte | OpenAPI statique | Schema dans le prompt | tools/list runtime |
| Multi-hôte | Clients HTTP universels | Un éditeur de modèle | Cursor, Claude, OpenClaw |
| Resources/Prompts | Non natif | Non natif | Premiers citoyens du protocole |
| Cas créatif | CRUD assets | Prototype rapide | Catalogue agent durable |
Donnée 1 : coût d'intégration −38 % à −55 % avec une couche MCP unifiée. Donnée 2 : duplication Cursor + Claude −70 % de code wrapper. Donnée 3 : 1 000+ serveurs MCP exposés sans auth repérés en scan public — validez les permissions avant production.
05 · Environnement Python + FastMCP
mkdir my-mcp-server && cd my-mcp-serverpython3 -m venv .venv && source .venv/bin/activatepip install "mcp[cli]" fastmcp httpx pydantic chromadbnpx @modelcontextprotocol/inspector python server.py
FastMCP génère le JSON Schema depuis les annotations Python — setup fonctionnel en moins de 20 minutes en stdio, contre ~90 min. avec le SDK brut.
06 · Hello World
from fastmcp import FastMCPmcp = FastMCP("hello-server")@mcp.tool()def say_hello(name: str = "World") -> str: return f"Bonjour, {name} !"if __name__ == "__main__": mcp.run()
Enregistrez dans ~/.cursor/mcp.json ou la config Claude Desktop ; redémarrez le host. Vérifiez avec Inspector avant d'impliquer le modèle.
07 · Cinq Tools pour un studio agent-ready
| Tool | Usage créatif / prod | Implémentation |
|---|---|---|
search_assets | DAM interne | Async + limite 20 hits |
read_brief | Fichier brief client | Racine sandbox |
fetch_render_status | API farm | httpx timeout 10 s |
query_project_db | SQL read-only | Paramètres liés |
aggregate_exports | Métriques batch | Max 10 IDs |
@mcp.tool()async def fetch_render_status(job_id: str) -> str: async with httpx.AsyncClient(timeout=10) as c: r = await c.get(f"{API}/jobs/{job_id}") r.raise_for_status() return r.text
Gardez 10–15 tools maximum ; au-delà de vingt, les logs montrent une hausse nette des mauvais choix de tool par le modèle.
08 · Resources : contexte sans effet de bord
@mcp.resource("docs://runbook/{incident}")def runbook(incident: str) -> str: return (RUNBOOKS / f"{incident}.md").read_text()
Les hosts préchargent souvent les resources sans dialogue d'approbation — pas de PII, pas de secrets. Préférez des résumés agrégés.
09 · Prompts : workflows réutilisables
@mcp.prompt()def code_review(language: str = "Swift") -> str: return f"""Revue {language} : sécurité, perf IO, lisibilité, tests."""
Complète les Agent Skills Cursor — Skill pour le « quand », Prompt MCP pour le squelette de dialogue.
10 · HTTP : du Mac solo au gateway équipe
| Transport | Déploiement | Auth | Scénario |
|---|---|---|---|
| stdio | Subprocess local | Process owner | Cursor sur MacBook |
| SSE (legacy) | Serveur distant | Bearer/OAuth | Gateways 2025 |
| Streamable HTTP | Endpoint unique | OAuth 2.1 | Production 2026 |
mcp run server.py --transport streamable-http --port 8080
Limitez à 60 req/min/token, journalisez chaque tools/call, conformité RGPD via minimisation des arguments loggés.
11 · Débogage en quatre couches
- Inspector : connecter, lister, appeler manuellement.
- Logging structuré sur stderr — jamais
printsur stdout en stdio. - pytest avec
ClientSessionet stdio_client. - Fumée Host : lookup read-only, écriture bornée, dialog d'approbation.
12 · Production : sept étapes
- Versions épinglées dans pyproject.toml.
- Secrets en vault, pas dans l'image Docker.
- Supervision systemd/K8s, RAM 256 MB par instance idle.
- Endpoint
/healthséparé. - Alerte si erreurs >5 % sur 5 minutes.
- Scopes OAuth minimaux.
- Rehearsal sur Mac loué — voir intégration OpenClaw MCP.
13 · Base de connaissances ChromaDB
Scénario fréquent en agence : indexer markdown interne, exposer search_knowledge et index_document. ChromaDB all-MiniLM-L6-v2 (384 dim.) ; 100 k pages ≈ 2–4 Go disque, 8 Go RAM recommandés.
@mcp.tool()def search_knowledge(query: str, top_k: int = 5) -> str: res = collection.query(query_texts=[query], n_results=top_k) return "\n---\n".join(res["documents"][0] or [])
14 · Écosystème juin 2026
10 000+ serveurs publics ; packages officiels GitHub, Stripe, Notion. Avant de réinventer, cherchez le registre ; construisez si redaction métier ou auth interne. MCP coexiste avec A2A (délégation agent-agent).
15 · Conclusion : répéter sur un Mac jetable
Vous disposez du fil complet — Tools typés, Resources, Prompts, HTTP, tests, durcissement. Un serveur MCP maison remplace les docs API collées dans le prompt et stabilise les agents.
Cependant, développer sur le MacBook qui porte vos certificats Developer, vos tokens Frame.io et votre Keychain production mélange des mondes. WSL ou Linux ne reproduisent pas TCC, Keychain ni les dialogues GUI d'approbation macOS. Les VM cloud ajoutent une latence qui fausse vos benchmarks stdio.
Pour un sprint MCP de une à deux semaines — surtout avec tools en écriture — louer un Mac mini M4 isolé reste l'option élégante : Apple Silicon identique à votre parc, compte utilisateur vierge, SSH/VNC pour les validations GUI, effacement sans résidu avant restitution. La location journalière aligne le coût sur la durée réelle du PoC créatif.
MacDate · Développement MCP
Testez vos serveurs MCP sur un Mac que vous effacez — pas sur la machine qui signe vos livrables.
MacDate propose Mac mini M4 et Mac Studio en location journalière avec SSH/VNC — idéal pour Cursor, OpenClaw, FastMCP et MCP Inspector en sandbox créative.