SageMath MCP服务器
          
通用数学 模型上下文协议 (MCP)服务器,允许LLM客户端完全访问 SageMath 的 ---最全面的开源数学系统之一。建于 FastMCP 3.x,服务器为每个MCP会话维护一个专用的SageMath进程,以便变量、函数和假设在工具调用中保持不变。
无论任务是符号微积分、数论、线性代数、微分方程、绘图、组合数学、图论、群论还是基本算术,服务器都会提供 33个MCP工具 ---由完整SageMath引擎支持的所有数学工具,以及 evaluate_sage_streaming (流媒体包装器)和HTTP /health 终点。
______________________________________________________________________
目录
- evaluate_sage——开放式执行 - 微积分工具 - 代数和简化工具 - 线性代数工具 - 微分方程 - 数论 - 统计 - 可视化 - 会话管理和可观察性
______________________________________________________________________
功能概览
| 类别 | 工具 | 后端 | 功能 |
|---|---|---|---|
| 核心执行 | evaluate_sage, evaluate_sage_streaming | Sage | 运行任何具有持久状态、LaTeX输出、stdout捕获、进度心跳、每次调用超时和逐行流的SageMath代码 |
| 微积分 | differentiate_expression, integrate_expression, limit_expression, series_expansion | Sage | 任意阶导数、不定积分和定积分、单侧极限、Taylor/Laurent级数 |
| 代数 | solve_equation, simplify_expression, expand_expression, factor_expression, calculate_expression | Sage | 单方程和系统、符号简化、展开、因式分解、数值计算 |
| 符号总和 | symbolic_sum | Sage | 符号求和与乘积(有限和无限级数) |
| 线性代数 | matrix_multiply, matrix_operation | Sage | 矩阵乘积、行列式、逆、特征值、秩、RREF、转置 |
| 微分方程 | solve_ode | Sage | 通过Sage的 desolve() |
| 数论 | number_theory_operation | Sage | 素数测试、整数分解、下一素数、GCD、LCM |
| 组合数学 | combinatorics_operation | Sage | 二项式、排列、组合、分割、阶乘、加泰罗尼亚语、斐波那契、贝尔数 |
| 图论 | graph_operation | Sage | 命名图和邻接字典;色数、连通性、平面性、直径、最短路径 |
| 群论 | group_operation | Sage | 对称、二面角、环状、交替群;顺序,阿贝尔/循环检验,中心,指数 |
| 椭圆曲线 | elliptic_curve_operation | Sage | 秩、扭、判别、j不变量、导体、发电机 |
| 编码理论 | coding_theory_operation | Sage | 汉明,里德-所罗门密码;长度、尺寸、最小距离、生成器矩阵、速率 |
| 多项式环 | polynomial_ring_operation | Sage | Groebner基础,理想尺寸/品种,减少,Groebner测试 |
| 布尔代数 | boolean_algebra_operation | Sage | 布尔多项式环;评估、变量、程度、零/一测试 |
| 几何 | geometry_operation | Sage | 距离、多边形面积、多面体体积、凸包、紧凑性 Polyhedron |
| 统计 | statistics_summary | Sage | 平均值、中位数、总体和样本方差/标准偏差、最小值、最大值 |
| 概率 | distribution_operation | Sage | 正态、指数、泊松、卡方、Student-t、均匀、贝塔、伽玛;PDF、CDF、分位数、采样 |
| 可视化 | plot_expression, plot3d_expression, plot_multi_expression | Sage | 2D图、3D表面图、base64编码PNG多功能叠加 |
| 数值方法 | find_root | Sage | 通过Sage在区间内查找数字根 find_root() |
| 向量微积分 | vector_calculus_operation | Sage | 标量场/向量场上的梯度、散度、旋度、拉普拉斯算子 |
| 会话控制 | reset_sage_session, cancel_sage_session | Worker | 清除状态或中止长时间运行的计算 |
| 基础设施 | /health 端点、3个MCP资源 | 服务器 | 运行状况检查、会话快照、聚合指标、文档链接 |
______________________________________________________________________
架构概述
┌──────────────────────────────────────────────────────────────────┐
│ MCP Client (Claude Desktop, Gemini CLI, Codex CLI, etc.) │
└──────────────────────┬───────────────────────────────────────────┘
│ MCP protocol (stdio or HTTP)
▼
┌──────────────────────────────────────────────────────────────────┐
│ server.py --- FastMCP 3.x Application │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────────────┐ │
│ │ 18 MCP Tools│ │ 3 Resources │ │ Middleware │ │
│ │ (evaluate, │ │ (session, │ │ - Request logging │ │
│ │ solve, │ │ monitoring, │ │ - Response caching │ │
│ │ diff, ...)│ │ docs) │ │ - Progress heartbeats │ │
│ └──────┬──────┘ └──────────────┘ └────────────────────────┘ │
│ │ │
│ ┌──────▼──────────────────────────────────────────────────────┐ │
│ │ session.py --- SageSessionManager │ │
│ │ Per-client session map with asyncio locks, idle culling │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Session A │ │ Session B │ │ Session C │ ... │ │
│ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │
│ └─────────┼───────────────┼───────────────┼──────────────────┘ │
└────────────┼───────────────┼───────────────┼────────────────────┘
│ │ │
▼ ▼ ▼
┌───────────────────────────────────────────────┐
│ _sage_worker.py --- Subprocess Workers │
│ JSON stdin/stdout protocol │
│ │
│ ┌────────────┐ ┌──────────────────────┐ │
│ │ security.py│──▶│ AST validation │ │
│ │ │ │ before every exec() │ │
│ └────────────┘ └──────────────────────┘ │
│ │
│ Persistent namespace: vars, functions, │
│ classes survive across calls │
└────────────────────────────────────────────────┘请求流程: MCP客户端→ server.py tool → SageSessionManager.get_or_create() → SageSession.evaluate() → JSON请求 _sage_worker.py 子进程→ AST验证→ exec() 在持久命名空间中→ 返回JSON响应。
关键设计决策:
- 过程隔离: 每个会话都在单独的子进程中运行SageMath。一个会话中的崩溃或超时不会影响其他会话。
- 有意义的会议: 变量、函数和假设在同一MCP会话内的工具调用中持续存在,从而实现了多步骤的数学工作流程。
- 默认安全设置: 每个代码片段在执行前都会经过一个基于AST的验证器,无论使用何种工具,都会阻止危险的操作。
- 进展心跳: 长时间运行的计算会发出周期性的进度事件(约1.5秒),因此客户端可以显示活动指示器并检测停滞。
______________________________________________________________________
快速开始
从PyPI安装
pip install sagemath-mcp
# Run the server over stdio (default)
sagemath-mcp
# Or expose an HTTP endpoint
sagemath-mcp --transport streamable-http --host 127.0.0.1 --port 8314如果命令不在您的 PATH,跑 python -m sagemath_mcp.server --help.
从源头开发
git clone https://github.com/XBP-Europe/sagemath-mcp.git
cd sagemath-mcp
# Install dependencies (use uv or pip)
uv pip install -e .[dev]
# Run the server over stdio (default)
uv run sagemath-mcp
# Run with streaming-friendly HTTP transport
uv run sagemath-mcp --transport streamable-http --host 127.0.0.1 --port 8314可选:自动启动Sage容器
如果您想在不本地安装的情况下获得即用型Sage运行时,请运行:
make sage-container # or ./scripts/setup_sage_container.sh在Windows PowerShell上:
pwsh -File scripts/setup_sage_container.ps1Docker镜像
使用内置的MCP服务器构建一个可运行的容器:
docker build -t sagemath-mcp:latest .
docker run -p 8314:8314 sagemath-mcp:latest --transport streamable-http发布的图像发布到 ghcr.io/xbp-europe/sagemath-mcp 并与Cosign签署。 使用以下工具验证下载的工件:
cosign verify ghcr.io/xbp-europe/sagemath-mcp:latest \
--certificate-identity "https://github.com/XBP-Europe/sagemath-mcp/.github/workflows/release.yml@refs/tags/vX.Y.Z" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"Docker Compose
docker compose up --build组合服务公开端口 8314 在主机和容器上,并在以下位置装载存储库 /workspace.容器以非根目录运行 sage 用户(UID/GID 1000)匹配基础图像。通过编辑环境块来调整运行时设置(例如,增加 SAGEMATH_MCP_EVAL_TIMEOUT 或调整 SAGEMATH_MCP_MAX_STDOUT)发射前。
______________________________________________________________________
详细工具参考
evaluate_sage ---开放式SageMath执行
主要工具。在持久工作进程内执行任意SageMath代码。在一次调用中定义的变量、函数、类和假设将在同一MCP会话中的后续调用中继续存在。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
code | string | *必需的* | 要执行的SageMath代码。支持多行字符串。 |
want_latex | bool | false | 何时 true,服务器通过Sage生成最终表达式结果的LaTeX表示(如果存在) latex() 功能。返回在 latex 现场。 |
capture_stdout | bool | true | 何时 true,任何输出 print() 语句被捕获并返回到 stdout 现场。设置为 false 以便在不需要stdout时更快地执行。 |
timeout | float | null | 覆盖每次评估的超时时间(秒)。如果省略,则全局默认值(SAGEMATH_MCP_EVAL_TIMEOUT,30秒)适用。必须大于0。 |
退货 一 EvaluateResult 对象:
| 字段 | 类型 | 描述 |
|---|---|---|
result_type | "expression" 或 "statement" | "expression" 当代码以其值被捕获的表达式结束时; "statement" 当它以任务或副作用结束时。 |
result | string 或 null | The repr() 最终表达式值,或 null 用于语句类型代码。 |
latex | string 或 null | 结果的LaTeX表示(仅当 want_latex=true 结果为非空)。 |
stdout | string | 捕获的stdout输出(如果没有打印任何内容,则为空字符串) capture_stdout=false).截断为 SAGEMATH_MCP_MAX_STDOUT 字符。 |
elapsed_ms | float | 挂钟执行时间(毫秒)。 |
行为细节:
- 代码运行时,服务器发出 进展心跳 大约每1.5秒一次,这样客户端就可以显示活动指示器。
- 如果评估超过超时,则重新启动工作进程,并
TimeoutError提高。之前通话的所有会话状态都将丢失。 - 如果启动代码(
from sage.all import *默认情况下)在worker启动时失败,后续每次evaluate_sage调用返回clearStartupError而不是令人困惑的NameError。 - AST安全验证器在执行之前对每个代码段运行(请参见 安全沙盒).
特定领域示例 (这些包含在工具描述LLM中,请参阅):
| 域名 | Sage代码示例 |
|---|---|
| 组合学 | binomial(10, 3), Permutations(4).cardinality(), Combinations([1,2,3,4], 2).list() |
| 图论 | G = graphs.PetersenGraph(); G.chromatic_number() |
| 数论 | prime_range(100), euler_phi(60), continued_fraction(pi, nterms=10) |
| 几何学 | polytopes.cube().volume(), EllipticCurve([0,0,1,-1,0]).rank() |
| 概率 | RealDistribution('gaussian', 1).cum_distribution_function(1.96) |
| 群论 | SymmetricGroup(5).order(), AlternatingGroup(4).is_abelian() |
| 多项式环 | R. = PolynomialRing(QQ); (a+b)^3 |
| 编码理论 | codes.HammingCode(GF(2), 3).minimum_distance() |
有状态的多步骤工作流程:
> evaluate_sage(code="var('a'); f = (a + 1)^5")
result_type: "statement", result: null
> evaluate_sage(code="expand(f)")
result_type: "expression", result: "a^5 + 5*a^4 + 10*a^3 + 10*a^2 + 5*a + 1"
> evaluate_sage(code="diff(f, a, 2)")
result_type: "expression", result: "20*(a + 1)^3"______________________________________________________________________
微积分工具
differentiate_expression
计算表达式的符号导数。致电Sage diff(expr, var, order) 内部。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 要区分的表达(例如。 "sin(x)*e^x", "x^3 + 2*x"). |
variable | string | "x" | 要区分的变量 |
order | int (>= 1) | 1 | 差异化顺序。 1 =一阶导数, 2 =二阶导数等。 |
退货: {"derivative": "...", "order": N}
> differentiate_expression(expression="x^5", variable="x", order=3)
{"derivative": "60*x^2", "order": 3}
> differentiate_expression(expression="sin(x)*cos(x)")
{"derivative": "cos(x)^2 - sin(x)^2", "order": 1}integrate_expression
计算不定积分或定积分。致电Sage integrate() 功能。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 表达要整合。 |
variable | string | "x" | 积分变量。 |
lower_bound | string 或 null | null | 定积分的下界。接受符号值,如 "0", "-oo" (负无穷大)或类似表达式 "-pi". |
upper_bound | string 或 null | null | 定积分的上界。接受 "1", "oo" (无穷大), "pi/2"等等。 |
两者 lower_bound 和 upper_bound 对于定积分,必须同时提供,或者对于不定积分,两者都省略。只提供一个会引发错误。
退货: {"integral": "...", "definite": true/false}
> integrate_expression(expression="x^2")
{"integral": "1/3*x^3", "definite": false}
> integrate_expression(expression="x^2", lower_bound="0", upper_bound="1")
{"integral": "1/3", "definite": true}
> integrate_expression(expression="e^(-x^2)", lower_bound="-oo", upper_bound="oo")
{"integral": "sqrt(pi)", "definite": true}limit_expression
当变量接近一个点时,计算表达式的极限。致电Sage limit() 功能。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 该表达式将受到限制。 |
variable | string | "x" | 接近该点的变量。 |
point | string | "0" | 接近的要点。使用 "oo" 对于正无穷大, "-oo" 对于负无穷大或任何符号表达。 |
direction | string 或 null | null | 单侧限制方向: "plus" (从右边接近,x->a+), "minus" (从左侧接近,x->a-),或 null 对双方来说。 |
退货: {"limit": "..."}
> limit_expression(expression="sin(x)/x", point="0")
{"limit": "1"}
> limit_expression(expression="1/x", point="0", direction="plus")
{"limit": "+Infinity"}
> limit_expression(expression="(1 + 1/n)^n", variable="n", point="oo")
{"limit": "e"}series_expansion
围绕一个点计算泰勒级数或劳伦特级数展开。致电Sage .series() 方法。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 要扩展的表达式。 |
variable | string | "x" | 膨胀变量。 |
point | string | "0" | 扩展中心(Maclaurin系列时 "0"). |
order | int (>= 1) | 6 | 扩展中的术语数量。 |
退货: {"series": "...", "point": "...", "order": N}
> series_expansion(expression="e^x", order=5)
{"series": "1 + x + 1/2*x^2 + 1/6*x^3 + 1/24*x^4 + O(x^5)", "point": "0", "order": 5}
> series_expansion(expression="1/(1-x)", point="0", order=4)
{"series": "1 + x + x^2 + x^3 + O(x^4)", "point": "0", "order": 4}______________________________________________________________________
代数和简化工具
solve_equation
求解一个方程或一组联立方程。致电Sage solve() 功能。方程式通过拆分来解析 =:字符串 "x^2 - 1 = 0" 成为Sage方程式 x^2 - 1 == 0.
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
equation | string 或 list[string] | *必需的* | 单个方程式字符串(例如。 "x^2 - 1 = 0")或系统的方程式列表(例如。 ["x + y = 3", "x - y = 1"]).如果没有 = 如果存在,则表达式求解为 expr = 0. |
variable | string 或 list[string] | "x" | 要求解的变量。使用系统列表(例如。 ["x", "y"]). |
退货: {"solutions": [...]}
> solve_equation(equation="x^2 - 5*x + 6 = 0")
{"solutions": ["x == 2", "x == 3"]}
> solve_equation(equation=["x + y = 10", "x - y = 2"], variable=["x", "y"])
{"solutions": [[x == 6, y == 4]]}
> solve_equation(equation="sin(x) = 1/2", variable="x")
{"solutions": ["x == 1/6*pi"]}simplify_expression
申请Sage simplify() 函数将符号表达式简化为更简单的形式。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 要简化的表达式。 |
退货: {"simplified": "..."}
> simplify_expression(expression="(x^2 - 1)/(x - 1)")
{"simplified": "x + 1"}
> simplify_expression(expression="sin(x)^2 + cos(x)^2")
{"simplified": "1"}expand_expression
使用Sage扩展产品、幂和三角/对数恒等式 expand().
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 要扩展的表达式。 |
退货: {"expanded": "..."}
> expand_expression(expression="(x + 1)^3")
{"expanded": "x^3 + 3*x^2 + 3*x + 1"}
> expand_expression(expression="(a + b)*(a - b)")
{"expanded": "a^2 - b^2"}factor_expression
使用Sage对符号表达式或整数进行因子分析 factor().
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 表达因素。可以是多项式(例如。 "x^2 - 1")或整数(例如。 "60"). |
退货: {"factored": "..."}
> factor_expression(expression="x^3 - 1")
{"factored": "(x - 1)*(x^2 + x + 1)"}
> factor_expression(expression="60")
{"factored": "2^2 * 3 * 5"}calculate_expression
计算符号表达式并返回其字符串表示形式和数值(如果可能)。使用Sage的 sage_eval() 内部带有预先声明的变量 x, y, z, t.
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 要计算的表达式。 |
退货: {"string": "...", "numeric": float} ---the numeric 当表达式无法转换为浮点数时,字段会被省略。
> calculate_expression(expression="factorial(10)")
{"string": "3628800", "numeric": 3628800.0}
> calculate_expression(expression="sqrt(2)")
{"string": "sqrt(2)", "numeric": 1.4142135623730951}
> calculate_expression(expression="pi")
{"string": "pi", "numeric": 3.141592653589793}______________________________________________________________________
线性代数工具
matrix_multiply
在符号环上乘以两个矩阵(SR).输入矩阵是嵌套的数字列表。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
matrix_a | list[list[float]] | *必需的* | 左矩阵(数字行)。 |
matrix_b | list[list[float]] | *必需的* | 右矩阵(数字行)。 |
退货: {"product": [[...], ...]} ---条目为浮点数时为实数,否则为字符串。
> matrix_multiply(matrix_a=[[1, 2], [3, 4]], matrix_b=[[5, 6], [7, 8]])
{"product": [[19.0, 22.0], [43.0, 50.0]]}matrix_operation
执行单个矩阵运算。支持对符号环上的矩阵进行六次操作。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
matrix | list[list[float]] | *必需的* | 以嵌套数字列表的形式输入矩阵。 |
operation | string | *必需的* | 其中之一: "determinant", "inverse", "eigenvalues", "rank", "rref", "transpose". |
退货: {"operation": "...", "result": ...} ---结果类型因操作而异:
| 操作 | 结果类型 | 描述 |
|---|---|---|
determinant | float 或 string | 标量行列式值。 |
inverse | list[list[float]] | 逆矩阵(奇异时误差)。 |
eigenvalues | list[float] | 特征值列表(具有多重性)。 |
rank | int | 矩阵排名。 |
rref | list[list[float]] | 减少排梯队形式 |
transpose | list[list[float]] | 转置矩阵 |
> matrix_operation(matrix=[[1, 2], [3, 4]], operation="determinant")
{"operation": "determinant", "result": -2.0}
> matrix_operation(matrix=[[2, 1], [1, 2]], operation="eigenvalues")
{"operation": "eigenvalues", "result": [3.0, 1.0]}
> matrix_operation(matrix=[[1, 2, 3], [0, 1, 4], [5, 6, 0]], operation="inverse")
{"operation": "inverse", "result": [[-24.0, 18.0, 5.0], [20.0, -15.0, -4.0], [-5.0, 4.0, 1.0]]}
> matrix_operation(matrix=[[1, 2], [3, 6]], operation="rank")
{"operation": "rank", "result": 1}______________________________________________________________________
微分方程
solve_ode
使用Sage求解常微分方程 desolve()。使用Sage的公式将方程式指定为字符串 diff() 符号。求解器返回具有任意常数的通解(_C, _K1, _K2等等)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
equation | string | *必需的* | ODE为字符串。使用 diff(y(x),x) 对于y, diff(y(x),x,x) 对于y等。包含 = 0 或 = rhs 以指定方程式。 |
function | string | "y" | 正在求解的依赖函数的名称。 |
variable | string | "x" | 自变量的名称。 |
退货: {"solution": "..."}
> solve_ode(equation="diff(y(x),x) + y(x) = 0")
{"solution": "_C*e^(-x)"}
> solve_ode(equation="diff(y(x),x,x) - y(x) = 0")
{"solution": "_K1*e^(-x) + _K2*e^x"}
> solve_ode(equation="diff(y(x),x) = x*y(x)")
{"solution": "_C*e^(1/2*x^2)"}
> solve_ode(equation="diff(y(t),t) + 2*y(t) = sin(t)", function="y", variable="t")
{"solution": "..."}______________________________________________________________________
数论
number_theory_operation
使用Sage的内置函数执行常见的数论运算。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
operation | string | *必需的* | 其中之一: "is_prime", "factor_integer", "next_prime", "gcd", "lcm". |
a | int | *必需的* | 主整数参数。 |
b | int 或 null | null | 第二个整数。 必需 为了 gcd 和 lcm;否则不予理会。 |
退货: {"operation": "...", "result": ...} ---结果类型各不相同:
| 操作 | 结果类型 | 调用Sage函数 | 说明 |
|---|---|---|---|
is_prime | bool | is_prime(a) | 是否 a 是一个质数。 |
factor_integer | string | factor(a) | 素数分解作为人类可读的字符串(例如。 "2^3 * 3 * 5"). |
next_prime | int | next_prime(a) | 最小素数大于 a. |
gcd | int | gcd(a, b) | 最大公约数 a 和 b. |
lcm | int | lcm(a, b) | 的最小公倍数 a 和 b. |
> number_theory_operation(operation="is_prime", a=997)
{"operation": "is_prime", "result": true}
> number_theory_operation(operation="factor_integer", a=2520)
{"operation": "factor_integer", "result": "2^3 * 3^2 * 5 * 7"}
> number_theory_operation(operation="next_prime", a=100)
{"operation": "next_prime", "result": 101}
> number_theory_operation(operation="gcd", a=48, b=180)
{"operation": "gcd", "result": 12}
> number_theory_operation(operation="lcm", a=12, b=18)
{"operation": "lcm", "result": 36}______________________________________________________________________
统计
statistics_summary
使用Sage计算数值数据集的描述性统计 mean() 和 sqrt() 功能。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
data | list[float] | *必需的* | 数值列表。方差/std-dev必须至少包含2个元素 |
退货: 一本包含以下内容的词典:
| 字段 | 描述 |
|---|---|
mean | 算术平均值。 |
median | 中值。 |
population_variance | 总体方差(除以N)。 |
sample_variance | 样本方差(除以N-1)。 |
population_std_dev | 总体标准偏差。 |
sample_std_dev | 样品标准偏差。 |
min | 最小值。 |
max | 最大值。 |
> statistics_summary(data=[2, 4, 4, 4, 5, 5, 7, 9])
{"mean": 5.0, "median": 4.5, "population_variance": 4.0, "sample_variance": 4.571..., ...}______________________________________________________________________
可视化
plot_expression
渲染表达式的2D图,并将其作为base64编码的PNG图像返回。致电Sage plot() 函数,并将结果序列化到内存中的PNG缓冲区。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expression | string | *必需的* | 要绘制的表达式。 |
variable | string | "x" | 绘图变量。 |
range_min | float | -10.0 | 绘图范围的下限。 |
range_max | float | 10.0 | 绘图范围的上限。 |
退货: {"image_base64": "...", "format": "png"}
返回的base64字符串可以直接在任何支持内联图像的客户端中呈现(例如,通过 ` 标签或Markdown `).
> plot_expression(expression="sin(x)*e^(-x/5)", range_min=-5, range_max=20)
{"image_base64": "iVBORw0KGgo...", "format": "png"}
> plot_expression(expression="x^3 - 3*x", range_min=-3, range_max=3)
{"image_base64": "...", "format": "png"}______________________________________________________________________
会话管理和可观察性
reset_sage_session
清除当前会话中的所有变量、函数和定义。底层工作进程继续运行(快速)。相当于重新启动一个新的Sage shell。
退货: {"message": "Session cleared"}
cancel_sage_session
通过终止工作进程并启动新进程来中止任何正在进行的计算。当计算卡住或耗时过长时使用此选项。所有会话状态都丢失。
退货: {"message": "Session cancelled and restarted"}
MCP资源
| 资源URI | 作用域值 | 描述 |
|---|---|---|
resource://sagemath/session/{scope} | all,或特定的会话ID | 返回JSON,其中包含: session_id, live (布尔), started_at, last_used_at, idle_seconds. |
resource://sagemath/monitoring/{scope} | metrics, all | 返回JSON格式: attempts, successes, failures, security_failures, avg_elapsed_ms, max_elapsed_ms, last_run_at, last_error, last_security_violation, last_error_details. |
resource://sagemath/docs/{scope} | all, reference, tutorial | 返回带有SageMath文档URL的文档链接对象。 |
______________________________________________________________________
安全沙盒
所有代码---是否来自 evaluate_sage 或者由辅助工具内部生成——在执行之前通过基于AST的安全验证器。
被阻止的内容:
| 类别 | 详细信息 |
|---|---|
| 危险建筑 | eval(), exec(), compile(), __import__(), open(), input(), globals(), locals(), vars() |
| 文件系统/进程操作 | os.system, os.popen, os.remove, os.fork, subprocess.*, shutil.rmtree, pathlib.*, socket.* |
| 未经授权的进口 | 除共列表中的进口外的所有进口(见下文) |
| 范围操纵 | global 和 nonlocal 语句(可配置) |
允许的内容:
| 导入 | 原因 |
|---|---|
math, cmath | 标准数学函数 |
statistics | 使用人 statistics_summary |
base64, io | 使用人 plot_expression 用于内存中的PNG编码 |
sage, sage.all, sage.* | 完整的SageMath库 |
强制限制:
| 限制 | 默认值 | 环境变量 |
|---|---|---|
| 最大源代码长度 | 8000个字符 | SAGEMATH_MCP_SECURITY_MAX_SOURCE |
| 最大AST节点数 | 2500 | SAGEMATH_MCP_SECURITY_MAX_AST_NODES |
| 最大AST嵌套深度 | 75 | SAGEMATH_MCP_SECURITY_MAX_AST_DEPTH |
错误处理: 当代码违反安全策略时,服务器会返回一条明确的错误消息来标识违规行为(例如,“对禁用函数'eval'的调用被阻止”),并记录一条警告。会话仍然有效——后续调用可以成功。
______________________________________________________________________
LLM客户端配置
通过MCP连接的客户端会自动收到以下指导:
- 有意义的会议 ---每一次对话都有一位专注的Sage员工。定义一次符号
(例如。, var('x'), f = ...)并在后续的工具调用中重用它们。
- 使用正确的工具 ---寻找专业助手(
solve_equation,differentiate_expression等等)用于结构化JSON输出。退回到evaluate_sage对于其他任何事情。 - 链计算 ---在一次调用中分配结果,并在下次调用中引用它们。会话中的所有状态都保持不变。
- 超时 ---长时间计算会发出心跳进度事件。通过以下方式调整每次通话超时
timeout参数。 - 安全 ---AST验证器阻止任意导入,
eval/exec,以及文件系统/进程调用。更喜欢Sage图元;如果发生违规,请使用支持的API重写工作流。
客户端特定设置
克劳德桌面 ---添加到 claude_desktop_config.json:
{
"mcpServers": {
"sagemath": {
"command": "uv",
"args": ["run", "sagemath-mcp"]
}
}
}克劳德代码 ---添加到 .mcp.json 在项目根目录中:
{
"mcpServers": {
"sagemath": {
"type": "stdio",
"command": "uv",
"args": ["run", "sagemath-mcp"]
}
}
}Codex CLI:
codex mcp add sagemath --command uv --args "run" "sagemath-mcp"Gemini CLI:
gemini mcp add sagemath --transport stdio --command uv --arg run --arg sagemath-mcp对于HTTP传输,首先公开端点(sagemath-mcp --transport streamable-http --host 0.0.0.0 --port 8314)并将客户指向 http://HOST:8314/mcp.
______________________________________________________________________
部署
stdio(默认)
uv run sagemath-mcp最适合本地LLM客户端(Claude Desktop、Claude Code、Codex CLI)。客户端将服务器作为子进程生成,并通过stdin/stdout进行通信。
HTTP/可流式传输HTTP
uv run sagemath-mcp --transport streamable-http --host 127.0.0.1 --port 8314最适合远程客户端、基于浏览器的工具或共享环境。支持流式响应和取消。
Docker Compose
docker compose up --build暴露 http://127.0.0.1:8314/mcp.以非root身份运行 sage 用户(UID/GID 1000)。compose文件将存储库装载到 /workspace 并接受所有环境变量的覆盖 SAGEMATH_MCP_* 设置。
Kubernetes(Helm)
helm install sagemath charts/sagemath-mcp \
--set image.repository=ghcr.io/xbp-europe/sagemath-mcp \
--set image.tag=latest关键值: service.port, env (环境覆盖图), args (CLI参数), ingress.*。该图表强制非根执行(runAsUser/runAsGroup 1000).审查 values.yaml 用于全套可配置旋钮。发布工作流通过以下方式验证图表 helm lint 和 helm template 在出版之前。
______________________________________________________________________
配置参考
所有配置都是通过环境变量完成的。不需要配置文件。
运行时设置
| 变量 | 描述 | 默认值 |
|---|---|---|
SAGEMATH_MCP_SAGE_BINARY | 通往 sage 可执行。 | sage |
SAGEMATH_MCP_STARTUP | Sage代码在会话引导期间执行。 | from sage.all import * |
SAGEMATH_MCP_IDLE_TTL | 会话被删除前的几秒钟不活动。 | 900 |
SAGEMATH_MCP_EVAL_TIMEOUT | 每次评估超时(秒)。 | 30 |
SAGEMATH_MCP_MAX_STDOUT | 最大字符数 stdout 每次通话都会返回。 | 100000 |
SAGEMATH_MCP_SHUTDOWN_GRACE | 被困工人被解雇前的宽限期。 | 2 |
SAGEMATH_MCP_FORCE_PYTHON_WORKER | 使用纯Python worker(有助于测试/CI)。 | false |
SAGEMATH_MCP_PURE_PYTHON | 当设置为 1,加载math stdlib而不是Sage模块。 | 未设置 |
安全设置
| 变量 | 描述 | 默认值 |
|---|---|---|
SAGEMATH_MCP_SECURITY_ENABLED | 启用/禁用基于AST的代码验证。 | true |
SAGEMATH_MCP_SECURITY_MAX_SOURCE | 最大源长度(字符)。 | 8000 |
SAGEMATH_MCP_SECURITY_MAX_AST_NODES | 允许的最大AST节点数。 | 2500 |
SAGEMATH_MCP_SECURITY_MAX_AST_DEPTH | 允许的最大AST深度。 | 75 |
SAGEMATH_MCP_SECURITY_ALLOW_IMPORTS | 许可证 import 设置为时的语句 true. | false |
SAGEMATH_MCP_SECURITY_FORBID_GLOBAL | 阻止 global 声明当 true. | true |
SAGEMATH_MCP_SECURITY_FORBID_NONLOCAL | 阻止 nonlocal 声明当 true. | true |
SAGEMATH_MCP_SECURITY_LOG_VIOLATIONS | 代码被阻止时发出警告。 | true |
SAGEMATH_MCP_SECURITY_ALLOWED_IMPORTS | 逗号分隔的可导入模块列表。 | math,cmath,statistics,base64,io,sage,sage.all |
SAGEMATH_MCP_SECURITY_ALLOWED_IMPORT_PREFIXES | 逗号分隔的前缀被视为安全的命名空间。 | sage. |
______________________________________________________________________
CLI 参考
usage: sagemath-mcp [--transport {stdio,http,streamable-http,sse}]
[--host HOST] [--port PORT] [--path PATH]
[--log-level LOG_LEVEL]| 参数 | 描述 | 默认值 |
|---|---|---|
--transport | 传输协议: stdio, http, streamable-http,或 sse. | stdio |
--host | 为HTTP传输绑定地址。 | 127.0.0.1 |
--port | HTTP传输的侦听端口。 | 8314 |
--path | 自定义HTTP路径(例如。, /mcp)for streamable-http 或 sse 运输。 | 汽车 |
--log-level | Python日志级别(DEBUG, INFO, WARNING, ERROR). | INFO |
# Default: stdio transport for Claude Desktop / Codex CLI
sagemath-mcp
# HTTP transport for browser-based or remote clients
sagemath-mcp --transport streamable-http --host 0.0.0.0 --port 8314
# Debug logging
sagemath-mcp --log-level DEBUG
# With uv
uv run sagemath-mcp --transport streamable-http --host 127.0.0.1 --port 8314______________________________________________________________________
发展
先决条件
- Python 3.12+ 紫外线 安装
- Docker(可选,用于集成测试和Sage容器)
- SageMath(可选,用于没有Docker的本地开发)
命令
uv pip install -e .[dev] # Install with dev extras
make lint # ruff check (ruff 0.15+)
make test # pytest (pure Python, no Sage needed)
make integration-test # pytest inside Sage Docker container
make build # sdist + wheel via scripts/build_release.py
make cli-integration # Run CLI integration tests (Claude + Gemini)
make sage-container # Bootstrap the Sage Docker container运行测试
如果没有本地SageMath安装,您仍然可以运行所有242个单元测试——该测试套件用轻量级Python解释器替换Sage worker来验证会话管道。代码覆盖率为 99% 跨所有核心模块。
# Run all unit tests
uv run pytest
# Run a single test
uv run pytest tests/test_server.py -k "test_solve_equation"
# Run with coverage
uv run pytest --cov=sagemath_mcp --cov-report=term-missing代码检查
Ruff,行长100,目标Python 3.12。规则:E、F、W、B、UP、ASYNC、RUF、I(进口分拣)。跑 make lint 在承诺之前。
Git挂钩
克隆后配置Git挂钩:
git config core.hooksPath .githooks预推钩自动旋转。
______________________________________________________________________
CLI集成测试
该项目包括一个全面的端到端测试套件,通过真实的LLM CLI调用验证MCP服务器。位于 tests/cli_integration/.
概述
- 43个测试用例 跨越9个数学领域
- 测试两者 克劳德代码 (
claude --print)以及 双子星命令行工具 (gemini -p) - 执行过程中的实时进度报告
- 多层验证:子字符串匹配、数字提取、非确定性输出的软失败
- JSON结果导出用于历史跟踪
跑步
# Run against both CLIs
make cli-integration
# Or use the standalone runner with options
python -m tests.cli_integration.run_cli_tests --cli claude --domain calculus
python -m tests.cli_integration.run_cli_tests --cli both --parallel
python -m tests.cli_integration.run_cli_tests --cli gemini --domain algebra,number_theory域名覆盖范围
| 领域 | 案例 | 测试工具 |
|---|---|---|
| 微积分 | 10 | differentiate_expression, integrate_expression, limit_expression, series_expansion |
| 代数 | 11 | solve_equation, simplify_expression, expand_expression, factor_expression, calculate_expression |
| 线性代数 | 5 | matrix_multiply, matrix_operation |
| ODE | 2 | solve_ode |
| 数论 | 6 | number_theory_operation |
| 统计 | 2 | statistics_summary |
| 绘图 | 2 | plot_expression |
| 常规 | 3 | evaluate_sage |
| 会话 | 2 | reset_sage_session, cancel_sage_session |
______________________________________________________________________
项目布局
sagemath-mcp/
├── pyproject.toml # Project metadata, dependencies, tool config
├── README.md # This file
├── USAGE.md # Detailed usage guide
├── CLAUDE.md # Claude Code project instructions
├── Dockerfile # Production container (SageMath + MCP server)
├── docker-compose.yml # Local development stack
├── Makefile # Common commands (test, lint, build, etc.)
├── src/sagemath_mcp/
│ ├── server.py # FastMCP 3.x app: 33 tools, 3 resources, /health, middleware
│ ├── session.py # Sage worker lifecycle, session management, idle culling
│ ├── _sage_worker.py # Subprocess worker: code execution, AST validation, LaTeX
│ ├── security.py # AST validator, SecurityPolicy, configurable allowlists
│ ├── config.py # SageSettings from environment variables
│ ├── models.py # Pydantic models (EvaluateResult, SessionSnapshot, etc.)
│ ├── monitoring.py # Thread-safe evaluation metrics (EvaluationMetrics)
│ └── py.typed # PEP 561 type hint marker
├── tests/
│ ├── conftest.py # Shared FakeContext fixture
│ ├── test_server.py # Tool & resource unit tests
│ ├── test_session.py # Session lifecycle, timeout, reset, cancel
│ ├── test_security.py # AST validation, policy configuration
│ ├── test_config.py # Environment variable parsing
│ ├── test_sage_worker.py # Worker protocol, LaTeX, startup errors
│ ├── test_integration.py # Real Sage: monitoring, timeout, cancellation
│ ├── test_use_cases.py # End-to-end Sage workflows
│ └── cli_integration/ # LLM CLI end-to-end tests (43 cases)
│ ├── run_cli_tests.py # Standalone runner with rich reporting
│ ├── test_cases.py # All test case definitions
│ ├── validate.py # Multi-tier output validation
│ ├── runner.py # Claude/Gemini CLI invocation
│ ├── cli_config.py # MCP server setup/teardown for CLIs
│ ├── test_claude.py # Pytest wrapper for Claude
│ └── test_gemini.py # Pytest wrapper for Gemini
├── charts/sagemath-mcp/ # Helm chart for Kubernetes
├── scripts/ # Build, release, CI scripts
├── docs/reference_md/ # SageMath reference docs (Markdown)
└── .github/workflows/
├── ci.yml # 6 parallel jobs: lint, test (3.12+3.13), security
│ # (pip-audit), helm, integration, smoke
├── release.yml # Multi-Python test, build, GHCR push, PyPI publish
└── version-bump.yml # Manual version bump + tag workflow______________________________________________________________________
技术栈
| 组件 | 版本 | 目的 |
|---|---|---|
| FastMCP | 3.2+ | MCP服务器框架(工具、资源、中间件) |
| MCP-SDK | 1.27+ | 模型上下文协议实现 |
| 派丹蒂克 | 2.12+ | 所有型号的数据验证和序列化 |
| 安尼欧 | 4.13+ | 异步运行时抽象 |
| SageMath 的 | 10.x | 数学引擎(子进程工作者) |
| 拉夫 | 0.15+ | 抽绒和进口分拣 |
| pytest | 9.0+ | 测试框架 |
| pytest异步 | 1.3+ | 异步测试支持 |
| 新冠肺炎 | 7.0+ | 覆盖率报告(99%的分支覆盖率,242次测试) |
| pip审计 | 2.9+ | 依赖漏洞扫描 |
| 孵化 | 1.29+ | 构建后端 |
| 码头工人 | --- | 容器化和CI集成测试 |
| 舵 | 3.15+ | Kubernetes部署 |
| --- | CI/CD(兼容Node.js 24) | |
| 共同签署 | --- | 容器图像签名 |
______________________________________________________________________
更新日志
v0.2.0(2026-04-03)
新的MCP工具(添加了18个工具)
服务器从单一 evaluate_sage 该工具包含33个MCP工具(31个Sage支持,2个基础设施)。每个工具都接受结构化参数,运行AST安全验证器,并返回键入的JSON响应。
微积分(4个工具):
differentiate_expression---任何顺序的符号衍生品。支持所有Sage认可的表达式,包括三角函数、指数函数、对数函数和用户定义函数。这order参数处理高阶导数,无需重复调用。integrate_expression---不定积分和定积分。接受符号边界("-oo","oo","pi/2")对于不适当的积分。返回下游处理的结果是确定的还是不确定的。limit_expression---单边和双边限制。这direction参数("plus"/"minus")能够分别计算左极限和右极限,这对于分析不连续性至关重要。series_expansion---泰勒和劳伦特系列围绕任何一点。这order参数控制项的数量,输出包括Big-O余数项。
代数与简化(5个工具):
solve_equation---单方程组和联立方程组。解析人类可读的方程式字符串(拆分=)因此客户不需要构建Sage语法。支持包括三角根在内的符号解。simplify_expression---应用Sage的simplify()它尝试多种简化策略(三角恒等式、代数规则等),并返回找到的最简单形式。expand_expression---使用Sage扩展产品、权力和身份expand()可用于验证代数恒等式或准备表达式以供进一步操作。factor_expression---同时考虑符号多项式和整数。返回人类可读的因子分解字符串(例如。,"2^2 * 3 * 5"对于整数)。calculate_expression---计算任何表达式,并返回其符号字符串形式和数字浮点值(如果可能)。预先声明变量x, y, z, t为了方便起见。
线性代数(2个工具):
matrix_multiply---在符号环上乘以两个矩阵。接受嵌套列表输入,并使用适当的类型强制返回嵌套列表输出。matrix_operation---执行行列式、逆、特征值、秩、RREF和转置运算。每个操作都返回适当类型的结果(标量、矩阵或列表)。
微分方程(1个工具):
solve_ode---使用Sage解决一阶和高阶ODEdesolve().返回具有任意常数的通解。支持非标准ODE表示法的自定义函数名和变量名。
数论(1个工具):
number_theory_operation---一个工具中的五个操作:is_prime,factor_integer,next_prime,gcd,lcm每个函数都直接映射到相应的Sage函数,并进行适当的整数验证。
统计(1个工具):
statistics_summary---使用Sage在一次调用中计算8个描述性统计数据(平均值、中位数、总体/样本方差、总体/抽样标准偏差、最小值、最大值)mean()和sqrt()为了精确计算。
可视化(1个工具):
plot_expression---渲染2D函数图并返回base64编码的PNG图像。使用Sage的plot()具有可配置的范围界限。这base64和io专门为此工具将导入添加到安全列表中。
会话管理(2个工具):
reset_sage_session---清除所有会话状态(变量、函数、定义),而不终止工作进程。快速操作,可在同一会话内重新启动。cancel_sage_session---终止工作进程并启动一个新进程。当计算卡住时使用。所有的国家都失去了,但一个干净的工人是有保证的。
增强 evaluate_sage
核心评估工具得到了重大改进:
- 特定领域示例 添加到工具描述中,以便LLM知道Sage可以做什么:客户看到的描述中包含了组合学、图论、数论、几何、概率论、群论、多项式环和编码理论示例。
- 启动错误传播 ---如果
from sage.all import *(或自定义启动代码)失败,后续调用返回清除StartupError使用原始的异常消息,而不是令人困惑的NameError. - 结果类型简化 ---删除未使用的
"void"字面意思来自result_type,只留下"expression"和"statement".
CLI集成测试套件
一个新的端到端测试套件通过真实的LLM CLI调用验证MCP服务器:
- 43个测试用例 跨越9个数学领域(微积分、代数、线性代数、ODE、数论、统计学、绘图、通用计算、会话管理)
- 双CLI支持 ---测试克劳德代码(
claude --print)Gemini CLI(gemini -p) - 实时进度报告 ---每个测试在完成时打印状态,并带有颜色编码的通过/失败指示器和经过的时间
- 并行执行 ---
--parallelflag通过以下方式同时运行两个CLIThreadPoolExecutor - 域过滤 ---
--domain calculus,algebra仅运行选定的测试域 - 多层验证 ---首先检查预期的子字符串(不区分大小写),然后从输出中提取数字,然后回退到软失败以获得非确定性答案。检查错误指示器 *之后* 内容匹配,以避免LLM在正确答案中提到“MCP服务器”时出现假阴性。
- JSON结果导出 ---每次运行都会保存带时间戳的JSON结果以进行历史跟踪
- Pytest集成 ---
test_claude.py和test_gemini.py将所有案例包装为参数化的pytest测试,并进行适当的跳过/失败处理
依赖升级
| 包装 | 旧 | 新 | 备注 |
|---|---|---|---|
| FastMCP | 2.13 | 3.2 | 主要版本。 @mcp.tool() / @mcp.resource() 现在直接返回原始函数(否 .fn 包装)。所有测试调用都已迁移。 |
| MCP SDK | 1.20 | 1.27 | 协议改进 |
| pytest | 8.4 | 9.0 | 主要版本 |
| pytest异步 | 1.2 | 1.3 | 细微改进 |
| Ruff | 0.14 | 0.15 | 新的皮棉规则 |
| Pydantic | 2.8+ | 2.12+ | 性能和验证改进 |
| anyio | 4.4+ | 4.13+ | 错误修复和新功能 |
| 阴影 | 1.26+ | 1.29+ | 构建后端改进 |
| 构建 | 1.2+ | 1.4+ | sdist/wheel构建器 |
| 覆盖率 | 7.6+ | 7.13+ | 覆盖率报告 |
基础设施现代化
Python版本:
- Python的最小值从3.11提高到 3.12Python 3.12带来了5-15%的性能改进(PEP 709内联理解,更快
asyncio),所有CI/CD发布工作流现在仅在3.12和3.13上测试。 - Ruff目标更新自
py311到py312.
CI/CD大修:
- 平行工作结构 ---单片CI作业被拆分为6个独立的作业(
lint,test,security,helm,integration,smoke)这是并行运行的。棉绒和测试在约1分钟内完成;集成和烟雾测试只有在通过后才能运行。 - 矩阵测试 ---单元测试现在可以在Python 3.12和3.13上运行(以前只在CI中测试了一个版本;矩阵测试是为发布保留的)。
- 紫外线缓存 ---
enable-cache: true添加到全部astral-sh/setup-uv步骤,消除跨运行的冗余依赖下载。 - 覆盖率报告 ---pytest运行时使用
--cov并上传coverage.xml作为构建工件。 - 依赖安全扫描 新
pip-audit作业检查所有已安装包中的已知漏洞。 - GitHub操作Node.js 24 ---所有操作都受到影响:
checkout@v5,setup-uv@v7,setup-python@v6,download-artifact@v6,build-push-action@v6,upload-artifact@v4.
Docker:
- 从固定的基础图像
sagemath/sagemath:latest到sagemath/sagemath:10.5用于可重复构建。这latest标签是不确定的,可能会在SageMath发布新版本时中断构建。
Kubernetes(Helm chart):
- 添加 活性探针 (HTTP端口上的TCP套接字,30秒初始延迟,15秒周期,3个故障阈值)---如果服务器没有响应,则重新启动pod。
- 添加 准备就绪探测器 (TCP套接字,10秒初始延迟,10秒周期)---在启动或瞬态故障期间从服务端点删除pod。
- 添加 启动探头 (TCP套接字,5秒初始延迟,5秒周期,12次故障=60秒预算)---为SageMath提供初始化时间(
from sage.all import *可能需要10-20秒)而不会触发活性失败。 - 所有探头参数均可通过以下方式配置
values.yaml.
项目元数据:
pyproject.toml作者已从占位符更新为“XBP Europe”- 添加PyPI分类器:开发状态、目标受众、Python版本、许可证、主题
- 添加了项目网址:主页、存储库、问题、变更日志
测试覆盖率
测试套件从136扩展到 242个单元测试 分支机构覆盖率为 99% 跨所有核心模块。新测试包括:
- 会话错误路径:没有Python解释器,SAGE_VENV/PYTHONPATH环境处理,重置失败(worker终止,
ok=False),_terminate_worker在运行过程中,cull_idle没有过时的会话 - 服务器错误分支:
evaluate_sage没有上下文/没有会话id,SecurityViolation错误类型、非安全错误类型,SageProcessError和__cause__ - 安全:
_format_violation只有空白行代码,log_violations=False分支,调试日志成功验证
剩下的1%是防御性的 if ctx is not None 在实践中始终正确的分支,以及需要真正安装Sage的Sage二进制路径。
错误修复
- MCP资源序列化 ---
monitoring_resource和session_resource现在通过以下方式返回JSON字符串model_dump_json()而不是原始的Pydantic模型对象。FastMCP 3.x需要资源才能返回str或ResourceContent而不是模型。CI指标验证脚本和所有测试都已相应更新。 - ASYNC240棉绒固定器 ---移动
Path(__file__).resolve()从异步函数内部到模块级别_PROJECT_ROOT常量,以避免异步上下文中的同步文件系统调用。 - CLI集成验证器 ---现在对错误指示器检查(如“我不能”、“MCP服务器”等短语)进行评估 *之后* 预期的子字符串匹配,防止在正确答案提到MCP服务器时出现假阴性。
- 破碎的
--CLI命令中的分隔符 ---之前显示的所有文档uv run sagemath-mcp -- --transport streamable-http这会失败,因为argparse处理--作为一种立场论证。修复了README、安装、CLAUDE、使用、分发和监控文档中的问题。 - 许可证文件不匹配 ---LICENSE文件包含Apache 2.0文本,但
pyproject.toml麻省理工学院宣布。替换为正确的MIT许可证文本。 - 版本同步 ---
__init__.py回退版本(0.1.2)Helm chart版本/appVersion(0.1.0)已更新以匹配pyproject.toml(0.2.0). - 缺失
pytest-cov依赖 ---CI覆盖步骤失败,因为pytest-cov不在开发依赖项中。旁边添加pip-audit. - 抑制
PytestUnraisableExceptionWarning---外观异步子进程传输终结器警告不再出现在测试输出中。
文档
- 完成README重写 ---添加了目录、架构图、技术栈表、变更日志、CLI集成测试部分,以及每个工具参数和返回类型的详细示例。
- 用法.md 更新了新的工具工作流和部署选项。
- CLAUDE.md 为Claude Code项目说明添加。
- 安装.md 将Python版本从3.11更新到3.12。
v0.1.2(2025-11-02)
首次公开发布。 服务器提供了一个MCP工具(evaluate_sage)在持久会话中执行任意SageMath代码。初始版本中的关键功能:
evaluate_sage工具 ---使用LaTeX输出、stdout捕获和可配置的每次调用超时执行任何SageMath代码。变量和函数在同一MCP会话内的调用之间持久存在。- 会话隔离 ---每个MCP客户端都有一个专门的Sage worker子流程。一个会话中的崩溃或超时不会影响其他会话。
- 基于AST的安全沙箱 ---每个代码片段在执行前都会经过验证,从而阻止
eval/exec、文件系统操作、进程生成和未经授权的导入。可通过环境变量进行配置。 - 进展心跳 ---长时间运行的计算会发出周期性的进度事件(约1.5秒),因此客户端可以显示活动指示器。
- 多个传输 ---stdio(用于克劳德桌面)、HTTP、流式HTTP和SSE。
- Docker部署 ---Dockerfile、Docker Compose和非根执行Kubernetes的Helm chart(UID/GID 1000)。
- CI/CD管道 ---GitHub Actions提供lint、单元测试、集成测试(Docker中的真正Sage)、Docker Compose冒烟测试、Helm验证、签名GHCR镜像发布和PyPI发布。
- 监控资源 ---用于会话快照、聚合指标和SageMath文档链接的MCP资源。
______________________________________________________________________
路线图
看 ROADMAP.md 对于完整的优先计划。亮点:
第一阶段——高价值工具:
symbolic_sum/symbolic_product---符号求和与乘积combinatorics_operation---二项式、排列、组合、分割、加泰罗尼亚语、斐波那契plot3d_expression---两个变量函数的3D曲面图
第2阶段——中等价值工具:
distribution_operation---概率分布(PDF、CDF、抽样、分位数)find_root---数字根查找(补充符号solve_equation)- 多表达式绘图——在一个绘图中叠加多个函数
vector_calculus_operation---梯度、散度、旋度、拉普拉斯算子
第3阶段——强化:
- 更富有
evaluate_sage示例(傅里叶/拉普拉斯变换、模运算、递归) - 超文本传输协议
/healthHelm探针的端点 - 流式部分输出用于长时间计算
- 磁盘支持的会话持久性
需求
- Python 3.12+
- 本地SageMath安装可在
PATH(使用Sage 10.x测试)或Docker。 - FastMCP兼容的MCP客户端(例如Claude Desktop、Claude Code、Codex CLI、Gemini CLI)。
贡献
我们欢迎问题和拉取请求!回顾 行为准则 和 贡献指南 在打开PR之前。对于漏洞披露, 按照中的步骤进行操作 安全.md所有权违约定义见 .
许可证
麻省理工学院
