SageMath MCP

SageMath en entorno aislado para agentes: 40 herramientas para matemáticas exactas y simbólicas con sesión persistente

Documentación

Servidor SageMath MCP

CI CodeQL Dependency audit Fuzz Release PyPI conda-forge GHCR License Python MCP FastMCP SageMath Ruff Typed Coverage Sage doctests Downloads MCP Registry Glama Signed Provenance PyPI attestations OpenSSF Scorecard DOI Dependabot Last commit

Un servidor de Model Context Protocol que brinda a un LLM un subconjunto matemático aislado de SageMath: cálculo simbólico, teoría de números, álgebra lineal, EDOs, gráficos, combinatoria, grafos, grupos, curvas elípticas y más. Cada sesión MCP obtiene un proceso de trabajo dedicado de Sage, por lo que las variables, funciones y suposiciones persisten entre llamadas a herramientas. Incluye 40 herramientas MCP, una de las cuales — verify_claim — reverifica un resultado declarado mediante una escalera de pruebas y responde proved / refuted / supported / undecided con su evidencia.

El código del llamador está denegado por defecto: se puede acceder a toda la amplitud de las matemáticas de Sage, pero las importaciones, las interfaces CAS externas y las primitivas de archivo / visualización / persistencia no están disponibles. La política acepta el 98.9% de los 438,124 ejemplos de doctest documentados del propio SageMath (4,259 rechazos dentro del alcance, cada uno atribuido a una regla nombrada; 99.0% de 433,289 en el runtime de passagemath) mientras rechaza el resto, medido en cada ejecución de CI (ver Seguridad).

Manual completo: USAGE.md — los parámetros y ejemplos de cada herramienta, cómo se interpreta el código y el modelo de seguridad en profundidad.

Instalación y ejecución

Recomendado — la imagen de contenedor (SageMath incluido):

docker run --rm \
  --read-only --tmpfs /tmp:rw,size=512m --tmpfs /home/sage/.sage:rw,size=256m \
  --cap-drop ALL --security-opt no-new-privileges --pids-limit 256 --memory 4g \
  -p 127.0.0.1:8314:8314 \
  ghcr.io/xbp-europe/sagemath-mcp:latest

Esas banderas son el endurecimiento que el servidor espera; el puerto se publica en loopback deliberadamente — el servidor ejecuta código y no autentica a nadie. docker compose up --build aplica el mismo endurecimiento desde un archivo revisado. Las imágenes publicadas están firmadas con Cosign y llevan procedencia SLSA y un SBOM SPDX como atestaciones de registro; los archivos de PyPI llevan atestaciones PEP 740. DISTRIBUTION.md muestra cómo verificar cada uno.

Desde PyPI (trae tu propio runtime de Sage):

pip install sagemath-mcp
sagemath-mcp                                             # stdio (default)
sagemath-mcp --transport streamable-http --port 8314    # HTTP on 127.0.0.1

Esto requiere un SageMath funcional en el host — ya sea sage en tu PATH (o en el mismo entorno que el servidor) o la imagen Docker sagemath/sagemath.

Desde conda-forge (Linux y macOS, junto al Sage de conda-forge):

conda install -c conda-forge "sagemath-mcp>=0.9.4" sage
sagemath-mcp

El piso de versión importa: las versiones anteriores no pueden iniciar un trabajador en el sage de conda-forge, y sin él el solucionador podría elegir uno. Ese sage es 10.9, una versión detrás del 10.10 del que se generan los artefactos de seguridad, por lo que los nombres que agregó 10.10 no están disponibles y nada fuera de la lista de permitidos se admite.

Un runtime de Sage sin la imagen de 3 GB (passagemath, opcional):

pip install "sagemath-mcp[passagemath]"    # ~1 GB, no Docker, no local Sage build
sagemath-mcp

Un fork modularizado e instalable con pip de SageMath. from sage.all import * y el trabajador se ejecutan sin modificaciones; el servidor detecta el runtime al importar y carga los artefactos de seguridad correspondientes, por lo que la política de denegación por defecto es equivalente en ambos. Está fijado exactamente (passagemath-standard==10.8.12) y se ejercita con su propio carril de CI — la suite completa más el barrido del corpus de doctests contra el pin — por lo que un cambio de pin se verifica de extremo a extremo antes de publicarse (docs/passagemath_evaluation.md). Es el runtime opcional; la imagen monolítica sigue siendo la principal, y para uso no confiable o multiinquilino ejecuta el contenedor independientemente del runtime — una instalación con pip tiene los privilegios de tu usuario, el contenedor agrega aislamiento a nivel de SO.

En arm64 (silicio de Apple, Graviton): la imagen de passagemath. La imagen monolítica anterior se publica solo para linux/amd64, por lo que en arm64 se ejecuta bajo emulación. El mismo servidor en el runtime de passagemath se distribuye como una imagen nativa de linux/amd64 + linux/arm64, con las mismas banderas de endurecimiento, UID y política de seguridad:

