English | 日本語
Hatago (旅籠) — 一个连接现代AI工具与MCP服务器的中继点。
Hatago MCP Hub 是一个轻量级中心,统一了从工具(如 Claude Code、Codex CLI、Cursor、Windsurf 和 VS Code)访问多个 MCP(模型上下文协议)服务器的方式。
docs/README.mdpackages/mcp-hub/README.mdDev.to: 使用 Hatago MCP Hub 开始使用多MCP — 一个配置连接所有
npx @himorishige/hatago-mcp-hub serve --httpnodemon --exec "hatago serve --http" --watch hatago.config.jsonpm2 start "hatago serve" --watch hatago.config.jsonnotifications/tools/list_changed 通知notifications/progresshatago://servers - 当前连接服务器的JSON快照(id, 状态, 类型, 工具, 资源, 提示)${VAR}和${VAR:-default}语法extends字段扩展基础配置以实现DRY原则外部包(server/test-utils)使用薄的IHub接口来避免与具体类的紧密耦合。
import type { IHub } from '@himorishige/hatago-hub';
import { createHub } from '@himorishige/hatago-hub/node';
const hub: IHub = createHub({
preloadedConfig: { data: { version: 1, mcpServers: {} } }
}) as IHub;
await hub.start();
hub.on('tool:called', (evt) => {
/* 度量, 日志 */
});
await hub.stop();
提取模块用于薄中心:
packages/hub/src/rpc/handlers.tspackages/hub/src/http/handler.tspackages/
├── mcp-hub/ # 主npm包 (@himorishige/hatago-mcp-hub)
├── server/ # 服务器实现 (@himorishige/hatago-server)
├── hub/ # 中心核心 (@himorishige/hatago-hub)
├── core/ # 共享类型 (@himorishige/hatago-core)
├── runtime/ # 运行时组件 (@himorishige/hatago-runtime)
├── transport/ # 传输层 (@himorishige/hatago-transport)
├── cli/ # CLI工具 (@himorishige/hatago-cli)
├── hub-management/ # 管理组件 (@himorishige/hatago-hub-management)
└── test-fixtures/ # 测试工具
# 初始化配置
npx @himorishige/hatago-mcp-hub init
# 在STDIO模式下启动(适用于Claude Code)
# 注意:STDIO需要配置文件路径
npx @himorishige/hatago-mcp-hub serve --stdio --config ./hatago.config.json
# 或在HTTP模式下启动(无需配置,演示/开发用途)
npx @himorishige/hatago-mcp-hub serve --http
# 全局安装
npm install -g @himorishige/hatago-mcp-hub
# 使用hatago命令
hatago init
hatago serve
# 安装为依赖
npm install @himorishige/hatago-mcp-hub
# 添加到package.json脚本
{
"scripts": {
"mcp": "hatago serve"
}
}
添加到.mcp.json:
{
"mcpServers": {
"hatago": {
"command": "npx",
"args": [
"@himorishige/hatago-mcp-hub",
"serve",
"--stdio",
"--config",
"./hatago.config.json"
]
}
}
}
添加到~/.codex/config.toml:
[mcp_servers.hatago]
command = "npx"
args = ["-y", "@himorishige/hatago-mcp-hub", "serve", "--stdio", "--config", "./hatago.config.json"]
添加到.mcp.json:
{
"mcpServers": {
"hatago": {
"url": "http://localhost:3535/mcp"
}
}
}
添加到~/.codex/config.toml:
[mcp_servers.hatago]
command = "npx"
args = ["-y", "mcp-remote", "http://localhost:3535/mcp"]
用于测试和调试:
# 在HTTP模式下启动
hatago serve --http --port 3535
# 使用MCP Inspector连接
# 端点:http://localhost:3535/mcp
启用轻量级内存度量并暴露HTTP端点:
HATAGO_METRICS=1 hatago serve --http --port 3535
# 然后访问:http://localhost:3535/metrics
注意:
HATAGO_LOG=json时可用JSON日志(尊重HATAGO_LOG_LEVEL)。创建hatago.config.json:
{
"$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"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}
{
"mcpServers": {
"deepwiki": {
"url": "https://mcp.deepwiki.com/sse",
"type": "sse"
},
"custom-api": {
"url": "https://api.example.com/mcp",
"type": "http",
"headers": {
"Authorization": "Bearer ${API_KEY}"
}
}
}
}
在一个配置文件中按标签分组服务器:
{
"mcpServers": {
"filesystem-dev": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
"tags": ["dev", "local"]
},
"github-prod": {
"url": "https://api.github.com/mcp",
"type": "http",
"tags": ["production", "github"]
},
"database": {
"command": "mcp-server-postgres",
"tags": ["dev", "production", "database"]
}
}
}
使用特定标签启动:
# 只启动标记为“dev”的服务器
hatago serve --tags dev
# 启动带有“dev”或“test”标签的服务器
hatago serve --tags dev,test
# 支持日语标签
hatago serve --tags 開発,テスト
通过extends字段按环境拆分配置:
基础配置(~/.hatago/base.config.json):
{
"version": 1,
"logLevel": "info",
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
}
}
}
工作配置(./work.config.json):
{
"extends": "~/.hatago/base.config.json",
"logLevel": "debug",
"mcpServers": {
"github": {
"env": {
"GITHUB_TOKEN": "${WORK_GITHUB_TOKEN}",
"DEBUG": null
}
},
"internal-tools": {
"url": "https://internal.company.com/mcp",
"type": "http",
"headers": {
"Authorization": "Bearer ${INTERNAL_TOKEN}"
}
}
}
}
特性:
"extends": ["./base1.json", "./base2.json"]~、相对路径和绝对路径null移除继承的环境变量| 策略 | 基于标签 | 继承式 |
|---|---|---|
| 文件 | 单个配置文件 | 多个配置文件 |
| 切换 | --tags选项 | --config选项 |
| 管理 | 集中式 | 分布式 |
| 适合 | 团队共享,简单设置 | 复杂环境,个人定制 |
支持Claude Code兼容的语法:
${VAR} - 扩展为VAR的值(如果未定义则报错)${VAR:-default} - 如果VAR未定义,则使用默认值hatago init交互式创建配置文件:
hatago init # 交互模式
hatago init --mode stdio # STDIO模式配置
hatago init --mode http # HTTP模式配置
hatago init --force # 覆盖现有配置
hatago serve启动MCP Hub服务器:
hatago serve --stdio --config ./hatago.config.json # STDIO模式(默认,需要配置)
hatago serve --http # HTTP模式(可选配置)
hatago serve --config custom.json # 自定义配置
hatago serve --verbose # 调试日志
hatago serve --tags dev,test # 根据标签过滤服务器
hatago serve --env-file ./.env # 启动前加载.env中的变量(可重复)
hatago serve --env-override # 使用--env-file时覆盖现有环境变量
使用--env-file <path...>在配置解析前加载变量。这有助于解决${VAR}和${VAR:-default}占位符,而无需全局导出变量。
KEY=VALUE,export KEY=VALUE,#注释,空行。\n,\r,\t。~/扩展为家目录。--env-override,否则保留现有的process.env键。import { startServer } from '@himorishige/hatago-mcp-hub';
// 程序化启动服务器
await startServer({
mode: 'stdio',
config: './hatago.config.json',
logLevel: 'info'
});
import { createHub } from '@himorishige/hatago-mcp-hub';
const hub = createHub({
mcpServers: {
memory: {
command: 'npx',
args: ['@modelcontextprotocol/server-memory']
}
}
});
// 在应用程序中直接使用中心
const tools = await hub.listTools();
客户端 (Claude Code等)
↓
Hatago 中心 (路由器+注册表)
↓
MCP 服务器 (本地, NPX, 远程)
@modelcontextprotocol/server-filesystem@modelcontextprotocol/server-github@modelcontextprotocol/server-memoryhttps://mcp.deepwiki.com/sse)“没有onNotification处理器设置”警告
服务器连接失败
--verbose标志获取详细日志工具名称冲突
# 启用详细日志
hatago serve --verbose
# 检查服务器状态
hatago status
欢迎贡献!请参阅我们的GitHub仓库获取更多信息。
MIT许可