<?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: Hi MORISHIGE</title>
    <description>The latest articles on DEV Community by Hi MORISHIGE (@himorishige).</description>
    <link>https://dev.to/himorishige</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%2F3473639%2F7a720bf9-6781-43fa-a22a-997fd3002667.jpg</url>
      <title>DEV Community: Hi MORISHIGE</title>
      <link>https://dev.to/himorishige</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/himorishige"/>
    <language>en</language>
    <item>
      <title>Getting Started with Multi-MCP Using Hatago MCP Hub — One Config to Connect Them All</title>
      <dc:creator>Hi MORISHIGE</dc:creator>
      <pubDate>Mon, 01 Sep 2025 15:50:39 +0000</pubDate>
      <link>https://dev.to/himorishige/getting-started-with-multi-mcp-using-hatago-mcp-hub-one-config-to-connect-them-all-2bjp</link>
      <guid>https://dev.to/himorishige/getting-started-with-multi-mcp-using-hatago-mcp-hub-one-config-to-connect-them-all-2bjp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Hatago (旅籠) - Traditional Japanese inn from the Edo period that provided lodging for travelers. A relay point connecting modern AI tools with MCP servers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;🏮 Hatago MCP Hub is a lightweight MCP hub that consolidates multiple MCP servers into a single endpoint consumable across multiple AI clients like Claude Code, Cursor, Windsurf, and Codex CLI. By running as middleware on top of Hono, Hatago integrates and orchestrates multiple MCP servers to give you flexible, centralized operations. This post walks through the background, architecture, setup, operations, and current limitations.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/himorishige" rel="noopener noreferrer"&gt;
        himorishige
      &lt;/a&gt; / &lt;a href="https://github.com/himorishige/hatago-mcp-hub" rel="noopener noreferrer"&gt;
        hatago-mcp-hub
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Hatago MCP Hub is a lightweight hub server that provides unified management for multiple MCP servers.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;strong&gt;English&lt;/strong&gt; | &lt;a href="https://github.com/himorishige/hatago-mcp-hub/./README.ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🏮 Hatago MCP Hub&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@himorishige/hatago-mcp-hub" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6f6e18b972f1cb69514e752d473b6cfdff11f0a3e870e8dbf1c00c2a5abd2930/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f4068696d6f726973686967652f68617461676f2d6d63702d6875623f6c6f676f3d6e706d26636f6c6f723d636230303030" alt="npm"&gt;&lt;/a&gt;
&lt;a href="https://github.com/himorishige/hatago-mcp-hub/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/09c7e3c370716a5579894dbe8d1b6f47e4aac213126dab363755fcb5bd9f57f3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f68696d6f726973686967652f68617461676f2d6d63702d6875623f646973706c61795f6e616d653d74616726736f72743d73656d766572" alt="GitHub Release"&gt;&lt;/a&gt;
&lt;a href="https://deepwiki.com/himorishige/hatago-mcp-hub" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f5ae213ac378635adeb5d7f13cef055ad2f7d9a47b36de7b1c67dbe09f609ca/68747470733a2f2f6465657077696b692e636f6d2f62616467652e737667" alt="Ask DeepWiki"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hatago (旅籠) — A relay point connecting modern AI tools with MCP servers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Hatago MCP Hub is a lightweight hub that unifies access to multiple MCP (Model Context Protocol) servers from tools like Claude Code, Codex CLI, Cursor, Windsurf, and VS Code.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Docs index: &lt;code&gt;docs/README.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Canonical CLI &amp;amp; Hub guide: &lt;code&gt;packages/mcp-hub/README.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Public docs site (JA default): &lt;a href="https://hatago.dev/ja/" rel="nofollow noopener noreferrer"&gt;https://hatago.dev/ja/&lt;/a&gt; — English: &lt;a href="https://hatago.dev/en/" rel="nofollow noopener noreferrer"&gt;https://hatago.dev/en/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://dev.to/himorishige/getting-started-with-multi-mcp-using-hatago-mcp-hub-one-config-to-connect-them-all-2bjp" rel="nofollow"&gt;Dev.to: Getting Started with Multi-MCP Using Hatago MCP Hub — One Config to Connect Them All&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🚀 Performance (v0.0.14)&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;8.44x Faster Startup&lt;/strong&gt; - 85.66ms → 10.14ms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17% Smaller Package&lt;/strong&gt; - 1.04MB → 854KB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Architecture&lt;/strong&gt; - Direct server management without abstraction layers&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🎯 Simple &amp;amp; Lightweight&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Configuration Start (HTTP mode)&lt;/strong&gt; - &lt;code&gt;npx @himorishige/hatago-mcp-hub serve --http&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-invasive to Existing Projects&lt;/strong&gt; - Doesn't pollute your project directory&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🔌 Rich Connectivity&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Transport Support&lt;/strong&gt; - STDIO / HTTP / SSE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote MCP&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/himorishige/hatago-mcp-hub" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Why I built Hatago MCP Hub
&lt;/h2&gt;

