@utilix-tech/mcp 0.15.0 → 0.16.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 +5 -3
- package/dist/index.js +166 -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.16.0
|
|
6
|
+
- Added MIME Type Lookup (`lookup_mime`) and Tip / Bill Split Calculator (`calculate_tip_split`).
|
|
7
|
+
|
|
5
8
|
## 0.15.0
|
|
6
9
|
- Added Compound Interest Calculator (`calculate_compound_interest`) and ISBN Validator / Converter (`validate_isbn`).
|
|
7
10
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @utilix-tech/mcp
|
|
2
2
|
|
|
3
|
-
MCP server exposing
|
|
3
|
+
MCP server exposing 118 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
|
|
|
@@ -145,7 +145,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
145
145
|
| `date_diff` | Calculate the difference between two dates |
|
|
146
146
|
| `convert_timezone` | Convert a date/time between timezones |
|
|
147
147
|
|
|
148
|
-
### Units (
|
|
148
|
+
### Units (10 tools)
|
|
149
149
|
| Tool | Description |
|
|
150
150
|
|------|-------------|
|
|
151
151
|
| `convert_bytes` | Convert between B, KB, MB, GB, TB, KiB, MiB, GiB, TiB |
|
|
@@ -157,6 +157,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
157
157
|
| `calculate_tax` | Add or remove VAT/sales tax from a price, in either direction |
|
|
158
158
|
| `calculate_compound_interest` | Compute the future value of a principal plus an optional recurring contribution under compound interest |
|
|
159
159
|
| `validate_isbn` | Validate an ISBN-10 or ISBN-13 checksum and convert it to the other format where possible |
|
|
160
|
+
| `calculate_tip_split` | Compute a tip on a bill amount and split the bill, tip, and total evenly across N people |
|
|
160
161
|
|
|
161
162
|
### API / Network (8 tools)
|
|
162
163
|
| Tool | Description |
|
|
@@ -178,7 +179,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
178
179
|
| `color_palette` | Generate a color palette from a base color |
|
|
179
180
|
| `color_shades` | Generate shades or tints from a base color |
|
|
180
181
|
|
|
181
|
-
### Code (
|
|
182
|
+
### Code (8 tools)
|
|
182
183
|
| Tool | Description |
|
|
183
184
|
|------|-------------|
|
|
184
185
|
| `format_sql` | Format a SQL query with proper indentation |
|
|
@@ -188,6 +189,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
|
|
|
188
189
|
| `format_graphql` | Format or minify a GraphQL query or schema |
|
|
189
190
|
| `parse_env` | Parse a .env file and return all key-value pairs |
|
|
190
191
|
| `parse_docker_image` | Parse a Docker image reference into its components |
|
|
192
|
+
| `lookup_mime` | Look up the MIME type for a file extension, or the extension(s) for a MIME type |
|
|
191
193
|
|
|
192
194
|
### Data (6 tools)
|
|
193
195
|
| Tool | Description |
|
package/dist/index.js
CHANGED
|
@@ -2101,6 +2101,172 @@ 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
|
+
);
|
|
2104
2270
|
server.tool(
|
|
2105
2271
|
"format_ndjson",
|
|
2106
2272
|
"Validate newline-delimited JSON (NDJSON/JSON Lines), report per-line errors, and pretty-print each valid line.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@utilix-tech/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "MCP server exposing 116 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",
|