Nicolas Dabene
Back to blog
18 December 2025 Nicolas Dabene 6 min

How to Connect MCP Server to Claude?

Connect Your MCP Server to Claude Desktop: The Complete Integration

API IA development Tutorial artificial intelligence
How to Connect MCP Server to Claude?

Connect Your MCP Server to Claude Desktop: The Complete Integration

Connect Your MCP Server to Claude Desktop: The Complete Integration

Here we are. After building an MCP server from A to Z, creating functional tools, implementing automatic discovery, and adding four layers of security, it’s time to see it all work with a real AI. Today, we’re connecting your server to Claude Desktop and you’ll finally see Claude use your tools in real time. This is the moment when everything makes sense.

Introduction

I still remember the first time I saw Claude use one of my MCP tools. After hours of development, testing with curl, validation… seeing it work naturally in a conversation was magical. This is the moment you’re going to experience today.

In this final article of the series, we’ll configure Claude Desktop to connect to your MCP server, test each tool in real conditions, debug common problems, and explore advanced use cases. By the end, you’ll have a personal AI assistant capable of interacting with your files, your data, your systems. All securely.

Prerequisites

Before starting, make sure you have:

Claude Desktop installed: Download it from claude.ai/download if not already done

Your functional MCP server: Parts 1-5 of this series must be complete

Node.js and npm: To run your server

A Claude account: Free or Pro, both work

Understanding the Connection Architecture

Before configuring, let’s visualize how Claude Desktop communicates with your server:

┌─────────────────┐
│  Claude Desktop │
│   (Interface)   │
└────────┬────────┘
         │
         │ Reads configuration
         ↓
┌─────────────────┐
│  Configuration  │
│  claude_desktop │
│   _config.json  │
└────────┬────────┘
         │
         │ Launches automatically
         ↓
┌─────────────────┐
│  Your Server    │
│      MCP        │
│  (Node.js/TS)   │
└────────┬────────┘
         │
         │ Accesses your resources
         ↓
┌─────────────────┐
│   Files /       │
│   Data /        │
│   Systems       │
└─────────────────┘

Claude Desktop reads a configuration file, launches your MCP server in the background, then communicates with it via stdio (standard input/output). Your server doesn’t even need to be an HTTP server for this integration!

Adapting the Server for Stdio

Until now, our server used Express and HTTP. For Claude Desktop integration, we need to create a version that communicates via stdio. Create 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">/**
 * MCP server for 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">// Initialize path validator</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">// Create MCP server</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">/**
   * MCP handlers configuration
   */</span>
  <span class="k">private</span> <span class="nx">setupHandlers</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">// Handler to list tools</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 to execute a tool</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">// Get tool description</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">`Tool '</span><span class="p">${</span><span class="nx">name</span><span class="p">}</span><span class="s2">' not found`</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">// Validate parameters</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">// Specific path validation for file tools</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">file_path</span> <span class="o">||</span> <span class="nx">args</span><span class="p">.</span><span class="nx">directory_path</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">// Execute tool</span>
          <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">`[MCP] Execution: </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">// Format response</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">Operation successful</span><span class="dl">'</span> <span class="p">:</span> <span class="s2">`Error: </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] Error:`</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">`Validation error: </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">`Error: </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">/**
   * Start the server
   */</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] Server started and connected 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] Available tools: </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">// Server startup</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] Fatal error:</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: Note the use of console.error() for logs. Why? Because stdout is reserved for MCP communication. Logs must go to stderr.

Install the MCP SDK:

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

Compile your project:

npx tsc

Test that it compiles without errors. The compiled file will be in dist/mcp-stdio.js.

Claude Desktop Configuration

Claude Desktop looks for its configuration at a specific location depending on your OS:

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

Windows: %APPDATA%\Claude\claude_desktop_config.json

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

Create or edit this file with the following 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="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">"/absolute/path/to/your/project/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>

Replace /absolute/path/to/your/project with the real path to your project folder.

To get the absolute path easily:

<span class="nb">cd</span> /your/project/mcp-server
<span class="nb">pwd</span>
<span class="c"># Copy the result and add /dist/mcp-stdio.js</span>

Complete example:

<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>

Tip: Add the PATH variable if you have “command not found” issues.

Starting Claude Desktop

  1. Completely close Claude Desktop if it’s open
  2. Restart Claude Desktop
  3. Open Developer Tools (on macOS: View → Developer → Toggle Developer Tools)
  4. Look at the console to see connection logs

If everything works, you should see in the console:

[MCP] Server started and connected via stdio
[MCP] Available tools: 3

Verifying Tools Are Available

In Claude Desktop, start a new conversation and type:

What tools do you have available?

Claude should respond something like:

I have several tools to interact with the file system:

  1. readFile: Allows reading the content of a text file
  2. listFiles: Lists files and folders in a directory
  3. searchFiles: Searches for files by name

