Precisioncalc Mcp

io.github.inity13Published by GitHub account inity13v2.1.1Updated Oct 27, 2026

High-precision finance & business calculations for AI agents — exact decimals, never floats.

VerifiedStreamable HTTPWeb executableFinanceData & Analytics

Overview

AI-generated overview

Deterministic finance and business calculator server that gives an assistant exact-decimal tools for SaaS metrics, FX, NPV/IRR, loans and depreciation.

What you can do
  • Compute SaaS and business metrics such as LTV, CAC, churn, NRR, GRR, Rule of 40 and break-even, and list the supported metrics with their parameters
  • Convert amounts between nine major currencies, using a static offline table or live/historical ECB rates
  • Do business-day arithmetic with US, UK, EU or other country holidays and custom holiday dates
  • Run growth, NPV, IRR, loan amortization and depreciation calculations, optionally with full schedules
  • Execute up to 100 calculations in one batch request and check server health
When to use it
Useful when an assistant has to produce auditable financial or business figures where floating-point drift or invented formulas are a risk, and you want each result returned with the formula, inputs and assumptions. Also handy for multi-step SaaS metric or valuation work that would otherwise be done by hand.
Requirements
Either the hosted Streamable HTTP endpoint or a local install via the npm package over stdio (the README also documents a Python 3.11+ self-host). No credentials are needed for the free hosted tier; paid tiers use an API key sent as X-API-Key or Authorization: Bearer. Live and historical FX rates need network access and a paid plan on the hosted endpoint.
Before you install
The hosted free tier is limited to 15 calls per day per IP, with static FX rates only and no batch_calculate; live FX and batch use require a paid Stripe subscription (Starter or Pro). When a limit is hit the server returns an upgrade block with checkout links, so an assistant may surface paywall prompts. Self-hosting requires Stripe and API-key secrets such as STRIPE_SECRET_KEY and PRECISIONCALC_API_KEYS. Live FX requests send currency queries to an external rates provider.

Installation

In SourceWeft

  1. Open Precisioncalc Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.inity13%2Fprecisioncalc-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "precisioncalc": {
      "type": "http",
      "url": "https://precisioncalc-mcp.pages.dev/mcp"
    }
  }
}

README

PrecisionCalc MCP

A deterministic Model Context Protocol (MCP) server that gives LLM agents reliable, high-precision business, finance, and operational calculations.

LLMs routinely lose precision or hallucinate on multi-step financial formulas, currency conversions, business-day logic, and growth math. PrecisionCalc offloads that work to exact, transparent tools. Every monetary/financial value is computed with Python's decimal module (never floats), and every result is returned in a consistent, agent-parseable JSON envelope that includes the exact value, a human-readable value, the formula applied, the inputs used, the unit, and any assumptions/warnings.

v2 highlights: live + historical FX (ECB), 14 SaaS metrics, NPV/IRR, loan amortization, depreciation, a batch_calculate tool, per-country holidays, API-key auth + rate limiting + usage metering on the HTTP transport, structured JSON logging, optional OpenTelemetry tracing, and property-based tests.

🌐 Live hosted server (free, no install)

A public remote MCP server runs on Cloudflare's edge — point any Streamable-HTTP MCP client at it:

https://precisioncalc-mcp.pages.dev/mcp

Install via npm (stdio, no hosting)

Run the server locally over stdio with a single command — nothing to deploy:

bash
npx -y precisioncalc-mcp

Claude Desktop / any stdio MCP client (claude_desktop_config.json):

json
{ "mcpServers": { "precisioncalc": { "command": "npx", "args": ["-y", "precisioncalc-mcp"] } } }

This is the same deterministic engine as the hosted server, running on your machine.

json
{ "mcpServers": { "precisioncalc": {    "type": "http", "url": "https://precisioncalc-mcp.pages.dev/mcp" } } }

The edge build (worker-src/) is a Cloudflare Pages Function that mirrors the Python engine using decimal.js — verified 17/17 exact output parity. Landing page + docs: https://precisioncalc-mcp.pages.dev.

Plans (hosted endpoint)

PlanPriceDaily callsLive/historical FXbatch_calculate
Free (no key)$015 / day (per IP)❌ static only❌
Starter$12/mo5,000 / day✅✅
Pro$39/mo50,000 / day✅✅

Checkout is Stripe (subscription). On success you get an API key instantly; send it as X-API-Key: <key> (or Authorization: Bearer <key>). Manage/cancel at /portal. When a limit is hit, tools return a structured status:"error" envelope with type, usage, and an upgrade block containing checkout URLs — so an agent can surface the paywall to the user and act on it. Self-host (below) for unlimited calls with your own keys.

