Skip to main content
Glama
README.md
# sci-mcp

本机科学计算 MCP 服务器。把符号数学、物理单位、数值仿真、PDE、统计推断、GLM/时间序列、
信号时频分析、小波、蒙特卡洛、规划求解、高层数据分析和绘图收进一套固定的 MCP 工具里,
供 Cherry Studio 里的 agent 直接调用。

## 工具一览(65 个)

### 符号数学(sympy)
| 工具 | 作用 |
|---|---|
| `symbolic_calculus` | 求导、不定积分、极限、级数展开、化简、展开、因式分解 |
| `symbolic_solve` | 解方程/方程组;单变量返回扁平解列表,多变量返回字典列表 |
| `symbolic_evaluate` | 符号表达式数值代入并求值 |
| `dsolve_ode` | 符号 ODE 解析解(通解或带初值),支持高阶方程 |

### 向量微积分
| 工具 | 作用 |
|---|---|
| `gradient` / `divergence` / `curl` / `laplacian` | 梯度、散度、旋度(三维)、拉普拉斯算子 |

### 物理与单位(scipy.constants + pint)
| 工具 | 作用 |
|---|---|
| `physical_constant` | 查询物理常量 |
| `unit_convert` | 单位换算,支持偏移单位 |
| `unit_calculate` | 计算带单位表达式 |

### 数值仿真(numpy + scipy)
| 工具 | 作用 |
|---|---|
| `solve_ode` | 一阶 ODE 系统数值解 |
| `optimize_minimize` | 局部最小化,支持上下界 + 等式/不等式约束 |
| `global_optimize` | 全局优化:差分进化、模拟退火、basinhopping |
| `matrix_compute` | det/inv/eig/svd/solve/lstsq/matmul/rank/norm/transpose |
| `find_roots` | 数值求根(brentq / newton) |
| `fft_analysis` | 单边幅度谱与主频 |
| `interpolate_1d` | 一维插值 |
| `sparse_compute` | 稀疏矩阵:solve/eigsh/svds/matmul/transpose/norm,支持 Matrix Market、直接法/CG/GMRES |

### PDE(有限差分)
| 工具 | 作用 |
|---|---|
| `solve_heat_1d` | 一维热方程;边界支持 Dirichlet / Neumann / Robin |
| `solve_wave_1d` | 一维波动方程;边界支持 Dirichlet / Neumann / Robin |
| `solve_laplace_2d` | 二维拉普拉斯方程,Dirichlet 边界,Gauss-Seidel |

### PDE 进阶(三维 / 非线性)
| 工具 | 作用 |
|---|---|
| `solve_heat_3d` | 三维热方程,显式 FTCS(稳定性检查) |
| `solve_laplace_3d` | 三维拉普拉斯方程,向量化 Jacobi 迭代 |
| `solve_burgers_1d` | 一维 Burgers 方程(非线性对流 + 扩散) |
| `solve_heat_1d_variable` | 一维变系数热传导 alpha(x) |
| `solve_pde_1d` | 半通用一维显式 PDE:u_t = F(x,t,u,u_x,u_xx) |
| `solve_wave_3d` | 三维波动方程(显式中心差分) |
| `solve_navier_stokes_2d` | 二维不可压涡量-流函数(周期边界) |

### 统计与绘图(scipy.stats + matplotlib)
| 工具 | 作用 |
|---|---|
| `describe` | 描述统计 |
| `distribution` | 概率分布 pdf/cdf/ppf/rvs/fit |
| `curve_fit` | 任意表达式模型最小二乘拟合 + R² |
| `plot` | line/scatter/hist/bar/errorbar/contour/surface |

### 统计推断
| 工具 | 作用 |
|---|---|
| `t_test` | 单样本 / 双样本 / 配对 t 检验 |
| `chi2_test` | 卡方独立性 / 拟合优度 |
| `anova` | 单因素方差分析 |
| `correlation` | Pearson / Spearman / Kendall |
| `linear_regression` | 单变量或多变量 OLS |

