@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ira.d.ts","sourceRoot":"","sources":["../../src/tools/ira.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,wCAAwC,CAAC;AAQ/D;;;;GAIG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;EA0B1C,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,+BAA+B,CACvC,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,gBAAgB,QAQU,CAAC;AAExC;;;;;;;;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,CAyDlC"}
@@ -0,0 +1,117 @@
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 { contributionLimit, ENGINE_VERSION, } from "../engines/ira.js";
12
+ import { IRA_BOUNDS, IRA_FILING_STATUS, IRA_TYPES, } from "../shared/bounds.js";
13
+ import { YMYL_DISCLAIMER } from "../disclaimers/ymyl.js";
14
+ import { makeResult, makeError, } from "../envelope.js";
15
+ /** Locked tool name per ADR-0039 § 1. */
16
+ export const TOOL_NAME = "dc.calculator.ira.contributionLimit";
17
+ /** Methodology pointer — ADR-0039 § 3. */
18
+ const METHODOLOGY = {
19
+ url: "https://www.digitalcalculator.info/ira-calculator/",
20
+ version: "2026-05-27",
21
+ };
22
+ /**
23
+ * Zod input schema. Bounds come from shared/bounds.ts so engine and schema
24
+ * cannot drift. Filing status + IRA type are enums (z.enum is more strict
25
+ * than a free string).
26
+ */
27
+ export const IraContributionLimitInputSchema = z.object({
28
+ age: z
29
+ .number()
30
+ .int()
31
+ .min(IRA_BOUNDS.MIN_AGE)
32
+ .max(IRA_BOUNDS.MAX_AGE)
33
+ .describe("Current age. Age >= 50 enables the IRA catch-up contribution ($1,100 for 2026)."),
34
+ filingStatus: z
35
+ .enum(IRA_FILING_STATUS)
36
+ .describe("Federal filing status: single | marriedFilingJointly | marriedFilingSeparately | headOfHousehold."),
37
+ magi: z
38
+ .number()
39
+ .min(IRA_BOUNDS.MIN_MAGI)
40
+ .max(IRA_BOUNDS.MAX_MAGI)
41
+ .describe("Modified Adjusted Gross Income (MAGI), USD. Drives Roth contribution phase-out and the Traditional IRA deduction-phase-out signal."),
42
+ type: z
43
+ .enum(IRA_TYPES)
44
+ .describe("IRA type: 'traditional' (contribution limit is not MAGI-gated; deduction phase-out reported separately) or 'roth' (contribution itself is MAGI-phased)."),
45
+ });
46
+ /** Tool description used in mcp.tools/list. */
47
+ export const TOOL_DESCRIPTION = "Compute the user's eligible IRA contribution for 2026 given age, filing " +
48
+ "status, MAGI, and IRA type. Applies the IRS catch-up amount for age >= 50 " +
49
+ "and the Roth IRA MAGI phase-out per IRC §408A(c)(3). For Traditional, " +
50
+ "always returns the full contribution limit (Traditional contributions are " +
51
+ "not MAGI-gated — only the deductibility is, surfaced as " +
52
+ "`traditionalDeductionStatus`). Returns { eligibleContribution, " +
53
+ "traditionalCap, rothCap, catchUp, phaseOutReduction, catchUpEligible, " +
54
+ "traditionalDeductionStatus, meta }.";
55
+ /**
56
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
57
+ *
58
+ * Tagged-union return:
59
+ * { ok: true, value: ToolResult<...> }
60
+ * { ok: false, error: ToolError }
61
+ *
62
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
63
+ */
64
+ export function execute(rawInput) {
65
+ const parsed = IraContributionLimitInputSchema.safeParse(rawInput);
66
+ if (!parsed.success) {
67
+ const first = parsed.error.issues[0];
68
+ return {
69
+ ok: false,
70
+ error: makeError({
71
+ code: "INPUT_VALIDATION",
72
+ message: first?.message ?? "Invalid input.",
73
+ field: first?.path.join(".") || undefined,
74
+ retriable: false,
75
+ }),
76
+ };
77
+ }
78
+ const input = parsed.data;
79
+ let payload;
80
+ try {
81
+ payload = contributionLimit(input);
82
+ }
83
+ catch (err) {
84
+ return {
85
+ ok: false,
86
+ error: makeError({
87
+ code: "INTERNAL",
88
+ message: "Engine error computing IRA contribution limit.",
89
+ retriable: false,
90
+ }),
91
+ };
92
+ }
93
+ if (!Number.isFinite(payload.eligibleContribution) ||
94
+ !Number.isFinite(payload.traditionalCap) ||
95
+ !Number.isFinite(payload.rothCap) ||
96
+ !Number.isFinite(payload.catchUp) ||
97
+ !Number.isFinite(payload.phaseOutReduction)) {
98
+ return {
99
+ ok: false,
100
+ error: makeError({
101
+ code: "INTERNAL",
102
+ message: "IRA contribution-limit engine produced a non-finite result.",
103
+ retriable: false,
104
+ }),
105
+ };
106
+ }
107
+ return {
108
+ ok: true,
109
+ value: makeResult({
110
+ result: payload,
111
+ methodology: METHODOLOGY,
112
+ engineVersion: ENGINE_VERSION,
113
+ disclaimer: YMYL_DISCLAIMER,
114
+ }),
115
+ };
116
+ }
117
+ //# sourceMappingURL=ira.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ira.js","sourceRoot":"","sources":["../../src/tools/ira.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,18 @@
6
6
  * Per ADR-0039 § 3: returns ToolResult<PaycheckNetPayResult>.
