Docs/Skills/Income Tax Brackets Skill

Income Tax Brackets Skill

Get Federal Income Tax Bracket Data

OperationalCredits 2 per callp50 438msFinance

Overview

Income Tax Brackets works by aggregating federal income tax data from official sources including the Tax Foundation and IRS publications. Data covers all filing statuses (single, married filing jointly, married filing separately, head of household) with historical data back to 2000.

Live Test Income Tax Brackets Skill Skill →

The tool

Once your client is connected to the VerveKit server, this appears in its tool list as IncomeTaxBracketsSkill. It is read-only and open-world — it fetches and never mutates anything on your side — so most clients call it without asking you to confirm.

Tool call
{
  "name": "IncomeTaxBracketsSkill",
  "arguments": {
    "country": "US"
  }
}

You do not name the tool yourself; the model picks it. Asking about US in the terms this skill covers is enough for it to reach for IncomeTaxBracketsSkill on its own — naming it explicitly also works, and is the way to force the call.

Connecting

One server URL covers every skill in the catalog, including this one. Authorization is OAuth: the client opens a browser once, and there is no key to paste into a config file.

{
  "mcpServers": {
    "vervekit": {
      "url": "https://api.vervekit.com/v1/mcp"
    }
  }
}

Per-client setup — Claude, Cursor, VS Code, ChatGPT — is on the MCP setup page.

Arguments

These are the properties on the tool's inputSchema, so a well-behaved client validates them before the call is made. Premium arguments are accepted on every plan but only take effect on plans that include them.

ArgumentTypeDescription
countryRequiredstringThe country code (currently only 'US' is supported)
length 2–2
yearOptionalPremiumintegerThe tax year to retrieve brackets for. Defaults to the previous year.
range 2000–2030

What the model gets back

The result carries a structuredContent object matching the tool's declared outputSchema, so a client reads fields without parsing prose. status is "ok" and error is null on success; a null field means the value was not available for that input, not that the call failed.

