it-tools-mcp 3.0.23 → 3.1.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/README.dockerhub.md +30 -17
- package/README.md +81 -33
- package/build/index.js +47 -15
- package/build/tools/ansible/ansible-inventory-generator/index.js +212 -0
- package/build/tools/ansible/ansible-playbook-validator/index.js +128 -0
- package/build/tools/ansible/ansible-reference/index.js +393 -0
- package/build/tools/ansible/ansible-vault-decrypt/index.js +137 -0
- package/build/tools/ansible/ansible-vault-encrypt/index.js +79 -0
- package/build/tools/color/color-hex-to-rgb/index.js +29 -0
- package/build/tools/{color.js → color/color-rgb-to-hex/index.js} +1 -27
- package/build/tools/crypto/basic-auth-generator/index.js +45 -0
- package/build/tools/crypto/bcrypt-hash/index.js +67 -0
- package/build/tools/crypto/bip39-generate/index.js +53 -0
- package/build/tools/crypto/hash-md5/index.js +19 -0
- package/build/tools/crypto/hash-sha1/index.js +19 -0
- package/build/tools/crypto/hash-sha256/index.js +19 -0
- package/build/tools/crypto/hash-sha512/index.js +19 -0
- package/build/tools/crypto/hmac-generator/index.js +37 -0
- package/build/tools/crypto/jwt-decode/index.js +41 -0
- package/build/tools/crypto/otp-code-generator/index.js +67 -0
- package/build/tools/crypto/password-generate/index.js +54 -0
- package/build/tools/crypto/token-generator/index.js +75 -0
- package/build/tools/dataFormat/html-to-markdown/index.js +34 -0
- package/build/tools/dataFormat/json-diff/index.js +94 -0
- package/build/tools/dataFormat/json-format/index.js +100 -0
- package/build/tools/dataFormat/json-minify/index.js +29 -0
- package/build/tools/dataFormat/json-to-csv/index.js +34 -0
- package/build/tools/dataFormat/json-to-toml/index.js +30 -0
- package/build/tools/dataFormat/markdown-to-html/index.js +32 -0
- package/build/tools/dataFormat/phone-format/index.js +35 -0
- package/build/tools/dataFormat/sql-format/index.js +37 -0
- package/build/tools/dataFormat/toml-to-json/index.js +29 -0
- package/build/tools/dataFormat/xml-format/index.js +44 -0
- package/build/tools/dataFormat/yaml-format/index.js +58 -0
- package/build/tools/{development.js → development/crontab-generate/index.js} +1 -129
- package/build/tools/development/html-prettifier/index.js +47 -0
- package/build/tools/development/javascript-prettifier/index.js +74 -0
- package/build/tools/development/list-converter/index.js +62 -0
- package/build/tools/development/markdown-toc-generator/index.js +53 -0
- package/build/tools/development/regex-tester/index.js +69 -0
- package/build/tools/docker/docker-compose-to-docker-run/index.js +138 -0
- package/build/tools/docker/docker-compose-validator/index.js +125 -0
- package/build/tools/docker/docker-reference/index.js +188 -0
- package/build/tools/docker/docker-run-to-docker-compose/index.js +117 -0
- package/build/tools/docker/traefik-compose-generator/index.js +98 -0
- package/build/tools/encoding/base64-decode/index.js +28 -0
- package/build/tools/encoding/base64-encode/index.js +16 -0
- package/build/tools/encoding/html-decode/index.js +21 -0
- package/build/tools/encoding/html-encode/index.js +21 -0
- package/build/tools/encoding/html-entities-extended/index.js +72 -0
- package/build/tools/encoding/text-to-binary/index.js +51 -0
- package/build/tools/encoding/url-decode/index.js +28 -0
- package/build/tools/encoding/url-encode/index.js +16 -0
- package/build/tools/forensic/file-type-identifier/index.js +90 -0
- package/build/tools/forensic/safelink-decoder/index.js +54 -0
- package/build/tools/forensic/url-fanger/index.js +52 -0
- package/build/tools/idGenerators/qr-generate/index.js +76 -0
- package/build/tools/idGenerators/svg-placeholder-generator/index.js +59 -0
- package/build/tools/idGenerators/ulid-generate/index.js +34 -0
- package/build/tools/idGenerators/uuid-generate/index.js +14 -0
- package/build/tools/math/math-evaluate/index.js +33 -0
- package/build/tools/math/number-base-converter/index.js +46 -0
- package/build/tools/math/percentage-calculator/index.js +50 -0
- package/build/tools/math/roman-numeral-converter/index.js +76 -0
- package/build/tools/math/temperature-converter/index.js +59 -0
- package/build/tools/math/unix-timestamp-converter/index.js +55 -0
- package/build/tools/network/cat/index.js +15 -0
- package/build/tools/network/cidr-to-ip-range/index.js +108 -0
- package/build/tools/network/curl/index.js +35 -0
- package/build/tools/network/dig/index.js +19 -0
- package/build/tools/network/grep/index.js +18 -0
- package/build/tools/network/head/index.js +17 -0
- package/build/tools/network/iban-validate/index.js +83 -0
- package/build/tools/network/ip-range-to-cidr/index.js +88 -0
- package/build/tools/network/ip-subnet-calculator/index.js +102 -0
- package/build/tools/network/ipv4-subnet-calc/index.js +112 -0
- package/build/tools/network/ipv6-subnet-calculator/index.js +104 -0
- package/build/tools/network/ipv6-ula-generator/index.js +65 -0
- package/build/tools/network/mac-address-generate/index.js +68 -0
- package/build/tools/network/nslookup/index.js +18 -0
- package/build/tools/network/ping/index.js +20 -0
- package/build/tools/network/ps/index.js +22 -0
- package/build/tools/network/random-port/index.js +53 -0
- package/build/tools/network/scp/index.js +134 -0
- package/build/tools/network/ssh/index.js +83 -0
- package/build/tools/network/tail/index.js +16 -0
- package/build/tools/network/telnet/index.js +45 -0
- package/build/tools/network/top/index.js +14 -0
- package/build/tools/network/url-parse/index.js +52 -0
- package/build/tools/physics/angle-converter/index.js +73 -0
- package/build/tools/physics/energy-converter/index.js +72 -0
- package/build/tools/physics/power-converter/index.js +71 -0
- package/build/tools/text/ascii-art-text/index.js +112 -0
- package/build/tools/text/distinct-words/index.js +30 -0
- package/build/tools/text/emoji-search/index.js +76 -0
- package/build/tools/text/lorem-ipsum-generator/index.js +87 -0
- package/build/tools/text/numeronym-generator/index.js +37 -0
- package/build/tools/text/slugify-string/index.js +44 -0
- package/build/tools/text/string-obfuscator/index.js +49 -0
- package/build/tools/text/text-camelcase/index.js +20 -0
- package/build/tools/text/text-capitalize/index.js +16 -0
- package/build/tools/text/text-diff/index.js +72 -0
- package/build/tools/text/text-kebabcase/index.js +20 -0
- package/build/tools/text/text-lowercase/index.js +15 -0
- package/build/tools/text/text-pascalcase/index.js +18 -0
- package/build/tools/text/text-snakecase/index.js +20 -0
- package/build/tools/text/text-stats/index.js +29 -0
- package/build/tools/text/text-to-nato-alphabet/index.js +57 -0
- package/build/tools/text/text-to-unicode/index.js +50 -0
- package/build/tools/text/text-to-unicode-names/index.js +34 -0
- package/build/tools/text/text-uppercase/index.js +15 -0
- package/build/tools/utility/css-prettifier/index.js +70 -0
- package/build/tools/utility/device-info/index.js +44 -0
- package/build/tools/utility/email-normalizer/index.js +73 -0
- package/build/tools/utility/http-status-codes/index.js +173 -0
- package/build/tools/utility/mime-types/index.js +121 -0
- package/build/tools/utility/port-numbers/index.js +106 -0
- package/build/tools/utility/rem-px-converter/index.js +63 -0
- package/package.json +3 -3
- package/build/tools/crypto.js +0 -445
- package/build/tools/dataFormat.js +0 -535
- package/build/tools/encoding.js +0 -240
- package/build/tools/idGenerators.js +0 -180
- package/build/tools/math.js +0 -310
- package/build/tools/network.js +0 -931
- package/build/tools/text.js +0 -678
- package/build/tools/utility.js +0 -407
package/README.dockerhub.md
CHANGED
|
@@ -2,9 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
|
|
4
4
|
[](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
|
|
5
|
-
[](https://www.npmjs.com/package/it-tools-mcp)
|
|
6
|
+
[](https://www.npmjs.com/package/it-tools-mcp)
|
|
7
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/releases)
|
|
8
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/blob/main/LICENSE)
|
|
9
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/issues)
|
|
10
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/commits/main)
|
|
11
|
+
[](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
|
|
12
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/stargazers)
|
|
6
13
|
|
|
7
|
-
A comprehensive Model Context Protocol (MCP) server that provides access to **
|
|
14
|
+
A comprehensive Model Context Protocol (MCP) server that provides access to **112 IT tools and utilities** commonly used by developers, system administrators, and IT professionals. This server exposes a complete set of tools for encoding/decoding, text manipulation, hashing, network utilities, and many other common development and IT tasks.
|
|
8
15
|
|
|
9
16
|
[](https://glama.ai/mcp/servers/@wrenchpilot/it-tools-mcp)
|
|
10
17
|
|
|
@@ -58,7 +65,7 @@ Add to your VS Code `settings.json`:
|
|
|
58
65
|
}
|
|
59
66
|
```
|
|
60
67
|
|
|
61
|
-
See the complete list of all
|
|
68
|
+
See the complete list of all 112 tools with detailed parameters on [GitHub](https://github.com/wrenchpilot/it-tools-mcp#available-tools)
|
|
62
69
|
|
|
63
70
|
## 📸 Examples in Action
|
|
64
71
|
|
|
@@ -80,7 +87,7 @@ Built with **TypeScript**, **Zod** validation, and **MCP SDK** for robust, type-
|
|
|
80
87
|
|
|
81
88
|
This project was developed using **VS Code**, **Copilot Chat Agent**, **Playwright MCP**, and the **Claude Sonnet 4 Model**, showcasing modern AI-assisted software development:
|
|
82
89
|
|
|
83
|
-
- 🔧 **All
|
|
90
|
+
- 🔧 **All 112 tools** designed and implemented with AI assistance
|
|
84
91
|
- 📦 **Complete Docker setup** with GitHub Actions CI/CD pipeline
|
|
85
92
|
- 🔍 **Schema optimization** with systematic validation cleanup
|
|
86
93
|
- 📚 **Comprehensive documentation** and tool catalogs
|
|
@@ -89,23 +96,29 @@ This project was developed using **VS Code**, **Copilot Chat Agent**, **Playwrig
|
|
|
89
96
|
|
|
90
97
|
```text
|
|
91
98
|
src/
|
|
92
|
-
├── index.ts # Main MCP server
|
|
93
|
-
└── tools/ #
|
|
94
|
-
├──
|
|
95
|
-
├──
|
|
96
|
-
├──
|
|
97
|
-
├──
|
|
98
|
-
├──
|
|
99
|
-
├──
|
|
100
|
-
├──
|
|
101
|
-
|
|
99
|
+
├── index.ts # Main MCP server with dynamic tool loading
|
|
100
|
+
└── tools/ # Modular tool categories
|
|
101
|
+
├── ansible/ # 5 Ansible automation tools
|
|
102
|
+
├── color/ # 2 Color conversion tools
|
|
103
|
+
├── crypto/ # 9 Cryptographic & security tools
|
|
104
|
+
├── dataFormat/ # 12 Data format conversion tools
|
|
105
|
+
├── development/ # 6 Development utilities
|
|
106
|
+
├── docker/ # 5 Docker & containerization tools
|
|
107
|
+
├── encoding/ # 8 Encoding/decoding tools
|
|
108
|
+
├── forensic/ # 3 Digital forensics tools
|
|
109
|
+
├── idGenerators/ # 4 ID & code generation tools
|
|
110
|
+
├── math/ # 6 Mathematical operation tools
|
|
111
|
+
├── network/ # 23 Network utilities
|
|
112
|
+
├── physics/ # 3 Physics calculation tools
|
|
113
|
+
├── text/ # 19 Text manipulation tools
|
|
114
|
+
└── utility/ # 7 General utility tools
|
|
102
115
|
```
|
|
103
116
|
|
|
104
117
|
### Adding New Tools
|
|
105
118
|
|
|
106
|
-
1.
|
|
107
|
-
2. Define tool with input schema using Zod
|
|
108
|
-
3.
|
|
119
|
+
1. Create a tool directory in appropriate category under `src/tools/`
|
|
120
|
+
2. Define tool with input schema using Zod in its `index.ts`
|
|
121
|
+
3. Export registration function for dynamic loading
|
|
109
122
|
4. Rebuild with `npm run build`
|
|
110
123
|
|
|
111
124
|
## 🤝 Contributing
|
package/README.md
CHANGED
|
@@ -2,11 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
|
|
4
4
|
[](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
|
|
5
|
-
[](https://www.npmjs.com/package/it-tools-mcp)
|
|
6
|
+
[](https://www.npmjs.com/package/it-tools-mcp)
|
|
7
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/releases)
|
|
8
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/blob/main/LICENSE)
|
|
9
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/issues)
|
|
10
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/commits/main)
|
|
11
|
+
[](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
|
|
12
|
+
[](https://github.com/wrenchpilot/it-tools-mcp/stargazers)
|
|
6
13
|
|
|
7
14
|
> **📝 Note**: A condensed version of this README is automatically synced to [Docker Hub](https://hub.docker.com/r/wrenchpilot/it-tools-mcp) due to character limits.
|
|
8
15
|
|
|
9
|
-
A comprehensive Model Context Protocol (MCP) server that provides access to
|
|
16
|
+
A comprehensive Model Context Protocol (MCP) server that provides access to 112 IT tools and utilities commonly used by developers, system administrators, and IT professionals. This server exposes a complete set of tools for encoding/decoding, text manipulation, hashing, network utilities, and many other common development and IT tasks.
|
|
10
17
|
|
|
11
18
|
[](https://glama.ai/mcp/servers/@wrenchpilot/it-tools-mcp)
|
|
12
19
|
|
|
@@ -82,16 +89,22 @@ echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"base64-enc
|
|
|
82
89
|
|
|
83
90
|
## 🛠️ Tool Categories
|
|
84
91
|
|
|
85
|
-
This MCP server provides **
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
92
|
+
This MCP server provides **112 tools** across **14 categories**:
|
|
93
|
+
|
|
94
|
+
- **� Ansible Tools** (5 tools): Vault encryption/decryption, inventory parser, playbook validator, reference
|
|
95
|
+
- **🎨 Color Tools** (2 tools): Hex ↔ RGB conversion
|
|
96
|
+
- **📝 Data Format** (12 tools): JSON, XML, YAML, SQL, TOML, Markdown ↔ HTML conversion, phone formatting
|
|
97
|
+
- **�️ Development Tools** (6 tools): Regex testing, cron generation, list conversion, code prettifiers, markdown TOC
|
|
98
|
+
- **🐳 Docker Tools** (5 tools): Compose validation, conversion tools, Traefik generator, reference
|
|
99
|
+
- **🔧 Encoding & Decoding** (8 tools): Base64, URL, HTML entities, text-to-binary
|
|
100
|
+
- **🔍 Forensic Tools** (3 tools): File type identification, safelink decoding, URL fanger
|
|
101
|
+
- **🆔 ID & Code Generators** (4 tools): UUID, ULID, QR codes, SVG placeholders
|
|
102
|
+
- **🔢 Math & Calculations** (6 tools): Expression evaluation, base conversion, temperature, percentages, Unix timestamps, Roman numerals
|
|
103
|
+
- **🌐 Network & System** (23 tools): IPv4/IPv6 subnets, URL parsing, MAC addresses, ps, top, cat, head, tail, grep, ping, nslookup, telnet, dig, ssh, scp, curl, IBAN validation
|
|
104
|
+
- **⚡ Physics** (3 tools): Angle, energy, and power unit conversions
|
|
105
|
+
- **🔐 Security & Crypto** (12 tools): Hashing (MD5, SHA1, SHA256, SHA512), HMAC, JWT, bcrypt, passwords, tokens, OTP, BIP39
|
|
106
|
+
- **✨ Text Processing** (19 tools): Case conversion, stats, diff, ASCII art, NATO alphabet, slugify, Unicode
|
|
107
|
+
- **🛠️ Utility Tools** (7 tools): Email normalization, MIME types, HTTP status codes, device info, CSS prettifier, rem/px converter
|
|
95
108
|
|
|
96
109
|
## 📸 Screenshot Examples
|
|
97
110
|
|
|
@@ -109,6 +122,15 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
|
|
|
109
122
|
|
|
110
123
|
| Tool | Description | Parameters |
|
|
111
124
|
| --------------------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
125
|
+
| **Ansible Tools** | | |
|
|
126
|
+
| `ansible-inventory-generator` | Generate Ansible inventory | `hosts: string[]`, `groups?: Record<string, string[]>`, `variables?: Record<string, any>` |
|
|
127
|
+
| `ansible-playbook-validator` | Validate Ansible playbook YAML | `playbook: string` |
|
|
128
|
+
| `ansible-reference` | Ansible syntax and module reference | `query?: string` |
|
|
129
|
+
| `ansible-vault-decrypt` | Decrypt Ansible Vault data | `data: string`, `password: string` |
|
|
130
|
+
| `ansible-vault-encrypt` | Encrypt data with Ansible Vault | `data: string`, `password: string` |
|
|
131
|
+
| **Color Tools** | | |
|
|
132
|
+
| `color-hex-to-rgb` | Convert HEX to RGB | `hex: string` |
|
|
133
|
+
| `color-rgb-to-hex` | Convert RGB to HEX | `r: number`, `g: number`, `b: number` |
|
|
112
134
|
| **Data Format** | | |
|
|
113
135
|
| `html-to-markdown` | Convert HTML to Markdown | `html: string` |
|
|
114
136
|
| `json-diff` | Compare JSON objects | `json1: string`, `json2: string` |
|
|
@@ -124,8 +146,17 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
|
|
|
124
146
|
| `yaml-format` | Format YAML | `yaml: string` |
|
|
125
147
|
| **Development Tools** | | |
|
|
126
148
|
| `crontab-generate` | Generate cron expressions | `minute?: string`, `hour?: string`, `dayOfMonth?: string`, `month?: string`, `dayOfWeek?: string` |
|
|
149
|
+
| `html-prettifier` | Format and prettify HTML | `html: string`, `indent?: number` |
|
|
150
|
+
| `javascript-prettifier` | Format and prettify JavaScript | `javascript: string`, `indent?: number` |
|
|
127
151
|
| `list-converter` | Convert list formats | `list: string`, `inputFormat: 'comma' \| 'semicolon' \| 'newline' \| 'space' \| 'pipe'`, `outputFormat: 'comma' \| 'semicolon' \| 'newline' \| 'space' \| 'pipe' \| 'json' \| 'quoted'`, `trim?: boolean` |
|
|
152
|
+
| `markdown-toc-generator` | Generate table of contents for Markdown | `markdown: string`, `maxDepth?: number` |
|
|
128
153
|
| `regex-tester` | Test regular expressions | `pattern: string`, `text: string`, `flags?: string` |
|
|
154
|
+
| **Docker Tools** | | |
|
|
155
|
+
| `docker-compose-to-docker-run` | Convert Compose to Docker run command | `compose: string`, `service?: string` |
|
|
156
|
+
| `docker-compose-validator` | Validate Docker Compose YAML | `compose: string` |
|
|
157
|
+
| `docker-reference` | Docker command and syntax reference | `query?: string` |
|
|
158
|
+
| `docker-run-to-docker-compose` | Convert Docker run to Compose | `command: string` |
|
|
159
|
+
| `traefik-compose-generator` | Generate Traefik Docker Compose | `domain: string`, `service: string`, `port?: number`, `network?: string` |
|
|
129
160
|
| **Encoding & Decoding** | | |
|
|
130
161
|
| `base64-decode` | Decode Base64 text | `text: string` |
|
|
131
162
|
| `base64-encode` | Encode text to Base64 | `text: string` |
|
|
@@ -136,6 +167,10 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
|
|
|
136
167
|
| `text-to-unicode` | Convert text to Unicode and vice versa | `input: string`, `operation: 'encode' \| 'decode'` |
|
|
137
168
|
| `url-decode` | URL decode text | `text: string` |
|
|
138
169
|
| `url-encode` | URL encode text | `text: string` |
|
|
170
|
+
| **Forensic Tools** | | |
|
|
171
|
+
| `file-type-identifier` | Identify file type from content | `data: string`, `filename?: string` |
|
|
172
|
+
| `safelink-decoder` | Decode Microsoft SafeLinks | `url: string` |
|
|
173
|
+
| `url-fanger` | Fang and defang URLs for analysis | `text: string`, `operation: 'fang' \| 'defang'` |
|
|
139
174
|
| **ID & Code Generators** | | |
|
|
140
175
|
| `qr-generate` | Generate QR codes for any content | `text: string`, `size?: number` - Supports URLs, WiFi (WIFI:T:WPA;S:network;P:password;;), contact info, etc. |
|
|
141
176
|
| `svg-placeholder-generator` | Generate SVG placeholder | `width?: number`, `height?: number`, `text?: string`, `backgroundColor?: string`, `textColor?: string` |
|
|
@@ -150,25 +185,29 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
|
|
|
150
185
|
| `unix-timestamp-converter` | Convert timestamps | `input: string` |
|
|
151
186
|
| **Network & System** | | |
|
|
152
187
|
| `cat` | Display file content | `file: string` |
|
|
153
|
-
| `curl` | HTTP client (GET, POST, etc.)
|
|
188
|
+
| `curl` | HTTP client (GET, POST, etc.) | `url: string`, `method?: string`, `headers?: Record<string, string>`, `body?: string` |
|
|
154
189
|
| `dig` | DNS query (custom type) | `target: string`, `type?: string` |
|
|
155
190
|
| `grep` | Search for pattern in file | `file: string`, `pattern: string` |
|
|
156
191
|
| `head` | Show first N lines of file | `file: string`, `lines?: number` |
|
|
157
|
-
| `iban-validate` | Validate IBAN | `iban: string`
|
|
192
|
+
| `iban-validate` | Validate IBAN | `iban: string` |
|
|
158
193
|
| `ip-subnet-calculator` | Calculate IPv4 subnet | `ip: string`, `cidr: number` |
|
|
159
194
|
| `ipv4-subnet-calc` | Enhanced IPv4 subnet calc | `cidr: string` |
|
|
160
195
|
| `ipv6-ula-generator` | Generate IPv6 ULA | `globalId?: string` |
|
|
161
|
-
| `mac-address-generate` | Generate MAC address | `prefix?: string`, `separator?: ':' \| '-'`
|
|
196
|
+
| `mac-address-generate` | Generate MAC address | `prefix?: string`, `separator?: ':' \| '-'` |
|
|
162
197
|
| `nslookup` | DNS lookup (A/AAAA/CNAME) | `target: string` |
|
|
163
198
|
| `ping` | Ping a host | `target: string`, `count?: number` |
|
|
164
199
|
| `ps` | List running processes | None |
|
|
165
200
|
| `random-port` | Generate random ports | `count?: number`, `min?: number`, `max?: number`, `exclude?: number[]` |
|
|
166
|
-
| `scp` | Copy files to/from remote host (SFTP)
|
|
201
|
+
| `scp` | Copy files to/from remote host (SFTP) | `target: string`, `user: string`, `direction: 'upload'\|'download'`, `localPath: string`, `remotePath: string`, `privateKey?: string` |
|
|
167
202
|
| `ssh` | SSH command execution | `target: string`, `user: string`, `command: string` |
|
|
168
203
|
| `tail` | Show last N lines of file | `file: string`, `lines?: number` |
|
|
169
204
|
| `telnet` | Test TCP connectivity | `target: string`, `port: number` |
|
|
170
205
|
| `top` | Show top processes (by CPU) | None |
|
|
171
206
|
| `url-parse` | Parse URL components | `url: string` |
|
|
207
|
+
| **Physics** | | |
|
|
208
|
+
| `angle-converter` | Convert angle units | `value: number`, `from: 'degrees' \| 'radians' \| 'gradians'`, `to: 'degrees' \| 'radians' \| 'gradians'` |
|
|
209
|
+
| `energy-converter` | Convert energy units | `value: number`, `from: 'joules' \| 'calories' \| 'kwh' \| 'btu'`, `to: 'joules' \| 'calories' \| 'kwh' \| 'btu'` |
|
|
210
|
+
| `power-converter` | Convert power units | `value: number`, `from: 'watts' \| 'kilowatts' \| 'horsepower' \| 'btu_per_hour'`, `to: 'watts' \| 'kilowatts' \| 'horsepower' \| 'btu_per_hour'` |
|
|
172
211
|
| **Security & Crypto** | | |
|
|
173
212
|
| `basic-auth-generator` | Generate Basic Auth header | `username: string`, `password: string` |
|
|
174
213
|
| `bcrypt-hash` | Generate/verify bcrypt hash | `password: string`, `rounds?: number`, `hash?: string` |
|
|
@@ -184,6 +223,7 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
|
|
|
184
223
|
| `token-generator` | Generate secure token | `length?: number`, `charset?: 'alphanumeric' \| 'hex' \| 'base64' \| 'custom'`, `customChars?: string` |
|
|
185
224
|
| **Text Processing** | | |
|
|
186
225
|
| `ascii-art-text` | Generate ASCII art | `text: string`, `font?: string` (supports 295+ figlet fonts) |
|
|
226
|
+
| `distinct-words` | Extract unique words from text | `text: string`, `caseSensitive?: boolean` |
|
|
187
227
|
| `emoji-search` | Search emojis | `query: string` |
|
|
188
228
|
| `lorem-ipsum-generator` | Generate Lorem Ipsum | `type?: 'words' \| 'sentences' \| 'paragraphs'`, `count?: number` |
|
|
189
229
|
| `numeronym-generator` | Generate numeronyms | `text: string` |
|
|
@@ -198,14 +238,16 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
|
|
|
198
238
|
| `text-snakecase` | Convert to snake_case | `text: string` |
|
|
199
239
|
| `text-stats` | Get text statistics | `text: string` |
|
|
200
240
|
| `text-to-nato-alphabet` | Convert to NATO alphabet | `text: string` |
|
|
241
|
+
| `text-to-unicode-names` | Convert text to Unicode character names | `text: string` |
|
|
201
242
|
| `text-uppercase` | Convert to uppercase | `text: string` |
|
|
202
243
|
| **Utility Tools** | | |
|
|
203
|
-
| `
|
|
204
|
-
| `color-rgb-to-hex` | Convert RGB to HEX | `r: number`, `g: number`, `b: number` |
|
|
244
|
+
| `css-prettifier` | Format and prettify CSS | `css: string`, `indent?: number` |
|
|
205
245
|
| `device-info` | Get system information | None |
|
|
206
246
|
| `email-normalizer` | Normalize email addresses | `email: string` |
|
|
207
247
|
| `http-status-codes` | HTTP status reference | `code?: number` |
|
|
208
248
|
| `mime-types` | Look up MIME types | `input: string`, `lookupType?: 'extension-to-mime' \| 'mime-to-extension'` |
|
|
249
|
+
| `port-numbers` | Look up port number assignments | `port?: number`, `service?: string` |
|
|
250
|
+
| `rem-px-converter` | Convert between REM and PX units | `value: number`, `conversion: 'rem-to-px' \| 'px-to-rem'`, `baseFontSize?: number` |
|
|
209
251
|
|
|
210
252
|
## 🏗️ Architecture & Development
|
|
211
253
|
|
|
@@ -216,14 +258,14 @@ Built with **TypeScript**, **Zod** validation, and **MCP SDK** for robust, type-
|
|
|
216
258
|
This project was developed using **VS Code**, **Copilot Chat Agent**, **Playwright MCP**, and the **Claude Sonnet 4 Model**, demonstrating the power of AI-assisted software development:
|
|
217
259
|
|
|
218
260
|
- **Intelligent Code Generation**: Claude Sonnet analyzed requirements and generated comprehensive tool implementations
|
|
219
|
-
- **Schema Validation**: Automatically identified and resolved JSON schema validation issues across
|
|
261
|
+
- **Schema Validation**: Automatically identified and resolved JSON schema validation issues across 112 tools
|
|
220
262
|
- **Docker Optimization**: Created production-ready Docker workflows and multi-stage builds
|
|
221
263
|
- **Documentation**: Generated comprehensive README with examples and tool reference tables
|
|
222
264
|
- **Testing**: Implemented robust error handling and validation throughout the codebase
|
|
223
265
|
|
|
224
266
|
**Key AI Contributions:**
|
|
225
267
|
|
|
226
|
-
- 🔧 **Tool Implementation**: All
|
|
268
|
+
- 🔧 **Tool Implementation**: All 112 tools designed and implemented with AI assistance
|
|
227
269
|
- 📦 **Docker Setup**: Complete containerization with GitHub Actions CI/CD pipeline
|
|
228
270
|
- 🔍 **Schema Cleanup**: Systematic removal of unsupported Zod keywords from all tool definitions
|
|
229
271
|
- 📚 **Documentation**: Comprehensive README with usage examples and tool catalogs
|
|
@@ -233,25 +275,31 @@ This showcases how AI can accelerate development while maintaining code quality,
|
|
|
233
275
|
|
|
234
276
|
### Adding New Tools
|
|
235
277
|
|
|
236
|
-
1.
|
|
237
|
-
2. Define tool with input schema using Zod
|
|
238
|
-
3.
|
|
278
|
+
1. Create a tool directory in appropriate category under `src/tools/`
|
|
279
|
+
2. Define tool with input schema using Zod in its `index.ts`
|
|
280
|
+
3. Export registration function for dynamic loading
|
|
239
281
|
4. Rebuild with `npm run build`
|
|
240
282
|
|
|
241
283
|
### Project Structure
|
|
242
284
|
|
|
243
285
|
```text
|
|
244
286
|
src/
|
|
245
|
-
├── index.ts # Main MCP server
|
|
246
|
-
└── tools/ #
|
|
247
|
-
├──
|
|
248
|
-
├──
|
|
249
|
-
├──
|
|
250
|
-
├──
|
|
251
|
-
├──
|
|
252
|
-
├──
|
|
253
|
-
├──
|
|
254
|
-
|
|
287
|
+
├── index.ts # Main MCP server with dynamic tool loading
|
|
288
|
+
└── tools/ # Modular tool categories
|
|
289
|
+
├── ansible/ # 5 Ansible automation tools
|
|
290
|
+
├── color/ # 2 Color conversion tools
|
|
291
|
+
├── crypto/ # 9 Cryptographic & security tools
|
|
292
|
+
├── dataFormat/ # 12 Data format conversion tools
|
|
293
|
+
├── development/ # 6 Development utilities
|
|
294
|
+
├── docker/ # 5 Docker & containerization tools
|
|
295
|
+
├── encoding/ # 8 Encoding/decoding tools
|
|
296
|
+
├── forensic/ # 3 Digital forensics tools
|
|
297
|
+
├── idGenerators/ # 4 ID & code generation tools
|
|
298
|
+
├── math/ # 6 Mathematical operation tools
|
|
299
|
+
├── network/ # 23 Network utilities
|
|
300
|
+
├── physics/ # 3 Physics calculation tools
|
|
301
|
+
├── text/ # 19 Text manipulation tools
|
|
302
|
+
└── utility/ # 7 General utility tools
|
|
255
303
|
```
|
|
256
304
|
|
|
257
305
|
## 🤝 Contributing
|
package/build/index.js
CHANGED
|
@@ -4,6 +4,9 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import fs from 'fs';
|
|
6
6
|
import path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
7
10
|
/**
|
|
8
11
|
* Security utilities for IT Tools MCP Server
|
|
9
12
|
*/
|
|
@@ -221,24 +224,53 @@ const server = new McpServer({
|
|
|
221
224
|
tools: {},
|
|
222
225
|
},
|
|
223
226
|
});
|
|
227
|
+
// Helper function to dynamically load modular tools from a category directory
|
|
228
|
+
async function loadModularTools(server, category) {
|
|
229
|
+
const toolsDir = path.join(__dirname, 'tools', category);
|
|
230
|
+
if (!fs.existsSync(toolsDir)) {
|
|
231
|
+
console.warn(`Category directory does not exist: ${toolsDir}`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const toolDirs = fs.readdirSync(toolsDir, { withFileTypes: true })
|
|
235
|
+
.filter(dirent => dirent.isDirectory())
|
|
236
|
+
.map(dirent => dirent.name);
|
|
237
|
+
for (const toolDir of toolDirs) {
|
|
238
|
+
const toolPath = path.join(toolsDir, toolDir, 'index.js');
|
|
239
|
+
if (fs.existsSync(toolPath)) {
|
|
240
|
+
try {
|
|
241
|
+
const toolModule = await import(`./${path.relative(__dirname, toolPath).replace(/\\/g, '/')}`);
|
|
242
|
+
// Find the register function in the module
|
|
243
|
+
const registerFunction = Object.values(toolModule).find((fn) => typeof fn === 'function' && fn.name.startsWith('register'));
|
|
244
|
+
if (registerFunction) {
|
|
245
|
+
console.time(`register:${category}:${toolDir}`);
|
|
246
|
+
registerFunction(server);
|
|
247
|
+
console.timeEnd(`register:${category}:${toolDir}`);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.warn(`No register function found in ${toolPath}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
console.error(`Failed to load tool ${category}/${toolDir}:`, error);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
console.warn(`Tool index file does not exist: ${toolPath}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
224
262
|
// Register all tool modules (dynamically for faster startup, with per-module timing)
|
|
225
263
|
async function registerAllTools(server) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
{ name: 'idGenerators', fn: () => import('./tools/idGenerators.js').then(m => m.registerIdGeneratorTools(server)) },
|
|
232
|
-
{ name: 'network', fn: () => import('./tools/network.js').then(m => m.registerNetworkTools(server)) },
|
|
233
|
-
{ name: 'math', fn: () => import('./tools/math.js').then(m => m.registerMathTools(server)) },
|
|
234
|
-
{ name: 'utility', fn: () => import('./tools/utility.js').then(m => m.registerUtilityTools(server)) },
|
|
235
|
-
{ name: 'development', fn: () => import('./tools/development.js').then(m => m.registerDevelopmentTools(server)) },
|
|
236
|
-
{ name: 'color', fn: () => import('./tools/color.js').then(m => m.registerColorTools(server)) },
|
|
264
|
+
// All categories to load modularly
|
|
265
|
+
const categories = [
|
|
266
|
+
'docker', 'ansible', 'color', 'encoding', 'idGenerators',
|
|
267
|
+
'crypto', 'dataFormat', 'text', 'network', 'math',
|
|
268
|
+
'utility', 'development', 'forensic', 'physics'
|
|
237
269
|
];
|
|
238
|
-
for (const
|
|
239
|
-
console.time(`register:${
|
|
240
|
-
await
|
|
241
|
-
console.timeEnd(`register:${
|
|
270
|
+
for (const category of categories) {
|
|
271
|
+
console.time(`register:${category}-modular`);
|
|
272
|
+
await loadModularTools(server, category);
|
|
273
|
+
console.timeEnd(`register:${category}-modular`);
|
|
242
274
|
}
|
|
243
275
|
}
|
|
244
276
|
// Add resource monitoring tool
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerAnsibleInventoryParser(server) {
|
|
3
|
+
server.tool("ansible-inventory-parser", "Parse and validate Ansible inventory files", {
|
|
4
|
+
inventory: z.string().describe("Ansible inventory content (INI or YAML format)"),
|
|
5
|
+
}, async ({ inventory }) => {
|
|
6
|
+
if (!inventory?.trim()) {
|
|
7
|
+
return {
|
|
8
|
+
content: [
|
|
9
|
+
{
|
|
10
|
+
type: "text",
|
|
11
|
+
text: "Please provide inventory content to parse",
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
let parsed = {};
|
|
18
|
+
const trimmed = inventory.trim();
|
|
19
|
+
// Check if it's YAML format
|
|
20
|
+
if (trimmed.startsWith('{') || trimmed.includes('---') || trimmed.includes(':')) {
|
|
21
|
+
try {
|
|
22
|
+
const yaml = await import('js-yaml');
|
|
23
|
+
parsed = yaml.load(inventory);
|
|
24
|
+
}
|
|
25
|
+
catch (yamlError) {
|
|
26
|
+
// Fall back to INI parsing
|
|
27
|
+
parsed = parseINIInventory(inventory);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Parse as INI format
|
|
32
|
+
parsed = parseINIInventory(inventory);
|
|
33
|
+
}
|
|
34
|
+
// Validate and format the result
|
|
35
|
+
const result = formatInventoryResult(parsed);
|
|
36
|
+
return {
|
|
37
|
+
content: [
|
|
38
|
+
{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: result,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: `Error parsing inventory: ${error.message}`,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Helper function to parse INI format inventory
|
|
58
|
+
function parseINIInventory(inventory) {
|
|
59
|
+
const result = { all: { children: {}, hosts: {} } };
|
|
60
|
+
const lines = inventory.split('\n');
|
|
61
|
+
let currentGroup = 'all';
|
|
62
|
+
for (const line of lines) {
|
|
63
|
+
const trimmed = line.trim();
|
|
64
|
+
// Skip empty lines and comments
|
|
65
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Group header
|
|
69
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
70
|
+
currentGroup = trimmed.slice(1, -1);
|
|
71
|
+
// Handle group variables and children sections
|
|
72
|
+
if (currentGroup.includes(':')) {
|
|
73
|
+
const [groupName, section] = currentGroup.split(':');
|
|
74
|
+
if (section === 'vars') {
|
|
75
|
+
if (!result.all.children[groupName]) {
|
|
76
|
+
result.all.children[groupName] = { hosts: {}, vars: {} };
|
|
77
|
+
}
|
|
78
|
+
currentGroup = `${groupName}:vars`;
|
|
79
|
+
}
|
|
80
|
+
else if (section === 'children') {
|
|
81
|
+
if (!result.all.children[groupName]) {
|
|
82
|
+
result.all.children[groupName] = { hosts: {}, children: {} };
|
|
83
|
+
}
|
|
84
|
+
currentGroup = `${groupName}:children`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (!result.all.children[currentGroup]) {
|
|
89
|
+
result.all.children[currentGroup] = { hosts: {} };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
// Parse host or variable lines
|
|
95
|
+
if (currentGroup.endsWith(':vars')) {
|
|
96
|
+
// Group variables
|
|
97
|
+
const groupName = currentGroup.replace(':vars', '');
|
|
98
|
+
const [key, ...valueParts] = trimmed.split('=');
|
|
99
|
+
if (key && valueParts.length > 0) {
|
|
100
|
+
const value = valueParts.join('=');
|
|
101
|
+
if (!result.all.children[groupName].vars) {
|
|
102
|
+
result.all.children[groupName].vars = {};
|
|
103
|
+
}
|
|
104
|
+
result.all.children[groupName].vars[key.trim()] = value.trim();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (currentGroup.endsWith(':children')) {
|
|
108
|
+
// Child groups
|
|
109
|
+
const groupName = currentGroup.replace(':children', '');
|
|
110
|
+
if (!result.all.children[groupName].children) {
|
|
111
|
+
result.all.children[groupName].children = {};
|
|
112
|
+
}
|
|
113
|
+
result.all.children[groupName].children[trimmed] = {};
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Host entries
|
|
117
|
+
const [hostname, ...varParts] = trimmed.split(/\s+/);
|
|
118
|
+
const hostVars = {};
|
|
119
|
+
// Parse host variables
|
|
120
|
+
for (const varPart of varParts) {
|
|
121
|
+
const [key, ...valueParts] = varPart.split('=');
|
|
122
|
+
if (key && valueParts.length > 0) {
|
|
123
|
+
hostVars[key] = valueParts.join('=');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (currentGroup === 'all') {
|
|
127
|
+
result.all.hosts[hostname] = hostVars;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
result.all.children[currentGroup].hosts[hostname] = hostVars;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
// Helper function to format inventory parsing results
|
|
137
|
+
function formatInventoryResult(parsed) {
|
|
138
|
+
let result = '# Parsed Ansible Inventory\n\n';
|
|
139
|
+
try {
|
|
140
|
+
// Count totals
|
|
141
|
+
let totalHosts = 0;
|
|
142
|
+
let totalGroups = 0;
|
|
143
|
+
function countHosts(obj) {
|
|
144
|
+
let count = 0;
|
|
145
|
+
if (obj.hosts) {
|
|
146
|
+
count += Object.keys(obj.hosts).length;
|
|
147
|
+
}
|
|
148
|
+
if (obj.children) {
|
|
149
|
+
for (const child of Object.values(obj.children)) {
|
|
150
|
+
count += countHosts(child);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return count;
|
|
154
|
+
}
|
|
155
|
+
function countGroups(obj) {
|
|
156
|
+
let count = 0;
|
|
157
|
+
if (obj.children) {
|
|
158
|
+
count += Object.keys(obj.children).length;
|
|
159
|
+
for (const child of Object.values(obj.children)) {
|
|
160
|
+
count += countGroups(child);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return count;
|
|
164
|
+
}
|
|
165
|
+
totalHosts = countHosts(parsed.all || parsed);
|
|
166
|
+
totalGroups = countGroups(parsed.all || parsed);
|
|
167
|
+
result += `## Summary\n`;
|
|
168
|
+
result += `- Total Hosts: ${totalHosts}\n`;
|
|
169
|
+
result += `- Total Groups: ${totalGroups}\n\n`;
|
|
170
|
+
// List all groups and hosts
|
|
171
|
+
function formatGroup(groupName, group, indent = 0) {
|
|
172
|
+
const spaces = ' '.repeat(indent);
|
|
173
|
+
let output = `${spaces}## ${groupName}\n`;
|
|
174
|
+
if (group.hosts && Object.keys(group.hosts).length > 0) {
|
|
175
|
+
output += `${spaces}### Hosts:\n`;
|
|
176
|
+
for (const [hostname, vars] of Object.entries(group.hosts)) {
|
|
177
|
+
output += `${spaces}- ${hostname}`;
|
|
178
|
+
if (vars && typeof vars === 'object' && Object.keys(vars).length > 0) {
|
|
179
|
+
output += ` (vars: ${Object.keys(vars).join(', ')})`;
|
|
180
|
+
}
|
|
181
|
+
output += '\n';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (group.vars && Object.keys(group.vars).length > 0) {
|
|
185
|
+
output += `${spaces}### Variables:\n`;
|
|
186
|
+
for (const [key, value] of Object.entries(group.vars)) {
|
|
187
|
+
output += `${spaces}- ${key}: ${value}\n`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (group.children && Object.keys(group.children).length > 0) {
|
|
191
|
+
output += `${spaces}### Child Groups:\n`;
|
|
192
|
+
for (const [childName, child] of Object.entries(group.children)) {
|
|
193
|
+
output += formatGroup(childName, child, indent + 1);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return output + '\n';
|
|
197
|
+
}
|
|
198
|
+
if (parsed.all) {
|
|
199
|
+
result += formatGroup('all', parsed.all);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Handle direct group format
|
|
203
|
+
for (const [groupName, group] of Object.entries(parsed)) {
|
|
204
|
+
result += formatGroup(groupName, group);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
result += `Error formatting inventory: ${error.message}`;
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|