Skip to main content
Glama

몇 글자로 수학을 작성하면, 언어 모델에게 "머릿속으로 계산"하거나 수치 루프를 직접 작성하라고 요청하는 대신, 정확한 답이나 독립 실행 가능한 최적화된 Python/NumPy 코드를 얻을 수 있습니다.

"MCP", "symbolic", "ODE" 같은 용어가 처음이신가요? 용어집으로 이동하세요.

SymPy + NumPy 위에 얇고 규율 있는 계층으로 구축되었습니다:

  1. 토큰 절감 — 짧은 명령 하나 입력, 정확한 결과 하나 출력. 에이전트 도구로 완벽합니다 (MCP 서버 포함).

  2. 순수 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 + mypy

Python ≥ 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

오류는 exit code 1과 함께 stderr로, 결과는 exit code 0과 함께 stdout으로 출력됩니다 — 스크립트와 에이전트 도구에서 안전하게 호출할 수 있습니다. Windows 콘솔에서는 PYTHONUTF8=1을 설정하세요.

REPL

python -m pycodemath        # or just: pycodemath

전체 명령 테이블을 보려면 help를 입력하세요 (도함수, 적분, 방정식 풀이, 행렬, 근 찾기, 최적화, 전체 ODE 제품군, 코드 생성).

MCP 서버 (모든 AI 에이전트를 위한 수학)

pip install -e .[mcp]
claude mcp add pycodemath -- python -m pycodemath.cli.mcp_server

math_eval이라는 하나의 도구를 노출하며, REPL과 동일한 명령을 받습니다 — 에이전트가 diff sin(x)*x dx를 보내면 x*cos(x) + sin(x)를 정확히 받으며, 머릿속 계산이 전혀 필요 없습니다.

Claude Code 스킬로 사용하기

위의 MCP 서버가 이식 가능한 경로입니다 — 모든 MCP 클라이언트에 연결됩니다. Claude Code를 구체적으로 사용한다면, Pycodemath를 스킬로 연결할 수도 있습니다. 그러면 프롬프트에 실제 수학이 필요할 때마다 Claude가 스스로 엔진을 사용하게 됩니다 (MCP 프로세스를 계속 실행할 필요 없음).

무엇이 바뀌나요: 큰 모델이 조용히 산술, 적분 또는 고유값을 틀릴 수 있는 "머릿속 계산" 대신, Claude가 엔진에 명령을 보내고 정확한 SymPy/NumPy 결과를 붙여 넣습니다. 짧은 명령 하나 입력, 정확한 줄 하나 출력: 토큰 감소, 조용한 실수 없음.

