符号计算工具服务器

一个基于FastMCP和SymPy的MCP服务器,提供符号微积分工具,包括导数、积分、极限、级数展开、方程求解、ODE和多元微积分等功能,适用于AI代理和数学辅导场景。

  • by rdwj
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 rdwj/calculus-helper

使用说明

微积分助手MCP服务器

一个MCP(模型上下文协议)服务器,为AI代理提供符号演算工具。它基于FastMCP 2.x和SymPy构建,处理导数、积分、极限、级数展开、方程求解、ODE和多变量微积分——所有这些都具有人性化的表达式解析和LaTeX输出。

设计用于支持微积分辅导代理,但任何需要符号数学的MCP客户端都可以使用。

特性

  • 七种微积分工具,涵盖单变量和多变量主题
  • 人性化的表达式输入:插入符号(x^2),隐式乘法(2x),标准功能(sin, cos, exp, log, sqrt)
  • 每个结果都包含LaTeX输出
  • 两个输出详细程度级别(concise / detailed)在每个工具上
  • 可组合工具设计:将梯度输出直接送入发散或卷曲
  • 六个微积分主题的定义、定理和公式的参考资源
  • 辅导提示,将代理配置为三个学生级别的微积分导师
  • 用于本地开发和OpenShift部署的STDIO和HTTP传输

快速开始

# Install and run locally
make install
make run-local

# Test with cmcp (in another terminal)
cmcp ".venv/bin/python -m src.main" tools/list

# Deploy to OpenShift
make deploy PROJECT=calculus-helper

工具

工具 说明
compute_derivative 区分表达式(支持高阶和偏微分)
compute_integral 数值近似的不定积分或定积分
compute_limit 评估极限(双侧、单侧、无穷远)
expand_series 泰勒/麦克劳林级数展开与奇异性检测
solve_equation 求解一个或多个变量的代数方程
solve_ode 求解常微分方程(一般或特殊)
multivariable_calc 偏导数、梯度、散度、旋度、二重/三重积分

计算导数

计算数学表达式的导数。支持多变量表达式的高阶导数和偏导数。

参数 类型 默认值 说明
expression str required 用于区分的表达式,例如。 x**3 + 2*x
variable str 必填 用于区分的变量
order int 1 导数的顺序(1=第一,2=第二,…)
d/dx(x^3 + 2*x)       -> 3*x**2 + 2
d^2/dx^2(x^4)          -> 12*x**2
d/dy(x*y^2)            -> 2*x*y
d/dx(sin(x)*cos(x))    -> cos(2*x)

计算积分

计算不定积分或定积分。不定积分返回反导数+C。定积分在可能的情况下返回符号结果和数值近似值。

参数 类型 默认值 说明
expression str 必需 要集成的表达式
variable str 必填 积分变量
lower_bound str或null null 下限(使用 -oo 对于负无穷大)
upper_bound str或null null 上限(使用 oo 无限)

必须为定积分提供两个界;无限期省略两者。

integral(x^2, x)              -> x**3/3 + C
integral(sin(x), x, 0, pi)   -> 2

计算极限

当变量接近某个值时,评估限制。双侧限值验证两个单侧限值是否一致;如果他们不同意,该工具会报告这两个值。

参数 类型 默认值 说明
expression str required 用于计算限制的表达式
variable str 必填 接近该点的变量
point str 必填 接近值(oo, -oo, pi,数字)
direction str "both" "both", "+" / "right", "-" / "left"
lim(sin(x)/x, x, 0)          -> 1
lim(1/x, x, 0, "+")          -> oo
lim(1/x, x, 0, "both")       -> ToolError: left = -oo, right = oo

expand_series

泰勒/麦克劳林级数围绕给定点展开。检测奇异点并将其报告为错误,而不是返回Laurent级数。

参数 类型 默认值 说明
expression str 必需 要展开的函数
variable str required 要展开的变量
point str "0" 扩建中心("0" =麦克劳林)
order int 6 术语数量
series(exp(x), x, 0, 6)      -> 1 + x + x**2/2 + x**3/6 + x**4/24 + x**5/120 + O(x**6)
series(sin(x), x, 0, 4)      -> x - x**3/6 + O(x**4)
series(exp(x), x, 1, 3)      -> E + E*(x-1) + E*(x-1)**2/2 + O((x-1)**3)

