Skip to main content
Glama
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