<?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: Trần Hoàng Tú</title>
    <description>The latest articles on DEV Community by Trần Hoàng Tú (@tranhoangtuit).</description>
    <link>https://dev.to/tranhoangtuit</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3796822%2F0d29e9bd-eb76-412b-856e-78820cbb4c57.png</url>
      <title>DEV Community: Trần Hoàng Tú</title>
      <link>https://dev.to/tranhoangtuit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tranhoangtuit"/>
    <language>en</language>
    <item>
      <title>Why I Built Chrome DevTools for AI Agents — AgentLens</title>
      <dc:creator>Trần Hoàng Tú</dc:creator>
      <pubDate>Sun, 29 Mar 2026 18:27:04 +0000</pubDate>
      <link>https://dev.to/tranhoangtuit/why-i-built-chrome-devtools-for-ai-agents-agentlens-5gfi</link>
      <guid>https://dev.to/tranhoangtuit/why-i-built-chrome-devtools-for-ai-agents-agentlens-5gfi</guid>
      <description>&lt;p&gt;My AI agent kept failing in production. The error showed up at step 7, but the actual bug was at step 3. I spent 4 hours reading through trace logs before finding it.&lt;/p&gt;

&lt;p&gt;That's when I realized: &lt;strong&gt;we need Chrome DevTools for AI agents.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Everyone's building AI agents. LangChain, CrewAI, AutoGen — the frameworks are amazing. But when your agent breaks in production, you're on your own.&lt;/p&gt;

&lt;p&gt;Traditional logging gives you API calls and timestamps. But it doesn't answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did the agent choose tool A over tool B?&lt;/li&gt;
&lt;li&gt;Where exactly did the reasoning go wrong?&lt;/li&gt;
&lt;li&gt;Was it a context window overflow or a hallucinated tool call?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've debugged hundreds of AI agent failures. The patterns are always the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context window overflow&lt;/strong&gt; — agent stuffs too much into the prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool selection errors&lt;/strong&gt; — wrong tool for the task&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infinite loops&lt;/strong&gt; — agent keeps retrying the same failed approach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated tool calls&lt;/strong&gt; — agent invents tools that don't exist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing error handling&lt;/strong&gt; — silent failures cascade&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;AgentLens is an open-source, self-hosted observability platform. Think of it as Chrome DevTools, but for AI agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trace Everything
&lt;/h3&gt;

&lt;p&gt;Drop in 2 lines of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;agentlens&lt;/span&gt;

&lt;span class="nd"&gt;@agentlens.trace&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Every tool call, LLM call, and decision is recorded
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Replay Like a Flight Recorder
&lt;/h3&gt;

&lt;p&gt;Time-travel through your agent's execution step-by-step. See exactly what happened at each point. Edit inputs at any step and see how the output changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Autopsy (My Favorite Feature)
&lt;/h3&gt;

&lt;p&gt;Click "Autopsy" on a failed trace. AI analyzes the full execution tree and tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Root cause:&lt;/strong&gt; "Context window overflow at step 4"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity:&lt;/strong&gt; Critical&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggested fix:&lt;/strong&gt; "Add a summarization step between search and analysis"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the feature no one else has. LangSmith doesn't have it. Langfuse doesn't have it.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Protocol Tracing
&lt;/h3&gt;

&lt;p&gt;If you're using MCP (Model Context Protocol) — which Claude, Cursor, and Windsurf all use — AgentLens is the only tool that traces MCP calls visually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentlens.integrations.mcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;patch_mcp&lt;/span&gt;
&lt;span class="nf"&gt;patch_mcp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Auto-instruments all MCP tool calls
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Self-Hosted?
&lt;/h2&gt;