求解方程

求解一个或多个变量的代数方程。如果没有 = 如果存在,则假设表达式等于零。当不存在真正的根时,返回复杂的解。三角方程只返回主解。

参数 类型 默认值 说明
equation str 必填 要求解的方程式(使用 = 平等)
variable str或null null 要求解的变量(如果是单个变量,则自动检测)
solve(x^2 - 4 = 0, x)        -> x = -2, 2
solve(3*x + 1 = 7, x)        -> x = 2
solve(x^2 - 1)               -> x = -1, 1   (assumes = 0)
solve(x + y = 5, x)          -> x = 5 - y

解决方案

求解常微分方程。支持素数表示法(y', y'', y''')以及 Derivative(y, x) 符号。返回具有任意常数(C1,C2,…)的通解,或在提供初始条件时返回特定解。

参数 类型 默认值 说明
equation str 必填 ODE(y' - 2*y = 0, y'' + y = sin(x))
function_name str "y" 未知函数的名称
variable str "x" 自变量
initial_conditions str或null null 逗号分隔的IC: y(0)=1, y'(0)=0
ode(y' - 2*y = 0)                          -> y(x) = C1*exp(2*x)
ode(y'' + y = 0, ics="y(0)=1, y'(0)=0")    -> y(x) = cos(x)

多变量calc

执行多变量微积分运算。渐变输出使用括号符号([2*x, 2*y, 2*z])这被散度和旋度直接接受为输入。

参数 类型 默认值 说明
operation str 必填 以下之一: partial_derivative, gradient, divergence, curl, double_integral, triple_integral
expression str 必填 标量字段或逗号分隔的向量分量
variables str 必填 逗号分隔的变量名,例如。 x, y, z
with_respect_to str或null null 必需 partial_derivative
bounds str或null null 积分需要。格式: x: 0, 1; y: 0, x
partial_derivative(x*y^2, vars="x,y", wrt="y")   -> 2*x*y
gradient(x^2+y^2+z^2, vars="x,y,z")              -> [2*x, 2*y, 2*z]
divergence([2*x, 2*y, 2*z], vars="x,y,z")        -> 6
curl([-y, x, 0], vars="x,y,z")                   -> [0, 0, 2]
double_integral(x*y, vars="x,y", bounds="x:0,1; y:0,1")  -> 1/4

公共参数

所有工具都接受这些可选参数:

  • detail_level (str,默认值 "concise"): "concise" 只返回结果和LaTeX; "detailed" 添加输入表达式、应用规则、中间步骤和(在适用的情况下)ODE分类。
  • ctx (上下文,默认值 None):用于日志记录的FastMCP上下文。内部使用;呼叫者不需要提供它。

表达式语法

解析器接受标准数学符号,但有一些便利:

符号 示例 解释
Caret指数运算 x^2 x**2
隐式乘法 2x, 3sin(x) 2*x, 3*sin(x)
标准功能 sin, cos, tan, exp, log, sqrt SymPy等效物
常量 pi, E, e, oo pi,欧拉数,无穷大
负无穷大 -oo, -inf 负无穷大

对于ODE表示法,使用素数表示法(y', y'', y''')或 Derivative(y(x), x).

资源

calculus://reference/{主题}

六个微积分主题的参考资料(定义、关键定理、常用公式):

主题 内容
derivatives 定义、规则(功率、乘积、商、链)、常见导数、MVT、L'Hopital
integrals 黎曼定义、FTC、技术(替换、部分、偏分数)、普通积分
limits Epsilon delta定义,极限定律,关键极限,挤压定理,连续性
series 收敛性测试,几何/p系列,Taylor/Maclaurin系列,收敛半径
differential_equations 一阶(可分、线性、精确)、二阶线性、存在性/唯一性
multivariable 偏导数、梯度、散度/旋度、多重积分、格林/斯托克斯/散度定理

提示

微积分导师

将代理配置为微积分导师的系统提示。导师使用可用的工具逐步展示工作,并参考 calculus://reference/{topic} 背景材料资源。

参数 类型 默认值 说明
topic str 必填 微积分主题要关注
level str "undergraduate" 学生级别: high_school, undergraduate, graduate

级别控制解释深度:

  • 高中简单的语言,真实世界的例子,在严谨之前建立直觉。
  • 本科生:标准符号,直觉和形式主义的平衡,按名称引用定理。
  • 毕业:形式证明、epsilon-delta参数、收敛条件、与其他领域的联系。

项目结构

src/
  core/           # Server bootstrap, dynamic loading, auth, logging
  tools/          # Calculus tool implementations
    _sympy_helpers.py   # Shared expression parsing and formatting
  resources/      # calculus://reference/{topic} resource
  prompts/        # calculus_tutor prompt
  middleware/     # (none currently)
tests/
  tools/          # Tool unit tests
  resources/      # Resource tests
  prompts/        # Prompt tests
Containerfile     # Container definition (UBI base)
openshift.yaml    # OpenShift manifests
deploy.sh         # Deployment script
Makefile          # Common tasks

发展

添加工具

在中创建Python文件 src/tools/.导入共享 mcp 实例来自 src.core.app:

from typing import Annotated
from pydantic import Field
from fastmcp import Context
from fastmcp.exceptions import ToolError
from src.core.app import mcp

@mcp.tool(
    annotations={"readOnlyHint": True, "idempotentHint": True, "openWorldHint": False}
)
async def my_tool(
    expression: Annotated[str, Field(description="Math expression")],
    ctx: Context = None,
) -> str:
    """Tool description for the LLM."""
    # Use helpers from src.tools._sympy_helpers for parsing/formatting
    return "result"

添加资源

from src.core.app import mcp

@mcp.resource("calculus://my-resource/{param}")
async def my_resource(param: str) -> str:
    """Resource description."""
    return "content"

添加提示

from pydantic import Field
from src.core.app import mcp

@mcp.prompt
def my_prompt(
    topic: str = Field(description="Topic area"),
) -> str:
    """Prompt purpose."""
    return f"You are an expert in {topic}..."

加载程序在启动时会自动发现所有组件,无需手动注册。

进口公约

始终使用 src. 此项目中导入的前缀:

from src.core.app import mcp            # correct
from src.tools._sympy_helpers import parse_expression  # correct
from core.app import mcp                # WRONG - causes dual FastMCP instances

测试

# Run all tests
make test

# Or directly
.venv/bin/pytest tests/ -v

# Run a single test file
.venv/bin/pytest tests/tools/test_compute_derivative.py -v

# Run tests matching a pattern
.venv/bin/pytest tests/ -k "test_limit" -v

# Test with cmcp (STDIO, requires separate terminal)
make test-local
cmcp ".venv/bin/python -m src.main" tools/call compute_derivative '{"expression": "x^3", "variable": "x"}'

FastMCP装饰器将函数封装在特殊对象中。通过以下方式访问底层功能 .fn 在测试中:

from src.tools.compute_derivative import compute_derivative

@pytest.mark.asyncio
async def test_power_rule():
    result = await compute_derivative.fn(expression="x^3", variable="x")
    assert "3*x**2" in result

环境变量

变量 默认值 用途
MCP_TRANSPORT stdio 运输方式: stdio 或 http
MCP_HTTP_HOST 127.0.0.1 HTTP绑定地址
MCP_HTTP_PORT 8000 HTTP端口
MCP_HTTP_PATH /mcp/ HTTP端点路径
MCP_LOG_LEVEL INFO 日志记录级别
MCP_HOT_RELOAD 0 启用热重新加载以进行开发
MCP_SERVER_NAME fastmcp-unified MCP响应中的服务器名称

建筑

看 建筑.md 有关动态加载系统、工具可组合性设计和共享助手模式的详细信息。

需求

  • Python 3.11+
  • SymPy>=1.13
  • 快速MCP>=2.11.3
  • OpenShift命令行界面(oc)用于部署
  • cmcp用于本地测试: pip install cmcp