Result
{
  "status": "ok",
  "error": null,
  "data": {
    "year": 2025,
    "country": "US",
    "type": "federal",
    "brackets": {
      "single": [
        {
          "rate": 0.1,
          "min": 0,
          "max": 11924
        },
        {
          "rate": 0.12,
          "min": 11925,
          "max": 48474
        },
        {
          "rate": 0.22,
          "min": 48475,
          "max": 103349
        },
        {
          "rate": 0.24,
          "min": 103350,
          "max": 197299
        },
        {
          "rate": 0.32,
          "min": 197300,
          "max": 250524
        },
        {
          "rate": 0.35,
          "min": 250525,
          "max": 626349
        },
        {
          "rate": 0.37,
          "min": 626350,
          "max": 999999999
        }
      ],
      "married_filing_jointly": [
        {
          "rate": 0.1,
          "min": 0,
          "max": 23849
        },
        {
          "rate": 0.12,
          "min": 23850,
          "max": 96949
        },
        {
          "rate": 0.22,
          "min": 96950,
          "max": 206699
        },
        {
          "rate": 0.24,
          "min": 206700,
          "max": 394599
        },
        {
          "rate": 0.32,
          "min": 394600,
          "max": 501049
        },
        {
          "rate": 0.35,
          "min": 501050,
          "max": 751599
        },
        {
          "rate": 0.37,
          "min": 751600,
          "max": 999999999
        }
      ],
      "married_filing_separately": [
        {
          "rate": 0.1,
          "min": 0,
          "max": 11924
        },
        {
          "rate": 0.12,
          "min": 11925,
          "max": 48474
        },
        {
          "rate": 0.22,
          "min": 48475,
          "max": 103349
        },
        {
          "rate": 0.24,
          "min": 103350,
          "max": 197299
        },
        {
          "rate": 0.32,
          "min": 197300,
          "max": 250524
        },
        {
          "rate": 0.35,
          "min": 250525,
          "max": 375799
        },
        {
          "rate": 0.37,
          "min": 375800,
          "max": 999999999
        }
      ],
      "head_of_household": [
        {
          "rate": 0.1,
          "min": 0,
          "max": 16999
        },
        {
          "rate": 0.12,
          "min": 17000,
          "max": 64849
        },
        {
          "rate": 0.22,
          "min": 64850,
          "max": 103349
        },
        {
          "rate": 0.24,
          "min": 103350,
          "max": 197299
        },
        {
          "rate": 0.32,
          "min": 197300,
          "max": 250499
        },
        {
          "rate": 0.35,
          "min": 250500,
          "max": 626349
        },
        {
          "rate": 0.37,
          "min": 626350,
          "max": 999999999
        }
      ]
    },
    "standard_deduction": {
      "single": 15000,
      "married_filing_jointly": 30000,
      "married_filing_separately": 15000,
      "head_of_household": 22500
    },
    "lastUpdated": "2026-02-07T06:02:41.898Z",
    "marriagePenalty": {
      "appliesFromRate": 0.37,
      "singleThreshold": 626350,
      "jointThreshold": 751600,
      "jointShortfall": 501100
    },
    "effectiveRateCurve": {
      "single": [
        {
          "income": 25000,
          "taxableIncome": 10000,
          "tax": 1000,
          "effectiveRate": 0.04,
          "marginalRate": 0.1
        },
        {
          "income": 50000,
          "taxableIncome": 35000,
          "tax": 3961.4,
          "effectiveRate": 0.0792,
          "marginalRate": 0.12
        },
        {
          "income": 100000,
          "taxableIncome": 85000,
          "tax": 13613.78,
          "effectiveRate": 0.1361,
          "marginalRate": 0.22
        },
        {
          "income": 250000,
          "taxableIncome": 235000,
          "tax": 52262.32,
          "effectiveRate": 0.209,
          "marginalRate": 0.32
        },
        {
          "income": 1000000,
          "taxableIncome": 985000,
          "tax": 321468.9,
          "effectiveRate": 0.3215,
          "marginalRate": 0.37
        }
      ],
      "married_filing_jointly": [
        {
          "income": 25000,
          "taxableIncome": 0,
          "tax": 0,
          "effectiveRate": 0,
          "marginalRate": 0.1
        },
        {
          "income": 50000,
          "taxableIncome": 20000,
          "tax": 2000,
          "effectiveRate": 0.04,
          "marginalRate": 0.1
        },
        {
          "income": 100000,
          "taxableIncome": 70000,
          "tax": 7922.9,
          "effectiveRate": 0.0792,
          "marginalRate": 0.12
        },
        {
          "income": 250000,
          "taxableIncome": 220000,
          "tax": 38493.56,
          "effectiveRate": 0.154,
          "marginalRate": 0.24
        },
        {
          "income": 1000000,
          "taxableIncome": 970000,
          "tax": 282961.15,
          "effectiveRate": 0.283,
          "marginalRate": 0.37
        }
      ],
      "married_filing_separately": [
        {
          "income": 25000,
          "taxableIncome": 10000,
          "tax": 1000,
          "effectiveRate": 0.04,
          "marginalRate": 0.1
        },
        {
          "income": 50000,
          "taxableIncome": 35000,
          "tax": 3961.4,
          "effectiveRate": 0.0792,
          "marginalRate": 0.12
        },
        {
          "income": 100000,
          "taxableIncome": 85000,
          "tax": 13613.78,
          "effectiveRate": 0.1361,
          "marginalRate": 0.22
        },
        {
          "income": 250000,
          "taxableIncome": 235000,
          "tax": 52262.32,
          "effectiveRate": 0.209,
          "marginalRate": 0.32
        },
        {
          "income": 1000000,
          "taxableIncome": 985000,
          "tax": 326479.9,
          "effectiveRate": 0.3265,
          "marginalRate": 0.37
        }
      ],
      "head_of_household": [
        {
          "income": 25000,
          "taxableIncome": 2500,
          "tax": 250,
          "effectiveRate": 0.01,
          "marginalRate": 0.1
        },
        {
          "income": 50000,
          "taxableIncome": 27500,
          "tax": 2959.9,
          "effectiveRate": 0.0592,
          "marginalRate": 0.12
        },
        {
          "income": 100000,
          "taxableIncome": 77500,
          "tax": 10224.78,
          "effectiveRate": 0.1022,
          "marginalRate": 0.22
        },
        {
          "income": 250000,
          "taxableIncome": 227500,
          "tax": 48123.32,
          "effectiveRate": 0.1925,
          "marginalRate": 0.32
        },
        {
          "income": 1000000,
          "taxableIncome": 977500,
          "tax": 316955.65,
          "effectiveRate": 0.317,
          "marginalRate": 0.37
        }
      ]
    },
    "changes": {
      "versusYear": 2024,
      "indexingPercent": 2.794,
      "bracketShifts": {
        "single": [
          {
            "rate": 0.12,
            "from": 11600,
            "to": 11925,
            "shiftPercent": 2.802
          },
          {
            "rate": 0.22,
            "from": 47150,
            "to": 48475,
            "shiftPercent": 2.81
          },
          {
            "rate": 0.24,
            "from": 100525,
            "to": 103350,
            "shiftPercent": 2.81
          },
          {
            "rate": 0.32,
            "from": 191950,
            "to": 197300,
            "shiftPercent": 2.787
          },
          {
            "rate": 0.35,
            "from": 243725,
            "to": 250525,
            "shiftPercent": 2.79
          },
          {
            "rate": 0.37,
            "from": 609350,
            "to": 626350,
            "shiftPercent": 2.79
          }
        ],
        "married_filing_jointly": [
          {
            "rate": 0.12,
            "from": 23200,
            "to": 23850,
            "shiftPercent": 2.802
          },
          {
            "rate": 0.22,
            "from": 94300,
            "to": 96950,
            "shiftPercent": 2.81
          },
          {
            "rate": 0.24,
            "from": 201050,
            "to": 206700,
            "shiftPercent": 2.81
          },
          {
            "rate": 0.32,
            "from": 383900,
            "to": 394600,
            "shiftPercent": 2.787
          },
          {
            "rate": 0.35,
            "from": 487450,
            "to": 501050,
            "shiftPercent": 2.79
          },
          {
            "rate": 0.37,
            "from": 731200,
            "to": 751600,
            "shiftPercent": 2.79
          }
        ],
        "married_filing_separately": [
          {
            "rate": 0.12,
            "from": 11600,
            "to": 11925,
            "shiftPercent": 2.802
          },
          {
            "rate": 0.22,
            "from": 47150,
            "to": 48475,
            "shiftPercent": 2.81
          },
          {
            "rate": 0.24,
            "from": 100525,
            "to": 103350,
            "shiftPercent": 2.81
          },
          {
            "rate": 0.32,
            "from": 191950,
            "to": 197300,
            "shiftPercent": 2.787
          },
          {
            "rate": 0.35,
            "from": 243725,
            "to": 250525,
            "shiftPercent": 2.79
          },
          {
            "rate": 0.37,
            "from": 365600,
            "to": 375800,
            "shiftPercent": 2.79
          }
        ],
        "head_of_household": [
          {
            "rate": 0.12,
            "from": 16550,
            "to": 17000,
            "shiftPercent": 2.719
          },
          {
            "rate": 0.22,
            "from": 63100,
            "to": 64850,
            "shiftPercent": 2.773
          },
          {
            "rate": 0.24,
            "from": 100500,
            "to": 103350,
            "shiftPercent": 2.836
          },
          {
            "rate": 0.32,
            "from": 191950,
            "to": 197300,
            "shiftPercent": 2.787
          },
          {
            "rate": 0.35,
            "from": 243700,
            "to": 250500,
            "shiftPercent": 2.79
          },
          {
            "rate": 0.37,
            "from": 609350,
            "to": 626350,
            "shiftPercent": 2.79
          }
        ]
      },
      "standardDeduction": {
        "single": {
          "from": 14600,
          "to": 15000,
          "change": 400,
          "changePercent": 2.74
        },
        "married_filing_jointly": {
          "from": 29200,
          "to": 30000,
          "change": 800,
          "changePercent": 2.74
        },
        "married_filing_separately": {
          "from": 14600,
          "to": 15000,
          "change": 400,
          "changePercent": 2.74
        },
        "head_of_household": {
          "from": 21900,
          "to": 22500,
          "change": 600,
          "changePercent": 2.74
        }
      }
    }
  }
}

