@markcolabs/mcp 0.1.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 (74) hide show
  1. package/README.md +263 -0
  2. package/dist/disclaimers/ymyl.d.ts +16 -0
  3. package/dist/disclaimers/ymyl.d.ts.map +1 -0
  4. package/dist/disclaimers/ymyl.js +20 -0
  5. package/dist/disclaimers/ymyl.js.map +1 -0
  6. package/dist/engines/compoundInterest.d.ts +73 -0
  7. package/dist/engines/compoundInterest.d.ts.map +1 -0
  8. package/dist/engines/compoundInterest.js +72 -0
  9. package/dist/engines/compoundInterest.js.map +1 -0
  10. package/dist/engines/data/federalTax.d.ts +47 -0
  11. package/dist/engines/data/federalTax.d.ts.map +1 -0
  12. package/dist/engines/data/federalTax.js +111 -0
  13. package/dist/engines/data/federalTax.js.map +1 -0
  14. package/dist/engines/data/irs2026.d.ts +30 -0
  15. package/dist/engines/data/irs2026.d.ts.map +1 -0
  16. package/dist/engines/data/irs2026.js +30 -0
  17. package/dist/engines/data/irs2026.js.map +1 -0
  18. package/dist/engines/data/ssa.d.ts +39 -0
  19. package/dist/engines/data/ssa.d.ts.map +1 -0
  20. package/dist/engines/data/ssa.js +55 -0
  21. package/dist/engines/data/ssa.js.map +1 -0
  22. package/dist/engines/mortgage.d.ts +69 -0
  23. package/dist/engines/mortgage.d.ts.map +1 -0
  24. package/dist/engines/mortgage.js +59 -0
  25. package/dist/engines/mortgage.js.map +1 -0
  26. package/dist/engines/paycheck.d.ts +89 -0
  27. package/dist/engines/paycheck.d.ts.map +1 -0
  28. package/dist/engines/paycheck.js +109 -0
  29. package/dist/engines/paycheck.js.map +1 -0
  30. package/dist/engines/retirement401k.d.ts +105 -0
  31. package/dist/engines/retirement401k.d.ts.map +1 -0
  32. package/dist/engines/retirement401k.js +126 -0
  33. package/dist/engines/retirement401k.js.map +1 -0
  34. package/dist/engines/socialSecurity.d.ts +59 -0
  35. package/dist/engines/socialSecurity.d.ts.map +1 -0
  36. package/dist/engines/socialSecurity.js +135 -0
  37. package/dist/engines/socialSecurity.js.map +1 -0
  38. package/dist/envelope.d.ts +76 -0
  39. package/dist/envelope.d.ts.map +1 -0
  40. package/dist/envelope.js +34 -0
  41. package/dist/envelope.js.map +1 -0
  42. package/dist/index.d.ts +30 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +197 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/shared/bounds.d.ts +83 -0
  47. package/dist/shared/bounds.d.ts.map +1 -0
  48. package/dist/shared/bounds.js +121 -0
  49. package/dist/shared/bounds.js.map +1 -0
  50. package/dist/tools/compoundInterest.d.ts +48 -0
  51. package/dist/tools/compoundInterest.d.ts.map +1 -0
  52. package/dist/tools/compoundInterest.js +107 -0
  53. package/dist/tools/compoundInterest.js.map +1 -0
  54. package/dist/tools/mortgage.d.ts +51 -0
  55. package/dist/tools/mortgage.d.ts.map +1 -0
  56. package/dist/tools/mortgage.js +112 -0
  57. package/dist/tools/mortgage.js.map +1 -0
  58. package/dist/tools/paycheck.d.ts +54 -0
  59. package/dist/tools/paycheck.d.ts.map +1 -0
  60. package/dist/tools/paycheck.js +122 -0
  61. package/dist/tools/paycheck.js.map +1 -0
  62. package/dist/tools/retirement401k.d.ts +85 -0
  63. package/dist/tools/retirement401k.d.ts.map +1 -0
  64. package/dist/tools/retirement401k.js +141 -0
  65. package/dist/tools/retirement401k.js.map +1 -0
  66. package/dist/tools/socialSecurity.d.ts +51 -0
  67. package/dist/tools/socialSecurity.d.ts.map +1 -0
  68. package/dist/tools/socialSecurity.js +117 -0
  69. package/dist/tools/socialSecurity.js.map +1 -0
  70. package/dist/util/zod-to-json-schema.d.ts +28 -0
  71. package/dist/util/zod-to-json-schema.d.ts.map +1 -0
  72. package/dist/util/zod-to-json-schema.js +98 -0
  73. package/dist/util/zod-to-json-schema.js.map +1 -0
  74. package/package.json +53 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * 401(k) projection engine — lifted from
