@markcolabs/mcp 0.1.0 → 0.3.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.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE-API.md +111 -0
  3. package/README.md +128 -205
  4. package/dist/engines/compoundInterest.d.ts +8 -6
  5. package/dist/engines/compoundInterest.d.ts.map +1 -1
  6. package/dist/engines/compoundInterest.js +8 -6
  7. package/dist/engines/compoundInterest.js.map +1 -1
  8. package/dist/engines/data/irs2026.d.ts +110 -3
  9. package/dist/engines/data/irs2026.d.ts.map +1 -1
  10. package/dist/engines/data/irs2026.js +86 -3
  11. package/dist/engines/data/irs2026.js.map +1 -1
  12. package/dist/engines/data/rmd2026.d.ts +59 -0
  13. package/dist/engines/data/rmd2026.d.ts.map +1 -0
  14. package/dist/engines/data/rmd2026.js +75 -0
  15. package/dist/engines/data/rmd2026.js.map +1 -0
  16. package/dist/engines/data/stateTax2026.d.ts +114 -0
  17. package/dist/engines/data/stateTax2026.d.ts.map +1 -0
  18. package/dist/engines/data/stateTax2026.js +348 -0
  19. package/dist/engines/data/stateTax2026.js.map +1 -0
  20. package/dist/engines/hsa.d.ts +110 -0
  21. package/dist/engines/hsa.d.ts.map +1 -0
  22. package/dist/engines/hsa.js +83 -0
  23. package/dist/engines/hsa.js.map +1 -0
  24. package/dist/engines/ira.d.ts +115 -0
  25. package/dist/engines/ira.d.ts.map +1 -0
  26. package/dist/engines/ira.js +127 -0
  27. package/dist/engines/ira.js.map +1 -0
  28. package/dist/engines/mortgage.d.ts +7 -6
  29. package/dist/engines/mortgage.d.ts.map +1 -1
  30. package/dist/engines/mortgage.js +7 -6
  31. package/dist/engines/mortgage.js.map +1 -1
  32. package/dist/engines/paycheck.d.ts +57 -18
  33. package/dist/engines/paycheck.d.ts.map +1 -1
  34. package/dist/engines/paycheck.js +59 -26
  35. package/dist/engines/paycheck.js.map +1 -1
  36. package/dist/engines/retirement401k.d.ts +7 -3
  37. package/dist/engines/retirement401k.d.ts.map +1 -1
  38. package/dist/engines/retirement401k.js +7 -3
  39. package/dist/engines/retirement401k.js.map +1 -1
  40. package/dist/engines/rmd.d.ts +107 -0
  41. package/dist/engines/rmd.d.ts.map +1 -0
  42. package/dist/engines/rmd.js +109 -0
  43. package/dist/engines/rmd.js.map +1 -0
  44. package/dist/engines/rothConversion.d.ts +124 -0
  45. package/dist/engines/rothConversion.d.ts.map +1 -0
  46. package/dist/engines/rothConversion.js +145 -0
  47. package/dist/engines/rothConversion.js.map +1 -0
  48. package/dist/engines/socialSecurity.d.ts +7 -3
  49. package/dist/engines/socialSecurity.d.ts.map +1 -1
  50. package/dist/engines/socialSecurity.js +7 -3
  51. package/dist/engines/socialSecurity.js.map +1 -1
  52. package/dist/index.d.ts +21 -9
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +109 -11
  55. package/dist/index.js.map +1 -1
  56. package/dist/shared/bounds.d.ts +50 -0
  57. package/dist/shared/bounds.d.ts.map +1 -1
  58. package/dist/shared/bounds.js +85 -0
  59. package/dist/shared/bounds.js.map +1 -1
  60. package/dist/tools/hsa.d.ts +58 -0
  61. package/dist/tools/hsa.d.ts.map +1 -0
  62. package/dist/tools/hsa.js +129 -0
  63. package/dist/tools/hsa.js.map +1 -0
  64. package/dist/tools/ira.d.ts +55 -0
  65. package/dist/tools/ira.d.ts.map +1 -0
  66. package/dist/tools/ira.js +117 -0
  67. package/dist/tools/ira.js.map +1 -0
  68. package/dist/tools/paycheck.d.ts +14 -7
  69. package/dist/tools/paycheck.d.ts.map +1 -1
  70. package/dist/tools/paycheck.js +24 -11
  71. package/dist/tools/paycheck.js.map +1 -1
  72. package/dist/tools/retirement401k.d.ts +3 -3
  73. package/dist/tools/retirement401k.d.ts.map +1 -1
  74. package/dist/tools/retirement401k.js +3 -3
  75. package/dist/tools/retirement401k.js.map +1 -1
  76. package/dist/tools/rmd.d.ts +60 -0
  77. package/dist/tools/rmd.d.ts.map +1 -0
  78. package/dist/tools/rmd.js +130 -0
  79. package/dist/tools/rmd.js.map +1 -0
  80. package/dist/tools/rothConversion.d.ts +66 -0
  81. package/dist/tools/rothConversion.d.ts.map +1 -0
  82. package/dist/tools/rothConversion.js +141 -0
  83. package/dist/tools/rothConversion.js.map +1 -0
  84. package/dist/tools/socialSecurity.d.ts +3 -3
  85. package/dist/tools/socialSecurity.d.ts.map +1 -1
  86. package/dist/tools/socialSecurity.js +3 -3
  87. package/dist/tools/socialSecurity.js.map +1 -1
  88. package/package.json +19 -5
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * Self-contained 2026 IRS retirement-plan limits subset for the MCP package's
3
- * 401(k) projection engine.
3
+ * retirement engines (401k, IRA, Roth conversion).
4
4
  *
