s

sdiehl

@sdiehl/sympy-mcp
1 Stars 357 次浏览 sdiehl 更新于 2026-08-23

MCP 服务配置

复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用

{
  "mcpServers": {
    "sympy-mcp": {
      "args": [
        "run",
        "-i",
        "-p",
        "8081:8081",
        "--rm",
        "ghcr.io/sdiehl/sympy-mcp:latest"
      ],
      "command": "docker"
    }
  }
}

服务介绍

符号代数MCP服务器

Sympy-MCP是一个模型上下文协议(Model Context Protocol, MCP)服务器,允许大型语言模型(LLMs)自主执行符号数学和计算机代数。它向MCP客户端暴露了SymPy核心功能中的许多工具,用于操作数学表达式和方程。

为什么?

语言模型在符号操作方面表现非常糟糕。它们会臆造变量、随机常数,重新排列项,并且通常会制造混乱。但我们有专门用于符号操作的计算机代数系统,因此我们可以使用工具调用来编排一系列变换,让符号内核完成所有繁重的工作。

虽然你可以让一个LLM生成Mathematica或Python代码,但如果你想将LLM用作代理或即时计算器,使用MCP服务器并直接暴露符号工具会提供更好的体验。

该服务器暴露了一部分符号数学能力,包括代数方程求解、积分和微分、矢量微积分、广义相对论的张量微积分,以及常微分方程和偏微分方程。

例如,你可以用自然语言要求它解一个微分方程:

解决带有强迫项的阻尼谐振子问题:由微分方程描述的质量-弹簧-阻尼系统,其中m是质量,c是阻尼系数,k是弹簧常数,F(t)是外部力。

$$ m\frac{d^2x}{dt^2} + c\frac{dx}{dt} + kx = F(t) $$

或者涉及广义相对论的问题:

使用反德西特时空的逆度规$g^{\mu\nu}$计算里奇张量$R_{\mu\nu}$的迹,以确定其常数标量曲率$R$。

使用方法

首先你需要uv

  • Homebrew : brew install uv
  • Curl : curl -LsSf https://astral.sh/uv/install.sh | sh

然后你可以通过以下命令安装并运行服务器:

shell

设置项目

git clone https://github.com/sdiehl/sympy-mcp.git
cd sympy-mcp
uv sync

将服务器安装到Claude Desktop

uv run mcp install server.py

运行服务器

uv run mcp run server.py

现在你应该能在Claude Desktop应用程序中看到这个服务器了。对于其他客户端,请参见下文。

如果你想要一个完全独立版本,只需一条命令即可运行,可以使用以下命令。注意这正在从GitHub运行任意代码,请小心。

shell
uv run --with https://github.com/sdiehl/sympy-mcp/releases/download/0.1/sympy_mcp-0.1.0-py3-none-any.whl python server.py

如果你想进行广义相对论计算,需要安装einsteinpy库。

shell
uv sync --group relativity

可用工具

sympy-mcp服务器提供了以下符号数学工具:

工具 工具ID 描述
变量引入 intro 引入具有指定假设的变量并存储它
多个变量 intro_many 同时引入多个具有指定假设的变量
表达式解析器 introduce_expression 使用可用的局部变量解析表达式字符串并存储它
LaTeX打印机 print_latex_expression 以LaTeX格式打印存储的表达式及其变量假设
代数求解器 solve_algebraically 在给定域上为给定变量代数地求解方程
线性求解器 solve_linear_system 求解线性方程组
非线性求解器 solve_nonlinear_system 求解非线性方程组
函数变量 introduce_function 引入用于微分方程的函数变量
ODE求解器 dsolve_ode 求解常微分方程
标准度规 create_predefined_metric 创建预定义的时空度规(例如:史瓦西、克尔、闵可夫斯基)
度规搜索 search_predefined_metrics 搜索可用的预定义度规
张量计算器 calculate_tensor 从度规计算张量(里奇、爱因斯坦、韦尔张量)
自定义度规 create_custom_metric 从提供的组件和符号创建自定义度规张量
张量 LaTeX 输出 print_latex_tensor 以 LaTeX 格式打印存储的张量表达式
简化器 simplify_expression 使用 SymPy 的规范化函数简化数学表达式
替换 substitute_expression 在另一个表达式中用一个表达式替换变量
积分 integrate_expression 对变量积分表达式
微分 differentiate_expression 对变量微分表达式
坐标系 create_coordinate_system 创建用于矢量微积分操作的3D坐标系
矢量场 create_vector_field 在指定坐标系中创建矢量场
旋度 calculate_curl 计算矢量场的旋度
散度 calculate_divergence 计算矢量场的散度
梯度 calculate_gradient 计算标量场的梯度
单位转换器 convert_to_units 将数量转换为目标单位
单位简化器 quantity_simplify_units 简化带有单位的数量
矩阵创建器 create_matrix 从提供的数据创建 SymPy 矩阵
行列式 matrix_determinant 计算矩阵的行列式
矩阵逆 matrix_inverse 计算矩阵的逆
特征值 matrix_eigenvalues 计算矩阵的特征值
特征向量 matrix_eigenvectors 计算矩阵的特征向量

