@utilix-tech/mcp 0.15.0 → 0.17.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 +6 -0
- package/README.md +11 -4
- package/dist/index.js +274 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
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.17.0
|
|
6
|
+
- Added Simple Interest Calculator (`calculate_simple_interest`) and Base58 / Base62 Encoder (`base58_encode`, `base58_decode`, `base62_encode`, `base62_decode`).
|
|
7
|
+
|
|
8
|
+
## 0.16.0
|
|
9
|
+
- Added MIME Type Lookup (`lookup_mime`) and Tip / Bill Split Calculator (`calculate_tip_split`).
|
|
10
|
+
|
|
5
11
|
## 0.15.0
|
|
6
12
|
- Added Compound Interest Calculator (`calculate_compound_interest`) and ISBN Validator / Converter (`validate_isbn`).
|
|
7
13
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @utilix-tech/mcp
|
|
2
2
|
|
|
3
|
-
MCP server exposing
|
|
3
|
+
MCP server exposing 123 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
|
|
|
@@ -92,7 +92,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
92
92
|
| `json_to_python` | Generate Python dataclasses from JSON |
|
|
93
93
|
| `json_to_zod` | Generate a Zod schema from JSON |
|
|
94
94
|
|
|
95
|
-
### Encoding (
|
|
95
|
+
### Encoding (12 tools)
|
|
96
96
|
| Tool | Description |
|
|
97
97
|
|------|-------------|
|
|
98
98
|
| `base64_encode` | Encode a string to Base64 |
|
|
@@ -103,6 +103,10 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
103
103
|
| `html_entities_decode` | Decode HTML entities |
|
|
104
104
|
| `base32_encode` | Encode a string to Base32 |
|
|
105
105
|
| `base32_decode` | Decode a Base32 string |
|
|
106
|
+
| `base58_encode` | Encode text as Base58 (Bitcoin-address style, no ambiguous 0/O/I/l characters) |
|
|
107
|
+
| `base58_decode` | Decode a Base58 string back to text |
|
|
108
|
+
| `base62_encode` | Encode text as Base62 (alphanumeric, URL-safe) |
|
|
109
|
+
| `base62_decode` | Decode a Base62 string back to text |
|
|
106
110
|
|
|
107
111
|
### Hashing (4 tools)
|
|
108
112
|
| Tool | Description |
|
|
@@ -145,7 +149,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
145
149
|
| `date_diff` | Calculate the difference between two dates |
|
|
146
150
|
| `convert_timezone` | Convert a date/time between timezones |
|
|
147
151
|
|
|
148
|
-
### Units (
|
|
152
|
+
### Units (11 tools)
|
|
149
153
|
| Tool | Description |
|
|
150
154
|
|------|-------------|
|
|
151
155
|
| `convert_bytes` | Convert between B, KB, MB, GB, TB, KiB, MiB, GiB, TiB |
|
|
@@ -157,6 +161,8 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
157
161
|
| `calculate_tax` | Add or remove VAT/sales tax from a price, in either direction |
|
|
158
162
|
| `calculate_compound_interest` | Compute the future value of a principal plus an optional recurring contribution under compound interest |
|
|
159
163
|
| `validate_isbn` | Validate an ISBN-10 or ISBN-13 checksum and convert it to the other format where possible |
|
|
164
|
+
| `calculate_tip_split` | Compute a tip on a bill amount and split the bill, tip, and total evenly across N people |
|
|
165
|
+
| `calculate_simple_interest` | Compute simple (non-compounding) interest as principal x rate x time, plus the total payoff |
|
|
160
166
|
|
|
161
167
|
### API / Network (8 tools)
|
|
162
168
|
| Tool | Description |
|
|
@@ -178,7 +184,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
178
184
|
| `color_palette` | Generate a color palette from a base color |
|
|
179
185
|
| `color_shades` | Generate shades or tints from a base color |
|
|
180
186
|
|
|
181
|
-
### Code (
|
|
187
|
+
### Code (8 tools)
|
|
182
188
|
| Tool | Description |
|
|
183
189
|
|------|-------------|
|
|
184
190
|
| `format_sql` | Format a SQL query with proper indentation |
|
|
@@ -188,6 +194,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
188
194
|
| `format_graphql` | Format or minify a GraphQL query or schema |
|
|
189
195
|
| `parse_env` | Parse a .env file and return all key-value pairs |
|
|
190
196
|
| `parse_docker_image` | Parse a Docker image reference into its components |
|
|
197
|
+
| `lookup_mime` | Look up the MIME type for a file extension, or the extension(s) for a MIME type |
|
|
191
198
|
|
|
192
199
|
### Data (6 tools)
|
|
193
200
|
| Tool | Description |
|
package/dist/index.js
CHANGED
|
@@ -2101,6 +2101,280 @@ server.tool(
|
|
|
2101
2101
|
return text(JSON.stringify(result, null, 2));
|
|
2102
2102
|
}
|
|
2103
2103
|
);
|
|
2104
|
+
var _MCP_MIME_TABLE = [
|
|
2105
|
+
{ extension: "txt", mimeType: "text/plain" },
|
|
2106
|
+
{ extension: "html", mimeType: "text/html" },
|
|
2107
|
+
{ extension: "htm", mimeType: "text/html" },
|
|
2108
|
+
{ extension: "css", mimeType: "text/css" },
|
|
2109
|
+
{ extension: "js", mimeType: "text/javascript" },
|
|
2110
|
+
{ extension: "mjs", mimeType: "text/javascript" },
|
|
2111
|
+
{ extension: "json", mimeType: "application/json" },
|
|
2112
|
+
{ extension: "jsonld", mimeType: "application/ld+json" },
|
|
2113
|
+
{ extension: "xml", mimeType: "application/xml" },
|
|
2114
|
+
{ extension: "csv", mimeType: "text/csv" },
|
|
2115
|
+
{ extension: "tsv", mimeType: "text/tab-separated-values" },
|
|
2116
|
+
{ extension: "md", mimeType: "text/markdown" },
|
|
2117
|
+
{ extension: "rtf", mimeType: "application/rtf" },
|
|
2118
|
+
{ extension: "yaml", mimeType: "application/x-yaml" },
|
|
2119
|
+
{ extension: "yml", mimeType: "application/x-yaml" },
|
|
2120
|
+
{ extension: "toml", mimeType: "application/toml" },
|
|
2121
|
+
{ extension: "ini", mimeType: "text/plain" },
|
|
2122
|
+
{ extension: "ics", mimeType: "text/calendar" },
|
|
2123
|
+
{ extension: "vcf", mimeType: "text/vcard" },
|
|
2124
|
+
{ extension: "atom", mimeType: "application/atom+xml" },
|
|
2125
|
+
{ extension: "rss", mimeType: "application/rss+xml" },
|
|
2126
|
+
{ extension: "png", mimeType: "image/png" },
|
|
2127
|
+
{ extension: "jpg", mimeType: "image/jpeg" },
|
|
2128
|
+
{ extension: "jpeg", mimeType: "image/jpeg" },
|
|
2129
|
+
{ extension: "gif", mimeType: "image/gif" },
|
|
2130
|
+
{ extension: "bmp", mimeType: "image/bmp" },
|
|
2131
|
+
{ extension: "webp", mimeType: "image/webp" },
|
|
2132
|
+
{ extension: "svg", mimeType: "image/svg+xml" },
|
|
2133
|
+
{ extension: "ico", mimeType: "image/x-icon" },
|
|
2134
|
+
{ extension: "tif", mimeType: "image/tiff" },
|
|
2135
|
+
{ extension: "tiff", mimeType: "image/tiff" },
|
|
2136
|
+
{ extension: "avif", mimeType: "image/avif" },
|
|
2137
|
+
{ extension: "heic", mimeType: "image/heic" },
|
|
2138
|
+
{ extension: "psd", mimeType: "image/vnd.adobe.photoshop" },
|
|
2139
|
+
{ extension: "ttf", mimeType: "font/ttf" },
|
|
2140
|
+
{ extension: "otf", mimeType: "font/otf" },
|
|
2141
|
+
{ extension: "woff", mimeType: "font/woff" },
|
|
2142
|
+
{ extension: "woff2", mimeType: "font/woff2" },
|
|
2143
|
+
{ extension: "eot", mimeType: "application/vnd.ms-fontobject" },
|
|
2144
|
+
{ extension: "pdf", mimeType: "application/pdf" },
|
|
2145
|
+
{ extension: "doc", mimeType: "application/msword" },
|
|
2146
|
+
{ extension: "docx", mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
|
|
2147
|
+
{ extension: "xls", mimeType: "application/vnd.ms-excel" },
|
|
2148
|
+
{ extension: "xlsx", mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
|
|
2149
|
+
{ extension: "ppt", mimeType: "application/vnd.ms-powerpoint" },
|
|
2150
|
+
{ extension: "pptx", mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
|
|
2151
|
+
{ extension: "odt", mimeType: "application/vnd.oasis.opendocument.text" },
|
|
2152
|
+
{ extension: "ods", mimeType: "application/vnd.oasis.opendocument.spreadsheet" },
|
|
2153
|
+
{ extension: "odp", mimeType: "application/vnd.oasis.opendocument.presentation" },
|
|
2154
|
+
{ extension: "epub", mimeType: "application/epub+zip" },
|
|
2155
|
+
{ extension: "zip", mimeType: "application/zip" },
|
|
2156
|
+
{ extension: "rar", mimeType: "application/vnd.rar" },
|
|
2157
|
+
{ extension: "7z", mimeType: "application/x-7z-compressed" },
|
|
2158
|
+
{ extension: "tar", mimeType: "application/x-tar" },
|
|
2159
|
+
{ extension: "gz", mimeType: "application/gzip" },
|
|
2160
|
+
{ extension: "bz2", mimeType: "application/x-bzip2" },
|
|
2161
|
+
{ extension: "jar", mimeType: "application/java-archive" },
|
|
2162
|
+
{ extension: "mp3", mimeType: "audio/mpeg" },
|
|
2163
|
+
{ extension: "wav", mimeType: "audio/wav" },
|
|
2164
|
+
{ extension: "ogg", mimeType: "audio/ogg" },
|
|
2165
|
+
{ extension: "oga", mimeType: "audio/ogg" },
|
|
2166
|
+
{ extension: "flac", mimeType: "audio/flac" },
|
|
2167
|
+
{ extension: "aac", mimeType: "audio/aac" },
|
|
2168
|
+
{ extension: "m4a", mimeType: "audio/mp4" },
|
|
2169
|
+
{ extension: "mid", mimeType: "audio/midi" },
|
|
2170
|
+
{ extension: "midi", mimeType: "audio/midi" },
|
|
2171
|
+
{ extension: "weba", mimeType: "audio/webm" },
|
|
2172
|
+
{ extension: "mp4", mimeType: "video/mp4" },
|
|
2173
|
+
{ extension: "m4v", mimeType: "video/mp4" },
|
|
2174
|
+
{ extension: "webm", mimeType: "video/webm" },
|
|
2175
|
+
{ extension: "mov", mimeType: "video/quicktime" },
|
|
2176
|
+
{ extension: "avi", mimeType: "video/x-msvideo" },
|
|
2177
|
+
{ extension: "mkv", mimeType: "video/x-matroska" },
|
|
2178
|
+
{ extension: "wmv", mimeType: "video/x-ms-wmv" },
|
|
2179
|
+
{ extension: "flv", mimeType: "video/x-flv" },
|
|
2180
|
+
{ extension: "mpeg", mimeType: "video/mpeg" },
|
|
2181
|
+
{ extension: "mpg", mimeType: "video/mpeg" },
|
|
2182
|
+
{ extension: "3gp", mimeType: "video/3gpp" },
|
|
2183
|
+
{ extension: "ts", mimeType: "video/mp2t" },
|
|
2184
|
+
{ extension: "bin", mimeType: "application/octet-stream" },
|
|
2185
|
+
{ extension: "exe", mimeType: "application/vnd.microsoft.portable-executable" },
|
|
2186
|
+
{ extension: "dmg", mimeType: "application/x-apple-diskimage" },
|
|
2187
|
+
{ extension: "apk", mimeType: "application/vnd.android.package-archive" },
|
|
2188
|
+
{ extension: "iso", mimeType: "application/x-iso9660-image" },
|
|
2189
|
+
{ extension: "deb", mimeType: "application/vnd.debian.binary-package" },
|
|
2190
|
+
{ extension: "rpm", mimeType: "application/x-rpm" },
|
|
2191
|
+
{ extension: "msi", mimeType: "application/x-msi" },
|
|
2192
|
+
{ extension: "dll", mimeType: "application/x-msdownload" },
|
|
2193
|
+
{ extension: "so", mimeType: "application/octet-stream" },
|
|
2194
|
+
{ extension: "wasm", mimeType: "application/wasm" },
|
|
2195
|
+
{ extension: "swf", mimeType: "application/x-shockwave-flash" },
|
|
2196
|
+
{ extension: "crx", mimeType: "application/x-chrome-extension" },
|
|
2197
|
+
{ extension: "torrent", mimeType: "application/x-bittorrent" },
|
|
2198
|
+
{ extension: "sh", mimeType: "application/x-sh" },
|
|
2199
|
+
{ extension: "bat", mimeType: "application/x-bat" },
|
|
2200
|
+
{ extension: "py", mimeType: "text/x-python" },
|
|
2201
|
+
{ extension: "java", mimeType: "text/x-java-source" },
|
|
2202
|
+
{ extension: "c", mimeType: "text/x-c" },
|
|
2203
|
+
{ extension: "h", mimeType: "text/x-c" },
|
|
2204
|
+
{ extension: "cpp", mimeType: "text/x-c++src" },
|
|
2205
|
+
{ extension: "rb", mimeType: "text/x-ruby" },
|
|
2206
|
+
{ extension: "php", mimeType: "application/x-httpd-php" },
|
|
2207
|
+
{ extension: "go", mimeType: "text/x-go" },
|
|
2208
|
+
{ extension: "rs", mimeType: "text/x-rust" },
|
|
2209
|
+
{ extension: "swift", mimeType: "text/x-swift" },
|
|
2210
|
+
{ extension: "sql", mimeType: "application/sql" },
|
|
2211
|
+
{ extension: "log", mimeType: "text/plain" }
|
|
2212
|
+
];
|
|
2213
|
+
function _lookupMimeMcp(query) {
|
|
2214
|
+
if (!query || !query.trim()) return { error: "Input is empty" };
|
|
2215
|
+
const trimmed = query.trim();
|
|
2216
|
+
if (trimmed.includes("/")) {
|
|
2217
|
+
const mime = trimmed.toLowerCase();
|
|
2218
|
+
const matches2 = _MCP_MIME_TABLE.filter((e) => e.mimeType.toLowerCase() === mime);
|
|
2219
|
+
if (matches2.length === 0) return { error: `No known file extension for MIME type "${trimmed}"` };
|
|
2220
|
+
return { query: trimmed, kind: "mime", matches: matches2 };
|
|
2221
|
+
}
|
|
2222
|
+
const ext = trimmed.replace(/^\./, "").toLowerCase();
|
|
2223
|
+
const matches = _MCP_MIME_TABLE.filter((e) => e.extension === ext);
|
|
2224
|
+
if (matches.length === 0) return { error: `No known MIME type for extension ".${ext}"` };
|
|
2225
|
+
return { query: trimmed, kind: "extension", matches };
|
|
2226
|
+
}
|
|
2227
|
+
server.tool(
|
|
2228
|
+
"lookup_mime",
|
|
2229
|
+
"Look up the MIME type for a file extension, or the file extension(s) registered for a MIME type, from a static table of well-known content types.",
|
|
2230
|
+
{ query: z.string().describe('A file extension (with or without a leading dot) or a MIME type (containing a "/")') },
|
|
2231
|
+
async ({ query }) => {
|
|
2232
|
+
const result = _lookupMimeMcp(query);
|
|
2233
|
+
if ("error" in result) return errText(result);
|
|
2234
|
+
return text(JSON.stringify(result, null, 2));
|
|
2235
|
+
}
|
|
2236
|
+
);
|
|
2237
|
+
function _calculateTipSplitMcp(billAmount, tipPercent, numPeople) {
|
|
2238
|
+
if (!Number.isFinite(billAmount) || billAmount < 0) return { error: "Bill amount must be zero or a positive number" };
|
|
2239
|
+
if (!Number.isFinite(tipPercent) || tipPercent < 0) return { error: "Tip percent must be zero or a positive number" };
|
|
2240
|
+
if (!Number.isInteger(numPeople) || numPeople < 1) return { error: "Number of people must be a positive whole number" };
|
|
2241
|
+
const round2 = (n) => Math.round(n * 100) / 100;
|
|
2242
|
+
const billRounded = round2(billAmount);
|
|
2243
|
+
const tipAmount = round2(billAmount * (tipPercent / 100));
|
|
2244
|
+
const totalAmount = round2(billRounded + tipAmount);
|
|
2245
|
+
return {
|
|
2246
|
+
billAmount: billRounded,
|
|
2247
|
+
tipPercent,
|
|
2248
|
+
tipAmount,
|
|
2249
|
+
totalAmount,
|
|
2250
|
+
numPeople,
|
|
2251
|
+
perPersonBill: round2(billRounded / numPeople),
|
|
2252
|
+
perPersonTip: round2(tipAmount / numPeople),
|
|
2253
|
+
perPersonTotal: round2(totalAmount / numPeople)
|
|
2254
|
+
};
|
|
2255
|
+
}
|
|
2256
|
+
server.tool(
|
|
2257
|
+
"calculate_tip_split",
|
|
2258
|
+
"Compute a tip on a bill amount and split the bill, tip, and total evenly across a number of people.",
|
|
2259
|
+
{
|
|
2260
|
+
billAmount: z.number().describe("The bill amount before tip"),
|
|
2261
|
+
tipPercent: z.number().describe("Tip percent, e.g. 18"),
|
|
2262
|
+
numPeople: z.number().int().default(1).describe("Number of people to split the bill between")
|
|
2263
|
+
},
|
|
2264
|
+
async ({ billAmount, tipPercent, numPeople }) => {
|
|
2265
|
+
const result = _calculateTipSplitMcp(billAmount, tipPercent, numPeople);
|
|
2266
|
+
if ("error" in result) return errText(result);
|
|
2267
|
+
return text(JSON.stringify(result, null, 2));
|
|
2268
|
+
}
|
|
2269
|
+
);
|
|
2270
|
+
function _calculateSimpleInterestMcp(principal, annualRatePercent, years) {
|
|
2271
|
+
if (!Number.isFinite(principal) || principal < 0) return { error: "Principal must be zero or a positive number" };
|
|
2272
|
+
if (!Number.isFinite(annualRatePercent) || annualRatePercent < 0) return { error: "Annual interest rate must be zero or a positive number" };
|
|
2273
|
+
if (!Number.isFinite(years) || years <= 0) return { error: "Years must be a positive number" };
|
|
2274
|
+
const round2 = (n) => Math.round(n * 100) / 100;
|
|
2275
|
+
const interest = round2(principal * (annualRatePercent / 100) * years);
|
|
2276
|
+
return {
|
|
2277
|
+
principal: round2(principal),
|
|
2278
|
+
annualRatePercent,
|
|
2279
|
+
years,
|
|
2280
|
+
interest,
|
|
2281
|
+
totalPayoff: round2(principal + interest)
|
|
2282
|
+
};
|
|
2283
|
+
}
|
|
2284
|
+
server.tool(
|
|
2285
|
+
"calculate_simple_interest",
|
|
2286
|
+
"Compute simple (non-compounding) interest as principal x rate x time, plus the total payoff. Distinct from calculate_compound_interest, which reinvests interest each period.",
|
|
2287
|
+
{
|
|
2288
|
+
principal: z.number().describe("Starting principal amount"),
|
|
2289
|
+
annualRatePercent: z.number().describe("Annual interest rate as a percent, e.g. 5"),
|
|
2290
|
+
years: z.number().describe("Term in years, may be fractional")
|
|
2291
|
+
},
|
|
2292
|
+
async ({ principal, annualRatePercent, years }) => {
|
|
2293
|
+
const result = _calculateSimpleInterestMcp(principal, annualRatePercent, years);
|
|
2294
|
+
if ("error" in result) return errText(result);
|
|
2295
|
+
return text(JSON.stringify(result, null, 2));
|
|
2296
|
+
}
|
|
2297
|
+
);
|
|
2298
|
+
var _BASE58_ALPHABET_MCP = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
2299
|
+
var _BASE62_ALPHABET_MCP = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
2300
|
+
function _encodeBytesToBaseMcp(bytes, alphabet) {
|
|
2301
|
+
const base = BigInt(alphabet.length);
|
|
2302
|
+
let num = 0n;
|
|
2303
|
+
for (const byte of bytes) num = num << 8n | BigInt(byte);
|
|
2304
|
+
let out = "";
|
|
2305
|
+
while (num > 0n) {
|
|
2306
|
+
out = alphabet[Number(num % base)] + out;
|
|
2307
|
+
num = num / base;
|
|
2308
|
+
}
|
|
2309
|
+
let leadingZeros = 0;
|
|
2310
|
+
for (const byte of bytes) {
|
|
2311
|
+
if (byte === 0) leadingZeros++;
|
|
2312
|
+
else break;
|
|
2313
|
+
}
|
|
2314
|
+
return alphabet[0].repeat(leadingZeros) + out;
|
|
2315
|
+
}
|
|
2316
|
+
function _decodeBaseToBytesMcp(input, alphabet) {
|
|
2317
|
+
const base = BigInt(alphabet.length);
|
|
2318
|
+
let num = 0n;
|
|
2319
|
+
for (const char of input) {
|
|
2320
|
+
const idx = alphabet.indexOf(char);
|
|
2321
|
+
if (idx === -1) return { error: `Invalid character '${char}' for this alphabet` };
|
|
2322
|
+
num = num * base + BigInt(idx);
|
|
2323
|
+
}
|
|
2324
|
+
const bytes = [];
|
|
2325
|
+
while (num > 0n) {
|
|
2326
|
+
bytes.unshift(Number(num % 256n));
|
|
2327
|
+
num = num / 256n;
|
|
2328
|
+
}
|
|
2329
|
+
let leadingZeros = 0;
|
|
2330
|
+
for (const char of input) {
|
|
2331
|
+
if (char === alphabet[0]) leadingZeros++;
|
|
2332
|
+
else break;
|
|
2333
|
+
}
|
|
2334
|
+
return new Uint8Array([...new Array(leadingZeros).fill(0), ...bytes]);
|
|
2335
|
+
}
|
|
2336
|
+
server.tool(
|
|
2337
|
+
"base58_encode",
|
|
2338
|
+
"Encode text as Base58 (Bitcoin-address style, no ambiguous 0/O/I/l characters).",
|
|
2339
|
+
{ input: z.string().describe("The text to encode") },
|
|
2340
|
+
async ({ input }) => text(_encodeBytesToBaseMcp(new TextEncoder().encode(input), _BASE58_ALPHABET_MCP))
|
|
2341
|
+
);
|
|
2342
|
+
server.tool(
|
|
2343
|
+
"base58_decode",
|
|
2344
|
+
"Decode a Base58 string back to text.",
|
|
2345
|
+
{ input: z.string().describe("The Base58 string to decode") },
|
|
2346
|
+
async ({ input }) => {
|
|
2347
|
+
if (!input) return errText({ error: "No input provided" });
|
|
2348
|
+
const result = _decodeBaseToBytesMcp(input, _BASE58_ALPHABET_MCP);
|
|
2349
|
+
if (!(result instanceof Uint8Array)) return errText(result);
|
|
2350
|
+
try {
|
|
2351
|
+
return text(new TextDecoder("utf-8", { fatal: true }).decode(result));
|
|
2352
|
+
} catch {
|
|
2353
|
+
return errText({ error: "Decoded bytes are not valid UTF-8 text" });
|
|
2354
|
+
}
|
|
2355
|
+
}
|
|
2356
|
+
);
|
|
2357
|
+
server.tool(
|
|
2358
|
+
"base62_encode",
|
|
2359
|
+
"Encode text as Base62 (alphanumeric, URL-safe, no punctuation).",
|
|
2360
|
+
{ input: z.string().describe("The text to encode") },
|
|
2361
|
+
async ({ input }) => text(_encodeBytesToBaseMcp(new TextEncoder().encode(input), _BASE62_ALPHABET_MCP))
|
|
2362
|
+
);
|
|
2363
|
+
server.tool(
|
|
2364
|
+
"base62_decode",
|
|
2365
|
+
"Decode a Base62 string back to text.",
|
|
2366
|
+
{ input: z.string().describe("The Base62 string to decode") },
|
|
2367
|
+
async ({ input }) => {
|
|
2368
|
+
if (!input) return errText({ error: "No input provided" });
|
|
2369
|
+
const result = _decodeBaseToBytesMcp(input, _BASE62_ALPHABET_MCP);
|
|
2370
|
+
if (!(result instanceof Uint8Array)) return errText(result);
|
|
2371
|
+
try {
|
|
2372
|
+
return text(new TextDecoder("utf-8", { fatal: true }).decode(result));
|
|
2373
|
+
} catch {
|
|
2374
|
+
return errText({ error: "Decoded bytes are not valid UTF-8 text" });
|
|
2375
|
+
}
|
|
2376
|
+
}
|
|
2377
|
+
);
|
|
2104
2378
|
server.tool(
|
|
2105
2379
|
"format_ndjson",
|
|
2106
2380
|
"Validate newline-delimited JSON (NDJSON/JSON Lines), report per-line errors, and pretty-print each valid line.",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@utilix-tech/mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server exposing
|
|
3
|
+
"version": "0.17.0",
|
|
4
|
+
"description": "MCP server exposing 123 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",
|
|
7
7
|
"homepage": "https://utilix.tech/mcp",
|