@utilix-tech/mcp 0.71.0 → 0.72.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,10 @@
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.72.0
6
+ - Add `validate_vin` tool: validate a 17-character VIN via the ISO 3779 / NHTSA weighted mod-11 check digit and split it into its WMI, VDS, and VIS sections.
7
+ - Add `validate_isin` tool: validate a 12-character ISIN via its Luhn-style mod-10 check digit and break it into its country code and security identifier.
8
+
5
9
  ## 0.71.0
6
10
  - Add `read_midi_info` tool: parse a Standard MIDI File's header and every track chunk to report format, tick division, initial tempo, time signature, and per-track event/note-on counts, plus total duration in seconds accounting for tempo changes.
7
11
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @utilix-tech/mcp
2
2
 
3
- MCP server exposing 237 developer utility tools to Claude, Cursor, VS Code Copilot, and any [Model Context Protocol](https://modelcontextprotocol.io) compatible AI assistant.
3
+ MCP server exposing 239 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 (39 tools)
165
+ ### Units (42 tools)
166
166
  | Tool | Description |
167
167
  |------|-------------|
168
168
  | `convert_bytes` | Convert between B, KB, MB, GB, TB, KiB, MiB, GiB, TiB |
@@ -205,6 +205,8 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
205
205
  | `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 |
206
206
  | `plan_debt_payoff` | Simulate paying off a list of debts under both the snowball (smallest balance first) and avalanche (highest rate first) strategies given a fixed extra monthly payment, and compare months to payoff and total interest |
207
207
  | `calculate_loan_refinance` | Compare a current loan's remaining payments against a new refinanced loan on the same outstanding balance, and compute the monthly savings and the break-even month where cumulative savings recoup the closing costs |
208
+ | `validate_vin` | Validate a 17-character VIN via the ISO 3779 / NHTSA weighted mod-11 check digit and split it into its WMI, VDS, and VIS sections |
209
+ | `validate_isin` | Validate a 12-character ISIN via its Luhn-style mod-10 check digit and break it into its country code and security identifier |
208
210
 
209
211
  ### API / Network (48 tools)
210
212
  | Tool | Description |
package/dist/index.js CHANGED
@@ -11397,5 +11397,113 @@ server.tool(
11397
11397
  return text(JSON.stringify(result, null, 2));
11398
11398
  }
11399
11399
  );
11400
+ var _VIN_TRANSLITERATION_MCP = {
11401
+ A: 1,
11402
+ B: 2,
11403
+ C: 3,
11404
+ D: 4,
11405
+ E: 5,
11406
+ F: 6,
11407
+ G: 7,
11408
+ H: 8,
11409
+ J: 1,
11410
+ K: 2,
11411
+ L: 3,
11412
+ M: 4,
11413
+ N: 5,
11414
+ P: 7,
11415
+ R: 9,
11416
+ S: 2,
11417
+ T: 3,
11418
+ U: 4,
11419
+ V: 5,
11420
+ W: 6,
11421
+ X: 7,
11422
+ Y: 8,
11423
+ Z: 9
11424
+ };
11425
+ var _VIN_WEIGHTS_MCP = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
11426
+ function _validateVin(input) {
11427
+ if (!input || !input.trim()) return { error: "Input is empty" };
11428
+ const cleaned = input.replace(/\s/g, "").toUpperCase();
11429
+ if (cleaned.length !== 17) return { error: `VIN length (${cleaned.length}) must be exactly 17 characters` };
11430
+ if (!/^[A-HJ-NPR-Z0-9]{17}$/.test(cleaned)) {
11431
+ return { error: "VIN must contain only letters and digits, excluding I, O, and Q" };
11432
+ }
11433
+ let sum = 0;
11434
+ for (let i = 0; i < 17; i++) {
11435
+ const ch = cleaned[i];
11436
+ const value = /[0-9]/.test(ch) ? Number(ch) : _VIN_TRANSLITERATION_MCP[ch];
11437
+ sum += value * _VIN_WEIGHTS_MCP[i];
11438
+ }
11439
+ const remainder = sum % 11;
11440
+ const expectedCheckDigit = remainder === 10 ? "X" : String(remainder);
11441
+ const checkDigit = cleaned[8];
11442
+ return {
11443
+ valid: checkDigit === expectedCheckDigit,
11444
+ vin: cleaned,
11445
+ checkDigit,
11446
+ expectedCheckDigit,
11447
+ wmi: cleaned.slice(0, 3),
11448
+ vds: cleaned.slice(3, 9),
11449
+ vis: cleaned.slice(9, 17)
11450
+ };
11451
+ }
11452
+ server.tool(
11453
+ "validate_vin",
11454
+ "Validate a 17-character VIN via the ISO 3779 / NHTSA weighted mod-11 check digit at position 9, and split it into its World Manufacturer Identifier (WMI), Vehicle Descriptor Section (VDS), and Vehicle Identifier Section (VIS). Does not decode make, model, or model year.",
11455
+ { vin: z.string().describe("The 17-character VIN, with or without spaces") },
11456
+ async ({ vin }) => {
11457
+ const result = _validateVin(vin);
11458
+ if ("error" in result) return errText(result);
11459
+ return text(JSON.stringify(result, null, 2));
11460
+ }
11461
+ );
11462
+ function _isinLuhnCheckDigitMcp(payloadDigits) {
11463
+ let sum = 0;
11464
+ let shouldDouble = true;
11465
+ for (let i = payloadDigits.length - 1; i >= 0; i--) {
11466
+ let d = parseInt(payloadDigits[i], 10);
11467
+ if (shouldDouble) {
11468
+ d *= 2;
11469
+ if (d > 9) d -= 9;
11470
+ }
11471
+ sum += d;
11472
+ shouldDouble = !shouldDouble;
11473
+ }
11474
+ return (10 - sum % 10) % 10;
11475
+ }
11476
+ function _validateIsin(input) {
11477
+ if (!input || !input.trim()) return { error: "Input is empty" };
11478
+ const cleaned = input.replace(/\s/g, "").toUpperCase();
11479
+ if (cleaned.length !== 12) return { error: `ISIN length (${cleaned.length}) must be exactly 12 characters` };
11480
+ if (!/^[A-Z]{2}[A-Z0-9]{9}\d$/.test(cleaned)) {
11481
+ return { error: "ISIN must be a 2-letter country code, 9 alphanumeric characters, then 1 numeric check digit" };
11482
+ }
11483
+ const countryCode = cleaned.slice(0, 2);
11484
+ const securityIdentifier = cleaned.slice(2, 11);
11485
+ const checkDigit = Number(cleaned[11]);
11486
+ const payload = cleaned.slice(0, 11).split("").map((ch) => /[A-Z]/.test(ch) ? String(ch.charCodeAt(0) - 55) : ch).join("");
11487
+ const expectedCheckDigit = _isinLuhnCheckDigitMcp(payload);
11488
+ return {
11489
+ valid: checkDigit === expectedCheckDigit,
11490
+ isin: cleaned,
11491
+ countryCode,
11492
+ securityIdentifier,
11493
+ checkDigit,
11494
+ expectedCheckDigit,
11495
+ formatted: `${countryCode} ${securityIdentifier} ${checkDigit}`
11496
+ };
11497
+ }
11498
+ server.tool(
11499
+ "validate_isin",
11500
+ "Validate a 12-character ISIN (ISO 6166) via its Luhn-style mod-10 check digit. The 2-letter country code and 9-character alphanumeric security identifier are transliterated (A=10 ... Z=35) into a numeric string before the Luhn algorithm is applied, the same way credit card numbers are checksummed.",
11501
+ { isin: z.string().describe("The 12-character ISIN, with or without spaces") },
11502
+ async ({ isin }) => {
11503
+ const result = _validateIsin(isin);
11504
+ if ("error" in result) return errText(result);
11505
+ return text(JSON.stringify(result, null, 2));
11506
+ }
11507
+ );
11400
11508
  var transport = new StdioServerTransport();
11401
11509
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@utilix-tech/mcp",
3
- "version": "0.71.0",
3
+ "version": "0.72.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",