Unreachable. The endpoint has not answered since 10 Oct.
LLM serving capacity planner: VRAM, KV cache, GPU topology, latency, and cost.
One address for any MCP client. No sign-in needed on this server.

At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Odel could not list its tools without signing in.
Plan your LLM deployment before you rent the GPUs.

Switch model → multi-GPU → long-context capacity planner → Build vs Buy → Reference catalog → Live GPU pricing
tokcalc turns your LLM traffic, context length, latency SLOs, cache behavior, and model choice into a defensible serving topology and cost plan — with transparent formulas and cited benchmarks.
It's the engineering-grade pre-deployment decision layer for LLM inference. Not another static "tokens per second" calculator.
tokcalc.vercel.app — no signup, no tracking, no paywall.
Pick a model, a GPU, and a workload. Get an instant capacity plan:
If your repo declares a serving plan, tokcalc can check it. Drop a
.tokcalc.json at the repo root:
{
"model": "llama3-70b",
"gpu": "h100-sxm",
"quantization": "fp8",
"numGpus": 2,
"contextTokens": 32768,
"concurrency": 16
}
Then add this to .github/workflows/plan.yml:
name: tokcalc
on:
pull_request:
paths: [".tokcalc.json"]
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: stevecrates489-commits/tokcalc@v0.3.0
with:
fail-on-infeasible: true
Every PR that touches the plan gets a comment with the VRAM budget, KV-cache sizing, throughput, TTFT/ITL, and cost — so a reviewer can check the model/GPU choice without leaving the diff.
Pin to a release tag (as above) rather than
@main, so the action can't change under you between runs.
The action runs tokcalc's own src/lib/token-calc.ts from this repository, so
the numbers it reports are the same ones the site and the MCP tools produce.
There is no second implementation to drift.
Any field can be overridden per-run, or you can skip the config file entirely:
- uses: stevecrates489-commits/tokcalc@v0.3.0
with:
model: mixtral-8x7b
gpu: h200-sxm
quant: fp8
gpus: 2
context: 32768
concurrency: 32
Run the same thing locally without the action:
npx @tokcalc/mcp-server plan --config .tokcalc.json
npx @tokcalc/mcp-server plan --model llama3-70b --gpu h100-sxm --quant fp8 --format json
Exit code is 0 when the plan fits, 2 when it does not, 1 on a usage error
— so it works as a CI gate.
The market has dozens of "tokens per second" calculators and self-host-vs-API break-even tools (induwara.lk, gigagpu, kickllm, cloudparity, curlscape, profitable.ai). None of them are unified capacity planners — and none show their math.
"Can I serve Qwen 2.5 72B at 128K context on 2× H100 with 20 concurrent users?"
"How many H200s do I need for 1,000 req/min with P95 TTFT < 2s?"
"Does FP8 or AWQ save more money once quality, KV cache, and engine support are included?"
"At what daily volume does an H100 beat GPT-4o pricing?"
"What's the cheapest H100 right now across Azure / AWS / GCP / Vast.ai?"
"What happens to cost and latency if an agent makes 8 model calls, has 3 tool calls, and its context grows by 5K tokens each turn?"
"Would prefix caching, continuous batching, or PD disaggregation save more for this workload?"
| Feature | What it computes |
|---|---|
| Model fit / VRAM | Will the model + KV cache fit in the GPU's memory? |
| Throughput | Decode tok/s (per-stream) + aggregate (batched) + prefill tok/s |
| Latency split | Time-to-first-token (= prefill) + inter-token latency (= decode) |
| Continuous batching | User-tunable 1.0–4× multiplier (cited 1.5–4× SOSP range) |
| Reasoning tokens | Hidden reasoning budget added to billed output (o1 / R1 / Claude thinking) |
| Prompt caching | Self-hosted vLLM APC + Anthropic 5m/1h TTL + OpenAI 50%-off cached tokens |
| Speculative decoding | User-tunable 1.2–4× boost factor |
| Multi-GPU TP | 1× → 8× tensor parallel with NVLink efficiency factor |
| Long-context capacity | KV memory + max concurrency + prefill time at 4K → 1M context |
| Topology recommendation | Single GPU → TP×2 → TP×4 → TP×8 → TP×8 + Context Parallel (RingAttention) |
| Cost economics | GPU $/hr → $/M output tokens → $/request → monthly cost |
| Observed benchmark calibration | Paste vLLM/SGLang/TRT-LLM JSON → see formula accuracy verdict (validated / underestimated / overestimated) |
Independent calculator (separate state) that compares:
6 sub-tables — fully transparent, every record source-linked where available:
This is the formula the Perplexity research brief called "the most important tokcalc should visibly expose":
$$ \text{KV bytes/request} = 2 \cdot L \cdot T \cdot H_{\text{kv}} \cdot D_h \cdot B $$
For dense attention, prefill cost grows superlinearly with context length:
$$ \text{prefill FLOPs} = \underbrace{2 \cdot N \cdot T}{\text{linear}} + \underbrace{T^2 \cdot H{\text{kv}} \cdot D_h \cdot L}_{\text{attention}} $$
tokcalc shows you:
The 🔴 Live pricing sub-tab in Reference fetches real-time GPU prices from 4 providers in parallel via Promise.allSettled:
| Provider | API | Auth | Cache TTL |
|---|---|---|---|
| Azure | Retail Prices API | None (public) | 24h |
| AWS | EC2 bulk pricing file | None (public) | 24h |
| GCP | Cloud Billing Catalog API | GCP_API_KEY env var | 24h |
| Vast.ai | Marketplace bundles API | None (public) | 5m (spot prices change rapidly) |
Each provider shows a LIVE badge with timestamp + cache state. The comparison table shows the cheapest price per GPU across all 4 providers (highlighted in emerald) + per-provider breakdown.
If any provider fails (e.g., GCP_API_KEY not set), the others still work — graceful degradation per provider.
Every number above comes from a formula you can inspect. No black boxes.
$$ \text{decode tok/sec} \approx \frac{\text{HBM BW} \cdot \eta_{\text{mem}} \cdot \text{quant_eff}}{\text{model size}} $$
Where:
HBM BW = GPU memory bandwidth (e.g., 3350 GB/s for H100 SXM)η_mem = 0.65 = typical real-world memory utilization (35% overhead)quant_eff = dequantization efficiency multiplier (1.0 for FP16, 1.5 for FP8 on H100, 0.85 for INT4)model size = active_params × bytes_per_param (uses ACTIVE params for MoE, not total)Refs: PagedAttention paper (arxiv.org/abs/2309.06180)
$$ \text{prefill tok/sec} \approx \frac{\text{GPU FLOPS} \cdot \eta_{\text{compute}}}{2 \cdot \text{active params}} $$
Where:
GPU FLOPS = dense FP16/BF16 TFLOPS (sparse values not used)η_compute = 0.50 = typical compute utilizationFor long context (>32K), the superlinear attention correction above applies.
$$ \text{aggregate tok/sec} = \text{decode tok/sec} \cdot \text{batch size} \cdot \text{continuous batching multiplier} $$
Critical caveat: There is no universal continuous batching multiplier. vLLM reported 14–24× vs HF Transformers (extreme), 2.2–2.5× vs TGI. SOSP paper finds 2–4× typical vs FasterTransformer/Orca. tokcalc defaults to a conservative 1.5× and lets you tune.
Refs:
For shared prefix of length $T_p$, suffix of length $T_u$, output $O$, cache hit rate $h$:
$$ \text{API input cost} = N \cdot \left[ (1-h) \cdot T_p \cdot P_{\text{write}} + h \cdot T_p \cdot P_{\text{read}} + T_u \cdot P_{\text{input}} \right] $$
Anthropic multipliers (verified 2025-2026):
OpenAI: cached input discounted 50%, no separate write fee.
Refs:
$$ \text{total needed} = \text{model weights} + (\text{KV per request} \cdot \text{batch size}) $$
Walk the smallest topology that fits:
Refs: RingAttention paper
$$ \text{self-host $/M tokens} = \frac{\text{GPU $/hr}}{3600 \cdot \text{effective tok/s} \cdot \text{utilization}} \cdot 10^6 $$
$$ \text{break-even req/day} = \frac{\text{monthly self-host cost}}{30 \cdot \text{API cost per request}} $$
The decisive term is effective utilization — not peak throughput. A GPU running at 10% utilization pays 10× more per token than the theoretical minimum.
| Capability | induwara / techfuelhq / pcmasterstudio | gigagpu / kickllm / cloudparity | HF Open LLM Leaderboard / MLPerf | tokcalc |
|---|---|---|---|---|
| Model × GPU × quant tok/s | ✓ | some | some | ✓ |
| Model-fit / VRAM | basic | rare | rare | ✓ |
| KV-cache by context + concurrency | — | — | implicit | ✓ |
| Prefill vs decode split (TTFT/ITL) | — | — | engine-specific | ✓ |
| Continuous batching / paged attention | — | — | docs only | ✓ |
| Long-context (128K–1M) planning | — | — | — | ✓ |
| Topology recommendation (TP/CP) | — | — | partial | ✓ |
| Prompt-cache economics | — | partial API only | — | ✓ |
| Reasoning tokens (o1/R1/Claude thinking) | — | — | — | ✓ |
| API vs self-host break-even | some | ✓ | — | ✓ |
| Live cloud GPU pricing (4 providers) | — | — | — | ✓ |
| Observed benchmark calibration | — | — | — | ✓ |
| MCP server for AI agents | — | — | — | ✓ |
| Public hosted MCP endpoint + self-serve keys | — | — | — | ✓ |
| Transparent formulas / open source | mixed | usually no | mixed | ✓ |
| Cited benchmark evidence per config | rare | rare | ✓ (not planning) | ✓ (in progress) |
| Shareable URL per config | — | — | — | ✓ |
| Copy result as Markdown | — | — | — | ✓ |
src/lib/mcp/core.ts, shimmed into both the
hosted endpoint and the npm package, so the two surfaces cannot driftv* tagtokcalc.vercel.app/api/mcp with bearer auth + Upstash Redis rate limitingtokcalc.vercel.app/mcp (email → instant key)/compare/h100-vs-h200, /compare/gguf-q4-k-m-vs-q5-k-m, /self-host-vs-openai-api, /mcp (install docs)tokcalc is open core — the calculator and catalog are open source; the cloud/data/team features are paid.
| Asset | License | Notes |
|---|---|---|
| Source code | Apache 2.0 | This repo. Free to use, modify, distribute |
| Model/GPU/quant catalog | CC0 1.0 | Public domain data. Anyone can use, no attribution required |
| Benchmark provenance data | CC-BY-SA 4.0 | Anyone can use, but must attribute + share-alike |
| Documentation | CC-BY 4.0 | Attribution required if copied |
| "tokcalc" name + logo | Trademark | Even without formal registration, common-law rights apply |
| Cloud SaaS layer | Proprietary | Real-time pricing API, benchmark DB, team workspaces (coming soon) |
We welcome contributions! See CONTRIBUTING.md for:
tokcalc ships an MCP (Model Context Protocol) server that lets AI agents (Cursor, Claude Desktop, Cline) call tokcalc during design reviews.
npm package: @tokcalc/mcp-server (latest: v0.2.9)
Public endpoint: https://tokcalc.vercel.app/api/mcp (Streamable HTTP, bearer auth, rate-limited)
Install docs: https://tokcalc.vercel.app/mcp
| Tool | What it does |
|---|---|
estimate_capacity | VRAM/KV/throughput/latency/cost for one config |
compare_gpus | Ranked GPU comparison for one workload |
recommend_topology | TP/CP topology recommendation |
estimate_api_vs_self_host | Break-even analysis |
list_models | Discover supported model IDs |
list_gpus | Discover supported GPU IDs |
get_mlperf_benchmarks | Curated MLPerf Inference v4.1 audited reference configs |
find_config_for_slo | Inverse planner — SLOs + traffic → feasible configs ranked by cost/throughput/value |
plan_deployment | One-call decision brief — memory + perf + build-vs-buy + risks + next steps |
fetch_model_spec | Diff the catalog against live HuggingFace config.json (24h cache) |
record_measured | Store real tok/s measurements; future estimates self-calibrate |
All tools are read-only — no side effects, no cloud credentials, no deployments.
Point Cursor or Claude Desktop at the public endpoint. Get an instant API key at /mcp:
{
"mcpServers": {
"tokcalc": {
"url": "https://tokcalc.vercel.app/api/mcp",
"headers": { "Authorization": "Bearer <your-api-key>" }
}
}
}
Features:
crypto.timingSafeEqual)/mcp, get instant key (5 per IP per day limit){
"mcpServers": {
"tokcalc": {
"command": "npx",
"args": ["-y", "@tokcalc/mcp-server"]
}
}
}
No API key needed for stdio (local install). Cursor spawns the process via npx.
npm install -g @tokcalc/mcp-server
tokcalc-mcp-http # defaults to port 3000
Set MCP_API_KEY, UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN env vars for auth + rate limiting.
"I need to serve Llama 3.3 70B at 32K context for 50 concurrent users. What GPU topology do you recommend, and how much will it cost per month?"
The agent calls list_models → list_gpus → recommend_topology → estimate_capacity → returns a structured plan with VRAM, throughput, latency, cost, and confidence.
# Typecheck (must stay at zero errors)
bunx tsc --noEmit
# Golden-number suite (33 tests) — hand-verified oracle values
bun test tests/mcp-golden.test.ts
# Surface-parity suite (9 tests) — every surface advertises the same 11 tools
bun test tests/mcp-surface-parity.test.ts
# Build the npm server dist + prepublish guard (freshness + version sync)
cd mini-services/mcp-server && bun run build && node scripts/prepublish-check.js
# 35-check black-box stdio QA battery against the freshly built dist
cd ../.. && node tests/qa-live-probe.mjs local
# …or against the PUBLISHED npm tarball:
node tests/qa-live-probe.mjs 0.2.9
# 20-check HTTP smoke probe against the hosted /api/mcp surface
MCP_API_KEY=<key> EXPECTED_VERSION=0.2.9 node tests/http-smoke.mjs http://localhost:3001
# …or against production:
MCP_API_KEY=<key> node tests/http-smoke.mjs https://tokcalc.vercel.app
GitHub Actions runs all of the above (except the published-tarball mode) on every push — see .github/workflows/ci.yml.
@modelcontextprotocol/sdk v1.30.1 (Streamable HTTP transport, stateless mode)crypto.timingSafeEqual (constant-time bearer key validation)@upstash/ratelimit + @upstash/redis (sliding window, 30/min per IP, 120/min per key)tokcalc/
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ ├── mcp/route.ts # Public MCP endpoint (Streamable HTTP)
│ │ │ ├── keys/route.ts # Self-serve API key generation
│ │ │ └── pricing/ # Live GPU pricing proxies
│ │ │ ├── aws/route.ts
│ │ │ ├── azure/route.ts
│ │ │ ├── gcp/route.ts
│ │ │ └── vast-ai/route.ts
│ │ ├── compare/ # SEO landing pages
│ │ │ ├── h100-vs-h200/page.tsx
│ │ │ └── gguf-q4-k-m-vs-q5-k-m/page.tsx
│ │ ├── self-host-vs-openai-api/page.tsx
│ │ ├── mcp/page.tsx # MCP install docs + self-serve key form
│ │ ├── page.tsx # Main calculator
│ │ └── layout.tsx
│ ├── lib/
│ │ ├── mcp/
│ │ │ ├── core.ts # UNIFIED tool core — all 11 tools, both surfaces
│ │ │ ├── server.ts # thin shim → core (createMcpServer factory)
│ │ │ ├── mcp-version.ts # MCP_SERVER_VERSION — single source of truth
│ │ │ ├── mcp-store.ts # per-install store (spec cache + calibration)
│ │ │ └── auth.ts # validateApiKey (Redis + env var)
│ │ ├── token-calc.ts # Core calculation engine
│ │ ├── mlperf-curated.ts # 9 MLPerf v4.1 reference configs
│ │ ├── price-schema.ts # PriceRecord type + helpers
│ │ ├── benchmark-schema.ts # BenchmarkRecord + CalibrationResult
│ │ ├── engine-presets.ts # 5 engine presets (vLLM/SGLang/TRT-LLM/llama.cpp/generic)
│ │ └── url-state.ts # URL hash + localStorage persistence
│ └── components/
│ ├── benchmark-import.tsx # Paste JSON → calibrate against estimate
│ └── confidence-badge.tsx # 🟢🟡⚪ confidence dots
├── mini-services/
│ └── mcp-server/ # Standalone npm package (for stdio + self-hosted HTTP)
│ ├── server.ts # thin shim → src/lib/mcp/core.ts (no duplicated handlers)
│ ├── auth.ts # Bearer auth middleware (Node http)
│ ├── rate-limit.ts # Upstash rate limiter (Node http)
│ ├── http.ts # Standalone HTTP entry (tokcalc-mcp-http)
│ ├── index.ts # Stdio entry (tokcalc-mcp-server)
│ └── package.json # @tokcalc/mcp-server npm package
├── public/
│ ├── sitemap.xml # 5 URLs (/, /mcp, 3 compare pages)
│ ├── og.png # OG image
│ └── manifest.json # PWA manifest
├── server.json # MCP registry entry (packages + remotes)
├── package.json # Web app deps
└── next.config.ts
tokcalc builds on the work of:
Every formula has a citation. Every model/GPU/quant entry has a source URL where available. If you spot an unsourced claim, please open an issue.
Live demo · MCP install docs · Public MCP endpoint · npm package · Contributing · License · Code of Conduct
Made with care by the tokcalc community. Apache 2.0 licensed.