docker run --rm \
  --read-only --tmpfs /tmp:rw,size=512m --tmpfs /home/sage/.sage:rw,size=256m \
  --cap-drop ALL --security-opt no-new-privileges --pids-limit 256 --memory 4g \
  -p 127.0.0.1:8314:8314 \
  ghcr.io/xbp-europe/sagemath-mcp:latest-passagemath

Cada etiqueta de versión tiene un gemelo -passagemath (vX.Y.Z-passagemath), cada arquitectura se prueba con humo de forma nativa antes de publicarse, y el índice está firmado y atestiguado como la imagen principal. Es la imagen opcional en amd64, donde la monolítica sigue siendo la principal.

Un clic en un host MCP de escritorio (Claude Desktop y similares): descarga sagemath-mcp-<version>.mcpb de la última versión y ábrela. El paquete pesa un par de kilobytes; tu host instala el servidor y un runtime de Sage con uv en el primer lanzamiento, lo que es aproximadamente una descarga de 1 GB una sola vez. macOS y Linux — Windows nativo está excluido porque el soporte de Windows de passagemath es parcial. Un paquete es una instalación local con tus propios privilegios; para uso no confiable o multiinquilino ejecuta el contenedor en su lugar.

Instalación desde fuente, Docker Compose y el gráfico Helm de Kubernetes están en USAGE.md.

Conecta un cliente MCP

Un comando o un clic cada uno. Cada ruta a continuación instala un runtime de Sage junto al servidor, por lo que no hay nada más que configurar.

Install in VS Code Install in Cursor

Claude Desktop — descarga sagemath-mcp-<version>.mcpb de la última versión y ábrela. Un clic, sin archivo de configuración.

Claude Code — como un plugin del marketplace de este repositorio, dentro de una sesión:

/plugin install sagemath-mcp --marketplace XBP-Europe/sagemath-mcp

o como un servidor MCP simple:

claude mcp add sagemath -- uvx --from "sagemath-mcp[passagemath]" sagemath-mcp

Gemini CLI — el repositorio es en sí mismo una extensión:

gemini extensions install https://github.com/XBP-Europe/sagemath-mcp

Codex CLI

codex mcp add sagemath -- uvx --from "sagemath-mcp[passagemath]" sagemath-mcp

Luego pide algunas matemáticas — los ejemplos a continuación son un buen comienzo.

Tres cosas que vale la pena saber. Estas necesitan uv en tu PATH, y el primer lanzamiento descarga aproximadamente 1 GB de ruedas de Sage, que se almacenan en caché después. ¿Ya tienes sage? Elimina [passagemath] de la especificación y usará la tuya. ¿Instalado desde conda-forge? Registra el ejecutable del propio entorno, por ejemplo claude mcp add sagemath -- ~/miniforge3/envs/sage/bin/sagemath-mcp; encuentra el sage a su lado sin que el entorno esté activado. Y una instalación de cualquiera de estos se ejecuta con tus propios privilegios; para uso no confiable o compartido, ejecuta el contenedor y apunta el cliente hacia él.

Fijar una versión, transporte HTTP y la referencia completa del cliente están en USAGE.md.

Pruébalo

Indicaciones que un cliente puede ejecutar una vez que el servidor está conectado:

  • Oscilador armónico amortiguado — "Resuelve x'' + 2·x' + 5·x = 0 con x(0)=1, x'(0)=0, luego verifica que la solución satisface la EDO."
  • Relatividad general — "En el semiplano superior hiperbólico con la métrica (dx² + dy²)/y², calcula el escalar de Ricci y confirma que es una curvatura negativa constante."
  • Sistema acoplado de dos tanques — "Resuelve el sistema de EDOs lineales para dos tanques de mezcla, luego toma el límite a largo plazo de cada concentración."

Cada uno construye un objeto una vez y lo explora a través de llamadas — el caso para evaluate_sage y su sesión persistente.

Las 40 herramientas

Las herramientas matemáticas usan SageMath como backend; los parámetros completos y ejemplos están en USAGE.md.

CategoríaHerramientas
Ejecución principalevaluate_sage, evaluate_sage_streaming
Verificaciónverify_claim
Cálculodifferentiate_expression, integrate_expression, limit_expression, series_expansion
Álgebrasolve_equation, simplify_expression, expand_expression, factor_expression, calculate_expression, symbolic_sum
Álgebra linealmatrix_multiply, matrix_operation
Ecuaciones diferencialessolve_ode
Teoría de númerosnumber_theory_operation
Combinatoriacombinatorics_operation
Teoría de grafos / gruposgraph_operation, group_operation
Curvas elípticas / codificaciónelliptic_curve_operation, coding_theory_operation
Polinomios / booleanos / geometríapolynomial_ring_operation, boolean_algebra_operation, geometry_operation
Estadística / probabilidadstatistics_summary, distribution_operation
Visualizaciónplot_expression, plot3d_expression, plot_multi_expression
Métodos numéricos / cálculo vectorialfind_root, vector_calculus_operation
Control de sesiónreset_sage_session, interrupt_sage_session, cancel_sage_session
Espacios de trabajo nombradosstart_sage_session, list_sage_sessions, stop_sage_session
Diagnósticoscheck_sage_health, lookup_sage_doc

