@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.
- package/LICENSE +21 -0
- package/LICENSE-API.md +111 -0
- package/README.md +128 -205
- package/dist/engines/compoundInterest.d.ts +8 -6
- package/dist/engines/compoundInterest.d.ts.map +1 -1
- package/dist/engines/compoundInterest.js +8 -6
- package/dist/engines/compoundInterest.js.map +1 -1
- package/dist/engines/data/irs2026.d.ts +110 -3
- package/dist/engines/data/irs2026.d.ts.map +1 -1
- package/dist/engines/data/irs2026.js +86 -3
- package/dist/engines/data/irs2026.js.map +1 -1
- package/dist/engines/data/rmd2026.d.ts +59 -0
- package/dist/engines/data/rmd2026.d.ts.map +1 -0
- package/dist/engines/data/rmd2026.js +75 -0
- package/dist/engines/data/rmd2026.js.map +1 -0
- package/dist/engines/data/stateTax2026.d.ts +114 -0
- package/dist/engines/data/stateTax2026.d.ts.map +1 -0
- package/dist/engines/data/stateTax2026.js +348 -0
- package/dist/engines/data/stateTax2026.js.map +1 -0
- package/dist/engines/hsa.d.ts +110 -0
- package/dist/engines/hsa.d.ts.map +1 -0
- package/dist/engines/hsa.js +83 -0
- package/dist/engines/hsa.js.map +1 -0
- package/dist/engines/ira.d.ts +115 -0
- package/dist/engines/ira.d.ts.map +1 -0
- package/dist/engines/ira.js +127 -0
- package/dist/engines/ira.js.map +1 -0
- package/dist/engines/mortgage.d.ts +7 -6
- package/dist/engines/mortgage.d.ts.map +1 -1
- package/dist/engines/mortgage.js +7 -6
- package/dist/engines/mortgage.js.map +1 -1
- package/dist/engines/paycheck.d.ts +57 -18
- package/dist/engines/paycheck.d.ts.map +1 -1
- package/dist/engines/paycheck.js +59 -26
- package/dist/engines/paycheck.js.map +1 -1
- package/dist/engines/retirement401k.d.ts +7 -3
- package/dist/engines/retirement401k.d.ts.map +1 -1
- package/dist/engines/retirement401k.js +7 -3
- package/dist/engines/retirement401k.js.map +1 -1
- package/dist/engines/rmd.d.ts +107 -0
- package/dist/engines/rmd.d.ts.map +1 -0
- package/dist/engines/rmd.js +109 -0
- package/dist/engines/rmd.js.map +1 -0
- package/dist/engines/rothConversion.d.ts +124 -0
- package/dist/engines/rothConversion.d.ts.map +1 -0
- package/dist/engines/rothConversion.js +145 -0
- package/dist/engines/rothConversion.js.map +1 -0
- package/dist/engines/socialSecurity.d.ts +7 -3
- package/dist/engines/socialSecurity.d.ts.map +1 -1
- package/dist/engines/socialSecurity.js +7 -3
- package/dist/engines/socialSecurity.js.map +1 -1
- package/dist/index.d.ts +21 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -11
- package/dist/index.js.map +1 -1
- package/dist/shared/bounds.d.ts +50 -0
- package/dist/shared/bounds.d.ts.map +1 -1
- package/dist/shared/bounds.js +85 -0
- package/dist/shared/bounds.js.map +1 -1
- package/dist/tools/hsa.d.ts +58 -0
- package/dist/tools/hsa.d.ts.map +1 -0
- package/dist/tools/hsa.js +129 -0
- package/dist/tools/hsa.js.map +1 -0
- package/dist/tools/ira.d.ts +55 -0
- package/dist/tools/ira.d.ts.map +1 -0
- package/dist/tools/ira.js +117 -0
- package/dist/tools/ira.js.map +1 -0
- package/dist/tools/paycheck.d.ts +14 -7
- package/dist/tools/paycheck.d.ts.map +1 -1
- package/dist/tools/paycheck.js +24 -11
- package/dist/tools/paycheck.js.map +1 -1
- package/dist/tools/retirement401k.d.ts +3 -3
- package/dist/tools/retirement401k.d.ts.map +1 -1
- package/dist/tools/retirement401k.js +3 -3
- package/dist/tools/retirement401k.js.map +1 -1
- package/dist/tools/rmd.d.ts +60 -0
- package/dist/tools/rmd.d.ts.map +1 -0
- package/dist/tools/rmd.js +130 -0
- package/dist/tools/rmd.js.map +1 -0
- package/dist/tools/rothConversion.d.ts +66 -0
- package/dist/tools/rothConversion.d.ts.map +1 -0
- package/dist/tools/rothConversion.js +141 -0
- package/dist/tools/rothConversion.js.map +1 -0
- package/dist/tools/socialSecurity.d.ts +3 -3
- package/dist/tools/socialSecurity.d.ts.map +1 -1
- package/dist/tools/socialSecurity.js +3 -3
- package/dist/tools/socialSecurity.js.map +1 -1
- 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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* dc.calculator.
|
|
9
|
-
* dc.calculator.
|
|
10
|
-
* dc.calculator.
|
|
11
|
-
* dc.calculator.
|
|
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
|
-
*
|
|
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.
|
|
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.
|
|
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":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/bounds.d.ts
CHANGED
|
@@ -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"}
|
package/dist/shared/bounds.js
CHANGED
|
@@ -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
|