@markcolabs/mcp 0.2.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/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/paycheck.d.ts +51 -16
- package/dist/engines/paycheck.d.ts.map +1 -1
- package/dist/engines/paycheck.js +53 -24
- package/dist/engines/paycheck.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/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -6
- 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/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/package.json +18 -4
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
|
|
@@ -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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"}
|
package/dist/tools/paycheck.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
|
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
|
|
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"}
|