[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-construire-premier-serveur-mcp-guide-pratique-developpeurs":3},{"article":4,"author":50},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":30,"related_articles":31},"d0000000-0000-0000-0000-000000000513","a0000000-0000-0000-0000-000000000066","Construire votre premier serveur MCP : guide pratique pour developpeurs","construire-premier-serveur-mcp-guide-pratique-developpeurs","Un tutoriel pratique etape par etape pour construire un serveur Model Context Protocol (MCP) en TypeScript et Python, le connecter a Claude Desktop ou Cursor, et le deployer en production.","## Qu'est-ce que le Model Context Protocol (MCP) ?\n\nLe **Model Context Protocol (MCP)** est un standard ouvert cree par Anthropic qui definit la maniere dont les applications AI communiquent avec les sources de donnees et les outils externes. Pensez au MCP comme a l'**USB-C pour l'integration AI** : tout comme l'USB-C fournit un connecteur universel unique pour la charge, le transfert de donnees et la sortie video, le MCP fournit un protocole universel unique pour connecter les modeles AI aux bases de donnees, API, systemes de fichiers et tout autre service. Le MCP elimine le besoin d'integrations personnalisees entre chaque application AI et chaque outil.\n\nEn 2026, le MCP est devenu le standard dominant pour la communication AI-outils. Gartner prevoit que **40 % des applications d'entreprise incluront des agents AI d'ici fin 2026**, et le MCP est le protocole qui rend cela pratique a grande echelle. Avant le MCP, connecter un modele AI a N outils necessitait N integrations personnalisees. Avec M applications AI et N outils, il fallait M x N adaptateurs d'integration. Le MCP reduit cela a M + N : chaque application AI implemente un MCP client, chaque outil implemente un MCP server.\n\n## Architecture MCP : Host, Client, Server et Transport\n\nComprendre l'architecture MCP est essentiel avant d'ecrire du code. Le protocole definit quatre roles cles :\n\n| Composant | Role | Exemple |\n|-----------|------|---------|\n| **Host** | L'application AI avec laquelle l'utilisateur final interagit | Claude Desktop, Cursor, VS Code Copilot |\n| **Client** | Le gestionnaire de protocole MCP a l'interieur du host | Integre dans l'application host |\n| **Server** | Expose des tools, resources et prompts via MCP | Votre serveur personnalise (ce que nous allons construire) |\n| **Transport** | La couche de communication entre client et server | stdio, HTTP+SSE, Streamable HTTP |\n\nLe flux de communication fonctionne ainsi :\n\n1. Le **Host** demarre et initialise un MCP **Client** pour chaque serveur configure.\n2. Le **Client** se connecte au **Server** via un **Transport** (stdio pour le local, HTTP pour le distant).\n3. Le **Client** envoie une requete `initialize`, negociant la version du protocole et les capacites.\n4. Le **Server** repond avec ses **tools**, **resources** et **prompts** disponibles.\n5. Lorsque le modele AI a besoin de donnees ou d'actions externes, le **Client** appelle la methode serveur appropriee.\n6. Le **Server** execute l'operation et retourne les resultats via des messages JSON-RPC 2.0.\n\n### Tools vs Resources vs Prompts\n\nLes MCP servers peuvent exposer trois types de capacites :\n\n- **Tools** sont des fonctions que le modele AI peut appeler. Ils acceptent des entrees structurees et retournent des sorties structurees. Exemple : `query_database(sql: string)` ou `send_email(to: string, subject: string, body: string)`.\n- **Resources** sont des donnees que le modele AI peut lire. Elles sont identifiees par des URI et retournent du contenu. Exemple : `file:\u002F\u002F\u002Fpath\u002Fto\u002Fdocument.md` ou `postgres:\u002F\u002Flocalhost\u002Fmydb\u002Fusers`.\n- **Prompts** sont des modeles de prompts reutilisables fournis par le serveur. Ils aident a standardiser la facon dont l'AI interagit avec le domaine du serveur. Exemple : un modele `summarize_ticket` pour un Jira MCP server.\n\n## Etape par etape : construire un serveur MCP en TypeScript\n\nConstruisons un serveur MCP pratique qui fournit un outil pour interroger une base de donnees SQLite. C'est un cas d'utilisation courant : donner a un modele AI un acces securise en lecture seule aux donnees de votre application.\n\n### Etape 1 : Initialiser le projet\n\n```bash\nmkdir mcp-sqlite-server && cd mcp-sqlite-server\nnpm init -y\nnpm install @modelcontextprotocol\u002Fsdk better-sqlite3\nnpm install -D typescript @types\u002Fnode @types\u002Fbetter-sqlite3\nnpx tsc --init\n```\n\nConfigurer `tsconfig.json` :\n\n```json\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"Node16\",\n    \"moduleResolution\": \"Node16\",\n    \"outDir\": \".\u002Fdist\",\n    \"rootDir\": \".\u002Fsrc\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"declaration\": true\n  },\n  \"include\": [\"src\u002F**\u002F*\"]\n}\n```\n\n### Etape 2 : Implementer le serveur\n\nCreer `src\u002Findex.ts` :\n\n```typescript\nimport { McpServer } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\nimport Database from \"better-sqlite3\";\nimport { z } from \"zod\";\n\nconst db = new Database(process.env.DB_PATH || \".\u002Fdata.db\", {\n  readonly: true,\n});\n\nconst server = new McpServer({\n  name: \"sqlite-query\",\n  version: \"1.0.0\",\n});\n\nserver.tool(\n  \"query\",\n  \"Executer une requete SQL en lecture seule sur la base de donnees SQLite\",\n  {\n    sql: z.string().describe(\"La requete SQL SELECT a executer\"),\n  },\n  async ({ sql }) => {\n    const normalized = sql.trim().toUpperCase();\n    if (!normalized.startsWith(\"SELECT\")) {\n      return {\n        content: [{ type: \"text\", text: \"Erreur : seules les requetes SELECT sont autorisees.\" }],\n        isError: true,\n      };\n    }\n    try {\n      const rows = db.prepare(sql).all();\n      return {\n        content: [{ type: \"text\", text: JSON.stringify(rows, null, 2) }],\n      };\n    } catch (error) {\n      return {\n        content: [{ type: \"text\", text: `Erreur de requete : ${(error as Error).message}` }],\n        isError: true,\n      };\n    }\n  }\n);\n\nserver.tool(\n  \"list_tables\",\n  \"Lister toutes les tables de la base de donnees avec leurs schemas\",\n  {},\n  async () => {\n    const tables = db\n      .prepare(\n        `SELECT name, sql FROM sqlite_master\n         WHERE type='table' AND name NOT LIKE 'sqlite_%'\n         ORDER BY name`\n      )\n      .all();\n    return {\n      content: [{ type: \"text\", text: JSON.stringify(tables, null, 2) }],\n    };\n  }\n);\n```\n\n### Etape 3 : Compiler et tester localement\n\n```bash\nnpx tsc\necho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0\"}}}' | node dist\u002Findex.js\n```\n\nVous devriez voir une reponse JSON-RPC avec les capacites du serveur.\n\n### Etape 4 : Construire le meme serveur en Python\n\nPour les developpeurs Python, voici l'implementation equivalente utilisant le SDK Python MCP officiel :\n\n```python\nimport sqlite3\nimport json\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"sqlite-query\")\nDB_PATH = \"data.db\"\n\n@mcp.tool()\ndef query(sql: str) -> str:\n    \"\"\"Executer une requete SQL en lecture seule sur la base de donnees SQLite.\"\"\"\n    normalized = sql.strip().upper()\n    if not normalized.startswith(\"SELECT\"):\n        raise ValueError(\"Seules les requetes SELECT sont autorisees.\")\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(sql)\n        rows = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(rows, indent=2, default=str)\n    finally:\n        conn.close()\n\n@mcp.tool()\ndef list_tables() -> str:\n    \"\"\"Lister toutes les tables de la base de donnees avec leurs schemas.\"\"\"\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(\n            \"SELECT name, sql FROM sqlite_master \"\n            \"WHERE type='table' AND name NOT LIKE 'sqlite_%'\"\n        )\n        tables = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(tables, indent=2)\n    finally:\n        conn.close()\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n```\n\n## Connexion a Claude Desktop\n\nClaude Desktop prend en charge nativement les serveurs MCP. Pour connecter votre serveur, editez le fichier de configuration de Claude Desktop :\n\n**macOS :** `~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json`\n**Windows :** `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\"\u002Fabsolute\u002Fpath\u002Fto\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \"\u002Fabsolute\u002Fpath\u002Fto\u002Fyour\u002Fdata.db\"\n      }\n    }\n  }\n}\n```\n\nRedemarrez Claude Desktop. Vous verrez une icone de marteau dans l'interface de chat indiquant les outils MCP disponibles. Vous pouvez maintenant poser des questions a Claude comme « Quelles tables existent dans la base de donnees ? » ou « Affiche les 10 premiers utilisateurs par date d'inscription » et Claude utilisera votre serveur MCP pour interroger la base de donnees directement.\n\n## Connexion a Cursor\n\nCursor prend egalement en charge les serveurs MCP. Ajoutez la configuration a `.cursor\u002Fmcp.json` dans la racine de votre projet :\n\n```json\n{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\".\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \".\u002Fdata.db\"\n      }\n    }\n  }\n}\n```\n\nApres avoir enregistre, redemarrez Cursor. Les outils MCP apparaissent dans le panneau de l'assistant AI et peuvent etre invoques pendant les sessions de generation de code et de debogage.\n\n## Test et debogage de votre serveur MCP\n\n### Utilisation du MCP Inspector\n\nLe MCP Inspector est l'outil de debogage officiel. Il fournit une interface web pour interagir avec votre serveur :\n\n```bash\nnpx @modelcontextprotocol\u002Finspector node dist\u002Findex.js\n```\n\nCela ouvre une interface navigateur a `http:\u002F\u002Flocalhost:5173` ou vous pouvez :\n\n- Visualiser tous les tools, resources et prompts enregistres\n- Appeler des tools avec des entrees personnalisees et inspecter les reponses\n- Surveiller le flux de messages JSON-RPC en temps reel\n- Tester la gestion des erreurs en envoyant des requetes malformees\n\n### Problemes de debogage courants\n\n| Probleme | Cause | Solution |\n|----------|-------|----------|\n| Le serveur n'apparait pas dans Claude Desktop | Chemin de configuration ou erreur de syntaxe JSON | Valider le JSON, verifier les chemins absolus |\n| Erreur « Tool not found » | Les tools ne sont pas enregistres avant la connexion | Enregistrer les tools avant d'appeler `server.connect()` |\n| Timeout sur les appels d'outils | Operation longue sans notification de progression | Ajouter des notifications de progression via `server.sendProgress()` |\n| La sortie stderr corrompt le protocole | console.log ecrit sur stdout (transport stdio) | Utiliser `console.error()` pour le logging avec stdio |\n| Deconnexion apres inactivite | Timeout du transport | Implementer un heartbeat ou utiliser le transport HTTP |\n\n## Bonnes pratiques pour la production\n\n1. **Validation des entrees** : Toujours valider et assainir les entrees des outils. Utilisez des schemas Zod (TypeScript) ou des modeles Pydantic (Python) pour une verification de type stricte.\n\n2. **Lecture seule par defaut** : Commencez avec un acces en lecture seule. N'ajoutez des capacites d'ecriture que lorsque c'est reellement necessaire, et demandez toujours une confirmation pour les operations destructrices.\n\n3. **Gestion des erreurs** : Retournez des messages d'erreur structures avec `isError: true`. N'exposez jamais les traces de pile internes ou les chaines de connexion a la base de donnees.\n\n4. **Journalisation** : Enregistrez tous les appels d'outils avec horodatage, entrees et duree d'execution. Utilisez stderr pour la journalisation (pas stdout) avec le transport stdio.\n\n5. **Limitation de debit** : Implementez des limites de debit par outil pour empecher les boucles AI non controlees de submerger vos services backend.\n\n6. **Timeout** : Definissez des timeouts d'execution sur tous les handlers d'outils. Les modeles AI peuvent appeler des outils qui declenchent des requetes couteuses — protegez votre infrastructure.\n\n7. **Separation des environnements** : Utilisez des variables d'environnement pour toute la configuration. Ne codez jamais en dur les URL de bases de donnees, les cles API ou les chemins de fichiers.\n\n8. **Gestion des versions** : Utilisez le versionnage semantique pour votre serveur MCP. Le handshake `initialize` inclut la negociation de version — les modifications incompatibles necessitent un bump de version majeure.\n\n## FAQ\n\n**Q : Quelle est la difference entre MCP et le function calling ?**\nR : Le function calling (utilise par OpenAI, Anthropic et d'autres) definit les outils en ligne dans chaque requete API. Le MCP externalise les definitions d'outils vers des serveurs autonomes decouverts et utilises par les hosts compatibles MCP. Le function calling est par requete ; le MCP est un protocole persistant avec des sessions stateful.\n\n**Q : Puis-je utiliser MCP avec des modeles autres que Claude ?**\nR : Oui. Le MCP est un protocole ouvert. OpenAI, Google DeepMind et Microsoft ont adopte le support MCP dans leurs plateformes depuis debut 2026. Toute application AI qui implemente un MCP client peut se connecter a n'importe quel MCP server.\n\n**Q : MCP est-il uniquement pour les outils locaux ?**\nR : Non. Bien que le transport stdio soit concu pour les serveurs locaux, les transports HTTP+SSE et Streamable HTTP prennent en charge les serveurs MCP distants. Vous pouvez deployer un serveur MCP comme service cloud accessible via le reseau.\n\n**Q : Comment MCP gere-t-il l'authentification ?**\nR : Le protocole prend en charge OAuth 2.0 pour les serveurs distants. Les serveurs stdio locaux heritent du contexte de securite du processus host. Pour les deployments enterprise, un MCP gateway peut centraliser l'authentification et l'autorisation.\n\n**Q : Quels langages peuvent etre utilises pour construire un serveur MCP ?**\nR : Les SDK officiels sont disponibles pour TypeScript, Python, Java, Kotlin, C# et Swift. Les SDK communautaires incluent Rust, Go, Ruby et PHP. Le protocole est agnostique en termes de langage — tout langage capable de lire\u002Fecrire du JSON-RPC via stdio ou HTTP peut implementer un serveur MCP.\n\n**Q : Comment mettre a jour un serveur MCP sans redemarrer le host ?**\nR : MCP prend en charge les notifications de changement de capacites. Lorsque les outils de votre serveur changent, le serveur peut envoyer un message `notifications\u002Ftools\u002Flist_changed`, invitant le client a recuperer la liste des outils. Pour les serveurs stdio, le host doit generalement etre redemarre. Les serveurs HTTP peuvent etre mis a jour sans redemarrer le host.","\u003Ch2 id=\"qu-est-ce-que-le-model-context-protocol-mcp\">Qu’est-ce que le Model Context Protocol (MCP) ?\u003C\u002Fh2>\n\u003Cp>Le \u003Cstrong>Model Context Protocol (MCP)\u003C\u002Fstrong> est un standard ouvert cree par Anthropic qui definit la maniere dont les applications AI communiquent avec les sources de donnees et les outils externes. Pensez au MCP comme a l’\u003Cstrong>USB-C pour l’integration AI\u003C\u002Fstrong> : tout comme l’USB-C fournit un connecteur universel unique pour la charge, le transfert de donnees et la sortie video, le MCP fournit un protocole universel unique pour connecter les modeles AI aux bases de donnees, API, systemes de fichiers et tout autre service. Le MCP elimine le besoin d’integrations personnalisees entre chaque application AI et chaque outil.\u003C\u002Fp>\n\u003Cp>En 2026, le MCP est devenu le standard dominant pour la communication AI-outils. Gartner prevoit que \u003Cstrong>40 % des applications d’entreprise incluront des agents AI d’ici fin 2026\u003C\u002Fstrong>, et le MCP est le protocole qui rend cela pratique a grande echelle. Avant le MCP, connecter un modele AI a N outils necessitait N integrations personnalisees. Avec M applications AI et N outils, il fallait M x N adaptateurs d’integration. Le MCP reduit cela a M + N : chaque application AI implemente un MCP client, chaque outil implemente un MCP server.\u003C\u002Fp>\n\u003Ch2 id=\"architecture-mcp-host-client-server-et-transport\">Architecture MCP : Host, Client, Server et Transport\u003C\u002Fh2>\n\u003Cp>Comprendre l’architecture MCP est essentiel avant d’ecrire du code. Le protocole definit quatre roles cles :\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Composant\u003C\u002Fth>\u003Cth>Role\u003C\u002Fth>\u003Cth>Exemple\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Cstrong>Host\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>L’application AI avec laquelle l’utilisateur final interagit\u003C\u002Ftd>\u003Ctd>Claude Desktop, Cursor, VS Code Copilot\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Cstrong>Client\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Le gestionnaire de protocole MCP a l’interieur du host\u003C\u002Ftd>\u003Ctd>Integre dans l’application host\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Cstrong>Server\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Expose des tools, resources et prompts via MCP\u003C\u002Ftd>\u003Ctd>Votre serveur personnalise (ce que nous allons construire)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Cstrong>Transport\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>La couche de communication entre client et server\u003C\u002Ftd>\u003Ctd>stdio, HTTP+SSE, Streamable HTTP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Le flux de communication fonctionne ainsi :\u003C\u002Fp>\n\u003Col>\n\u003Cli>Le \u003Cstrong>Host\u003C\u002Fstrong> demarre et initialise un MCP \u003Cstrong>Client\u003C\u002Fstrong> pour chaque serveur configure.\u003C\u002Fli>\n\u003Cli>Le \u003Cstrong>Client\u003C\u002Fstrong> se connecte au \u003Cstrong>Server\u003C\u002Fstrong> via un \u003Cstrong>Transport\u003C\u002Fstrong> (stdio pour le local, HTTP pour le distant).\u003C\u002Fli>\n\u003Cli>Le \u003Cstrong>Client\u003C\u002Fstrong> envoie une requete \u003Ccode>initialize\u003C\u002Fcode>, negociant la version du protocole et les capacites.\u003C\u002Fli>\n\u003Cli>Le \u003Cstrong>Server\u003C\u002Fstrong> repond avec ses \u003Cstrong>tools\u003C\u002Fstrong>, \u003Cstrong>resources\u003C\u002Fstrong> et \u003Cstrong>prompts\u003C\u002Fstrong> disponibles.\u003C\u002Fli>\n\u003Cli>Lorsque le modele AI a besoin de donnees ou d’actions externes, le \u003Cstrong>Client\u003C\u002Fstrong> appelle la methode serveur appropriee.\u003C\u002Fli>\n\u003Cli>Le \u003Cstrong>Server\u003C\u002Fstrong> execute l’operation et retourne les resultats via des messages JSON-RPC 2.0.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Tools vs Resources vs Prompts\u003C\u002Fh3>\n\u003Cp>Les MCP servers peuvent exposer trois types de capacites :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Tools\u003C\u002Fstrong> sont des fonctions que le modele AI peut appeler. Ils acceptent des entrees structurees et retournent des sorties structurees. Exemple : \u003Ccode>query_database(sql: string)\u003C\u002Fcode> ou \u003Ccode>send_email(to: string, subject: string, body: string)\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Resources\u003C\u002Fstrong> sont des donnees que le modele AI peut lire. Elles sont identifiees par des URI et retournent du contenu. Exemple : \u003Ccode>file:\u002F\u002F\u002Fpath\u002Fto\u002Fdocument.md\u003C\u002Fcode> ou \u003Ccode>postgres:\u002F\u002Flocalhost\u002Fmydb\u002Fusers\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Prompts\u003C\u002Fstrong> sont des modeles de prompts reutilisables fournis par le serveur. Ils aident a standardiser la facon dont l’AI interagit avec le domaine du serveur. Exemple : un modele \u003Ccode>summarize_ticket\u003C\u002Fcode> pour un Jira MCP server.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"etape-par-etape-construire-un-serveur-mcp-en-typescript\">Etape par etape : construire un serveur MCP en TypeScript\u003C\u002Fh2>\n\u003Cp>Construisons un serveur MCP pratique qui fournit un outil pour interroger une base de donnees SQLite. C’est un cas d’utilisation courant : donner a un modele AI un acces securise en lecture seule aux donnees de votre application.\u003C\u002Fp>\n\u003Ch3>Etape 1 : Initialiser le projet\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir mcp-sqlite-server &amp;&amp; cd mcp-sqlite-server\nnpm init -y\nnpm install @modelcontextprotocol\u002Fsdk better-sqlite3\nnpm install -D typescript @types\u002Fnode @types\u002Fbetter-sqlite3\nnpx tsc --init\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Configurer \u003Ccode>tsconfig.json\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"Node16\",\n    \"moduleResolution\": \"Node16\",\n    \"outDir\": \".\u002Fdist\",\n    \"rootDir\": \".\u002Fsrc\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"declaration\": true\n  },\n  \"include\": [\"src\u002F**\u002F*\"]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Etape 2 : Implementer le serveur\u003C\u002Fh3>\n\u003Cp>Creer \u003Ccode>src\u002Findex.ts\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">import { McpServer } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\nimport Database from \"better-sqlite3\";\nimport { z } from \"zod\";\n\nconst db = new Database(process.env.DB_PATH || \".\u002Fdata.db\", {\n  readonly: true,\n});\n\nconst server = new McpServer({\n  name: \"sqlite-query\",\n  version: \"1.0.0\",\n});\n\nserver.tool(\n  \"query\",\n  \"Executer une requete SQL en lecture seule sur la base de donnees SQLite\",\n  {\n    sql: z.string().describe(\"La requete SQL SELECT a executer\"),\n  },\n  async ({ sql }) =&gt; {\n    const normalized = sql.trim().toUpperCase();\n    if (!normalized.startsWith(\"SELECT\")) {\n      return {\n        content: [{ type: \"text\", text: \"Erreur : seules les requetes SELECT sont autorisees.\" }],\n        isError: true,\n      };\n    }\n    try {\n      const rows = db.prepare(sql).all();\n      return {\n        content: [{ type: \"text\", text: JSON.stringify(rows, null, 2) }],\n      };\n    } catch (error) {\n      return {\n        content: [{ type: \"text\", text: `Erreur de requete : ${(error as Error).message}` }],\n        isError: true,\n      };\n    }\n  }\n);\n\nserver.tool(\n  \"list_tables\",\n  \"Lister toutes les tables de la base de donnees avec leurs schemas\",\n  {},\n  async () =&gt; {\n    const tables = db\n      .prepare(\n        `SELECT name, sql FROM sqlite_master\n         WHERE type='table' AND name NOT LIKE 'sqlite_%'\n         ORDER BY name`\n      )\n      .all();\n    return {\n      content: [{ type: \"text\", text: JSON.stringify(tables, null, 2) }],\n    };\n  }\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Etape 3 : Compiler et tester localement\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">npx tsc\necho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0\"}}}' | node dist\u002Findex.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Vous devriez voir une reponse JSON-RPC avec les capacites du serveur.\u003C\u002Fp>\n\u003Ch3>Etape 4 : Construire le meme serveur en Python\u003C\u002Fh3>\n\u003Cp>Pour les developpeurs Python, voici l’implementation equivalente utilisant le SDK Python MCP officiel :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">import sqlite3\nimport json\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"sqlite-query\")\nDB_PATH = \"data.db\"\n\n@mcp.tool()\ndef query(sql: str) -&gt; str:\n    \"\"\"Executer une requete SQL en lecture seule sur la base de donnees SQLite.\"\"\"\n    normalized = sql.strip().upper()\n    if not normalized.startswith(\"SELECT\"):\n        raise ValueError(\"Seules les requetes SELECT sont autorisees.\")\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(sql)\n        rows = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(rows, indent=2, default=str)\n    finally:\n        conn.close()\n\n@mcp.tool()\ndef list_tables() -&gt; str:\n    \"\"\"Lister toutes les tables de la base de donnees avec leurs schemas.\"\"\"\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(\n            \"SELECT name, sql FROM sqlite_master \"\n            \"WHERE type='table' AND name NOT LIKE 'sqlite_%'\"\n        )\n        tables = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(tables, indent=2)\n    finally:\n        conn.close()\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"connexion-a-claude-desktop\">Connexion a Claude Desktop\u003C\u002Fh2>\n\u003Cp>Claude Desktop prend en charge nativement les serveurs MCP. Pour connecter votre serveur, editez le fichier de configuration de Claude Desktop :\u003C\u002Fp>\n\u003Cp>\u003Cstrong>macOS :\u003C\u002Fstrong> \u003Ccode>~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json\u003C\u002Fcode>\n\u003Cstrong>Windows :\u003C\u002Fstrong> \u003Ccode>%APPDATA%\\Claude\\claude_desktop_config.json\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\"\u002Fabsolute\u002Fpath\u002Fto\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \"\u002Fabsolute\u002Fpath\u002Fto\u002Fyour\u002Fdata.db\"\n      }\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Redemarrez Claude Desktop. Vous verrez une icone de marteau dans l’interface de chat indiquant les outils MCP disponibles. Vous pouvez maintenant poser des questions a Claude comme « Quelles tables existent dans la base de donnees ? » ou « Affiche les 10 premiers utilisateurs par date d’inscription » et Claude utilisera votre serveur MCP pour interroger la base de donnees directement.\u003C\u002Fp>\n\u003Ch2 id=\"connexion-a-cursor\">Connexion a Cursor\u003C\u002Fh2>\n\u003Cp>Cursor prend egalement en charge les serveurs MCP. Ajoutez la configuration a \u003Ccode>.cursor\u002Fmcp.json\u003C\u002Fcode> dans la racine de votre projet :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\".\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \".\u002Fdata.db\"\n      }\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Apres avoir enregistre, redemarrez Cursor. Les outils MCP apparaissent dans le panneau de l’assistant AI et peuvent etre invoques pendant les sessions de generation de code et de debogage.\u003C\u002Fp>\n\u003Ch2 id=\"test-et-debogage-de-votre-serveur-mcp\">Test et debogage de votre serveur MCP\u003C\u002Fh2>\n\u003Ch3>Utilisation du MCP Inspector\u003C\u002Fh3>\n\u003Cp>Le MCP Inspector est l’outil de debogage officiel. Il fournit une interface web pour interagir avec votre serveur :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">npx @modelcontextprotocol\u002Finspector node dist\u002Findex.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cela ouvre une interface navigateur a \u003Ccode>http:\u002F\u002Flocalhost:5173\u003C\u002Fcode> ou vous pouvez :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Visualiser tous les tools, resources et prompts enregistres\u003C\u002Fli>\n\u003Cli>Appeler des tools avec des entrees personnalisees et inspecter les reponses\u003C\u002Fli>\n\u003Cli>Surveiller le flux de messages JSON-RPC en temps reel\u003C\u002Fli>\n\u003Cli>Tester la gestion des erreurs en envoyant des requetes malformees\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Problemes de debogage courants\u003C\u002Fh3>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Probleme\u003C\u002Fth>\u003Cth>Cause\u003C\u002Fth>\u003Cth>Solution\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Le serveur n’apparait pas dans Claude Desktop\u003C\u002Ftd>\u003Ctd>Chemin de configuration ou erreur de syntaxe JSON\u003C\u002Ftd>\u003Ctd>Valider le JSON, verifier les chemins absolus\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Erreur « Tool not found »\u003C\u002Ftd>\u003Ctd>Les tools ne sont pas enregistres avant la connexion\u003C\u002Ftd>\u003Ctd>Enregistrer les tools avant d’appeler \u003Ccode>server.connect()\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Timeout sur les appels d’outils\u003C\u002Ftd>\u003Ctd>Operation longue sans notification de progression\u003C\u002Ftd>\u003Ctd>Ajouter des notifications de progression via \u003Ccode>server.sendProgress()\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>La sortie stderr corrompt le protocole\u003C\u002Ftd>\u003Ctd>console.log ecrit sur stdout (transport stdio)\u003C\u002Ftd>\u003Ctd>Utiliser \u003Ccode>console.error()\u003C\u002Fcode> pour le logging avec stdio\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Deconnexion apres inactivite\u003C\u002Ftd>\u003Ctd>Timeout du transport\u003C\u002Ftd>\u003Ctd>Implementer un heartbeat ou utiliser le transport HTTP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"bonnes-pratiques-pour-la-production\">Bonnes pratiques pour la production\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Validation des entrees\u003C\u002Fstrong> : Toujours valider et assainir les entrees des outils. Utilisez des schemas Zod (TypeScript) ou des modeles Pydantic (Python) pour une verification de type stricte.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Lecture seule par defaut\u003C\u002Fstrong> : Commencez avec un acces en lecture seule. N’ajoutez des capacites d’ecriture que lorsque c’est reellement necessaire, et demandez toujours une confirmation pour les operations destructrices.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Gestion des erreurs\u003C\u002Fstrong> : Retournez des messages d’erreur structures avec \u003Ccode>isError: true\u003C\u002Fcode>. N’exposez jamais les traces de pile internes ou les chaines de connexion a la base de donnees.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Journalisation\u003C\u002Fstrong> : Enregistrez tous les appels d’outils avec horodatage, entrees et duree d’execution. Utilisez stderr pour la journalisation (pas stdout) avec le transport stdio.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Limitation de debit\u003C\u002Fstrong> : Implementez des limites de debit par outil pour empecher les boucles AI non controlees de submerger vos services backend.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Timeout\u003C\u002Fstrong> : Definissez des timeouts d’execution sur tous les handlers d’outils. Les modeles AI peuvent appeler des outils qui declenchent des requetes couteuses — protegez votre infrastructure.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Separation des environnements\u003C\u002Fstrong> : Utilisez des variables d’environnement pour toute la configuration. Ne codez jamais en dur les URL de bases de donnees, les cles API ou les chemins de fichiers.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Gestion des versions\u003C\u002Fstrong> : Utilisez le versionnage semantique pour votre serveur MCP. Le handshake \u003Ccode>initialize\u003C\u002Fcode> inclut la negociation de version — les modifications incompatibles necessitent un bump de version majeure.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"faq\">FAQ\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Q : Quelle est la difference entre MCP et le function calling ?\u003C\u002Fstrong>\nR : Le function calling (utilise par OpenAI, Anthropic et d’autres) definit les outils en ligne dans chaque requete API. Le MCP externalise les definitions d’outils vers des serveurs autonomes decouverts et utilises par les hosts compatibles MCP. Le function calling est par requete ; le MCP est un protocole persistant avec des sessions stateful.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q : Puis-je utiliser MCP avec des modeles autres que Claude ?\u003C\u002Fstrong>\nR : Oui. Le MCP est un protocole ouvert. OpenAI, Google DeepMind et Microsoft ont adopte le support MCP dans leurs plateformes depuis debut 2026. Toute application AI qui implemente un MCP client peut se connecter a n’importe quel MCP server.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q : MCP est-il uniquement pour les outils locaux ?\u003C\u002Fstrong>\nR : Non. Bien que le transport stdio soit concu pour les serveurs locaux, les transports HTTP+SSE et Streamable HTTP prennent en charge les serveurs MCP distants. Vous pouvez deployer un serveur MCP comme service cloud accessible via le reseau.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q : Comment MCP gere-t-il l’authentification ?\u003C\u002Fstrong>\nR : Le protocole prend en charge OAuth 2.0 pour les serveurs distants. Les serveurs stdio locaux heritent du contexte de securite du processus host. Pour les deployments enterprise, un MCP gateway peut centraliser l’authentification et l’autorisation.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q : Quels langages peuvent etre utilises pour construire un serveur MCP ?\u003C\u002Fstrong>\nR : Les SDK officiels sont disponibles pour TypeScript, Python, Java, Kotlin, C# et Swift. Les SDK communautaires incluent Rust, Go, Ruby et PHP. Le protocole est agnostique en termes de langage — tout langage capable de lire\u002Fecrire du JSON-RPC via stdio ou HTTP peut implementer un serveur MCP.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q : Comment mettre a jour un serveur MCP sans redemarrer le host ?\u003C\u002Fstrong>\nR : MCP prend en charge les notifications de changement de capacites. Lorsque les outils de votre serveur changent, le serveur peut envoyer un message \u003Ccode>notifications\u002Ftools\u002Flist_changed\u003C\u002Fcode>, invitant le client a recuperer la liste des outils. Pour les serveurs stdio, le host doit generalement etre redemarre. Les serveurs HTTP peuvent etre mis a jour sans redemarrer le host.\u003C\u002Fp>\n","fr","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:39.135358Z","Tutoriel etape par etape pour construire un serveur MCP en TypeScript et Python. Connectez-le a Claude Desktop ou Cursor, testez avec MCP Inspector et deployez en production.","tutoriel serveur mcp",null,"index, follow",[21,26],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000008","AI","ai","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000002","TypeScript","typescript","Ingénierie",[32,38,44],{"id":33,"title":34,"slug":35,"excerpt":36,"locale":12,"category_name":30,"published_at":37},"d0000000-0000-0000-0000-000000000677","Pourquoi Bali devient le hub impact-tech d'Asie du Sud-Est en 2026","pourquoi-bali-devient-hub-impact-tech-asie-sud-est-2026","Bali se classe 16e parmi les écosystèmes startups d'Asie du Sud-Est. Avec une concentration croissante de bâtisseurs Web3, de startups IA durables et d'entreprises eco-travel tech, l'île se forge une identité de capitale impact-tech de la région.","2026-03-28T10:44:49.517126Z",{"id":39,"title":40,"slug":41,"excerpt":42,"locale":12,"category_name":30,"published_at":43},"d0000000-0000-0000-0000-000000000676","Le patchwork de la protection des données ASEAN : checklist de conformité pour les développeurs","patchwork-protection-donnees-asean-checklist-conformite-developpeurs","Sept pays de l'ASEAN disposent désormais de lois complètes sur la protection des données, chacune avec des modèles de consentement, des exigences de localisation et des structures de sanctions différents. Voici une checklist pratique de conformité pour les développeurs.","2026-03-28T10:44:49.504560Z",{"id":45,"title":46,"slug":47,"excerpt":48,"locale":12,"category_name":30,"published_at":49},"d0000000-0000-0000-0000-000000000675","La transformation numérique de 29 milliards de dollars d'Indonesia : opportunités pour les éditeurs de logiciels","transformation-numerique-29-milliards-dollars-indonesia-opportunites-editeurs-logiciels","Le marché des services informatiques d'Indonesia devrait atteindre 29,03 milliards de dollars en 2026, contre 24,37 milliards en 2025. L'infrastructure cloud, l'IA, le e-commerce et les centres de données tirent la croissance la plus rapide d'Asie du Sud-Est.","2026-03-28T10:44:49.469231Z",{"id":13,"name":51,"slug":52,"bio":53,"photo_url":18,"linkedin":18,"role":54,"created_at":55,"updated_at":55},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]