&lt;p&gt;I believe your agent data should stay on your infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No vendor lock-in&lt;/li&gt;
&lt;li&gt;No data leaving your network&lt;/li&gt;
&lt;li&gt;No per-seat pricing&lt;/li&gt;
&lt;li&gt;Free forever, unlimited traces&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI + SQLModel (SQLite for dev, PostgreSQL for prod)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; React 19 + Vite + Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDKs:&lt;/strong&gt; Python, TypeScript, .NET 8, Go CLI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy:&lt;/strong&gt; &lt;code&gt;docker compose up&lt;/code&gt; — that's it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentlens-observe
docker compose up  &lt;span class="c"&gt;# Dashboard at http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/tranhoangtu-it/agentlens" rel="noopener noreferrer"&gt;github.com/tranhoangtu-it/agentlens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star it if you find it useful. Every star helps an open-source developer keep going.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>observability</category>
    </item>
    <item>
      <title>How I Built mcpman — A Universal MCP Server Package Manager for 10+ AI IDEs</title>
      <dc:creator>Trần Hoàng Tú</dc:creator>
      <pubDate>Thu, 26 Mar 2026 03:15:21 +0000</pubDate>
      <link>https://dev.to/tranhoangtuit/how-i-built-mcpman-a-universal-mcp-server-package-manager-for-10-ai-ides-48pp</link>
      <guid>https://dev.to/tranhoangtuit/how-i-built-mcpman-a-universal-mcp-server-package-manager-for-10-ai-ides-48pp</guid>
      <description>&lt;p&gt;When I first started working with the Model Context Protocol (MCP), I noticed something frustrating: each AI IDE had its own way of managing MCP servers. Claude Desktop had one config format, VS Code needed another, Cursor required yet another approach.&lt;/p&gt;

&lt;p&gt;That's when I built &lt;strong&gt;mcpman&lt;/strong&gt; — a universal package manager for MCP servers that works seamlessly across Claude, VS Code, Cursor, Windsurf, Zed, and 10+ other AI IDEs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: MCP Configuration Chaos
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol opened up incredible possibilities for AI-assisted development. But each IDE implemented MCP differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Desktop&lt;/strong&gt; uses a JSON config file in a specific directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt; extensions need settings in &lt;code&gt;settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; has its own configuration system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf&lt;/strong&gt;, &lt;strong&gt;Zed&lt;/strong&gt;, &lt;strong&gt;Codeium&lt;/strong&gt;, &lt;strong&gt;Aider&lt;/strong&gt; — all different&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you wanted to use the same MCP server across multiple IDEs, you'd manually find the right config file for each IDE, learn the specific format, keep them in sync, and debug inconsistencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built mcpman
&lt;/h2&gt;

&lt;p&gt;The real catalyst came when I was helping a colleague set up multiple MCP servers. We spent 45 minutes just getting the configurations right.&lt;/p&gt;

&lt;p&gt;That's when I asked: &lt;em&gt;What if there was a single command-line tool that could install, manage, and update MCP servers across all IDEs at once?&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install an MCP server once, and it works everywhere&lt;/span&gt;
mcpman &lt;span class="nb"&gt;install &lt;/span&gt;postgres-server

&lt;span class="c"&gt;# List all installed servers&lt;/span&gt;
mcpman list

&lt;span class="c"&gt;# Remove a server across all IDEs&lt;/span&gt;
mcpman uninstall postgres-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Architecture &amp;amp; Tech Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why TypeScript
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform&lt;/strong&gt; — Works on macOS, Linux, Windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE agnostic&lt;/strong&gt; — Parse and write to different config formats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast iteration&lt;/strong&gt; — Mature ecosystem for file manipulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Familiar&lt;/strong&gt; — Most developers using AI IDEs know JavaScript&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Core Architecture
&lt;/h3&gt;

&lt;p&gt;mcpman is built around a few key concepts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Config Adapters&lt;/strong&gt; — Each IDE has an adapter that knows how to read/write its native config format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server Registry&lt;/strong&gt; — A central registry of known MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI Interface&lt;/strong&gt; — Simple commands that delegate to the right adapter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sync Engine&lt;/strong&gt; — Detects changes and propagates across IDEs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────┐
│         CLI Commands            │
│  (install, list, uninstall)     │
└────────────┬────────────────────┘
             │