### GLM 与时间序列(statsmodels)
| 工具 | 作用 |
|---|---|
| `glm` | 广义线性模型:gaussian/binomial/poisson/gamma 等 |
| `arima` | ARIMA 拟合与多步预测(含置信区间) |
| `time_series_decompose` | 趋势/季节/残差分解 |
| `stationarity_test` | ADF 单位根 / 平稳性检验 |

### 混合模型(statsmodels)
| 工具 | 作用 |
|---|---|
| `mixed_lm` | 线性混合模型:固定效应 + 随机效应,处理分组/重复测量 |
| `gee` | 广义估计方程:gaussian/binomial/poisson × 三种相关工作结构 |
| `nonlinear_mixed_lm` | 非线性混合模型(固定效应 + 随机截距,惩罚最小二乘近似) |

### 生存分析
| 工具 | 作用 |
|---|---|
| `cox_regression` | Cox 比例风险模型,含完全分离/不收敛检测 |
| `kaplan_meier` | Kaplan-Meier 生存曲线与中位生存期,支持分组 |

### 信号处理(scipy.signal)
| 工具 | 作用 |
|---|---|
| `filter_signal` | Butterworth 低通/高通/带通/带阻 |
| `convolve` | 一维卷积 |
| `power_spectrum` | Welch 功率谱密度与峰值频率 |
| `find_peaks` | 峰值检测 |
| `stft` | 短时傅里叶变换,时频矩阵 + 可选频谱图 |

### 小波(PyWavelets)
| 工具 | 作用 |
|---|---|
| `wavelet_transform` | 多层小波分解,返回各层能量与系数 |
| `wavelet_denoise` | 小波阈值去噪(通用阈值 / 自定义阈值) |

### 随机模拟与规划
| 工具 | 作用 |
|---|---|
| `monte_carlo` | 按分布抽样并计算表达式 |
| `linear_program` | 线性规划(HiGHS) |
| `integer_program` | 整数/混合整数规划(HiGHS) |

### 数据文件 IO
| 工具 | 作用 |
|---|---|
| `load_data` / `save_data` | 读写 CSV/TSV/TXT/JSON/NPY |
| `describe_file` / `plot_file` | 直接对文件列做统计或画图 |

### 高层工作流
| 工具 | 作用 |
|---|---|
| `analyze_dataset` | 读 CSV → 描述统计 + 相关矩阵 + 目标回归 + 图,一次完成 |
| `forecast` | ARIMA / 指数平滑多步预测,统一返回预测值与置信区间 |

### 兜底与健康检查
| 工具 | 作用 |
|---|---|
| `run_python` | 子进程执行任意 Python,预导入 numpy/scipy/sympy/matplotlib |
| `health_check` | 检查所有工具模块导入状态与注册函数数 |

## 启动

```powershell
cd sci-mcp
uv run sci-mcp
```

或直接用虚拟环境入口(Cherry Studio 注册时用这个):

```text
.venv\Scripts\sci-mcp.exe
```

传输方式为 stdio,无需端口。若 `sci-mcp.exe` 正被 Cherry 占用,开发时用 `uv run --no-sync ...`。

## 输出目录

绘图、PDE/时频/小波结果(`.npz`)、`run_python` 产物默认写到:

```text
~/.sci-mcp/outputs
```

Windows 下即 `%USERPROFILE%\.sci-mcp\outputs`。

可用环境变量 `SCI_MCP_OUTPUT_DIR` 覆盖。

## 数据约定

- 长数组单次最多返回 2000 个点;超出时等间隔降采样并标注 `downsampled: true` 与原始长度。
- 完整 PDE/时频/小波结果保存为 `.npz`,返回值里带 `path`。
- 数组参数支持文件引用 `"@<path>"`(绝对路径或相对输出目录),支持 CSV/TSV/TXT/JSON/NPY;
  文本文件按行解析,一行一个值。