Más los endpoints HTTP /health y /ready y 3 recursos MCP (instantáneas de sesión, métricas de monitoreo, enlaces de documentación). Prefiere interrupt_sage_session sobre cancel_sage_session — detiene un cálculo mientras conserva las variables de la sesión.

Cómo funciona

┌─────────────────────────────────────────────────────────────┐
│  MCP Client (Claude Desktop, Gemini CLI, Codex CLI, ...)    │
└───────────────────────────┬─────────────────────────────────┘
                            │  MCP protocol (stdio or HTTP)
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  app.py + tools/ --- FastMCP 4.x                            │
│  ┌─────────────┐  ┌──────────────┐                          │
│  │ 40 MCP Tools│  │ 3 Resources  │   manager.py routes each │
│  └─────────────┘  └──────────────┘   client to its worker   │
└───────────────────────────┬─────────────────────────────────┘
                            ▼   one subprocess per session
┌─────────────────────────────────────────────────────────────┐
│  _sage_worker.py --- allowlist.py + security.py             │
│  AST validation, then exec() in a persistent namespace      │
│  (vars, functions and classes survive across calls)         │
└─────────────────────────────────────────────────────────────┘

Flujo de solicitud: cliente MCP → una herramienta en tools/ → SageSessionManager.get() → SageSession.evaluate() → solicitud JSON al subproceso _sage_worker.py → validación AST → exec() en el espacio de nombres persistente → respuesta JSON.

  • Aislamiento de procesos — cada sesión ejecuta Sage en su propio subproceso; un bloqueo o tiempo de espera en uno no puede afectar a otro.
  • Sesiones con estado — las variables, funciones y suposiciones persisten entre llamadas, lo que permite flujos de trabajo de varios pasos.
  • Denegación por defecto — un nombre se rechaza a menos que la lista de permitidos generada lo ofrezca o el propio código del llamador lo haya vinculado. Un helper que una futura versión de SageMath agregue se rechaza hasta que alguien lo revise, en lugar de ser accesible el día que llegue.

Seguridad

El validador AST es defensa en profundidad contra accidentes y mal uso casual — no es un límite contra código adversarial determinado. El contenedor es el límite de seguridad. El servidor no tiene autenticación, por lo que cada valor predeterminado es loopback: --host por defecto es 127.0.0.1, el transporte predeterminado es stdio, y Compose / Helm mantienen el endpoint fuera de la red. Pon algo que autentique delante de él antes de exponerlo.

Lo que la política aplica: una lista de permitidos (el código del llamador solo puede leer un nombre que el servidor ofrezca o que el propio llamador haya vinculado); sin importaciones por defecto; eval / exec / compile y la evaluación de cadenas en runtime bloqueadas; acceso dunder bloqueado; las interfaces CAS externas y cada primitiva de archivo / red / persistencia eliminadas del espacio de nombres, por procedencia en lugar de por nombre; y el árbol de paquetes sage cerrado al código del llamador, por lo que un helper se alcanza por su propio nombre o no se alcanza en absoluto. El contenedor agrega una raíz de solo lectura, capacidades eliminadas, no-new-privileges, el perfil seccomp predeterminado y límites de memoria. Compose agrega un límite de bifurcaciones (PID); Kubernetes no tiene un equivalente por pod en la especificación del pod, por lo que en el gráfico eso es el podPidsLimit del nodo en lugar de algo que el gráfico pueda establecer.

Modelo de amenazas completo y las tablas completas de bloqueados / permitidos: SECURITY.md y USAGE.md § Modelo de seguridad.

Documentación y más

Requisitos

Python 3.12+ y un runtime de SageMath (la imagen del contenedor incluye SageMath 10.10; de lo contrario, sage en PATH, o el extra [passagemath]). Construido sobre FastMCP 4.x.

Contribuciones

Las incidencias y las solicitudes de extracción son bienvenidas — consulta CONTRIBUTING.md. Ejecuta make lint, make typecheck y make test antes de hacer push (git config core.hooksPath .githooks conecta la verificación previa al push). Hoja de ruta y trabajo abierto: ROADMAP.md. Las preguntas van a GitHub Discussions; SUPPORT.md indica qué esperar.

Cómo citar

Si este servidor forma parte de un trabajo publicado, cítalo mediante CITATION.cff — GitHub lo muestra como Cite this repository en la barra lateral, con APA y BibTeX. Cita también el propio SageMath; es quien hace las matemáticas.

Licencia

MIT — consulta LICENSE. SageMath en sí es GPL-2.0-or-later y se usa como un runtime separado; no se redistribuye ningún código fuente de SageMath en este repositorio.