&lt;p&gt;As the number of MCP servers grows, keeping per-client configurations in sync becomes painful. You update &lt;code&gt;.mcp.json&lt;/code&gt;, but forget to update another tool (e.g., TOML-based Codex CLI). There are similar projects like the &lt;a href="https://github.com/docker/hub-mcp" rel="noopener noreferrer"&gt;Docker Hub MCP Server&lt;/a&gt;, and that might work for many. But some teams can’t use Docker Desktop due to constraints, or they simply want the freedom to choose MCP servers independently. As a result, per-client custom configurations continue to proliferate.&lt;/p&gt;

&lt;p&gt;To calm this configuration sprawl, I took the approach: consolidate everything behind a single MCP server (a hub), and point all clients at Hatago. It started as a small learning project for MCP, but after validating practical needs—name collision avoidance, progress relay, hot reload, etc.—the design evolved into what it is today.&lt;/p&gt;

&lt;h2&gt;
  
  
  High-level architecture
&lt;/h2&gt;

&lt;p&gt;Hatago consists of three layers: the core hub, an MCP registry (Tools/Resources/Prompts), and the transport layer. It sits between AI clients and multiple MCP servers, brokering JSON-RPC/MCP traffic. A key design choice is transport independence: whether you connect via STDIO or Streamable HTTP/SSE/WebSocket, the upper logic behaves identically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlox1uzdoqo7kr4z0z3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlox1uzdoqo7kr4z0z3h.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Internally, the hub aggregates tools from each MCP server to form a unified catalog. The critical part here is avoiding tool name collisions. Hatago uses the &lt;code&gt;serverId_toolName&lt;/code&gt; format as the public name for clients, while delegating execution to the original MCP server using its native tool name. From the client’s perspective, names are unique and their server affiliation is visible at a glance.&lt;/p&gt;

&lt;p&gt;Another key capability is transparent relay of progress notifications (&lt;code&gt;notifications/progress&lt;/code&gt;). When a long-running operation emits progress from a downstream server, Hatago forwards it to the client as-is, preserving UX. The same goes for sampling (&lt;code&gt;sampling/createMessage&lt;/code&gt;): when a downstream server requests LLM generation, Hatago safely hands it to the upstream client and returns the result back. In testing many servers, few currently emit &lt;code&gt;notifications/progress&lt;/code&gt;, and not many tools can leverage &lt;code&gt;sampling&lt;/code&gt; yet—but Hatago supports them in anticipation of wider adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Hatago ships with a CLI and can be tried either inside an app repo or in a dedicated repo. Generate a config, then start either STDIO or Streamable HTTP.&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;# Initialize (interactive or quick defaults)&lt;/span&gt;
npx @himorishige/hatago-mcp-hub init

