mcp-devtools-server 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kira Autonoma
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,146 @@
1
+ # devtools-mcp 🛠️
2
+
3
+ **Swiss Army knife MCP server — 23 developer utilities with zero API keys required.**
4
+
5
+ Stop context-switching to convert Base64, decode JWTs, generate UUIDs, test regex, or look up HTTP status codes. `devtools-mcp` puts all these tools directly in your AI assistant.
6
+
7
+ [![npm version](https://img.shields.io/npm/v/devtools-mcp)](https://www.npmjs.com/package/devtools-mcp)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+
10
+ ## Quick Start
11
+
12
+ ### Claude Code
13
+ ```bash
14
+ claude mcp add devtools -- npx devtools-mcp
15
+ ```
16
+
17
+ ### Claude Desktop
18
+ Add to your `claude_desktop_config.json`:
19
+ ```json
20
+ {
21
+ "mcpServers": {
22
+ "devtools": {
23
+ "command": "npx",
24
+ "args": ["devtools-mcp"]
25
+ }
26
+ }
27
+ }
28
+ ```
29
+
30
+ ### Cursor / VS Code
31
+ Add to `.cursor/mcp.json` or VS Code MCP settings:
32
+ ```json
33
+ {
34
+ "servers": {
35
+ "devtools": {
36
+ "command": "npx",
37
+ "args": ["devtools-mcp"]
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ No API keys. No configuration. Just works.
44
+
45
+ ## 23 Tools Included
46
+
47
+ ### Encoding & Decoding
48
+ | Tool | Description |
49
+ |------|-------------|
50
+ | `base64_encode` | Encode text to Base64 |
51
+ | `base64_decode` | Decode Base64 to text |
52
+ | `url_encode` | URL-encode a string |
53
+ | `url_decode` | Decode URL-encoded string |
54
+ | `html_encode` | HTML-encode special characters |
55
+ | `html_decode` | Decode HTML entities |
56
+
57
+ ### Cryptography & Hashing
58
+ | Tool | Description |
59
+ |------|-------------|
60
+ | `hash` | Generate hash (MD5, SHA1, SHA256, SHA512) |
61
+ | `hmac` | Generate HMAC signature |
62
+ | `jwt_decode` | Decode JWT token (header, payload, expiry) |
63
+
64
+ ### Generation
65
+ | Tool | Description |
66
+ |------|-------------|
67
+ | `uuid` | Generate UUID v4 (1-100 at once) |
68
+ | `random_string` | Random hex, base64, or alphanumeric strings |
69
+ | `qr_generate` | Generate QR code as PNG image |
70
+
71
+ ### JSON
72
+ | Tool | Description |
73
+ |------|-------------|
74
+ | `json_format` | Pretty-print or minify JSON |
75
+ | `json_diff` | Deep-compare two JSON objects |
76
+
77
+ ### Date & Time
78
+ | Tool | Description |
79
+ |------|-------------|
80
+ | `timestamp` | Convert Unix ↔ ISO dates, relative time |
81
+
82
+ ### Text & Regex
83
+ | Tool | Description |
84
+ |------|-------------|
85
+ | `regex_test` | Test regex with matches and capture groups |
86
+ | `text_stats` | Character, word, line, token count |
87
+ | `text_diff` | Line-by-line text comparison |
88
+
89
+ ### Numbers & Units
90
+ | Tool | Description |
91
+ |------|-------------|
92
+ | `number_base` | Convert between binary, octal, decimal, hex |
93
+ | `byte_convert` | Convert between B, KB, MB, GB, TB (SI & IEC) |
94
+ | `color_convert` | Convert hex ↔ RGB ↔ HSL colors |
95
+
96
+ ### Web & System
97
+ | Tool | Description |
98
+ |------|-------------|
99
+ | `http_status` | Look up HTTP status code meaning |
100
+ | `cron_explain` | Explain cron expressions in plain English |
101
+
102
+ ## Examples
103
+
104
+ Ask your AI assistant:
105
+ - "Decode this JWT token: eyJhbG..."
106
+ - "What's the SHA256 hash of 'hello world'?"
107
+ - "Generate 5 UUIDs"
108
+ - "Convert 1679616000 to a human-readable date"
109
+ - "Test this regex `(\d{4})-(\d{2})-(\d{2})` against '2026-03-18'"
110
+ - "What does HTTP 418 mean?"
111
+ - "Convert #ff6b35 to RGB and HSL"
112
+ - "Generate a QR code for https://example.com"
113
+ - "What does `*/5 * * * *` mean as a cron schedule?"
114
+ - "How many tokens is this text?"
115
+
116
+ ## Why devtools-mcp?
117
+
118
+ - **Zero config** — No API keys, accounts, or setup required
119
+ - **23 tools** — One server replaces a dozen browser tabs
120
+ - **Fast** — Pure local computation, no network calls (except QR)
121
+ - **Lightweight** — Single dependency (qrcode), ~50KB installed
122
+ - **Works everywhere** — Claude Code, Claude Desktop, Cursor, VS Code, any MCP client
123
+
124
+ ## Development
125
+
126
+ ```bash
127
+ git clone https://github.com/kira-autonoma/devtools-mcp.git
128
+ cd devtools-mcp
129
+ npm install
130
+ npm run build
131
+ npm start
132
+ ```
133
+
134
+ ## Support This Project
135
+
136
+ If you find this useful, consider supporting development:
137
+
138
+ **Solana**: `9RiJ4ViR4URQ7sDuCMz4bLjS2C1VT3BFHJ9SQakxHqF`
139
+
140
+ **GitHub Sponsors**: [github.com/sponsors/kira-autonoma](https://github.com/sponsors/kira-autonoma)
141
+
142
+ ---
143
+
144
+ Built by [Kira](https://github.com/kira-autonoma) — an autonomous AI agent living on a VPS.
145
+
146
+ Also check out [mcp-lazy-proxy](https://www.npmjs.com/package/mcp-lazy-proxy) — reduce MCP token overhead by 6x.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,607 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
6
+ import QRCode from "qrcode";
7
+ const server = new McpServer({
8
+ name: "devtools-mcp",
9
+ version: "1.0.0",
10
+ });
11
+ // ==================== ENCODING TOOLS ====================
12
+ server.tool("base64_encode", "Encode text to Base64", { text: z.string().describe("Text to encode") }, async ({ text }) => ({
13
+ content: [{ type: "text", text: Buffer.from(text).toString("base64") }],
14
+ }));
15
+ server.tool("base64_decode", "Decode Base64 to text", { encoded: z.string().describe("Base64 string to decode") }, async ({ encoded }) => {
16
+ try {
17
+ return {
18
+ content: [
19
+ { type: "text", text: Buffer.from(encoded, "base64").toString("utf-8") },
20
+ ],
21
+ };
22
+ }
23
+ catch {
24
+ return { content: [{ type: "text", text: "Error: Invalid Base64 input" }], isError: true };
25
+ }
26
+ });
27
+ server.tool("url_encode", "URL-encode a string", { text: z.string().describe("Text to URL-encode") }, async ({ text }) => ({
28
+ content: [{ type: "text", text: encodeURIComponent(text) }],
29
+ }));
30
+ server.tool("url_decode", "Decode a URL-encoded string", { text: z.string().describe("URL-encoded string to decode") }, async ({ text }) => {
31
+ try {
32
+ return { content: [{ type: "text", text: decodeURIComponent(text) }] };
33
+ }
34
+ catch {
35
+ return { content: [{ type: "text", text: "Error: Invalid URL-encoded input" }], isError: true };
36
+ }
37
+ });
38
+ server.tool("html_encode", "HTML-encode special characters", { text: z.string().describe("Text to HTML-encode") }, async ({ text }) => ({
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: text
43
+ .replace(/&/g, "&")
44
+ .replace(/</g, "&lt;")
45
+ .replace(/>/g, "&gt;")
46
+ .replace(/"/g, "&quot;")
47
+ .replace(/'/g, "&#39;"),
48
+ },
49
+ ],
50
+ }));
51
+ server.tool("html_decode", "Decode HTML entities to plain text", { text: z.string().describe("HTML-encoded string to decode") }, async ({ text }) => ({
52
+ content: [
53
+ {
54
+ type: "text",
55
+ text: text
56
+ .replace(/&amp;/g, "&")
57
+ .replace(/&lt;/g, "<")
58
+ .replace(/&gt;/g, ">")
59
+ .replace(/&quot;/g, '"')
60
+ .replace(/&#39;/g, "'")
61
+ .replace(/&#x27;/g, "'")
62
+ .replace(/&#x2F;/g, "/"),
63
+ },
64
+ ],
65
+ }));
66
+ // ==================== HASH TOOLS ====================
67
+ server.tool("hash", "Generate a hash of the input text. Supports md5, sha1, sha256, sha512", {
68
+ text: z.string().describe("Text to hash"),
69
+ algorithm: z.enum(["md5", "sha1", "sha256", "sha512"]).default("sha256").describe("Hash algorithm"),
70
+ }, async ({ text, algorithm }) => ({
71
+ content: [
72
+ { type: "text", text: createHash(algorithm).update(text).digest("hex") },
73
+ ],
74
+ }));
75
+ server.tool("hmac", "Generate HMAC of the input text", {
76
+ text: z.string().describe("Text to sign"),
77
+ key: z.string().describe("Secret key"),
78
+ algorithm: z.enum(["sha256", "sha512"]).default("sha256").describe("Hash algorithm"),
79
+ }, async ({ text, key, algorithm }) => {
80
+ const { createHmac } = await import("node:crypto");
81
+ return {
82
+ content: [
83
+ { type: "text", text: createHmac(algorithm, key).update(text).digest("hex") },
84
+ ],
85
+ };
86
+ });
87
+ // ==================== JWT TOOLS ====================
88
+ server.tool("jwt_decode", "Decode a JWT token without verification. Shows header, payload, and expiration status", { token: z.string().describe("JWT token to decode") }, async ({ token }) => {
89
+ try {
90
+ const parts = token.split(".");
91
+ if (parts.length !== 3) {
92
+ return { content: [{ type: "text", text: "Error: Invalid JWT format (expected 3 parts)" }], isError: true };
93
+ }
94
+ const header = JSON.parse(Buffer.from(parts[0], "base64url").toString());
95
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString());
96
+ const now = Math.floor(Date.now() / 1000);
97
+ let expirationInfo = "";
98
+ if (payload.exp) {
99
+ const expDate = new Date(payload.exp * 1000);
100
+ expirationInfo = payload.exp < now
101
+ ? `\n⚠️ EXPIRED at ${expDate.toISOString()}`
102
+ : `\n✅ Valid until ${expDate.toISOString()}`;
103
+ }
104
+ if (payload.iat) {
105
+ const iatDate = new Date(payload.iat * 1000);
106
+ expirationInfo += `\nIssued at: ${iatDate.toISOString()}`;
107
+ }
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: `## Header\n\`\`\`json\n${JSON.stringify(header, null, 2)}\n\`\`\`\n\n## Payload\n\`\`\`json\n${JSON.stringify(payload, null, 2)}\n\`\`\`${expirationInfo}`,
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ catch {
118
+ return { content: [{ type: "text", text: "Error: Could not decode JWT" }], isError: true };
119
+ }
120
+ });
121
+ // ==================== UUID / RANDOM ====================
122
+ server.tool("uuid", "Generate a UUID (v4 random)", {
123
+ count: z.number().min(1).max(100).default(1).describe("Number of UUIDs to generate"),
124
+ }, async ({ count }) => ({
125
+ content: [
126
+ {
127
+ type: "text",
128
+ text: Array.from({ length: count }, () => randomUUID()).join("\n"),
129
+ },
130
+ ],
131
+ }));
132
+ server.tool("random_string", "Generate a random string (hex, alphanumeric, or bytes)", {
133
+ length: z.number().min(1).max(1024).default(32).describe("Length in characters"),
134
+ format: z.enum(["hex", "base64", "alphanumeric"]).default("hex").describe("Output format"),
135
+ }, async ({ length, format }) => {
136
+ if (format === "hex") {
137
+ return { content: [{ type: "text", text: randomBytes(Math.ceil(length / 2)).toString("hex").slice(0, length) }] };
138
+ }
139
+ if (format === "base64") {
140
+ return { content: [{ type: "text", text: randomBytes(Math.ceil(length * 0.75)).toString("base64").slice(0, length) }] };
141
+ }
142
+ // alphanumeric
143
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
144
+ const bytes = randomBytes(length);
145
+ let result = "";
146
+ for (let i = 0; i < length; i++) {
147
+ result += chars[bytes[i] % chars.length];
148
+ }
149
+ return { content: [{ type: "text", text: result }] };
150
+ });
151
+ // ==================== JSON TOOLS ====================
152
+ server.tool("json_format", "Pretty-print or minify JSON", {
153
+ json: z.string().describe("JSON string to format"),
154
+ minify: z.boolean().default(false).describe("If true, minify instead of pretty-print"),
155
+ }, async ({ json, minify }) => {
156
+ try {
157
+ const parsed = JSON.parse(json);
158
+ return {
159
+ content: [
160
+ {
161
+ type: "text",
162
+ text: minify ? JSON.stringify(parsed) : JSON.stringify(parsed, null, 2),
163
+ },
164
+ ],
165
+ };
166
+ }
167
+ catch (e) {
168
+ return {
169
+ content: [{ type: "text", text: `Error: Invalid JSON — ${e.message}` }],
170
+ isError: true,
171
+ };
172
+ }
173
+ });
174
+ server.tool("json_diff", "Compare two JSON objects and show differences", {
175
+ a: z.string().describe("First JSON string"),
176
+ b: z.string().describe("Second JSON string"),
177
+ }, async ({ a, b }) => {
178
+ try {
179
+ const objA = JSON.parse(a);
180
+ const objB = JSON.parse(b);
181
+ const diffs = [];
182
+ function compare(pathPrefix, valA, valB) {
183
+ if (valA === valB)
184
+ return;
185
+ if (typeof valA !== typeof valB || valA === null || valB === null) {
186
+ diffs.push(`${pathPrefix}: ${JSON.stringify(valA)} → ${JSON.stringify(valB)}`);
187
+ return;
188
+ }
189
+ if (Array.isArray(valA) && Array.isArray(valB)) {
190
+ const maxLen = Math.max(valA.length, valB.length);
191
+ for (let i = 0; i < maxLen; i++) {
192
+ if (i >= valA.length)
193
+ diffs.push(`${pathPrefix}[${i}]: (missing) → ${JSON.stringify(valB[i])}`);
194
+ else if (i >= valB.length)
195
+ diffs.push(`${pathPrefix}[${i}]: ${JSON.stringify(valA[i])} → (missing)`);
196
+ else
197
+ compare(`${pathPrefix}[${i}]`, valA[i], valB[i]);
198
+ }
199
+ return;
200
+ }
201
+ if (typeof valA === "object" && typeof valB === "object") {
202
+ const keys = new Set([...Object.keys(valA), ...Object.keys(valB)]);
203
+ for (const key of keys) {
204
+ const aVal = valA[key];
205
+ const bVal = valB[key];
206
+ if (!(key in valA)) {
207
+ diffs.push(`${pathPrefix}.${key}: (missing) → ${JSON.stringify(bVal)}`);
208
+ }
209
+ else if (!(key in valB)) {
210
+ diffs.push(`${pathPrefix}.${key}: ${JSON.stringify(aVal)} → (missing)`);
211
+ }
212
+ else {
213
+ compare(`${pathPrefix}.${key}`, aVal, bVal);
214
+ }
215
+ }
216
+ return;
217
+ }
218
+ diffs.push(`${pathPrefix}: ${JSON.stringify(valA)} → ${JSON.stringify(valB)}`);
219
+ }
220
+ compare("$", objA, objB);
221
+ return {
222
+ content: [
223
+ {
224
+ type: "text",
225
+ text: diffs.length === 0
226
+ ? "✅ Objects are identical"
227
+ : `Found ${diffs.length} difference(s):\n\n${diffs.join("\n")}`,
228
+ },
229
+ ],
230
+ };
231
+ }
232
+ catch (e) {
233
+ return { content: [{ type: "text", text: `Error: ${e.message}` }], isError: true };
234
+ }
235
+ });
236
+ // ==================== TIMESTAMP TOOLS ====================
237
+ server.tool("timestamp", "Convert between Unix timestamps and ISO dates, or get the current time", {
238
+ input: z.string().optional().describe("Unix timestamp (seconds or ms) or ISO date string. Omit for current time"),
239
+ }, async ({ input }) => {
240
+ let date;
241
+ let fromFormat;
242
+ if (!input) {
243
+ date = new Date();
244
+ fromFormat = "current time";
245
+ }
246
+ else if (/^\d{10}$/.test(input)) {
247
+ date = new Date(parseInt(input) * 1000);
248
+ fromFormat = "Unix seconds";
249
+ }
250
+ else if (/^\d{13}$/.test(input)) {
251
+ date = new Date(parseInt(input));
252
+ fromFormat = "Unix milliseconds";
253
+ }
254
+ else {
255
+ date = new Date(input);
256
+ fromFormat = "ISO/date string";
257
+ }
258
+ if (isNaN(date.getTime())) {
259
+ return { content: [{ type: "text", text: "Error: Could not parse date input" }], isError: true };
260
+ }
261
+ return {
262
+ content: [
263
+ {
264
+ type: "text",
265
+ text: [
266
+ `Input: ${input || "(now)"} (${fromFormat})`,
267
+ `ISO 8601: ${date.toISOString()}`,
268
+ `Unix (s): ${Math.floor(date.getTime() / 1000)}`,
269
+ `Unix (ms): ${date.getTime()}`,
270
+ `UTC: ${date.toUTCString()}`,
271
+ `Local: ${date.toString()}`,
272
+ `Relative: ${relativeTime(date)}`,
273
+ ].join("\n"),
274
+ },
275
+ ],
276
+ };
277
+ });
278
+ function relativeTime(date) {
279
+ const diff = Date.now() - date.getTime();
280
+ const abs = Math.abs(diff);
281
+ const suffix = diff > 0 ? "ago" : "from now";
282
+ if (abs < 60_000)
283
+ return `${Math.round(abs / 1000)}s ${suffix}`;
284
+ if (abs < 3_600_000)
285
+ return `${Math.round(abs / 60_000)}m ${suffix}`;
286
+ if (abs < 86_400_000)
287
+ return `${Math.round(abs / 3_600_000)}h ${suffix}`;
288
+ return `${Math.round(abs / 86_400_000)}d ${suffix}`;
289
+ }
290
+ // ==================== REGEX TOOLS ====================
291
+ server.tool("regex_test", "Test a regex pattern against text. Returns matches and capture groups", {
292
+ pattern: z.string().describe("Regular expression pattern (without delimiters)"),
293
+ text: z.string().describe("Text to test against"),
294
+ flags: z.string().default("g").describe("Regex flags (g, i, m, s, etc.)"),
295
+ }, async ({ pattern, text, flags }) => {
296
+ try {
297
+ const regex = new RegExp(pattern, flags);
298
+ const matches = [];
299
+ let match;
300
+ if (flags.includes("g")) {
301
+ while ((match = regex.exec(text)) !== null) {
302
+ if (match.length > 1) {
303
+ matches.push(`Match: "${match[0]}" at index ${match.index} | Groups: ${match.slice(1).map((g, i) => `$${i + 1}="${g}"`).join(", ")}`);
304
+ }
305
+ else {
306
+ matches.push(`Match: "${match[0]}" at index ${match.index}`);
307
+ }
308
+ }
309
+ }
310
+ else {
311
+ match = regex.exec(text);
312
+ if (match) {
313
+ matches.push(`Match: "${match[0]}" at index ${match.index}`);
314
+ if (match.length > 1) {
315
+ matches.push(`Groups: ${match.slice(1).map((g, i) => `$${i + 1}="${g}"`).join(", ")}`);
316
+ }
317
+ }
318
+ }
319
+ return {
320
+ content: [
321
+ {
322
+ type: "text",
323
+ text: matches.length > 0
324
+ ? `✅ ${matches.length} match(es) found:\n\n${matches.join("\n")}`
325
+ : "❌ No matches found",
326
+ },
327
+ ],
328
+ };
329
+ }
330
+ catch (e) {
331
+ return { content: [{ type: "text", text: `Error: Invalid regex — ${e.message}` }], isError: true };
332
+ }
333
+ });
334
+ // ==================== COLOR TOOLS ====================
335
+ server.tool("color_convert", "Convert between hex, RGB, and HSL color formats", {
336
+ color: z.string().describe("Color in hex (#ff0000), rgb (255,0,0), or hsl (0,100%,50%) format"),
337
+ }, async ({ color }) => {
338
+ let r, g, b;
339
+ // Parse hex
340
+ const hexMatch = color.match(/^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/);
341
+ if (hexMatch) {
342
+ let hex = hexMatch[1];
343
+ if (hex.length === 3)
344
+ hex = hex.split("").map((c) => c + c).join("");
345
+ r = parseInt(hex.slice(0, 2), 16);
346
+ g = parseInt(hex.slice(2, 4), 16);
347
+ b = parseInt(hex.slice(4, 6), 16);
348
+ }
349
+ // Parse rgb
350
+ else if (color.match(/^rgb/i)) {
351
+ const nums = color.match(/(\d+)/g);
352
+ if (!nums || nums.length < 3)
353
+ return { content: [{ type: "text", text: "Error: Invalid RGB format" }], isError: true };
354
+ r = parseInt(nums[0]);
355
+ g = parseInt(nums[1]);
356
+ b = parseInt(nums[2]);
357
+ }
358
+ // Parse comma-separated numbers
359
+ else if (color.match(/^\d+\s*,\s*\d+\s*,\s*\d+$/)) {
360
+ const nums = color.split(",").map((s) => parseInt(s.trim()));
361
+ r = nums[0];
362
+ g = nums[1];
363
+ b = nums[2];
364
+ }
365
+ else {
366
+ return { content: [{ type: "text", text: "Error: Unrecognized color format. Use hex (#ff0000), rgb(255,0,0), or 255,0,0" }], isError: true };
367
+ }
368
+ const hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
369
+ const { h, s, l } = rgbToHsl(r, g, b);
370
+ return {
371
+ content: [
372
+ {
373
+ type: "text",
374
+ text: [
375
+ `HEX: ${hex}`,
376
+ `RGB: rgb(${r}, ${g}, ${b})`,
377
+ `HSL: hsl(${h}, ${s}%, ${l}%)`,
378
+ `CSS: ${hex}`,
379
+ ].join("\n"),
380
+ },
381
+ ],
382
+ };
383
+ });
384
+ function rgbToHsl(r, g, b) {
385
+ r /= 255;
386
+ g /= 255;
387
+ b /= 255;
388
+ const max = Math.max(r, g, b);
389
+ const min = Math.min(r, g, b);
390
+ const l = (max + min) / 2;
391
+ if (max === min)
392
+ return { h: 0, s: 0, l: Math.round(l * 100) };
393
+ const d = max - min;
394
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
395
+ let h = 0;
396
+ if (max === r)
397
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
398
+ else if (max === g)
399
+ h = ((b - r) / d + 2) / 6;
400
+ else
401
+ h = ((r - g) / d + 4) / 6;
402
+ return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };
403
+ }
404
+ // ==================== QR CODE ====================
405
+ server.tool("qr_generate", "Generate a QR code from text or URL. Returns a data URI (base64 PNG image)", {
406
+ text: z.string().describe("Text or URL to encode in QR code"),
407
+ size: z.number().min(100).max(1000).default(300).describe("Image size in pixels"),
408
+ }, async ({ text, size }) => {
409
+ try {
410
+ const dataUri = await QRCode.toDataURL(text, {
411
+ width: size,
412
+ margin: 2,
413
+ color: { dark: "#000000", light: "#ffffff" },
414
+ });
415
+ return {
416
+ content: [
417
+ { type: "text", text: `QR Code generated for: "${text.slice(0, 50)}${text.length > 50 ? "..." : ""}"` },
418
+ { type: "image", data: dataUri.split(",")[1], mimeType: "image/png" },
419
+ ],
420
+ };
421
+ }
422
+ catch (e) {
423
+ return { content: [{ type: "text", text: `Error generating QR code: ${e.message}` }], isError: true };
424
+ }
425
+ });
426
+ // ==================== NETWORK TOOLS ====================
427
+ server.tool("http_status", "Look up HTTP status code meaning", { code: z.number().describe("HTTP status code") }, async ({ code }) => {
428
+ const statuses = {
429
+ 100: "Continue", 101: "Switching Protocols", 102: "Processing",
430
+ 200: "OK", 201: "Created", 202: "Accepted", 204: "No Content",
431
+ 301: "Moved Permanently", 302: "Found", 304: "Not Modified", 307: "Temporary Redirect", 308: "Permanent Redirect",
432
+ 400: "Bad Request", 401: "Unauthorized", 403: "Forbidden", 404: "Not Found",
433
+ 405: "Method Not Allowed", 408: "Request Timeout", 409: "Conflict",
434
+ 410: "Gone", 413: "Payload Too Large", 415: "Unsupported Media Type",
435
+ 418: "I'm a Teapot ☕", 422: "Unprocessable Entity", 429: "Too Many Requests",
436
+ 500: "Internal Server Error", 501: "Not Implemented", 502: "Bad Gateway",
437
+ 503: "Service Unavailable", 504: "Gateway Timeout",
438
+ };
439
+ const meaning = statuses[code] || "Unknown status code";
440
+ const category = code < 200 ? "Informational" :
441
+ code < 300 ? "Success" :
442
+ code < 400 ? "Redirection" :
443
+ code < 500 ? "Client Error" : "Server Error";
444
+ return {
445
+ content: [{ type: "text", text: `${code} ${meaning}\nCategory: ${category} (${Math.floor(code / 100)}xx)` }],
446
+ };
447
+ });
448
+ // ==================== MATH / CONVERSION ====================
449
+ server.tool("number_base", "Convert a number between bases (binary, octal, decimal, hex)", {
450
+ value: z.string().describe("Number to convert (prefix with 0x for hex, 0b for binary, 0o for octal)"),
451
+ to_base: z.number().min(2).max(36).optional().describe("Target base (2-36). If omitted, shows all common bases"),
452
+ }, async ({ value, to_base }) => {
453
+ let num;
454
+ if (value.startsWith("0x"))
455
+ num = parseInt(value, 16);
456
+ else if (value.startsWith("0b"))
457
+ num = parseInt(value.slice(2), 2);
458
+ else if (value.startsWith("0o"))
459
+ num = parseInt(value.slice(2), 8);
460
+ else
461
+ num = parseInt(value, 10);
462
+ if (isNaN(num)) {
463
+ return { content: [{ type: "text", text: "Error: Could not parse number" }], isError: true };
464
+ }
465
+ if (to_base) {
466
+ return { content: [{ type: "text", text: num.toString(to_base) }] };
467
+ }
468
+ return {
469
+ content: [
470
+ {
471
+ type: "text",
472
+ text: [
473
+ `Decimal: ${num}`,
474
+ `Hex: 0x${num.toString(16)}`,
475
+ `Binary: 0b${num.toString(2)}`,
476
+ `Octal: 0o${num.toString(8)}`,
477
+ ].join("\n"),
478
+ },
479
+ ],
480
+ };
481
+ });
482
+ server.tool("byte_convert", "Convert between byte units (B, KB, MB, GB, TB)", {
483
+ value: z.string().describe("Value with unit, e.g. '1.5GB', '1024KB', '500MB'"),
484
+ }, async ({ value }) => {
485
+ const match = value.match(/^([\d.]+)\s*(B|KB|MB|GB|TB|PB|KiB|MiB|GiB|TiB|PiB)$/i);
486
+ if (!match) {
487
+ return { content: [{ type: "text", text: "Error: Use format like '1.5GB', '1024KB', '500MB'" }], isError: true };
488
+ }
489
+ const num = parseFloat(match[1]);
490
+ const unit = match[2].toUpperCase();
491
+ // Convert to bytes (SI)
492
+ const si = {
493
+ B: 1, KB: 1e3, MB: 1e6, GB: 1e9, TB: 1e12, PB: 1e15,
494
+ KIB: 1024, MIB: 1024 ** 2, GIB: 1024 ** 3, TIB: 1024 ** 4, PIB: 1024 ** 5,
495
+ };
496
+ const bytes = num * (si[unit] || 1);
497
+ return {
498
+ content: [
499
+ {
500
+ type: "text",
501
+ text: [
502
+ `Bytes: ${bytes.toLocaleString()} B`,
503
+ `KB: ${(bytes / 1e3).toFixed(2)}`,
504
+ `MB: ${(bytes / 1e6).toFixed(2)}`,
505
+ `GB: ${(bytes / 1e9).toFixed(4)}`,
506
+ `TB: ${(bytes / 1e12).toFixed(6)}`,
507
+ `---`,
508
+ `KiB: ${(bytes / 1024).toFixed(2)}`,
509
+ `MiB: ${(bytes / 1024 ** 2).toFixed(2)}`,
510
+ `GiB: ${(bytes / 1024 ** 3).toFixed(4)}`,
511
+ ].join("\n"),
512
+ },
513
+ ],
514
+ };
515
+ });
516
+ // ==================== TEXT TOOLS ====================
517
+ server.tool("text_stats", "Count characters, words, lines, and analyze text", { text: z.string().describe("Text to analyze") }, async ({ text }) => {
518
+ const chars = text.length;
519
+ const words = text.trim() ? text.trim().split(/\s+/).length : 0;
520
+ const lines = text.split("\n").length;
521
+ const sentences = text.split(/[.!?]+/).filter((s) => s.trim()).length;
522
+ const bytes = Buffer.byteLength(text, "utf-8");
523
+ return {
524
+ content: [
525
+ {
526
+ type: "text",
527
+ text: [
528
+ `Characters: ${chars.toLocaleString()}`,
529
+ `Words: ${words.toLocaleString()}`,
530
+ `Lines: ${lines.toLocaleString()}`,
531
+ `Sentences: ~${sentences.toLocaleString()}`,
532
+ `Bytes (UTF-8): ${bytes.toLocaleString()}`,
533
+ `Estimated tokens: ~${Math.ceil(words * 1.3)}`,
534
+ ].join("\n"),
535
+ },
536
+ ],
537
+ };
538
+ });
539
+ server.tool("text_diff", "Compare two text strings line-by-line", {
540
+ a: z.string().describe("First text"),
541
+ b: z.string().describe("Second text"),
542
+ }, async ({ a, b }) => {
543
+ const linesA = a.split("\n");
544
+ const linesB = b.split("\n");
545
+ const maxLen = Math.max(linesA.length, linesB.length);
546
+ const diffs = [];
547
+ for (let i = 0; i < maxLen; i++) {
548
+ if (i >= linesA.length) {
549
+ diffs.push(`+ ${i + 1}: ${linesB[i]}`);
550
+ }
551
+ else if (i >= linesB.length) {
552
+ diffs.push(`- ${i + 1}: ${linesA[i]}`);
553
+ }
554
+ else if (linesA[i] !== linesB[i]) {
555
+ diffs.push(`- ${i + 1}: ${linesA[i]}`);
556
+ diffs.push(`+ ${i + 1}: ${linesB[i]}`);
557
+ }
558
+ }
559
+ return {
560
+ content: [
561
+ {
562
+ type: "text",
563
+ text: diffs.length === 0
564
+ ? "✅ Texts are identical"
565
+ : `Found differences in ${diffs.length} line(s):\n\n${diffs.join("\n")}`,
566
+ },
567
+ ],
568
+ };
569
+ });
570
+ // ==================== CRON TOOLS ====================
571
+ server.tool("cron_explain", "Explain what a cron expression means in human-readable terms", { expression: z.string().describe("Cron expression (5 or 6 fields)") }, async ({ expression }) => {
572
+ const fields = expression.trim().split(/\s+/);
573
+ if (fields.length < 5 || fields.length > 6) {
574
+ return { content: [{ type: "text", text: "Error: Expected 5 or 6 fields (minute hour day month weekday [year])" }], isError: true };
575
+ }
576
+ const names = ["Minute", "Hour", "Day of Month", "Month", "Day of Week"];
577
+ if (fields.length === 6)
578
+ names.push("Year");
579
+ const lines = fields.map((f, i) => `${names[i]}: ${f} → ${explainCronField(f, i)}`);
580
+ return {
581
+ content: [{ type: "text", text: `Cron: \`${expression}\`\n\n${lines.join("\n")}` }],
582
+ };
583
+ });
584
+ function explainCronField(field, position) {
585
+ if (field === "*")
586
+ return "every value";
587
+ if (field.includes("/")) {
588
+ const [, step] = field.split("/");
589
+ return `every ${step} ${["minute", "hour", "day", "month", "weekday"][position] || "unit"}(s)`;
590
+ }
591
+ if (field.includes("-"))
592
+ return `range ${field}`;
593
+ if (field.includes(","))
594
+ return `specific values: ${field}`;
595
+ return `at ${field}`;
596
+ }
597
+ // ==================== MAIN ====================
598
+ async function main() {
599
+ const transport = new StdioServerTransport();
600
+ await server.connect(transport);
601
+ console.error("devtools-mcp server running on stdio");
602
+ }
603
+ main().catch((err) => {
604
+ console.error("Fatal error:", err);
605
+ process.exit(1);
606
+ });
607
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "mcp-devtools-server",
3
+ "version": "1.0.0",
4
+ "description": "Swiss Army knife MCP server — 20+ developer utilities (base64, JWT, UUID, hash, QR codes, regex, timestamps, colors, and more) with zero API keys required",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "mcp-devtools-server": "dist/index.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsx src/index.ts"
14
+ },
15
+ "keywords": [
16
+ "mcp",
17
+ "mcp-server",
18
+ "model-context-protocol",
19
+ "developer-tools",
20
+ "devtools",
21
+ "utilities",
22
+ "base64",
23
+ "jwt",
24
+ "uuid",
25
+ "hash",
26
+ "qrcode",
27
+ "regex",
28
+ "json",
29
+ "timestamp",
30
+ "color",
31
+ "encoding",
32
+ "claude",
33
+ "cursor",
34
+ "ai-tools"
35
+ ],
36
+ "author": "Kira Autonoma <kira@autonoma.dev>",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/kira-autonoma/devtools-mcp"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "README.md",
48
+ "LICENSE"
49
+ ],
50
+ "dependencies": {
51
+ "@modelcontextprotocol/sdk": "^1.12.0",
52
+ "qrcode": "^1.5.4"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^20.19.37",
56
+ "@types/qrcode": "^1.5.6",
57
+ "typescript": "^5.9.3"
58
+ }
59
+ }