Nicolas Dabene
Retour au blog
18 December 2025 Nicolas Dabene 8 min

Comment connecter un serveur MCP à Claude?

Connecter votre Serveur MCP à Claude Desktop : L’Intégration Complète

API IA développement Tutoriel Intelligence Artificielle intelligence-artificielle
Comment connecter un serveur MCP à Claude?

Connecter votre Serveur MCP à Claude Desktop : L’Intégration Complète

Connecter votre Serveur MCP à Claude Desktop : L’Intégration Complète

Nous y sommes. Après avoir construit un serveur MCP de A à Z, créé des outils fonctionnels, implémenté la découverte automatique et ajouté quatre couches de sécurité, il est temps de voir tout ça fonctionner avec une vraie IA. Aujourd’hui, nous connectons votre serveur à Claude Desktop et vous verrez enfin Claude utiliser vos outils en temps réel. C’est le moment où tout prend sens.

Introduction

Je me souviens encore de la première fois que j’ai vu Claude utiliser un de mes outils MCP. Après des heures de développement, de tests avec curl, de validation… le voir fonctionner naturellement dans une conversation était magique. C’est ce moment que vous allez vivre aujourd’hui.

Dans cet article final de la série, nous allons configurer Claude Desktop pour qu’il se connecte à votre serveur MCP, tester chaque outil en conditions réelles, debugger les problèmes courants, et explorer des cas d’usage avancés. À la fin, vous aurez un assistant IA personnel capable d’interagir avec vos fichiers, vos données, vos systèmes. Tout ça en toute sécurité.

Prérequis

Avant de commencer, assurez-vous d’avoir :

Claude Desktop installé : Téléchargez-le depuis claude.ai/download si ce n’est pas déjà fait

Votre serveur MCP fonctionnel : Les parties 1-5 de cette série doivent être complètes

Node.js et npm : Pour lancer votre serveur

Un compte Claude : Gratuit ou Pro, les deux fonctionnent

Comprendre l’Architecture de Connexion

Avant de configurer, visualisons comment Claude Desktop communique avec votre serveur :

┌─────────────────┐
│  Claude Desktop │
│   (Interface)   │
└────────┬────────┘
         │
         │ Lit la configuration
         ↓
┌─────────────────┐
│  Configuration  │
│  claude_desktop │
│   _config.json  │
└────────┬────────┘
         │
         │ Lance automatiquement
         ↓
┌─────────────────┐
│  Votre Serveur  │
│      MCP        │
│  (Node.js/TS)   │
└────────┬────────┘
         │
         │ Accède à vos ressources
         ↓
┌─────────────────┐
│   Fichiers /    │
│   Données /     │
│   Systèmes      │
└─────────────────┘

Claude Desktop lit un fichier de configuration, lance votre serveur MCP en arrière-plan, puis communique avec lui via stdio (entrée/sortie standard). Votre serveur n’a même pas besoin d’être un serveur HTTP pour cette intégration !

Adapter le Serveur pour Stdio

Jusqu’à présent, notre serveur utilisait Express et HTTP. Pour l’intégration Claude Desktop, nous devons créer une version qui communique via stdio. Créez src/mcp-stdio.ts :

<span class="c1">// src/mcp-stdio.ts</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">Server</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@modelcontextprotocol/sdk/server/index.js</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">StdioServerTransport</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@modelcontextprotocol/sdk/server/stdio.js</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> 
  <span class="nx">CallToolRequestSchema</span><span class="p">,</span> 
  <span class="nx">ListToolsRequestSchema</span> 
<span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@modelcontextprotocol/sdk/types.js</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">toolRegistry</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./mcp/registry</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">MCP_PROTOCOL_VERSION</span><span class="p">,</span> <span class="nx">SERVER_INFO</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./mcp/protocol</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">ParameterValidator</span><span class="p">,</span> <span class="nx">ValidationError</span><span class="p">,</span> <span class="nx">PathValidator</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./security/validator</span><span class="dl">'</span><span class="p">;</span>