Billing internals live in worker-src/billing.mjs (Stripe REST + Cloudflare KV for keys and daily counters). Server env: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, PRICE_STARTER, PRICE_PRO, FREE_DAILY, STARTER_DAILY, PRO_DAILY, and a PRECISIONCALC_KV namespace binding (see wrangler.toml).

Rebuild/redeploy the edge server:

bash
npm install          # decimal.js + esbuildnpm run deploy       # bundles worker-src -> site/_worker.js and deploys to Pages

What it does

11 tools, all returning a uniform structured response:

ToolPurpose
calculate_metric14 SaaS/business metrics (LTV, CAC, churn, MRR growth, NRR, GRR, Rule of 40, magic number, break-even, ...)
currency_convertConvert 9 major currencies; static (offline) or live/historical ECB rates
business_daysAdd/count business days, next/previous; US/UK/EU + any ISO country + custom holidays
compound_growthFuture value, present value, CAGR; 7 compounding frequencies incl. continuous
net_present_valueNPV / discounted cash flow of a cashflow series
internal_rate_of_returnIRR (Newton + bisection fallback)
loan_amortizationLevel-payment loan: payment, totals, full schedule, extra-payment payoff
depreciationstraight-line / declining-balance / sum-of-years-digits schedules
batch_calculateRun many calculations in one request
list_metricsDiscovery: every metric with descriptions + required params
health_checkServer status, version, capabilities

Consistent response envelope

Success:

