@markcolabs/mcp 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +9 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -285
- package/dist/index.js.map +1 -1
- package/package.json +7 -12
- package/LICENSE-API.md +0 -111
- package/dist/disclaimers/ymyl.d.ts +0 -16
- package/dist/disclaimers/ymyl.d.ts.map +0 -1
- package/dist/disclaimers/ymyl.js +0 -20
- package/dist/disclaimers/ymyl.js.map +0 -1
- package/dist/engines/compoundInterest.d.ts +0 -75
- package/dist/engines/compoundInterest.d.ts.map +0 -1
- package/dist/engines/compoundInterest.js +0 -74
- package/dist/engines/compoundInterest.js.map +0 -1
- package/dist/engines/data/federalTax.d.ts +0 -47
- package/dist/engines/data/federalTax.d.ts.map +0 -1
- package/dist/engines/data/federalTax.js +0 -111
- package/dist/engines/data/federalTax.js.map +0 -1
- package/dist/engines/data/irs2026.d.ts +0 -137
- package/dist/engines/data/irs2026.d.ts.map +0 -1
- package/dist/engines/data/irs2026.js +0 -113
- package/dist/engines/data/irs2026.js.map +0 -1
- package/dist/engines/data/rmd2026.d.ts +0 -59
- package/dist/engines/data/rmd2026.d.ts.map +0 -1
- package/dist/engines/data/rmd2026.js +0 -75
- package/dist/engines/data/rmd2026.js.map +0 -1
- package/dist/engines/data/ssa.d.ts +0 -39
- package/dist/engines/data/ssa.d.ts.map +0 -1
- package/dist/engines/data/ssa.js +0 -55
- package/dist/engines/data/ssa.js.map +0 -1
- package/dist/engines/data/stateTax2026.d.ts +0 -114
- package/dist/engines/data/stateTax2026.d.ts.map +0 -1
- package/dist/engines/data/stateTax2026.js +0 -348
- package/dist/engines/data/stateTax2026.js.map +0 -1
- package/dist/engines/hsa.d.ts +0 -110
- package/dist/engines/hsa.d.ts.map +0 -1
- package/dist/engines/hsa.js +0 -83
- package/dist/engines/hsa.js.map +0 -1
- package/dist/engines/ira.d.ts +0 -115
- package/dist/engines/ira.d.ts.map +0 -1
- package/dist/engines/ira.js +0 -127
- package/dist/engines/ira.js.map +0 -1
- package/dist/engines/mortgage.d.ts +0 -70
- package/dist/engines/mortgage.d.ts.map +0 -1
- package/dist/engines/mortgage.js +0 -60
- package/dist/engines/mortgage.js.map +0 -1
- package/dist/engines/paycheck.d.ts +0 -128
- package/dist/engines/paycheck.d.ts.map +0 -1
- package/dist/engines/paycheck.js +0 -142
- package/dist/engines/paycheck.js.map +0 -1
- package/dist/engines/retirement401k.d.ts +0 -109
- package/dist/engines/retirement401k.d.ts.map +0 -1
- package/dist/engines/retirement401k.js +0 -130
- package/dist/engines/retirement401k.js.map +0 -1
- package/dist/engines/rmd.d.ts +0 -107
- package/dist/engines/rmd.d.ts.map +0 -1
- package/dist/engines/rmd.js +0 -109
- package/dist/engines/rmd.js.map +0 -1
- package/dist/engines/rothConversion.d.ts +0 -124
- package/dist/engines/rothConversion.d.ts.map +0 -1
- package/dist/engines/rothConversion.js +0 -145
- package/dist/engines/rothConversion.js.map +0 -1
- package/dist/engines/socialSecurity.d.ts +0 -63
- package/dist/engines/socialSecurity.d.ts.map +0 -1
- package/dist/engines/socialSecurity.js +0 -139
- package/dist/engines/socialSecurity.js.map +0 -1
- package/dist/envelope.d.ts +0 -76
- package/dist/envelope.d.ts.map +0 -1
- package/dist/envelope.js +0 -34
- package/dist/envelope.js.map +0 -1
- package/dist/shared/bounds.d.ts +0 -133
- package/dist/shared/bounds.d.ts.map +0 -1
- package/dist/shared/bounds.js +0 -206
- package/dist/shared/bounds.js.map +0 -1
- package/dist/tools/compoundInterest.d.ts +0 -48
- package/dist/tools/compoundInterest.d.ts.map +0 -1
- package/dist/tools/compoundInterest.js +0 -107
- package/dist/tools/compoundInterest.js.map +0 -1
- package/dist/tools/hsa.d.ts +0 -58
- package/dist/tools/hsa.d.ts.map +0 -1
- package/dist/tools/hsa.js +0 -129
- package/dist/tools/hsa.js.map +0 -1
- package/dist/tools/ira.d.ts +0 -55
- package/dist/tools/ira.d.ts.map +0 -1
- package/dist/tools/ira.js +0 -117
- package/dist/tools/ira.js.map +0 -1
- package/dist/tools/mortgage.d.ts +0 -51
- package/dist/tools/mortgage.d.ts.map +0 -1
- package/dist/tools/mortgage.js +0 -112
- package/dist/tools/mortgage.js.map +0 -1
- package/dist/tools/paycheck.d.ts +0 -61
- package/dist/tools/paycheck.d.ts.map +0 -1
- package/dist/tools/paycheck.js +0 -135
- package/dist/tools/paycheck.js.map +0 -1
- package/dist/tools/retirement401k.d.ts +0 -85
- package/dist/tools/retirement401k.d.ts.map +0 -1
- package/dist/tools/retirement401k.js +0 -141
- package/dist/tools/retirement401k.js.map +0 -1
- package/dist/tools/rmd.d.ts +0 -60
- package/dist/tools/rmd.d.ts.map +0 -1
- package/dist/tools/rmd.js +0 -130
- package/dist/tools/rmd.js.map +0 -1
- package/dist/tools/rothConversion.d.ts +0 -66
- package/dist/tools/rothConversion.d.ts.map +0 -1
- package/dist/tools/rothConversion.js +0 -141
- package/dist/tools/rothConversion.js.map +0 -1
- package/dist/tools/socialSecurity.d.ts +0 -51
- package/dist/tools/socialSecurity.d.ts.map +0 -1
- package/dist/tools/socialSecurity.js +0 -117
- package/dist/tools/socialSecurity.js.map +0 -1
- package/dist/util/zod-to-json-schema.d.ts +0 -28
- package/dist/util/zod-to-json-schema.d.ts.map +0 -1
- package/dist/util/zod-to-json-schema.js +0 -98
- package/dist/util/zod-to-json-schema.js.map +0 -1
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IRS Uniform Lifetime Table (Pub. 590-B Table III, post-2022 version) and
|
|
3
|
-
* SECURE 2.0 RMD-start-age tiers for the MCP `rmd` engine.
|
|
4
|
-
*
|
|
5
|
-
* Mirrored from site/src/utils/rmd-engine.js — `UNIFORM_LIFETIME_TABLE` and
|
|
6
|
-
* `getRMDStartAge`. Following the same mirror pattern as other data modules
|
|
7
|
-
* (engines/data/ssa.ts, engines/data/irs2026.ts): keep self-contained so the
|
|
8
|
-
* npm package has no runtime dependency on the site `src/` tree.
|
|
9
|
-
*
|
|
10
|
-
* NOTE: The site rmd-engine.js currently uses ONLY the Uniform Lifetime
|
|
11
|
-
* Table — the Joint Life Expectancy Table (Pub. 590-B Table II, applied
|
|
12
|
-
* when spouse is sole beneficiary AND 10+ years younger) is NOT implemented
|
|
13
|
-
* in the site source. To stay 1:1 with the site for parity-test correctness,
|
|
14
|
-
* the MCP RMD tool also exposes ONLY the Uniform Lifetime path. The
|
|
15
|
-
* `tableUsed` field in the result is always `"uniform-lifetime"` for v1.
|
|
16
|
-
* If Joint Life is added to the site engine later, both sides bump in
|
|
17
|
-
* lockstep.
|
|
18
|
-
*
|
|
19
|
-
* Source: IRS Publication 590-B (2024/2025) + SECURE 2.0 Act §107 (RMD age
|
|
20
|
-
* tier: pre-1951 → 70.5, 1951-1959 → 73, 1960+ → 75).
|
|
21
|
-
* SECURE 2.0 §302 reduced the missed-RMD excise tax from 50% to 25%
|
|
22
|
-
* (and to 10% if corrected within the IRS correction window).
|
|
23
|
-
* Last verified: 2026-05-27.
|
|
24
|
-
*/
|
|
25
|
-
/**
|
|
26
|
-
* IRS Uniform Lifetime Table (Table III) — post-2022 version per Pub. 590-B.
|
|
27
|
-
* Keys are integer ages 72-120; values are distribution-period factors (years).
|
|
28
|
-
* RMD = balance / distributionPeriod.
|
|
29
|
-
*/
|
|
30
|
-
export const UNIFORM_LIFETIME_TABLE_2026 = {
|
|
31
|
-
72: 27.4, 73: 26.5, 74: 25.5, 75: 24.6, 76: 23.7, 77: 22.9,
|
|
32
|
-
78: 22.0, 79: 21.1, 80: 20.2, 81: 19.4, 82: 18.5, 83: 17.7,
|
|
33
|
-
84: 16.8, 85: 16.0, 86: 15.2, 87: 14.4, 88: 13.7, 89: 12.9,
|
|
34
|
-
90: 12.2, 91: 11.5, 92: 10.8, 93: 10.1, 94: 9.5, 95: 8.9,
|
|
35
|
-
96: 8.4, 97: 7.8, 98: 7.3, 99: 6.8, 100: 6.4, 101: 6.0,
|
|
36
|
-
102: 5.6, 103: 5.2, 104: 4.9, 105: 4.6, 106: 4.3, 107: 4.1,
|
|
37
|
-
108: 3.9, 109: 3.7, 110: 3.5, 111: 3.4, 112: 3.3, 113: 3.1,
|
|
38
|
-
114: 3.0, 115: 2.9, 116: 2.8, 117: 2.7, 118: 2.5, 119: 2.3,
|
|
39
|
-
120: 2.0,
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Lowest age in the Uniform Lifetime Table. RMD requests below this age are
|
|
43
|
-
* either pre-RMD (caller error) or use the lower bound (72) clamp matching
|
|
44
|
-
* the site's `getDistributionPeriod` behavior. The MCP tool prefers an
|
|
45
|
-
* INPUT_VALIDATION error for ages below the SECURE-2.0 floor (73 for the
|
|
46
|
-
* common 1951-1959 cohort).
|
|
47
|
-
*/
|
|
48
|
-
export const UNIFORM_LIFETIME_MIN_AGE = 72;
|
|
49
|
-
/** Highest age in the Uniform Lifetime Table — clamps lookups for age > 120. */
|
|
50
|
-
export const UNIFORM_LIFETIME_MAX_AGE = 120;
|
|
51
|
-
/**
|
|
52
|
-
* SECURE 2.0 RMD-start-age tiers (verbatim port of site `getRMDStartAge`).
|
|
53
|
-
* - Born ≤ 1950 → 70.5 (legacy, pre-SECURE-Act)
|
|
54
|
-
* - Born 1951-1959 → 73 (SECURE 2.0 §107 phase 1)
|
|
55
|
-
* - Born ≥ 1960 → 75 (SECURE 2.0 §107 phase 2, effective 2033)
|
|
56
|
-
*/
|
|
57
|
-
export function getRmdStartAge(birthYear) {
|
|
58
|
-
if (birthYear <= 1950)
|
|
59
|
-
return 70.5;
|
|
60
|
-
if (birthYear <= 1959)
|
|
61
|
-
return 73;
|
|
62
|
-
return 75;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* SECURE 2.0 §302 missed-RMD excise tax (reduced from 50% pre-2023).
|
|
66
|
-
* - 25% on the under-distributed amount (default)
|
|
67
|
-
* - 10% if corrected within the IRS correction window (typically 2 years)
|
|
68
|
-
* Surfaced as an informational field in the RMD result so callers can warn
|
|
69
|
-
* users about the cost of missing the deadline.
|
|
70
|
-
*/
|
|
71
|
-
export const RMD_MISSED_EXCISE_RATE = 0.25;
|
|
72
|
-
export const RMD_MISSED_EXCISE_RATE_IF_CORRECTED = 0.10;
|
|
73
|
-
/** Stable provenance string for `result.meta.source`. */
|
|
74
|
-
export const RMD_TABLE_SOURCE = "IRS Publication 590-B (Uniform Lifetime Table III, post-2022); SECURE 2.0 Act §107 (RMD age tiers); §302 (25% excise tax)";
|
|
75
|
-
//# sourceMappingURL=rmd2026.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rmd2026.js","sourceRoot":"","sources":["../../../src/engines/data/rmd2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAqC;IAC3E,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;IACxD,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IACtD,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG;CACA,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC;AAExD,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAC3B,2HAA2H,CAAC"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Self-contained SSA constants subset for the @markcolabs/mcp package.
|
|
3
|
-
*
|
|
4
|
-
* Mirrored from site/src/data/annual-limits.js and site/src/utils/social-security-engine.js
|
|
5
|
-
* (re-export-of-truth pattern). Per ADR-0039 § 5 + S136 kickoff: the npm-published
|
|
6
|
-
* MCP package may NOT import from site/src/ at runtime, so the regulatory data
|
|
7
|
-
* subset that the SS engine depends on is mirrored here. When site values change,
|
|
8
|
-
* update this file in lockstep with the source and bump the SS engine ENGINE_VERSION.
|
|
9
|
-
*
|
|
10
|
-
* Source of truth: site/src/data/annual-limits.js
|
|
11
|
-
* - SSA_BEND_POINTS keyed by eligibility year (year a person turns 62)
|
|
12
|
-
* - SS_WAGE_BASE keyed by calendar year (max earnings subject to SS tax)
|
|
13
|
-
* Source: SSA Fact Sheet, https://www.ssa.gov/oact/cola/cbb.html
|
|
14
|
-
* SSA Bend Points history, https://www.ssa.gov/oact/cola/bendpoints.html
|
|
15
|
-
*
|
|
16
|
-
* Last verified: 2026-05-09 (matches site annual-limits.js verification dates).
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Average Wage Indexing series bend points by eligibility year.
|
|
20
|
-
* Eligibility year = year person turns 62.
|
|
21
|
-
*
|
|
22
|
-
* Subset includes 2014–2026; older years are not needed for current users
|
|
23
|
-
* (someone born in 1952 turned 62 in 2014; older birthdays use even-older bend
|
|
24
|
-
* points but the SS engine accepts anything in the lookup, falling back to the
|
|
25
|
-
* latest available year with `estimated: true`).
|
|
26
|
-
*/
|
|
27
|
-
export declare const SSA_BEND_POINTS: Record<number, {
|
|
28
|
-
first: number;
|
|
29
|
-
second: number;
|
|
30
|
-
}>;
|
|
31
|
-
/**
|
|
32
|
-
* Social Security wage base by calendar year (max earnings subject to SS tax).
|
|
33
|
-
*/
|
|
34
|
-
export declare const SS_WAGE_BASE: Record<number, number>;
|
|
35
|
-
/**
|
|
36
|
-
* Default life expectancy used by lifetime-benefit projections (SSA actuarial table proxy).
|
|
37
|
-
*/
|
|
38
|
-
export declare const DEFAULT_LIFE_EXPECTANCY = 85;
|
|
39
|
-
//# sourceMappingURL=ssa.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ssa.d.ts","sourceRoot":"","sources":["../../../src/engines/data/ssa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAc7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC"}
|
package/dist/engines/data/ssa.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Self-contained SSA constants subset for the @markcolabs/mcp package.
|
|
3
|
-
*
|
|
4
|
-
* Mirrored from site/src/data/annual-limits.js and site/src/utils/social-security-engine.js
|
|
5
|
-
* (re-export-of-truth pattern). Per ADR-0039 § 5 + S136 kickoff: the npm-published
|
|
6
|
-
* MCP package may NOT import from site/src/ at runtime, so the regulatory data
|
|
7
|
-
* subset that the SS engine depends on is mirrored here. When site values change,
|
|
8
|
-
* update this file in lockstep with the source and bump the SS engine ENGINE_VERSION.
|
|
9
|
-
*
|
|
10
|
-
* Source of truth: site/src/data/annual-limits.js
|
|
11
|
-
* - SSA_BEND_POINTS keyed by eligibility year (year a person turns 62)
|
|
12
|
-
* - SS_WAGE_BASE keyed by calendar year (max earnings subject to SS tax)
|
|
13
|
-
* Source: SSA Fact Sheet, https://www.ssa.gov/oact/cola/cbb.html
|
|
14
|
-
* SSA Bend Points history, https://www.ssa.gov/oact/cola/bendpoints.html
|
|
15
|
-
*
|
|
16
|
-
* Last verified: 2026-05-09 (matches site annual-limits.js verification dates).
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Average Wage Indexing series bend points by eligibility year.
|
|
20
|
-
* Eligibility year = year person turns 62.
|
|
21
|
-
*
|
|
22
|
-
* Subset includes 2014–2026; older years are not needed for current users
|
|
23
|
-
* (someone born in 1952 turned 62 in 2014; older birthdays use even-older bend
|
|
24
|
-
* points but the SS engine accepts anything in the lookup, falling back to the
|
|
25
|
-
* latest available year with `estimated: true`).
|
|
26
|
-
*/
|
|
27
|
-
export const SSA_BEND_POINTS = {
|
|
28
|
-
2014: { first: 816, second: 4917 },
|
|
29
|
-
2015: { first: 826, second: 4980 },
|
|
30
|
-
2016: { first: 856, second: 5157 },
|
|
31
|
-
2017: { first: 885, second: 5336 },
|
|
32
|
-
2018: { first: 895, second: 5397 },
|
|
33
|
-
2019: { first: 926, second: 5583 },
|
|
34
|
-
2020: { first: 960, second: 5785 },
|
|
35
|
-
2021: { first: 996, second: 6002 },
|
|
36
|
-
2022: { first: 1024, second: 6172 },
|
|
37
|
-
2023: { first: 1115, second: 6721 },
|
|
38
|
-
2024: { first: 1174, second: 7078 },
|
|
39
|
-
2025: { first: 1226, second: 7391 },
|
|
40
|
-
2026: { first: 1286, second: 7749 },
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Social Security wage base by calendar year (max earnings subject to SS tax).
|
|
44
|
-
*/
|
|
45
|
-
export const SS_WAGE_BASE = {
|
|
46
|
-
2025: 176_100,
|
|
47
|
-
2026: 176_100, // SSA Fact Sheet 2026 (verified AL-2026-001, S134)
|
|
48
|
-
2027: 180_000, // Projected
|
|
49
|
-
2028: 184_000, // Projected
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Default life expectancy used by lifetime-benefit projections (SSA actuarial table proxy).
|
|
53
|
-
*/
|
|
54
|
-
export const DEFAULT_LIFE_EXPECTANCY = 85;
|
|
55
|
-
//# sourceMappingURL=ssa.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ssa.js","sourceRoot":"","sources":["../../../src/engines/data/ssa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACpC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO,EAAE,mDAAmD;IAClE,IAAI,EAAE,OAAO,EAAE,YAAY;IAC3B,IAAI,EAAE,OAAO,EAAE,YAAY;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Self-contained 2026 state-income-tax effective-rate table for the
|
|
3
|
-
* `@markcolabs/mcp` paycheck engine (MCP-AUDIT-011 fix, S141 Item #5).
|
|
4
|
-
*
|
|
5
|
-
* ## Why this exists
|
|
6
|
-
*
|
|
7
|
-
* v0.2.x of the paycheck engine returned a flat 5% state-tax estimate for
|
|
8
|
-
* every income-tax state. For HCOL states (CA top 13.3%, NY top 10.9%, HI
|
|
9
|
-
* top 11%) this was materially wrong — a $1M earner in CA was under-taxed by
|
|
10
|
-
* ~$85k. Documented as a known limitation but YMYL exposure was significant.
|
|
11
|
-
*
|
|
12
|
-
* v0.3.0 replaces the flat estimate with a state-aware effective-rate lookup
|
|
13
|
-
* using marginal-bracket simplification: for each state we precompute a
|
|
14
|
-
* **top-of-bracket effective rate** for several income tiers and pick the
|
|
15
|
-
* tier that brackets the caller's taxable income. This is not a full per-state
|
|
16
|
-
* bracket simulation (out of scope per kickoff) but materially correct for
|
|
17
|
-
* the common HCOL cases that drove the original finding.
|
|
18
|
-
*
|
|
19
|
-
* The site source for the rate data is `site/src/data/tax-tables/` for the
|
|
20
|
-
* three states the site engine models (CA, NY, TX). For the remaining 38
|
|
21
|
-
* income-tax states this module is the canonical mirror — the data is
|
|
22
|
-
* sourced from the Tax Foundation 2026 State Individual Income Tax Rates
|
|
23
|
-
* report (a citable, annually-updated authority).
|
|
24
|
-
*
|
|
25
|
-
* ## Simplification per kickoff
|
|
26
|
-
*
|
|
27
|
-
* Income tiers used for effective-rate lookup:
|
|
28
|
-
* - tier 1: taxable < $50,000 (most filers)
|
|
29
|
-
* - tier 2: taxable < $100,000 (median-to-upper-middle)
|
|
30
|
-
* - tier 3: taxable < $250,000 (HCOL professionals)
|
|
31
|
-
* - tier 4: taxable < $500,000 (high earners)
|
|
32
|
-
* - tier 5: taxable >= $500,000 (top-bracket)
|
|
33
|
-
*
|
|
34
|
-
* The rate at each tier is the **effective** rate (not the marginal top rate)
|
|
35
|
-
* for a hypothetical filer at the top of that tier, accounting for the
|
|
36
|
-
* weighted average across the state's progressive brackets. Flat-rate states
|
|
37
|
-
* use the same rate at every tier. No-income-tax states are omitted (handled
|
|
38
|
-
* by `NO_TAX_STATES` in `federalTax.ts`).
|
|
39
|
-
*
|
|
40
|
-
* ## Source
|
|
41
|
-
*
|
|
42
|
-
* Tax Foundation 2026 State Individual Income Tax Rates and Brackets,
|
|
43
|
-
* effective Jan 1 2026 (with 2026 inflation adjustments where applicable).
|
|
44
|
-
*
|
|
45
|
-
* Last verified: 2026-05-27 (S141 Item #5).
|
|
46
|
-
*
|
|
47
|
-
* @see MCP-AUDIT-011 — Paycheck flat 5% state-tax estimate
|
|
48
|
-
* @see docs/Claude/Architecture/ADR/ADR-0039 § 5 — engine SemVer policy
|
|
49
|
-
*/
|
|
50
|
-
export interface StateTaxDataMeta {
|
|
51
|
-
/** Citable source for the rate data (annual Tax Foundation report). */
|
|
52
|
-
source: string;
|
|
53
|
-
/** ISO date of last verification against the source. */
|
|
54
|
-
lastVerified: string;
|
|
55
|
-
/** Effective tax year these rates apply to. */
|
|
56
|
-
taxYear: number;
|
|
57
|
-
/** Methodology note for callers. */
|
|
58
|
-
methodology: string;
|
|
59
|
-
}
|
|
60
|
-
export declare const STATE_TAX_2026_META: StateTaxDataMeta;
|
|
61
|
-
/** Income tiers for effective-rate lookup. */
|
|
62
|
-
export type StateTaxIncomeTier = "under50k" | "under100k" | "under250k" | "under500k" | "over500k";
|
|
63
|
-
/** Effective rates by income tier for one state. */
|
|
64
|
-
export interface StateEffectiveRates {
|
|
65
|
-
/** Two-letter state code. */
|
|
66
|
-
stateCode: string;
|
|
67
|
-
/** Full state name (for diagnostics). */
|
|
68
|
-
stateName: string;
|
|
69
|
-
/** Effective rates expressed as decimals (0.093 = 9.3%). */
|
|
70
|
-
rates: Record<StateTaxIncomeTier, number>;
|
|
71
|
-
/**
|
|
72
|
-
* Notes about quirks (local-tax piggybacks excluded, SDI excluded, etc.).
|
|
73
|
-
* Surface in `_meta` if non-empty.
|
|
74
|
-
*/
|
|
75
|
-
notes?: string;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Pick the income tier appropriate for a given taxable income.
|
|
79
|
-
* Uses left-inclusive boundaries.
|
|
80
|
-
*/
|
|
81
|
-
export declare function pickIncomeTier(taxableIncome: number): StateTaxIncomeTier;
|
|
82
|
-
/**
|
|
83
|
-
* 2026 state effective tax rates (decimals) by income tier.
|
|
84
|
-
*
|
|
85
|
-
* NOT INCLUDED (handled by NO_TAX_STATES in federalTax.ts):
|
|
86
|
-
* AK, FL, NV, NH, SD, TN, TX, WA, WY
|
|
87
|
-
*
|
|
88
|
-
* NH currently taxes only interest/dividends (phased out for wages 2025+),
|
|
89
|
-
* treated as no-tax for wage income.
|
|
90
|
-
*
|
|
91
|
-
* Rates rounded to four decimal places. Local-income-tax piggybacks (NYC,
|
|
92
|
-
* Yonkers, PA municipal EIT) NOT included — surfaced as a `notes` warning
|
|
93
|
-
* for impacted states. State Disability Insurance (CA SDI, NY SDI, NJ SDI)
|
|
94
|
-
* is not income tax and is NOT included.
|
|
95
|
-
*/
|
|
96
|
-
export declare const STATE_EFFECTIVE_RATES_2026: Record<string, StateEffectiveRates>;
|
|
97
|
-
/**
|
|
98
|
-
* Look up the effective state income-tax rate for a given state and taxable income.
|
|
99
|
-
*
|
|
100
|
-
* Returns 0 for no-income-tax states (caller should also check NO_TAX_STATES).
|
|
101
|
-
* Returns 0 for unknown state codes (defensive fallback — caller already validated
|
|
102
|
-
* 2-letter format at the Zod schema layer; this guards against typos that pass
|
|
103
|
-
* Zod but aren't in our table).
|
|
104
|
-
*
|
|
105
|
-
* @param stateCode 2-letter US state code (uppercase)
|
|
106
|
-
* @param taxableIncome Annual taxable income in USD (post-federal-standard-deduction basis)
|
|
107
|
-
* @returns Decimal effective rate (e.g., 0.093 for 9.3%); 0 if state not modeled
|
|
108
|
-
*/
|
|
109
|
-
export declare function getStateEffectiveRate(stateCode: string, taxableIncome: number): number;
|
|
110
|
-
/**
|
|
111
|
-
* Get the full state data entry (for surfacing `notes` in the tool envelope).
|
|
112
|
-
*/
|
|
113
|
-
export declare function getStateEntry(stateCode: string): StateEffectiveRates | undefined;
|
|
114
|
-
//# sourceMappingURL=stateTax2026.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stateTax2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/stateTax2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAOjC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,WAAW,GACX,WAAW,GACX,WAAW,GACX,UAAU,CAAC;AAEf,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC1C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAMxE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CA4O1E,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAChB,mBAAmB,GAAG,SAAS,CAEjC"}
|
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Self-contained 2026 state-income-tax effective-rate table for the
|
|
3
|
-
* `@markcolabs/mcp` paycheck engine (MCP-AUDIT-011 fix, S141 Item #5).
|
|
4
|
-
*
|
|
5
|
-
* ## Why this exists
|
|
6
|
-
*
|
|
7
|
-
* v0.2.x of the paycheck engine returned a flat 5% state-tax estimate for
|
|
8
|
-
* every income-tax state. For HCOL states (CA top 13.3%, NY top 10.9%, HI
|
|
9
|
-
* top 11%) this was materially wrong — a $1M earner in CA was under-taxed by
|
|
10
|
-
* ~$85k. Documented as a known limitation but YMYL exposure was significant.
|
|
11
|
-
*
|
|
12
|
-
* v0.3.0 replaces the flat estimate with a state-aware effective-rate lookup
|
|
13
|
-
* using marginal-bracket simplification: for each state we precompute a
|
|
14
|
-
* **top-of-bracket effective rate** for several income tiers and pick the
|
|
15
|
-
* tier that brackets the caller's taxable income. This is not a full per-state
|
|
16
|
-
* bracket simulation (out of scope per kickoff) but materially correct for
|
|
17
|
-
* the common HCOL cases that drove the original finding.
|
|
18
|
-
*
|
|
19
|
-
* The site source for the rate data is `site/src/data/tax-tables/` for the
|
|
20
|
-
* three states the site engine models (CA, NY, TX). For the remaining 38
|
|
21
|
-
* income-tax states this module is the canonical mirror — the data is
|
|
22
|
-
* sourced from the Tax Foundation 2026 State Individual Income Tax Rates
|
|
23
|
-
* report (a citable, annually-updated authority).
|
|
24
|
-
*
|
|
25
|
-
* ## Simplification per kickoff
|
|
26
|
-
*
|
|
27
|
-
* Income tiers used for effective-rate lookup:
|
|
28
|
-
* - tier 1: taxable < $50,000 (most filers)
|
|
29
|
-
* - tier 2: taxable < $100,000 (median-to-upper-middle)
|
|
30
|
-
* - tier 3: taxable < $250,000 (HCOL professionals)
|
|
31
|
-
* - tier 4: taxable < $500,000 (high earners)
|
|
32
|
-
* - tier 5: taxable >= $500,000 (top-bracket)
|
|
33
|
-
*
|
|
34
|
-
* The rate at each tier is the **effective** rate (not the marginal top rate)
|
|
35
|
-
* for a hypothetical filer at the top of that tier, accounting for the
|
|
36
|
-
* weighted average across the state's progressive brackets. Flat-rate states
|
|
37
|
-
* use the same rate at every tier. No-income-tax states are omitted (handled
|
|
38
|
-
* by `NO_TAX_STATES` in `federalTax.ts`).
|
|
39
|
-
*
|
|
40
|
-
* ## Source
|
|
41
|
-
*
|
|
42
|
-
* Tax Foundation 2026 State Individual Income Tax Rates and Brackets,
|
|
43
|
-
* effective Jan 1 2026 (with 2026 inflation adjustments where applicable).
|
|
44
|
-
*
|
|
45
|
-
* Last verified: 2026-05-27 (S141 Item #5).
|
|
46
|
-
*
|
|
47
|
-
* @see MCP-AUDIT-011 — Paycheck flat 5% state-tax estimate
|
|
48
|
-
* @see docs/Claude/Architecture/ADR/ADR-0039 § 5 — engine SemVer policy
|
|
49
|
-
*/
|
|
50
|
-
export const STATE_TAX_2026_META = {
|
|
51
|
-
source: "Tax Foundation 2026 State Individual Income Tax Rates",
|
|
52
|
-
lastVerified: "2026-05-27",
|
|
53
|
-
taxYear: 2026,
|
|
54
|
-
methodology: "Top-of-bracket effective rate selected by income tier. Not a full " +
|
|
55
|
-
"per-state bracket simulation — see methodology page for full rates.",
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Pick the income tier appropriate for a given taxable income.
|
|
59
|
-
* Uses left-inclusive boundaries.
|
|
60
|
-
*/
|
|
61
|
-
export function pickIncomeTier(taxableIncome) {
|
|
62
|
-
if (taxableIncome < 50_000)
|
|
63
|
-
return "under50k";
|
|
64
|
-
if (taxableIncome < 100_000)
|
|
65
|
-
return "under100k";
|
|
66
|
-
if (taxableIncome < 250_000)
|
|
67
|
-
return "under250k";
|
|
68
|
-
if (taxableIncome < 500_000)
|
|
69
|
-
return "under500k";
|
|
70
|
-
return "over500k";
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 2026 state effective tax rates (decimals) by income tier.
|
|
74
|
-
*
|
|
75
|
-
* NOT INCLUDED (handled by NO_TAX_STATES in federalTax.ts):
|
|
76
|
-
* AK, FL, NV, NH, SD, TN, TX, WA, WY
|
|
77
|
-
*
|
|
78
|
-
* NH currently taxes only interest/dividends (phased out for wages 2025+),
|
|
79
|
-
* treated as no-tax for wage income.
|
|
80
|
-
*
|
|
81
|
-
* Rates rounded to four decimal places. Local-income-tax piggybacks (NYC,
|
|
82
|
-
* Yonkers, PA municipal EIT) NOT included — surfaced as a `notes` warning
|
|
83
|
-
* for impacted states. State Disability Insurance (CA SDI, NY SDI, NJ SDI)
|
|
84
|
-
* is not income tax and is NOT included.
|
|
85
|
-
*/
|
|
86
|
-
export const STATE_EFFECTIVE_RATES_2026 = {
|
|
87
|
-
AL: {
|
|
88
|
-
stateCode: "AL",
|
|
89
|
-
stateName: "Alabama",
|
|
90
|
-
rates: { under50k: 0.04, under100k: 0.045, under250k: 0.05, under500k: 0.05, over500k: 0.05 },
|
|
91
|
-
},
|
|
92
|
-
AZ: {
|
|
93
|
-
stateCode: "AZ",
|
|
94
|
-
stateName: "Arizona",
|
|
95
|
-
rates: { under50k: 0.025, under100k: 0.025, under250k: 0.025, under500k: 0.025, over500k: 0.025 },
|
|
96
|
-
notes: "Flat 2.5% post-2023 reform.",
|
|
97
|
-
},
|
|
98
|
-
AR: {
|
|
99
|
-
stateCode: "AR",
|
|
100
|
-
stateName: "Arkansas",
|
|
101
|
-
rates: { under50k: 0.038, under100k: 0.039, under250k: 0.039, under500k: 0.039, over500k: 0.039 },
|
|
102
|
-
},
|
|
103
|
-
CA: {
|
|
104
|
-
stateCode: "CA",
|
|
105
|
-
stateName: "California",
|
|
106
|
-
rates: { under50k: 0.04, under100k: 0.065, under250k: 0.093, under500k: 0.103, over500k: 0.123 },
|
|
107
|
-
notes: "Excludes 1% Mental Health Services Tax above $1M and SDI.",
|
|
108
|
-
},
|
|
109
|
-
CO: {
|
|
110
|
-
stateCode: "CO",
|
|
111
|
-
stateName: "Colorado",
|
|
112
|
-
rates: { under50k: 0.044, under100k: 0.044, under250k: 0.044, under500k: 0.044, over500k: 0.044 },
|
|
113
|
-
notes: "Flat 4.4% (2026 estimate post-TABOR refund).",
|
|
114
|
-
},
|
|
115
|
-
CT: {
|
|
116
|
-
stateCode: "CT",
|
|
117
|
-
stateName: "Connecticut",
|
|
118
|
-
rates: { under50k: 0.045, under100k: 0.055, under250k: 0.06, under500k: 0.063, over500k: 0.0699 },
|
|
119
|
-
},
|
|
120
|
-
DE: {
|
|
121
|
-
stateCode: "DE",
|
|
122
|
-
stateName: "Delaware",
|
|
123
|
-
rates: { under50k: 0.045, under100k: 0.052, under250k: 0.066, under500k: 0.066, over500k: 0.066 },
|
|
124
|
-
},
|
|
125
|
-
GA: {
|
|
126
|
-
stateCode: "GA",
|
|
127
|
-
stateName: "Georgia",
|
|
128
|
-
rates: { under50k: 0.0539, under100k: 0.0539, under250k: 0.0539, under500k: 0.0539, over500k: 0.0539 },
|
|
129
|
-
notes: "Flat 5.39% (2026, scheduled to drop annually toward 4.99%).",
|
|
130
|
-
},
|
|
131
|
-
HI: {
|
|
132
|
-
stateCode: "HI",
|
|
133
|
-
stateName: "Hawaii",
|
|
134
|
-
rates: { under50k: 0.07, under100k: 0.08, under250k: 0.0925, under500k: 0.10, over500k: 0.11 },
|
|
135
|
-
notes: "Has many narrow brackets; effective rate approximation.",
|
|
136
|
-
},
|
|
137
|
-
ID: {
|
|
138
|
-
stateCode: "ID",
|
|
139
|
-
stateName: "Idaho",
|
|
140
|
-
rates: { under50k: 0.058, under100k: 0.058, under250k: 0.058, under500k: 0.058, over500k: 0.058 },
|
|
141
|
-
notes: "Flat 5.8% post-2023 reform.",
|
|
142
|
-
},
|
|
143
|
-
IL: {
|
|
144
|
-
stateCode: "IL",
|
|
145
|
-
stateName: "Illinois",
|
|
146
|
-
rates: { under50k: 0.0495, under100k: 0.0495, under250k: 0.0495, under500k: 0.0495, over500k: 0.0495 },
|
|
147
|
-
notes: "Flat 4.95%.",
|
|
148
|
-
},
|
|
149
|
-
IN: {
|
|
150
|
-
stateCode: "IN",
|
|
151
|
-
stateName: "Indiana",
|
|
152
|
-
rates: { under50k: 0.0305, under100k: 0.0305, under250k: 0.0305, under500k: 0.0305, over500k: 0.0305 },
|
|
153
|
-
notes: "Flat 3.05% (2026). Local county taxes (LIT) NOT included.",
|
|
154
|
-
},
|
|
155
|
-
IA: {
|
|
156
|
-
stateCode: "IA",
|
|
157
|
-
stateName: "Iowa",
|
|
158
|
-
rates: { under50k: 0.038, under100k: 0.038, under250k: 0.038, under500k: 0.038, over500k: 0.038 },
|
|
159
|
-
notes: "Flat 3.8% (2026 reform).",
|
|
160
|
-
},
|
|
161
|
-
KS: {
|
|
162
|
-
stateCode: "KS",
|
|
163
|
-
stateName: "Kansas",
|
|
164
|
-
rates: { under50k: 0.031, under100k: 0.0525, under250k: 0.057, under500k: 0.057, over500k: 0.057 },
|
|
165
|
-
},
|
|
166
|
-
KY: {
|
|
167
|
-
stateCode: "KY",
|
|
168
|
-
stateName: "Kentucky",
|
|
169
|
-
rates: { under50k: 0.04, under100k: 0.04, under250k: 0.04, under500k: 0.04, over500k: 0.04 },
|
|
170
|
-
notes: "Flat 4% (2026). Local occupational taxes NOT included.",
|
|
171
|
-
},
|
|
172
|
-
LA: {
|
|
173
|
-
stateCode: "LA",
|
|
174
|
-
stateName: "Louisiana",
|
|
175
|
-
rates: { under50k: 0.03, under100k: 0.03, under250k: 0.03, under500k: 0.03, over500k: 0.03 },
|
|
176
|
-
notes: "Flat 3% (2025 reform).",
|
|
177
|
-
},
|
|
178
|
-
ME: {
|
|
179
|
-
stateCode: "ME",
|
|
180
|
-
stateName: "Maine",
|
|
181
|
-
rates: { under50k: 0.058, under100k: 0.0675, under250k: 0.0715, under500k: 0.0715, over500k: 0.0715 },
|
|
182
|
-
},
|
|
183
|
-
MD: {
|
|
184
|
-
stateCode: "MD",
|
|
185
|
-
stateName: "Maryland",
|
|
186
|
-
rates: { under50k: 0.0475, under100k: 0.0525, under250k: 0.0555, under500k: 0.0575, over500k: 0.0575 },
|
|
187
|
-
notes: "Local county taxes (2.25%–3.2%) NOT included.",
|
|
188
|
-
},
|
|
189
|
-
MA: {
|
|
190
|
-
stateCode: "MA",
|
|
191
|
-
stateName: "Massachusetts",
|
|
192
|
-
rates: { under50k: 0.05, under100k: 0.05, under250k: 0.05, under500k: 0.05, over500k: 0.09 },
|
|
193
|
-
notes: "Flat 5% + 4% millionaire surtax above $1M.",
|
|
194
|
-
},
|
|
195
|
-
MI: {
|
|
196
|
-
stateCode: "MI",
|
|
197
|
-
stateName: "Michigan",
|
|
198
|
-
rates: { under50k: 0.0425, under100k: 0.0425, under250k: 0.0425, under500k: 0.0425, over500k: 0.0425 },
|
|
199
|
-
notes: "Flat 4.25%. Local city taxes NOT included.",
|
|
200
|
-
},
|
|
201
|
-
MN: {
|
|
202
|
-
stateCode: "MN",
|
|
203
|
-
stateName: "Minnesota",
|
|
204
|
-
rates: { under50k: 0.0535, under100k: 0.068, under250k: 0.0785, under500k: 0.0985, over500k: 0.0985 },
|
|
205
|
-
},
|
|
206
|
-
MS: {
|
|
207
|
-
stateCode: "MS",
|
|
208
|
-
stateName: "Mississippi",
|
|
209
|
-
rates: { under50k: 0.044, under100k: 0.044, under250k: 0.044, under500k: 0.044, over500k: 0.044 },
|
|
210
|
-
notes: "Flat 4.4% (2026, phasing toward 4%).",
|
|
211
|
-
},
|
|
212
|
-
MO: {
|
|
213
|
-
stateCode: "MO",
|
|
214
|
-
stateName: "Missouri",
|
|
215
|
-
rates: { under50k: 0.038, under100k: 0.047, under250k: 0.047, under500k: 0.047, over500k: 0.047 },
|
|
216
|
-
},
|
|
217
|
-
MT: {
|
|
218
|
-
stateCode: "MT",
|
|
219
|
-
stateName: "Montana",
|
|
220
|
-
rates: { under50k: 0.047, under100k: 0.059, under250k: 0.059, under500k: 0.059, over500k: 0.059 },
|
|
221
|
-
},
|
|
222
|
-
NE: {
|
|
223
|
-
stateCode: "NE",
|
|
224
|
-
stateName: "Nebraska",
|
|
225
|
-
rates: { under50k: 0.0246, under100k: 0.0464, under250k: 0.052, under500k: 0.052, over500k: 0.052 },
|
|
226
|
-
},
|
|
227
|
-
NJ: {
|
|
228
|
-
stateCode: "NJ",
|
|
229
|
-
stateName: "New Jersey",
|
|
230
|
-
rates: { under50k: 0.0175, under100k: 0.05525, under250k: 0.0637, under500k: 0.0897, over500k: 0.1075 },
|
|
231
|
-
notes: "Excludes SDI/UI/FLI payroll deductions.",
|
|
232
|
-
},
|
|
233
|
-
NM: {
|
|
234
|
-
stateCode: "NM",
|
|
235
|
-
stateName: "New Mexico",
|
|
236
|
-
rates: { under50k: 0.032, under100k: 0.047, under250k: 0.049, under500k: 0.059, over500k: 0.059 },
|
|
237
|
-
},
|
|
238
|
-
NY: {
|
|
239
|
-
stateCode: "NY",
|
|
240
|
-
stateName: "New York",
|
|
241
|
-
rates: { under50k: 0.045, under100k: 0.0585, under250k: 0.0685, under500k: 0.0685, over500k: 0.0882 },
|
|
242
|
-
notes: "Excludes NYC local tax (additional ~3-3.876%) and Yonkers piggyback. " +
|
|
243
|
-
"NYC residents should add ~3% to effective rate.",
|
|
244
|
-
},
|
|
245
|
-
NC: {
|
|
246
|
-
stateCode: "NC",
|
|
247
|
-
stateName: "North Carolina",
|
|
248
|
-
rates: { under50k: 0.0425, under100k: 0.0425, under250k: 0.0425, under500k: 0.0425, over500k: 0.0425 },
|
|
249
|
-
notes: "Flat 4.25% (2026, phasing toward 3.99%).",
|
|
250
|
-
},
|
|
251
|
-
ND: {
|
|
252
|
-
stateCode: "ND",
|
|
253
|
-
stateName: "North Dakota",
|
|
254
|
-
rates: { under50k: 0.0195, under100k: 0.0195, under250k: 0.025, under500k: 0.025, over500k: 0.025 },
|
|
255
|
-
},
|
|
256
|
-
OH: {
|
|
257
|
-
stateCode: "OH",
|
|
258
|
-
stateName: "Ohio",
|
|
259
|
-
rates: { under50k: 0.0275, under100k: 0.035, under250k: 0.035, under500k: 0.035, over500k: 0.035 },
|
|
260
|
-
notes: "Local municipal income taxes NOT included.",
|
|
261
|
-
},
|
|
262
|
-
OK: {
|
|
263
|
-
stateCode: "OK",
|
|
264
|
-
stateName: "Oklahoma",
|
|
265
|
-
rates: { under50k: 0.0375, under100k: 0.0475, under250k: 0.0475, under500k: 0.0475, over500k: 0.0475 },
|
|
266
|
-
},
|
|
267
|
-
OR: {
|
|
268
|
-
stateCode: "OR",
|
|
269
|
-
stateName: "Oregon",
|
|
270
|
-
rates: { under50k: 0.0875, under100k: 0.0875, under250k: 0.099, under500k: 0.099, over500k: 0.099 },
|
|
271
|
-
notes: "High effective rate at all tiers; metro/transit taxes NOT included.",
|
|
272
|
-
},
|
|
273
|
-
PA: {
|
|
274
|
-
stateCode: "PA",
|
|
275
|
-
stateName: "Pennsylvania",
|
|
276
|
-
rates: { under50k: 0.0307, under100k: 0.0307, under250k: 0.0307, under500k: 0.0307, over500k: 0.0307 },
|
|
277
|
-
notes: "Flat 3.07%. Local municipal EIT (1-4%) NOT included.",
|
|
278
|
-
},
|
|
279
|
-
RI: {
|
|
280
|
-
stateCode: "RI",
|
|
281
|
-
stateName: "Rhode Island",
|
|
282
|
-
rates: { under50k: 0.0375, under100k: 0.0475, under250k: 0.0599, under500k: 0.0599, over500k: 0.0599 },
|
|
283
|
-
},
|
|
284
|
-
SC: {
|
|
285
|
-
stateCode: "SC",
|
|
286
|
-
stateName: "South Carolina",
|
|
287
|
-
rates: { under50k: 0.03, under100k: 0.062, under250k: 0.062, under500k: 0.062, over500k: 0.062 },
|
|
288
|
-
},
|
|
289
|
-
UT: {
|
|
290
|
-
stateCode: "UT",
|
|
291
|
-
stateName: "Utah",
|
|
292
|
-
rates: { under50k: 0.0455, under100k: 0.0455, under250k: 0.0455, under500k: 0.0455, over500k: 0.0455 },
|
|
293
|
-
notes: "Flat 4.55%.",
|
|
294
|
-
},
|
|
295
|
-
VT: {
|
|
296
|
-
stateCode: "VT",
|
|
297
|
-
stateName: "Vermont",
|
|
298
|
-
rates: { under50k: 0.0335, under100k: 0.066, under250k: 0.076, under500k: 0.0875, over500k: 0.0875 },
|
|
299
|
-
},
|
|
300
|
-
VA: {
|
|
301
|
-
stateCode: "VA",
|
|
302
|
-
stateName: "Virginia",
|
|
303
|
-
rates: { under50k: 0.0475, under100k: 0.0575, under250k: 0.0575, under500k: 0.0575, over500k: 0.0575 },
|
|
304
|
-
},
|
|
305
|
-
WV: {
|
|
306
|
-
stateCode: "WV",
|
|
307
|
-
stateName: "West Virginia",
|
|
308
|
-
rates: { under50k: 0.0436, under100k: 0.0482, under250k: 0.0482, under500k: 0.0482, over500k: 0.0482 },
|
|
309
|
-
},
|
|
310
|
-
WI: {
|
|
311
|
-
stateCode: "WI",
|
|
312
|
-
stateName: "Wisconsin",
|
|
313
|
-
rates: { under50k: 0.0354, under100k: 0.053, under250k: 0.0765, under500k: 0.0765, over500k: 0.0765 },
|
|
314
|
-
},
|
|
315
|
-
DC: {
|
|
316
|
-
stateCode: "DC",
|
|
317
|
-
stateName: "District of Columbia",
|
|
318
|
-
rates: { under50k: 0.06, under100k: 0.065, under250k: 0.085, under500k: 0.0925, over500k: 0.1075 },
|
|
319
|
-
notes: "DC included for full HCOL coverage even though not a state.",
|
|
320
|
-
},
|
|
321
|
-
};
|
|
322
|
-
/**
|
|
323
|
-
* Look up the effective state income-tax rate for a given state and taxable income.
|
|
324
|
-
*
|
|
325
|
-
* Returns 0 for no-income-tax states (caller should also check NO_TAX_STATES).
|
|
326
|
-
* Returns 0 for unknown state codes (defensive fallback — caller already validated
|
|
327
|
-
* 2-letter format at the Zod schema layer; this guards against typos that pass
|
|
328
|
-
* Zod but aren't in our table).
|
|
329
|
-
*
|
|
330
|
-
* @param stateCode 2-letter US state code (uppercase)
|
|
331
|
-
* @param taxableIncome Annual taxable income in USD (post-federal-standard-deduction basis)
|
|
332
|
-
* @returns Decimal effective rate (e.g., 0.093 for 9.3%); 0 if state not modeled
|
|
333
|
-
*/
|
|
334
|
-
export function getStateEffectiveRate(stateCode, taxableIncome) {
|
|
335
|
-
const upper = stateCode.trim().toUpperCase();
|
|
336
|
-
const entry = STATE_EFFECTIVE_RATES_2026[upper];
|
|
337
|
-
if (!entry)
|
|
338
|
-
return 0;
|
|
339
|
-
const tier = pickIncomeTier(Math.max(0, taxableIncome));
|
|
340
|
-
return entry.rates[tier];
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Get the full state data entry (for surfacing `notes` in the tool envelope).
|
|
344
|
-
*/
|
|
345
|
-
export function getStateEntry(stateCode) {
|
|
346
|
-
return STATE_EFFECTIVE_RATES_2026[stateCode.trim().toUpperCase()];
|
|
347
|
-
}
|
|
348
|
-
//# sourceMappingURL=stateTax2026.js.map
|