┌────────────▼────────────────────┐
│      mcpman Core Engine         │
│  (Config parsing, validation)   │
└────────────┬────────────────────┘
             │
    ┌────────┴────────┬─────────┬──────────┐
    │                 │         │          │
┌───▼────┐  ┌────┬────▼──┐  ┌──▼────┐  ┌─▼────┐
│ Claude │  │VS  │ Cursor │  │Zed    │  │...   │
│Desktop │  │Code│        │  │       │  │      │
└────────┘  └────┴────────┘  └───────┘  └──────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Config Adapter Pattern
&lt;/h3&gt;

&lt;p&gt;Each IDE gets its own adapter class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ConfigAdapter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ServerConfig&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ServerConfig&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;getConfigPath&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means adding support for a new IDE = implementing one adapter class.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Team Sync Feature
&lt;/h2&gt;

&lt;p&gt;One of my favorite features — share configurations via a manifest file:&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mcpman.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;project&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;"servers"&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm:mcpman-postgres"&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-client"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github:myorg/mcp-api-client"&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;Then anyone on your team runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcpman &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Team MCP configuration in minutes instead of hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Fragmentation is Real&lt;/strong&gt; — Every single IDE does things differently. This is both a pain point and an opportunity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Testing Across Platforms is Hard&lt;/strong&gt; — macOS, Windows, Linux all handle file paths differently. Docker helped a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Backwards Compatibility Matters&lt;/strong&gt; — Even early on, breaking changes hurt. Now mcpman auto-migrates old configs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Documentation is Everything&lt;/strong&gt; — First version had great features nobody knew about. I now spend equal time on docs and code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GUI for managing servers&lt;/li&gt;
&lt;li&gt;Central repository of verified MCP servers&lt;/li&gt;
&lt;li&gt;Server versioning and auto-updates&lt;/li&gt;
&lt;li&gt;IDE plugin that shows available servers in your editor&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try mcpman
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mcpman
mcpman list  &lt;span class="c"&gt;# Detect your installed IDEs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⭐ &lt;a href="https://github.com/tranhoangtu-it/mcpman" rel="noopener noreferrer"&gt;github.com/tranhoangtu-it/mcpman&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;I'm &lt;strong&gt;Trần Hoàng Tú&lt;/strong&gt;, a full-stack developer from Vietnam building practical open-source tools. Check out my other projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tranhoangtu-it/ai-hallucination-firewall" rel="noopener noreferrer"&gt;AI Hallucination Firewall&lt;/a&gt; — Pre-commit proxy detecting hallucinated code&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tranhoangtu-it/agentlens" rel="noopener noreferrer"&gt;AgentLens&lt;/a&gt; — Self-hosted AI agent observability&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tranhoangtu-it/rt-translator-desktop" rel="noopener noreferrer"&gt;RT Translator Desktop&lt;/a&gt; — Offline meeting translation with Whisper + Ollama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Website: &lt;a href="https://tuth.site" rel="noopener noreferrer"&gt;tuth.site&lt;/a&gt; | GitHub: &lt;a href="https://github.com/tranhoangtu-it" rel="noopener noreferrer"&gt;@tranhoangtu-it&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built the missing package manager for MCP servers</title>
      <dc:creator>Trần Hoàng Tú</dc:creator>
      <pubDate>Fri, 27 Feb 2026 17:30:17 +0000</pubDate>
      <link>https://dev.to/tranhoangtuit/i-built-the-missing-package-manager-for-mcp-servers-3pi3</link>
      <guid>https://dev.to/tranhoangtuit/i-built-the-missing-package-manager-for-mcp-servers-3pi3</guid>
      <description>&lt;p&gt;If you use Claude Desktop, Cursor, VS Code, or Windsurf with MCP servers, you know the pain: manually editing JSON config files, each client storing configs differently, no way to know if a server is healthy, and no version pinning.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;mcpman&lt;/strong&gt; to fix this.&lt;/p&gt;

