it-tools-mcp 3.0.24 → 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.
Files changed (127) hide show
  1. package/README.dockerhub.md +22 -16
  2. package/README.md +73 -32
  3. package/build/index.js +47 -15
  4. package/build/tools/ansible/ansible-inventory-generator/index.js +212 -0
  5. package/build/tools/ansible/ansible-playbook-validator/index.js +128 -0
  6. package/build/tools/ansible/ansible-reference/index.js +393 -0
  7. package/build/tools/ansible/ansible-vault-decrypt/index.js +137 -0
  8. package/build/tools/ansible/ansible-vault-encrypt/index.js +79 -0
  9. package/build/tools/color/color-hex-to-rgb/index.js +29 -0
  10. package/build/tools/{color.js → color/color-rgb-to-hex/index.js} +1 -27
  11. package/build/tools/crypto/basic-auth-generator/index.js +45 -0
  12. package/build/tools/crypto/bcrypt-hash/index.js +67 -0
  13. package/build/tools/crypto/bip39-generate/index.js +53 -0
  14. package/build/tools/crypto/hash-md5/index.js +19 -0
  15. package/build/tools/crypto/hash-sha1/index.js +19 -0
  16. package/build/tools/crypto/hash-sha256/index.js +19 -0
  17. package/build/tools/crypto/hash-sha512/index.js +19 -0
  18. package/build/tools/crypto/hmac-generator/index.js +37 -0
  19. package/build/tools/crypto/jwt-decode/index.js +41 -0
  20. package/build/tools/crypto/otp-code-generator/index.js +67 -0
  21. package/build/tools/crypto/password-generate/index.js +54 -0
  22. package/build/tools/crypto/token-generator/index.js +75 -0
  23. package/build/tools/dataFormat/html-to-markdown/index.js +34 -0
  24. package/build/tools/dataFormat/json-diff/index.js +94 -0
  25. package/build/tools/dataFormat/json-format/index.js +100 -0
  26. package/build/tools/dataFormat/json-minify/index.js +29 -0
  27. package/build/tools/dataFormat/json-to-csv/index.js +34 -0
  28. package/build/tools/dataFormat/json-to-toml/index.js +30 -0
  29. package/build/tools/dataFormat/markdown-to-html/index.js +32 -0
  30. package/build/tools/dataFormat/phone-format/index.js +35 -0
  31. package/build/tools/dataFormat/sql-format/index.js +37 -0
  32. package/build/tools/dataFormat/toml-to-json/index.js +29 -0
  33. package/build/tools/dataFormat/xml-format/index.js +44 -0
  34. package/build/tools/dataFormat/yaml-format/index.js +58 -0
  35. package/build/tools/{development.js → development/crontab-generate/index.js} +1 -129
  36. package/build/tools/development/html-prettifier/index.js +47 -0
  37. package/build/tools/development/javascript-prettifier/index.js +74 -0
  38. package/build/tools/development/list-converter/index.js +62 -0
  39. package/build/tools/development/markdown-toc-generator/index.js +53 -0
  40. package/build/tools/development/regex-tester/index.js +69 -0
  41. package/build/tools/docker/docker-compose-to-docker-run/index.js +138 -0
  42. package/build/tools/docker/docker-compose-validator/index.js +125 -0
  43. package/build/tools/docker/docker-reference/index.js +188 -0
  44. package/build/tools/docker/docker-run-to-docker-compose/index.js +117 -0
  45. package/build/tools/docker/traefik-compose-generator/index.js +98 -0
  46. package/build/tools/encoding/base64-decode/index.js +28 -0
  47. package/build/tools/encoding/base64-encode/index.js +16 -0
  48. package/build/tools/encoding/html-decode/index.js +21 -0
  49. package/build/tools/encoding/html-encode/index.js +21 -0
  50. package/build/tools/encoding/html-entities-extended/index.js +72 -0
  51. package/build/tools/encoding/text-to-binary/index.js +51 -0
  52. package/build/tools/encoding/url-decode/index.js +28 -0
  53. package/build/tools/encoding/url-encode/index.js +16 -0
  54. package/build/tools/forensic/file-type-identifier/index.js +90 -0
  55. package/build/tools/forensic/safelink-decoder/index.js +54 -0
  56. package/build/tools/forensic/url-fanger/index.js +52 -0
  57. package/build/tools/idGenerators/qr-generate/index.js +76 -0
  58. package/build/tools/idGenerators/svg-placeholder-generator/index.js +59 -0
  59. package/build/tools/idGenerators/ulid-generate/index.js +34 -0
  60. package/build/tools/idGenerators/uuid-generate/index.js +14 -0
  61. package/build/tools/math/math-evaluate/index.js +33 -0
  62. package/build/tools/math/number-base-converter/index.js +46 -0
  63. package/build/tools/math/percentage-calculator/index.js +50 -0
  64. package/build/tools/math/roman-numeral-converter/index.js +76 -0
  65. package/build/tools/math/temperature-converter/index.js +59 -0
  66. package/build/tools/math/unix-timestamp-converter/index.js +55 -0
  67. package/build/tools/network/cat/index.js +15 -0
  68. package/build/tools/network/cidr-to-ip-range/index.js +108 -0
  69. package/build/tools/network/curl/index.js +35 -0
  70. package/build/tools/network/dig/index.js +19 -0
  71. package/build/tools/network/grep/index.js +18 -0
  72. package/build/tools/network/head/index.js +17 -0
  73. package/build/tools/network/iban-validate/index.js +83 -0
  74. package/build/tools/network/ip-range-to-cidr/index.js +88 -0
  75. package/build/tools/network/ip-subnet-calculator/index.js +102 -0
  76. package/build/tools/network/ipv4-subnet-calc/index.js +112 -0
  77. package/build/tools/network/ipv6-subnet-calculator/index.js +104 -0
  78. package/build/tools/network/ipv6-ula-generator/index.js +65 -0
  79. package/build/tools/network/mac-address-generate/index.js +68 -0
  80. package/build/tools/network/nslookup/index.js +18 -0
  81. package/build/tools/network/ping/index.js +20 -0
  82. package/build/tools/network/ps/index.js +22 -0
  83. package/build/tools/network/random-port/index.js +53 -0
  84. package/build/tools/network/scp/index.js +134 -0
  85. package/build/tools/network/ssh/index.js +83 -0
  86. package/build/tools/network/tail/index.js +16 -0
  87. package/build/tools/network/telnet/index.js +45 -0
  88. package/build/tools/network/top/index.js +14 -0
  89. package/build/tools/network/url-parse/index.js +52 -0
  90. package/build/tools/physics/angle-converter/index.js +73 -0
  91. package/build/tools/physics/energy-converter/index.js +72 -0
  92. package/build/tools/physics/power-converter/index.js +71 -0
  93. package/build/tools/text/ascii-art-text/index.js +112 -0
  94. package/build/tools/text/distinct-words/index.js +30 -0
  95. package/build/tools/text/emoji-search/index.js +76 -0
  96. package/build/tools/text/lorem-ipsum-generator/index.js +87 -0
  97. package/build/tools/text/numeronym-generator/index.js +37 -0
  98. package/build/tools/text/slugify-string/index.js +44 -0
  99. package/build/tools/text/string-obfuscator/index.js +49 -0
  100. package/build/tools/text/text-camelcase/index.js +20 -0
  101. package/build/tools/text/text-capitalize/index.js +16 -0
  102. package/build/tools/text/text-diff/index.js +72 -0
  103. package/build/tools/text/text-kebabcase/index.js +20 -0
  104. package/build/tools/text/text-lowercase/index.js +15 -0
  105. package/build/tools/text/text-pascalcase/index.js +18 -0
  106. package/build/tools/text/text-snakecase/index.js +20 -0
  107. package/build/tools/text/text-stats/index.js +29 -0
  108. package/build/tools/text/text-to-nato-alphabet/index.js +57 -0
  109. package/build/tools/text/text-to-unicode/index.js +50 -0
  110. package/build/tools/text/text-to-unicode-names/index.js +34 -0
  111. package/build/tools/text/text-uppercase/index.js +15 -0
  112. package/build/tools/utility/css-prettifier/index.js +70 -0
  113. package/build/tools/utility/device-info/index.js +44 -0
  114. package/build/tools/utility/email-normalizer/index.js +73 -0
  115. package/build/tools/utility/http-status-codes/index.js +173 -0
  116. package/build/tools/utility/mime-types/index.js +121 -0
  117. package/build/tools/utility/port-numbers/index.js +106 -0
  118. package/build/tools/utility/rem-px-converter/index.js +63 -0
  119. package/package.json +3 -3
  120. package/build/tools/crypto.js +0 -445
  121. package/build/tools/dataFormat.js +0 -535
  122. package/build/tools/encoding.js +0 -240
  123. package/build/tools/idGenerators.js +0 -180
  124. package/build/tools/math.js +0 -310
  125. package/build/tools/network.js +0 -939
  126. package/build/tools/text.js +0 -678
  127. package/build/tools/utility.js +0 -407
