A Model Context Protocol server that exposes a
numerical-methods core as tools an LLM agent can call directly from a chat
(VS Code, Zed, Claude, opencode, etc.). It is built on top of the
numerical-methods engine of the academic project modeladoYsimulacion-web
(UADE); the math core is vendored into this repository so the server is
fully self-contained.
claude mcp add mathmethods-mcp -- uvx mathmethods-mcpAny MCP client registers the server with the same one-liner command —
uvx mathmethods-mcp (a Python package that needs no cloning, venv or paths):
{ "command": "uvx", "args": ["mathmethods"] }Run from a checkout instead (for development)
git clone https://github.com/agmonetti/mathmethods-mcp.git
cd mathmethods
uv sync --extra dev
uv run mathmethodsEvery client config below also works with
uv run --frozen --project <checkout> python <checkout>/server.py in place of
uvx mathmethods-mcp.
| Tool | What it does |
|---|---|
root_bisection |
Bisection on [a, b] (requires a sign change) |
root_newton_raphson |
Newton–Raphson with numeric derivative |
root_punto_fijo |
Fixed-point iteration x = g(x) |
root_aitken |
Aitken Δ² acceleration of fixed point |
root_comparar |
All four methods compared on the same problem |
| Tool | What it does |
|---|---|
integral_rectangulo |
Composite midpoint rule |
integral_trapecio |
Composite trapezoidal rule |
integral_simpson13 |
Composite Simpson 1/3 (n even) |
integral_simpson38 |
Composite Simpson 3/8 (n multiple of 3) |
integral_comparar |
All four rules compared on the same integral |
| Tool | What it does |
|---|---|
finite_differences |
Forward/backward/central 1st & 2nd derivatives |
| Tool | What it does |
|---|---|
ode_rk4 |
Runge–Kutta 4 (4th order) |
ode_heun |
Heun predictor–corrector (2nd order) |
ode_euler |
Explicit Euler (1st order) |
interpolation_lagrange |
Lagrange interpolating polynomial |
| Tool | What it does |
|---|---|
mc_hit_or_miss_1d |
Hit-or-miss estimator (correct for sign-changing f) |
mc_valor_promedio_1d |
Mean-value estimate of ∫ₐᵇ f(x) dx |
mc_valor_promedio_2d |
Mean-value estimate of a double integral |
mc_valor_promedio_3d |
Mean-value estimate of a triple integral |
mc_estadistico_1d |
M×N replicated experiment with statistical analysis |
mc_convergencia_1d |
Running average showing the estimate converging |
| Tool | What it does |
|---|---|
dynamic_1d_solve |
Equilibria, stability, phase portrait and time series |
dynamic_1d_equilibria |
Find and classify the equilibria of x' = f(x) |
dynamic_1d_bifurcation |
Equilibria vs parameter (bifurcation diagram) |
dynamic_2d_linear_solve |
Linear X' = A·X + B: classification, eigenvalues, analytic solution |
dynamic_2d_nonlinear_solve |
Nonlinear x' = f(x,y): equilibria, Jacobian, nullclines |
dynamic_2d_conservative_solve |
Divergence-free check, Hamiltonian/energy, closed orbits |
dynamic_2d_lanchester_solve |
Lanchester combat model with analytic time-to-annihilation |
dynamic_2d_nonhomogeneous_solve |
Non-homogeneous X' = A·X + B(t) with time-varying forcing |
Math expressions use Python/SymPy syntax: x**2, sin(x), exp(x),
sqrt(x), log(x). Common shorthand is accepted too: e^x, sen(x), ln(x)
and the caret ^ for powers. The Greek combat parameters of Lanchester use the
Unicode symbols α β γ ε μ δ.
modelo-mat-mcp/
├── server.py # FastMCP app + all tools
├── mathmethods/
│ ├── compiler.py # hardened expression validation (whitelist, caps)
│ ├── server.py # FastMCP app and tool definitions
│ └── core/ # vendored math core (from modeladoYsimulacion-web)
│ ├── root_finding.py ├── integration.py
│ ├── ode.py ├── interpolation.py
│ ├── differentiation.py├── monte_carlo.py
│ ├── dynamic_1d.py ├── dynamic_2d_linear.py
│ ├── dynamic_2d_non_homogeneous.py ├── dynamic_2d_nonlinear.py
│ ├── dynamic_2d_conservative.py ├── dynamic_2d_lanchester.py
│ └── utils.py
├── tests/ # test_tools.py + test_dynamic_tools.py
├── mcp.example.json # server registration template (copy to .vscode/mcp.json)
├── requirements.txt
└── pyproject.toml
cd modelo-mat-mcp
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txtAfter creating the venv, verify it is isolated (
venv/bin/python -c "import sys; print(sys.prefix)"should print the venv path, not/usr). If your system Python produces a broken venv, trypython3 -m venv --copies venv.
Local (STDIO) — default transport, used by VS Code / Claude Desktop:
uv run python server.pyRemote (Streamable HTTP) — the server prints a URL such as http://127.0.0.1:8000/mcp:
MCP_TRANSPORT=streamable-http uv run python server.pyThe transport can also be chosen with the MCP_TRANSPORT environment variable
(stdio | streamable-http | sse), and the HTTP host/port with
MCP_HTTP_HOST / MCP_HTTP_PORT (defaults 127.0.0.1:8000).
Every client registers the same command, uvx mathmethods-mcp (no paths, no
venv). If the server is not published yet or you work from a checkout, use
uv run --frozen --project <PROJ> python <PROJ>/server.py instead.
Remote (Streamable HTTP) — optional; start it once in a terminal, then
point the client at http://127.0.0.1:8000/mcp:
MCP_TRANSPORT=streamable-http uvx mathmethods-mcpVS Code
Create .vscode/mcp.json (git-ignored) — or copy mcp.example.json:
{
"servers": {
"modelo-mat-stdio": {
"type": "stdio",
"command": "uvx",
"args": ["mathmethods"]
},
"modelo-mat-http": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp"
}
}
}Open the file and press Start next to the server you want; reload the
window if it doesn't appear (Developer: Reload Window).
Zed
Add the entry under context_servers (note: not mcp_servers) in
~/.config/zed/settings.json or the project-level .zed/settings.json:
{
"context_servers": {
"modelo-mat": {
"command": "uvx",
"args": ["mathmethods"]
}
}
}You can also manage them via Settings → AI → MCP Servers.
opencode / OpenChamber
Both opencode and the OpenChamber desktop app share the same configuration
format. Add the entry under mcp in opencode.json (project root) or in the
global ~/.config/opencode/opencode.jsonc:
{
"mcp": {
"modelo-mat": {
"type": "local",
"command": ["uvx", "mathmethods"],
"enabled": true
}
}
}Or register it with the CLI (equivalent):
opencode mcp add modelo-mat -- uvx mathmethods-mcpFor a remote server running on http://127.0.0.1:8000/mcp:
{
"mcp": {
"modelo-mat": {
"type": "remote",
"url": "http://127.0.0.1:8000/mcp",
"enabled": true
}
}
}Verify with opencode mcp list.
Antigravity
Add the entry under mcpServers in the Antigravity config file, typically
~/.gemini/antigravity/mcp_config.json:
{
"mcpServers": {
"modelo-mat": {
"command": "uvx",
"args": ["mathmethods"]
}
}
}If the file path differs on your install, use the in-IDE Settings → Integrations → MCP Servers panel instead, which writes the same format.
GitHub Copilot CLI
The GitHub Copilot CLI (copilot) lets you add a server interactively:
copilotthen inside the session:
/mcp add
Server name: modelo-mat
Server type: 1 (Local/STDIO)
Command: uvx mathmethods-mcp
Press Ctrl+S to save. The settings are stored in
~/.copilot/mcp-config.json (top-level mcpServers); check the connection
with /mcp show.
Claude Desktop / Claude Code
Both use the mcpServers format. In Claude Desktop, edit
claude_desktop_config.json; in Claude Code:
claude mcp add mathmethods-mcp -- uvx mathmethods-mcp{
"mcpServers": {
"modelo-mat": {
"command": "uvx",
"args": ["mathmethods"]
}
}
}npx @modelcontextprotocol/inspector node server.py # or
npx @modelcontextprotocol/inspector --transport http http://127.0.0.1:8000/mcpAsk your agent things like:
- "Find the root of
x^3 - 3x + 1in[0, 1]." - "Integrate
sin(x)/xfrom 0 to 1 using Simpson with n=10." - "Solve
y' = ywith y(0)=1 from x=0 to x=1 with step 0.1 (RK4)." - "Build the Lagrange polynomial through (0,1), (1,3), (2,7) and evaluate at 1.5."
- "Estimate the integral of
sin(x)over[0, 2pi]with Monte Carlo hit-or-miss." - "Find the equilibria of the logistic model
x' = mu*x*(1 - x/K)with K=2, mu=1." - "Classify the 2D system
x' = 2x - y,y' = x + 2yand sketch its trajectories." - "Simulate a Lanchester battle x'=-αy, y'=-βx with α=1, β=2, 100 vs 80 soldiers."
The server is read-only: the tools only compute numbers, they never touch the filesystem, the network or any destructive operation. Still, the inputs are driven by an LLM, so defense in depth is applied:
- Expression hardening (
mathmethods/compiler.py+mathmethods/core/utils.py): length cap, symbol whitelist, function whitelist, and a lexical gate that rejects attribute access (./__) and unknown tokens BEFORE SymPy parses. SymPy'ssympify/parse_exprcan execute arbitrary Python (verified RCE), so every parse site — in this project and in the upstream backend — routes through the gate. - Input caps: iteration/subinterval/step/point counts are bounded to avoid pathological CPU/RAM usage.
- Exact tool descriptions: the LLM picks tools by their metadata, so descriptions stay accurate (guards against tool-poisoning attacks).
- Prompt injection: even if the model is tricked, the worst it can do is ask for another computation. There are no privileged side channels.
- The vendored core is inherited from the upstream project and kept as-is (Spanish identifiers, etc.).
dynamic_2d_nonhomogeneous_solvewith time-varying forcing on a non-diagonal matrix A shows the homogeneous solution only (the particular term is computed for diagonal systems); the numeric RK4 trajectory is always correct.- The 1D bifurcation table is downsampled to 300 rows for readability.
The package is publish-ready (uv build succeeds and the wheel exposes all
tools). To release:
uv build
uv publish # requires a PyPI token: `uv login` or UV_PUBLISH_TOKENOnce published, every client config just works with uvx mathmethods-mcp (no
paths, no venv). Bump version in pyproject.toml before each release.
The math lives in modeladoYsimulacion-web/backend/app/methods/. When the
upstream code changes, copy the files here again:
cp ../modeladoYsimulacion-web/backend/app/methods/{root_finding,integration,ode,interpolation,monte_carlo,dynamic_1d,dynamic_2d_linear,dynamic_2d_non_homogeneous,dynamic_2d_nonlinear,dynamic_2d_conservative,dynamic_2d_lanchester}.py mathmethods/core/
cp ../modeladoYsimulacion-web/backend/app/core/utils.py mathmethods/core/utils.pyThen rewrite the from app.core.utils import ... imports to from .utils import ... in the copied files.
uv run pytest- Translate the vendored core to English (manual, when time allows).
- Server-side CI is wired up (
.github/workflows/ci.yml); coverage report next. - Optional MCP resources/prompts (e.g. a theorem reference) on top of the tools.