MCP 集成¶
MiQi 通过 MCP (Model Context Protocol) 集成外部工具服务,由 7 个 git submodule 管理。
MCP 服务列表¶
| 服务 | 目录 | 领域 | 功能 | 超时 |
|---|---|---|---|---|
| raspa-mcp | mcps/raspa-mcp |
材料科学 | RASPA2 分子模拟 (GCMC / MD) | 6 小时 |
| zeopp-backend | mcps/zeopp-backend |
材料科学 | Zeo++ 多孔材料几何分析 | 默认 |
| mofstructure-mcp | mcps/mofstructure-mcp |
材料科学 | MOF 晶体结构分析 | 默认 |
| mofchecker-mcp | mcps/mofchecker-mcp |
材料科学 | MOF 结构验证与修复 | 默认 |
| pdftranslate-mcp | mcps/pdftranslate-mcp |
文档处理 | 学术论文 PDF 翻译 | 1 小时 |
| miqrophi-mcp | mcps/miqrophi-mcp |
科学计算 | Miqrophi 计算平台接口 | 默认 |
| feishu-mcp | mcps/feishu-mcp |
办公协作 | 飞书消息/文档/日历 | 默认 |
架构¶
graph TB
AGENT[MiQi Agent]
AGENT --> CLIENT[MCP Client - mcp Python SDK]
CLIENT --> RM[raspa-mcp<br/>subprocess / streamable-http]
CLIENT --> ZO[zeopp-backend<br/>subprocess]
CLIENT --> PT[pdftranslate-mcp<br/>subprocess]
CLIENT --> MS[mofstructure-mcp]
CLIENT --> MC[mofchecker-mcp]
CLIENT --> MQ[miqrophi-mcp]
CLIENT --> FS[feishu-mcp]
RM --> REGISTRY[Tool Registry]
ZO --> REGISTRY
PT --> REGISTRY
MS --> REGISTRY
MC --> REGISTRY
MQ --> REGISTRY
FS --> REGISTRY
REGISTRY --> CALLABLE[Agent 可调用 MCP 工具]
MCP 配置¶
{
"tools": {
"mcp_servers": {
"raspa-mcp": {
"command": "python",
"args": ["-m", "raspa_mcp"],
"env": { "RASPA_DIR": "/opt/raspa2" },
"toolTimeout": 21600
},
"pdftranslate-mcp": {
"command": "python",
"args": ["-m", "pdftranslate_mcp"],
"toolTimeout": 3600
}
}
}
}
MCP 工具特性¶
心跳进度报告¶
长时运行的工具通过心跳机制报告进度:
每 15 秒:
MCP Server → { "type": "progress", "current": 45, "total": 100, "message": "Running GCMC..." }
→ Bridge → renderer → Chat UI 进度条
超时控制¶
| 工具 | 超时 | 原因 |
|---|---|---|
| RASPA2 GCMC 模拟 | 6 小时 | 大规模分子模拟计算密集 |
| PDF 翻译 | 1 小时 | 大文件处理耗时 |
| 其他工具 | 默认 (5 分钟) | 常规计算 |
延迟加载¶
节省资源,避免启动时加载所有 MCP 服务。
环境变量继承¶
MCP 子进程继承 Agent 进程的环境变量,可通过 env 字段追加自定义变量。
RASPA2 MCP 示例¶
# Agent 调用 RASPA2 GCMC 模拟
from raspa_mcp import create_workspace, get_simulation_template, simulate
# 1. 创建工作区目录结构
create_workspace(
work_dir="/tmp/sim",
framework_name="ZIF-8",
cif_source_path="ZIF-8.cif"
)
# 2. 生成模拟输入
template = get_simulation_template("GCMC_CO2")
simulation_input = fill_template(template, {
"PRESSURE": "1e5",
"TEMPERATURE": "298",
"CYCLES": "10000"
})
# 3. 运行模拟
result = simulate(work_dir="/tmp/sim")
# → 返回吸附量、选择性、等温线