Sympy-MCP是一个模型上下文协议服务器,允许语言模型自主执行符号数学和计算机代数。它向MCP客户端暴露了SymPy核心功能中的多种工具,用于操作数学表达式和方程。
语言模型在符号操作方面表现极差。它们会虚构变量、编造随机常数、排列项,并且通常会制造混乱。但我们有专门为符号操作设计的计算机代数系统,因此我们可以使用工具调用来编排一系列变换,使符号内核完成所有繁重的工作。
虽然你可以让语言模型生成Mathematica或Python代码,但如果你想将语言模型用作代理或实时计算器,使用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。
brew install uvcurl -LsSf https://astral.sh/uv/install.sh | sh然后你可以使用以下命令安装并运行服务器:
# 设置项目
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运行任意代码,所以要小心。
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库。
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 | 引入用于微分方程的函数变量 |
| 常微分方程求解器 | dsolve_ode | 求解常微分方程 |
| 偏微分方程求解器 | pdsolve_pde | 求解偏微分方程 |
| 标准度规 | 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 | 创建用于矢量微积分操作的三维坐标系 |
| 矢量场 | 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 | 计算矩阵的特征向量 |
默认情况下,变量预先定义了假设(类似于SymPy中的symbols()函数)。除非另有说明,默认假设是变量是复数、交换、属于复数域$\mathbb{C}$。
| 属性 | 值 |
|---|---|
commutative | true |
complex | true |
finite | true |
infinite | false |
通常,mcp install命令会自动将服务器添加到claude_desktop_config.json文件中。如果未添加,你需要找到配置文件并添加以下内容:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json在mcpServers对象中添加以下内容,将/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py替换为sympy-mcp server.py文件的绝对路径。
{
"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/mcp.json中添加以下内容,其中ABSOLUTE_PATH_TO_SYMPY_MCP是sympy-mcp server.py文件的路径。
{
"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 Insiders现在支持代理模式下的MCPs。对于VS Code,你可能需要在设置中启用Chat > Agent: Enable。
或者手动将配置添加到你的settings.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"
]
}
}
}
}
要与Cline一起使用,首先需要使用“使用方法”部分中的命令手动运行MCP服务器。一旦MCP服务器运行起来,打开Cline并在顶部选择“MCP服务器”。
然后选择“远程服务器”并添加以下内容:
sympy-mcphttp://127.0.0.1:8081/sse另一个支持后端多个模型(如o3、o4-mini、DeepSeek-R1等)的MCP客户端是5ire。
要与5ire设置,打开5ire并转到工具->新建,设置以下配置:
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本地构建和运行服务器:
# 构建Docker镜像
docker build -t sympy-mcp .
# 运行Docker容器
docker run -p 8081:8081 sympy-mcp
或者,可以从GitHub Container Registry拉取预构建的镜像:
# 拉取最新镜像
docker pull ghcr.io/sdiehl/sympy-mcp:main
# 运行容器
docker run -p 8081:8081 --rm ghcr.io/sdiehl/sympy-mcp:main
要配置Claude Desktop以启动Docker容器,编辑你的claude_desktop_config.json文件:
{
"mcpServers": {
"sympy-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"-p",
"8081:8081",
"--rm",
"sympy-mcp"
]
}
}
}
或者,要使用来自GitHub的预构建容器:
{
"mcpServers": {
"sympy-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"-p",
"8081:8081",
"--rm",
"ghcr.io/sdiehl/sympy-mcp:main"
]
}
}
}
此配置告诉Claude Desktop在需要时启动Docker容器。确保在使用此配置的Claude Desktop之前构建Docker镜像(docker build -t sympy-mcp .)。其他安装方法也可以适应Docker,只需将uv命令更改为使用docker run命令即可。
这是一个示例,展示了如何在使用此MCP服务器与AI助手的对话中进行工具调用:
用户:求解带有阻尼项的谐振子:描述质量-弹簧-阻尼系统的微分方程,其中m是质量,c是阻尼系数,k是弹簧常数,F(t)是外部力。
$$ m\frac{d^2x}{dt^2} + c\frac{dx}{dt} + kx = F(t) $$
助手:(内部工具调用)intro_many以引入变量:
{
"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):
{
"func_name": "x"
}
助手:(内部工具调用)introduce_expression以创建微分方程:
{
"expr_str": "Eq(m*Derivative(x(t), t, t) + c*Derivative(x(t), t) + k*x(t), F(t))"
}
助手:(内部工具调用)print_latex_expression以漂亮地显示方程:
{
"expr_key": "expr_12"
}
结果:
$$ c \frac{d}{d t} x{\left(t \right)} + k x{\left(t \right)} + m \frac{d^{2}}{d t^{2}} x{\left(t \right)} = F{\left(t \right)} $$
助手:(内部工具调用)introduce_function以定义F(t):
{
"func_name": "F"
}
助手:(内部工具调用)dsolve_ode以求解微分方程:
{
"expr_key": "expr_12",
"func_name": "x"
}
结果:
$$ x{\left(t \right)} = C_{1} e^{\frac{t \left(- c + \sqrt{c^{2} - 4 k m}\right)}{2 m}} + C_{2} e^{- \frac{t \left(c + \sqrt{c^{2} - 4 k m}\right)}{2 m}} + \cdots $$
用户:使用反德西特时空的逆度规$g^{\mu\nu}$计算里奇张量$R_{\mu\nu}$的迹,以确定其常数量曲率$R$。
助手:(内部工具调用)create_predefined_metric以创建反德西特度规:
{
"metric_name": "AntiDeSitter"
}
助手:(内部工具调用)calculate_tensor以计算里奇张量:
{
"metric_key": "metric_AntiDeSitter",
"tensor_type": "RICCI_TENSOR",
"simplify_result": true
}
**