@utilix-tech/mcp 0.60.0 → 0.61.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/CHANGELOG.md +3 -0
- package/README.md +3 -2
- package/dist/index.js +49 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Full release notes for all Utilix surfaces (browser tools, REST API, SDKs, MCP server) live at [utilix.tech/changelog](https://utilix.tech/changelog). This file tracks just this package.
|
|
4
4
|
|
|
5
|
+
## 0.61.0
|
|
6
|
+
- Add `calculate_extra_payment_payoff` tool: compute how much faster a fixed-rate loan pays off, and how much interest is saved, when a fixed extra amount is added to every monthly payment.
|
|
7
|
+
|
|
5
8
|
## 0.60.0
|
|
6
9
|
- Add `build_retry_after_header`, `parse_retry_after_header` tools: build an HTTP Retry-After response header from a delay in seconds or a target date, or parse an existing one, per RFC 9110.
|
|
7
10
|
- Add `calculate_freelancer_rate` tool: solve for the minimum hourly rate a freelancer must charge to hit a target annual income, given billable hours, weeks worked, overhead, and a profit margin.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @utilix-tech/mcp
|
|
2
2
|
|
|
3
|
-
MCP server exposing
|
|
3
|
+
MCP server exposing 212 developer utility tools to Claude, Cursor, VS Code Copilot, and any [Model Context Protocol](https://modelcontextprotocol.io) compatible AI assistant.
|
|
4
4
|
|
|
5
5
|
No API key required. All tools run locally. Requires Node.js 18 or later.
|
|
6
6
|
|
|
@@ -162,7 +162,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
162
162
|
| `convert_timezone` | Convert a date/time between timezones |
|
|
163
163
|
| `convert_iso8601_duration` | Parse an ISO 8601 duration into components and total seconds, or format seconds into a duration string |
|
|
164
164
|
|
|
165
|
-
### Units (
|
|
165
|
+
### Units (37 tools)
|
|
166
166
|
| Tool | Description |
|
|
167
167
|
|------|-------------|
|
|
168
168
|
| `convert_bytes` | Convert between B, KB, MB, GB, TB, KiB, MiB, GiB, TiB |
|
|
@@ -201,6 +201,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
201
201
|
| `calculate_debt_to_income_ratio` | Compute the debt-to-income ratio (total monthly debt payments / gross monthly income) from one or more monthly debts, plus a qualitative tier matching common mortgage-lending guidance |
|
|
202
202
|
| `calculate_blended_loan_rate` | Compute the single weighted-average interest rate across a list of loan balances, weighted by each loan's share of the combined balance, plus combined monthly and annual interest accrual |
|
|
203
203
|
| `calculate_freelancer_rate` | Solve for the minimum hourly rate a freelancer must charge to hit a target annual income, given billable hours, weeks worked, overhead, and a profit margin |
|
|
204
|
+
| `calculate_extra_payment_payoff` | Compute how much faster a fixed-rate loan pays off, and how much interest is saved, when a fixed extra amount is added to every monthly payment |
|
|
204
205
|
|
|
205
206
|
### API / Network (33 tools)
|
|
206
207
|
| Tool | Description |
|
package/dist/index.js
CHANGED
|
@@ -2091,6 +2091,55 @@ server.tool(
|
|
|
2091
2091
|
return text(JSON.stringify(result, null, 2));
|
|
2092
2092
|
}
|
|
2093
2093
|
);
|
|
2094
|
+
function _calculateExtraPaymentPayoff(principal, annualRatePercent, termMonths, extraMonthlyPayment) {
|
|
2095
|
+
const baseline = _calculateLoan(principal, annualRatePercent, termMonths);
|
|
2096
|
+
if ("error" in baseline) return baseline;
|
|
2097
|
+
if (!Number.isFinite(extraMonthlyPayment) || extraMonthlyPayment < 0) {
|
|
2098
|
+
return { error: "Extra monthly payment must be zero or a positive number" };
|
|
2099
|
+
}
|
|
2100
|
+
const monthlyRate = annualRatePercent / 100 / 12;
|
|
2101
|
+
const payment = _roundMoneyMcp(baseline.monthlyPayment) + _roundMoneyMcp(extraMonthlyPayment);
|
|
2102
|
+
let balance = _roundMoneyMcp(principal);
|
|
2103
|
+
let totalInterestPaid = 0;
|
|
2104
|
+
let payoffMonths = termMonths;
|
|
2105
|
+
for (let month = 1; month <= termMonths; month++) {
|
|
2106
|
+
const interest = monthlyRate === 0 ? 0 : _roundMoneyMcp(balance * monthlyRate);
|
|
2107
|
+
let principalPortion = payment - interest;
|
|
2108
|
+
if (principalPortion > balance) principalPortion = balance;
|
|
2109
|
+
totalInterestPaid += interest;
|
|
2110
|
+
balance = _roundMoneyMcp(balance - principalPortion);
|
|
2111
|
+
if (balance <= 0) {
|
|
2112
|
+
payoffMonths = month;
|
|
2113
|
+
break;
|
|
2114
|
+
}
|
|
2115
|
+
}
|
|
2116
|
+
const baselineTotalInterest = baseline.totalInterest;
|
|
2117
|
+
return {
|
|
2118
|
+
monthlyPayment: _roundMoneyMcp(baseline.monthlyPayment),
|
|
2119
|
+
extraMonthlyPayment: _roundMoneyMcp(extraMonthlyPayment),
|
|
2120
|
+
baselinePayoffMonths: termMonths,
|
|
2121
|
+
baselineTotalInterest,
|
|
2122
|
+
newPayoffMonths: payoffMonths,
|
|
2123
|
+
newTotalInterest: _roundMoneyMcp(totalInterestPaid),
|
|
2124
|
+
monthsSaved: termMonths - payoffMonths,
|
|
2125
|
+
interestSaved: _roundMoneyMcp(baselineTotalInterest - totalInterestPaid)
|
|
2126
|
+
};
|
|
2127
|
+
}
|
|
2128
|
+
server.tool(
|
|
2129
|
+
"calculate_extra_payment_payoff",
|
|
2130
|
+
"Compute how much faster a fixed-rate loan pays off, and how much interest is saved, when a fixed extra amount is added to every monthly payment on top of the standard amortized payment.",
|
|
2131
|
+
{
|
|
2132
|
+
principal: z.number().describe("Loan principal amount"),
|
|
2133
|
+
annualRatePercent: z.number().describe("Annual interest rate as a percent, e.g. 6.5"),
|
|
2134
|
+
termMonths: z.number().int().describe("Original loan term in months"),
|
|
2135
|
+
extraMonthlyPayment: z.number().describe("Fixed extra amount added to every monthly payment")
|
|
2136
|
+
},
|
|
2137
|
+
async ({ principal, annualRatePercent, termMonths, extraMonthlyPayment }) => {
|
|
2138
|
+
const result = _calculateExtraPaymentPayoff(principal, annualRatePercent, termMonths, extraMonthlyPayment);
|
|
2139
|
+
if ("error" in result) return errText(result);
|
|
2140
|
+
return text(JSON.stringify(result, null, 2));
|
|
2141
|
+
}
|
|
2142
|
+
);
|
|
2094
2143
|
var _BARCODE_FORMAT_BY_LENGTH = { 8: "EAN-8", 12: "UPC-A", 13: "EAN-13" };
|
|
2095
2144
|
function _computeBarcodeCheckDigit(dataDigits) {
|
|
2096
2145
|
let sum = 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@utilix-tech/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.61.0",
|
|
4
4
|
"description": "MCP server exposing 198 Utilix developer tools to Claude, Cursor, VS Code Copilot, and any MCP-compatible AI assistant.",
|
|
5
5
|
"author": "Utilix <hello@utilix.tech>",
|
|
6
6
|
"license": "MIT",
|