7
7
  * Per ADR-0039 § 4: failures funnel through ToolError; tools never throw.
8
8
  *
9
- * YMYL note: state withholding varies by state (some have no income tax, some
10
- * have flat rates, some have brackets, some have local taxes). The v0.2.0
11
- * engine returns $0 for the 9 no-income-tax states and a flat 5% estimate
12
- * for all other states. Callers needing precise per-state withholding should
13
- * be directed to the full site calculator at the methodology link.
9
+ * v0.3.0 (S141 Item #5):
10
+ * - MCP-AUDIT-011 fix: state-aware tax via Tax Foundation 2026 effective
11
+ * rates (was flat 5%).
12
+ * - MCP-AUDIT-012 fix: Additional Medicare 0.9% uses FICA wages base
13
+ * (gross pre-tax cafeteria-plan deductions), not raw gross.
14
+ *
15
+ * YMYL note: state withholding varies by state. v0.3.0 returns $0 for the 9
16
+ * no-income-tax states and an effective-rate lookup (4 income tiers, Tax
17
+ * Foundation source) for all other states + DC. Per-state full-bracket
18
+ * simulation, SDI, and local-tax piggybacks (NYC, PA municipal EIT, etc.)
19
+ * are NOT modeled; callers needing precision should use the full site
20
+ * calculator at the methodology link.
14
21
  */
15
22
  import { z } from "zod";
16
23
  import { type PaycheckNetPayResult } from "../engines/paycheck.js";
@@ -22,7 +29,7 @@ export declare const PaycheckNetPayInputSchema: z.ZodObject<{
22
29
  payFrequency: z.ZodEnum<["quarterly" | "monthly" | "weekly" | "biweekly" | "semimonthly" | "annual", ...("quarterly" | "monthly" | "weekly" | "biweekly" | "semimonthly" | "annual")[]]>;
23
30
  federalFilingStatus: z.ZodEnum<["single" | "married" | "marriedSeparate" | "headOfHousehold", ...("single" | "married" | "marriedSeparate" | "headOfHousehold")[]]>;
24
31
  state: z.ZodString;
25
- dependents: z.ZodNumber;
32
+ dependents: z.ZodDefault<z.ZodNumber>;
26
33
  preTaxDeductionsAnnual: z.ZodNumber;
27
34
  postTaxDeductionsAnnual: z.ZodNumber;
28
35
  }, "strip", z.ZodTypeAny, {
@@ -40,7 +47,7 @@ export declare const PaycheckNetPayInputSchema: z.ZodObject<{
40
47
  state: string;
41
48
  preTaxDeductionsAnnual: number;
42
49
  postTaxDeductionsAnnual: number;
43
- dependents: number;
50
+ dependents?: number | undefined;
44
51
  }>;
45
52
  export type PaycheckNetPayToolInput = z.infer<typeof PaycheckNetPayInputSchema>;
46
53
  export declare const TOOL_DESCRIPTION: string;
@@ -1 +1 @@
1
- {"version":3,"file":"paycheck.d.ts","sourceRoot":"","sources":["../../src/tools/paycheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,kCAAkC,CAAC;AAoBzD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;EA4CpC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEhF,eAAO,MAAM,gBAAgB,QAOqB,CAAC;AAEnD,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAuDlC"}
1
+ {"version":3,"file":"paycheck.d.ts","sourceRoot":"","sources":["../../src/tools/paycheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,kCAAkC,CAAC;AAoBzD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;EAgDpC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEhF,eAAO,MAAM,gBAAgB,QAS2C,CAAC;AAEzE,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAuDlC"}
@@ -6,11 +6,18 @@
6
6
  * Per ADR-0039 § 3: returns ToolResult<PaycheckNetPayResult>.
7
7
  * Per ADR-0039 § 4: failures funnel through ToolError; tools never throw.
8
8
  *
9
- * YMYL note: state withholding varies by state (some have no income tax, some
10
- * have flat rates, some have brackets, some have local taxes). The v0.2.0
11
- * engine returns $0 for the 9 no-income-tax states and a flat 5% estimate
12
- * for all other states. Callers needing precise per-state withholding should
13
- * be directed to the full site calculator at the methodology link.
9
+ * v0.3.0 (S141 Item #5):
10
+ * - MCP-AUDIT-011 fix: state-aware tax via Tax Foundation 2026 effective
11
+ * rates (was flat 5%).
12
+ * - MCP-AUDIT-012 fix: Additional Medicare 0.9% uses FICA wages base
13
+ * (gross pre-tax cafeteria-plan deductions), not raw gross.
14
+ *
15
+ * YMYL note: state withholding varies by state. v0.3.0 returns $0 for the 9
16
+ * no-income-tax states and an effective-rate lookup (4 income tiers, Tax
17
+ * Foundation source) for all other states + DC. Per-state full-bracket
18
+ * simulation, SDI, and local-tax piggybacks (NYC, PA municipal EIT, etc.)
19
+ * are NOT modeled; callers needing precision should use the full site
20
+ * calculator at the methodology link.
14
21
  */
15
22
  import { z } from "zod";
16
23
  import { netPay, ENGINE_VERSION, } from "../engines/paycheck.js";
@@ -49,7 +56,11 @@ export const PaycheckNetPayInputSchema = z.object({
49
56
  .int()
50
57
  .min(PAYCHECK_BOUNDS.MIN_DEPENDENTS)
51
58
  .max(PAYCHECK_BOUNDS.MAX_DEPENDENTS)
52
- .describe("Number of dependents (Form W-4 line 3). Reserved for future engine versions; currently no effect."),
59
+ .default(0)
60
+ .describe("Number of dependents (Form W-4 line 3). Optional with default 0 as of v0.2.1. " +
61
+ "Currently has NO effect on the calculation — reserved for a future engine " +
62
+ "version that will wire Form W-4 line 3 dependent credits into the federal " +
63
+ "withholding math. See MCP-AUDIT-014 for the full-removal vs. wire-it-up decision."),
53
64
  preTaxDeductionsAnnual: z
54
65
  .number()
55
66
  .min(PAYCHECK_BOUNDS.MIN_PRETAX_DEDUCTIONS)
@@ -63,11 +74,13 @@ export const PaycheckNetPayInputSchema = z.object({
63
74
  });
64
75
  export const TOOL_DESCRIPTION = "Estimate net (take-home) pay per paycheck using the IRS 2026 federal " +
65
76
  "Percentage Method, FICA (Social Security 6.2% + Medicare 1.45% + Additional " +
66
- "Medicare 0.9% above thresholds), and a simplified state-tax estimate ($0 " +
67
- "for no-income-tax states; flat 5% otherwise). Returns gross/federal/FICA/" +
68
- "state per-paycheck amounts plus the annualized totals. State-specific " +
69
- "withholding tables, SDI, and local taxes are NOT modeled see the " +
70
- "methodology link for the full site calculator.";
77
+ "Medicare 0.9% above thresholds on FICA wages), and a state-aware tax " +
78
+ "estimate ($0 for the 9 no-income-tax states; Tax Foundation 2026 effective " +
79
+ "rates by income tier for all other states + DC). Returns gross/federal/FICA/" +
80
+ "state per-paycheck amounts plus annualized totals, plus the state-tax source " +
81
+ "citation, effective rate applied, and any state-specific caveats. Full " +
82
+ "per-state brackets, SDI, and local-tax piggybacks (NYC, PA EIT, etc.) are " +
83
+ "NOT modeled — see the methodology link for the full site calculator.";
71
84
  export function execute(rawInput) {
72
85
  const parsed = PaycheckNetPayInputSchema.safeParse(rawInput);
73
86
  if (!parsed.success) {
@@ -1 +1 @@
1
- {"version":3,"file":"paycheck.js","sourceRoot":"","sources":["../../src/tools/paycheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,MAAM,EACN,cAAc,GAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,UAAU,EACV,SAAS,GAGV,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,+BAA+B,CAAC;AAEzD,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,qEAAqE;IAC1E,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAG9D,CAAC;AAEF,MAAM,oBAAoB,GAGtB;IACF,qBAAqB,CAAC,CAAC,CAAC;IACxB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,eAAe,CAAC,uBAAuB,CAAC;SAC5C,GAAG,CAAC,eAAe,CAAC,uBAAuB,CAAC;SAC5C,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,oBAAoB,CAAC;SAC1B,QAAQ,CACP,gFAAgF,CACjF;IACH,mBAAmB,EAAE,CAAC;SACnB,IAAI,CAAC,oBAAoB,CAAC;SAC1B,QAAQ,CACP,8EAA8E,CAC/E;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,MAAM,CAAC,CAAC,CAAC;SACT,QAAQ,CACP,6EAA6E,CAC9E;IACH,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC;SACnC,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC;SACnC,QAAQ,CACP,mGAAmG,CACpG;IACH,sBAAsB,EAAE,CAAC;SACtB,MAAM,EAAE;SACR,GAAG,CAAC,eAAe,CAAC,qBAAqB,CAAC;SAC1C,GAAG,CAAC,eAAe,CAAC,qBAAqB,CAAC;SAC1C,QAAQ,CACP,kEAAkE,CACnE;IACH,uBAAuB,EAAE,CAAC;SACvB,MAAM,EAAE;SACR,GAAG,CAAC,eAAe,CAAC,sBAAsB,CAAC;SAC3C,GAAG,CAAC,eAAe,CAAC,sBAAsB,CAAC;SAC3C,QAAQ,CACP,qFAAqF,CACtF;CACJ,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,uEAAuE;IACvE,8EAA8E;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,qEAAqE;IACrE,gDAAgD,CAAC;AAEnD,MAAM,UAAU,OAAO,CACrB,QAAiB;IAIjB,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,SAAS,CAAC;gBACf,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,gBAAgB;gBAC3C,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;gBACzC,SAAS,EAAE,KAAK;aACjB,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAE1B,IAAI,OAA6B,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,SAAS,CAAC;gBACf,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,0CAA0C;gBACnD,SAAS,EAAE,KAAK;aACjB,CAAC;SACH,CAAC;IACJ,CAAC;IAED,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAChC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;QACpC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EACjC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,SAAS,CAAC;gBACf,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,+CAA+C;gBACxD,SAAS,EAAE,KAAK;aACjB,CAAC;SACH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,UAAU,CAAC;YAChB,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,cAAc;YAC7B,UAAU,EAAE,eAAe;SAC5B,CAAC;KACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"paycheck.js","sourceRoot":"","sources":["../../src/tools/paycheck.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP tool wrapper for `dc.calculator.401k.projection`.
2
+ * MCP tool wrapper for `dc.calculator.retirement401k.projection`.
3
3
  *
4
4
  * Per ADR-0039 § 1: tool name is locked.
5
5
  * Per ADR-0039 § 2: Zod input schema with bounds from shared/bounds.ts.
@@ -9,8 +9,8 @@
9
9
  import { z } from "zod";
10
10
  import { type Retirement401kProjectionResult } from "../engines/retirement401k.js";
11
11
  import { type ToolResult, type ToolError } from "../envelope.js";
12
- /** Locked tool name per ADR-0039 § 1. */
13
- export declare const TOOL_NAME = "dc.calculator.401k.projection";
12
+ /** Locked tool name per ADR-0039 § 1 (corrected v0.2.0 per ADR-0041 D2). */
13
+ export declare const TOOL_NAME = "dc.calculator.retirement401k.projection";
14
14
  /**
15
15
  * Zod input schema. Bounds come from shared/bounds.ts so engine + schema cannot drift.
16
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"retirement401k.d.ts","sourceRoot":"","sources":["../../src/tools/retirement401k.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,kCAAkC,CAAC;AAOzD;;GAEG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmE5C,CAAC;AAEL,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CACrD,OAAO,mCAAmC,CAC3C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAKI,CAAC;AAElC;;GAEG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,8BAA8B,CAAC,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAwDlC"}
1
+ {"version":3,"file":"retirement401k.d.ts","sourceRoot":"","sources":["../../src/tools/retirement401k.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,4EAA4E;AAC5E,eAAO,MAAM,SAAS,4CAA4C,CAAC;AAOnE;;GAEG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmE5C,CAAC;AAEL,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CACrD,OAAO,mCAAmC,CAC3C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAKI,CAAC;AAElC;;GAEG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,8BAA8B,CAAC,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAwDlC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP tool wrapper for `dc.calculator.401k.projection`.
2
+ * MCP tool wrapper for `dc.calculator.retirement401k.projection`.
3
3
  *
4
4
  * Per ADR-0039 § 1: tool name is locked.
5
5
  * Per ADR-0039 § 2: Zod input schema with bounds from shared/bounds.ts.
@@ -11,8 +11,8 @@ import { projection, ENGINE_VERSION, } from "../engines/retirement401k.js";
11
11
  import { RETIREMENT_401K_BOUNDS } from "../shared/bounds.js";
12
12
  import { YMYL_DISCLAIMER } from "../disclaimers/ymyl.js";
13
13
  import { makeResult, makeError, } from "../envelope.js";
14
- /** Locked tool name per ADR-0039 § 1. */
15
- export const TOOL_NAME = "dc.calculator.401k.projection";
14
+ /** Locked tool name per ADR-0039 § 1 (corrected v0.2.0 per ADR-0041 D2). */
15
+ export const TOOL_NAME = "dc.calculator.retirement401k.projection";
16
16
  const METHODOLOGY = {
17
17
  url: "https://www.digitalcalculator.info/401k-retirement-calculator/methodology/",
18
18
  version: "2026-05-09",
@@ -1 +1 @@
1
- {"version":3,"file":"retirement401k.js","sourceRoot":"","sources":["../../src/tools/retirement401k.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retirement401k.js","sourceRoot":"","sources":["../../src/tools/retirement401k.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * MCP tool wrapper for `dc.calculator.rmd.distributionAmount`.
3
+ *
4
+ * Per ADR-0039 § 1: tool name locked.
5
+ * Per ADR-0039 § 2: Zod input with bounds from shared/bounds.ts; balance as USD.
6
+ * Per ADR-0039 § 3: returns ToolResult<RmdDistributionAmountResult>.
7
+ * Per ADR-0039 § 4: errors funnel through ToolError.
8
+ *
9
+ * Scope per S141 Wave 1B: single-year RMD distribution-amount only. Uniform
10
+ * Lifetime Table (IRS Pub. 590-B Table III) is the only table applied for v1
11
+ * to maintain parity with the site source. Joint Life Expectancy Table
12
+ * (Table II) is reserved for a future minor when the site engine adds it.
13
+ */
14
+ import { z } from "zod";
15
+ import { type RmdDistributionAmountResult } from "../engines/rmd.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.rmd.distributionAmount";
19
+ /**
20
+ * Zod input schema. Bounds come from shared/bounds.ts so engine and schema
21
+ * cannot drift. `spouseAge` and `isSpouseSoleBeneficiary` are accepted but
22
+ * ignored in v1 (reserved for future Joint Life Expectancy Table support
23
+ * once the site engine adds Table II).
24
+ */
25
+ export declare const RmdDistributionAmountInputSchema: z.ZodObject<{
26
+ accountBalance: z.ZodNumber;
27
+ ownerAge: z.ZodNumber;
28
+ spouseAge: z.ZodOptional<z.ZodNumber>;
29
+ isSpouseSoleBeneficiary: z.ZodOptional<z.ZodBoolean>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ accountBalance: number;
32
+ ownerAge: number;
33
+ spouseAge?: number | undefined;
34
+ isSpouseSoleBeneficiary?: boolean | undefined;
35
+ }, {
36
+ accountBalance: number;
37
+ ownerAge: number;
38
+ spouseAge?: number | undefined;
39
+ isSpouseSoleBeneficiary?: boolean | undefined;
40
+ }>;
41
+ export type RmdDistributionAmountToolInput = z.infer<typeof RmdDistributionAmountInputSchema>;
42
+ /** Tool description used in mcp.tools/list. */
43
+ export declare const TOOL_DESCRIPTION: string;
44
+ /**
45
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
46
+ *
47
+ * Tagged-union return:
48
+ * { ok: true, value: ToolResult<...> }
49
+ * { ok: false, error: ToolError }
50
+ *
51
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
52
+ */
53
+ export declare function execute(rawInput: unknown): {
54
+ ok: true;
55
+ value: ToolResult<RmdDistributionAmountResult>;
56
+ } | {
57
+ ok: false;
58
+ error: ToolError;
59
+ };
60
+ //# sourceMappingURL=rmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rmd.d.ts","sourceRoot":"","sources":["../../src/tools/rmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,yCAAyC,CAAC;AAQhE;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;EA+B3C,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAClD,OAAO,gCAAgC,CACxC,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,gBAAgB,QAYD,CAAC;AAE7B;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,2BAA2B,CAAC,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAwDlC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * MCP tool wrapper for `dc.calculator.rmd.distributionAmount`.
3
+ *
4
+ * Per ADR-0039 § 1: tool name locked.
5
+ * Per ADR-0039 § 2: Zod input with bounds from shared/bounds.ts; balance as USD.
6
+ * Per ADR-0039 § 3: returns ToolResult<RmdDistributionAmountResult>.
7
+ * Per ADR-0039 § 4: errors funnel through ToolError.
8
+ *
9
+ * Scope per S141 Wave 1B: single-year RMD distribution-amount only. Uniform
10
+ * Lifetime Table (IRS Pub. 590-B Table III) is the only table applied for v1
11
+ * to maintain parity with the site source. Joint Life Expectancy Table
12
+ * (Table II) is reserved for a future minor when the site engine adds it.
13
+ */
14
+ import { z } from "zod";
15
+ import { distributionAmount, ENGINE_VERSION, } from "../engines/rmd.js";
16
+ import { RMD_BOUNDS } 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.rmd.distributionAmount";
21
+ /** Methodology pointer — ADR-0039 § 3. */
22
+ const METHODOLOGY = {
23
+ url: "https://www.digitalcalculator.info/rmd-calculator/",
24
+ version: "2026-05-27",
25
+ };
26
+ /**
27
+ * Zod input schema. Bounds come from shared/bounds.ts so engine and schema
28
+ * cannot drift. `spouseAge` and `isSpouseSoleBeneficiary` are accepted but
29
+ * ignored in v1 (reserved for future Joint Life Expectancy Table support
30
+ * once the site engine adds Table II).
31
+ */
32
+ export const RmdDistributionAmountInputSchema = z.object({
33
+ accountBalance: z
34
+ .number()
35
+ .min(RMD_BOUNDS.MIN_BALANCE)
36
+ .max(RMD_BOUNDS.MAX_BALANCE)
37
+ .describe("Prior year-end IRA / 401(k) / 403(b) / 457(b) balance, USD."),
38
+ ownerAge: z
39
+ .number()
40
+ .int()
41
+ .min(RMD_BOUNDS.MIN_OWNER_AGE)
42
+ .max(RMD_BOUNDS.MAX_OWNER_AGE)
43
+ .describe("Owner's age this calendar year. Must be >= 73 (SECURE 2.0 RMD age for the 1951-1959 birth-year cohort). Lower ages are pre-RMD; callers seeking projections for younger owners should use the calculator directly."),
44
+ spouseAge: z
45
+ .number()
46
+ .int()
47
+ .min(0)
48
+ .max(120)
49
+ .optional()
50
+ .describe("Optional spouse age. RESERVED for future Joint Life Expectancy Table support — v1 IGNORES this input and always applies the Uniform Lifetime Table (matches site parity)."),
51
+ isSpouseSoleBeneficiary: z
52
+ .boolean()
53
+ .optional()
54
+ .describe("Optional flag indicating spouse is the sole IRA beneficiary. RESERVED for future Joint Life Expectancy Table support — v1 IGNORES this input."),
55
+ });
56
+ /** Tool description used in mcp.tools/list. */
57
+ export const TOOL_DESCRIPTION = "Compute the required minimum distribution (RMD) for 2026 from a Traditional " +
58
+ "IRA / 401(k) / 403(b) / 457(b) account given the prior year-end balance and " +
59
+ "the owner's age. Applies the IRS Uniform Lifetime Table (Pub. 590-B Table III, " +
60
+ "post-2022 version) and reports the SECURE 2.0 §302 missed-RMD excise tax (25% " +
61
+ "default; reduced to 10% if corrected within the IRS correction window). " +
62
+ "SCOPE: single-year calculation only — multi-year projections are out of " +
63
+ "scope (use the calculator at /rmd-calculator/). The Joint Life Expectancy " +
64
+ "Table (Pub. 590-B Table II, applied when spouse is sole beneficiary and " +
65
+ "10+ years younger) is NOT implemented in v1; `spouseAge` and " +
66
+ "`isSpouseSoleBeneficiary` are accepted but ignored. Returns " +
67
+ "{ rmdAmount, distributionPeriod, lifeExpectancyFactor, tableUsed, " +
68
+ "penaltyIfMissed, meta }.";
69
+ /**
70
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
71
+ *
72
+ * Tagged-union return:
73
+ * { ok: true, value: ToolResult<...> }
74
+ * { ok: false, error: ToolError }
75
+ *
76
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
77
+ */
78
+ export function execute(rawInput) {
79
+ const parsed = RmdDistributionAmountInputSchema.safeParse(rawInput);
80
+ if (!parsed.success) {
81
+ const first = parsed.error.issues[0];
82
+ return {
83
+ ok: false,
84
+ error: makeError({
85
+ code: "INPUT_VALIDATION",
86
+ message: first?.message ?? "Invalid input.",
87
+ field: first?.path.join(".") || undefined,
88
+ retriable: false,
89
+ }),
90
+ };
91
+ }
92
+ const input = parsed.data;
93
+ let payload;
94
+ try {
95
+ payload = distributionAmount(input);
96
+ }
97
+ catch (err) {
98
+ return {
99
+ ok: false,
100
+ error: makeError({
101
+ code: "INTERNAL",
102
+ message: "Engine error computing RMD distribution amount.",
103
+ retriable: false,
104
+ }),
105
+ };
106
+ }
107
+ if (!Number.isFinite(payload.rmdAmount) ||
108
+ !Number.isFinite(payload.distributionPeriod) ||
109
+ !Number.isFinite(payload.lifeExpectancyFactor) ||
110
+ !Number.isFinite(payload.penaltyIfMissed)) {
111
+ return {
112
+ ok: false,
113
+ error: makeError({
114
+ code: "INTERNAL",
115
+ message: "RMD engine produced a non-finite result.",
116
+ retriable: false,
117
+ }),
118
+ };
119
+ }
120
+ return {
121
+ ok: true,
122
+ value: makeResult({
123
+ result: payload,
124
+ methodology: METHODOLOGY,
125
+ engineVersion: ENGINE_VERSION,
126
+ disclaimer: YMYL_DISCLAIMER,
127
+ }),
128
+ };
129
+ }
130
+ //# sourceMappingURL=rmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rmd.js","sourceRoot":"","sources":["../../src/tools/rmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * MCP tool wrapper for `dc.calculator.rothConversion.taxImpact`.
3
+ *
4
+ * Per ADR-0039 § 1: tool name locked.
5
+ * Per ADR-0039 § 2: Zod input with bounds from shared/bounds.ts; rate as
6
+ * whole-number Percent; enum for filing status.
7
+ * Per ADR-0039 § 3: returns ToolResult<RothConversionTaxImpactResult>.
8
+ * Per ADR-0039 § 4: errors funnel through ToolError.
9
+ *
10
+ * Scope per S141 Risk #2: SINGLE-CONVERSION tax impact only. Multi-year
11
+ * conversion-ladder optimization is a future tool. State tax and IRMAA tier
12
+ * impact are out of scope (documented in the tool description).
13
+ */
14
+ import { z } from "zod";
15
+ import { type RothConversionTaxImpactResult } from "../engines/rothConversion.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.rothConversion.taxImpact";
19
+ /**
20
+ * Zod input schema. Bounds come from shared/bounds.ts. Filing status uses
21
+ * the paycheck-engine FEDERAL_FILING_STATUS enum (single | married |
22
+ * marriedSeparate | headOfHousehold) for consistency with other federal-tax
23
+ * tools.
24
+ */
25
+ export declare const RothConversionTaxImpactInputSchema: z.ZodObject<{
26
+ conversionAmount: z.ZodNumber;
27
+ age: z.ZodNumber;
28
+ filingStatus: z.ZodEnum<["single", "married", "marriedSeparate", "headOfHousehold"]>;
29
+ currentTaxableIncome: z.ZodNumber;
30
+ retirementMarginalRatePercent: z.ZodOptional<z.ZodNumber>;
31
+ expectedReturnPercent: z.ZodOptional<z.ZodNumber>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ age: number;
34
+ filingStatus: "single" | "married" | "marriedSeparate" | "headOfHousehold";
35
+ conversionAmount: number;
36
+ currentTaxableIncome: number;
37
+ retirementMarginalRatePercent?: number | undefined;
38
+ expectedReturnPercent?: number | undefined;
39
+ }, {
40
+ age: number;
41
+ filingStatus: "single" | "married" | "marriedSeparate" | "headOfHousehold";
42
+ conversionAmount: number;
43
+ currentTaxableIncome: number;
44
+ retirementMarginalRatePercent?: number | undefined;
45
+ expectedReturnPercent?: number | undefined;
46
+ }>;
47
+ export type RothConversionTaxImpactToolInput = z.infer<typeof RothConversionTaxImpactInputSchema>;
48
+ /** Tool description used in mcp.tools/list. */
49
+ export declare const TOOL_DESCRIPTION: string;
50
+ /**
51
+ * Execute the tool. Validation + engine call wrapped in the standard envelope.
52
+ *
53
+ * Tagged-union return:
54
+ * { ok: true, value: ToolResult<...> }
55
+ * { ok: false, error: ToolError }
56
+ *
57
+ * The MCP SDK adapter at src/index.ts maps `ok=false` to `isError: true`.
58
+ */
59
+ export declare function execute(rawInput: unknown): {
60
+ ok: true;
61
+ value: ToolResult<RothConversionTaxImpactResult>;
62
+ } | {
63
+ ok: false;
64
+ error: ToolError;
65
+ };
66
+ //# sourceMappingURL=rothConversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rothConversion.d.ts","sourceRoot":"","sources":["../../src/tools/rothConversion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,8BAA8B,CAAC;AAItC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,yCAAyC;AACzC,eAAO,MAAM,SAAS,2CAA2C,CAAC;AAQlE;;;;;GAKG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;EA0C7C,CAAC;AAEH,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CACpD,OAAO,kCAAkC,CAC1C,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,gBAAgB,QAOiB,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,OAAO,GAEf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAA;CAAE,GAC9D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CA+DlC"}