默认情况下,变量会预先定义假设(类似于 symbols() 函数在 SymPy 中的工作方式)。除非另有说明,默认假设是变量是复数、可交换的,并且是在复数域 (\mathbb{C}) 上的项。

属性
commutative true
complex true
finite true
infinite false

Claude 桌面设置

通常,mcp install 命令会自动将服务器添加到 claude_desktop_config.json 文件中。如果它没有这样做,你需要找到配置文件并添加以下内容:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%Claudeclaude_desktop_config.json

mcpServers 对象中添加以下内容,将 /ABSOLUTE_PATH_TO_SYMPY_MCP/server.py 替换为 sympy-mcp server.py 文件的绝对路径。

json
{
"mcpServers": {
"sympy-mcp": {
"command": "/opt/homebrew/bin/uv",
"args": [
"run",
"--with",
"einsteinpy",
"--with",
"mcp[cli]",
"--with",
"pydantic",
"--with",
"sympy",
"mcp",
"run",
"/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py"
]
}
}
}

Cursor 设置

在你的 ~/.cursor/mcp.json 中,添加以下内容,其中 ABSOLUTE_PATH_TO_SYMPY_MCP 是指向 sympy-mcp server.py 文件的路径。

json
{
"mcpServers": {
"sympy-mcp": {
"command": "/opt/homebrew/bin/uv",
"args": [
"run",
"--with",
"einsteinpy",
"--with",
"mcp[cli]",
"--with",
"pydantic",
"--with",
"sympy",
"mcp",
"run",
"/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py"
]
}
}
}

VS Code 设置VS Code 和 VS Code Insiders 现在支持 代理模式 下的 MCP。对于 VS Code,您可能需要在设置中启用 Chat > Agent: Enable

  1. 一键设置:

在 VS Code 中安装

在 VS Code Insiders 中安装

或者手动将配置添加到您的 settings.json(全局):

json
{
"mcp": {
"servers": {
"sympy-mcp": {
"command": "uv",
"args": [
"run",
"--with",
"einsteinpy",
"--with",
"mcp[cli]",
"--with",
"pydantic",
"--with",
"sympy",
"mcp",
"run",
"/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py"
]
}
}
}
}

  1. 单击服务器配置上方的“启动”按钮切换到聊天中的代理模式,并尝试使用命令如 "integrate x^2" 或 "solve x^2 = 1" 开始。

Cline 设置

要与 Cline 一起使用,您首先需要使用“用法”部分中的命令手动运行 MCP 服务器。一旦 MCP 服务器正在运行,打开 Cline 并选择顶部的“MCP Servers”。

然后选择“远程服务器”并添加以下内容:

  • 服务器名称:sympy-mcp
  • 服务器 URL:http://127.0.0.1:8081/sse

5ire 设置

另一个支持后端多个模型(o3, o4-mini, DeepSeek-R1 等)的 MCP 客户端是 5ire。

要与 5ire 一起设置,请打开 5ire 并转到工具 -> 新建并设置以下配置:

  • 工具键:sympy-mcp
  • 名称:SymPy MCP
  • 命令:/opt/homebrew/bin/uv run --with einsteinpy --with mcp[cli] --with pydantic --with sympy mcp run /ABSOLUTE_PATH_TO/server.py

/ABSOLUTE_PATH_TO/server.py 替换为您的 sympy-mcp server.py 文件的实际路径。

在容器中运行

您可以使用 Docker 本地构建和运行服务器:

bash

构建 Docker 镜像

docker build -t sympy-mcp .

运行 Docker 容器

docker run -p 8081:8081 sympy-mcp

或者,您可以从 GitHub Container Registry 拉取预构建镜像:

bash

拉取最新镜像

docker pull ghcr.io/sdiehl/sympy-mcp:latest

运行容器

docker run -p 8081:8081 --rm ghcr.io/sdiehl/sympy-mcp:latest

要配置 Claude Desktop 以启动 Docker 容器,请编辑您的 claude_desktop_config.json 文件:

json
{
"mcpServers": {
"sympy-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"-p",
"8081:8081",
"--rm",
"sympy-mcp"
]
}
}
}

或使用来自 GitHub 的预构建容器:

json
{
"mcpServers": {
"sympy-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"-p",
"8081:8081",
"--rm",
"ghcr.io/sdiehl/sympy-mcp:latest"
]
}
}
}

此配置告诉 Claude Desktop 在需要时启动 Docker 容器。请确保在使用此配置之前构建 Docker 镜像 (docker build -t sympy-mcp .)。

其他安装方法也可以通过将 uv 命令更改为使用 docker run 命令来适应 Docker 使用。

示例交互 1:微分方程以下是关于如何在与AI助手的对话中使用此MCP服务器调用工具的一个示例:

用户: 解决带有强迫项的阻尼谐振子问题:由微分方程描述的质量-弹簧-阻尼系统,其中m是质量,c是阻尼系数,k是弹簧常数,F(t)是外部力。

$$ mfrac{d^2x}{dt^2} + cfrac{dx}{dt} + kx = F(t) $$

助手: (内部工具调用) intro_many 介绍变量:
json
{
"variables": [
{"var_name": "t", "pos_assumptions": ["real"], "neg_assumptions": []},
{"var_name": "m", "pos_assumptions": ["real", "positive"], "neg_assumptions": []},
{"var_name": "c", "pos_assumptions": ["real", "positive"], "neg_assumptions": []},
{"var_name": "k", "pos_assumptions": ["real", "positive"], "neg_assumptions": []}
]
}

助手: (内部工具调用) introduce_function 定义 x(t):
json
{
"func_name": "x"
}

助手: (内部工具调用) introduce_expression 创建微分方程:
json
{
"expr_str": "Eq(mDerivative(x(t), t, t) + cDerivative(x(t), t) + k*x(t), F(t))"
}

助手: (内部工具调用) print_latex_expression 以美观的方式显示方程:
json
{
"expr_key": "expr_12"
}

结果:

$$
c frac{d}{d t} x{left(t ight)} + k x{left(t ight)} + m frac{d^{2}}{d t^{2}} x{left(t ight)} = F{left(t ight)}
$$

助手: (内部工具调用) introduce_function 定义 F(t):
json
{
"func_name": "F"
}

助手: (内部工具调用) dsolve_ode 解微分方程:
json
{
"expr_key": "expr_12",
"func_name": "x"
}

结果:

$$
x{left(t ight)} = C_{1} e^{frac{t left(- c + sqrt{c^{2} - 4 k m} ight)}{2 m}} + C_{2} e^{- frac{t left(c + sqrt{c^{2} - 4 k m} ight)}{2 m}} + cdots
$$

示例交互2: 广义相对论

用户: 使用反德西特时空的逆度规 $g^{mu
u}$ 计算里奇张量 $R_{mu
u}$ 的迹,以确定其常数标量曲率 $R$。

助手: (内部工具调用) create_predefined_metric 创建反德西特度规:
json
{
"metric_name": "AntiDeSitter"
}

助手: (内部工具调用) calculate_tensor 计算里奇张量:
json
{
"metric_key": "metric_AntiDeSitter",
"tensor_type": "RICCI_TENSOR",
"simplify_result": true
}

助手: (内部工具调用) print_latex_tensor 显示里奇张量:
json
{
"tensor_key": "riccitensor_metric_AntiDeSitter"
}

结果:

$$
left[egin{matrix}3 & 0 & 0 & 0\0 & - 3 cos^{2}{left(t ight)} & 0 & 0\0 & 0 & - 3 cos^{2}{left(t ight)} sinh^{2}{left(chi ight)} & 0\0 & 0 & 0 & - 3 sin^{2}{left( heta ight)} cos^{2}{left(t ight)} sinh^{2}{left(chi ight)}end{matrix} ight]
$$

助手: (内部工具调用) calculate_tensor 计算里奇标量:
json
{
"metric_key": "metric_AntiDeSitter",
"tensor_type": "RICCI_SCALAR",
"simplify_result": true
}

助手: (内部工具调用) print_latex_tensor 显示里奇标量:
json
{
"tensor_key": "ricciscalar_metric_AntiDeSitter"
}

结果:

$$
-12
$$

安全声明

此服务器运行于您的计算机上,并允许语言模型执行Python逻辑。值得注意的是,它使用Sympy的parse_expr来解析数学表达式,而该函数底层使用了eval,实际上允许任意代码执行。通过运行服务器,您信任Claude生成的代码。在Docker镜像中运行稍微安全一些,但最好还是在运行前审查代码。

许可证

版权所有 © 2025 Stephen Diehl。

本项目根据Apache 2.0许可证授权。详情请参阅LICENSE文件。

相关 MCP 服务