What would you like me to do?

If Claude doesn’t see your tools, go to the Debugging section below.

First Test: Reading a File

Let’s create a test file in your project:

<span class="nb">echo</span> <span class="s2">"This is a test of the MCP server with Claude Desktop!"</span> <span class="o">></span> test-claude.txt

Now, in Claude, ask:

Read the test-claude.txt file in the current directory and tell me what it contains.

Claude will:

  1. Understand it needs to use the readFile tool
  2. Ask your permission
  3. Execute the tool
  4. Show you the content

Example of real conversation:

You: Read the test-claude.txt file

Claude: I’ll read the test-claude.txt file for you.

[Permission request appears]

[You click “Authorize”]

Claude: The file contains: “This is a test of the MCP server with Claude Desktop!”

Magical, isn’t it? You just saw Claude use YOUR code, YOUR tools, in real time.

Now let’s test more complex interactions:

List all TypeScript files in the src folder

Claude will:

  1. Use listFiles to list src/
  2. Filter .ts files in its response
  3. Present you with an organized list

Or try:

Find all files that contain "security" in their name

Claude will use searchFiles with the right parameter.

Validation Test: Security in Action

Let’s now see our security working:

Read the file ../../../../etc/passwd

Claude will attempt to use readFile with this path, but your PathValidator will block the request. You’ll see an error:

I couldn’t read this file. The error indicates: “Paths with “..” are not allowed (path traversal)”

Perfect! Your security works even with Claude.

Advanced Use Cases

Now that the connection works, let’s explore real scenarios:

1. Code Analysis

Analyze all TypeScript files in the src/tools folder and tell me how many lines of code there are in total

Claude will:

  • List files in src/tools
  • Read each .ts file
  • Count lines
  • Give you a report

2. Automatic Documentation

Create a README.md that documents all available tools in src/tools with their parameters

Claude will:

  • List files
  • Read each tool
  • Extract important information
  • Generate a formatted README

3. Search and Summary

Find all files that mention "validation" and give me a summary of how validation is implemented

Claude will:

  • Search for relevant files
  • Read them
  • Analyze the code
  • Synthesize the information

4. Assisted Refactoring

Look at the src/tools/readFile.ts file and suggest performance improvements

Claude will:

  • Read the file
  • Analyze the code with its expertise
  • Propose concrete optimizations

Debugging: Common Problems

Problem 1: Claude doesn’t see the tools

Symptom: Claude responds “I don’t have tools available for that”

Solutions:

  1. Check configuration: ```bash # macOS

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

Check that path is correct

ls /path/to/your/project/dist/mcp-stdio.js


2. Check compilation:
```bash
cd your-project
npx tsc
ls dist/mcp-stdio.js  # Must exist

  1. Test manually: ``` node dist/mcp-stdio.js # Shouldn't crash immediately

  2. Look at Claude Desktop’s Developer Tools:

    • Search for errors in red
    • Search for “[MCP]” in logs

Problem 2: “command not found” error

Symptom: In Developer Tools: “Error: spawn node ENOENT”

Solution: Add full PATH in 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">"/absolute/path/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>

Find your node path with:

which node

Problem 3: Server crashes immediately

Symptom: Logs show server starts then stops

Checks:

  1. Test server standalone: ``` node dist/mcp-stdio.js # Type something and Enter # Server should stay active

  2. Check dependencies: ``` npm install npm list @modelcontextprotocol/sdk

  3. Look at stderr: ``` node dist/mcp-stdio.js 2>error.log # Look at error.log for errors

    
    

Conclusion

Congratulations! You’ve completed this 6-article series and built a complete MCP server from A to Z:

Part 1: You understood the MCP concept and its architecture ✅ Part 2: You configured a professional TypeScript project ✅ Part 3: You created your first functional tools ✅ Part 4: You implemented automatic discovery system ✅ Part 5: You secured your server with 4 protection layers ✅ Part 6: You connected it all to Claude Desktop

You now have:

  • A production-ready MCP server
  • Extensible and secure tools
  • Complete integration with Claude Desktop
  • The skills to create your own tools

And now?

MCP opens infinite possibilities. You can:

  • Automate your repetitive tasks with Claude
  • Create specialized assistants for your domain
  • Integrate Claude into your enterprise workflows
  • Share your tools with the community

The code you’ve written is solid, secure, and maintainable. It can serve as a foundation for much more ambitious projects. I can’t wait to see what you’ll build with it!


Article published on December 17, 2025 by Nicolas Dabène - PHP & PrestaShop Expert with 15+ years of experience in software architecture and AI integration

Complete MCP series:

Thank you for following this series! Feel free to share your MCP creations, I’d love to discover them.

LinkedIn

Follow my AI and e-commerce analysis

I share practical notes on AI agents, PrestaShop architecture, MCP and automation for e-commerce teams.

Follow on LinkedIn