@markcolabs/mcp 0.2.0 → 0.4.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/README.md +128 -205
- package/dist/index.d.ts +9 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -186
- package/dist/index.js.map +1 -1
- package/package.json +21 -12
- package/dist/disclaimers/ymyl.d.ts +0 -16
- package/dist/disclaimers/ymyl.d.ts.map +0 -1
- package/dist/disclaimers/ymyl.js +0 -20
- package/dist/disclaimers/ymyl.js.map +0 -1
- package/dist/engines/compoundInterest.d.ts +0 -75
- package/dist/engines/compoundInterest.d.ts.map +0 -1
- package/dist/engines/compoundInterest.js +0 -74
- package/dist/engines/compoundInterest.js.map +0 -1
- package/dist/engines/data/federalTax.d.ts +0 -47
- package/dist/engines/data/federalTax.d.ts.map +0 -1
- package/dist/engines/data/federalTax.js +0 -111
- package/dist/engines/data/federalTax.js.map +0 -1
- package/dist/engines/data/irs2026.d.ts +0 -30
- package/dist/engines/data/irs2026.d.ts.map +0 -1
- package/dist/engines/data/irs2026.js +0 -30
- package/dist/engines/data/irs2026.js.map +0 -1
- package/dist/engines/data/ssa.d.ts +0 -39
- package/dist/engines/data/ssa.d.ts.map +0 -1
- package/dist/engines/data/ssa.js +0 -55
- package/dist/engines/data/ssa.js.map +0 -1
- package/dist/engines/mortgage.d.ts +0 -70
- package/dist/engines/mortgage.d.ts.map +0 -1
- package/dist/engines/mortgage.js +0 -60
- package/dist/engines/mortgage.js.map +0 -1
- package/dist/engines/paycheck.d.ts +0 -93
- package/dist/engines/paycheck.d.ts.map +0 -1
- package/dist/engines/paycheck.js +0 -113
- package/dist/engines/paycheck.js.map +0 -1
- package/dist/engines/retirement401k.d.ts +0 -109
- package/dist/engines/retirement401k.d.ts.map +0 -1
- package/dist/engines/retirement401k.js +0 -130
- package/dist/engines/retirement401k.js.map +0 -1
- package/dist/engines/socialSecurity.d.ts +0 -63
- package/dist/engines/socialSecurity.d.ts.map +0 -1
- package/dist/engines/socialSecurity.js +0 -139
- package/dist/engines/socialSecurity.js.map +0 -1
- package/dist/envelope.d.ts +0 -76
- package/dist/envelope.d.ts.map +0 -1
- package/dist/envelope.js +0 -34
- package/dist/envelope.js.map +0 -1
- package/dist/shared/bounds.d.ts +0 -83
- package/dist/shared/bounds.d.ts.map +0 -1
- package/dist/shared/bounds.js +0 -121
- package/dist/shared/bounds.js.map +0 -1
- package/dist/tools/compoundInterest.d.ts +0 -48
- package/dist/tools/compoundInterest.d.ts.map +0 -1
- package/dist/tools/compoundInterest.js +0 -107
- package/dist/tools/compoundInterest.js.map +0 -1
- package/dist/tools/mortgage.d.ts +0 -51
- package/dist/tools/mortgage.d.ts.map +0 -1
- package/dist/tools/mortgage.js +0 -112
- package/dist/tools/mortgage.js.map +0 -1
- package/dist/tools/paycheck.d.ts +0 -54
- package/dist/tools/paycheck.d.ts.map +0 -1
- package/dist/tools/paycheck.js +0 -122
- package/dist/tools/paycheck.js.map +0 -1
- package/dist/tools/retirement401k.d.ts +0 -85
- package/dist/tools/retirement401k.d.ts.map +0 -1
- package/dist/tools/retirement401k.js +0 -141
- package/dist/tools/retirement401k.js.map +0 -1
- package/dist/tools/socialSecurity.d.ts +0 -51
- package/dist/tools/socialSecurity.d.ts.map +0 -1
- package/dist/tools/socialSecurity.js +0 -117
- package/dist/tools/socialSecurity.js.map +0 -1
- package/dist/util/zod-to-json-schema.d.ts +0 -28
- package/dist/util/zod-to-json-schema.d.ts.map +0 -1
- package/dist/util/zod-to-json-schema.js +0 -98
- package/dist/util/zod-to-json-schema.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,197 +1,62 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* @markcolabs/mcp —
|
|
3
|
+
* @markcolabs/mcp v0.4.0 — stdio↔HTTPS shim.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* dc.calculator.mortgage.monthlyPayment (S135 Item 5)
|
|
8
|
-
* dc.calculator.compoundInterest.futureValue (S135 Item 5)
|
|
9
|
-
* dc.calculator.retirement401k.projection (S136 Item 3, renamed v0.2.0 per ADR-0041 D2)
|
|
10
|
-
* dc.calculator.socialSecurity.estimatedBenefit (S136 Item 3, renamed v0.2.0 per ADR-0041 D2)
|
|
11
|
-
* dc.calculator.paycheck.netPay (S136 Item 3)
|
|
12
|
-
* - 1 resource: dc://disclaimers/ymyl (canonical YMYL disclaimer)
|
|
5
|
+
* Proxies MCP JSON-RPC messages from stdin to the hosted MCP server at
|
|
6
|
+
* mcp.digitalcalculator.info/mcp and writes responses back to stdout.
|
|
13
7
|
*
|
|
14
|
-
*
|
|
8
|
+
* Per ADR-0044a (ACCEPTED 2026-05-28): engine source lives in the private
|
|
9
|
+
* monorepo at infra/mcp/. This shim contains no calculation logic — it is
|
|
10
|
+
* a thin transport adapter only. MIT-licensed.
|
|
15
11
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
12
|
+
* Claude Desktop config:
|
|
13
|
+
* { "mcpServers": { "digitalcalculator": { "command": "npx", "args": ["-y", "@markcolabs/mcp"] } } }
|
|
18
14
|
*/
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
export { execute as executePaycheckTool } from "./tools/paycheck.js";
|
|
36
|
-
export * as mortgageEngine from "./engines/mortgage.js";
|
|
37
|
-
export * as compoundInterestEngine from "./engines/compoundInterest.js";
|
|
38
|
-
export * as retirement401kEngine from "./engines/retirement401k.js";
|
|
39
|
-
export * as socialSecurityEngine from "./engines/socialSecurity.js";
|
|
40
|
-
export * as paycheckEngine from "./engines/paycheck.js";
|
|
41
|
-
export * from "./envelope.js";
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
// Server setup
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
const server = new Server({
|
|
46
|
-
name: "@markcolabs/mcp",
|
|
47
|
-
version: "0.2.0",
|
|
48
|
-
}, {
|
|
49
|
-
capabilities: {
|
|
50
|
-
tools: {},
|
|
51
|
-
resources: {},
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
// tools/list
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
58
|
-
return {
|
|
59
|
-
tools: [
|
|
60
|
-
{
|
|
61
|
-
name: mortgageTool.TOOL_NAME,
|
|
62
|
-
description: mortgageTool.TOOL_DESCRIPTION,
|
|
63
|
-
inputSchema: zodToJsonSchema(mortgageTool.MortgageMonthlyPaymentInputSchema),
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: compoundInterestTool.TOOL_NAME,
|
|
67
|
-
description: compoundInterestTool.TOOL_DESCRIPTION,
|
|
68
|
-
inputSchema: zodToJsonSchema(compoundInterestTool.CompoundInterestFutureValueInputSchema),
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: retirement401kTool.TOOL_NAME,
|
|
72
|
-
description: retirement401kTool.TOOL_DESCRIPTION,
|
|
73
|
-
inputSchema: zodToJsonSchema(retirement401kTool.Retirement401kProjectionInputSchema),
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
name: socialSecurityTool.TOOL_NAME,
|
|
77
|
-
description: socialSecurityTool.TOOL_DESCRIPTION,
|
|
78
|
-
inputSchema: zodToJsonSchema(socialSecurityTool.SocialSecurityEstimateInputSchema),
|
|
15
|
+
import * as readline from "readline";
|
|
16
|
+
import * as https from "https";
|
|
17
|
+
const MCP_ENDPOINT = "https://mcp.digitalcalculator.info/mcp";
|
|
18
|
+
const SESSION_ID = Math.random().toString(36).slice(2);
|
|
19
|
+
function post(body) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const url = new URL(MCP_ENDPOINT);
|
|
22
|
+
const data = Buffer.from(body);
|
|
23
|
+
const req = https.request({
|
|
24
|
+
hostname: url.hostname,
|
|
25
|
+
path: url.pathname,
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: {
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
"Content-Length": data.byteLength,
|
|
30
|
+
"Mcp-Session-Id": SESSION_ID,
|
|
79
31
|
},
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
case compoundInterestTool.TOOL_NAME:
|
|
99
|
-
result = compoundInterestTool.execute(args);
|
|
100
|
-
break;
|
|
101
|
-
case retirement401kTool.TOOL_NAME:
|
|
102
|
-
result = retirement401kTool.execute(args);
|
|
103
|
-
break;
|
|
104
|
-
case socialSecurityTool.TOOL_NAME:
|
|
105
|
-
result = socialSecurityTool.execute(args);
|
|
106
|
-
break;
|
|
107
|
-
case paycheckTool.TOOL_NAME:
|
|
108
|
-
result = paycheckTool.execute(args);
|
|
109
|
-
break;
|
|
110
|
-
default:
|
|
111
|
-
return {
|
|
112
|
-
isError: true,
|
|
113
|
-
content: [
|
|
114
|
-
{
|
|
115
|
-
type: "text",
|
|
116
|
-
text: JSON.stringify({
|
|
117
|
-
error: {
|
|
118
|
-
code: "INPUT_VALIDATION",
|
|
119
|
-
message: `Unknown tool: ${name}`,
|
|
120
|
-
retriable: false,
|
|
121
|
-
},
|
|
122
|
-
}),
|
|
123
|
-
},
|
|
124
|
-
],
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
if (result.ok) {
|
|
128
|
-
return {
|
|
129
|
-
content: [
|
|
130
|
-
{
|
|
131
|
-
type: "text",
|
|
132
|
-
text: JSON.stringify(result.value, null, 2),
|
|
133
|
-
},
|
|
134
|
-
],
|
|
135
|
-
};
|
|
32
|
+
}, (res) => {
|
|
33
|
+
const chunks = [];
|
|
34
|
+
res.on("data", (chunk) => chunks.push(chunk));
|
|
35
|
+
res.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
|
|
36
|
+
});
|
|
37
|
+
req.on("error", reject);
|
|
38
|
+
req.write(data);
|
|
39
|
+
req.end();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const rl = readline.createInterface({ input: process.stdin, terminal: false });
|
|
43
|
+
rl.on("line", async (line) => {
|
|
44
|
+
const trimmed = line.trim();
|
|
45
|
+
if (!trimmed)
|
|
46
|
+
return;
|
|
47
|
+
try {
|
|
48
|
+
const response = await post(trimmed);
|
|
49
|
+
process.stdout.write(response + "\n");
|
|
136
50
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
});
|
|
147
|
-
// ---------------------------------------------------------------------------
|
|
148
|
-
// resources/list — exposes the canonical YMYL disclaimer (O5-KR2 stub)
|
|
149
|
-
// ---------------------------------------------------------------------------
|
|
150
|
-
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
151
|
-
return {
|
|
152
|
-
resources: [
|
|
153
|
-
{
|
|
154
|
-
uri: YMYL_DISCLAIMER_URI,
|
|
155
|
-
name: "Canonical YMYL Disclaimer",
|
|
156
|
-
description: "Single source of truth for the YMYL disclaimer string returned in every tool response.",
|
|
157
|
-
mimeType: "text/plain",
|
|
158
|
-
},
|
|
159
|
-
],
|
|
160
|
-
};
|
|
161
|
-
});
|
|
162
|
-
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
163
|
-
const { uri } = request.params;
|
|
164
|
-
if (uri === YMYL_DISCLAIMER_URI) {
|
|
165
|
-
return {
|
|
166
|
-
contents: [
|
|
167
|
-
{
|
|
168
|
-
uri,
|
|
169
|
-
mimeType: "text/plain",
|
|
170
|
-
text: YMYL_DISCLAIMER,
|
|
171
|
-
},
|
|
172
|
-
],
|
|
173
|
-
};
|
|
51
|
+
catch (err) {
|
|
52
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
53
|
+
const parsed = (() => { try {
|
|
54
|
+
return JSON.parse(trimmed);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return {};
|
|
58
|
+
} })();
|
|
59
|
+
process.stdout.write(JSON.stringify({ jsonrpc: "2.0", id: parsed.id ?? null, error: { code: -32603, message } }) + "\n");
|
|
174
60
|
}
|
|
175
|
-
throw new Error(`Unknown resource: ${uri}`);
|
|
176
61
|
});
|
|
177
|
-
// ---------------------------------------------------------------------------
|
|
178
|
-
// Boot — only run when invoked directly (not when imported by tests).
|
|
179
|
-
// ---------------------------------------------------------------------------
|
|
180
|
-
async function main() {
|
|
181
|
-
const transport = new StdioServerTransport();
|
|
182
|
-
await server.connect(transport);
|
|
183
|
-
// eslint-disable-next-line no-console
|
|
184
|
-
console.error("[@markcolabs/mcp] v0.2.0 ready (stdio) — 5 tools registered.");
|
|
185
|
-
}
|
|
186
|
-
// Run only when invoked as a binary, not when imported by parity tests.
|
|
187
|
-
const isDirect = import.meta.url === `file://${process.argv[1]}` ||
|
|
188
|
-
process.argv[1]?.endsWith("dist/index.js") ||
|
|
189
|
-
process.argv[1]?.endsWith("dist\\index.js");
|
|
190
|
-
if (isDirect) {
|
|
191
|
-
main().catch((err) => {
|
|
192
|
-
// eslint-disable-next-line no-console
|
|
193
|
-
console.error("[@markcolabs/mcp] fatal:", err);
|
|
194
|
-
process.exit(1);
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
62
|
//# sourceMappingURL=index.js.map
|
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/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markcolabs/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "MCP stdio↔HTTPS shim for digitalcalculator.info financial calculators. Proxies MCP JSON-RPC to the hosted server at mcp.digitalcalculator.info/mcp. Per ADR-0044a: engine source is private; this package is a thin transport adapter only.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
@@ -12,22 +12,17 @@
|
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsc",
|
|
14
14
|
"start": "node ./dist/index.js",
|
|
15
|
-
"test": "vitest run",
|
|
16
|
-
"test:watch": "vitest",
|
|
17
15
|
"typecheck": "tsc --noEmit"
|
|
18
16
|
},
|
|
19
17
|
"files": [
|
|
20
18
|
"dist",
|
|
21
|
-
"README.md"
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
22
21
|
],
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
25
|
-
"zod": "^3.23.8"
|
|
26
|
-
},
|
|
22
|
+
"dependencies": {},
|
|
27
23
|
"devDependencies": {
|
|
28
24
|
"@types/node": "^20.12.7",
|
|
29
|
-
"typescript": "^5.4.5"
|
|
30
|
-
"vitest": "^4.0.18"
|
|
25
|
+
"typescript": "^5.4.5"
|
|
31
26
|
},
|
|
32
27
|
"engines": {
|
|
33
28
|
"node": ">=18.0.0"
|
|
@@ -35,16 +30,30 @@
|
|
|
35
30
|
"keywords": [
|
|
36
31
|
"mcp",
|
|
37
32
|
"model-context-protocol",
|
|
33
|
+
"mcp-server",
|
|
34
|
+
"claude-mcp",
|
|
35
|
+
"anthropic",
|
|
38
36
|
"financial-calculator",
|
|
39
37
|
"mortgage",
|
|
40
38
|
"compound-interest",
|
|
41
39
|
"401k",
|
|
42
40
|
"social-security",
|
|
43
41
|
"paycheck",
|
|
44
|
-
"
|
|
42
|
+
"ira",
|
|
43
|
+
"roth-conversion",
|
|
44
|
+
"rmd",
|
|
45
|
+
"hsa",
|
|
46
|
+
"inflation",
|
|
47
|
+
"savings",
|
|
48
|
+
"digitalcalculator",
|
|
49
|
+
"digitalcalculator.info"
|
|
45
50
|
],
|
|
46
51
|
"author": "Markcolabs LLC",
|
|
47
52
|
"license": "MIT",
|
|
53
|
+
"homepage": "https://www.digitalcalculator.info/mcp/",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/mark57-ux/digitalcalculator/issues"
|
|
56
|
+
},
|
|
48
57
|
"repository": {
|
|
49
58
|
"type": "git",
|
|
50
59
|
"url": "https://github.com/mark57-ux/digitalcalculator.git",
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical YMYL disclaimer — single source of truth.
|
|
3
|
-
*
|
|
4
|
-
* Per ADR-0039 § 3 and § Implementation Notes / "YMYL disclaimer canonicalization":
|
|
5
|
-
* - Every ToolResult.disclaimer field embeds this exact string.
|
|
6
|
-
* - The same string is exposed as the `dc://disclaimers/ymyl` MCP resource.
|
|
7
|
-
* - Tools do NOT author their own disclaimers. All MCP responses use this constant.
|
|
8
|
-
*
|
|
9
|
-
* Authoring is owned by Content. Updates here propagate to every tool response.
|
|
10
|
-
*/
|
|
11
|
-
export declare const YMYL_DISCLAIMER: string;
|
|
12
|
-
/**
|
|
13
|
-
* MCP resource URI under which the disclaimer is exposed (O5-KR2).
|
|
14
|
-
*/
|
|
15
|
-
export declare const YMYL_DISCLAIMER_URI = "dc://disclaimers/ymyl";
|
|
16
|
-
//# sourceMappingURL=ymyl.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ymyl.d.ts","sourceRoot":"","sources":["../../src/disclaimers/ymyl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,QAKqE,CAAC;AAElG;;GAEG;AACH,eAAO,MAAM,mBAAmB,0BAA0B,CAAC"}
|
package/dist/disclaimers/ymyl.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical YMYL disclaimer — single source of truth.
|
|
3
|
-
*
|
|
4
|
-
* Per ADR-0039 § 3 and § Implementation Notes / "YMYL disclaimer canonicalization":
|
|
5
|
-
* - Every ToolResult.disclaimer field embeds this exact string.
|
|
6
|
-
* - The same string is exposed as the `dc://disclaimers/ymyl` MCP resource.
|
|
7
|
-
* - Tools do NOT author their own disclaimers. All MCP responses use this constant.
|
|
8
|
-
*
|
|
9
|
-
* Authoring is owned by Content. Updates here propagate to every tool response.
|
|
10
|
-
*/
|
|
11
|
-
export const YMYL_DISCLAIMER = "Estimates only — for educational purposes. Results are computed in USD using deterministic " +
|
|
12
|
-
"formulas and the inputs you provided. They do not constitute financial, tax, legal, or " +
|
|
13
|
-
"investment advice. Actual rates, fees, taxes, and outcomes vary by lender, jurisdiction, " +
|
|
14
|
-
"and personal circumstances. Verify with a licensed professional before making financial " +
|
|
15
|
-
"decisions. Source: digitalcalculator.info — see methodology link for formula and assumptions.";
|
|
16
|
-
/**
|
|
17
|
-
* MCP resource URI under which the disclaimer is exposed (O5-KR2).
|
|
18
|
-
*/
|
|
19
|
-
export const YMYL_DISCLAIMER_URI = "dc://disclaimers/ymyl";
|
|
20
|
-
//# sourceMappingURL=ymyl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ymyl.js","sourceRoot":"","sources":["../../src/disclaimers/ymyl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,eAAe,GAC1B,6FAA6F;IAC7F,yFAAyF;IACzF,2FAA2F;IAC3F,0FAA0F;IAC1F,+FAA+F,CAAC;AAElG;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compound-interest engine — lifted from
|
|
3
|
-
* site/src/pages/compound-interest-calculator/compound-interest-calculator.js
|
|
4
|
-
* (function `calculateFutureValue`).
|
|
5
|
-
*
|
|
6
|
-
* Per ADR-0039 § 5: pure synchronous functions, ENGINE_VERSION constant,
|
|
7
|
-
* parity test against the site source as the gate.
|
|
8
|
-
*
|
|
9
|
-
* Math reference:
|
|
10
|
-
* FV_principal = P * (1 + r/n)^(nt)
|
|
11
|
-
* FV_contributions = PMT_per_period * [((1 + r/n)^(nt) - 1) / (r/n)] (if r > 0)
|
|
12
|
-
* FV_contributions = PMT_per_period * (n * t) (if r == 0)
|
|
13
|
-
* where:
|
|
14
|
-
* P = initial principal
|
|
15
|
-
* PMT_per_period = monthlyContribution * (12 / n)
|
|
16
|
-
* r = annual rate as decimal (e.g., 0.07 for 7%)
|
|
17
|
-
* n = compounding periods per year
|
|
18
|
-
* t = years
|
|
19
|
-
*
|
|
20
|
-
* The engine accepts the rate as a percent and compounding as a label
|
|
21
|
-
* (per ADR-0039 § 2 Percent-suffix convention + sprint prompt enum).
|
|
22
|
-
*/
|
|
23
|
-
import { type CompoundingFrequencyLabel } from "../shared/bounds.js";
|
|
24
|
-
/**
|
|
25
|
-
* SemVer of the compound-interest engine math. Per ADR-0039 § 5 (reaffirmed in
|
|
26
|
-
* ADR-0041 Position #4a): major bump = math change; minor = additive output;
|
|
27
|
-
* patch = numerical correction. NOT bumped for cosmetic refactors.
|
|
28
|
-
* - 0.1.0: initial v1 lift from compound-interest-calculator.js (S135 Item 5).
|
|
29
|
-
* - 0.2.0 (v0.1.0 publish): out-of-policy package-surface bump — superseded.
|
|
30
|
-
* - 1.0.0 (v0.2.0 publish): one-time reset to align with ADR-0039 § 5 per ADR-0041 D4a.
|
|
31
|
-
* Math unchanged from 0.1.0 / 0.2.0.
|
|
32
|
-
*/
|
|
33
|
-
export declare const ENGINE_VERSION = "1.0.0";
|
|
34
|
-
/**
|
|
35
|
-
* Inputs to the compound-interest future-value engine.
|
|
36
|
-
*
|
|
37
|
-
* Per ADR-0039 § 2:
|
|
38
|
-
* - Monetary fields are bare USD numbers.
|
|
39
|
-
* - Percentage fields use whole-number-percent units (e.g., 7 for 7%).
|
|
40
|
-
* - Optional fields default to 0 inside the engine.
|
|
41
|
-
*/
|
|
42
|
-
export interface CompoundInterestFutureValueInput {
|
|
43
|
-
/** Initial principal in USD. */
|
|
44
|
-
principal: number;
|
|
45
|
-
/** Annual interest rate as whole-number percent (e.g., 7 for 7%). */
|
|
46
|
-
annualRatePercent: number;
|
|
47
|
-
/** Investment period in years. May be 0 (returns principal alone). */
|
|
48
|
-
years: number;
|
|
49
|
-
/** Compounding frequency label. */
|
|
50
|
-
compoundingFrequency: CompoundingFrequencyLabel;
|
|
51
|
-
/** Monthly contribution in USD. Optional — defaults to 0. */
|
|
52
|
-
monthlyContribution?: number;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Result payload (what goes inside ToolResult.result).
|
|
56
|
-
*/
|
|
57
|
-
export interface CompoundInterestFutureValueResult {
|
|
58
|
-
/** Future value (principal + contributions + interest), in USD. */
|
|
59
|
-
futureValue: number;
|
|
60
|
-
/** Total contributed (principal + sum of monthly contributions over the period), in USD. */
|
|
61
|
-
totalContributions: number;
|
|
62
|
-
/** Interest earned (futureValue - totalContributions), in USD. */
|
|
63
|
-
interestEarned: number;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Compute the future value of a compound-interest investment with optional
|
|
67
|
-
* regular monthly contributions.
|
|
68
|
-
*
|
|
69
|
-
* 1-to-1 port of site/src/pages/compound-interest-calculator/compound-interest-calculator.js
|
|
70
|
-
* function `calculateFutureValue`. Site uses `annualRate` as decimal; this engine
|
|
71
|
-
* accepts whole-number percent and converts internally so the contract is
|
|
72
|
-
* Percent-suffix consistent (ADR-0039).
|
|
73
|
-
*/
|
|
74
|
-
export declare function futureValue(input: CompoundInterestFutureValueInput): CompoundInterestFutureValueResult;
|
|
75
|
-
//# sourceMappingURL=compoundInterest.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compoundInterest.d.ts","sourceRoot":"","sources":["../../src/engines/compoundInterest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,WAAW,gCAAgC;IAC/C,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,oBAAoB,EAAE,yBAAyB,CAAC;IAChD,6DAA6D;IAC7D,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,gCAAgC,GACtC,iCAAiC,CAyCnC"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compound-interest engine — lifted from
|
|
3
|
-
* site/src/pages/compound-interest-calculator/compound-interest-calculator.js
|
|
4
|
-
* (function `calculateFutureValue`).
|
|
5
|
-
*
|
|
6
|
-
* Per ADR-0039 § 5: pure synchronous functions, ENGINE_VERSION constant,
|
|
7
|
-
* parity test against the site source as the gate.
|
|
8
|
-
*
|
|
9
|
-
* Math reference:
|
|
10
|
-
* FV_principal = P * (1 + r/n)^(nt)
|
|
11
|
-
* FV_contributions = PMT_per_period * [((1 + r/n)^(nt) - 1) / (r/n)] (if r > 0)
|
|
12
|
-
* FV_contributions = PMT_per_period * (n * t) (if r == 0)
|
|
13
|
-
* where:
|
|
14
|
-
* P = initial principal
|
|
15
|
-
* PMT_per_period = monthlyContribution * (12 / n)
|
|
16
|
-
* r = annual rate as decimal (e.g., 0.07 for 7%)
|
|
17
|
-
* n = compounding periods per year
|
|
18
|
-
* t = years
|
|
19
|
-
*
|
|
20
|
-
* The engine accepts the rate as a percent and compounding as a label
|
|
21
|
-
* (per ADR-0039 § 2 Percent-suffix convention + sprint prompt enum).
|
|
22
|
-
*/
|
|
23
|
-
import { COMPOUNDING_FREQUENCY, } from "../shared/bounds.js";
|
|
24
|
-
/**
|
|
25
|
-
* SemVer of the compound-interest engine math. Per ADR-0039 § 5 (reaffirmed in
|
|
26
|
-
* ADR-0041 Position #4a): major bump = math change; minor = additive output;
|
|
27
|
-
* patch = numerical correction. NOT bumped for cosmetic refactors.
|
|
28
|
-
* - 0.1.0: initial v1 lift from compound-interest-calculator.js (S135 Item 5).
|
|
29
|
-
* - 0.2.0 (v0.1.0 publish): out-of-policy package-surface bump — superseded.
|
|
30
|
-
* - 1.0.0 (v0.2.0 publish): one-time reset to align with ADR-0039 § 5 per ADR-0041 D4a.
|
|
31
|
-
* Math unchanged from 0.1.0 / 0.2.0.
|
|
32
|
-
*/
|
|
33
|
-
export const ENGINE_VERSION = "1.0.0";
|
|
34
|
-
/**
|
|
35
|
-
* Compute the future value of a compound-interest investment with optional
|
|
36
|
-
* regular monthly contributions.
|
|
37
|
-
*
|
|
38
|
-
* 1-to-1 port of site/src/pages/compound-interest-calculator/compound-interest-calculator.js
|
|
39
|
-
* function `calculateFutureValue`. Site uses `annualRate` as decimal; this engine
|
|
40
|
-
* accepts whole-number percent and converts internally so the contract is
|
|
41
|
-
* Percent-suffix consistent (ADR-0039).
|
|
42
|
-
*/
|
|
43
|
-
export function futureValue(input) {
|
|
44
|
-
const { principal, annualRatePercent, years, compoundingFrequency, monthlyContribution = 0, } = input;
|
|
45
|
-
// Percent → decimal at the engine boundary.
|
|
46
|
-
const r = annualRatePercent / 100;
|
|
47
|
-
const n = COMPOUNDING_FREQUENCY[compoundingFrequency];
|
|
48
|
-
const t = years;
|
|
49
|
-
const periods = n * t;
|
|
50
|
-
const periodicRate = r / n;
|
|
51
|
-
// FV of principal.
|
|
52
|
-
const fvPrincipal = principal * Math.pow(1 + periodicRate, periods);
|
|
53
|
-
// FV of regular contributions (annuity-due-like, contributions split per period).
|
|
54
|
-
const contributionPerPeriod = monthlyContribution * (12 / n);
|
|
55
|
-
let fvContributions = 0;
|
|
56
|
-
if (periodicRate > 0 && contributionPerPeriod > 0) {
|
|
57
|
-
fvContributions =
|
|
58
|
-
contributionPerPeriod *
|
|
59
|
-
((Math.pow(1 + periodicRate, periods) - 1) / periodicRate);
|
|
60
|
-
}
|
|
61
|
-
else if (contributionPerPeriod > 0) {
|
|
62
|
-
// 0% rate: contributions just sum.
|
|
63
|
-
fvContributions = contributionPerPeriod * periods;
|
|
64
|
-
}
|
|
65
|
-
const futureValueTotal = fvPrincipal + fvContributions;
|
|
66
|
-
const totalContributions = principal + monthlyContribution * 12 * t;
|
|
67
|
-
const interestEarned = futureValueTotal - totalContributions;
|
|
68
|
-
return {
|
|
69
|
-
futureValue: futureValueTotal,
|
|
70
|
-
totalContributions,
|
|
71
|
-
interestEarned,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=compoundInterest.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compoundInterest.js","sourceRoot":"","sources":["../../src/engines/compoundInterest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAmCtC;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,KAAuC;IAEvC,MAAM,EACJ,SAAS,EACT,iBAAiB,EACjB,KAAK,EACL,oBAAoB,EACpB,mBAAmB,GAAG,CAAC,GACxB,GAAG,KAAK,CAAC;IAEV,4CAA4C;IAC5C,MAAM,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC;IAClC,MAAM,CAAC,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,KAAK,CAAC;IAEhB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IACtB,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;IAE3B,mBAAmB;IACnB,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC;IAEpE,kFAAkF;IAClF,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;QAClD,eAAe;YACb,qBAAqB;gBACrB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;QACrC,mCAAmC;QACnC,eAAe,GAAG,qBAAqB,GAAG,OAAO,CAAC;IACpD,CAAC;IAED,MAAM,gBAAgB,GAAG,WAAW,GAAG,eAAe,CAAC;IACvD,MAAM,kBAAkB,GAAG,SAAS,GAAG,mBAAmB,GAAG,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAE7D,OAAO;QACL,WAAW,EAAE,gBAAgB;QAC7B,kBAAkB;QAClB,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Self-contained 2026 federal tax data subset for the @markcolabs/mcp
|
|
3
|
-
* package's paycheck engine.
|
|
4
|
-
*
|
|
5
|
-
* Mirrored from site/src/data/annual-limits.js. See engines/data/ssa.ts for the
|
|
6
|
-
* full rationale on the mirror pattern (npm consumers cannot reach site/src/).
|
|
7
|
-
*
|
|
8
|
-
* Filing status keys mirror the paycheck engine's camelCase convention:
|
|
9
|
-
* "single" | "married" | "marriedSeparate" | "headOfHousehold"
|
|
10
|
-
*
|
|
11
|
-
* Source of truth: IRS Rev. Proc. 2025-32 (2026 inflation adjustments).
|
|
12
|
-
* Last verified: 2026-05-09.
|
|
13
|
-
*/
|
|
14
|
-
import { SS_WAGE_BASE } from "./ssa.js";
|
|
15
|
-
export type FilingStatus = "single" | "married" | "marriedSeparate" | "headOfHousehold";
|
|
16
|
-
/** FICA statutory rates (unchanged since 1990 / ACA 2013). */
|
|
17
|
-
export declare const FICA_RATES: {
|
|
18
|
-
readonly socialSecurityRate: 0.062;
|
|
19
|
-
readonly medicareRate: 0.0145;
|
|
20
|
-
readonly additionalMedicareRate: 0.009;
|
|
21
|
-
};
|
|
22
|
-
/** Additional Medicare Tax 0.9% kicks in above these wage thresholds (filing-status keyed). */
|
|
23
|
-
export declare const ADDITIONAL_MEDICARE_THRESHOLDS_2026: Record<FilingStatus, number>;
|
|
24
|
-
/** 2026 standard deductions (IRS Rev. Proc. 2025-32). */
|
|
25
|
-
export declare const STANDARD_DEDUCTIONS_2026: Record<FilingStatus, number>;
|
|
26
|
-
/** Tax bracket entry. `max: null` indicates the top open-ended bracket. */
|
|
27
|
-
export interface TaxBracket {
|
|
28
|
-
min: number;
|
|
29
|
-
max: number | null;
|
|
30
|
-
rate: number;
|
|
31
|
-
/** Cumulative tax at this bracket's floor (Percentage Method). */
|
|
32
|
-
baseTax: number;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 2026 federal tax brackets (IRS Rev. Proc. 2025-32; verified AL-2026-001 S134).
|
|
36
|
-
* Filing-status keyed; values match site/src/data/annual-limits.js TAX_BRACKETS[2026].
|
|
37
|
-
*/
|
|
38
|
-
export declare const FEDERAL_TAX_BRACKETS_2026: Record<FilingStatus, TaxBracket[]>;
|
|
39
|
-
/** Pay periods per year. Matches site/src/utils/paycheck-tax-engine.js PAY_PERIODS. */
|
|
40
|
-
export declare const PAY_PERIODS_PER_YEAR: Record<"weekly" | "biweekly" | "semimonthly" | "monthly" | "quarterly" | "annual", number>;
|
|
41
|
-
export type PayFrequencyLabel = keyof typeof PAY_PERIODS_PER_YEAR;
|
|
42
|
-
/** US states with no income tax (paycheck engine NO_TAX_STATES). */
|
|
43
|
-
export declare const NO_TAX_STATES: readonly ["AK", "FL", "NV", "NH", "SD", "TN", "TX", "WA", "WY"];
|
|
44
|
-
export type NoTaxStateCode = (typeof NO_TAX_STATES)[number];
|
|
45
|
-
/** Re-export SS wage base for paycheck engine (FICA SS cap). */
|
|
46
|
-
export { SS_WAGE_BASE };
|
|
47
|
-
//# sourceMappingURL=federalTax.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"federalTax.d.ts","sourceRoot":"","sources":["../../../src/engines/data/federalTax.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAExF,8DAA8D;AAC9D,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,+FAA+F;AAC/F,eAAO,MAAM,mCAAmC,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAK5E,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKjE,CAAC;AAEF,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AAgBD;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,CAqCxE,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,EAC1E,MAAM,CAQP,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAElE,oEAAoE;AACpE,eAAO,MAAM,aAAa,iEAUhB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,gEAAgE;AAChE,OAAO,EAAE,YAAY,EAAE,CAAC"}
|