&lt;span class="c"&gt;# Explicit mode selection&lt;/span&gt;
npx @himorishige/hatago-mcp-hub init &lt;span class="nt"&gt;--mode&lt;/span&gt; stdio
npx @himorishige/hatago-mcp-hub init &lt;span class="nt"&gt;--mode&lt;/span&gt; http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List the MCP servers you want to connect in the generated &lt;code&gt;hatago.config.json&lt;/code&gt;. You can manage both local MCPs (run via &lt;code&gt;npx&lt;/code&gt; or &lt;code&gt;node&lt;/code&gt;) and remote Streamable HTTP/SSE MCPs in a single file. Environment variable expansion like &lt;code&gt;${VAR}&lt;/code&gt; or &lt;code&gt;${VAR:-default}&lt;/code&gt; is supported, letting you reuse one config across dev and prod.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "$schema": "https://raw.githubusercontent.com/himorishige/hatago-mcp-hub/main/schemas/config.schema.json",
  "version": 1,
  "logLevel": "info",
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
      "tags": ["dev", "local"]
    },
    "deepwiki": {
      "url": "https://mcp.deepwiki.com/sse",
      "type": "sse",
      "tags": ["dev", "production", "documentation"]
    },
    "api": {
      "url": "${API_BASE_URL:-https://api.example.com}/mcp",
      "headers": { "Authorization": "Bearer ${API_KEY}" },
      "tags": ["production", "api"]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starting is straightforward. Use STDIO for a single client; use Streamable HTTP when sharing across multiple clients. A &lt;code&gt;--watch&lt;/code&gt; mode reloads on config changes.&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;# STDIO mode (great for Claude Code)&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--stdio&lt;/span&gt; &lt;span class="nt"&gt;--config&lt;/span&gt; ./hatago.config.json

&lt;span class="c"&gt;# HTTP mode (share across multiple clients)&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--http&lt;/span&gt;  &lt;span class="nt"&gt;--config&lt;/span&gt; ./hatago.config.json

&lt;span class="c"&gt;# Hot reload on config changes&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--stdio&lt;/span&gt; &lt;span class="nt"&gt;--watch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Tip: Built-in internal tools make operations convenient. Use &lt;code&gt;_internal_hatago_status&lt;/code&gt; to check connections, &lt;code&gt;_internal_hatago_reload&lt;/code&gt; to manually reload, and &lt;code&gt;_internal_hatago_list_servers&lt;/code&gt; to list child servers. Invoke them like regular MCP tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Profile management with tags
&lt;/h2&gt;

&lt;p&gt;With Hatago’s tag feature, you can group MCP servers into profiles—dev, prod, test—and select only what you need at startup. One config file can manage multiple environments, simplifying team and personal setup switches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding tags
&lt;/h3&gt;

&lt;p&gt;Add a &lt;code&gt;tags&lt;/code&gt; field to each server in &lt;code&gt;hatago.config.json&lt;/code&gt;. Non-English tags are supported as well, if you prefer more intuitive names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "filesystem-dev": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "./src"],
      "tags": ["dev", "local", "開発"]
    },
    "github-api": {
      "url": "https://api.github.com/mcp",
      "headers": { "Authorization": "Bearer ${GITHUB_TOKEN}" },
      "tags": ["dev", "production", "github"]
    },
    "database-prod": {
      "command": "mcp-server-postgres",
      "env": { "DATABASE_URL": "${PROD_DB_URL}" },
      "tags": ["production", "本番", "database"]
    },
    "test-mock": {
      "command": "node",
      "args": ["./mocks/test-server.js"],
      "tags": ["test", "テスト"]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Filter by tags at startup
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;--tags&lt;/code&gt; to filter which servers start. If you specify multiple tags, servers matching any of them will start.&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;# Start only dev servers&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; dev

&lt;span class="c"&gt;# Start only production servers&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; production

&lt;span class="c"&gt;# Start both dev and test servers&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; dev,test

&lt;span class="c"&gt;# Non-English tags also work&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; 開発,テスト
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Real-world scenarios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Personal dev: Work with a lightweight dev set in the morning, then include prod-equivalent servers before deployment.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Local dev only&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nt"&gt;--watch&lt;/span&gt;

&lt;span class="c"&gt;# Pre-deploy checks (include some prod servers)&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="nb"&gt;local&lt;/span&gt;,production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Team roles: Frontend vs backend engineers can share the same config while starting different server subsets.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Frontend developers&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; frontend,mock

&lt;span class="c"&gt;# Backend developers&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; backend,database

&lt;span class="c"&gt;# Full-stack developers&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--tags&lt;/span&gt; frontend,backend,database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Client-specific setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;

&lt;p&gt;In Claude Code, just register &lt;code&gt;hatago&lt;/code&gt; as a single MCP server. All MCP tools under Hatago appear as a unified list. Examples:&lt;/p&gt;

&lt;h4&gt;
  
  
  STDIO
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "hatago": {
      "command": "npx",
      "args": [
        "@himorishige/hatago-mcp-hub", "serve", "--stdio",
        "--config", "/ABS/PATH/hatago.config.json"
      ]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Streamable HTTP
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "hatago": {
      "url": "http://localhost:3535/mcp"
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hatago handles name collisions by namespacing public names and delegates execution with original names. With &lt;code&gt;--watch&lt;/code&gt;, updates to the config trigger &lt;code&gt;notifications/tools/list_changed&lt;/code&gt; so clients can auto-refresh their lists.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: many clients still don’t support &lt;code&gt;notifications/tools/list_changed&lt;/code&gt;. You may need to refresh manually depending on the client.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Codex CLI
&lt;/h3&gt;

&lt;p&gt;Because Codex uses TOML, centralizing via Hatago can be even more impactful. STDIO example:&lt;/p&gt;

&lt;h4&gt;
  
  
  STDIO
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[mcp_servers.hatago]
command = "npx"
args = [
  "-y", "@himorishige/hatago-mcp-hub", "serve",
  "--stdio", "--config", "/ABS/PATH/hatago.config.json"
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Streamable HTTP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.hatago]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://localhost:3535/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;As of 2025-09-01, native HTTP is not supported in Codex CLI, so you need &lt;a href="https://www.npmjs.com/package/mcp-remote" rel="noopener noreferrer"&gt;mcp-remote&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-client sharing (HTTP mode)
&lt;/h3&gt;

&lt;p&gt;For teams accessing a common Hatago instance, Streamable HTTP mode is ideal. Multiple clients—Claude Code, Codex CLI, Cursor, Windsurf—connect to the same URL. Each only needs to configure Hatago, and all MCP servers under it are shared. Operational updates happen in a single place: &lt;code&gt;hatago.config.json&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Even better with tags
&lt;/h4&gt;

&lt;p&gt;You can run multiple Hatago instances with different tag filters to provide purpose-specific endpoints—for example, dev servers for the dev team, monitoring tools for ops.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomf46dzfpibethnbj2sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomf46dzfpibethnbj2sw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This structure lets each team see only what they need, keeping tool lists clean.&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;# Dev Hatago (port 3535)&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--http&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 3535 &lt;span class="nt"&gt;--tags&lt;/span&gt; dev,test

&lt;span class="c"&gt;# Ops Hatago (port 3536)&lt;/span&gt;
hatago serve &lt;span class="nt"&gt;--http&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 3536 &lt;span class="nt"&gt;--tags&lt;/span&gt; production,monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Profile switching flow
&lt;/h4&gt;

&lt;p&gt;You can also combine file changes with &lt;code&gt;--watch&lt;/code&gt; to switch profiles dynamically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Node vs Workers
&lt;/h2&gt;

&lt;p&gt;In the Node runtime, Hatago can connect to all server types, including local MCPs launched with &lt;code&gt;npx&lt;/code&gt; or &lt;code&gt;node&lt;/code&gt;. In serverless environments like Cloudflare Workers where process spawning is unavailable, you typically attach remote MCPs exposed via HTTP/SSE. Regardless of placement, clients interact with Hatago the same way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Because Hatago is built with Hono, it’s easy to swap surrounding middleware in both Workers and Node. You can implement logging, header injection, auth checks, and more in your app code naturally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Design details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Name collision avoidance: the default strategy is &lt;code&gt;namespace&lt;/code&gt; (&lt;code&gt;serverId_toolName&lt;/code&gt;). Public names are unique; execution delegates to original names.&lt;/li&gt;
&lt;li&gt;Progress relay: forwards &lt;code&gt;notifications/progress&lt;/code&gt; upstream. When &lt;code&gt;progressToken&lt;/code&gt; is present, Hatago avoids double-delivery.&lt;/li&gt;
&lt;li&gt;Sampling bridge: bridges downstream &lt;code&gt;sampling/createMessage&lt;/code&gt; to the upstream client and reflects responses/progress.&lt;/li&gt;
&lt;li&gt;Hot reload: detects config changes, safely reconnects, and emits &lt;code&gt;notifications/tools/list_changed&lt;/code&gt; after applying updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this adheres closely to MCP’s spec. Keeping routing/registry/event flow transparent directly impacts usability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational tips
&lt;/h2&gt;

&lt;p&gt;Use meaningful server IDs in the config (e.g., &lt;code&gt;github-api&lt;/code&gt;, &lt;code&gt;filesystem-tmp&lt;/code&gt;) so you can infer affiliation from public names. With env var expansion, you can centralize API endpoints and tokens.&lt;/p&gt;

&lt;p&gt;If requests to an MCP server time out:&lt;/p&gt;

&lt;p&gt;Even if a server supports &lt;code&gt;notifications/progress&lt;/code&gt;, timeouts can still happen depending on implementation. You can extend timeouts in Hatago’s config.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "api": {
      "url": "${API_BASE_URL:-https://api.example.com}/mcp",
      "headers": { "Authorization": "Bearer ${API_KEY}" },
      "tags": ["production", "api"],
      "timeouts": { "requestMs": 60000 } // default is 30000ms
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;Hatago does not provide built-in authentication. OAuth is not supported. Use &lt;a href="https://hono.dev/" rel="noopener noreferrer"&gt;Hono&lt;/a&gt; middleware or an upstream layer like &lt;a href="https://developers.cloudflare.com/agents/model-context-protocol/authorization/" rel="noopener noreferrer"&gt;Cloudflare Zero Trust&lt;/a&gt; for authorization with bearer tokens or cookies. If a downstream MCP requires OAuth, you’ll need environment-specific extensions. Given the variability across deployments, Hatago keeps the core simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Hatago as a library
&lt;/h2&gt;

&lt;p&gt;The hub logic is also available as packages (&lt;code&gt;@himorishige/hatago-mcp-hub/node&lt;/code&gt;, &lt;code&gt;@himorishige/hatago-mcp-hub/workers&lt;/code&gt;). You can embed Hatago’s hub capability into existing HTTP apps (like Hono). This enables a lightweight MCP aggregation point in an API gateway or internal portal. See the &lt;a href="https://github.com/himorishige/hatago-mcp-hub/tree/main/examples" rel="noopener noreferrer"&gt;examples directory&lt;/a&gt; for details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As MCP adoption grows, configuration sprawl and operational overhead quietly scale up. Hatago MCP Hub centralizes that growth behind a single hub to preserve day-to-day developer experience. Name collision avoidance, transparent progress relay, hot reload, and internal operational tools—none are flashy, but they collectively improve the “feel” of working with many MCP servers.&lt;/p&gt;

&lt;p&gt;Start small: attach 2–3 MCP servers in &lt;code&gt;hatago.config.json&lt;/code&gt; and point your client to a single Hatago entry. Later, as needs arise—over five MCPs to manage, duplicate tool names, or isolating slow clients—iterate by adding/removing servers.&lt;/p&gt;

&lt;p&gt;I’d love your feedback after you give Hatago MCP Hub a spin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/himorishige/hatago-mcp-hub" rel="noopener noreferrer"&gt;https://github.com/himorishige/hatago-mcp-hub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>cloudflare</category>
      <category>hono</category>
    </item>
  </channel>
</rss>
