<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lajiaojiang</title>
    <description>The latest articles on DEV Community by lajiaojiang (@lajiaojiang).</description>
    <link>https://dev.to/lajiaojiang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4079567%2F6db3d669-ab50-4029-a35c-e75984c52673.png</url>
      <title>DEV Community: lajiaojiang</title>
      <link>https://dev.to/lajiaojiang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lajiaojiang"/>
    <language>en</language>
    <item>
      <title>MCP server configured, but zero tools show up? Here's probably why</title>
      <dc:creator>lajiaojiang</dc:creator>
      <pubDate>Sun, 16 Aug 2026 00:28:53 +0000</pubDate>
      <link>https://dev.to/lajiaojiang/mcp-server-configured-but-zero-tools-show-up-heres-probably-why-5a25</link>
      <guid>https://dev.to/lajiaojiang/mcp-server-configured-but-zero-tools-show-up-heres-probably-why-5a25</guid>
      <description>&lt;p&gt;You add an MCP server to your config. The JSON is valid. The client even says "connected." And then: &lt;strong&gt;zero tools&lt;/strong&gt;. No error. No hint. The official &lt;code&gt;/doctor&lt;/code&gt; says nothing is wrong.&lt;/p&gt;

&lt;p&gt;If this has happened to you, welcome — the GitHub issues are full of us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/modelcontextprotocol/servers/issues/40" rel="noopener noreferrer"&gt;MCP servers fail to connect with &lt;code&gt;npx&lt;/code&gt; on Windows&lt;/a&gt; — 112 comments&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/modelcontextprotocol/servers/issues/64" rel="noopener noreferrer"&gt;MCP Servers Don't Work with NVM&lt;/a&gt; — 182 reactions&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/homeassistant-ai/ha-mcp/issues/1743" rel="noopener noreferrer"&gt;Claude Desktop silently drops all tools when a server key contains parentheses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-code/issues/64768" rel="noopener noreferrer"&gt;Claude Code's &lt;code&gt;/doctor&lt;/code&gt; fails to detect MCP configuration errors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After reading through these threads, the failures cluster into a handful of causes — and none of them are the MCP &lt;em&gt;server's&lt;/em&gt; fault. They're &lt;strong&gt;client config&lt;/strong&gt; failures that official tools don't diagnose. Here's the field guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Parentheses (or brackets) in the server name
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Home Assistant (ha-mcp)"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ha-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks harmless. But at least one major client &lt;strong&gt;silently drops every tool&lt;/strong&gt; when an &lt;code&gt;mcpServers&lt;/code&gt; key contains parentheses. Server shows connected, &lt;code&gt;tools/list&lt;/code&gt; completes, and the UI displays nothing. One user reported chasing this for hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; rename the key — letters, numbers, hyphens, underscores only.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Raw &lt;code&gt;npx&lt;/code&gt; on Windows
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GUI apps on Windows frequently fail to spawn &lt;code&gt;npx&lt;/code&gt; directly. The terminal works; the desktop client doesn't, because GUI processes don't get your shell environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; wrap it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. NVM (or any version-manager) paths
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npx&lt;/code&gt; works in your terminal because your shell loads NVM. GUI apps don't load your shell profile, so the binary simply isn't on their PATH. The 182-reaction issue above is exactly this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; use the absolute path to the binary, or a shim the GUI can resolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. JSON that "looks fine"
&lt;/h2&gt;

&lt;p&gt;One unescaped Windows path (&lt;code&gt;"cwd": "C:\tools\my-server"&lt;/code&gt;) and the whole config silently fails to parse. Some clients report this; others just show zero servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; run the file through any JSON validator — &lt;code&gt;python -m json.tool config.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Stale caches and environment drift
&lt;/h2&gt;

&lt;p&gt;Users report &lt;code&gt;uv&lt;/code&gt;-launched servers that keep failing &lt;em&gt;after&lt;/em&gt; the underlying script was fixed, because the tool runner cached the broken environment. Also: &lt;code&gt;env&lt;/code&gt; blocks that reference variables the GUI process doesn't have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; clear the tool runner's cache; inline absolute paths in &lt;code&gt;env&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  I got tired of checking these by hand
&lt;/h2&gt;

&lt;p&gt;So I wrote a tiny local CLI that reads MCP client configs and reports exactly these failure classes — with the reason and a suggested fix for each:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pipx &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/lajiaojiang-ai/mcp-why.git
mcp-why                    &lt;span class="c"&gt;# auto-discover common client configs&lt;/span&gt;
mcp-why &lt;span class="nt"&gt;--config&lt;/span&gt; path/to/claude_desktop_config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ERROR] risky_server_name: Server name 'Home Assistant (ha-mcp)' contains parentheses or brackets
  why: Some clients silently drop every tool when an mcpServers key contains parentheses.
  fix: Rename the key to letters, numbers, hyphen, or underscore only.

[WARNING] windows_npx: Server 'Home Assistant (ha-mcp)' launches npx directly on Windows
  why: GUI apps often fail to spawn npx unless wrapped with cmd.exe /c.
  fix: Use {"command":"cmd","args":["/c","npx","-y","..."]}.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's also an optional &lt;code&gt;--probe&lt;/code&gt; that sends only &lt;code&gt;initialize&lt;/code&gt; + &lt;code&gt;tools/list&lt;/code&gt; over stdio (it never calls a tool, and it can't touch your real endpoints — it's read-only diagnostics against config + a handshake).&lt;/p&gt;

&lt;p&gt;Repo: &lt;strong&gt;&lt;a href="https://github.com/lajiaojiang-ai/mcp-why" rel="noopener noreferrer"&gt;https://github.com/lajiaojiang-ai/mcp-why&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;v0.1 knows six failure classes. There are more — send issues.&lt;/li&gt;
&lt;li&gt;It's a &lt;strong&gt;config&lt;/strong&gt; diagnostician. If the config is fine and the server itself is broken, use the official &lt;a href="https://github.com/modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;MCP Inspector&lt;/a&gt; — they're complements, not competitors.&lt;/li&gt;
&lt;li&gt;Client behavior changes fast; a rule that's true for one client version may soften in the next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it saved you from one more hour of staring at a valid-looking config, that's the whole point. Star it if it's useful, open an issue if it's wrong.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>debugging</category>
      <category>mcp</category>
      <category>software</category>
    </item>
  </channel>
</rss>
