@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
package/dist/index.js CHANGED
@@ -2,19 +2,23 @@
2
2
  /**
3
3
  * @markcolabs/mcp — MCP server entrypoint.
4
4
  *
5
- * Sprint 136 v0.1.0 (per ADR-0039). Registers:
6
- * - 5 tools:
7
- * dc.calculator.mortgage.monthlyPayment (S135 Item 5)
8
- * dc.calculator.compoundInterest.futureValue (S135 Item 5)
9
- * dc.calculator.401k.projection (S136 Item 3)
10
- * dc.calculator.socialSecurity.estimate (S136 Item 3)
11
- * dc.calculator.paycheck.netPay (S136 Item 3)
5
+ * v0.3.0 (per ADR-0039 + ADR-0041 reconciliation; S141 Wave 1A + 1B).
6
+ * Registers:
7
+ * - 9 tools:
8
+ * dc.calculator.mortgage.monthlyPayment (S135 Item 5)
9
+ * dc.calculator.compoundInterest.futureValue (S135 Item 5)
10
+ * dc.calculator.retirement401k.projection (S136 Item 3, renamed v0.2.0 per ADR-0041 D2)
11
+ * dc.calculator.socialSecurity.estimatedBenefit (S136 Item 3, renamed v0.2.0 per ADR-0041 D2)
12
+ * dc.calculator.paycheck.netPay (S136 Item 3)
13
+ * dc.calculator.ira.contributionLimit (S141 Wave 1A)
14
+ * dc.calculator.rothConversion.taxImpact (S141 Wave 1A)
15
+ * dc.calculator.rmd.distributionAmount (S141 Wave 1B — new)
16
+ * dc.calculator.hsa.contributionLimit (S141 Wave 1B — new)
12
17
  * - 1 resource: dc://disclaimers/ymyl (canonical YMYL disclaimer)
13
18
  *
14
19
  * Transport: stdio (default for local MCP clients).
15
20
  *
16
- * S136 hits O5-KR1 5-tool target. Post-S136: methodology resources
17
- * (dc://methodologies/*) and the `plan-retirement` prompt template (O5-KR2).
21
+ * S141 Wave 1A took tool coverage 5 7; Wave 1B finalizes 7 → 9 (v0.3.0).
18
22
  */
19
23
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
20
24
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -25,6 +29,10 @@ import * as compoundInterestTool from "./tools/compoundInterest.js";
25
29
  import * as retirement401kTool from "./tools/retirement401k.js";
26
30
  import * as socialSecurityTool from "./tools/socialSecurity.js";
27
31
  import * as paycheckTool from "./tools/paycheck.js";
32
+ import * as iraTool from "./tools/ira.js";
33
+ import * as rothConversionTool from "./tools/rothConversion.js";
34
+ import * as rmdTool from "./tools/rmd.js";
35
+ import * as hsaTool from "./tools/hsa.js";
28
36
  import { YMYL_DISCLAIMER, YMYL_DISCLAIMER_URI, } from "./disclaimers/ymyl.js";
29
37
  // Re-export the tool execute functions and engines so consumers (and parity
30
38
  // tests) can import them directly without spinning up the MCP transport.
@@ -33,18 +41,26 @@ export { execute as executeCompoundInterestTool } from "./tools/compoundInterest
33
41
  export { execute as executeRetirement401kTool } from "./tools/retirement401k.js";
34
42
  export { execute as executeSocialSecurityTool } from "./tools/socialSecurity.js";
35
43
  export { execute as executePaycheckTool } from "./tools/paycheck.js";
44
+ export { execute as executeIraTool } from "./tools/ira.js";
45
+ export { execute as executeRothConversionTool } from "./tools/rothConversion.js";
46
+ export { execute as executeRmdTool } from "./tools/rmd.js";
47
+ export { execute as executeHsaTool } from "./tools/hsa.js";
36
48
  export * as mortgageEngine from "./engines/mortgage.js";
37
49
  export * as compoundInterestEngine from "./engines/compoundInterest.js";
38
50
  export * as retirement401kEngine from "./engines/retirement401k.js";
39
51
  export * as socialSecurityEngine from "./engines/socialSecurity.js";
40
52
  export * as paycheckEngine from "./engines/paycheck.js";