- `NaN` / `Infinity` 不进入 JSON:统一转成 `null`,顶层 `warnings` 说明被转换的字段。
- `load_data` 读取上限 50 MB / 1,000,000 行;`save_data`、`plot` 的文件名只允许 basename。

## 开发

```powershell
uv run --no-sync pytest -q
```

- Python ≥ 3.12;依赖由 `uv.lock` 锁定(numpy、scipy、sympy、matplotlib、pint、statsmodels、pandas、pywavelets)。
- 所有工具返回统一信封:成功 `{"ok": true, "result": ...}`,失败 `{"ok": false, "error": "..."}`。
- 工具函数不向外抛异常,错误统一走 `core.err()`。

## 扩展新工具

在 `src/sci_mcp/tools/` 新建模块,按固定写法:

```python
from ..core import ok, err

def my_tool(x: float) -> dict:
    """One-line English description shown to the model."""
    try:
        return ok(x * 2)
    except Exception as e:
        return err(f"my_tool failed: {e}")

def register(mcp) -> None:
    mcp.tool()(my_tool)
```

`server.py` 会自动发现该模块并注册,无需修改其他文件。

## 已知限制

- `run_python` 在**本机**子进程执行,不是安全沙箱;只适合可信代码。默认超时 30 秒(上限 300 秒),
  超时会杀整棵进程树;代码上限 100,000 字符;Windows 下默认 2048 MiB 内存上限
  (`SCI_MCP_SANDBOX_MEMORY_MB` 可调,16–65536)。
- PDE 覆盖一维热/波(含 Neumann/Robin、变系数)、二维拉普拉斯、三维热/拉普拉斯/波动、
  一维 Burgers、半通用一维显式 PDE、二维不可压 Navier-Stokes(周期边界);
  仍不支持通用三维 CFD、湍流模型、复杂边界。
- 稀疏矩阵支持 solve/eigsh/svds/matmul/transpose/norm,求解器含直接法/CG/GMRES;
  超大规模仍受 nnz / 内存上限约束。
- 混合模型含线性 MixedLM、GEE,以及非线性混合模型的惩罚最小二乘近似(非完整 NLME)。
- 生存分析只做 Cox 比例风险与 Kaplan-Meier;不含竞争风险、时变协变量。
- 统计推断是经典检验 + OLS + GLM/ARIMA,不含混合模型、生存分析。
- `monte_carlo` 按独立变量抽样,不建模变量间相关性。
- Gaussian GLM 的 McFadden 伪 R² 可能略大于 1(statsmodels 似然尺度所致)。
- 指数平滑的置信区间用残差正态近似(statsmodels 无解析区间),返回里已标注。
- 符号解中的复数根和无理表达式以 sympy 字符串返回。
- `integer_program` 的 `method` 仅支持 `highs`。

TDQS

C2.9/5.0

Scored across 65 tools

Disambiguation3/5

Several tool pairs have overlapping purposes (e.g., plot vs plot_file, describe vs describe_file, forecast vs arima, analyze_dataset vs component tools). Descriptions clarify file-based vs inline and general vs specific, but the volume of tools makes misselection likely. Most tools remain distinct enough for an expert agent.

Naming Consistency3/5

All tool names use snake_case consistently, but the verb style is mixed: many are verb_noun (load_data, solve_heat_1d), while others are noun-only (arima, gradient, distribution). This is readable but lacks a single predictable pattern.

Tool Count1/5

With 65 tools, the server far exceeds the recommended 3-15 range and even the 25+ threshold for 'too many'. While the scientific computing domain is broad, the tool count is excessive and likely to overwhelm an agent, with many tools that could be consolidated.

Completeness4/5

The surface covers a vast range of scientific computing tasks: data IO, statistics, PDE solvers, optimization, signal processing, symbolic math, and more. Minor gaps exist (e.g., no dedicated data manipulation tools), but run_python provides a workaround.

Maintenance

ActivityMaintained
ResponsivenessNo issues