pycodemath
数文字で数式を書き、正確な答え、またはスタンドアロンで最適化された Python/NumPyコードを得る — 言語モデルに「暗算させる」ことも、数値ループを 手書きさせることもありません。
「MCP」「シンボリック」「ODE」などの用語に馴染みがない方は、用語集へ。
SymPy + NumPy の上に構築された、薄くて規律あるレイヤーです:
トークンを削減 — 1つの短いコマンドで、1つの正確な結果が得られます。 エージェントツールとして最適です(MCPサーバー同梱)。
素朴なPythonより優れたコード — ジェネレーターはコードを出力する前に シンボリック簡約化と共通部分式除去(CSE)を適用します (繰り返し部分式で素朴な展開より約1.7倍高速と測定)。
text → [parser] → IR (expression tree) → [engine] evaluate / simplify / solve
→ [generator] IR → CSE → Python/NumPy sourceインストール
pip install pycodemath # core: sympy + numpy
pip install pycodemath[mcp] # + MCP server for AI agentsクローンから、開発用(編集可能インストール):
pip install -e .[dev] # editable + pytest + mypyPython ≥ 3.11 が必要です。
Related MCP server: SymKit
クイックスタート
ワンショットCLI(スクリプト可能)
以下のすべてのコマンドは、実際の出力を伴う実際の呼び出しです。
$ python -m pycodemath "diff sin(x)*x dx"
x*cos(x) + sin(x)
$ python -m pycodemath "integrate 2*x dx"
x**2
$ python -m pycodemath "solve x^2 - 4 for x"
-2, 2
$ python -m pycodemath "sin(x)^2 + cos(x)^2"
1
$ python -m pycodemath "eig [[2,1],[1,2]]"
3, 1
$ python -m pycodemath "solve_nd x^2+y^2-4; x-y for x,y at 1,1"
x = 1.4142135623746899, y = 1.4142135623746899エラーは終了コード1でstderrに、結果は終了コード0でstdoutに出力されます —
スクリプトやエージェントツールから安全に呼び出せます。Windowsコンソールでは
PYTHONUTF8=1 を設定してください。
REPL
python -m pycodemath # or just: pycodemathhelp と入力すると完全なコマンド表が表示されます(微分、積分、方程式
求解、行列、求根、最適化、ODEスイート全体、コード生成)。
MCPサーバー(あらゆるAIエージェントのための数学)
pip install -e .[mcp]
claude mcp add pycodemath -- python -m pycodemath.cli.mcp_servermath_eval という1つのツールを公開し、REPLと同じコマンドを受け付けます —
エージェントが diff sin(x)*x dx を送信すると、暗算ゼロで
x*cos(x) + sin(x) を正確に受け取ります。
Claude Codeスキルとして使う
上記のMCPサーバーはポータブルな経路です — あらゆるMCPクライアントに 接続できます。Claude Code を具体的に 使用している場合は、Pycodemathをスキルとして配線することもでき、 プロンプトが実際の数学を必要とするときはいつでもClaudeが自らエンジンに 到達します(MCPプロセスを常時稼働させる必要はありません)。
何が変わるか: 「頭の中で」計算する代わりに — 大規模モデルは算術、積分、 固有値を静かに間違えることがあります — Claudeはエンジンに外部委託し、 正確なSymPy/NumPyの結果を貼り付けます。1つの短いコマンドで、1つの正確な 行が出力されます: トークンが減り、静かな間違いがありません。
デプロイ(一度だけ):
pip install pycodemath # or: pip install -e . (from a clone)
mkdir -p ~/.claude/skills/pycodemath以下を ~/.claude/skills/pycodemath/SKILL.md として保存します:
---
name: pycodemath
description: Compute math with the local Pycodemath engine (SymPy+NumPy) instead
of in your head — derivatives, integrals, solving equations and systems
(linear and nonlinear), determinants/inverses/eigenvalues, gradients/Jacobians/
Hessians, function minima, ODEs, and optimized Python/NumPy code generation
(CSE). Use whenever the user asks to compute or verify symbolic/numerical math,
or to generate code from a formula.
---
# Pycodemath — local math engine
One command = one call (the package is pip-installed, so any working directory):
python -m pycodemath "<command>"
Result goes to stdout (exit 0); errors to stderr (exit 1). Power notation: `^` or `**`.
On Windows consoles, set `PYTHONUTF8=1`.
## Commands
| Command | Example |
|---|---|
| `<expression>` — simplify | `python -m pycodemath "sin(x)^2 + cos(x)^2"` → `1` |
| `diff <expr> d<var>` — derivative | `"diff sin(x)*x dx"` → `x*cos(x) + sin(x)` |
| `integrate <expr> d<var>` — symbolic integral | `"integrate 2*x dx"` → `x**2` |
| `solve <expr> for <var>` — solve = 0 | `"solve x^2-4 for x"` → `-2, 2` |
| `code <expr>` — CSE-optimized NumPy code | `"code (sin(x)+cos(x))^2"` |
| `det / inv / transpose / eig <A>` | `"eig [[2,1],[1,2]]"` → `3, 1` |
| `solve_system <A> = <b>` — linear system | `"solve_system [[2,1],[1,3]] = [3,5]"` |
| `root <expr> for <var> at <x0>` — numeric root | `"root x^2-2 for x at 1"` |
| `min <expr> for <var> at <x0> [method newton|bfgs]` — 1D minimum | `"min (x-3)^2 for x at 0"` |
| `grad <expr> for <x,y,...>` — symbolic gradient | `"grad x^2*y for x,y"` |
| `solve_nd <f1>; <f2> for <x,y> at <x0,y0>` — nonlinear system | `"solve_nd x^2+y^2-4; x-y for x,y at 1,1"` |
| `min_nd <expr> for <x,y> at <x0,y0> [method newton|bfgs]` — N-D minimum | `"min_nd (1-x)^2+100*(y-x^2)^2 for x,y at -1.2,1 method bfgs"` |
| limits / series / sums / ODEs | `"limit sin(x)/x for x to 0"`, `"sum 1/k^2 for k from 1 to oo"` |
Type `help` in the REPL (`python -m pycodemath`) for the full command table.
## Rules
- **When to use:** the user wants a concrete math result (derivative, integral,
equation, matrix, minimum, ODE) or optimized code from a formula. The engine is
exact — trust its output over mental arithmetic.
- **When not to use:** trivial arithmetic or conceptual questions with no compute.
- A `error: ...` line on stderr (exit 1) usually means a typo in the command, a
numerical method that did not converge, or no real solution — read the message,
it is specific.Claude Codeを再起動(または新しいセッションを開く)すると、正確な数学が
必要なタスクのときに自動的にスキルを呼び出します。登録を確認するには、
/help を実行してスキル一覧に pycodemath があるか確認してください。
極限、級数、シンボリック総和
diff/integrate/solve に加えて、エンジンは極限(片側極限や無限大での
極限を含む)、テイラー/ローラン展開、シンボリック総和 — 有限または無限 —
を処理します。すべて実際の出力を伴う実際の呼び出しです:
$ python -m pycodemath "limit (1+1/n)^n for n to oo"
E
$ python -m pycodemath "series exp(x) for x n 4"
x**3/6 + x**2/2 + x + 1
$ python -m pycodemath "sum k for k from 1 to n"
n**2/2 + n/2
$ python -m pycodemath "sum 1/k^2 for k from 1 to oo"
pi**2/6発散する総和や存在しない極限は、シンボリックなエコーを返す代わりに、 読みやすいエラーで拒否します。
最適化: 勾配降下が停滞する場所でのNewton法とBFGS
min / min_nd はデフォルトで単純な勾配降下法を使用します。
method newton|bfgs はArmijoバックトラッキング直線探索を伴う2次法に
切り替えます。Rosenbrockの谷(開始点 (-1.2, 1))では、勾配降下法は
10 000回の反復後に拒否しますが、BFGSは36回で収束します:
$ python -m pycodemath "min_nd (1-x)^2 + 100*(y-x^2)^2 for x,y at -1.2,1 method bfgs"
x = 0.999999999999454, y = 0.9999999999989762ODEスイート
シンボリック(dsolve)に加えて、完全な数値ツールボックス — スカラーと
システム、時間順方向と逆方向(t1 < t0)、すべて特異点を静かに飛び越える
ことを拒否します(ゴミの代わりに読みやすいエラー):
solver | 機能 |
| 古典的な固定ステップRK4 |
| Dormand–Prince 5(4)、適応ステップ( |
| 適応 + 密出力: 任意の場所で呼び出し可能な |
| イベント検出 |
| スティッフ方程式のための陰的BDF2 + Newton法 |
| 可変ステップBDF2 局所誤差制御付き |
| 上記すべてのベクトル変種 |
滑らかな問題の適応積分は、rtol 1e-8 で41ステップかかります:
$ python -m pycodemath "ode_adaptive y*cos(t) for y(t) from 0 to 5 at 1 rtol 1e-8"
y(5) = 0.3833049965035854 (41 adaptive steps)スティッフな古典的問題 y' = -1000(y - cos t) では、陽的ペアは
安定性 によって制限されます(rtol 1e-6 で378ステップ; 同じ予算で
固定ステップRK4は天文学的に間違った有限値を返します)。適応BDFは
313ステップで到達します — そしてスティッフネスが純粋な遅い多様体から
始めると、357ステップに対して58ステップ:
$ python -m pycodemath "odestiff_adaptive -1000*(y-cos(t)) for y(t) from 0 to 1 at 0"
y(1) = 0.5411432587540607 (adaptive BDF, 313 implicit steps)システム変種は、μ=1000のVan der Pol発振器を [0, 2000] にわたって
5 332ステップ(約1秒)で処理します — 陽的方法では ≥ 2 000 000ステップが
必要です。
コード生成
code <expr> は、スタンドアロンでCSE最適化されたNumPyソースを出力します
(実際の出力):
$ python -m pycodemath "code (sin(x)+cos(x))^2 + (sin(x)+cos(x))^3"
import numpy as np
def f(x):
"""Pycodemath: f(x) — NumPy code."""
_c0 = np.sin(x + (1/4)*np.pi)
return 2*_c0**2*(np.sqrt(2)*_c0 + 1)Python APIはスタンドアロンのODEインテグレーターも生成します — 適応型と、
密出力を持つもの(出力される補間関数はエンジンとビット単位で同一。
測定された最大差: ノード上およびノード外グリッド、順方向と逆方向の両方で
0.0):
from pycodemath import parse, generate_ode_dense
art = generate_ode_dense(parse("y*cos(t)"), "t", "y")
sol = art(1.0, 0.0, 5.0, 1e-8) # standalone DOPRI5, returns an interpolant
sol(2.5) # -> 1.8193369962907706
len(sol.ts) # -> 42 accepted nodesAPIからのイベント検出:
from pycodemath import parse, solve_ode_events
ev = solve_ode_events(parse("cos(t)"), "t", 0.0, (0.0, 10.0), parse("y"), rtol=1e-8)
ev.event_times # -> [3.141593, 6.283185, 9.424778] (π, 2π, 3π)構造化された結果: 答えの背後にある証拠
このパッケージのすべてのソルバーには現在、素の数値の代わりに証拠を返す
full_result=True 形式があります — root_find / root_find_nd /
minimize / minimize_nd 用の凍結された SolveResult(値、反復回数、
残差、収束、ステータス)、および integrate_num 用の QuadratureResult
(error_estimate を追加)。デフォルトの呼び出しは変更されておらず、
以前とビット単位で同一です。
>>> from pycodemath import root_find, minimize, integrate_num, parse
>>> root_find(parse("x^2 - 2"), "x", 1.0, full_result=True)
SolveResult(value=1.4142135623746899, iterations=5, residual=4.510614104447086e-12, converged=True, status='converged')
>>> minimize(parse("-x^2"), "x", 1.0, full_result=True)
SolveResult(value=1085298990978.309, iterations=152, residual=2170597981956.618, converged=False, status='diverged')
>>> integrate_num(parse("sqrt(x)"), "x", 0.0, 1.0, tol=1e-10, full_result=True)
QuadratureResult(value=0.6666666666666469, error_estimate=2.4271240969151142e-11, evaluations=1005, refinements=201, converged=True, status='converged')分岐する価値がある唯一のフィールドは converged であり、それは単に
「許容差テストが発火した」だけでなく、裏付けられています: 鞍点や最大点で
消える勾配は、誤った収束ではなく status='not_a_minimum' を報告します。
MCPサーバーは同じ構造を、散文だけでなく structuredContent
(text / solve / quadrature / error フィールド)としてワイヤ上に
運びます — クライアントはテキストを解析する代わりに、宣言されたスキーマに
照らして検証します。
末尾オプション は、同じノブをREPL/ワンショット文法に置きます:
$ python -m pycodemath "min x^4 for x at 1 tol 1e-5"
0.029229144526165384
$ python -m pycodemath "nintegrate sqrt(x) dx from 0 to 1 tol 1e-10"
0.6666666666666469tol <t>(min / min_nd / nintegrate 上)、max_iter <k>(min /
min_nd 上)、budget <s>(シンボリックコマンド上で、Pythonで
pycodemath.time_budget(seconds) が行うのと同じ方法で呼び出しを制限)は、
コマンド末尾の key value ペアで、任意の順序で指定できます。
拒否するシンボリック呼び出しは、2つのうちどちらが起こったかを示します:
NoClosedFormError(エンジンが検索して何も見つからなかった — 数値的に
試してください)または UnsupportedFormError(この形状に対するメソッドが
まったく存在しない)。
設計契約
エンジンとジェネレーターが共有する1つのIR(
Expr/Matrix)。数値ループはコンパイル済み関数(
lambdify+ LRUキャッシュ)上で実行 — 反復ごとのSymPy呼び出しはゼロ。発散や定義域の問題は、NaN/ゴミの結果ではなく、読みやすい
PycodemathErrorを発生させます。パーサーは数学関数のホワイトリストのみを解決します — 未知の名前は Pythonコードではなくシンボルになります。文字列リテラルと属性アクセスは 完全に拒否され、評価コストは制限されるため、単一の式(例:
9**9**9)が メモリを枯渇させることはありません。テストはまず実数を測定し、その後マージン付きでアサートします — 668テスト、すべてグリーン、UbuntuとWindowsで(CI + mypy含む)。
すべての失敗は特定の
PycodemathErrorサブクラスです(ParseError、DomainError、DivergenceError、StagnationError、NonConvergenceError、NoClosedFormError、UnsupportedFormError、TimeBudgetError)— 呼び出し側はメッセージの文字列マッチングではなく、数学的な結果を キャッチできます。time_budgetはベストエフォートであり、ハードな保証ではありません。 実行中のスレッドにCPython自身のctypes.PyThreadState_SetAsyncExcを 通じて例外を注入することでハングを中断します — 呼び出しごとのサブプロセス なしで全プラットフォームで利用可能な唯一のメカニズムです(WindowsにはSIGALRMがなく、POSIXでもプロセスのメインスレッドでのみ発火します)。 高負荷または仮想化されたスケジューリング下では、その注入の配信が インタープリターによって時々見逃される可能性があり、その場合、呼び出しはTimeBudgetErrorを時間通りに発生させる代わりに予算を超えて実行され 続けます — そのような環境の1つ(Python 3.13、WSL2)で直接測定されました。 これは高速パスには影響しません — 圧倒的多数の呼び出しはミリ秒で完了し、 予算に近づくことはありません — また、誤った答えを生成することもありません。 唯一の失敗モードは「要求されたほど迅速に拒否しなかった」ことです。 ハードな保証にはサブプロセスベースのバックストップが必要であり、 それはロードマップにありますが、まだ構築されていません。
用語集
上記で使用された専門用語の平易な定義 — プログラマーではないこのリポジトリの 読者のために。
Term | 意味 |
Symbolic math | 正確な文字と式で行う数学( |
Numerical math | 実際の小数( |
SymPy / NumPy | このプロジェクトが基盤とする2つのオープンソースPythonライブラリ。SymPyは正確な/記号的な数学を担当し、NumPyは高速な数値計算を担当する。 |
Parser | 入力された内容(例: |
Engine | パーサーが問題を理解した後に実際に数学を実行する部分 — 導関数の計算、方程式の解法など。 |
Code generator ("codegen") | 答えを返すだけでなく、数式を計算するすぐに使えるPythonコードのブロックを生成する部分。 |
CSE (common-subexpression elimination) | 最適化の一種:式の中で同じ計算が2回繰り返される場合、生成されたコードは一度だけ計算して結果を再利用し、同じ作業を繰り返さない。 |
REPL | "Read-Eval-Print Loop" — 対話型プロンプト:コマンドを1つ入力すると1つの答えが返り、次のコマンドを入力する、という繰り返し(ターミナルで対話する電卓のようなもの)。 |
MCP (Model Context Protocol) | AIアシスタント(Claudeなど)が外部ツールを呼び出せるようにするオープン標準 — この場合、AIが実際の数学の問題を推測する代わりにこのエンジンに引き渡せるようにする。 |
AI agent | 自分で行動を起こしツールを使えるAIアシスタント(単なるチャットではなく)— 例:Claude Code、またはMCP互換のアシスタント。 |
Token | AI言語モデルが読み書きするテキストの小さな断片。トークンが少ないほど、AIとのやり取りが安く速くなる — このツールが長文ではなく短く正確な答えを返す理由の1つ。 |
Typed exception | 特定の名前付きタイプでラベル付けされたエラー(例:「方程式に実数解がない」vs「無効な入力」)— 単なる一般的なエラーメッセージではなく、プログラムが失敗した理由に正しく反応できるようにする。 |
| このエンジンが答えと一緒に返す構造化された「証拠」オブジェクト — 数値だけでなく、かかったステップ数、誤差の可能性、答えが実際に正しいかどうかの確信度。 |
Root / root finding | 数式がゼロになる値を見つけること(例:グラフがx軸と交差する場所)。 |
Eigenvalue | 行列(数値のグリッド)に関連する特別な数で、物理学、工学、グラフィックスで頻繁に登場 — 例:システムの自然振動数や安定方向を表す。 |
Gradient / Jacobian / Hessian | 複数の変数を持つ数式に対する「導関数」の異なるバリエーション — 勾配は関数が最も速く増加する方向を指す。ヤコビアンとヘッシアンは1次および2次導関数の多変数版。 |
ODE (Ordinary Differential Equation) | 時間の経過とともに何かがどう変化するかを記述する方程式(例:落下物体の速度が重力と空気抵抗によってどう変化するか)。物理学、生物学、工学シミュレーションの中心。 |
RK4 / Dormand–Prince / BDF | ODEを数値的に時間を追って解くための名前付きアルゴリズム。速度、精度、ステップサイズを自動調整するかどうかが異なる。 |
"Stiff" equation | 通常の解法では精度を保つために極端に小さな時間ステップを強制されるODE — 妥当な時間で解くには特殊な(BDF)手法が必要。 |
| 他のツールに「このパッケージは各関数が期待・返すデータ型(数値、テキストなど)を宣言している」ことを伝えるマーカー。 |
CI (Continuous Integration) | コードが変更されるたびに完全なテストスイートを自動実行するプロセス。リリース後ではなく、すぐにミスを検出できる。 |
Wheel / sdist | Pythonライブラリが配布される2つの標準パッケージ形式( |
ライセンス
MIT — LICENSE を参照。
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Precision math engine for AI agents. 203 exact methods. Zero hallucination.
Scientific compute for AI agents: symbolic, numerical, quantum, chemistry, ODE. Paid via x402.
Math.js MCP — wraps the mathjs.org API (free, no auth)
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
Related MCP Servers
- AlicenseAqualityCmaintenanceA Model Context Protocol server that exposes 8 mathematical tools (arithmetic, algebra, calculus, matrix operations, statistics, probability, unit conversions) to any MCP-compatible AI agent, enabling mathematical computations without code.8281MIT
- AlicenseBqualityBmaintenanceMCP server for symbolic computation that enables AI agents to perform step-by-step derivations, transform formulas, and verify results with full provenance, combining natural language with formal mathematical operations.4110Apache 2.0
- AlicenseAqualityBmaintenanceEnables advanced mathematics operations including linear algebra, vector math, symbolic computation, and calculus through MCP tools. Designed for use with Claude and other MCP-compatible LLMs.192MIT
- AlicenseAqualityBmaintenanceProvides an MCP server exposing compute, verify, and plot tools backed by Giac/Xcas for exact symbolic and numerical mathematics, enabling LLMs to solve calculus, algebra, geometry, and more with verified results.3672GPL 3.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cybersora9/pycodemath'
If you have feedback or need assistance with the MCP directory API, please join our Discord server