53
+ export * as iraEngine from "./engines/ira.js";
54
+ export * as rothConversionEngine from "./engines/rothConversion.js";
55
+ export * as rmdEngine from "./engines/rmd.js";
56
+ export * as hsaEngine from "./engines/hsa.js";
41
57
  export * from "./envelope.js";
42
58
  // ---------------------------------------------------------------------------
43
59
  // Server setup
44
60
  // ---------------------------------------------------------------------------
45
61
  const server = new Server({
46
62
  name: "@markcolabs/mcp",
47
- version: "0.1.0",
63
+ version: "0.3.0",
48
64
  }, {
49
65
  capabilities: {
50
66
  tools: {},
@@ -54,6 +70,20 @@ const server = new Server({
54
70
  // ---------------------------------------------------------------------------
55
71
  // tools/list
56
72
  // ---------------------------------------------------------------------------
73
+ /**
74
+ * Tool annotations per Anthropic Claude Connectors Directory spec
75
+ * (MCP-AUDIT-023, S141 Item #5):
76
+ * - title: human-readable display name (sentence-case)
77
+ * - readOnlyHint: true — all our tools are pure functions, no mutation
78
+ * - destructiveHint: false — no tool modifies any state
79
+ *
80
+ * Applied uniformly across all 9 tools — the package is read-only by design
81
+ * (MCP-AUDIT-008 audit-bundle conclusion).
82
+ */
83
+ const READ_ONLY_ANNOTATIONS = {
84
+ readOnlyHint: true,
85
+ destructiveHint: false,
86
+ };
57
87
  server.setRequestHandler(ListToolsRequestSchema, async () => {
58
88
  return {
59
89
  tools: [
@@ -61,26 +91,82 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
61
91
  name: mortgageTool.TOOL_NAME,
62
92
  description: mortgageTool.TOOL_DESCRIPTION,
63
93
  inputSchema: zodToJsonSchema(mortgageTool.MortgageMonthlyPaymentInputSchema),
94
+ annotations: {
95
+ title: "Mortgage Monthly Payment",
96
+ ...READ_ONLY_ANNOTATIONS,
97
+ },
64
98
  },
65
99
  {
66
100
  name: compoundInterestTool.TOOL_NAME,
67
101
  description: compoundInterestTool.TOOL_DESCRIPTION,
68
102
  inputSchema: zodToJsonSchema(compoundInterestTool.CompoundInterestFutureValueInputSchema),
103
+ annotations: {
104
+ title: "Compound Interest Future Value",
105
+ ...READ_ONLY_ANNOTATIONS,
106
+ },
69
107
  },
70
108
  {
71
109
  name: retirement401kTool.TOOL_NAME,
72
110
  description: retirement401kTool.TOOL_DESCRIPTION,
73
111
  inputSchema: zodToJsonSchema(retirement401kTool.Retirement401kProjectionInputSchema),
112
+ annotations: {
113
+ title: "401(k) Retirement Projection",
114
+ ...READ_ONLY_ANNOTATIONS,
115
+ },
74
116
  },
75
117
  {
76
118
  name: socialSecurityTool.TOOL_NAME,
77
119
  description: socialSecurityTool.TOOL_DESCRIPTION,
78
120
  inputSchema: zodToJsonSchema(socialSecurityTool.SocialSecurityEstimateInputSchema),
121
+ annotations: {
122
+ title: "Social Security Estimated Benefit",
123
+ ...READ_ONLY_ANNOTATIONS,
124
+ },
79
125
  },
80
126
  {
81
127
  name: paycheckTool.TOOL_NAME,
82
128
  description: paycheckTool.TOOL_DESCRIPTION,
83
129
  inputSchema: zodToJsonSchema(paycheckTool.PaycheckNetPayInputSchema),
130
+ annotations: {
131
+ title: "Paycheck Net Pay",
132
+ ...READ_ONLY_ANNOTATIONS,
133
+ },
134
+ },
135
+ {
136
+ name: iraTool.TOOL_NAME,
137
+ description: iraTool.TOOL_DESCRIPTION,
138
+ inputSchema: zodToJsonSchema(iraTool.IraContributionLimitInputSchema),
139
+ annotations: {
140
+ title: "IRA Contribution Limit",
141
+ ...READ_ONLY_ANNOTATIONS,
142
+ },
143
+ },
144
+ {
145
+ name: rothConversionTool.TOOL_NAME,
146
+ description: rothConversionTool.TOOL_DESCRIPTION,
147
+ inputSchema: zodToJsonSchema(rothConversionTool.RothConversionTaxImpactInputSchema),
148
+ annotations: {
149
+ title: "Roth Conversion Tax Impact",
150
+ ...READ_ONLY_ANNOTATIONS,
151
+ },
152
+ },
153
+ {
154
+ name: rmdTool.TOOL_NAME,
155
+ description: rmdTool.TOOL_DESCRIPTION,
156
+ inputSchema: zodToJsonSchema(rmdTool.RmdDistributionAmountInputSchema),
157
+ annotations: {
158
+ title: "RMD Distribution Amount",
159
+ ...READ_ONLY_ANNOTATIONS,
160
+ },
161
+ },
162
+ {
163
+ name: hsaTool.TOOL_NAME,
164
+ description: hsaTool.TOOL_DESCRIPTION,
165
+ inputSchema: zodToJsonSchema(hsaTool.HsaContributionLimitInputSchema),
166
+ annotations: {
167
+ title: "HSA Contribution Limit",
168
+ ...READ_ONLY_ANNOTATIONS,
169
+ },
84
170
  },
85
171
  ],
86
172
  };
@@ -107,6 +193,18 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
107
193
  case paycheckTool.TOOL_NAME:
108
194
  result = paycheckTool.execute(args);
109
195
  break;
196
+ case iraTool.TOOL_NAME:
197
+ result = iraTool.execute(args);
198
+ break;
199
+ case rothConversionTool.TOOL_NAME:
200
+ result = rothConversionTool.execute(args);
201
+ break;
202
+ case rmdTool.TOOL_NAME:
203
+ result = rmdTool.execute(args);
204
+ break;
205
+ case hsaTool.TOOL_NAME:
206
+ result = hsaTool.execute(args);
207
+ break;
110
208
  default:
111
209
  return {
112
210
  isError: true,
@@ -181,7 +279,7 @@ async function main() {
181
279
  const transport = new StdioServerTransport();
182
280
  await server.connect(transport);
183
281
  // eslint-disable-next-line no-console
184
- console.error("[@markcolabs/mcp] v0.1.0 ready (stdio) — 5 tools registered.");
282
+ console.error("[@markcolabs/mcp] v0.3.0 ready (stdio) — 9 tools registered.");
185
283
  }
186
284
  // Run only when invoked as a binary, not when imported by parity tests.
187
285
  const isDirect = import.meta.url === `file://${process.argv[1]}` ||
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -80,4 +80,54 @@ export type PaycheckPayFrequencyLabel = keyof typeof PAYCHECK_PAY_FREQUENCY;
80
80
  /** Federal filing-status enum (camelCase, matches paycheck engine). */
81
81
  export declare const FEDERAL_FILING_STATUS: readonly ["single", "married", "marriedSeparate", "headOfHousehold"];
82
82
  export type FederalFilingStatusLabel = (typeof FEDERAL_FILING_STATUS)[number];
83
+ export declare const IRA_BOUNDS: {
84
+ readonly MIN_AGE: 18;
85
+ readonly MAX_AGE: 100;
86
+ readonly MIN_MAGI: 0;
87
+ readonly MAX_MAGI: 10000000;
88
+ };
89
+ /**
90
+ * Allowed IRA filing-status labels. Mirrors the engine's `IraFilingStatus`.
91
+ * Camelcase keys match the rest of the MCP package's filing-status convention
92
+ * (paycheck engine, federal-tax data).
93
+ */
94
+ export declare const IRA_FILING_STATUS: readonly ["single", "marriedFilingJointly", "marriedFilingSeparately", "headOfHousehold"];
95
+ export type IraFilingStatusLabel = (typeof IRA_FILING_STATUS)[number];
96
+ /** Allowed IRA types — drives Roth vs Traditional phase-out semantics. */
97
+ export declare const IRA_TYPES: readonly ["traditional", "roth"];
98
+ export type IraTypeLabel = (typeof IRA_TYPES)[number];
99
+ export declare const ROTH_CONVERSION_BOUNDS: {
100
+ readonly MIN_CONVERSION: 0;
101
+ readonly MAX_CONVERSION: 10000000;
102
+ readonly MIN_AGE: 18;
103
+ readonly MAX_AGE: 100;
104
+ readonly MIN_TAXABLE_INCOME: 0;
105
+ readonly MAX_TAXABLE_INCOME: 10000000;
106
+ readonly MIN_RETIREMENT_RATE_PERCENT: 0;
107
+ readonly MAX_RETIREMENT_RATE_PERCENT: 50;
108
+ readonly MIN_RETURN_PERCENT: 0;
109
+ readonly MAX_RETURN_PERCENT: 20;
110
+ };
111
+ export declare const RMD_BOUNDS: {
112
+ readonly MIN_OWNER_AGE: 73;
113
+ readonly MAX_OWNER_AGE: 120;
114
+ readonly MIN_BALANCE: 0;
115
+ readonly MAX_BALANCE: 100000000;
116
+ };
117
+ export declare const HSA_BOUNDS: {
118
+ readonly MIN_AGE: 18;
119
+ readonly MAX_AGE: 100;
120
+ readonly MIN_EMPLOYER_CONTRIBUTION: 0;
121
+ readonly MAX_EMPLOYER_CONTRIBUTION: 50000;
122
+ readonly MIN_MARGINAL_RATE_PERCENT: 0;
123
+ readonly MAX_MARGINAL_RATE_PERCENT: 50;
124
+ };
125
+ /**
126
+ * Allowed HSA coverage-tier labels. Mirrors the site calc's `coverageType`
127
+ * values (`'individual'` and `'family'`) but uses the IRS-canonical name
128
+ * `'self-only'` for the individual tier (matches IRS Rev. Proc. 2025-19
129
+ * language). Tool callers using the site spelling can map at the boundary.
130
+ */
131
+ export declare const HSA_COVERAGE_TIER: readonly ["self-only", "family"];
132
+ export type HsaCoverageTierLabel = (typeof HSA_COVERAGE_TIER)[number];
83
133
  //# sourceMappingURL=bounds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bounds.d.ts","sourceRoot":"","sources":["../../src/shared/bounds.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,eAAO,MAAM,eAAe;;;;;;;CAOlB,CAAC;AAKX,eAAO,MAAM,wBAAwB;;;;;;;;;CAS3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,UAAU,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,EAC/D,MAAM,CAOP,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AAQ3E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;CAiBzB,CAAC;AASX,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAWzB,CAAC;AAMX,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CACzC,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,EAC1E,MAAM,CAQP,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,sBAAsB,CAAC;AAE5E,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,sEAKxB,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"bounds.d.ts","sourceRoot":"","sources":["../../src/shared/bounds.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,eAAO,MAAM,eAAe;;;;;;;CAOlB,CAAC;AAKX,eAAO,MAAM,wBAAwB;;;;;;;;;CAS3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,UAAU,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,EAC/D,MAAM,CAOP,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AAQ3E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;CAiBzB,CAAC;AASX,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAWzB,CAAC;AAMX,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CACzC,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,EAC1E,MAAM,CAQP,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,sBAAsB,CAAC;AAE5E,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,sEAKxB,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAS9E,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,2FAKpB,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,0EAA0E;AAC1E,eAAO,MAAM,SAAS,kCAAmC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAQtD,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAazB,CAAC;AAYX,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAUX,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,kCAAmC,CAAC;AAClE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -118,4 +118,89 @@ export const FEDERAL_FILING_STATUS = [
118
118
  "marriedSeparate",
119
119
  "headOfHousehold",
120
120
  ];
121
+ // -----------------------------------------------------------------------------
122
+ // IRA contribution-limit bounds (S141 Wave 1A)
123
+ // -----------------------------------------------------------------------------
124
+ // Mirrors site/src/pages/ira-calculator form ranges + IRS plausibility caps.
125
+ // MAX_MAGI = $10M caps obvious absurd inputs while leaving room for actual
126
+ // high-earner Roth phase-out math (Roth single phase-out ends $168k 2026;
127
+ // MFJ ends $252k; cap of $10M leaves the curve well-defined either side).
128
+ export const IRA_BOUNDS = {
129
+ MIN_AGE: 18,
130
+ MAX_AGE: 100,
131
+ MIN_MAGI: 0,
132
+ MAX_MAGI: 10_000_000,
133
+ };
134
+ /**
135
+ * Allowed IRA filing-status labels. Mirrors the engine's `IraFilingStatus`.
136
+ * Camelcase keys match the rest of the MCP package's filing-status convention
137
+ * (paycheck engine, federal-tax data).
138
+ */
139
+ export const IRA_FILING_STATUS = [
140
+ "single",
141
+ "marriedFilingJointly",
142
+ "marriedFilingSeparately",
143
+ "headOfHousehold",
144
+ ];
145
+ /** Allowed IRA types — drives Roth vs Traditional phase-out semantics. */
146
+ export const IRA_TYPES = ["traditional", "roth"];
147
+ // -----------------------------------------------------------------------------
148
+ // Roth Conversion bounds (S141 Wave 1A)
149
+ // -----------------------------------------------------------------------------
150
+ // Mirrors site/src/pages/roth-conversion-calculator VALIDATION ranges.
151
+ // MIN_AGE=18 (legal IRA owner), MAX_AGE=100 (sanity cap), MAX_CONVERSION=$10M
152
+ // (per site MAX_BALANCE), MAX_TAXABLE_INCOME=$10M (same cap rationale).
153
+ export const ROTH_CONVERSION_BOUNDS = {
154
+ MIN_CONVERSION: 0,
155
+ MAX_CONVERSION: 10_000_000,
156
+ MIN_AGE: 18,
157
+ MAX_AGE: 100,
158
+ MIN_TAXABLE_INCOME: 0,
159
+ MAX_TAXABLE_INCOME: 10_000_000,
160
+ MIN_RETIREMENT_RATE_PERCENT: 0,
161
+ // Top federal bracket is 37%; cap at 50% leaves headroom for SECURE-2.0+
162
+ // policy moves without re-bounding.
163
+ MAX_RETIREMENT_RATE_PERCENT: 50,
164
+ MIN_RETURN_PERCENT: 0,
165
+ MAX_RETURN_PERCENT: 20,
166
+ };
167
+ // -----------------------------------------------------------------------------
168
+ // RMD (Required Minimum Distribution) bounds (S141 Wave 1B)
169
+ // -----------------------------------------------------------------------------
170
+ // Owner age floor 73 matches SECURE 2.0 RMD age for the 1951-1959 birth-year
171
+ // cohort (the common case for clients querying this tool in 2026). The site
172
+ // rmd-engine.js allows 70.5 (legacy pre-1951 cohort) but tool callers asking
173
+ // for an RMD before age 73 are almost certainly making an error; INPUT_VALIDATION
174
+ // is the safer default. Max age 120 matches Uniform Lifetime Table upper bound.
175
+ // MAX_BALANCE $100M caps obvious absurd inputs while leaving headroom for
176
+ // ultra-high-balance IRAs (Roth conversion litigation cases, etc.).
177
+ export const RMD_BOUNDS = {
178
+ MIN_OWNER_AGE: 73,
179
+ MAX_OWNER_AGE: 120,
180
+ MIN_BALANCE: 0,
181
+ MAX_BALANCE: 100_000_000,
182
+ };
183
+ // -----------------------------------------------------------------------------
184
+ // HSA (Health Savings Account) bounds (S141 Wave 1B)
185
+ // -----------------------------------------------------------------------------
186
+ // MIN_AGE 18 is the legal-adult floor for HDHP enrollment; MAX_AGE 100 is a
187
+ // sanity cap. MAX_EMPLOYER_CONTRIBUTION matches the family + catch-up limit
188
+ // ($9,750) — a single employer contribution exceeding that is implausible but
189
+ // gracefully clamped by the engine via Math.max(0, ...). MAX_MARGINAL_RATE 50%
190
+ // matches the Roth Conversion ceiling rationale.
191
+ export const HSA_BOUNDS = {
192
+ MIN_AGE: 18,
193
+ MAX_AGE: 100,
194
+ MIN_EMPLOYER_CONTRIBUTION: 0,
195
+ MAX_EMPLOYER_CONTRIBUTION: 50_000,
196
+ MIN_MARGINAL_RATE_PERCENT: 0,
197
+ MAX_MARGINAL_RATE_PERCENT: 50,
198
+ };
199
+ /**
200
+ * Allowed HSA coverage-tier labels. Mirrors the site calc's `coverageType`
201
+ * values (`'individual'` and `'family'`) but uses the IRS-canonical name
202
+ * `'self-only'` for the individual tier (matches IRS Rev. Proc. 2025-19
203
+ * language). Tool callers using the site spelling can map at the boundary.
204
+ */
205
+ export const HSA_COVERAGE_TIER = ["self-only", "family"];
121
206
  //# sourceMappingURL=bounds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/shared/bounds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/shared/bounds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * MCP tool wrapper for `dc.calculator.hsa.contributionLimit`.
3
+ *
4
+ * Per ADR-0039 § 1: tool name locked.
5
+ * Per ADR-0039 § 2: Zod input with bounds from shared/bounds.ts; enum for
6
+ * coverage tier; rate as whole-number percent.
7
+ * Per ADR-0039 § 3: returns ToolResult<HsaContributionLimitResult>.
8
+ * Per ADR-0039 § 4: errors funnel through ToolError.
9
+ *
10
+ * Scope per S141 Wave 1B: contribution-LIMIT and employer-reduction math
11
+ * only. Detailed federal/state/FICA tax-savings breakdown is a future tool
12
+ * (`dc.calculator.hsa.taxSavingsBreakdown`).
13
+ */
14
+ import { z } from "zod";
15
+ import { type HsaContributionLimitResult } from "../engines/hsa.js";
16
+ import { type ToolResult, type ToolError } from "../envelope.js";
17
+ /** Locked tool name per ADR-0039 § 1. */
18
+ export declare const TOOL_NAME = "dc.calculator.hsa.contributionLimit";
19
+ /**
20
+ * Zod input schema. Bounds come from shared/bounds.ts. Coverage tier uses
21
+ * IRS-canonical names (`"self-only"` and `"family"`) per Rev. Proc. 2025-19.
22
+ */
23
+ export declare const HsaContributionLimitInputSchema: z.ZodObject<{
24
+ age: z.ZodNumber;
25
+ coverageTier: z.ZodEnum<["self-only", "family"]>;
26
+ employerContribution: z.ZodOptional<z.ZodNumber>;
27
+ estimatedMarginalRatePercent: z.ZodOptional<z.ZodNumber>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ age: number;
30
+ coverageTier: "self-only" | "family";
31
+ employerContribution?: number | undefined;
32
+ estimatedMarginalRatePercent?: number | undefined;
33
+ }, {
34
+ age: number;
35
+ coverageTier: "self-only" | "family";
36
+ employerContribution?: number | undefined;
37
+ estimatedMarginalRatePercent?: number | undefined;
38
+ }>;
39
+ export type HsaContributionLimitToolInput = z.infer<typeof HsaContributionLimitInputSchema>;
40
+ /** Tool description used in mcp.tools/list. */
41
+ export declare const TOOL_DESCRIPTION: string;
42
+ /**
43
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
44
+ *
45
+ * Tagged-union return:
46
+ * { ok: true, value: ToolResult<...> }
47
+ * { ok: false, error: ToolError }
48
+ *
49
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
50
+ */
51
+ export declare function execute(rawInput: unknown): {
52
+ ok: true;
53
+ value: ToolResult<HsaContributionLimitResult>;
54
+ } | {
55
+ ok: false;
56
+ error: ToolError;
57
+ };
58
+ //# sourceMappingURL=hsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hsa.d.ts","sourceRoot":"","sources":["../../src/tools/hsa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,wCAAwC,CAAC;AAQ/D;;;GAGG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;EA8B1C,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,+BAA+B,CACvC,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,gBAAgB,QAYiD,CAAC;AAE/E;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,0BAA0B,CAAC,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CA0DlC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * MCP tool wrapper for `dc.calculator.hsa.contributionLimit`.
3
+ *
4
+ * Per ADR-0039 § 1: tool name locked.
5
+ * Per ADR-0039 § 2: Zod input with bounds from shared/bounds.ts; enum for
6
+ * coverage tier; rate as whole-number percent.
7
+ * Per ADR-0039 § 3: returns ToolResult<HsaContributionLimitResult>.
8
+ * Per ADR-0039 § 4: errors funnel through ToolError.
9
+ *
10
+ * Scope per S141 Wave 1B: contribution-LIMIT and employer-reduction math
11
+ * only. Detailed federal/state/FICA tax-savings breakdown is a future tool
12
+ * (`dc.calculator.hsa.taxSavingsBreakdown`).
13
+ */
14
+ import { z } from "zod";
15
+ import { contributionLimit, ENGINE_VERSION, } from "../engines/hsa.js";
16
+ import { HSA_BOUNDS, HSA_COVERAGE_TIER } from "../shared/bounds.js";
17
+ import { YMYL_DISCLAIMER } from "../disclaimers/ymyl.js";
18
+ import { makeResult, makeError, } from "../envelope.js";
19
+ /** Locked tool name per ADR-0039 § 1. */
20
+ export const TOOL_NAME = "dc.calculator.hsa.contributionLimit";
21
+ /** Methodology pointer — ADR-0039 § 3. */
22
+ const METHODOLOGY = {
23
+ url: "https://www.digitalcalculator.info/hsa-calculator/",
24
+ version: "2026-05-27",
25
+ };
26
+ /**
27
+ * Zod input schema. Bounds come from shared/bounds.ts. Coverage tier uses
28
+ * IRS-canonical names (`"self-only"` and `"family"`) per Rev. Proc. 2025-19.
29
+ */
30
+ export const HsaContributionLimitInputSchema = z.object({
31
+ age: z
32
+ .number()
33
+ .int()
34
+ .min(HSA_BOUNDS.MIN_AGE)
35
+ .max(HSA_BOUNDS.MAX_AGE)
36
+ .describe("Current age. Age >= 55 enables the statutory $1,000 HSA catch-up (IRC §223(b)(3)(B), not inflation-indexed)."),
37
+ coverageTier: z
38
+ .enum(HSA_COVERAGE_TIER)
39
+ .describe("HDHP coverage tier: 'self-only' (IRS canonical name; ≈ site spelling 'individual') or 'family'."),
40
+ employerContribution: z
41
+ .number()
42
+ .min(HSA_BOUNDS.MIN_EMPLOYER_CONTRIBUTION)
43
+ .max(HSA_BOUNDS.MAX_EMPLOYER_CONTRIBUTION)
44
+ .optional()
45
+ .describe("Optional annual employer HSA contribution, USD. Reduces the employee's eligible payroll-deduction room dollar-for-dollar because the IRS §223(b) limit is a TOTAL annual limit across all funding sources. Defaults to 0."),
46
+ estimatedMarginalRatePercent: z
47
+ .number()
48
+ .min(HSA_BOUNDS.MIN_MARGINAL_RATE_PERCENT)
49
+ .max(HSA_BOUNDS.MAX_MARGINAL_RATE_PERCENT)
50
+ .optional()
51
+ .describe("Optional estimated marginal tax rate, whole-number percent (e.g., 22 for 22%). When provided, the tool returns payrollDeductionTaxSavings = employeeMaxRemaining * (rate / 100). Treated as a combined federal+state+FICA proxy for v1; a detailed 3-component breakdown is a future tool."),
52
+ });
53
+ /** Tool description used in mcp.tools/list. */
54
+ export const TOOL_DESCRIPTION = "Compute the user's annual HSA contribution limit for 2026 given age, HDHP " +
55
+ "coverage tier (self-only or family), and optional employer contribution. " +
56
+ "Applies the IRS Rev. Proc. 2025-19 limits ($4,400 self-only, $8,750 family) " +
57
+ "plus the statutory $1,000 catch-up for age 55+ (IRC §223(b)(3)(B)). " +
58
+ "Employer contributions reduce the employee's eligible payroll-deduction " +
59
+ "room dollar-for-dollar (the IRS limit is a TOTAL annual limit across all " +
60
+ "sources). Optionally returns payrollDeductionTaxSavings when an estimated " +
61
+ "marginal tax rate is provided (combined fed+state+FICA proxy). Returns " +
62
+ "{ contributionLimit, catchUpEligible, catchUpAmount, totalContributionLimit, " +
63
+ "employerContribution, employeeMaxRemaining, payrollDeductionTaxSavings, meta }. " +
64
+ "SCOPE: contribution-limit math only — long-term growth projection and " +
65
+ "detailed federal/state/FICA tax-savings breakdown are out of scope for v1.";
66
+ /**
67
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
68
+ *
69
+ * Tagged-union return:
70
+ * { ok: true, value: ToolResult<...> }
71
+ * { ok: false, error: ToolError }
72
+ *
73
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
74
+ */
75
+ export function execute(rawInput) {
76
+ const parsed = HsaContributionLimitInputSchema.safeParse(rawInput);
77
+ if (!parsed.success) {
78
+ const first = parsed.error.issues[0];
79
+ return {
80
+ ok: false,
81
+ error: makeError({
82
+ code: "INPUT_VALIDATION",
83
+ message: first?.message ?? "Invalid input.",
84
+ field: first?.path.join(".") || undefined,
85
+ retriable: false,
86
+ }),
87
+ };
88
+ }
89
+ const input = parsed.data;
90
+ let payload;
91
+ try {
92
+ payload = contributionLimit(input);
93
+ }
94
+ catch (err) {
95
+ return {
96
+ ok: false,
97
+ error: makeError({
98
+ code: "INTERNAL",
99
+ message: "Engine error computing HSA contribution limit.",
100
+ retriable: false,
101
+ }),
102
+ };
103
+ }
104
+ if (!Number.isFinite(payload.contributionLimit) ||
105
+ !Number.isFinite(payload.catchUpAmount) ||
106
+ !Number.isFinite(payload.totalContributionLimit) ||
107
+ !Number.isFinite(payload.employerContribution) ||
108
+ !Number.isFinite(payload.employeeMaxRemaining) ||
109
+ !Number.isFinite(payload.payrollDeductionTaxSavings)) {
110
+ return {
111
+ ok: false,
112
+ error: makeError({
113
+ code: "INTERNAL",
114
+ message: "HSA contribution-limit engine produced a non-finite result.",
115
+ retriable: false,
116
+ }),
117
+ };
118
+ }
119
+ return {
120
+ ok: true,
121
+ value: makeResult({
122
+ result: payload,
123
+ methodology: METHODOLOGY,
124
+ engineVersion: ENGINE_VERSION,
125
+ disclaimer: YMYL_DISCLAIMER,
126
+ }),
127
+ };
128
+ }
129
+ //# sourceMappingURL=hsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hsa.js","sourceRoot":"","sources":["../../src/tools/hsa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MCP tool wrapper for `dc.calculator.ira.contributionLimit`.
3
+ *
4
+ * Per ADR-0039 § 1: tool name locked.
5
+ * Per ADR-0039 § 2: Zod input with bounds from shared/bounds.ts; enums for
6
+ * filing-status + IRA type; MAGI as USD.
7
+ * Per ADR-0039 § 3: returns ToolResult<IraContributionLimitResult>.
8
+ * Per ADR-0039 § 4: errors funnel through ToolError.
9
+ */
10
+ import { z } from "zod";
11
+ import { type IraContributionLimitResult } from "../engines/ira.js";
12
+ import { type ToolResult, type ToolError } from "../envelope.js";
13
+ /** Locked tool name per ADR-0039 § 1. */
14
+ export declare const TOOL_NAME = "dc.calculator.ira.contributionLimit";
15
+ /**
16
+ * Zod input schema. Bounds come from shared/bounds.ts so engine and schema
17
+ * cannot drift. Filing status + IRA type are enums (z.enum is more strict
18
+ * than a free string).
19
+ */
20
+ export declare const IraContributionLimitInputSchema: z.ZodObject<{
21
+ age: z.ZodNumber;
22
+ filingStatus: z.ZodEnum<["single", "marriedFilingJointly", "marriedFilingSeparately", "headOfHousehold"]>;
23
+ magi: z.ZodNumber;
24
+ type: z.ZodEnum<["traditional", "roth"]>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ type: "traditional" | "roth";
27
+ age: number;
28
+ filingStatus: "single" | "headOfHousehold" | "marriedFilingJointly" | "marriedFilingSeparately";
29
+ magi: number;
30
+ }, {
31
+ type: "traditional" | "roth";
32
+ age: number;
33
+ filingStatus: "single" | "headOfHousehold" | "marriedFilingJointly" | "marriedFilingSeparately";
34
+ magi: number;
35
+ }>;
36
+ export type IraContributionLimitToolInput = z.infer<typeof IraContributionLimitInputSchema>;
37
+ /** Tool description used in mcp.tools/list. */
38
+ export declare const TOOL_DESCRIPTION: string;
39
+ /**
40
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
41
+ *
42
+ * Tagged-union return:
43
+ * { ok: true, value: ToolResult<...> }
44
+ * { ok: false, error: ToolError }
45
+ *
46
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
47
+ */
48
+ export declare function execute(rawInput: unknown): {
49
+ ok: true;
50
+ value: ToolResult<IraContributionLimitResult>;
51
+ } | {
52
+ ok: false;
53
+ error: ToolError;
54
+ };
55
+ //# sourceMappingURL=ira.d.ts.map