MTG mana curve calculator
Twelve one-drops, 14 two-drops, 10 three-drops, 6 four-drops and 2 five-drops make 44 cards and 104 total mana value, an average a little below two and a half. Enter your eight counts and see whether the curve stays lean. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Count 0
- 0
- Count 1
- 12
- Count 2
- 14
- Count 3
- 10
- Count 4
- 6
- Count 5
- 2
- Total cards
- 44
- Total mana value
- 104
- Average mana value
- 2.363636
- Peak mana value
- 2
This Magic: The Gathering mana curve calculator turns the count of cards at each mana value into a single average and a clear curve summary you can share with teammates or paste into notes. Deck builders, content creators, and teachers already group main-deck spells into mana-value buckets—zero through six and a seven-plus tail—because that histogram predicts how often a hand can cast on curve, whether a midrange pile is top-heavy, and how an aggro list stays lean. You type non-negative integers for each bucket; the engine multiplies every count by its mana value (using seven for the seven-plus group), divides by total cards for a stable six-decimal average, reports the peak bucket, splits low, mid, and high bands, and returns per-bucket share percentages. Classic checks include a forty-four-spell aggro curve averaging near two-point-four and a control shell whose average climbs past three.
What average mana value and curve summary mean
Average mana value answers a weighted-mean question: if every main-deck card in your tracked pool contributes its printed mana value, what is the mean cost of a randomly drawn card from that pool? Designers use that number as a compact health check—aggressive decks often land near two to two-point-five when lands are excluded or counted carefully, midrange shells climb toward three, and ramp or control lists can sit higher when expensive finishers dominate the right side of the histogram.
This calculator does not scrape deck lists or resolve card names; you already know how many cards sit at each cost, and you enter those eight counts. Zero covers free spells and any zero-mana cards you choose to include; one through six match printed mana values; seven-plus collapses every card costing seven or more into one tail bucket, and for the weighted sum each card in that tail contributes seven so the average stays deterministic and comparable across lists that only publish a histogram.
There is no Monte Carlo mulligan model here: the math is exact arithmetic on the histogram you supply.
Where mana-curve averages fit in brew, content, and tools
Players meet average-cost questions when a draft pile feels stuck on three-drops or when a Standard brew keeps missing two-mana interaction. Content creators print curve charts next to deck techs and need a single reproducible average for the caption instead of eyeballing a bar graph. Teachers introduce weighted means with cardboard: twelve one-drops and fourteen two-drops make the algebra concrete before anyone opens a spreadsheet.
Tournament grinders compare an aggro list against a midrange mirror by lining up low-curve and high-curve card counts, not only the headline average. Pair it with probability or odds helpers when you care about opening-hand distributions, and with other hobby tools when you are assembling a small lab of free, deterministic calculators for games and study.
What you can do with it
Aggro and midrange brew checks
Enter spell counts by mana value and confirm the average and peak stay inside the band you want before sleeved games.
Deck tech captions and stream overlays
Publish a reproducible average mana value and per-bucket shares next to a curve chart for readers and viewers.
FAQ
What does the MTG mana curve calculator cost?
It is free in your browser on this page.
Should I include lands?
Include whatever pool you want to score. Many builders exclude basic lands and count only spells; others include MDFCs or utility lands at their mana value. Be consistent across lists you compare.
What happens if every count is zero?
A deck needs at least one card across the eight buckets. Negatives, non-integers, and missing required fields also fail closed.
What is a good average mana value for an aggro deck?
Aggressive decks often land between two and two and a half when lands are left out. Midrange lists climb toward three, and ramp or control decks sit higher when expensive finishers fill the right side.
How is the average mana value worked out?
Each count is multiplied by its mana value, with the seven-plus group counted as seven, then the sum is divided by the number of cards. In the example, 104 divided over 44 cards gives the average.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/hobby/game-mtg-mana-curve \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"count_0":0,"count_1":12,"count_2":14,"count_3":10,"count_4":6,"count_5":2,"count_6":0,"count_7_plus":0}'const res = await fetch("https://api.kit.forhosting.com/hobby/game-mtg-mana-curve", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"count_0": 0,
"count_1": 12,
"count_2": 14,
"count_3": 10,
"count_4": 6,
"count_5": 2,
"count_6": 0,
"count_7_plus": 0
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/game-mtg-mana-curve",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"count_0": 0,
"count_1": 12,
"count_2": 14,
"count_3": 10,
"count_4": 6,
"count_5": 2,
"count_6": 0,
"count_7_plus": 0
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/game-mtg-mana-curve", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"count_0":0,"count_1":12,"count_2":14,"count_3":10,"count_4":6,"count_5":2,"count_6":0,"count_7_plus":0}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"count_0":0,"count_1":12,"count_2":14,"count_3":10,"count_4":6,"count_5":2,"count_6":0,"count_7_plus":0}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/game-mtg-mana-curve", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"count_0": 0,
"count_1": 12,
"count_2": 14,
"count_3": 10,
"count_4": 6,
"count_5": 2,
"count_6": 0,
"count_7_plus": 0
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.game_mtg_mana_curve",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
What average mana value and curve summary mean
Invalid inputs—missing fields, non-integers, negatives, empty decks, or counts above the per-bucket ceiling—fail closed with invalid_input so a typo never becomes a silent wrong average.
How counts are read, validated, and turned into shares
Empty strings and missing keys are rejected rather than treated as zero when a field is required, which keeps partial forms from under-counting a deck by accident. Peak selection is stable: the first maximum when scanning from zero upward wins, so two equal peaks report the cheaper mana value as the peak label while still exposing the full curve for charts. Low, mid, and high bands use the conventional MTG brew split—early plays, midgame spells, and top-end—so you can compare two lists at a glance without re-deriving buckets. Each field is a non-negative integer card count: count_0 through count_6 and count_7_plus. Aliases such as mv1, cmc3, or seven_plus are accepted so spreadsheets and query strings can reuse familiar names without a rename layer. Boolean true or false is never coerced into one or zero. Per-bucket counts cannot exceed the documented maximum, which keeps browser and Worker paths inside a predictable budget even if someone pastes a constructed sideboard full of nonsense. After validation the engine walks the fixed bucket list once, accumulates total cards and total mana value with ordinary integer arithmetic, then divides for the average and multiplies each count by one hundred over the total for share_pct rounded to four decimal places. Failed validation is not charged, and nothing is stored after the response returns.
Where mana-curve averages fit in brew, content, and tools
On this page the work runs entirely in your browser; through the API each successful lookup costs $0.002. That split—free interactive exploration and a priced, identical API—matches the rest of the KIT tier-A catalog and lets you move from a kitchen-table brew session to an automated pipeline without changing the mathematical result.
Integration use cases
Deterministic fixtures for deck tools
Generate stable average_mana_value and curve rows for unit tests of builders, bots, and classroom worksheets.
Technical questions
How is average mana value defined?
total_mana_value is the sum of (mana value × count) for buckets 0–6, with the 7+ bucket counted as mana value 7. average_mana_value is that sum divided by total_cards, rounded to six decimals.
How is the peak bucket chosen on a tie?
peak_count is the maximum count; peak_mana_value is the lowest mana value among buckets that achieve that maximum, so ties prefer the cheaper cost.