Response fields

Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.

FieldTypeExampleDescription
yearnumber2025Tax year for the bracket data
countrystringUSCountry code for tax data
typestringfederalWhich tax the brackets describe, such as federal
bracketsobject{…}Array of tax brackets with rates and income ranges
brackets.singlearray[7]Rate bands for a single filer
brackets.single.0.ratenumber0.1Marginal rate for the band
brackets.single.0.minnumber0Income at which the band starts
brackets.single.0.maxnumber11924Income at which the band ends; null for the top band
brackets.married_filing_jointlyarray[7]Rate bands for married filers filing jointly
brackets.married_filing_jointly.0.ratenumber0.1Marginal rate for the band
brackets.married_filing_jointly.0.minnumber0Income at which the band starts
brackets.married_filing_jointly.0.maxnumber23849Income at which the band ends; null for the top band
brackets.married_filing_separatelyarray[7]Rate bands for married filers filing separately
brackets.married_filing_separately.0.ratenumber0.1Marginal rate for the band
brackets.married_filing_separately.0.minnumber0Income at which the band starts
brackets.married_filing_separately.0.maxnumber11924Income at which the band ends; null for the top band
brackets.head_of_householdarray[7]Rate bands for a head of household filer
brackets.head_of_household.0.ratenumber0.1Marginal rate for the band
brackets.head_of_household.0.minnumber0Income at which the band starts
brackets.head_of_household.0.maxnumber16999Income at which the band ends; null for the top band
standard_deductionobject{…}Standard deduction amounts by filing status
standard_deduction.singlenumber15000
standard_deduction.married_filing_jointlynumber30000
standard_deduction.married_filing_separatelynumber15000
standard_deduction.head_of_householdnumber22500
lastUpdatedstring2026-02-07T06:02:41.898ZWhen the bracket table was last refreshed
marriagePenaltyPremiumobject{…}Where filing jointly stops being worth twice a single filer's thresholds; null when the schedule doubles all the way up
marriagePenalty.appliesFromRatePremiumnumber0.37The rate band at which the doubling first breaks
marriagePenalty.singleThresholdPremiumnumber626350Income at which a single filer enters that band
marriagePenalty.jointThresholdPremiumnumber751600Income at which a couple filing jointly enters the same band
marriagePenalty.jointShortfallPremiumnumber501100How far the joint threshold falls short of twice the single threshold
effectiveRateCurvePremiumobject{…}Effective and marginal rate at a fixed ladder of incomes, for each filing status, showing the shape of the schedule
effectiveRateCurve.singlePremiumarray[5]
effectiveRateCurve.single.0.incomePremiumnumber25000
effectiveRateCurve.single.0.taxableIncomePremiumnumber10000
effectiveRateCurve.single.0.taxPremiumnumber1000
effectiveRateCurve.single.0.effectiveRatePremiumnumber0.04
effectiveRateCurve.single.0.marginalRatePremiumnumber0.1
effectiveRateCurve.married_filing_jointlyPremiumarray[5]
effectiveRateCurve.married_filing_jointly.0.incomePremiumnumber25000
effectiveRateCurve.married_filing_jointly.0.taxableIncomePremiumnumber0
effectiveRateCurve.married_filing_jointly.0.taxPremiumnumber0
effectiveRateCurve.married_filing_jointly.0.effectiveRatePremiumnumber0
effectiveRateCurve.married_filing_jointly.0.marginalRatePremiumnumber0.1
effectiveRateCurve.married_filing_separatelyPremiumarray[5]
effectiveRateCurve.married_filing_separately.0.incomePremiumnumber25000
effectiveRateCurve.married_filing_separately.0.taxableIncomePremiumnumber10000
effectiveRateCurve.married_filing_separately.0.taxPremiumnumber1000
effectiveRateCurve.married_filing_separately.0.effectiveRatePremiumnumber0.04
effectiveRateCurve.married_filing_separately.0.marginalRatePremiumnumber0.1
effectiveRateCurve.head_of_householdPremiumarray[5]
effectiveRateCurve.head_of_household.0.incomePremiumnumber25000
effectiveRateCurve.head_of_household.0.taxableIncomePremiumnumber2500
effectiveRateCurve.head_of_household.0.taxPremiumnumber250
effectiveRateCurve.head_of_household.0.effectiveRatePremiumnumber0.01
effectiveRateCurve.head_of_household.0.marginalRatePremiumnumber0.1
changesPremiumobject{…}How the table moved since the previous tax year; null when there is no prior year to compare against
changes.versusYearPremiumnumber2024The tax year being compared against
changes.indexingPercentPremiumnumber2.794Average shift across every indexed threshold, which is the inflation adjustment the tax authority actually applied
changes.bracketShiftsPremiumobject{…}Each band's threshold before and after, per filing status, with the percentage it moved
changes.bracketShifts.singlePremiumarray[6]
changes.bracketShifts.single.0.ratePremiumnumber0.12
changes.bracketShifts.single.0.fromPremiumnumber11600
changes.bracketShifts.single.0.toPremiumnumber11925
changes.bracketShifts.single.0.shiftPercentPremiumnumber2.802
changes.bracketShifts.married_filing_jointlyPremiumarray[6]
changes.bracketShifts.married_filing_jointly.0.ratePremiumnumber0.12
changes.bracketShifts.married_filing_jointly.0.fromPremiumnumber23200
changes.bracketShifts.married_filing_jointly.0.toPremiumnumber23850
changes.bracketShifts.married_filing_jointly.0.shiftPercentPremiumnumber2.802
changes.bracketShifts.married_filing_separatelyPremiumarray[6]
changes.bracketShifts.married_filing_separately.0.ratePremiumnumber0.12
changes.bracketShifts.married_filing_separately.0.fromPremiumnumber11600
changes.bracketShifts.married_filing_separately.0.toPremiumnumber11925
changes.bracketShifts.married_filing_separately.0.shiftPercentPremiumnumber2.802
changes.bracketShifts.head_of_householdPremiumarray[6]
changes.bracketShifts.head_of_household.0.ratePremiumnumber0.12
changes.bracketShifts.head_of_household.0.fromPremiumnumber16550
changes.bracketShifts.head_of_household.0.toPremiumnumber17000
changes.bracketShifts.head_of_household.0.shiftPercentPremiumnumber2.719

