@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 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 211 developer utility tools to Claude, Cursor, VS Code Copilot, and any [Model Context Protocol](https://modelcontextprotocol.io) compatible AI assistant.
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 (36 tools)
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.60.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",