배포 (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 외에도 엔진은 극한(단측 및 무한대 포함), Taylor/Laurent 전개, 기호 합산(유한 또는 무한)을 처리합니다. 모두 실제 출력이 있는 실제 호출입니다:

$ 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.9999999999989762

ODE 제품군

기호(dsolve) 및 완전한 수치 도구 상자 — 스칼라 및 시스템, 시간 전진 및 후진(t1 < t0), 모두 특이점을 조용히 건너뛰지 않고 거부합니다 (쓰레기 대신 읽을 수 있는 오류):

solver

기능

solve_ode_num

고정 스텝 RK4

solve_ode_adaptive

Dormand–Prince 5(4), 적응형 스텝 (ode45와 유사)

solve_ode_dense

적응형 + 조밀 출력: 어디서든 호출 가능한 sol(t)

solve_ode_events

이벤트 감지 g(t,y)=0 (+ 종료 이벤트)

solve_ode_stiff

강성 방정식을 위한 암시적 BDF2 + Newton

solve_ode_stiff_adaptive

가변 스텝 BDF2 로컬 오차 제어 포함

solve_ode_system_*

위 모든 것의 벡터 변형

매끄러운 문제의 적응형 적분은 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스텝에 도달합니다 — 그리고 강성이 순수한 느린 다양체에서 시작하면 58스텝 vs 357:

$ 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 nodes

API에서의 이벤트 감지:

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.6666666666666469

tol <t> (min / min_nd / nintegrate에 적용), max_iter <k> (min / min_nd에 적용), budget <s> (기호 명령에 적용, Python에서 pycodemath.time_budget(seconds)와 동일한 방식으로 호출을 제한)는 명령 끝에 key value 쌍으로 순서에 관계없이 사용할 수 있습니다.

거부하는 기호 호출은 두 가지 중 어떤 일이 발생했는지 말합니다: NoClosedFormError (엔진이 검색했지만 아무것도 찾지 못함 — 수치적으로 시도하세요) 또는 UnsupportedFormError (이 형태에 대한 메서드가 전혀 존재하지 않음).

설계 계약

  • 엔진과 생성기가 공유하는 하나의 IR (Expr/Matrix).

  • 수치 루프는 컴파일된 함수(lambdify + LRU 캐시)에서 실행 — 반복당 SymPy 호출 0회.

  • 발산 또는 도메인 문제는 읽을 수 있는 PycodemathError를 발생 — 결과에 NaN/쓰레기 없음.

  • 파서는 수학 함수의 화이트리스트만 해석 — 알 수 없는 이름은 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를 발생시키는 대신 예산을 넘어 계속 실행됩니다 — 그러한 환경 중 하나(Python 3.13, WSL2)에서 직접 측정되었습니다. 이는 빠른 경로 — 압도적 다수의 호출이 밀리초 단위로 완료되어 예산에 근접하지 않는 경우 — 에는 영향을 미치지 않으며, 잘못된 답을 생성하지도 않습니다; 유일한 실패 모드는 "요청한 만큼 신속하게 거부하지 않았다"는 것입니다. 엄격한 보장은 하위 프로세스 기반 백스톱이 필요하며, 이는 로드맵에 있지만 아직 구축되지 않았습니다.

용어집

위에서 사용된 전문 용어에 대한 평이한 정의 — 프로그래머가 아닌 이 저장소를 읽는 모든 사람을 위한 것입니다.

용어

의미

기호 수학(Symbolic math)

종이에 쓰는 방식처럼 정확한 문자와 수식(예: x^2 + 1)으로 하는 수학 — 소수점 숫자를 대입하는 것과 반대. 답은 근삿값이 아니라 정확한 값입니다.

수치 수학(Numerical math)

실제 소수 숫자(예: 1.41421356...)로 하는 수학으로, 정답에 점점 가까워지는 알고리즘으로 계산합니다. 빠르지만 근삿값입니다.

SymPy / NumPy

이 프로젝트가 기반으로 하는 두 개의 오픈소스 Python 라이브러리. SymPy는 정확한/기호 수학을 담당하고, NumPy는 빠른 수치 수학을 담당합니다.

파서(Parser)

사용자가 입력한 내용(예: diff sin(x)*x dx)을 읽고 그것이 어떤 수학을 나타내는지 파악하는 프로그램의 일부.

엔진(Engine)

파서가 질문을 이해한 뒤 실제로 수학을 수행하는 부분 — 도함수를 계산하고, 방정식을 푸는 등의 작업을 합니다.

코드 생성기("codegen")

답만 주는 대신, 사용자의 수식을 계산하는 바로 사용 가능한 Python 코드 블록을 작성해 주는 부분.

CSE(공통 부분식 제거)

최적화 기법: 수식이 동일한 계산을 두 번 반복하면, 생성된 코드는 그 계산을 한 번만 수행하고 결과를 재사용하여 중복 작업을 피합니다.

REPL

"Read-Eval-Print Loop" — 대화형 프롬프트: 명령을 하나 입력하면 답을 하나 받고, 다음 명령을 입력하는 방식(터미널에서 대화하는 계산기와 같습니다).

MCP(Model Context Protocol)

AI 어시스턴트(예: Claude)가 외부 도구를 호출할 수 있게 해주는 개방형 표준 — 이 경우, AI가 스스로 답을 추측하는 대신 실제 수학 문제를 이 엔진에 넘겨줄 수 있게 합니다.

AI 에이전트

단순히 대화만 하는 것이 아니라 스스로 작업을 수행하고 도구를 사용할 수 있는 AI 어시스턴트 — 예: Claude Code 또는 MCP 호환 어시스턴트.

토큰(Token)

AI 언어 모델이 읽고 쓰는 작은 텍스트 조각. 토큰이 적을수록 AI와의 교환이 더 저렴하고 빠릅니다 — 이 도구가 긴 텍스트 대신 짧고 정확한 답을 반환하는 이유 중 하나입니다.

타입 지정 예외(Typed exception)

일반적인 오류 메시지 대신 특정한 이름의 타입으로 분류된 오류(예: "방정식에 실수 해가 없음" vs. "잘못된 입력") — 프로그램이 실패 원인에 따라 올바르게 대응할 수 있게 해줍니다.

SolveResult / QuadratureResult

이 엔진이 답과 함께 반환할 수 있는 구조화된 "증거" 객체 — 숫자뿐 아니라 몇 단계를 거쳤는지, 오차가 얼마나 될 수 있는지, 답이 실제로 정확하다고 확신하는지 여부를 포함합니다.

근(Root) / 근 찾기

수식이 0이 되는 값(들)을 찾는 것(예: 그래프가 x축과 교차하는 지점).

고유값(Eigenvalue)

숫자 격자(행렬)와 연관된 특별한 값으로, 물리학·공학·그래픽스에서 자주 등장합니다 — 예: 시스템의 자연 진동수나 안정 방향을 설명하는 데 사용됩니다.

기울기(Gradient) / 야코비안(Jacobian) / 헤시안(Hessian)

변수가 둘 이상인 수식에 대한 다양한 "도함수" — 기울기는 함수가 가장 빠르게 증가하는 방향을 가리키고, 야코비안과 헤시안은 각각 1계 및 2계 도함수의 다변수 버전입니다.

ODE(상미분방정식)

시간에 따라 어떤 것이 어떻게 변하는지를 설명하는 방정식(예: 낙하 물체의 속도가 중력과 항력에 따라 어떻게 변하는지). 물리학, 생물학, 공학 시뮬레이션의 핵심입니다.

RK4 / Dormand–Prince / BDF

ODE를 시간 단계별로 수치적으로 푸는 이름 붙은 알고리즘. 속도, 정확도, 자체 스텝 크기를 자동으로 조정하는지 여부가 다릅니다.

"경직(Stiff)" 방정식

일반적인 해법으로는 정확도를 유지하기 위해 터무니없이 작은 시간 간격을 강요하는 ODE — 합리적인 시간 안에 풀려면 특수한(BDF) 방법이 필요합니다.

py.typed / mypy

다른 도구에 "이 패키지는 각 함수가 기대하고 반환하는 데이터 타입(숫자, 텍스트 등)을 선언한다"고 알려주는 표시; mypy는 그 선언이 실제로 일관적인지 검사하여 코드가 실행되기 전에 특정 버그를 잡아내는 도구입니다.

CI(지속적 통합)

코드가 변경될 때마다 전체 테스트 스위트를 자동으로 실행하는 프로세스 — 오류가 배포된 후가 아니라 즉시 발견되도록 합니다.

Wheel / sdist

Python 라이브러리가 배포되는 두 가지 표준 패키지 형식(pip install이 실제로 다운로드하는 것).

라이선스

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A 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.
    8
    28
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP 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.
    41
    10
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    19
    2
    MIT

Latest Blog Posts

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