json
{  "status": "success",  "value": "1600",                       // exact, full-precision (string for money/rates)  "formatted_value": "$1,600.00",        // human-readable  "formula": "LTV = (ARPU * gross_margin) / churn_rate",  "inputs_used": { "arpu": "100", "gross_margin": "0.8", "churn_rate": "0.05" },  "unit": "USD",  "notes": ["LTV = (ARPU x gross_margin) / churn_rate.", "..."]}

Error (never raised across the tool boundary):

json
{  "status": "error",  "error": {    "type": "missing_parameter",    "message": "Missing required parameter 'churn_rate'.",    "hint": "Include 'churn_rate' in params. See list_metrics for the full schema."  }}

Project structure

precisioncalc-mcp/├── server.py                 # MCP server: tool definitions + transports├── security.py               # API-key auth + token-bucket rate limit + metering (ASGI)├── observability.py          # Structured JSON logging + optional OpenTelemetry├── requirements.txt / pyproject.toml├── Dockerfile / .dockerignore├── fly.toml / render.yaml    # One-click hosting configs├── .env.example├── calculations/│   ├── _util.py              # Decimal coercion, validation, formatting│   ├── metrics.py            # 14 business/SaaS metrics + catalog│   ├── currency.py           # FX: static + Frankfurter (live/historical) providers│   ├── business_days.py      # Region-aware holidays (built-in + `holidays` lib)│   ├── growth.py             # FV / PV / CAGR│   └── finance.py            # NPV / IRR / loan amortization / depreciation├── schemas/responses.py      # Response envelope helpers├── examples/agent_example.py # End-to-end MCP client demo├── site/                     # Static landing/docs page (Cloudflare Pages)└── tests/                    # 49 unit tests + Hypothesis property tests

Requirements

  • Python 3.11+ (developed/tested on 3.12)
  • Core: mcp, python-dateutil
  • Recommended: uvicorn + starlette (HTTP transport), holidays (per-country calendars)
  • Optional: opentelemetry-sdk (tracing), pytest + hypothesis (tests)

The server auto-detects the SDK layout and works with mcp >= 2.0 (MCPServer), mcp 1.x (FastMCP), or the standalone fastmcp package.


Run it locally

bash
cd precisioncalc-mcppython -m venv .venv && source .venv/bin/activatepip install -r requirements.txt          # or: pip install -e ".[all]"
# stdio transport (default; how MCP clients launch it)python server.py            # or: precisioncalc-mcp   (console entrypoint)
# Streamable HTTP transport (endpoint: /mcp)python server.py httpPRECISIONCALC_API_KEYS=key1,key2 PRECISIONCALC_FX_PROVIDER=frankfurter python server.py http

Demo + tests:

bash
python examples/agent_example.py         # live end-to-end over stdiopython tests/test_calculations.py        # 28 core tests (no pytest needed)python tests/test_v2.py                  # 17 v2 testspython tests/test_properties.py          # Hypothesis property tests# or simply:  pytest -q

Register with an MCP client (stdio)

json
{ "mcpServers": { "precisioncalc": {    "command": "python", "args": ["/absolute/path/to/precisioncalc-mcp/server.py"] } } }

Deploy

Docker

bash
docker build -t precisioncalc-mcp .docker run --rm -p 8000:8000 -e PRECISIONCALC_API_KEYS=your-key precisioncalc-mcpdocker run --rm -i precisioncalc-mcp python server.py stdio

Fly.io

bash
fly launch --no-deployfly secrets set PRECISIONCALC_API_KEYS=key1,key2fly deploy

Render.com

Push to GitHub, then New + → Blueprint and point at the repo (render.yaml). Set PRECISIONCALC_API_KEYS as a secret in the dashboard.


Configuration (env vars)

VarDefaultPurpose
PRECISIONCALC_HOST / PRECISIONCALC_PORT127.0.0.1 / 8000HTTP bind
PRECISIONCALC_API_KEYS(empty)Comma-separated keys. Empty = open mode (still metered/limited by IP)
PRECISIONCALC_RATE_LIMIT_PER_MIN / _BURST120 / 40Token-bucket limits
PRECISIONCALC_METRICS_PATH/metricsUsage-metrics endpoint
PRECISIONCALC_FX_PROVIDERstaticstatic or frankfurter (live/historical ECB)
PRECISIONCALC_FX_TTL / _TIMEOUT3600 / 4FX cache TTL / HTTP timeout (s)
PRECISIONCALC_LOG_LEVEL / _LOG_JSONINFO / 1Logging
PRECISIONCALC_OTEL01 enables OpenTelemetry tracing if SDK present

Tools & parameters

calculate_metric(metric, params, currency="USD")

Rates/margins are decimals (0.05 = 5%).

metricparamsunit
ltvarpu, churn_rate, gross_margin(=1)currency
cactotal_spend, new_customerscurrency
ltv_cac_ratioltv, cacratio
payback_period_monthscac, monthly_revenue_per_customer, gross_margin(=1)months
contribution_marginrevenue, variable_costscurrency
gross_marginrevenue, cogspercent
churn_ratecustomers_lost, customers_at_startpercent
mrr_growth_ratebeginning_mrr, ending_mrrpercent
arrmrrcurrency
break_even_unitsfixed_costs, price_per_unit, variable_cost_per_unitunits
nrrstarting_mrr, expansion_mrr, contraction_mrr, churned_mrrpercent
grrstarting_mrr, contraction_mrr, churned_mrrpercent
rule_of_40growth_rate, profit_marginpercent
magic_numbercurrent_quarter_revenue, prior_quarter_revenue, prior_quarter_sm_spendratio

currency_convert(amount, from_currency, to_currency, date=None, live=None)

USD, EUR, GBP, JPY, CAD, AUD, CHF, CNY, INR. date (YYYY-MM-DD) or live=true uses live/historical ECB rates (frankfurter.app), with automatic static fallback on any network failure. Returns rate, provider, is_live, and timestamps.

business_days(operation, start_date, days=None, end_date=None, region="US", custom_holidays=None)

operation: add_business_days | count_business_days (inclusive) | next_business_day | previous_business_day. region: US | UK | EU | NONE, or any ISO country code when the holidays package is installed (DE, FR, CA, AU, JP, IN, ...).

compound_growth(operation, rate, years, present_value, future_value, begin_value, end_value, compounding="annually", currency="USD")

operation: future_value | present_value | cagr. compounding: daily | weekly | monthly | quarterly | semiannually | annually | continuous.

net_present_value(rate, cashflows, currency="USD")

NPV = Σ CFₜ/(1+rate)ᵗ. cashflows[0] = period 0 (usually the negative outlay).

internal_rate_of_return(cashflows, guess=0.1)

Per-period rate where NPV = 0. Requires a sign change in the cashflows.

loan_amortization(principal, annual_rate, term_months, extra_payment=0, currency="USD", include_schedule=false)

Returns monthly payment, months-to-payoff, total interest, total paid, and (optionally) the full month-by-month schedule.

depreciation(method, cost, salvage_value, useful_life_years, currency="USD")

method: straight_line | declining_balance | sum_of_years_digits. Returns the full yearly schedule; book value converges to salvage_value.

batch_calculate(calls)

calls: list of {"tool": <name>, "arguments": {...}} (max 100). One item failing never aborts the batch.

list_metrics() / health_check()

Discovery + status. No parameters.


Example MCP tool-call payloads

json
{ "name": "calculate_metric",  "arguments": { "metric": "rule_of_40", "params": { "growth_rate": 0.30, "profit_margin": 0.15 } } }
json
{ "name": "currency_convert",  "arguments": { "amount": 5000, "from_currency": "EUR", "to_currency": "GBP", "date": "2024-01-15" } }
json
{ "name": "net_present_value",  "arguments": { "rate": 0.10, "cashflows": [-10000, 3000, 4200, 6800] } }
json
{ "name": "loan_amortization",  "arguments": { "principal": 250000, "annual_rate": 0.065, "term_months": 360, "include_schedule": false } }
json
{ "name": "batch_calculate",  "arguments": { "calls": [    { "tool": "internal_rate_of_return", "arguments": { "cashflows": [-10000, 3000, 4200, 6800] } },    { "tool": "depreciation", "arguments": { "method": "declining_balance", "cost": 50000, "salvage_value": 5000, "useful_life_years": 5 } }  ] } }

Design decisions & assumptions

  • Decimal everywhere money/rates matter; value is serialized as a string to prevent float loss in JSON, with a separate pretty formatted_value. Precision = 50 sig figs.
  • Rates/margins are decimals (0.05 = 5%), documented in every tool.
  • FX: static USD-based table (as_of 2024-06-01) is the offline default; frankfurter provider adds live + historical ECB rates with in-memory TTL cache and graceful static fallback.
  • Business days: holidays computed per-year (floating US, Easter-based UK/EU); count is inclusive; add accepts negatives; custom holidays unioned; any ISO country via holidays lib.
  • IRR uses Newton's method with a bracketed bisection fallback; requires a sign change.
  • Errors never cross the tool boundary as exceptions — always status:"error" with a machine type + actionable hint.
  • HTTP hardening is opt-in via env: API keys, token-bucket rate limiting, /metrics usage.
  • SDK compatibility shim runs on mcp>=2.0, mcp 1.x, or standalone fastmcp unchanged.

Monetization hooks

  • Auth — PRECISIONCALC_API_KEYS; requests need X-API-Key or Authorization: Bearer.
  • Rate limiting — per-key token bucket (per-IP in open mode); swap for Redis to scale.
  • Usage metering — in-memory counters exposed at /metrics; the seam for per-key billing.
  • FX provider — calculations/currency.py::RateProvider is the drop-in point for a licensed feed.

Roadmap (post-v2)

  1. Redis-backed rate limiting + billing-grade usage metering.
  2. Persisted historical FX + more providers; multi-currency carry through metrics.
  3. Bond pricing/yield, WACC, options (Black-Scholes), tax/VAT, unit conversions.
  4. Prometheus exporter + Grafana dashboard alongside OTel traces.
  5. Published PyPI package + Docker image on GHCR; hosted multi-tenant SaaS.

Source: README.md at commit 0b38a7a

Tools

11

calculate_metric

Compute a business/SaaS/finance metric with exact decimal precision. Metrics: ltv, cac, ltv_cac_ratio, payback_period_months, contribution_margin, gross_margin, churn_rate, mrr_growth_rate, arr, break_even_units, nrr, grr, rule_of_40, magic_number. Rates/margins are decimals (0.05=5%). Call list_metrics for schemas.

Parametersmetricrequiredparamsrequiredcurrency

list_metrics

List every supported metric with descriptions and required/optional params.

Takes no parameters.

currency_convert

Convert an amount between major currencies (USD, EUR, GBP, JPY, CAD, AUD, CHF, CNY, INR) with Decimal precision. Static offline table on the free tier; live/historical ECB rates (date/live=true) require a paid plan.

Parametersdateliveamountrequiredto_currencyrequiredfrom_currencyrequired

business_days

Business-day arithmetic honoring weekends + regional holidays. operation: add_business_days (needs days, negative ok) | count_business_days (needs end_date, inclusive) | next_business_day | previous_business_day. region: US | UK | EU | NONE. custom_holidays: list of YYYY-MM-DD.

Parametersdaysregionend_dateoperationrequiredstart_daterequiredcustom_holidays

compound_growth

Compound-interest/growth math. operation: future_value (rate, years, present_value) | present_value (rate, years, future_value) | cagr (begin_value, end_value, years). rate is annual decimal (0.08=8%). compounding: daily|weekly|monthly|quarterly|semiannually|annually|continuous.

Parametersrateyearscurrencyend_valueoperationrequiredbegin_valuecompoundingfuture_valuepresent_value

net_present_value

Net Present Value (discounted cash flow). NPV = sum(CF_t/(1+rate)^t). cashflows[0] = period 0 (usually the negative outlay).

Parametersraterequiredcurrencycashflowsrequired

internal_rate_of_return

Internal Rate of Return: per-period rate where NPV=0 (Newton + bisection). Requires a sign change in cashflows.

Parametersguesscashflowsrequired

loan_amortization

Level-payment loan: monthly payment, total interest, payoff, and (optional) full schedule. payment = P*r/(1-(1+r)^-n), r=annual_rate/12.

Parameterscurrencyprincipalrequiredannual_raterequiredterm_monthsrequiredextra_paymentinclude_schedule

depreciation

Asset depreciation schedule. method: straight_line | declining_balance | sum_of_years_digits. Book value converges to salvage_value.

Parameterscostrequiredmethodrequiredcurrencysalvage_valuerequireduseful_life_yearsrequired

batch_calculate

PAID FEATURE. Run many calculations in one request. calls: list of {tool, arguments} (max 100). One failure never aborts the batch.

Parameterscallsrequired

health_check

Server health/status metadata.

Takes no parameters.

Version history

1
  1. v2.1.1LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts