347 查看 · 2026-07-07 更新
符号代数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。
- 一键设置:
或者手动将配置添加到您的 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" ] } } } }
- 单击服务器配置上方的“启动”按钮切换到聊天中的代理模式,并尝试使用命令如 "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文件。
服务配置
[{'mcpServers': {'sympy-mcp': {'args': ['run', '--with', 'einsteinpy', '--with', 'mcp[cli]', '--with', 'pydantic', '--with', 'sympy', 'mcp', 'run', '/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py'], 'command': '/opt/homebrew/bin/uv'}}}, {'mcpServers': {'sympy-mcp': {'args': ['run', '--with', 'einsteinpy', '--with', 'mcp[cli]', '--with', 'pydantic', '--with', 'sympy', 'mcp', 'run', '/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py'], 'command': '/opt/homebrew/bin/uv'}}}, {'mcpServers': {'sympy-mcp': {'args': ['run', '-i', '-p', '8081:8081', '--rm', 'sympy-mcp'], 'command': 'docker'}}}, {'mcpServers': {'sympy-mcp': {'args': ['run', '-i', '-p', '8081:8081', '--rm', 'ghcr.io/sdiehl/sympy-mcp:latest'], 'command': 'docker'}}}]
来源
- 来源:github
- 链接:https://github.com/sdiehl/sympy-mcp