Failure modes

Errors come back as tool errors carrying a sentence the model can act on, not a bare status code. Error handling covers the full list.

StatusWhat it means
400 / 422The arguments did not validate. The message names the offending one.
401The OAuth session is invalid or expired — reconnect the server.
403Blocked by a key restriction or an IP allow-list. Never a bad identity.
404This skill is not part of VerveKit. Check the catalog.
429Out of credits, or a brief rate limit. The message tells them apart.

A call costs 2 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.

Use cases

Payroll Withholding Engine
Payroll software matches employee gross pay against standard deductions and marginal rates to compute accurate federal tax withholdings.
Retirement Income Planning
When modeling pension and 401(k) drawdowns, financial advisory tools test projected distributions against married filing jointly brackets.
Mortgage Underwriting Review
Determine net monthly borrower income by evaluating gross salaries against federal deduction thresholds and rate tiers during credit assessments.
Tax Audit Reviews
Accounting platforms audit amended tax returns by checking declared earnings against historical rate bands and deduction amounts.

Other ways to use Income Tax Brackets Skill

Set up Income Tax Brackets Skill on VerveKit, or reach the same source a different way. Your VerveKit account and credits work on all of them — one key, one balance.

Call it as a REST APIOne HTTPS endpoint and an x-api-key header, with SDKs for Node, Python and .NET.APIVerve →Reference →
Google Sheets or ExcelA =VERVE() formula fills a column — no script, no export, recalculates in place.VerveSheets →Reference →
Ground an agent on itA cited, machine-checkable fact your model can't produce on its own.VerveContext →Reference →

More in Finance:

Was this page helpful?