s

sdiehl

code-executionresearch-and-dataeducation-and-learning-tools

347 查看 · 2026-07-07 更新

Sympy MCP Logo

符号代数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}) 上的项。

属性
commutativetrue
complextrue
finitetrue
infinitefalse

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文件。

服务配置

[{'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'}}}]

来源