Every response carries the formula, the inputs it actually used, the unrounded intermediate value and the rounded output — so a tax figure can be shown to an accountant rather than asserted. Naming the rounding mode on every call is the second half of that: HALF_EVEN and HALF_UP disagree at exactly the boundaries where a filing gets rejected.
A calculation server with a Decimal-only kernel. Input JSON is parsed straight to Decimal so no float ever reaches a formula, the rounding mode is a required argument rather than a default, and every response carries a trace with the formula, the inputs, the intermediate steps and the output.
- core.add, core.sub, core.mul and core.calc — the arithmetic the model should not be doing itself
- core.batch runs independent calculations in parallel and re-sorts results by input id, so the same request gives the same order every time
- core.pipeline chains dependent steps as a DAG — annual salary into tax into net pay in one round trip — with core.pipeline_resume to pick up a stopped run
- finance.npv, finance.irr, finance.loan_schedule, finance.black_scholes, finance.bond_ytm and finance.bond_duration
- tax.kr_income, tax.progressive and tax.capital_gains_kr, plus payroll.kr_salary folding social insurance and local income tax into one trace
- accounting.vat_add and accounting.vat_extract, realestate.kr_acquisition_tax, realestate.kr_dsr and the rest of the Korean property set
- Probability and stats: distribution pdf/cdf/ppf, t-tests, ANOVA, regression and confidence intervals
- Engineering, science, medical, geometry, datetime, units, crypto and math domains alongside them
- sootool.skill_guide returns the trigger table and playbook, so the client can look up a tool's arguments without leaving the session
Python 3.12 or newer, installed with uv. Numeric arguments are passed as decimal strings, and Korean tax and property tools require the year explicitly — the policy file for that year is checked against its SHA-256 before it loads. Binds to 127.0.0.1 by default; exposing it beyond localhost requires a bearer token. The ten policy-administration tools stay inert unless SOOTOOL_ADMIN_MODE is set.
One command — uvx sootool
