MiaoMcp
by Sen0E
README.md
# MiaoMcp
将本地 FastMCP 工具和任意数量的远程 MCP 服务同时接入小智。目前本地提供:
- `calculator.calculate`:安全计算基础算术表达式;
- `time.get_current`:查询指定 IANA 时区的当前日期和时间,默认北京时间。
每个启用的 MCP Server 都拥有独立的 WebSocket 连接、进程和重连循环。一个远程服务故障不会阻塞其他服务。
## 配置
编辑根目录下被 Git 忽略的 `mcp_config.json`:
```json
{
"xiaozhi": {
"endpoint": "wss://小智后台生成的完整接入点URL"
},
"mcpServers": {
"miaomcp-local": {
"type": "stdio",
"command": "miaomcp-server"
},
"modelscope-weather": {
"type": "sse",
"url": "https://mcp.api-inference.modelscope.net/服务ID一/sse"
},
"modelscope-search": {
"type": "sse",
"url": "https://mcp.api-inference.modelscope.net/服务ID二/sse"
}
}
}
```
在 `mcpServers` 中继续添加条目即可接入更多服务。支持的类型:
- `stdio`:本地 MCP 命令;
- `sse`:远程 SSE MCP,自动通过 `mcp-proxy` 转换;
- `streamablehttp` 或 `http`:远程 Streamable HTTP MCP;
- 设置 `"disabled": true` 可临时停用某项。
需要请求头的服务可以配置:
```json
{
"type": "sse",
"url": "https://example.com/sse",
"headers": {
"Authorization": "Bearer token"
}
}
```
`mcp_config.json` 和其中的 URL、token 都不应提交。可提交模板见 `mcp_config.example.json`。
## 运行
```bash
uv sync
uv run miaomcp
```
指定其他配置文件:
```bash
uv run miaomcp --config /path/to/mcp_config.json
```
仅启动本地 stdio 工具服务:
```bash
uv run miaomcp-server
```
## 添加本地工具
在 `src/miaomcp/tools/` 中编写业务函数,然后在 `src/miaomcp/server.py` 使用 `@mcp.tool()` 注册。不需要修改网关或配置。
## 项目结构
```text
src/miaomcp/
├── cli.py 命令行入口
├── server.py 本地 FastMCP 服务及工具注册
├── gateway/
│ ├── config.py 配置模型、加载与校验
│ ├── commands.py stdio 与远程代理命令构造
│ ├── bridge.py 单个 MCP 与小智的双向桥接
│ └── manager.py 多服务并发和断线重连
└── tools/
├── calculator.py 安全计算器
└── current_time.py 时区时间查询
tests/ 按模块组织的测试
mcp_config.example.json 可提交的配置模板
mcp_config.json 本地敏感配置,Git 忽略
pyproject.toml 项目元数据、依赖和命令入口
```
## 测试
```bash
uv run python -m unittest discover -s tests -v
```
TDQS
A4.6/5.0
Scored across 2 tools
Disambiguation5/5
The two tools, calculator.calculate and time.get_current, target entirely distinct domains: arithmetic and time information. There is no overlap or ambiguity between them.
Naming Consistency5/5
Both tool names follow the same 'domain.action' pattern with snake_case: calculator.calculate and time.get_current. This is consistent and predictable.
Tool Count3/5
With only 2 tools, the server feels minimal but appropriate for a small utility purpose. It is borderline thin but not unreasonably so.
Completeness4/5
For a simple calculator/time server, the basic operations are covered. Minor gaps exist (e.g., timezone conversion or date arithmetic), but the core use cases are addressed.
Maintenance
ActivitySlowing
ResponsivenessNo issues