5
- * Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026. See
6
- * engines/data/ssa.ts for full rationale on the mirror pattern.
5
+ * Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026 / LIMITS_IRA_2026
6
+ * / ROTH_PHASE_OUT_2026 / TRADITIONAL_PHASE_OUT_2026. See engines/data/ssa.ts
7
+ * for full rationale on the mirror pattern.
7
8
  *
8
9
  * Source: IRS Notice 2025-67 (2026 retirement-plan limits) +
9
10
  * SECURE 2.0 Act §109 (super catch-up provision for ages 60-63).
11
+ * IRA limits re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
10
12
  * Last verified: 2026-05-09.
11
13
  */
12
14
  export declare const LIMITS_401K_2026: {
@@ -27,4 +29,109 @@ export declare const LIMITS_401K_2026: {
27
29
  /** End of super catch-up window. */
28
30
  readonly superCatchUpAgeEnd: 63;
29
31
  };
32
+ /**
33
+ * 2026 IRA Contribution Limits.
34
+ * Mirrored from site/src/data/annual-limits.js `LIMITS_IRA_2026`.
35
+ *
36
+ * Source: IRS Notice 2025-67 (2026 retirement plan limits); SECURE 2.0 Act §107
37
+ * (catch-up indexing). Re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
38
+ */
39
+ export declare const LIMITS_IRA_2026: {
40
+ /** Base IRA contribution limit (under age 50). */
41
+ readonly standard: 7500;
42
+ /** Catch-up amount for age 50+ (SECURE 2.0 indexed). */
43
+ readonly catchUp: 1100;
44
+ /** Total contribution limit for age 50+ (standard + catchUp). */
45
+ readonly total50Plus: 8600;
46
+ /** Minimum age for catch-up eligibility. */
47
+ readonly catchUpAge: 50;
48
+ };
49
+ /**
50
+ * 2026 Roth IRA Income (MAGI) Phase-Out Thresholds.
51
+ * Mirrored from site/src/data/annual-limits.js `ROTH_PHASE_OUT_2026`.
52
+ *
53
+ * Source: IRS Notice 2025-67; IRC §408A(c)(3) phase-out methodology.
54
+ * Filing-status keys are camelCase to match the MCP package's `FilingStatus`
55
+ * convention; mapping vs. site keys: single=single, mfj=marriedFilingJointly,
56
+ * mfs=marriedFilingSeparately. (Head-of-household uses the single thresholds
57
+ * per IRS rules.)
58
+ */
59
+ export declare const ROTH_PHASE_OUT_2026: {
60
+ readonly single: {
61
+ readonly start: 153000;
62
+ readonly end: 168000;
63
+ };
64
+ readonly marriedFilingJointly: {
65
+ readonly start: 242000;
66
+ readonly end: 252000;
67
+ };
68
+ readonly marriedFilingSeparately: {
69
+ readonly start: 0;
70
+ readonly end: 10000;
71
+ };
72
+ readonly headOfHousehold: {
73
+ readonly start: 153000;
74
+ readonly end: 168000;
75
+ };
76
+ };
77
+ /**
78
+ * 2026 Traditional IRA Deduction Phase-Out (contributor covered by workplace plan).
79
+ * Mirrored from site/src/data/annual-limits.js `TRADITIONAL_PHASE_OUT_2026`.
80
+ *
81
+ * Source: IRS Notice 2025-67; IRC §219(g) deduction phase-out methodology.
82
+ * NOTE: This phase-out governs the DEDUCTIBILITY of traditional IRA
83
+ * contributions, not the contribution limit itself. The IRA contributionLimit
84
+ * tool returns the eligibleContribution (= base limit for Traditional regardless
85
+ * of MAGI, since non-deductible contributions are always permitted). The
86
+ * Traditional phase-out is exposed via a separate field for clients that need
87
+ * the deduction-phase-out signal.
88
+ */
89
+ export declare const TRADITIONAL_PHASE_OUT_2026: {
90
+ readonly single: {
91
+ readonly start: 81000;
92
+ readonly end: 91000;
93
+ };
94
+ readonly marriedFilingJointly: {
95
+ readonly start: 129000;
96
+ readonly end: 149000;
97
+ };
98
+ readonly marriedFilingSeparately: {
99
+ readonly start: 0;
100
+ readonly end: 10000;
101
+ };
102
+ readonly headOfHousehold: {
103
+ readonly start: 81000;
104
+ readonly end: 91000;
105
+ };
106
+ };
107
+ /**
108
+ * 2026 HSA Contribution Limits.
109
+ * Mirrored from site/src/data/annual-limits.js `LIMITS_HSA_2026`.
110
+ *
111
+ * Source: IRS Rev. Proc. 2025-19 (2026 HSA inflation adjustments under IRC §223);
112
+ * IRC §223(b)(3)(B) ($1,000 catch-up is statutory and NOT inflation-indexed).
113
+ * Last verified: 2026-05-27 (mirrored from site/src/data/annual-limits.js,
114
+ * site _meta.last_verified_date: 2026-05-07).
115
+ *
116
+ * Notes:
117
+ * - `medicareAge`: HSA contributions are prohibited once enrolled in Medicare
118
+ * (typically age 65). Surfaced as an informational threshold; the HSA
119
+ * contribution-limit tool does not zero out the limit at this age, it just
120
+ * reports it (parallel to how the site shows a Medicare warning badge).
121
+ * - Employer contributions REDUCE the employee's eligible payroll deduction
122
+ * dollar-for-dollar because the IRS limit is a TOTAL annual limit, not a
123
+ * per-source limit. See engines/hsa.ts for the clamp.
124
+ */
125
+ export declare const LIMITS_HSA_2026: {
126
+ /** Self-only HDHP coverage base limit. */
127
+ readonly selfOnly: 4400;
128
+ /** Family HDHP coverage base limit. */
129
+ readonly family: 8750;
130
+ /** Catch-up amount for age 55+ (statutory, not indexed). */
131
+ readonly catchUp: 1000;
132
+ /** Minimum age for catch-up eligibility. */
133
+ readonly catchUpAge: 55;
134
+ /** Age at which Medicare enrollment typically begins (informational only). */
135
+ readonly medicareAge: 65;
136
+ };
30
137
  //# sourceMappingURL=irs2026.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"irs2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,gBAAgB;IAC3B,oCAAoC;;IAEpC,qDAAqD;;IAErD,yDAAyD;;IAEzD,kDAAkD;;IAElD,gDAAgD;;IAEhD,oCAAoC;;IAEpC,sCAAsC;;IAEtC,oCAAoC;;CAE5B,CAAC"}
1
+ {"version":3,"file":"irs2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,gBAAgB;IAC3B,oCAAoC;;IAEpC,qDAAqD;;IAErD,yDAAyD;;IAEzD,kDAAkD;;IAElD,gDAAgD;;IAEhD,oCAAoC;;IAEpC,sCAAsC;;IAEtC,oCAAoC;;CAE5B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;IAC1B,kDAAkD;;IAElD,wDAAwD;;IAExD,iEAAiE;;IAEjE,4CAA4C;;CAEpC,CAAC;AAEX;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAKtB,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;CAK7B,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe;IAC1B,0CAA0C;;IAE1C,uCAAuC;;IAEvC,4DAA4D;;IAE5D,4CAA4C;;IAE5C,8EAA8E;;CAEtE,CAAC"}
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * Self-contained 2026 IRS retirement-plan limits subset for the MCP package's
3
- * 401(k) projection engine.
3
+ * retirement engines (401k, IRA, Roth conversion).
4
4
  *
5
- * Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026. See
6
- * engines/data/ssa.ts for full rationale on the mirror pattern.
5
+ * Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026 / LIMITS_IRA_2026
6
+ * / ROTH_PHASE_OUT_2026 / TRADITIONAL_PHASE_OUT_2026. See engines/data/ssa.ts
7
+ * for full rationale on the mirror pattern.
7
8
  *
8
9
  * Source: IRS Notice 2025-67 (2026 retirement-plan limits) +
9
10
  * SECURE 2.0 Act §109 (super catch-up provision for ages 60-63).
11
+ * IRA limits re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
10
12
  * Last verified: 2026-05-09.
11
13
  */
12
14
  export const LIMITS_401K_2026 = {
@@ -27,4 +29,85 @@ export const LIMITS_401K_2026 = {
27
29
  /** End of super catch-up window. */
28
30
  superCatchUpAgeEnd: 63,
29
31
  };
32
+ /**
33
+ * 2026 IRA Contribution Limits.
34
+ * Mirrored from site/src/data/annual-limits.js `LIMITS_IRA_2026`.
35
+ *
36
+ * Source: IRS Notice 2025-67 (2026 retirement plan limits); SECURE 2.0 Act §107
37
+ * (catch-up indexing). Re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
38
+ */
39
+ export const LIMITS_IRA_2026 = {
40
+ /** Base IRA contribution limit (under age 50). */
41
+ standard: 7_500,
42
+ /** Catch-up amount for age 50+ (SECURE 2.0 indexed). */
43
+ catchUp: 1_100,
44
+ /** Total contribution limit for age 50+ (standard + catchUp). */
45
+ total50Plus: 8_600,
46
+ /** Minimum age for catch-up eligibility. */
47
+ catchUpAge: 50,
48
+ };
49
+ /**
50
+ * 2026 Roth IRA Income (MAGI) Phase-Out Thresholds.
51
+ * Mirrored from site/src/data/annual-limits.js `ROTH_PHASE_OUT_2026`.
52
+ *
53
+ * Source: IRS Notice 2025-67; IRC §408A(c)(3) phase-out methodology.
54
+ * Filing-status keys are camelCase to match the MCP package's `FilingStatus`
55
+ * convention; mapping vs. site keys: single=single, mfj=marriedFilingJointly,
56
+ * mfs=marriedFilingSeparately. (Head-of-household uses the single thresholds
57
+ * per IRS rules.)
58
+ */
59
+ export const ROTH_PHASE_OUT_2026 = {
60
+ single: { start: 153_000, end: 168_000 },
61
+ marriedFilingJointly: { start: 242_000, end: 252_000 },
62
+ marriedFilingSeparately: { start: 0, end: 10_000 },
63
+ headOfHousehold: { start: 153_000, end: 168_000 },
64
+ };
65
+ /**
66
+ * 2026 Traditional IRA Deduction Phase-Out (contributor covered by workplace plan).
67
+ * Mirrored from site/src/data/annual-limits.js `TRADITIONAL_PHASE_OUT_2026`.
68
+ *
69
+ * Source: IRS Notice 2025-67; IRC §219(g) deduction phase-out methodology.
70
+ * NOTE: This phase-out governs the DEDUCTIBILITY of traditional IRA
71
+ * contributions, not the contribution limit itself. The IRA contributionLimit
72
+ * tool returns the eligibleContribution (= base limit for Traditional regardless
73
+ * of MAGI, since non-deductible contributions are always permitted). The
74
+ * Traditional phase-out is exposed via a separate field for clients that need
75
+ * the deduction-phase-out signal.
76
+ */
77
+ export const TRADITIONAL_PHASE_OUT_2026 = {
78
+ single: { start: 81_000, end: 91_000 },
79
+ marriedFilingJointly: { start: 129_000, end: 149_000 },
80
+ marriedFilingSeparately: { start: 0, end: 10_000 },
81
+ headOfHousehold: { start: 81_000, end: 91_000 },
82
+ };
83
+ /**
84
+ * 2026 HSA Contribution Limits.
85
+ * Mirrored from site/src/data/annual-limits.js `LIMITS_HSA_2026`.
86
+ *
87
+ * Source: IRS Rev. Proc. 2025-19 (2026 HSA inflation adjustments under IRC §223);
88
+ * IRC §223(b)(3)(B) ($1,000 catch-up is statutory and NOT inflation-indexed).
89
+ * Last verified: 2026-05-27 (mirrored from site/src/data/annual-limits.js,
90
+ * site _meta.last_verified_date: 2026-05-07).
91
+ *
92
+ * Notes:
93
+ * - `medicareAge`: HSA contributions are prohibited once enrolled in Medicare
94
+ * (typically age 65). Surfaced as an informational threshold; the HSA
95
+ * contribution-limit tool does not zero out the limit at this age, it just
96
+ * reports it (parallel to how the site shows a Medicare warning badge).
97
+ * - Employer contributions REDUCE the employee's eligible payroll deduction
98
+ * dollar-for-dollar because the IRS limit is a TOTAL annual limit, not a
99
+ * per-source limit. See engines/hsa.ts for the clamp.
100
+ */
101
+ export const LIMITS_HSA_2026 = {
102
+ /** Self-only HDHP coverage base limit. */
103
+ selfOnly: 4_400,
104
+ /** Family HDHP coverage base limit. */
105
+ family: 8_750,
106
+ /** Catch-up amount for age 55+ (statutory, not indexed). */
107
+ catchUp: 1_000,
108
+ /** Minimum age for catch-up eligibility. */
109
+ catchUpAge: 55,
110
+ /** Age at which Medicare enrollment typically begins (informational only). */
111
+ medicareAge: 65,
112
+ };
30
113
  //# sourceMappingURL=irs2026.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"irs2026.js","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,oCAAoC;IACpC,IAAI,EAAE,MAAM;IACZ,qDAAqD;IACrD,OAAO,EAAE,KAAK;IACd,yDAAyD;IACzD,YAAY,EAAE,MAAM;IACpB,kDAAkD;IAClD,gBAAgB,EAAE,MAAM;IACxB,gDAAgD;IAChD,qBAAqB,EAAE,MAAM;IAC7B,oCAAoC;IACpC,UAAU,EAAE,EAAE;IACd,sCAAsC;IACtC,oBAAoB,EAAE,EAAE;IACxB,oCAAoC;IACpC,kBAAkB,EAAE,EAAE;CACd,CAAC"}
1
+ {"version":3,"file":"irs2026.js","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,oCAAoC;IACpC,IAAI,EAAE,MAAM;IACZ,qDAAqD;IACrD,OAAO,EAAE,KAAK;IACd,yDAAyD;IACzD,YAAY,EAAE,MAAM;IACpB,kDAAkD;IAClD,gBAAgB,EAAE,MAAM;IACxB,gDAAgD;IAChD,qBAAqB,EAAE,MAAM;IAC7B,oCAAoC;IACpC,UAAU,EAAE,EAAE;IACd,sCAAsC;IACtC,oBAAoB,EAAE,EAAE;IACxB,oCAAoC;IACpC,kBAAkB,EAAE,EAAE;CACd,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kDAAkD;IAClD,QAAQ,EAAE,KAAK;IACf,wDAAwD;IACxD,OAAO,EAAE,KAAK;IACd,iEAAiE;IACjE,WAAW,EAAE,KAAK;IAClB,4CAA4C;IAC5C,UAAU,EAAE,EAAE;CACN,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAC1D,oBAAoB,EAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAC1D,uBAAuB,EAAG,EAAE,KAAK,EAAE,CAAC,EAAQ,GAAG,EAAE,MAAM,EAAG;IAC1D,eAAe,EAAW,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;CAClD,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAoB,EAAE,KAAK,EAAE,MAAM,EAAG,GAAG,EAAE,MAAM,EAAG;IAC1D,oBAAoB,EAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAC1D,uBAAuB,EAAG,EAAE,KAAK,EAAE,CAAC,EAAQ,GAAG,EAAE,MAAM,EAAG;IAC1D,eAAe,EAAW,EAAE,KAAK,EAAE,MAAM,EAAG,GAAG,EAAE,MAAM,EAAG;CAClD,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,KAAK;IACf,uCAAuC;IACvC,MAAM,EAAI,KAAK;IACf,4DAA4D;IAC5D,OAAO,EAAG,KAAK;IACf,4CAA4C;IAC5C,UAAU,EAAE,EAAE;IACd,8EAA8E;IAC9E,WAAW,EAAE,EAAE;CACP,CAAC"}
@@ -0,0 +1,59 @@
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 declare const UNIFORM_LIFETIME_TABLE_2026: Readonly<Record<number, number>>;
31
+ /**
32
+ * Lowest age in the Uniform Lifetime Table. RMD requests below this age are
33
+ * either pre-RMD (caller error) or use the lower bound (72) clamp matching
34
+ * the site's `getDistributionPeriod` behavior. The MCP tool prefers an
35
+ * INPUT_VALIDATION error for ages below the SECURE-2.0 floor (73 for the
36
+ * common 1951-1959 cohort).
37
+ */
38
+ export declare const UNIFORM_LIFETIME_MIN_AGE = 72;
39
+ /** Highest age in the Uniform Lifetime Table — clamps lookups for age > 120. */
40
+ export declare const UNIFORM_LIFETIME_MAX_AGE = 120;
41
+ /**
42
+ * SECURE 2.0 RMD-start-age tiers (verbatim port of site `getRMDStartAge`).
43
+ * - Born ≤ 1950 → 70.5 (legacy, pre-SECURE-Act)
44
+ * - Born 1951-1959 → 73 (SECURE 2.0 §107 phase 1)
45
+ * - Born ≥ 1960 → 75 (SECURE 2.0 §107 phase 2, effective 2033)
46
+ */
47
+ export declare function getRmdStartAge(birthYear: number): number;
48
+ /**
49
+ * SECURE 2.0 §302 missed-RMD excise tax (reduced from 50% pre-2023).
50
+ * - 25% on the under-distributed amount (default)
51
+ * - 10% if corrected within the IRS correction window (typically 2 years)
52
+ * Surfaced as an informational field in the RMD result so callers can warn
53
+ * users about the cost of missing the deadline.
54
+ */
55
+ export declare const RMD_MISSED_EXCISE_RATE = 0.25;
56
+ export declare const RMD_MISSED_EXCISE_RATE_IF_CORRECTED = 0.1;
57
+ /** Stable provenance string for `result.meta.source`. */
58
+ export declare const RMD_TABLE_SOURCE = "IRS Publication 590-B (Uniform Lifetime Table III, post-2022); SECURE 2.0 Act \u00A7107 (RMD age tiers); \u00A7302 (25% excise tax)";
59
+ //# sourceMappingURL=rmd2026.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rmd2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/rmd2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU/D,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,mCAAmC,MAAO,CAAC;AAExD,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,wIACgG,CAAC"}
@@ -0,0 +1,75 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,114 @@
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
@@ -0,0 +1 @@
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"}