<span class="cm">/**
 * Serveur MCP pour Claude Desktop (stdio)
 */</span>
<span class="kd">class</span> <span class="nx">MCPStdioServer</span> <span class="p">{</span>
  <span class="k">private</span> <span class="nx">server</span><span class="p">:</span> <span class="nx">Server</span><span class="p">;</span>
  <span class="k">private</span> <span class="nx">pathValidator</span><span class="p">:</span> <span class="nx">PathValidator</span><span class="p">;</span>

  <span class="kd">constructor</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">// Initialiser le validateur de chemins</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">pathValidator</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PathValidator</span><span class="p">([</span>
      <span class="nx">process</span><span class="p">.</span><span class="nx">cwd</span><span class="p">(),</span>
      <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">HOME</span> <span class="o">||</span> <span class="dl">'</span><span class="s1">/home</span><span class="dl">'</span><span class="p">,</span>
    <span class="p">]);</span>

    <span class="c1">// Créer le serveur MCP</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">server</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Server</span><span class="p">(</span>
      <span class="p">{</span>
        <span class="na">name</span><span class="p">:</span> <span class="nx">SERVER_INFO</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span>
        <span class="na">version</span><span class="p">:</span> <span class="nx">SERVER_INFO</span><span class="p">.</span><span class="nx">version</span><span class="p">,</span>
      <span class="p">},</span>
      <span class="p">{</span>
        <span class="na">capabilities</span><span class="p">:</span> <span class="p">{</span>
          <span class="na">tools</span><span class="p">:</span> <span class="p">{},</span>
        <span class="p">},</span>
      <span class="p">}</span>
    <span class="p">);</span>

    <span class="k">this</span><span class="p">.</span><span class="nx">setupHandlers</span><span class="p">();</span>
  <span class="p">}</span>

  <span class="cm">/**
   * Configuration des handlers MCP
   */</span>
  <span class="k">private</span> <span class="nx">setupHandlers</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">// Handler pour lister les outils</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">server</span><span class="p">.</span><span class="nx">setRequestHandler</span><span class="p">(</span>
      <span class="nx">ListToolsRequestSchema</span><span class="p">,</span>
      <span class="k">async</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
        <span class="kd">const</span> <span class="nx">tools</span> <span class="o">=</span> <span class="nx">toolRegistry</span><span class="p">.</span><span class="nx">getAllDescriptions</span><span class="p">();</span>
        
        <span class="k">return</span> <span class="p">{</span>
          <span class="na">tools</span><span class="p">:</span> <span class="nx">tools</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">tool</span> <span class="o">=></span> <span class="p">({</span>
            <span class="na">name</span><span class="p">:</span> <span class="nx">tool</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span>
            <span class="na">description</span><span class="p">:</span> <span class="nx">tool</span><span class="p">.</span><span class="nx">description</span><span class="p">,</span>
            <span class="na">inputSchema</span><span class="p">:</span> <span class="nx">tool</span><span class="p">.</span><span class="nx">input_schema</span><span class="p">,</span>
          <span class="p">})),</span>
        <span class="p">};</span>
      <span class="p">}</span>
    <span class="p">);</span>

    <span class="c1">// Handler pour exécuter un outil</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">server</span><span class="p">.</span><span class="nx">setRequestHandler</span><span class="p">(</span>
      <span class="nx">CallToolRequestSchema</span><span class="p">,</span>
      <span class="k">async</span> <span class="p">(</span><span class="nx">request</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
        <span class="kd">const</span> <span class="p">{</span> <span class="nx">name</span><span class="p">,</span> <span class="na">arguments</span><span class="p">:</span> <span class="nx">args</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">params</span><span class="p">;</span>

        <span class="k">try</span> <span class="p">{</span>
          <span class="c1">// Obtenir la description de l'outil</span>
          <span class="kd">const</span> <span class="nx">toolDescription</span> <span class="o">=</span> <span class="nx">toolRegistry</span><span class="p">.</span><span class="nx">getDescription</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
          
          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">toolDescription</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="p">{</span>
              <span class="na">content</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                  <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">text</span><span class="dl">'</span><span class="p">,</span>
                  <span class="na">text</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
                    <span class="na">success</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
                    <span class="na">error</span><span class="p">:</span> <span class="s2">`Outil '</span><span class="p">${</span><span class="nx">name</span><span class="p">}</span><span class="s2">' introuvable`</span><span class="p">,</span>
                  <span class="p">}),</span>
                <span class="p">},</span>
              <span class="p">],</span>
            <span class="p">};</span>
          <span class="p">}</span>

          <span class="c1">// Valider les paramètres</span>
          <span class="nx">ParameterValidator</span><span class="p">.</span><span class="nx">validate</span><span class="p">(</span><span class="nx">args</span> <span class="o">||</span> <span class="p">{},</span> <span class="nx">toolDescription</span><span class="p">.</span><span class="nx">input_schema</span><span class="p">);</span>

          <span class="c1">// Validation spécifique des chemins pour les outils de fichiers</span>
          <span class="k">if</span> <span class="p">(</span><span class="nx">name</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">readFile</span><span class="dl">'</span> <span class="o">||</span> <span class="nx">name</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">listFiles</span><span class="dl">'</span> <span class="o">||</span> <span class="nx">name</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">searchFiles</span><span class="dl">'</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">const</span> <span class="nx">pathParam</span> <span class="o">=</span> <span class="nx">args</span><span class="p">.</span><span class="nx">chemin_du_fichier</span> <span class="o">||</span> <span class="nx">args</span><span class="p">.</span><span class="nx">chemin_du_dossier</span><span class="p">;</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">pathParam</span><span class="p">)</span> <span class="p">{</span>
              <span class="nx">args</span><span class="p">.</span><span class="nx">validated_path</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">pathValidator</span><span class="p">.</span><span class="nx">validatePath</span><span class="p">(</span><span class="nx">pathParam</span><span class="p">);</span>
            <span class="p">}</span>
          <span class="p">}</span>

          <span class="c1">// Exécuter l'outil</span>
          <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">`[MCP] Exécution: </span><span class="p">${</span><span class="nx">name</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
          <span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">toolRegistry</span><span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>

          <span class="c1">// Formater la réponse</span>
          <span class="k">return</span> <span class="p">{</span>
            <span class="na">content</span><span class="p">:</span> <span class="p">[</span>
              <span class="p">{</span>
                <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">text</span><span class="dl">'</span><span class="p">,</span>
                <span class="na">text</span><span class="p">:</span> <span class="nx">result</span><span class="p">.</span><span class="nx">success</span> <span class="p">?</span> <span class="nx">result</span><span class="p">.</span><span class="nx">content</span> <span class="o">||</span> <span class="dl">'</span><span class="s1">Opération réussie</span><span class="dl">'</span> <span class="p">:</span> <span class="s2">`Erreur: </span><span class="p">${</span><span class="nx">result</span><span class="p">.</span><span class="nx">error</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
              <span class="p">},</span>
            <span class="p">],</span>
          <span class="p">};</span>

        <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="na">error</span><span class="p">:</span> <span class="kr">any</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">`[MCP] Erreur:`</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
          
          <span class="k">if</span> <span class="p">(</span><span class="nx">error</span> <span class="k">instanceof</span> <span class="nx">ValidationError</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="p">{</span>
              <span class="na">content</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                  <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">text</span><span class="dl">'</span><span class="p">,</span>
                  <span class="na">text</span><span class="p">:</span> <span class="s2">`Erreur de validation: </span><span class="p">${</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
                <span class="p">},</span>
              <span class="p">],</span>
              <span class="na">isError</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
            <span class="p">};</span>
          <span class="p">}</span>

          <span class="k">return</span> <span class="p">{</span>
            <span class="na">content</span><span class="p">:</span> <span class="p">[</span>
              <span class="p">{</span>
                <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">text</span><span class="dl">'</span><span class="p">,</span>
                <span class="na">text</span><span class="p">:</span> <span class="s2">`Erreur: </span><span class="p">${</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
              <span class="p">},</span>
            <span class="p">],</span>
            <span class="na">isError</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
          <span class="p">};</span>
        <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">);</span>
  <span class="p">}</span>

  <span class="cm">/**
   * Démarrer le serveur
   */</span>
  <span class="k">async</span> <span class="nx">start</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">StdioServerTransport</span><span class="p">();</span>
    <span class="k">await</span> <span class="k">this</span><span class="p">.</span><span class="nx">server</span><span class="p">.</span><span class="nx">connect</span><span class="p">(</span><span class="nx">transport</span><span class="p">);</span>
    
    <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="dl">'</span><span class="s1">[MCP] Serveur démarré et connecté via stdio</span><span class="dl">'</span><span class="p">);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">`[MCP] Outils disponibles: </span><span class="p">${</span><span class="nx">toolRegistry</span><span class="p">.</span><span class="nx">count</span><span class="p">()}</span><span class="s2">`</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Démarrage du serveur</span>
<span class="kd">const</span> <span class="nx">server</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MCPStdioServer</span><span class="p">();</span>
<span class="nx">server</span><span class="p">.</span><span class="nx">start</span><span class="p">().</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="dl">'</span><span class="s1">[MCP] Erreur fatale:</span><span class="dl">'</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
  <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">});</span>

Important : Notez l’utilisation de console.error() pour les logs. Pourquoi ? Parce que stdout est réservé pour la communication MCP. Les logs doivent aller vers stderr.

Installez le SDK MCP :

npm <span class="nb">install</span> @modelcontextprotocol/sdk

Compilez votre projet :

npx tsc

Testez que ça compile sans erreurs. Le fichier compilé sera dans dist/mcp-stdio.js.

Configuration de Claude Desktop

Claude Desktop cherche sa configuration à un emplacement spécifique selon votre OS :

macOS : ~/Library/Application Support/Claude/claude_desktop_config.json

Windows : %APPDATA%\Claude\claude_desktop_config.json

Linux : ~/.config/Claude/claude_desktop_config.json

Créez ou éditez ce fichier avec la configuration suivante :

<span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"filesystem"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"node"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"/chemin/absolu/vers/votre/projet/dist/mcp-stdio.js"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"NODE_ENV"</span><span class="p">:</span><span class="w"> </span><span class="s2">"production"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span>

Remplacez /chemin/absolu/vers/votre/projet par le chemin réel vers votre dossier de projet.

Pour obtenir le chemin absolu facilement :

<span class="nb">cd</span> /votre/projet/mcp-server
<span class="nb">pwd</span>
<span class="c"># Copiez le résultat et ajoutez /dist/mcp-stdio.js</span>

Exemple complet :

<span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"filesystem"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"node"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"/Users/nicolas/Dev/mcp-server/dist/mcp-stdio.js"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"NODE_ENV"</span><span class="p">:</span><span class="w"> </span><span class="s2">"production"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"PATH"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/usr/local/bin:/usr/bin:/bin"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span>

Astuce : Ajoutez la variable PATH si vous avez des problèmes de “command not found”.

Démarrer Claude Desktop

  1. Fermez complètement Claude Desktop s’il est ouvert
  2. Relancez Claude Desktop
  3. Ouvrez les Developer Tools (sur macOS : View → Developer → Toggle Developer Tools)
  4. Regardez la console pour voir les logs de connexion

Si tout fonctionne, vous devriez voir dans la console :

[MCP] Serveur démarré et connecté via stdio
[MCP] Outils disponibles: 3

Vérifier que les Outils sont Disponibles

Dans Claude Desktop, démarrez une nouvelle conversation et tapez :

Quels outils as-tu à disposition ?

Claude devrait répondre quelque chose comme :

Je dispose de plusieurs outils pour interagir avec le système de fichiers :

  1. readFile : Permet de lire le contenu d’un fichier texte
  2. listFiles : Liste les fichiers et dossiers dans un répertoire
  3. searchFiles : Recherche des fichiers par nom

Que voudrais-tu que je fasse ?

Si Claude ne voit pas vos outils, passez à la section Débogage ci-dessous.

Premier Test : Lire un Fichier

Créons un fichier de test dans votre projet :

<span class="nb">echo</span> <span class="s2">"Ceci est un test du serveur MCP avec Claude Desktop !"</span> <span class="o">></span> test-claude.txt

Maintenant, dans Claude, demandez :

Lis le fichier test-claude.txt dans le répertoire courant et dis-moi ce qu'il contient.

Claude va :

  1. Comprendre qu’il doit utiliser l’outil readFile
  2. Demander votre permission
  3. Exécuter l’outil
  4. Vous montrer le contenu

Exemple de conversation réelle :

Vous : Lis le fichier test-claude.txt

Claude : Je vais lire le fichier test-claude.txt pour vous.

[Demande de permission apparaît]

[Vous cliquez “Autoriser”]

Claude : Le fichier contient : “Ceci est un test du serveur MCP avec Claude Desktop !”

C’est magique, non ? Vous venez de voir Claude utiliser VOTRE code, VOS outils, en temps réel.

Test Avancé : Liste et Recherche

Testons maintenant des interactions plus complexes :

Liste tous les fichiers TypeScript dans le dossier src

Claude va :

  1. Utiliser listFiles pour lister src/
  2. Filtrer les fichiers .ts dans sa réponse
  3. Vous présenter une liste organisée

Ou essayez :

Trouve tous les fichiers qui contiennent "security" dans leur nom

Claude utilisera searchFiles avec le bon paramètre.

Test de Validation : Sécurité en Action

Essayons maintenant de voir notre sécurité fonctionner :

Lis le fichier ../../../../etc/passwd

Claude va tenter d’utiliser readFile avec ce chemin, mais votre PathValidator va bloquer la requête. Vous verrez une erreur :

Je n’ai pas pu lire ce fichier. L’erreur indique : “Les chemins avec “..” ne sont pas autorisés (path traversal)”

Parfait ! Votre sécurité fonctionne même avec Claude.

Cas d’Usage Avancés

Maintenant que la connexion fonctionne, explorons des scénarios réels :

1. Analyse de Code

Analyse tous les fichiers TypeScript du dossier src/tools et dis-moi combien de lignes de code il y a au total

Claude va :

  • Lister les fichiers dans src/tools
  • Lire chaque fichier .ts
  • Compter les lignes
  • Vous donner un rapport

2. Documentation Automatique

Crée-moi un README.md qui documente tous les outils disponibles dans src/tools avec leurs paramètres

Claude va :

  • Lister les fichiers
  • Lire chaque outil
  • Extraire les informations importantes
  • Générer un README formaté

3. Recherche et Résumé

Trouve tous les fichiers qui mentionnent "validation" et fais-moi un résumé de comment la validation est implémentée

Claude va :

  • Chercher les fichiers pertinents
  • Les lire
  • Analyser le code
  • Synthétiser l’information

4. Refactoring Assisté

Regarde le fichier src/tools/readFile.ts et suggère-moi des améliorations de performance

Claude va :

  • Lire le fichier
  • Analyser le code avec son expertise
  • Proposer des optimisations concrètes

Débogage : Problèmes Courants

Problème 1 : Claude ne voit pas les outils

Symptôme : Claude répond “Je n’ai pas d’outils disponibles pour ça”

Solutions :

  1. Vérifiez la configuration : ```bash # macOS

    cat ~/Library/Application\ Support/Claude/claude_desktop_config.json

Vérifiez que le chemin est correct

ls /chemin/vers/votre/projet/dist/mcp-stdio.js


2. Vérifiez la compilation :
```bash
cd votre-projet
npx tsc
ls dist/mcp-stdio.js  # Doit exister

  1. Testez manuellement : ``` node dist/mcp-stdio.js # Ne devrait pas planter immédiatement

  2. Regardez les Developer Tools de Claude Desktop :

    • Cherchez les erreurs en rouge
    • Cherchez “[MCP]” dans les logs

Problème 2 : Erreur “command not found”

Symptôme : Dans les Developer Tools : “Error: spawn node ENOENT”

Solution : Ajoutez le PATH complet dans la config :

<span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"filesystem"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/usr/local/bin/node"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"/chemin/absolu/dist/mcp-stdio.js"</span><span class="p">],</span><span class="w">
      </span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"PATH"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/usr/local/bin:/usr/bin:/bin"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span>

Trouvez votre chemin node avec :

which node

Problème 3 : Le serveur plante immédiatement

Symptôme : Les logs montrent que le serveur démarre puis s’arrête

Vérifications :

  1. Testez le serveur en standalone : ``` node dist/mcp-stdio.js # Tapez quelque chose et Entrée # Le serveur devrait rester actif

  2. Vérifiez les dépendances : ``` npm install npm list @modelcontextprotocol/sdk

  3. Regardez stderr : ``` node dist/mcp-stdio.js 2>error.log # Regardez error.log pour les erreurs

    
    

Problème 4 : Permission denied

Symptôme : “EACCES: permission denied”

Solution :

  1. Vérifiez les permissions du fichier : ``` ls -l dist/mcp-stdio.js chmod +x dist/mcp-stdio.js

  2. Vérifiez les permissions des dossiers configurés : ``` # Dans PathValidator, vérifiez que les dossiers existent et sont lisibles ls -ld ~/Documents

    
    

Problème 5 : Les outils sont lents

Symptôme : Claude met du temps à exécuter les outils

Optimisations :

  1. Mettez en cache les résultats coûteux
  2. Limitez la taille des fichiers lus
  3. Ajoutez des timeouts :
<span class="c1">// Dans votre outil</span>
<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nx">race</span><span class="p">([</span>
  <span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span><span class="p">(</span><span class="nx">path</span><span class="p">),</span>
  <span class="k">new</span> <span class="nb">Promise</span><span class="p">((</span><span class="nx">_</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="o">=></span> 
    <span class="nx">setTimeout</span><span class="p">(()</span> <span class="o">=></span> <span class="nx">reject</span><span class="p">(</span><span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">'</span><span class="s1">Timeout</span><span class="dl">'</span><span class="p">)),</span> <span class="mi">5000</span><span class="p">)</span>
  <span class="p">)</span>
<span class="p">]);</span>

Créer un Script de Diagnostic

Pour faciliter le débogage, créez diagnose.sh :

<span class="c">#!/bin/bash</span>

<span class="nb">echo</span> <span class="s2">"=== Diagnostic MCP Server ==="</span>
<span class="nb">echo</span> <span class="s2">""</span>

<span class="nb">echo</span> <span class="s2">"1. Vérification Node.js:"</span>
which node
node <span class="nt">--version</span>
<span class="nb">echo</span> <span class="s2">""</span>

<span class="nb">echo</span> <span class="s2">"2. Vérification du projet:"</span>
<span class="nb">ls</span> <span class="nt">-l</span> dist/mcp-stdio.js
<span class="nb">echo</span> <span class="s2">""</span>

<span class="nb">echo</span> <span class="s2">"3. Vérification de la configuration Claude:"</span>
<span class="k">if</span> <span class="o">[</span> <span class="nt">-f</span> ~/Library/Application<span class="se">\ </span>Support/Claude/claude_desktop_config.json <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"✓ Fichier de configuration trouvé"</span>
  <span class="nb">cat</span> ~/Library/Application<span class="se">\ </span>Support/Claude/claude_desktop_config.json
<span class="k">else
  </span><span class="nb">echo</span> <span class="s2">"✗ Fichier de configuration non trouvé"</span>
<span class="k">fi
</span><span class="nb">echo</span> <span class="s2">""</span>

<span class="nb">echo</span> <span class="s2">"4. Test du serveur:"</span>
<span class="nb">timeout </span>2s node dist/mcp-stdio.js <span class="o"><<<</span> <span class="s1">'{"jsonrpc":"2.0","method":"tools/list","id":1}'</span> 2>&1
<span class="nb">echo</span> <span class="s2">""</span>

<span class="nb">echo</span> <span class="s2">"5. Vérification des dépendances:"</span>
npm list @modelcontextprotocol/sdk <span class="nt">--depth</span><span class="o">=</span>0
<span class="nb">echo</span> <span class="s2">""</span>

<span class="nb">echo</span> <span class="s2">"=== Fin du diagnostic ==="</span>

Rendez-le exécutable et lancez-le :

<span class="nb">chmod</span> +x diagnose.sh
./diagnose.sh

Monitoring et Logs

Pour surveiller ce qui se passe, ajoutez du logging structuré dans mcp-stdio.ts :

<span class="c1">// Fonction de log</span>
<span class="kd">function</span> <span class="nx">log</span><span class="p">(</span><span class="nx">level</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">message</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">data</span><span class="p">?:</span> <span class="kr">any</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">entry</span> <span class="o">=</span> <span class="p">{</span>
    <span class="na">timestamp</span><span class="p">:</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">toISOString</span><span class="p">(),</span>
    <span class="nx">level</span><span class="p">,</span>
    <span class="nx">message</span><span class="p">,</span>
    <span class="p">...</span><span class="nx">data</span>
  <span class="p">};</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">entry</span><span class="p">));</span>
<span class="p">}</span>

<span class="c1">// Utilisation</span>
<span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">INFO</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Outil exécuté</span><span class="dl">'</span><span class="p">,</span> <span class="p">{</span> <span class="na">tool</span><span class="p">:</span> <span class="nx">name</span><span class="p">,</span> <span class="na">duration</span><span class="p">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">()</span> <span class="o">-</span> <span class="nx">start</span> <span class="p">});</span>
<span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">ERROR</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Validation échouée</span><span class="dl">'</span><span class="p">,</span> <span class="p">{</span> <span class="na">tool</span><span class="p">:</span> <span class="nx">name</span><span class="p">,</span> <span class="na">error</span><span class="p">:</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span> <span class="p">});</span>

Redirigez les logs vers un fichier :

<span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"filesystem"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"node"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"/chemin/dist/mcp-stdio.js"</span><span class="p">],</span><span class="w">
      </span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"MCP_LOG_FILE"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/tmp/mcp-server.log"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span>

Et dans votre code :

<span class="kd">const</span> <span class="nx">logFile</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">MCP_LOG_FILE</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">logFile</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">fs</span><span class="dl">'</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">originalError</span> <span class="o">=</span> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">;</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span> <span class="o">=</span> <span class="p">(...</span><span class="nx">args</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
    <span class="nx">fs</span><span class="p">.</span><span class="nx">appendFileSync</span><span class="p">(</span><span class="nx">logFile</span><span class="p">,</span> <span class="nx">args</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="dl">'</span><span class="s1"> </span><span class="dl">'</span><span class="p">)</span> <span class="o">+</span> <span class="dl">'</span><span class="se">\n</span><span class="dl">'</span><span class="p">);</span>
    <span class="nx">originalError</span><span class="p">(...</span><span class="nx">args</span><span class="p">);</span>
  <span class="p">};</span>
<span class="p">}</span>

Aller Plus Loin

Maintenant que votre serveur fonctionne avec Claude, voici des idées d’amélioration :

1. Ajouter Plus d’Outils

Créez de nouveaux outils pour :

  • Écrire des fichiers (writeFile)
  • Exécuter des commandes shell (execCommand)
  • Interroger des bases de données (queryDB)
  • Appeler des APIs externes (fetchAPI)

2. Contexte Persistant

Ajoutez un système de mémoire :

<span class="kd">const</span> <span class="nx">context</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Map</span><span class="p">();</span>

<span class="c1">// Dans un outil</span>
<span class="nx">context</span><span class="p">.</span><span class="kd">set</span><span class="p">(</span><span class="dl">'</span><span class="s1">lastFile</span><span class="dl">'</span><span class="p">,</span> <span class="nx">filePath</span><span class="p">);</span>

<span class="c1">// Dans un autre outil</span>
<span class="kd">const</span> <span class="nx">lastFile</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="kd">get</span><span class="p">(</span><span class="dl">'</span><span class="s1">lastFile</span><span class="dl">'</span><span class="p">);</span>

3. Notifications

Envoyez des notifications quand des événements importants surviennent :

<span class="c1">// Surveillez un dossier</span>
<span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span><span class="p">(</span><span class="dl">'</span><span class="s1">/important</span><span class="dl">'</span><span class="p">,</span> <span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">filename</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
  <span class="c1">// Notifiez Claude via un mécanisme de votre choix</span>
<span class="p">});</span>

4. Intégrations Externes

Connectez votre serveur MCP à :

  • Slack (envoyer/recevoir des messages)
  • GitHub (créer des issues, PRs)
  • Jira (gérer des tickets)
  • Gmail (lire/envoyer des emails)

Questions Fréquentes

Q : Puis-je avoir plusieurs serveurs MCP en même temps ?

R : Oui ! Ajoutez-les dans la configuration :

<span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"filesystem"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="nl">"database"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="nl">"api"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span>

Q : Claude peut-il utiliser mes outils sans me demander ?

R : Non. Claude demande TOUJOURS la permission avant d’exécuter un outil. C’est une garantie de sécurité côté Anthropic.

Q : Les outils fonctionnent-ils avec Claude sur le web ?

R : Actuellement, non. Les serveurs MCP ne fonctionnent qu’avec Claude Desktop. Mais Anthropic travaille sur d’autres intégrations.

Q : Puis-je partager mon serveur MCP avec d’autres ?

R : Oui ! Publiez-le sur npm ou GitHub. D’autres pourront l’installer et le configurer dans leur Claude Desktop.

Conclusion

Félicitations ! Vous avez terminé cette série de 6 articles et construit un serveur MCP complet de A à Z :

Partie 1 : Vous avez compris le concept MCP et son architecture ✅ Partie 2 : Vous avez configuré un projet TypeScript professionnel ✅ Partie 3 : Vous avez créé vos premiers outils fonctionnels ✅ Partie 4 : Vous avez implémenté le système de découverte automatique ✅ Partie 5 : Vous avez sécurisé votre serveur avec 4 couches de protection ✅ Partie 6 : Vous avez connecté tout ça à Claude Desktop

Vous avez maintenant :

  • Un serveur MCP production-ready
  • Des outils extensibles et sécurisés
  • Une intégration complète avec Claude Desktop
  • Les compétences pour créer vos propres outils

Et maintenant ?

Le MCP ouvre des possibilités infinies. Vous pouvez :

  • Automatiser vos tâches répétitives avec Claude
  • Créer des assistants spécialisés pour votre domaine
  • Intégrer Claude dans vos workflows d’entreprise
  • Partager vos outils avec la communauté

Le code que vous avez écrit est solide, sécurisé et maintenable. Il peut servir de base pour des projets bien plus ambitieux. J’ai hâte de voir ce que vous allez construire avec !


Article publié le 17 décembre 2025 par Nicolas Dabène - Expert PHP & PrestaShop avec 15+ ans d’expérience dans l’architecture logicielle et l’intégration d’IA

Série complète MCP :

Merci d’avoir suivi cette série ! N’hésitez pas à partager vos créations MCP, je serais ravi de les découvrir.

LinkedIn

Suivez mes analyses IA et e-commerce

Je partage des retours terrain sur les agents IA, PrestaShop, MCP et l automatisation pour les equipes e-commerce.

Me suivre sur LinkedIn