&lt;p&gt;## What is MCP?&lt;/p&gt;

&lt;p&gt;Model Context Protocol (MCP) is Anthropic's open standard that lets AI assistants connect to external tools and data sources. Think of MCP servers as plugins for your AI coding assistant.&lt;/p&gt;

&lt;p&gt;The problem? Installing and managing these servers is still manual and fragmented.&lt;/p&gt;

&lt;p&gt;## The gap nobody filled&lt;/p&gt;

&lt;p&gt;I researched every existing tool:&lt;/p&gt;

&lt;p&gt;| Tool | Focus | Limitation |&lt;br&gt;
  |------|-------|-----------|&lt;br&gt;
  | Smithery CLI | Registry | Claude-only, no health checks |&lt;br&gt;
  | mcpm.sh | Config editing | Limited multi-client, no lockfile |&lt;br&gt;
  | mcp-get | Package install | Dead (redirected to Smithery) |&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody owned the operational layer&lt;/strong&gt; — health monitoring, version pinning, cross-client sync, reproducible setups.&lt;/p&gt;

&lt;p&gt;## Enter mcpman&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
sh
  # Install an MCP server across all your AI clients
  npx mcpman install @modelcontextprotocol/server-filesystem

  # See what's installed with health status
  npx mcpman list

  # Run diagnostics
  npx mcpman doctor

  # Reproducible team setup
  npx mcpman init

  What it does

  - install &amp;lt;server&amp;gt; — resolves from npm, Smithery, or GitHub. Auto-detects installed clients and configures them all.
  - list — shows every installed server with health indicators (green/yellow/red).
  - doctor — runs 4-layer diagnostics: runtime check, env var validation, process spawn, MCP JSON-RPC handshake.
  - remove — clean uninstall from all clients at once.
  - init — creates mcpman.lock for reproducible team setups. Share your MCP config like you share package-lock.json.

  Multi-client support

  mcpman manages configs for all 4 major AI clients:

  - Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json
  - Cursor — ~/.cursor/mcp.json
  - VS Code — workspace .vscode/settings.json
  - Windsurf — ~/.codeium/windsurf/mcp_config.json

  One mcpman install writes to all of them.

  Architecture

  Built with TypeScript and these focused libraries:

  - citty — declarative CLI framework (zero boilerplate)
  - @clack/prompts — beautiful interactive UX
  - picocolors — terminal colors (3x smaller than chalk)
  - nanospinner — progress spinners

  The entire CLI is ~45KB bundled. No daemon, no background process.

  The doctor is in

  My favorite feature. mcpman doctor runs parallel health checks:

  1. Runtime check — is node/python/uvx installed?
  2. Env var validation — are required API keys set?
  3. Process spawn — does the server binary actually start?
  4. MCP handshake — does it respond to initialize JSON-RPC?

  npx mcpman doctor

    ✓ server-filesystem    healthy
    ⚠ server-github        missing GITHUB_TOKEN
    ✗ server-slack         process crashed

  Try it

  npm install -g mcpman
  # or just use npx
  npx mcpman install @modelcontextprotocol/server-filesystem

  59 tests passing. MIT licensed. Contributions welcome.

  GitHub: github.com/tranhoangtu-it/mcpman
  npm: npmjs.com/package/mcpman

  What's next (v0.2)

  - Encrypted credential management (no more API keys in JSON)
  - Cross-client config sync
  - Security scanning + trust scoring
  - Auto-update notifications

  ---
  What MCP server management pain points have you hit? I'd love to hear your feedback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>mcp</category>
      <category>opensource</category>
      <category>typescript</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