@@ -11,7 +11,7 @@
11
11
  [![Docker Platform](https://img.shields.io/badge/platform-linux%2Famd64%20%7C%20linux%2Farm64-blue)](https://hub.docker.com/r/wrenchpilot/it-tools-mcp)
12
12
  [![GitHub Stars](https://img.shields.io/github/stars/wrenchpilot/it-tools-mcp?style=social)](https://github.com/wrenchpilot/it-tools-mcp/stargazers)
13
13
 
14
- A comprehensive Model Context Protocol (MCP) server that provides access to **88 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.
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.
15
15
 
16
16
  [![MCP Server Badge](https://glama.ai/mcp/servers/@wrenchpilot/it-tools-mcp/badge)](https://glama.ai/mcp/servers/@wrenchpilot/it-tools-mcp)
17
17
 
@@ -65,7 +65,7 @@ Add to your VS Code `settings.json`:
65
65
  }
66
66
  ```
67
67
 
68
- See the complete list of all 88 tools with detailed parameters on [GitHub](https://github.com/wrenchpilot/it-tools-mcp#available-tools)
68
+ See the complete list of all 112 tools with detailed parameters on [GitHub](https://github.com/wrenchpilot/it-tools-mcp#available-tools)
69
69
 
70
70
  ## 📸 Examples in Action
71
71
 
@@ -87,7 +87,7 @@ Built with **TypeScript**, **Zod** validation, and **MCP SDK** for robust, type-
87
87
 
88
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:
89
89
 
90
- - 🔧 **All 88 tools** designed and implemented with AI assistance
90
+ - 🔧 **All 112 tools** designed and implemented with AI assistance
91
91
  - 📦 **Complete Docker setup** with GitHub Actions CI/CD pipeline
92
92
  - 🔍 **Schema optimization** with systematic validation cleanup
93
93
  - 📚 **Comprehensive documentation** and tool catalogs
@@ -96,23 +96,29 @@ This project was developed using **VS Code**, **Copilot Chat Agent**, **Playwrig
96
96
 
97
97
  ```text
98
98
  src/
99
- ├── index.ts # Main MCP server
100
- └── tools/ # Tool modules by category
101
- ├── encoding.ts # Base64, URL, HTML encoding
102
- ├── crypto.ts # Hashing, JWT, passwords
103
- ├── dataFormat.ts # JSON, XML, YAML processing
104
- ├── text.ts # Text manipulation tools
105
- ├── network.ts # Network utilities
106
- ├── math.ts # Mathematical operations
107
- ├── idGenerators.ts # UUID, ULID, QR codes
108
- └── utility.ts # Color, MIME, HTTP tools
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
109
115
  ```
110
116
 
111
117
  ### Adding New Tools
112
118
 
113
- 1. Choose/create a tool module in `src/tools/`
114
- 2. Define tool with input schema using Zod
115
- 3. Register in `src/index.ts`
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
116
122
  4. Rebuild with `npm run build`
117
123
 
118
124
  ## 🤝 Contributing
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
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.
15
15
 
16
- A comprehensive Model Context Protocol (MCP) server that provides access to 87 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.
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.
17
17
 
18
18
  [![MCP Server Badge](https://glama.ai/mcp/servers/@wrenchpilot/it-tools-mcp/badge)](https://glama.ai/mcp/servers/@wrenchpilot/it-tools-mcp)
19
19
 
@@ -89,16 +89,22 @@ echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"base64-enc
89
89
 
90
90
  ## 🛠️ Tool Categories
91
91
 
92
- This MCP server provides **87 tools** across **8 categories**:
93
-
94
- - **🔧 Encoding & Decoding** (9 tools): Base64, URL, HTML entities, text-to-binary, Unicode
95
- - **📝 Data Format** (11 tools): JSON, XML, YAML, SQL, TOML, Markdown HTML conversion
96
- - **🔐 Security & Crypto** (12 tools): Hashing (MD5, SHA1-512), HMAC, JWT, bcrypt, passwords, tokens
97
- - **✨ Text Processing** (16 tools): Case conversion, stats, diff, ASCII art, NATO alphabet, slugify
98
- - **🌐 Network & System** (20 tools): IPv4/IPv6 subnets, URL parsing, MAC addresses, phone formatting, ps, top, cat, head, tail, grep, ping, nslookup, telnet, dig, ssh, random-port, mac-address-generate, ip/ipv6 calculators, curl
99
- - **🔢 Math & Calculations** (6 tools): Expression evaluation, base conversion, temperature, percentages
100
- - **🆔 ID & Code Generators** (4 tools: UUID, ULID, QR codes, SVG placeholders
101
- - **🛠️ Utility Tools** (9 tools): Color, MIME, HTTP, device info, email normalization, etc.
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): HexRGB 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
102
108
 
103
109
  ## 📸 Screenshot Examples
104
110
 
@@ -116,6 +122,15 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
116
122
 
117
123
  | Tool | Description | Parameters |
118
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` |
119
134
  | **Data Format** | | |
120
135
  | `html-to-markdown` | Convert HTML to Markdown | `html: string` |
121
136
  | `json-diff` | Compare JSON objects | `json1: string`, `json2: string` |
@@ -131,8 +146,17 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
131
146
  | `yaml-format` | Format YAML | `yaml: string` |
132
147
  | **Development Tools** | | |
133
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` |
134
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` |
135
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` |
136
160
  | **Encoding & Decoding** | | |
137
161
  | `base64-decode` | Decode Base64 text | `text: string` |
138
162
  | `base64-encode` | Encode text to Base64 | `text: string` |
@@ -143,6 +167,10 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
143
167
  | `text-to-unicode` | Convert text to Unicode and vice versa | `input: string`, `operation: 'encode' \| 'decode'` |
144
168
  | `url-decode` | URL decode text | `text: string` |
145
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'` |
146
174
  | **ID & Code Generators** | | |
147
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. |
148
176
  | `svg-placeholder-generator` | Generate SVG placeholder | `width?: number`, `height?: number`, `text?: string`, `backgroundColor?: string`, `textColor?: string` |
@@ -157,25 +185,29 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
157
185
  | `unix-timestamp-converter` | Convert timestamps | `input: string` |
158
186
  | **Network & System** | | |
159
187
  | `cat` | Display file content | `file: string` |
160
- | `curl` | HTTP client (GET, POST, etc.) | `url: string`, `method?: string`, `headers?: Record<string, string>`, `body?: string` |
188
+ | `curl` | HTTP client (GET, POST, etc.) | `url: string`, `method?: string`, `headers?: Record<string, string>`, `body?: string` |
161
189
  | `dig` | DNS query (custom type) | `target: string`, `type?: string` |
162
190
  | `grep` | Search for pattern in file | `file: string`, `pattern: string` |
163
191
  | `head` | Show first N lines of file | `file: string`, `lines?: number` |
164
- | `iban-validate` | Validate IBAN | `iban: string` |
192
+ | `iban-validate` | Validate IBAN | `iban: string` |
165
193
  | `ip-subnet-calculator` | Calculate IPv4 subnet | `ip: string`, `cidr: number` |
166
194
  | `ipv4-subnet-calc` | Enhanced IPv4 subnet calc | `cidr: string` |
167
195
  | `ipv6-ula-generator` | Generate IPv6 ULA | `globalId?: string` |
168
- | `mac-address-generate` | Generate MAC address | `prefix?: string`, `separator?: ':' \| '-'` |
196
+ | `mac-address-generate` | Generate MAC address | `prefix?: string`, `separator?: ':' \| '-'` |
169
197
  | `nslookup` | DNS lookup (A/AAAA/CNAME) | `target: string` |
170
198
  | `ping` | Ping a host | `target: string`, `count?: number` |
171
199
  | `ps` | List running processes | None |
172
200
  | `random-port` | Generate random ports | `count?: number`, `min?: number`, `max?: number`, `exclude?: number[]` |
173
- | `scp` | Copy files to/from remote host (SFTP) | `target: string`, `user: string`, `direction: 'upload'\|'download'`, `localPath: string`, `remotePath: string`, `privateKey?: string` |
201
+ | `scp` | Copy files to/from remote host (SFTP) | `target: string`, `user: string`, `direction: 'upload'\|'download'`, `localPath: string`, `remotePath: string`, `privateKey?: string` |
174
202
  | `ssh` | SSH command execution | `target: string`, `user: string`, `command: string` |
175
203
  | `tail` | Show last N lines of file | `file: string`, `lines?: number` |
176
204
  | `telnet` | Test TCP connectivity | `target: string`, `port: number` |
177
205
  | `top` | Show top processes (by CPU) | None |
178
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'` |
179
211
  | **Security & Crypto** | | |
180
212
  | `basic-auth-generator` | Generate Basic Auth header | `username: string`, `password: string` |
181
213
  | `bcrypt-hash` | Generate/verify bcrypt hash | `password: string`, `rounds?: number`, `hash?: string` |
@@ -191,6 +223,7 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
191
223
  | `token-generator` | Generate secure token | `length?: number`, `charset?: 'alphanumeric' \| 'hex' \| 'base64' \| 'custom'`, `customChars?: string` |
192
224
  | **Text Processing** | | |
193
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` |
194
227
  | `emoji-search` | Search emojis | `query: string` |
195
228
  | `lorem-ipsum-generator` | Generate Lorem Ipsum | `type?: 'words' \| 'sentences' \| 'paragraphs'`, `count?: number` |
196
229
  | `numeronym-generator` | Generate numeronyms | `text: string` |
@@ -205,14 +238,16 @@ Examples of using the IT Tools MCP server with VS Code Copilot Chat for secure p
205
238
  | `text-snakecase` | Convert to snake_case | `text: string` |
206
239
  | `text-stats` | Get text statistics | `text: string` |
207
240
  | `text-to-nato-alphabet` | Convert to NATO alphabet | `text: string` |
241
+ | `text-to-unicode-names` | Convert text to Unicode character names | `text: string` |
208
242
  | `text-uppercase` | Convert to uppercase | `text: string` |
209
243
  | **Utility Tools** | | |
210
- | `color-hex-to-rgb` | Convert HEX to RGB | `hex: string` |
211
- | `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` |
212
245
  | `device-info` | Get system information | None |
213
246
  | `email-normalizer` | Normalize email addresses | `email: string` |
214
247
  | `http-status-codes` | HTTP status reference | `code?: number` |
215
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` |
216
251
 
217
252
  ## 🏗️ Architecture & Development
218
253
 
@@ -223,14 +258,14 @@ Built with **TypeScript**, **Zod** validation, and **MCP SDK** for robust, type-
223
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:
224
259
 
225
260
  - **Intelligent Code Generation**: Claude Sonnet analyzed requirements and generated comprehensive tool implementations
226
- - **Schema Validation**: Automatically identified and resolved JSON schema validation issues across 75 tools
261
+ - **Schema Validation**: Automatically identified and resolved JSON schema validation issues across 112 tools
227
262
  - **Docker Optimization**: Created production-ready Docker workflows and multi-stage builds
228
263
  - **Documentation**: Generated comprehensive README with examples and tool reference tables
229
264
  - **Testing**: Implemented robust error handling and validation throughout the codebase
230
265
 
231
266
  **Key AI Contributions:**
232
267
 
233
- - 🔧 **Tool Implementation**: All 75 tools designed and implemented with AI assistance
268
+ - 🔧 **Tool Implementation**: All 112 tools designed and implemented with AI assistance
234
269
  - 📦 **Docker Setup**: Complete containerization with GitHub Actions CI/CD pipeline
235
270
  - 🔍 **Schema Cleanup**: Systematic removal of unsupported Zod keywords from all tool definitions
236
271
  - 📚 **Documentation**: Comprehensive README with usage examples and tool catalogs
@@ -240,25 +275,31 @@ This showcases how AI can accelerate development while maintaining code quality,
240
275
 
241
276
  ### Adding New Tools
242
277
 
243
- 1. Choose/create a tool module in `src/tools/`
244
- 2. Define tool with input schema using Zod
245
- 3. Register in `src/index.ts`
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
246
281
  4. Rebuild with `npm run build`
247
282
 
248
283
  ### Project Structure
249
284
 
250
285
  ```text
251
286
  src/
252
- ├── index.ts # Main MCP server
253
- └── tools/ # Tool modules by category
254
- ├── encoding.ts # Base64, URL, HTML encoding
255
- ├── crypto.ts # Hashing, JWT, passwords
256
- ├── dataFormat.ts # JSON, XML, YAML processing
257
- ├── text.ts # Text manipulation tools
258
- ├── network.ts # Network utilities
259
- ├── math.ts # Mathematical operations
260
- ├── idGenerators.ts # UUID, ULID, QR codes
261
- └── utility.ts # Color, MIME, HTTP tools
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
262
303
  ```
263
304
 
264
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
- const modules = [
227
- { name: 'encoding', fn: () => import('./tools/encoding.js').then(m => m.registerEncodingTools(server)) },
228
- { name: 'crypto', fn: () => import('./tools/crypto.js').then(m => m.registerCryptoTools(server)) },
229
- { name: 'dataFormat', fn: () => import('./tools/dataFormat.js').then(m => m.registerDataFormatTools(server)) },
230
- { name: 'text', fn: () => import('./tools/text.js').then(m => m.registerTextTools(server)) },
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 mod of modules) {
239
- console.time(`register:${mod.name}`);
240
- await mod.fn();
241
- console.timeEnd(`register:${mod.name}`);
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
+ }