3
+ * site/src/pages/401k-retirement-calculator/401k-retirement-calculator.js
4
+ * (functions `calculateEmployerMatch`, `calculateFutureValue`,
5
+ * `generateYearlyBreakdown`, `getIRSLimit`, `getCatchUpAmount`,
6
+ * `calculate401kResults`).
7
+ *
8
+ * Per ADR-0039 § 5 (Calc-Engine Lift Pattern):
9
+ * - Pure synchronous functions of inputs → results. No DOM, no fetch.
10
+ * - ENGINE_VERSION bumps when math changes.
11
+ * - Parity tests at packages/mcp/test/parity/retirement401k.test.ts gate this
12
+ * engine against the source site calculator JS.
13
+ *
14
+ * MCP-side enhancement on top of the lift: the kickoff-defined input
15
+ * `annualSalaryGrowthPercent` is honored in this engine. The site engine
16
+ * applies a *flat* annual contribution; here we step year-by-year so each
17
+ * year's employee contribution + employer match scales with the cumulative
18
+ * salary growth. When `annualSalaryGrowthPercent === 0` the math is identical
19
+ * to the site engine (parity test "happy path" covers this).
20
+ *
21
+ * Math reference (year-by-year, mirroring the site's Math.pow form when growth=0):
22
+ * contrib_year_i = annualSalary * (1 + g)^i * (employeePct/100)
23
+ * (capped per IRS limit)
24
+ * match_year_i = annualSalary * (1 + g)^i * (matchedPct/100) * (employerMatchPct/100)
25
+ * balance_year_i = balance_year_{i-1} * (1 + r) + contrib_year_i + match_year_i
26
+ * balance_year_0 = currentBalance
27
+ *
28
+ * IRS limits: per IRS Notice 2025-67 (2026) — see engines/data/irs2026.ts.
29
+ */
30
+ import { LIMITS_401K_2026 } from "./data/irs2026.js";
31
+ /**
32
+ * SemVer of the 401(k) projection engine.
33
+ * - 0.2.0: initial port (S136). Co-incident with the package-wide S136 batch bump.
34
+ */
35
+ export const ENGINE_VERSION = "0.2.0";
36
+ const ROUND = (v) => Math.round(v * 100) / 100;
37
+ /**
38
+ * IRS contribution cap for a given age, mirroring `getIRSLimit` in the site engine.
39
+ */
40
+ function irsLimitForAge(age, catchUpEnabled) {
41
+ if (!catchUpEnabled ||
42
+ !Number.isFinite(age) ||
43
+ age < LIMITS_401K_2026.catchUpAge) {
44
+ return LIMITS_401K_2026.base;
45
+ }
46
+ if (age >= LIMITS_401K_2026.superCatchUpAgeStart &&
47
+ age <= LIMITS_401K_2026.superCatchUpAgeEnd) {
48
+ return LIMITS_401K_2026.totalWithSuperCatchUp;
49
+ }
50
+ return LIMITS_401K_2026.totalWithCatchUp;
51
+ }
52
+ /**
53
+ * Catch-up dollar amount for a given age, mirroring `getCatchUpAmount` in site engine.
54
+ */
55
+ function catchUpForAge(age, catchUpEnabled) {
56
+ if (!catchUpEnabled ||
57
+ !Number.isFinite(age) ||
58
+ age < LIMITS_401K_2026.catchUpAge) {
59
+ return 0;
60
+ }
61
+ if (age >= LIMITS_401K_2026.superCatchUpAgeStart &&
62
+ age <= LIMITS_401K_2026.superCatchUpAgeEnd) {
63
+ return LIMITS_401K_2026.superCatchUp;
64
+ }
65
+ return LIMITS_401K_2026.catchUp;
66
+ }
67
+ /**
68
+ * Project a 401(k) balance year by year through retirement.
69
+ *
70
+ * Uses the same per-year accumulation pattern as the site's
71
+ * `generateYearlyBreakdown` / `calculateFutureValue` (compounded annual return,
72
+ * end-of-year contributions). Differs from the site only in honoring
73
+ * `annualSalaryGrowthPercent` per kickoff input list.
74
+ */
75
+ export function projection(input) {
76
+ const { currentBalance, annualSalary, contributionPercent, employerMatchPercent, employerMatchLimitPercent, annualSalaryGrowthPercent, annualReturnPercent, currentAge, retirementAge, catchUpEnabled = true, } = input;
77
+ const years = Math.max(0, Math.floor(retirementAge - currentAge));
78
+ const r = annualReturnPercent / 100;
79
+ const g = annualSalaryGrowthPercent / 100;
80
+ // matchedPct = min(employee contribution %, employer cap %)
81
+ const matchedPct = Math.min(contributionPercent, employerMatchLimitPercent);
82
+ let balance = currentBalance;
83
+ let totalContributions = 0;
84
+ let employerContribTotal = 0;
85
+ const rows = [];
86
+ for (let i = 1; i <= years; i++) {
87
+ const ageThisYear = currentAge + i;
88
+ const salaryThisYear = annualSalary * Math.pow(1 + g, i - 1);
89
+ // Base employee contribution from salary %, plus catch-up if eligible.
90
+ let employeeContrib = salaryThisYear * (contributionPercent / 100) +
91
+ catchUpForAge(ageThisYear, catchUpEnabled);
92
+ // Cap at IRS limit for this year's age (catch-up windows shift over time).
93
+ const cap = irsLimitForAge(ageThisYear, catchUpEnabled);
94
+ if (employeeContrib > cap)
95
+ employeeContrib = cap;
96
+ // Employer match scales with salary, capped by employer-match limit %.
97
+ const employerMatch = salaryThisYear *
98
+ (matchedPct / 100) *
99
+ (employerMatchPercent / 100);
100
+ // End-of-year compounding: prior balance grows, then this year's
101
+ // contributions land. (Matches site `calculateFutureValue` for flat salary.)
102
+ const grownBalance = balance * (1 + r);
103
+ const growthThisYear = grownBalance - balance;
104
+ balance = grownBalance + employeeContrib + employerMatch;
105
+ totalContributions += employeeContrib;
106
+ employerContribTotal += employerMatch;
107
+ rows.push({
108
+ year: i,
109
+ age: ageThisYear,
110
+ employeeContribution: ROUND(employeeContrib),
111
+ employerMatch: ROUND(employerMatch),
112
+ growth: ROUND(growthThisYear),
113
+ endingBalance: ROUND(balance),
114
+ });
115
+ }
116
+ const principalPlusContribs = currentBalance + totalContributions + employerContribTotal;
117
+ const growthEarned = balance - principalPlusContribs;
118
+ return {
119
+ futureBalance: ROUND(balance),
120
+ totalContributions: ROUND(totalContributions),
121
+ employerContribTotal: ROUND(employerContribTotal),
122
+ growthEarned: ROUND(growthEarned),
123
+ yearByYear: rows,
124
+ };
125
+ }
126
+ //# sourceMappingURL=retirement401k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retirement401k.js","sourceRoot":"","sources":["../../src/engines/retirement401k.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Social Security estimate engine — lifted from
3
+ * site/src/utils/social-security-engine.js (functions `estimateAIME`,
4
+ * `calculatePIA`, `calculateFRA`, `calculateAdjustedBenefit`,
5
+ * `calculateEarlyReduction`, `calculateDelayedCredit`,
6
+ * `calculateLifetimeBenefits`).
7
+ *
8
+ * Per ADR-0039 § 5: pure synchronous functions, ENGINE_VERSION constant,
9
+ * parity test against the site source as the gate.
10
+ *
11
+ * Math reference (mirrors SSA Publication 05-10035):
12
+ * AIME = (min(salary, ssWageBase) * 0.65 * min(yearsWorked, 35)) / 420
13
+ * (simplified site approximation; exact AIME requires 35-year history)
14
+ * PIA = 0.90 * min(AIME, BP1)
15
+ * + 0.32 * (min(AIME, BP2) - BP1) if AIME > BP1
16
+ * + 0.15 * (AIME - BP2) if AIME > BP2
17
+ * (rounded down to nearest $0.10)
18
+ * benefit_at_claim = PIA * adjustment_factor(claimAge, FRA)
19
+ *
20
+ * Output values are USD monthly benefits (or USD lifetime totals).
21
+ */
22
+ /**
23
+ * SemVer of the SS engine.
24
+ * - 0.2.0: initial port (S136). Co-incident with the package-wide S136 batch bump.
25
+ */
26
+ export declare const ENGINE_VERSION = "0.2.0";
27
+ /** Inputs to the SS estimate engine. */
28
+ export interface SocialSecurityEstimateInput {
29
+ /** Birth year (1943-2004 supported). */
30
+ birthYear: number;
31
+ /** Current/final annual earnings, USD. */
32
+ currentEarnings: number;
33
+ /** Claiming age (62..70). */
34
+ claimAge: number;
35
+ /**
36
+ * Years of work earning SS credits. Used in the simplified AIME estimate.
37
+ * Defaults to 35 (the SSA averaging window).
38
+ */
39
+ yearsWorked?: number;
40
+ /** Life-expectancy assumption for lifetime projection. Default 85. */
41
+ lifeExpectancy?: number;
42
+ }
43
+ /** Result payload returned by the engine. */
44
+ export interface SocialSecurityEstimateResult {
45
+ /** Monthly benefit at Full Retirement Age (PIA), USD. */
46
+ monthlyBenefitAtFRA: number;
47
+ /** Monthly benefit at the user's chosen claim age, USD. */
48
+ adjustedMonthlyBenefit: number;
49
+ /** Total benefit collected from claimAge through lifeExpectancy, USD. */
50
+ lifetimeBenefitProjection: number;
51
+ /** Full Retirement Age in decimal (e.g., 67.0 or 66.5). */
52
+ fraAge: number;
53
+ /** Eligibility year used for bend-point lookup (birthYear + 62). */
54
+ eligibilityYear: number;
55
+ /** Whether bend points are estimated (eligibility year beyond published table). */
56
+ bendPointsEstimated: boolean;
57
+ }
58
+ export declare function estimate(input: SocialSecurityEstimateInput): SocialSecurityEstimateResult;
59
+ //# sourceMappingURL=socialSecurity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socialSecurity.d.ts","sourceRoot":"","sources":["../../src/engines/socialSecurity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH;;;GAGG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,wCAAwC;AACxC,MAAM,WAAW,2BAA2B;IAC1C,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,eAAe,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,4BAA4B;IAC3C,yDAAyD;IACzD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2DAA2D;IAC3D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yEAAyE;IACzE,yBAAyB,EAAE,MAAM,CAAC;IAClC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAsGD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,2BAA2B,GACjC,4BAA4B,CAiC9B"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Social Security estimate engine — lifted from
3
+ * site/src/utils/social-security-engine.js (functions `estimateAIME`,
4
+ * `calculatePIA`, `calculateFRA`, `calculateAdjustedBenefit`,
5
+ * `calculateEarlyReduction`, `calculateDelayedCredit`,
6
+ * `calculateLifetimeBenefits`).
7
+ *
8
+ * Per ADR-0039 § 5: pure synchronous functions, ENGINE_VERSION constant,
9
+ * parity test against the site source as the gate.
10
+ *
11
+ * Math reference (mirrors SSA Publication 05-10035):
12
+ * AIME = (min(salary, ssWageBase) * 0.65 * min(yearsWorked, 35)) / 420
13
+ * (simplified site approximation; exact AIME requires 35-year history)
14
+ * PIA = 0.90 * min(AIME, BP1)
15
+ * + 0.32 * (min(AIME, BP2) - BP1) if AIME > BP1
16
+ * + 0.15 * (AIME - BP2) if AIME > BP2
17
+ * (rounded down to nearest $0.10)
18
+ * benefit_at_claim = PIA * adjustment_factor(claimAge, FRA)
19
+ *
20
+ * Output values are USD monthly benefits (or USD lifetime totals).
21
+ */
22
+ import { SSA_BEND_POINTS, SS_WAGE_BASE, DEFAULT_LIFE_EXPECTANCY, } from "./data/ssa.js";
23
+ /**
24
+ * SemVer of the SS engine.
25
+ * - 0.2.0: initial port (S136). Co-incident with the package-wide S136 batch bump.
26
+ */
27
+ export const ENGINE_VERSION = "0.2.0";
28
+ // ---------------------------------------------------------------------------
29
+ // FRA lookup (mirrors site engine FRA_TABLE)
30
+ // ---------------------------------------------------------------------------
31
+ /** FRA in years.months for a given birth year. Returns total months for math use. */
32
+ function fraTotalMonths(birthYear) {
33
+ if (birthYear <= 1954)
34
+ return 792; // 66.0
35
+ if (birthYear >= 1960)
36
+ return 804; // 67.0
37
+ // 1955-1959 transition: +2 months per year.
38
+ const map = {
39
+ 1955: 794,
40
+ 1956: 796,
41
+ 1957: 798,
42
+ 1958: 800,
43
+ 1959: 802,
44
+ };
45
+ return map[birthYear] ?? 804;
46
+ }
47
+ function fraDecimal(birthYear) {
48
+ return fraTotalMonths(birthYear) / 12;
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Bend points
52
+ // ---------------------------------------------------------------------------
53
+ function getBendPoints(eligibilityYear) {
54
+ if (SSA_BEND_POINTS[eligibilityYear]) {
55
+ return { ...SSA_BEND_POINTS[eligibilityYear], estimated: false };
56
+ }
57
+ const years = Object.keys(SSA_BEND_POINTS)
58
+ .map(Number)
59
+ .sort((a, b) => b - a);
60
+ const latest = years[0];
61
+ return { ...SSA_BEND_POINTS[latest], estimated: true };
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // AIME / PIA / claim-age adjustment (verbatim port of site math)
65
+ // ---------------------------------------------------------------------------
66
+ function estimateAIME(currentSalary, yearsWorked, taxYear) {
67
+ const wageBase = SS_WAGE_BASE[taxYear] ?? SS_WAGE_BASE[2026];
68
+ const cappedSalary = Math.min(currentSalary, wageBase);
69
+ const careerAverageFactor = 0.65;
70
+ const avgAnnualEarnings = cappedSalary * careerAverageFactor;
71
+ const effectiveYears = Math.min(yearsWorked, 35);
72
+ const totalEarnings = avgAnnualEarnings * effectiveYears;
73
+ return Math.floor(totalEarnings / 420);
74
+ }
75
+ function calculatePIA(aime, bp) {
76
+ let pia = 0.9 * Math.min(aime, bp.first);
77
+ if (aime > bp.first) {
78
+ pia += 0.32 * (Math.min(aime, bp.second) - bp.first);
79
+ }
80
+ if (aime > bp.second) {
81
+ pia += 0.15 * (aime - bp.second);
82
+ }
83
+ // PIA rounded down to nearest $0.10 per SSA convention.
84
+ return Math.floor(pia * 10) / 10;
85
+ }
86
+ /**
87
+ * Adjustment factor for claim age vs. FRA. < 1 is early reduction, > 1 is delayed credit.
88
+ * Mirrors site `calculateEarlyReduction` + `calculateDelayedCredit`.
89
+ */
90
+ function adjustmentFactor(claimAgeMonths, fraMonths) {
91
+ if (claimAgeMonths === fraMonths)
92
+ return 1.0;
93
+ if (claimAgeMonths < fraMonths) {
94
+ const monthsEarly = fraMonths - claimAgeMonths;
95
+ let reduction = 0;
96
+ const first36 = Math.min(monthsEarly, 36);
97
+ reduction += first36 * (5 / 9) / 100;
98
+ if (monthsEarly > 36) {
99
+ reduction += (monthsEarly - 36) * (5 / 12) / 100;
100
+ }
101
+ return Math.max(0, 1 - reduction);
102
+ }
103
+ // Delayed credit: 2/3 of 1% per month (8%/yr), capped at 70 (= 840 months).
104
+ const cappedMonths = Math.min(claimAgeMonths, 840);
105
+ if (cappedMonths <= fraMonths)
106
+ return 1.0;
107
+ const monthsDelayed = cappedMonths - fraMonths;
108
+ return 1 + monthsDelayed * (2 / 3) / 100;
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // Public API
112
+ // ---------------------------------------------------------------------------
113
+ export function estimate(input) {
114
+ const { birthYear, currentEarnings, claimAge, yearsWorked = 35, lifeExpectancy = DEFAULT_LIFE_EXPECTANCY, } = input;
115
+ const eligibilityYear = birthYear + 62;
116
+ const bp = getBendPoints(eligibilityYear);
117
+ const aime = estimateAIME(currentEarnings, yearsWorked, eligibilityYear);
118
+ const pia = calculatePIA(aime, bp);
119
+ const fraMonths = fraTotalMonths(birthYear);
120
+ const claimAgeMonths = claimAge * 12;
121
+ const adj = adjustmentFactor(claimAgeMonths, fraMonths);
122
+ const adjustedMonthly = Math.round(pia * adj * 100) / 100;
123
+ // Lifetime: monthly * 12 months * (lifeExpectancy − claimAge) years.
124
+ const yearsReceiving = Math.max(0, lifeExpectancy - claimAge);
125
+ const lifetime = Math.round(adjustedMonthly * 12 * yearsReceiving);
126
+ return {
127
+ monthlyBenefitAtFRA: pia,
128
+ adjustedMonthlyBenefit: adjustedMonthly,
129
+ lifetimeBenefitProjection: lifetime,
130
+ fraAge: fraDecimal(birthYear),
131
+ eligibilityYear,
132
+ bendPointsEstimated: bp.estimated,
133
+ };
134
+ }
135
+ //# sourceMappingURL=socialSecurity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socialSecurity.js","sourceRoot":"","sources":["../../src/engines/socialSecurity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,eAAe,EACf,YAAY,EACZ,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAmCtC,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,qFAAqF;AACrF,SAAS,cAAc,CAAC,SAAiB;IACvC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,OAAO;IAC1C,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,OAAO;IAC1C,4CAA4C;IAC5C,MAAM,GAAG,GAA2B;QAClC,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,GAAG;KACV,CAAC;IACF,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACnC,OAAO,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,SAAS,aAAa,CAAC,eAAuB;IAK5C,IAAI,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,GAAG,eAAe,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;SACvC,GAAG,CAAC,MAAM,CAAC;SACX,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,SAAS,YAAY,CAAC,aAAqB,EAAE,WAAmB,EAAE,OAAe;IAC/E,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAG,IAAI,CAAC;IACjC,MAAM,iBAAiB,GAAG,YAAY,GAAG,mBAAmB,CAAC;IAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,iBAAiB,GAAG,cAAc,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,EAAqC;IAErC,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,IAAI,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QACpB,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;QACrB,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,wDAAwD;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,cAAsB,EAAE,SAAiB;IACjE,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAE7C,IAAI,cAAc,GAAG,SAAS,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,SAAS,GAAG,cAAc,CAAC;QAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1C,SAAS,IAAI,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACrC,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;YACrB,SAAS,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,4EAA4E;IAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,YAAY,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,QAAQ,CACtB,KAAkC;IAElC,MAAM,EACJ,SAAS,EACT,eAAe,EACf,QAAQ,EACR,WAAW,GAAG,EAAE,EAChB,cAAc,GAAG,uBAAuB,GACzC,GAAG,KAAK,CAAC;IAEV,MAAM,eAAe,GAAG,SAAS,GAAG,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,YAAY,CAAC,eAAe,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,QAAQ,GAAG,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAExD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAE1D,qEAAqE;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;IAEnE,OAAO;QACL,mBAAmB,EAAE,GAAG;QACxB,sBAAsB,EAAE,eAAe;QACvC,yBAAyB,EAAE,QAAQ;QACnC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC;QAC7B,eAAe;QACf,mBAAmB,EAAE,EAAE,CAAC,SAAS;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Result + Error envelopes per ADR-0039 § 3 and § 4.
3
+ *
4
+ * Every tool returns a `ToolResult<T>` on success or a `ToolError` on failure.
5
+ * The envelope shape is invariant across all tools — only the `result` payload
6
+ * type varies. Provenance (engineVersion, methodology, calculatedAt) is
7
+ * non-negotiable.
8
+ */
9
+ /**
10
+ * Successful tool result envelope.
11
+ * @template T - Tool-specific payload type (always a structured object, never a bare number).
12
+ */
13
+ export interface ToolResult<T> {
14
+ /** Tool-specific payload. Structured object. Monetary fields are bare USD numbers. */
15
+ result: T;
16
+ /** Canonical YMYL disclaimer string (single source of truth at packages/mcp/src/disclaimers/ymyl.ts). */
17
+ disclaimer: string;
18
+ /** Methodology pointer with versioned URL. */
19
+ methodology: {
20
+ /** Absolute URL to the methodology .md companion (ADR-0033) or HTML page if no companion. */
21
+ url: string;
22
+ /** ISO date of the methodology document's last-modified front-matter (per ADR-0035). */
23
+ version: string;
24
+ };
25
+ /** ISO-8601 UTC timestamp the tool was invoked. */
26
+ calculatedAt: string;
27
+ /** SemVer of the calc engine module that produced `result`. Bumped when math changes. */
28
+ engineVersion: string;
29
+ }
30
+ /**
31
+ * Error envelope namespaces per ADR-0039 § 4.
32
+ *
33
+ * - INPUT_VALIDATION: Zod or bounds validation failed. Not retriable.
34
+ * - BUSINESS_RULE: Inputs valid but produce an undefined result. Not retriable.
35
+ * - INTERNAL: Unexpected engine error. Not retriable; opaque message to caller.
36
+ * - RATE_LIMIT: Free-tier rate limit hit. Retriable after the window resets.
37
+ */
38
+ export type ToolErrorCode = "INPUT_VALIDATION" | "BUSINESS_RULE" | "INTERNAL" | "RATE_LIMIT";
39
+ /**
40
+ * Failure envelope returned to the MCP transport with `isError: true`.
41
+ * Tools never throw to the transport — all failures funnel through this shape.
42
+ */
43
+ export interface ToolError {
44
+ error: {
45
+ /** Stable machine-readable code, namespaced by tool family. */
46
+ code: ToolErrorCode;
47
+ /** Human-readable description (no PII; safe to surface to end-user). */
48
+ message: string;
49
+ /** For validation errors, the input field that failed. */
50
+ field?: string;
51
+ /** True if a retry with same inputs *might* succeed. Validation errors are always false. */
52
+ retriable: boolean;
53
+ };
54
+ }
55
+ /**
56
+ * Build a ToolResult envelope around a successful payload. Helper to keep tools terse.
57
+ */
58
+ export declare function makeResult<T>(args: {
59
+ result: T;
60
+ methodology: {
61
+ url: string;
62
+ version: string;
63
+ };
64
+ engineVersion: string;
65
+ disclaimer: string;
66
+ }): ToolResult<T>;
67
+ /**
68
+ * Build a ToolError envelope for a failure path. Helper for terse call sites.
69
+ */
70
+ export declare function makeError(args: {
71
+ code: ToolErrorCode;
72
+ message: string;
73
+ field?: string;
74
+ retriable?: boolean;
75
+ }): ToolError;
76
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,sFAAsF;IACtF,MAAM,EAAE,CAAC,CAAC;IACV,yGAAyG;IACzG,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,WAAW,EAAE;QACX,6FAA6F;QAC7F,GAAG,EAAE,MAAM,CAAC;QACZ,wFAAwF;QACxF,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,eAAe,GACf,UAAU,GACV,YAAY,CAAC;AAEjB;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE;QACL,+DAA+D;QAC/D,IAAI,EAAE,aAAa,CAAC;QACpB,wEAAwE;QACxE,OAAO,EAAE,MAAM,CAAC;QAChB,0DAA0D;QAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,4FAA4F;QAC5F,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,UAAU,CAAC,CAAC,CAAC,CAQhB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,SAAS,CASZ"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Result + Error envelopes per ADR-0039 § 3 and § 4.
3
+ *
4
+ * Every tool returns a `ToolResult<T>` on success or a `ToolError` on failure.
5
+ * The envelope shape is invariant across all tools — only the `result` payload
6
+ * type varies. Provenance (engineVersion, methodology, calculatedAt) is
7
+ * non-negotiable.
8
+ */
9
+ /**
10
+ * Build a ToolResult envelope around a successful payload. Helper to keep tools terse.
11
+ */
12
+ export function makeResult(args) {
13
+ return {
14
+ result: args.result,
15
+ disclaimer: args.disclaimer,
16
+ methodology: args.methodology,
17
+ calculatedAt: new Date().toISOString(),
18
+ engineVersion: args.engineVersion,
19
+ };
20
+ }
21
+ /**
22
+ * Build a ToolError envelope for a failure path. Helper for terse call sites.
23
+ */
24
+ export function makeError(args) {
25
+ return {
26
+ error: {
27
+ code: args.code,
28
+ message: args.message,
29
+ field: args.field,
30
+ retriable: args.retriable ?? args.code === "RATE_LIMIT",
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuDH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAI,IAK7B;IACC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAKzB;IACC,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;SACxD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @markcolabs/mcp — MCP server entrypoint.
4
+ *
5
+ * Sprint 136 v0.1.0 (per ADR-0039). Registers:
6
+ * - 5 tools:
7
+ * dc.calculator.mortgage.monthlyPayment (S135 Item 5)
8
+ * dc.calculator.compoundInterest.futureValue (S135 Item 5)
9
+ * dc.calculator.401k.projection (S136 Item 3)
10
+ * dc.calculator.socialSecurity.estimate (S136 Item 3)
11
+ * dc.calculator.paycheck.netPay (S136 Item 3)
12
+ * - 1 resource: dc://disclaimers/ymyl (canonical YMYL disclaimer)
13
+ *
14
+ * Transport: stdio (default for local MCP clients).
15
+ *
16
+ * S136 hits O5-KR1 5-tool target. Post-S136: methodology resources
17
+ * (dc://methodologies/*) and the `plan-retirement` prompt template (O5-KR2).
18
+ */
19
+ export { execute as executeMortgageTool } from "./tools/mortgage.js";
20
+ export { execute as executeCompoundInterestTool } from "./tools/compoundInterest.js";
21
+ export { execute as executeRetirement401kTool } from "./tools/retirement401k.js";
22
+ export { execute as executeSocialSecurityTool } from "./tools/socialSecurity.js";
23
+ export { execute as executePaycheckTool } from "./tools/paycheck.js";
24
+ export * as mortgageEngine from "./engines/mortgage.js";
25
+ export * as compoundInterestEngine from "./engines/compoundInterest.js";
26
+ export * as retirement401kEngine from "./engines/retirement401k.js";
27
+ export * as socialSecurityEngine from "./engines/socialSecurity.js";
28
+ export * as paycheckEngine from "./engines/paycheck.js";
29
+ export * from "./envelope.js";
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAwBH,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,sBAAsB,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,cAAc,eAAe,CAAC"}