joeseesun/qiaomu-llm-mcp
GitHub: joeseesun/qiaomu-llm-mcp
一款本地优先的 MCP 网关项目,将多模型路由、密钥安全隔离与多轮讨论整合为统一的工具接口。
Stars: 1 | Forks: 0
# qiaomu-llm-mcp
**中文** | [English](#english)
适合这些场景:
- 你同时使用 Z.ai Coding Plan、DeepSeek、OpenAI-compatible API、Anthropic-compatible API、Claude Code CLI 等多套模型。
- 你不想把 API Key 写进提示词、脚本或 Codex 配置里。
- 你希望在 Codex / Claude / 其他 MCP 客户端里用同一组工具完成:单模型调用、多模型对比、流水线、HeavySkill 式多轮讨论。
- 你需要让最强的主控模型主持讨论,而不是把全部判断交给某一个 Provider。
本项目是本地优先工具:Provider 注册表保存在 `~/.config/qiaomu-llm/registry.json`,密钥默认放在 macOS Keychain,MCP server 只暴露“密钥是否存在”,不会返回明文 Key。
## 你能得到什么
安装后,MCP 客户端会看到这些工具:
| 工具 | 作用 |
| --- | --- |
| `qllm_list_providers` | 列出本地配置的 Provider,并安全显示密钥状态 |
| `qllm_show_provider` | 查看单个 Provider 的非敏感配置 |
| `qllm_list_models` | 查看本地配置或远程 `/models` 返回的模型 |
| `qllm_route_task` | 不花 token,根据任务类型选择 Provider / Model |
| `qllm_chat` | 调用单个 Provider |
| `qllm_compare` | 用同一个问题对比多个 Provider |
| `qllm_pipeline` | 串联多个模型步骤完成任务 |
| `qllm_heavy_discuss` | 多视角、多模型讨论,可由模型或 Codex 主持 |
| `qllm_heavy_render` | 把 Codex 主持后的讨论渲染成 Markdown / HTML 报告 |
| `qllm_claude_code_*` | 通过 MCP 安全调用本机 Claude Code CLI |
## 推荐工作流
用户问题
|
+-- qllm_route_task 选择模型
|
+-- qllm_chat / qllm_compare / qllm_pipeline
|
+-- 复杂议题: qllm_heavy_discuss
|
+-- 多模型独立给观点
+-- Codex 或指定模型主持
+-- qllm_heavy_render 输出 Markdown / HTML
这套设计的核心不是“多叫几个模型凑热闹”,而是让不同模型承担不同角色:快速模型做初稿,强推理模型做审查,写作模型做表达,Codex 作为当前工作区里的主持人整合上下文和行动方案。
## 快速开始
### 1. 准备环境
要求:
- macOS 或 Linux
- Python 3.10+
- 一个支持 MCP 的客户端,例如 Codex、Claude Desktop、Claude Code、Cursor 等
- 至少一个 LLM Provider 的 API Key
克隆项目:
git clone https://github.com/joeseesun/qiaomu-llm-mcp.git
cd qiaomu-llm-mcp
如果你还没有 GitHub 版本,也可以先在本地目录安装:
cd /path/to/qiaomu-llm-mcp
### 2. 安装 Python 依赖
python3 -m venv .venv
.venv/bin/python -m pip install -U pip
.venv/bin/python -m pip install -e .
确认可执行文件存在:
test -x .venv/bin/qiaomu-llm-mcp && echo "qiaomu-llm-mcp installed"
.venv/bin/python -c "import qiaomu_llm_mcp; print(qiaomu_llm_mcp.__version__)"
MCP server 通常通过 stdio 被客户端启动。直接运行时它会等待 MCP 客户端消息,这是正常现象。
### 3. 创建 Provider 注册表
复制示例配置:
mkdir -p ~/.config/qiaomu-llm
cp examples/registry.example.json ~/.config/qiaomu-llm/registry.json
编辑 `~/.config/qiaomu-llm/registry.json`,保留你要用的 Provider,删除不用的 Provider。
示例中的 Z.ai Coding Plan 使用专用 Coding endpoint:
{
"base_url": "https://api.z.ai/api/coding/paas/v4",
"default_model": "glm-5.2"
}
注意:Z.ai Coding Plan 要使用 `https://api.z.ai/api/coding/paas/v4`,不要误用通用 endpoint `https://api.z.ai/api/paas/v4`。
### 4. 把 API Key 放进 Keychain
推荐使用 Keychain,不要把明文 Key 写入配置文件。
Z.ai:
security add-generic-password -U \
-s qiaomu-llm \
-a zai-glm \
-w "$ZAI_API_KEY"
DeepSeek:
security add-generic-password -U \
-s qiaomu-llm \
-a deepseek \
-w "$DEEPSEEK_API_KEY"
Anthropic-compatible Provider:
security add-generic-password -U \
-s qiaomu-llm \
-a anthropic \
-w "$ANTHROPIC_API_KEY"
注册表里对应写法:
{
"secret_ref": "keychain:qiaomu-llm/zai-glm"
}
也支持环境变量:
{
"secret_ref": "env:ZAI_API_KEY"
}
但公开仓库、团队配置和长期使用建议优先 Keychain。
## 接入 Codex
编辑 Codex 配置文件,例如 `~/.codex/config.toml`:
[mcp_servers.qiaomu-llm]
command = "/absolute/path/to/qiaomu-llm-mcp/.venv/bin/qiaomu-llm-mcp"
本机示例:
[mcp_servers.qiaomu-llm]
command = "/Users/joe/Documents/qiaomu-llm-mcp/.venv/bin/qiaomu-llm-mcp"
重启 Codex 后,应该可以看到 `qllm_*` 工具。
## 接入 Claude Desktop
编辑 Claude Desktop 的 MCP 配置:
{
"mcpServers": {
"qiaomu-llm": {
"command": "/absolute/path/to/qiaomu-llm-mcp/.venv/bin/qiaomu-llm-mcp"
}
}
}
重启客户端后,确认工具列表里出现 `qllm_list_providers`。
## 基础用法
### 查看 Provider
{
"params": {
"response_format": "markdown"
}
}
调用工具:`qllm_list_providers`
### 调用 Z.ai Coding Plan
{
"params": {
"provider": "zai-glm",
"model": "glm-5.2",
"prompt": "Reply exactly: qiaomu-llm-mcp-ok",
"thinking_type": "disabled",
"max_tokens": 64
}
}
调用工具:`qllm_chat`
### 对比多个模型
{
"params": {
"prompt": "用三条原则解释如何开始一个可持续的冥想习惯。",
"task_type": "writing",
"providers": ["zai-glm", "deepseek", "aigocode-anthropic"],
"max_providers": 3,
"response_format": "markdown"
}
}
调用工具:`qllm_compare`
### 多步骤流水线
{
"params": {
"input": "写一个面向普通人的冥想 App 产品方向。",
"steps": [
{
"name": "research",
"task_type": "research",
"instruction": "提出用户痛点、竞争差异和核心场景。"
},
{
"name": "prd",
"task_type": "writing",
"instruction": "把上一步整理成结构化 PRD 摘要。"
},
{
"name": "review",
"task_type": "review",
"instruction": "审查 PRD 摘要里的风险、遗漏和过度承诺。"
}
],
"response_format": "markdown"
}
}
调用工具:`qllm_pipeline`
## HeavySkill 式讨论
### 由 Codex 主持
适合当前 Codex 已经掌握工作区、文件、用户偏好和上下文的场景。
{
"params": {
"question": "一个普通人如何开始冥想,并长期坚持?",
"mode": "deliberation",
"k": 4,
"host_mode": "codex",
"write_report": true,
"write_html": true
}
}
调用工具:`qllm_heavy_discuss`
工具会返回:
- 多个模型的独立观点
- `host_prompt`
- 可选的 Markdown / HTML 初始报告
把 `host_prompt` 交给 Codex 综合后,再调用 `qllm_heavy_render` 输出最终报告。
### 由模型主持
适合想让某个强模型直接完成主持总结的场景。
{
"params": {
"question": "如何设计一个隐私友好的冥想 App?",
"mode": "deliberation",
"k": 4,
"providers": ["zai-glm", "deepseek", "aigocode-anthropic"],
"host_mode": "model",
"host_provider": "aigocode-anthropic",
"rounds": 2,
"write_report": true,
"write_html": true
}
}
## Claude Code CLI 工具
如果本机安装了 Claude Code CLI,本项目还提供 `qllm_claude_code_*` 工具。
常见用途:
- 查看 Claude Code 能力:`qllm_claude_code_capabilities`
- 查看可用模型别名和本地最近使用模型:`qllm_claude_code_models`
- 非交互调用 Claude Code:`qllm_claude_code_run`
- 查看 Claude Code session:`qllm_claude_code_sessions`
示例:用 Sonnet 4.6 写一首诗。
{
"params": {
"cwd": "/Users/joe/Documents/智谱",
"prompt": "请用中文写一首 12 行现代诗,只输出诗。",
"model": "claude-sonnet-4-6",
"tools": [],
"user_facing": true,
"timeout": 300
}
}
默认不会暴露 `--dangerously-skip-permissions`。需要文件编辑时,请显式设置 `allowed_tools`,并限制 `cwd`。
## 安全与隐私边界
- API Key 不应该写进 README、Prompt、Git 仓库或 MCP 请求参数。
- 推荐使用 `keychain:/`;工具只返回密钥状态,不返回明文。
- Provider 错误信息会做敏感字段脱敏,但上游服务返回的文本仍应谨慎处理。
- `qllm_claude_code_run` 是本机命令执行边界,默认只允许 `Read`,需要编辑或 Shell 时必须显式放开。
- HeavySkill 报告可能包含你的问题、模型输出和上下文摘要。公开分享前请人工检查。
- 本项目不会提供云端代理服务,也不会替你保存 API Key。
## 故障排查
### 看不到 MCP 工具
确认 MCP 配置中的 `command` 是绝对路径:
ls -la /absolute/path/to/qiaomu-llm-mcp/.venv/bin/qiaomu-llm-mcp
然后重启 MCP 客户端。
### `Registry not found`
创建注册表:
mkdir -p ~/.config/qiaomu-llm
cp examples/registry.example.json ~/.config/qiaomu-llm/registry.json
或设置环境变量:
export QIAOMU_LLM_REGISTRY=/path/to/registry.json
### `Missing Keychain secret`
检查服务名和账号是否一致:
security find-generic-password -s qiaomu-llm -a zai-glm -w
如果没有,重新写入:
security add-generic-password -U -s qiaomu-llm -a zai-glm -w "$ZAI_API_KEY"
### Z.ai Coding Plan 请求失败
检查三件事:
1. `base_url` 是否是 `https://api.z.ai/api/coding/paas/v4`
2. `model` 是否是你的 Coding Plan 可用模型,例如 `glm-5.2`
3. Keychain 中的 `zai-glm` 是否写入了正确 API Key
### 模型列表为空
有些 Provider 的 `/models` endpoint 不可用,或账号不开放模型枚举。可以在 `registry.json` 里手动写 `models` 和 `default_model`。
## 本地验证
开发者可运行:
.venv/bin/python -m compileall src
.venv/bin/python -m pip install -e .
如果配置了真实 Provider,可在 MCP 客户端中运行:
{
"params": {
"provider": "zai-glm",
"model": "glm-5.2",
"prompt": "Reply exactly: ok",
"max_tokens": 16
}
}
## 路线图
- 可选 `aisuite` adapter:当目标 Provider 覆盖足够稳定时再加入,不影响 Z.ai Coding Plan 专用 endpoint。
- 更完整的安装 smoke test 脚本。
- Provider preset 管理命令。
- 报告模板主题和更多 HTML 输出样式。
- 更细粒度的成本、token 和超时预算策略。
## GitHub 发布
发布前的 GitHub About、topics、social preview 和验证清单见 [docs/github-publish-checklist.md](docs/github-publish-checklist.md)。
## 维护者
Copyright (c) 向阳乔木
- qiaomu.ai: https://qiaomu.ai
- Blog: https://blog.qiaomu.ai
- 推荐看: https://tuijian.qiaomu.ai
- X: https://x.com/vista8
- GitHub: https://github.com/joeseesun/
- 微信公众号:向阳乔木推荐看
## License
MIT License. See [LICENSE](LICENSE).
# English
`qiaomu-llm-mcp` is a local MCP gateway for people who use multiple LLM providers and want one safe tool surface for routing, comparison, pipelines, and multi-model deliberation.
It keeps provider metadata in `~/.config/qiaomu-llm/registry.json` and recommends storing secrets in macOS Keychain. The MCP tools expose secret status, not raw API keys.
## Why Use It
- One MCP server for many providers.
- Bring your own keys; no hosted proxy.
- Route tasks before spending tokens.
- Compare providers on the same prompt.
- Chain models into practical pipelines.
- Run HeavySkill-style discussions where multiple models produce independent views and Codex or a selected model hosts the synthesis.
- Optionally call local Claude Code CLI through a controlled MCP wrapper.
## Install
git clone https://github.com/joeseesun/qiaomu-llm-mcp.git
cd qiaomu-llm-mcp
python3 -m venv .venv
.venv/bin/python -m pip install -U pip
.venv/bin/python -m pip install -e .
## Configure Providers
mkdir -p ~/.config/qiaomu-llm
cp examples/registry.example.json ~/.config/qiaomu-llm/registry.json
Store secrets in Keychain:
security add-generic-password -U -s qiaomu-llm -a zai-glm -w "$ZAI_API_KEY"
For Z.ai Coding Plan, use the Coding endpoint:
https://api.z.ai/api/coding/paas/v4
not the general endpoint:
https://api.z.ai/api/paas/v4
## Codex MCP Config
[mcp_servers.qiaomu-llm]
command = "/absolute/path/to/qiaomu-llm-mcp/.venv/bin/qiaomu-llm-mcp"
Restart Codex and look for `qllm_*` tools.
## Example Tools
- `qllm_list_providers`: list configured providers and secret status.
- `qllm_chat`: call one provider.
- `qllm_compare`: compare several providers.
- `qllm_pipeline`: run sequential model steps.
- `qllm_heavy_discuss`: run multi-model deliberation.
- `qllm_heavy_render`: render Codex-hosted synthesis to Markdown / HTML.
- `qllm_claude_code_run`: run a bounded non-interactive Claude Code task.
## Security Notes
- Do not commit API keys.
- Prefer Keychain refs such as `keychain:qiaomu-llm/zai-glm`.
- Review generated HeavySkill reports before sharing them publicly.
- Grant Claude Code file-editing or shell permissions only when the task needs them.
## Verification
.venv/bin/python -m compileall src
.venv/bin/python -m pip install -e .
Then call `qllm_list_providers` from your MCP client.
## Maintainer
Created and maintained by 向阳乔木.
- X: https://x.com/vista8
- GitHub: https://github.com/joeseesun/
MIT License. See [LICENSE](LICENSE).
标签:AI工具网关, DLL 劫持, MCP网关, SOC Prime, 多模型路由, 大语言模型, 开发工具, 文档结构分析, 本地密钥管理, 逆向工具