├── .env.example ├── .gitignore ├── LICENSE.MD ├── README.md ├── cli.cjs ├── package-lock.json ├── package.json ├── server.ts ├── tsconfig.json └── type.ts /.env.example: -------------------------------------------------------------------------------- 1 | BASE_URL = "https://api-partner.krl.co.id/krl-webs/v1" 2 | TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIzIiwianRpIjoiMDYzNWIyOGMzYzg3YTY3ZTRjYWE4YTI0MjYxZGYwYzIxNjYzODA4NWM2NWU4ZjhiYzQ4OGNlM2JiZThmYWNmODU4YzY0YmI0MjgyM2EwOTUiLCJpYXQiOjE3MjI2MTc1MTQsIm5iZiI6MTcyMjYxNzUxNCwiZXhwIjoxNzU0MTUzNTE0LCJzdWIiOiI1Iiwic2NvcGVzIjpbXX0.Jz_sedcMtaZJ4dj0eWVc4_pr_wUQ3s1-UgpopFGhEmJt_iGzj6BdnOEEhcDDdIz-gydQL5ek0S_36v5h6P_X3OQyII3JmHp1SEDJMwrcy4FCY63-jGnhPBb4sprqUFruDRFSEIs1cNQ-3rv3qRDzJtGYc_bAkl2MfgZj85bvt2DDwBWPraZuCCkwz2fJvox-6qz6P7iK9YdQq8AjJfuNdl7t_1hMHixmtDG0KooVnfBV7PoChxvcWvs8FOmtYRdqD7RSEIoOXym2kcwqK-rmbWf9VuPQCN5gjLPimL4t2TbifBg5RWNIAAuHLcYzea48i3okbhkqGGlYTk3iVMU6Hf_Jruns1WJr3A961bd4rny62lNXyGPgNLRJJKedCs5lmtUTr4gZRec4Pz_MqDzlEYC3QzRAOZv0Ergp8-W1Vrv5gYyYNr-YQNdZ01mc7JH72N2dpU9G00K5kYxlcXDNVh8520-R-MrxYbmiFGVlNF2BzEH8qq6Ko9m0jT0NiKEOjetwegrbNdNq_oN4KmHvw2sHkGWY06rUeciYJMhBF1JZuRjj3JTwBUBVXcYZMFtwUAoikVByzKuaZZeTo1AtCiSjejSHNdpLxyKk_SFUzog5MOkUN1ktAhFnBFoz6SlWAJBJIS-lHYsdFLSug2YNiaNllkOUsDbYkiDtmPc9XWc" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /dist 3 | 4 | .env 5 | 6 | -------------------------------------------------------------------------------- /LICENSE.MD: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Aditya Putra Pratama 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MCP Server Tiket KRL KAI 2 | 3 | Proyek ini adalah implementasi server MCP (Model Context Protocol) untuk sistem pembelian tiket kereta api yang dapat digunakan oleh LLM (Large Language Model) melalui protokol MCP. 4 | 5 | ## ✨ Fitur 6 | 7 | - ✅ Cek List Stasiun 8 | - ✅ Cek Jadwal Kereta 9 | - ✅ Cek Rute Kereta (Lane) 10 | - ✅ Pembelian Tiket (Mock) 11 | - ✅ Generate QR Code Tiket 12 | - ✅ Cek Status Tiket (Mock) 13 | 14 | --- 15 | 16 | ## 🚀 Instalasi 17 | 18 | 1. Clone repositori ini: 19 | ```bash 20 | git clone https://github.com/namakamu/mcp-tiket-kereta.git 21 | cd mcp-tiket-kereta 22 | 23 | 24 | 2. Setup MCP Client 25 | 26 | ``` 27 | { 28 | "mcpServers": { 29 | "mcp-kai": { 30 | "command": "npx", 31 | "args": [ 32 | "-y", 33 | "mcp-kai@latest" 34 | ] 35 | } 36 | } 37 | } 38 | ``` 39 | -------------------------------------------------------------------------------- /cli.cjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import('./dist/server.js'); 3 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-kai", 3 | "version": "1.0.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "mcp-kai", 9 | "version": "1.0.3", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.11.2", 13 | "@types/express": "^5.0.1", 14 | "axios": "^1.8.4", 15 | "express": "^5.1.0", 16 | "qrcode": "^1.5.4", 17 | "uuid": "^11.1.0", 18 | "zod": "^3.24.2" 19 | }, 20 | "bin": { 21 | "mcp-kai": "dist/cli.js" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "^22.14.1", 25 | "@types/qrcode": "^1.5.5", 26 | "ts-node": "^10.9.2", 27 | "tsx": "^4.19.3", 28 | "typescript": "^5.8.3" 29 | } 30 | }, 31 | "node_modules/@cspotcode/source-map-support": { 32 | "version": "0.8.1", 33 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 34 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 35 | "dev": true, 36 | "dependencies": { 37 | "@jridgewell/trace-mapping": "0.3.9" 38 | }, 39 | "engines": { 40 | "node": ">=12" 41 | } 42 | }, 43 | "node_modules/@esbuild/aix-ppc64": { 44 | "version": "0.25.4", 45 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 46 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 47 | "cpu": [ 48 | "ppc64" 49 | ], 50 | "dev": true, 51 | "optional": true, 52 | "os": [ 53 | "aix" 54 | ], 55 | "engines": { 56 | "node": ">=18" 57 | } 58 | }, 59 | "node_modules/@esbuild/android-arm": { 60 | "version": "0.25.4", 61 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 62 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 63 | "cpu": [ 64 | "arm" 65 | ], 66 | "dev": true, 67 | "optional": true, 68 | "os": [ 69 | "android" 70 | ], 71 | "engines": { 72 | "node": ">=18" 73 | } 74 | }, 75 | "node_modules/@esbuild/android-arm64": { 76 | "version": "0.25.4", 77 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 78 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 79 | "cpu": [ 80 | "arm64" 81 | ], 82 | "dev": true, 83 | "optional": true, 84 | "os": [ 85 | "android" 86 | ], 87 | "engines": { 88 | "node": ">=18" 89 | } 90 | }, 91 | "node_modules/@esbuild/android-x64": { 92 | "version": "0.25.4", 93 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 94 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 95 | "cpu": [ 96 | "x64" 97 | ], 98 | "dev": true, 99 | "optional": true, 100 | "os": [ 101 | "android" 102 | ], 103 | "engines": { 104 | "node": ">=18" 105 | } 106 | }, 107 | "node_modules/@esbuild/darwin-arm64": { 108 | "version": "0.25.4", 109 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 110 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 111 | "cpu": [ 112 | "arm64" 113 | ], 114 | "dev": true, 115 | "optional": true, 116 | "os": [ 117 | "darwin" 118 | ], 119 | "engines": { 120 | "node": ">=18" 121 | } 122 | }, 123 | "node_modules/@esbuild/darwin-x64": { 124 | "version": "0.25.4", 125 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 126 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 127 | "cpu": [ 128 | "x64" 129 | ], 130 | "dev": true, 131 | "optional": true, 132 | "os": [ 133 | "darwin" 134 | ], 135 | "engines": { 136 | "node": ">=18" 137 | } 138 | }, 139 | "node_modules/@esbuild/freebsd-arm64": { 140 | "version": "0.25.4", 141 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 142 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 143 | "cpu": [ 144 | "arm64" 145 | ], 146 | "dev": true, 147 | "optional": true, 148 | "os": [ 149 | "freebsd" 150 | ], 151 | "engines": { 152 | "node": ">=18" 153 | } 154 | }, 155 | "node_modules/@esbuild/freebsd-x64": { 156 | "version": "0.25.4", 157 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 158 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 159 | "cpu": [ 160 | "x64" 161 | ], 162 | "dev": true, 163 | "optional": true, 164 | "os": [ 165 | "freebsd" 166 | ], 167 | "engines": { 168 | "node": ">=18" 169 | } 170 | }, 171 | "node_modules/@esbuild/linux-arm": { 172 | "version": "0.25.4", 173 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 174 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 175 | "cpu": [ 176 | "arm" 177 | ], 178 | "dev": true, 179 | "optional": true, 180 | "os": [ 181 | "linux" 182 | ], 183 | "engines": { 184 | "node": ">=18" 185 | } 186 | }, 187 | "node_modules/@esbuild/linux-arm64": { 188 | "version": "0.25.4", 189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 190 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 191 | "cpu": [ 192 | "arm64" 193 | ], 194 | "dev": true, 195 | "optional": true, 196 | "os": [ 197 | "linux" 198 | ], 199 | "engines": { 200 | "node": ">=18" 201 | } 202 | }, 203 | "node_modules/@esbuild/linux-ia32": { 204 | "version": "0.25.4", 205 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 206 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 207 | "cpu": [ 208 | "ia32" 209 | ], 210 | "dev": true, 211 | "optional": true, 212 | "os": [ 213 | "linux" 214 | ], 215 | "engines": { 216 | "node": ">=18" 217 | } 218 | }, 219 | "node_modules/@esbuild/linux-loong64": { 220 | "version": "0.25.4", 221 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 222 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 223 | "cpu": [ 224 | "loong64" 225 | ], 226 | "dev": true, 227 | "optional": true, 228 | "os": [ 229 | "linux" 230 | ], 231 | "engines": { 232 | "node": ">=18" 233 | } 234 | }, 235 | "node_modules/@esbuild/linux-mips64el": { 236 | "version": "0.25.4", 237 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 238 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 239 | "cpu": [ 240 | "mips64el" 241 | ], 242 | "dev": true, 243 | "optional": true, 244 | "os": [ 245 | "linux" 246 | ], 247 | "engines": { 248 | "node": ">=18" 249 | } 250 | }, 251 | "node_modules/@esbuild/linux-ppc64": { 252 | "version": "0.25.4", 253 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 254 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 255 | "cpu": [ 256 | "ppc64" 257 | ], 258 | "dev": true, 259 | "optional": true, 260 | "os": [ 261 | "linux" 262 | ], 263 | "engines": { 264 | "node": ">=18" 265 | } 266 | }, 267 | "node_modules/@esbuild/linux-riscv64": { 268 | "version": "0.25.4", 269 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 270 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 271 | "cpu": [ 272 | "riscv64" 273 | ], 274 | "dev": true, 275 | "optional": true, 276 | "os": [ 277 | "linux" 278 | ], 279 | "engines": { 280 | "node": ">=18" 281 | } 282 | }, 283 | "node_modules/@esbuild/linux-s390x": { 284 | "version": "0.25.4", 285 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 286 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 287 | "cpu": [ 288 | "s390x" 289 | ], 290 | "dev": true, 291 | "optional": true, 292 | "os": [ 293 | "linux" 294 | ], 295 | "engines": { 296 | "node": ">=18" 297 | } 298 | }, 299 | "node_modules/@esbuild/linux-x64": { 300 | "version": "0.25.4", 301 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 302 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 303 | "cpu": [ 304 | "x64" 305 | ], 306 | "dev": true, 307 | "optional": true, 308 | "os": [ 309 | "linux" 310 | ], 311 | "engines": { 312 | "node": ">=18" 313 | } 314 | }, 315 | "node_modules/@esbuild/netbsd-arm64": { 316 | "version": "0.25.4", 317 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 318 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 319 | "cpu": [ 320 | "arm64" 321 | ], 322 | "dev": true, 323 | "optional": true, 324 | "os": [ 325 | "netbsd" 326 | ], 327 | "engines": { 328 | "node": ">=18" 329 | } 330 | }, 331 | "node_modules/@esbuild/netbsd-x64": { 332 | "version": "0.25.4", 333 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 334 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 335 | "cpu": [ 336 | "x64" 337 | ], 338 | "dev": true, 339 | "optional": true, 340 | "os": [ 341 | "netbsd" 342 | ], 343 | "engines": { 344 | "node": ">=18" 345 | } 346 | }, 347 | "node_modules/@esbuild/openbsd-arm64": { 348 | "version": "0.25.4", 349 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 350 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 351 | "cpu": [ 352 | "arm64" 353 | ], 354 | "dev": true, 355 | "optional": true, 356 | "os": [ 357 | "openbsd" 358 | ], 359 | "engines": { 360 | "node": ">=18" 361 | } 362 | }, 363 | "node_modules/@esbuild/openbsd-x64": { 364 | "version": "0.25.4", 365 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 366 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 367 | "cpu": [ 368 | "x64" 369 | ], 370 | "dev": true, 371 | "optional": true, 372 | "os": [ 373 | "openbsd" 374 | ], 375 | "engines": { 376 | "node": ">=18" 377 | } 378 | }, 379 | "node_modules/@esbuild/sunos-x64": { 380 | "version": "0.25.4", 381 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 382 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 383 | "cpu": [ 384 | "x64" 385 | ], 386 | "dev": true, 387 | "optional": true, 388 | "os": [ 389 | "sunos" 390 | ], 391 | "engines": { 392 | "node": ">=18" 393 | } 394 | }, 395 | "node_modules/@esbuild/win32-arm64": { 396 | "version": "0.25.4", 397 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 398 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 399 | "cpu": [ 400 | "arm64" 401 | ], 402 | "dev": true, 403 | "optional": true, 404 | "os": [ 405 | "win32" 406 | ], 407 | "engines": { 408 | "node": ">=18" 409 | } 410 | }, 411 | "node_modules/@esbuild/win32-ia32": { 412 | "version": "0.25.4", 413 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 414 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 415 | "cpu": [ 416 | "ia32" 417 | ], 418 | "dev": true, 419 | "optional": true, 420 | "os": [ 421 | "win32" 422 | ], 423 | "engines": { 424 | "node": ">=18" 425 | } 426 | }, 427 | "node_modules/@esbuild/win32-x64": { 428 | "version": "0.25.4", 429 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 430 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 431 | "cpu": [ 432 | "x64" 433 | ], 434 | "dev": true, 435 | "optional": true, 436 | "os": [ 437 | "win32" 438 | ], 439 | "engines": { 440 | "node": ">=18" 441 | } 442 | }, 443 | "node_modules/@jridgewell/resolve-uri": { 444 | "version": "3.1.2", 445 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 446 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 447 | "dev": true, 448 | "engines": { 449 | "node": ">=6.0.0" 450 | } 451 | }, 452 | "node_modules/@jridgewell/sourcemap-codec": { 453 | "version": "1.5.0", 454 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 455 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 456 | "dev": true 457 | }, 458 | "node_modules/@jridgewell/trace-mapping": { 459 | "version": "0.3.9", 460 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 461 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 462 | "dev": true, 463 | "dependencies": { 464 | "@jridgewell/resolve-uri": "^3.0.3", 465 | "@jridgewell/sourcemap-codec": "^1.4.10" 466 | } 467 | }, 468 | "node_modules/@modelcontextprotocol/sdk": { 469 | "version": "1.11.2", 470 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.2.tgz", 471 | "integrity": "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==", 472 | "dependencies": { 473 | "content-type": "^1.0.5", 474 | "cors": "^2.8.5", 475 | "cross-spawn": "^7.0.3", 476 | "eventsource": "^3.0.2", 477 | "express": "^5.0.1", 478 | "express-rate-limit": "^7.5.0", 479 | "pkce-challenge": "^5.0.0", 480 | "raw-body": "^3.0.0", 481 | "zod": "^3.23.8", 482 | "zod-to-json-schema": "^3.24.1" 483 | }, 484 | "engines": { 485 | "node": ">=18" 486 | } 487 | }, 488 | "node_modules/@tsconfig/node10": { 489 | "version": "1.0.11", 490 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 491 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 492 | "dev": true 493 | }, 494 | "node_modules/@tsconfig/node12": { 495 | "version": "1.0.11", 496 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 497 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 498 | "dev": true 499 | }, 500 | "node_modules/@tsconfig/node14": { 501 | "version": "1.0.3", 502 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 503 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 504 | "dev": true 505 | }, 506 | "node_modules/@tsconfig/node16": { 507 | "version": "1.0.4", 508 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 509 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 510 | "dev": true 511 | }, 512 | "node_modules/@types/body-parser": { 513 | "version": "1.19.5", 514 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", 515 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", 516 | "dependencies": { 517 | "@types/connect": "*", 518 | "@types/node": "*" 519 | } 520 | }, 521 | "node_modules/@types/connect": { 522 | "version": "3.4.38", 523 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 524 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 525 | "dependencies": { 526 | "@types/node": "*" 527 | } 528 | }, 529 | "node_modules/@types/express": { 530 | "version": "5.0.1", 531 | "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz", 532 | "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==", 533 | "dependencies": { 534 | "@types/body-parser": "*", 535 | "@types/express-serve-static-core": "^5.0.0", 536 | "@types/serve-static": "*" 537 | } 538 | }, 539 | "node_modules/@types/express-serve-static-core": { 540 | "version": "5.0.6", 541 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", 542 | "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", 543 | "dependencies": { 544 | "@types/node": "*", 545 | "@types/qs": "*", 546 | "@types/range-parser": "*", 547 | "@types/send": "*" 548 | } 549 | }, 550 | "node_modules/@types/http-errors": { 551 | "version": "2.0.4", 552 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", 553 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" 554 | }, 555 | "node_modules/@types/mime": { 556 | "version": "1.3.5", 557 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", 558 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" 559 | }, 560 | "node_modules/@types/node": { 561 | "version": "22.15.17", 562 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", 563 | "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", 564 | "dependencies": { 565 | "undici-types": "~6.21.0" 566 | } 567 | }, 568 | "node_modules/@types/qrcode": { 569 | "version": "1.5.5", 570 | "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.5.tgz", 571 | "integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==", 572 | "dev": true, 573 | "dependencies": { 574 | "@types/node": "*" 575 | } 576 | }, 577 | "node_modules/@types/qs": { 578 | "version": "6.9.18", 579 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", 580 | "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==" 581 | }, 582 | "node_modules/@types/range-parser": { 583 | "version": "1.2.7", 584 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", 585 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" 586 | }, 587 | "node_modules/@types/send": { 588 | "version": "0.17.4", 589 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", 590 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", 591 | "dependencies": { 592 | "@types/mime": "^1", 593 | "@types/node": "*" 594 | } 595 | }, 596 | "node_modules/@types/serve-static": { 597 | "version": "1.15.7", 598 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", 599 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", 600 | "dependencies": { 601 | "@types/http-errors": "*", 602 | "@types/node": "*", 603 | "@types/send": "*" 604 | } 605 | }, 606 | "node_modules/accepts": { 607 | "version": "2.0.0", 608 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 609 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 610 | "dependencies": { 611 | "mime-types": "^3.0.0", 612 | "negotiator": "^1.0.0" 613 | }, 614 | "engines": { 615 | "node": ">= 0.6" 616 | } 617 | }, 618 | "node_modules/acorn": { 619 | "version": "8.14.1", 620 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 621 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 622 | "dev": true, 623 | "bin": { 624 | "acorn": "bin/acorn" 625 | }, 626 | "engines": { 627 | "node": ">=0.4.0" 628 | } 629 | }, 630 | "node_modules/acorn-walk": { 631 | "version": "8.3.4", 632 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 633 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 634 | "dev": true, 635 | "dependencies": { 636 | "acorn": "^8.11.0" 637 | }, 638 | "engines": { 639 | "node": ">=0.4.0" 640 | } 641 | }, 642 | "node_modules/ansi-regex": { 643 | "version": "5.0.1", 644 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 645 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 646 | "engines": { 647 | "node": ">=8" 648 | } 649 | }, 650 | "node_modules/ansi-styles": { 651 | "version": "4.3.0", 652 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 653 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 654 | "dependencies": { 655 | "color-convert": "^2.0.1" 656 | }, 657 | "engines": { 658 | "node": ">=8" 659 | }, 660 | "funding": { 661 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 662 | } 663 | }, 664 | "node_modules/arg": { 665 | "version": "4.1.3", 666 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 667 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 668 | "dev": true 669 | }, 670 | "node_modules/asynckit": { 671 | "version": "0.4.0", 672 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 673 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 674 | }, 675 | "node_modules/axios": { 676 | "version": "1.9.0", 677 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", 678 | "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", 679 | "dependencies": { 680 | "follow-redirects": "^1.15.6", 681 | "form-data": "^4.0.0", 682 | "proxy-from-env": "^1.1.0" 683 | } 684 | }, 685 | "node_modules/body-parser": { 686 | "version": "2.2.0", 687 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", 688 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 689 | "dependencies": { 690 | "bytes": "^3.1.2", 691 | "content-type": "^1.0.5", 692 | "debug": "^4.4.0", 693 | "http-errors": "^2.0.0", 694 | "iconv-lite": "^0.6.3", 695 | "on-finished": "^2.4.1", 696 | "qs": "^6.14.0", 697 | "raw-body": "^3.0.0", 698 | "type-is": "^2.0.0" 699 | }, 700 | "engines": { 701 | "node": ">=18" 702 | } 703 | }, 704 | "node_modules/bytes": { 705 | "version": "3.1.2", 706 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 707 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 708 | "engines": { 709 | "node": ">= 0.8" 710 | } 711 | }, 712 | "node_modules/call-bind-apply-helpers": { 713 | "version": "1.0.2", 714 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 715 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 716 | "dependencies": { 717 | "es-errors": "^1.3.0", 718 | "function-bind": "^1.1.2" 719 | }, 720 | "engines": { 721 | "node": ">= 0.4" 722 | } 723 | }, 724 | "node_modules/call-bound": { 725 | "version": "1.0.4", 726 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 727 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 728 | "dependencies": { 729 | "call-bind-apply-helpers": "^1.0.2", 730 | "get-intrinsic": "^1.3.0" 731 | }, 732 | "engines": { 733 | "node": ">= 0.4" 734 | }, 735 | "funding": { 736 | "url": "https://github.com/sponsors/ljharb" 737 | } 738 | }, 739 | "node_modules/camelcase": { 740 | "version": "5.3.1", 741 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 742 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 743 | "engines": { 744 | "node": ">=6" 745 | } 746 | }, 747 | "node_modules/cliui": { 748 | "version": "6.0.0", 749 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 750 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 751 | "dependencies": { 752 | "string-width": "^4.2.0", 753 | "strip-ansi": "^6.0.0", 754 | "wrap-ansi": "^6.2.0" 755 | } 756 | }, 757 | "node_modules/color-convert": { 758 | "version": "2.0.1", 759 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 760 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 761 | "dependencies": { 762 | "color-name": "~1.1.4" 763 | }, 764 | "engines": { 765 | "node": ">=7.0.0" 766 | } 767 | }, 768 | "node_modules/color-name": { 769 | "version": "1.1.4", 770 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 771 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 772 | }, 773 | "node_modules/combined-stream": { 774 | "version": "1.0.8", 775 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 776 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 777 | "dependencies": { 778 | "delayed-stream": "~1.0.0" 779 | }, 780 | "engines": { 781 | "node": ">= 0.8" 782 | } 783 | }, 784 | "node_modules/content-disposition": { 785 | "version": "1.0.0", 786 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 787 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 788 | "dependencies": { 789 | "safe-buffer": "5.2.1" 790 | }, 791 | "engines": { 792 | "node": ">= 0.6" 793 | } 794 | }, 795 | "node_modules/content-type": { 796 | "version": "1.0.5", 797 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 798 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 799 | "engines": { 800 | "node": ">= 0.6" 801 | } 802 | }, 803 | "node_modules/cookie": { 804 | "version": "0.7.2", 805 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 806 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 807 | "engines": { 808 | "node": ">= 0.6" 809 | } 810 | }, 811 | "node_modules/cookie-signature": { 812 | "version": "1.2.2", 813 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 814 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 815 | "engines": { 816 | "node": ">=6.6.0" 817 | } 818 | }, 819 | "node_modules/cors": { 820 | "version": "2.8.5", 821 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 822 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 823 | "dependencies": { 824 | "object-assign": "^4", 825 | "vary": "^1" 826 | }, 827 | "engines": { 828 | "node": ">= 0.10" 829 | } 830 | }, 831 | "node_modules/create-require": { 832 | "version": "1.1.1", 833 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 834 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 835 | "dev": true 836 | }, 837 | "node_modules/cross-spawn": { 838 | "version": "7.0.6", 839 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 840 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 841 | "dependencies": { 842 | "path-key": "^3.1.0", 843 | "shebang-command": "^2.0.0", 844 | "which": "^2.0.1" 845 | }, 846 | "engines": { 847 | "node": ">= 8" 848 | } 849 | }, 850 | "node_modules/debug": { 851 | "version": "4.4.0", 852 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 853 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 854 | "dependencies": { 855 | "ms": "^2.1.3" 856 | }, 857 | "engines": { 858 | "node": ">=6.0" 859 | }, 860 | "peerDependenciesMeta": { 861 | "supports-color": { 862 | "optional": true 863 | } 864 | } 865 | }, 866 | "node_modules/decamelize": { 867 | "version": "1.2.0", 868 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 869 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 870 | "engines": { 871 | "node": ">=0.10.0" 872 | } 873 | }, 874 | "node_modules/delayed-stream": { 875 | "version": "1.0.0", 876 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 877 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 878 | "engines": { 879 | "node": ">=0.4.0" 880 | } 881 | }, 882 | "node_modules/depd": { 883 | "version": "2.0.0", 884 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 885 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 886 | "engines": { 887 | "node": ">= 0.8" 888 | } 889 | }, 890 | "node_modules/diff": { 891 | "version": "4.0.2", 892 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 893 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 894 | "dev": true, 895 | "engines": { 896 | "node": ">=0.3.1" 897 | } 898 | }, 899 | "node_modules/dijkstrajs": { 900 | "version": "1.0.3", 901 | "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", 902 | "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" 903 | }, 904 | "node_modules/dunder-proto": { 905 | "version": "1.0.1", 906 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 907 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 908 | "dependencies": { 909 | "call-bind-apply-helpers": "^1.0.1", 910 | "es-errors": "^1.3.0", 911 | "gopd": "^1.2.0" 912 | }, 913 | "engines": { 914 | "node": ">= 0.4" 915 | } 916 | }, 917 | "node_modules/ee-first": { 918 | "version": "1.1.1", 919 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 920 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 921 | }, 922 | "node_modules/emoji-regex": { 923 | "version": "8.0.0", 924 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 925 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 926 | }, 927 | "node_modules/encodeurl": { 928 | "version": "2.0.0", 929 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 930 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 931 | "engines": { 932 | "node": ">= 0.8" 933 | } 934 | }, 935 | "node_modules/es-define-property": { 936 | "version": "1.0.1", 937 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 938 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 939 | "engines": { 940 | "node": ">= 0.4" 941 | } 942 | }, 943 | "node_modules/es-errors": { 944 | "version": "1.3.0", 945 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 946 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 947 | "engines": { 948 | "node": ">= 0.4" 949 | } 950 | }, 951 | "node_modules/es-object-atoms": { 952 | "version": "1.1.1", 953 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 954 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 955 | "dependencies": { 956 | "es-errors": "^1.3.0" 957 | }, 958 | "engines": { 959 | "node": ">= 0.4" 960 | } 961 | }, 962 | "node_modules/es-set-tostringtag": { 963 | "version": "2.1.0", 964 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 965 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 966 | "dependencies": { 967 | "es-errors": "^1.3.0", 968 | "get-intrinsic": "^1.2.6", 969 | "has-tostringtag": "^1.0.2", 970 | "hasown": "^2.0.2" 971 | }, 972 | "engines": { 973 | "node": ">= 0.4" 974 | } 975 | }, 976 | "node_modules/esbuild": { 977 | "version": "0.25.4", 978 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 979 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 980 | "dev": true, 981 | "hasInstallScript": true, 982 | "bin": { 983 | "esbuild": "bin/esbuild" 984 | }, 985 | "engines": { 986 | "node": ">=18" 987 | }, 988 | "optionalDependencies": { 989 | "@esbuild/aix-ppc64": "0.25.4", 990 | "@esbuild/android-arm": "0.25.4", 991 | "@esbuild/android-arm64": "0.25.4", 992 | "@esbuild/android-x64": "0.25.4", 993 | "@esbuild/darwin-arm64": "0.25.4", 994 | "@esbuild/darwin-x64": "0.25.4", 995 | "@esbuild/freebsd-arm64": "0.25.4", 996 | "@esbuild/freebsd-x64": "0.25.4", 997 | "@esbuild/linux-arm": "0.25.4", 998 | "@esbuild/linux-arm64": "0.25.4", 999 | "@esbuild/linux-ia32": "0.25.4", 1000 | "@esbuild/linux-loong64": "0.25.4", 1001 | "@esbuild/linux-mips64el": "0.25.4", 1002 | "@esbuild/linux-ppc64": "0.25.4", 1003 | "@esbuild/linux-riscv64": "0.25.4", 1004 | "@esbuild/linux-s390x": "0.25.4", 1005 | "@esbuild/linux-x64": "0.25.4", 1006 | "@esbuild/netbsd-arm64": "0.25.4", 1007 | "@esbuild/netbsd-x64": "0.25.4", 1008 | "@esbuild/openbsd-arm64": "0.25.4", 1009 | "@esbuild/openbsd-x64": "0.25.4", 1010 | "@esbuild/sunos-x64": "0.25.4", 1011 | "@esbuild/win32-arm64": "0.25.4", 1012 | "@esbuild/win32-ia32": "0.25.4", 1013 | "@esbuild/win32-x64": "0.25.4" 1014 | } 1015 | }, 1016 | "node_modules/escape-html": { 1017 | "version": "1.0.3", 1018 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1019 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1020 | }, 1021 | "node_modules/etag": { 1022 | "version": "1.8.1", 1023 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1024 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1025 | "engines": { 1026 | "node": ">= 0.6" 1027 | } 1028 | }, 1029 | "node_modules/eventsource": { 1030 | "version": "3.0.7", 1031 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", 1032 | "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", 1033 | "dependencies": { 1034 | "eventsource-parser": "^3.0.1" 1035 | }, 1036 | "engines": { 1037 | "node": ">=18.0.0" 1038 | } 1039 | }, 1040 | "node_modules/eventsource-parser": { 1041 | "version": "3.0.1", 1042 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", 1043 | "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", 1044 | "engines": { 1045 | "node": ">=18.0.0" 1046 | } 1047 | }, 1048 | "node_modules/express": { 1049 | "version": "5.1.0", 1050 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", 1051 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 1052 | "dependencies": { 1053 | "accepts": "^2.0.0", 1054 | "body-parser": "^2.2.0", 1055 | "content-disposition": "^1.0.0", 1056 | "content-type": "^1.0.5", 1057 | "cookie": "^0.7.1", 1058 | "cookie-signature": "^1.2.1", 1059 | "debug": "^4.4.0", 1060 | "encodeurl": "^2.0.0", 1061 | "escape-html": "^1.0.3", 1062 | "etag": "^1.8.1", 1063 | "finalhandler": "^2.1.0", 1064 | "fresh": "^2.0.0", 1065 | "http-errors": "^2.0.0", 1066 | "merge-descriptors": "^2.0.0", 1067 | "mime-types": "^3.0.0", 1068 | "on-finished": "^2.4.1", 1069 | "once": "^1.4.0", 1070 | "parseurl": "^1.3.3", 1071 | "proxy-addr": "^2.0.7", 1072 | "qs": "^6.14.0", 1073 | "range-parser": "^1.2.1", 1074 | "router": "^2.2.0", 1075 | "send": "^1.1.0", 1076 | "serve-static": "^2.2.0", 1077 | "statuses": "^2.0.1", 1078 | "type-is": "^2.0.1", 1079 | "vary": "^1.1.2" 1080 | }, 1081 | "engines": { 1082 | "node": ">= 18" 1083 | }, 1084 | "funding": { 1085 | "type": "opencollective", 1086 | "url": "https://opencollective.com/express" 1087 | } 1088 | }, 1089 | "node_modules/express-rate-limit": { 1090 | "version": "7.5.0", 1091 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 1092 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 1093 | "engines": { 1094 | "node": ">= 16" 1095 | }, 1096 | "funding": { 1097 | "url": "https://github.com/sponsors/express-rate-limit" 1098 | }, 1099 | "peerDependencies": { 1100 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 1101 | } 1102 | }, 1103 | "node_modules/finalhandler": { 1104 | "version": "2.1.0", 1105 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 1106 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 1107 | "dependencies": { 1108 | "debug": "^4.4.0", 1109 | "encodeurl": "^2.0.0", 1110 | "escape-html": "^1.0.3", 1111 | "on-finished": "^2.4.1", 1112 | "parseurl": "^1.3.3", 1113 | "statuses": "^2.0.1" 1114 | }, 1115 | "engines": { 1116 | "node": ">= 0.8" 1117 | } 1118 | }, 1119 | "node_modules/find-up": { 1120 | "version": "4.1.0", 1121 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1122 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1123 | "dependencies": { 1124 | "locate-path": "^5.0.0", 1125 | "path-exists": "^4.0.0" 1126 | }, 1127 | "engines": { 1128 | "node": ">=8" 1129 | } 1130 | }, 1131 | "node_modules/follow-redirects": { 1132 | "version": "1.15.9", 1133 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 1134 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 1135 | "funding": [ 1136 | { 1137 | "type": "individual", 1138 | "url": "https://github.com/sponsors/RubenVerborgh" 1139 | } 1140 | ], 1141 | "engines": { 1142 | "node": ">=4.0" 1143 | }, 1144 | "peerDependenciesMeta": { 1145 | "debug": { 1146 | "optional": true 1147 | } 1148 | } 1149 | }, 1150 | "node_modules/form-data": { 1151 | "version": "4.0.2", 1152 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 1153 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 1154 | "dependencies": { 1155 | "asynckit": "^0.4.0", 1156 | "combined-stream": "^1.0.8", 1157 | "es-set-tostringtag": "^2.1.0", 1158 | "mime-types": "^2.1.12" 1159 | }, 1160 | "engines": { 1161 | "node": ">= 6" 1162 | } 1163 | }, 1164 | "node_modules/form-data/node_modules/mime-db": { 1165 | "version": "1.52.0", 1166 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1167 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1168 | "engines": { 1169 | "node": ">= 0.6" 1170 | } 1171 | }, 1172 | "node_modules/form-data/node_modules/mime-types": { 1173 | "version": "2.1.35", 1174 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1175 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1176 | "dependencies": { 1177 | "mime-db": "1.52.0" 1178 | }, 1179 | "engines": { 1180 | "node": ">= 0.6" 1181 | } 1182 | }, 1183 | "node_modules/forwarded": { 1184 | "version": "0.2.0", 1185 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1186 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1187 | "engines": { 1188 | "node": ">= 0.6" 1189 | } 1190 | }, 1191 | "node_modules/fresh": { 1192 | "version": "2.0.0", 1193 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 1194 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 1195 | "engines": { 1196 | "node": ">= 0.8" 1197 | } 1198 | }, 1199 | "node_modules/fsevents": { 1200 | "version": "2.3.3", 1201 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1202 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1203 | "dev": true, 1204 | "hasInstallScript": true, 1205 | "optional": true, 1206 | "os": [ 1207 | "darwin" 1208 | ], 1209 | "engines": { 1210 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1211 | } 1212 | }, 1213 | "node_modules/function-bind": { 1214 | "version": "1.1.2", 1215 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1216 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1217 | "funding": { 1218 | "url": "https://github.com/sponsors/ljharb" 1219 | } 1220 | }, 1221 | "node_modules/get-caller-file": { 1222 | "version": "2.0.5", 1223 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1224 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1225 | "engines": { 1226 | "node": "6.* || 8.* || >= 10.*" 1227 | } 1228 | }, 1229 | "node_modules/get-intrinsic": { 1230 | "version": "1.3.0", 1231 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 1232 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 1233 | "dependencies": { 1234 | "call-bind-apply-helpers": "^1.0.2", 1235 | "es-define-property": "^1.0.1", 1236 | "es-errors": "^1.3.0", 1237 | "es-object-atoms": "^1.1.1", 1238 | "function-bind": "^1.1.2", 1239 | "get-proto": "^1.0.1", 1240 | "gopd": "^1.2.0", 1241 | "has-symbols": "^1.1.0", 1242 | "hasown": "^2.0.2", 1243 | "math-intrinsics": "^1.1.0" 1244 | }, 1245 | "engines": { 1246 | "node": ">= 0.4" 1247 | }, 1248 | "funding": { 1249 | "url": "https://github.com/sponsors/ljharb" 1250 | } 1251 | }, 1252 | "node_modules/get-proto": { 1253 | "version": "1.0.1", 1254 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 1255 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 1256 | "dependencies": { 1257 | "dunder-proto": "^1.0.1", 1258 | "es-object-atoms": "^1.0.0" 1259 | }, 1260 | "engines": { 1261 | "node": ">= 0.4" 1262 | } 1263 | }, 1264 | "node_modules/get-tsconfig": { 1265 | "version": "4.10.0", 1266 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", 1267 | "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", 1268 | "dev": true, 1269 | "dependencies": { 1270 | "resolve-pkg-maps": "^1.0.0" 1271 | }, 1272 | "funding": { 1273 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 1274 | } 1275 | }, 1276 | "node_modules/gopd": { 1277 | "version": "1.2.0", 1278 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 1279 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 1280 | "engines": { 1281 | "node": ">= 0.4" 1282 | }, 1283 | "funding": { 1284 | "url": "https://github.com/sponsors/ljharb" 1285 | } 1286 | }, 1287 | "node_modules/has-symbols": { 1288 | "version": "1.1.0", 1289 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 1290 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 1291 | "engines": { 1292 | "node": ">= 0.4" 1293 | }, 1294 | "funding": { 1295 | "url": "https://github.com/sponsors/ljharb" 1296 | } 1297 | }, 1298 | "node_modules/has-tostringtag": { 1299 | "version": "1.0.2", 1300 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 1301 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 1302 | "dependencies": { 1303 | "has-symbols": "^1.0.3" 1304 | }, 1305 | "engines": { 1306 | "node": ">= 0.4" 1307 | }, 1308 | "funding": { 1309 | "url": "https://github.com/sponsors/ljharb" 1310 | } 1311 | }, 1312 | "node_modules/hasown": { 1313 | "version": "2.0.2", 1314 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1315 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1316 | "dependencies": { 1317 | "function-bind": "^1.1.2" 1318 | }, 1319 | "engines": { 1320 | "node": ">= 0.4" 1321 | } 1322 | }, 1323 | "node_modules/http-errors": { 1324 | "version": "2.0.0", 1325 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1326 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1327 | "dependencies": { 1328 | "depd": "2.0.0", 1329 | "inherits": "2.0.4", 1330 | "setprototypeof": "1.2.0", 1331 | "statuses": "2.0.1", 1332 | "toidentifier": "1.0.1" 1333 | }, 1334 | "engines": { 1335 | "node": ">= 0.8" 1336 | } 1337 | }, 1338 | "node_modules/iconv-lite": { 1339 | "version": "0.6.3", 1340 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1341 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1342 | "dependencies": { 1343 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1344 | }, 1345 | "engines": { 1346 | "node": ">=0.10.0" 1347 | } 1348 | }, 1349 | "node_modules/inherits": { 1350 | "version": "2.0.4", 1351 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1352 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1353 | }, 1354 | "node_modules/ipaddr.js": { 1355 | "version": "1.9.1", 1356 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1357 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1358 | "engines": { 1359 | "node": ">= 0.10" 1360 | } 1361 | }, 1362 | "node_modules/is-fullwidth-code-point": { 1363 | "version": "3.0.0", 1364 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1365 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1366 | "engines": { 1367 | "node": ">=8" 1368 | } 1369 | }, 1370 | "node_modules/is-promise": { 1371 | "version": "4.0.0", 1372 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 1373 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" 1374 | }, 1375 | "node_modules/isexe": { 1376 | "version": "2.0.0", 1377 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1378 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1379 | }, 1380 | "node_modules/locate-path": { 1381 | "version": "5.0.0", 1382 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1383 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1384 | "dependencies": { 1385 | "p-locate": "^4.1.0" 1386 | }, 1387 | "engines": { 1388 | "node": ">=8" 1389 | } 1390 | }, 1391 | "node_modules/make-error": { 1392 | "version": "1.3.6", 1393 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1394 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1395 | "dev": true 1396 | }, 1397 | "node_modules/math-intrinsics": { 1398 | "version": "1.1.0", 1399 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 1400 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 1401 | "engines": { 1402 | "node": ">= 0.4" 1403 | } 1404 | }, 1405 | "node_modules/media-typer": { 1406 | "version": "1.1.0", 1407 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 1408 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 1409 | "engines": { 1410 | "node": ">= 0.8" 1411 | } 1412 | }, 1413 | "node_modules/merge-descriptors": { 1414 | "version": "2.0.0", 1415 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 1416 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 1417 | "engines": { 1418 | "node": ">=18" 1419 | }, 1420 | "funding": { 1421 | "url": "https://github.com/sponsors/sindresorhus" 1422 | } 1423 | }, 1424 | "node_modules/mime-db": { 1425 | "version": "1.54.0", 1426 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 1427 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 1428 | "engines": { 1429 | "node": ">= 0.6" 1430 | } 1431 | }, 1432 | "node_modules/mime-types": { 1433 | "version": "3.0.1", 1434 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", 1435 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 1436 | "dependencies": { 1437 | "mime-db": "^1.54.0" 1438 | }, 1439 | "engines": { 1440 | "node": ">= 0.6" 1441 | } 1442 | }, 1443 | "node_modules/ms": { 1444 | "version": "2.1.3", 1445 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1446 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1447 | }, 1448 | "node_modules/negotiator": { 1449 | "version": "1.0.0", 1450 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 1451 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 1452 | "engines": { 1453 | "node": ">= 0.6" 1454 | } 1455 | }, 1456 | "node_modules/object-assign": { 1457 | "version": "4.1.1", 1458 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1459 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1460 | "engines": { 1461 | "node": ">=0.10.0" 1462 | } 1463 | }, 1464 | "node_modules/object-inspect": { 1465 | "version": "1.13.4", 1466 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 1467 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 1468 | "engines": { 1469 | "node": ">= 0.4" 1470 | }, 1471 | "funding": { 1472 | "url": "https://github.com/sponsors/ljharb" 1473 | } 1474 | }, 1475 | "node_modules/on-finished": { 1476 | "version": "2.4.1", 1477 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1478 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1479 | "dependencies": { 1480 | "ee-first": "1.1.1" 1481 | }, 1482 | "engines": { 1483 | "node": ">= 0.8" 1484 | } 1485 | }, 1486 | "node_modules/once": { 1487 | "version": "1.4.0", 1488 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1489 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1490 | "dependencies": { 1491 | "wrappy": "1" 1492 | } 1493 | }, 1494 | "node_modules/p-limit": { 1495 | "version": "2.3.0", 1496 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1497 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1498 | "dependencies": { 1499 | "p-try": "^2.0.0" 1500 | }, 1501 | "engines": { 1502 | "node": ">=6" 1503 | }, 1504 | "funding": { 1505 | "url": "https://github.com/sponsors/sindresorhus" 1506 | } 1507 | }, 1508 | "node_modules/p-locate": { 1509 | "version": "4.1.0", 1510 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1511 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1512 | "dependencies": { 1513 | "p-limit": "^2.2.0" 1514 | }, 1515 | "engines": { 1516 | "node": ">=8" 1517 | } 1518 | }, 1519 | "node_modules/p-try": { 1520 | "version": "2.2.0", 1521 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1522 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1523 | "engines": { 1524 | "node": ">=6" 1525 | } 1526 | }, 1527 | "node_modules/parseurl": { 1528 | "version": "1.3.3", 1529 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1530 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1531 | "engines": { 1532 | "node": ">= 0.8" 1533 | } 1534 | }, 1535 | "node_modules/path-exists": { 1536 | "version": "4.0.0", 1537 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1538 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1539 | "engines": { 1540 | "node": ">=8" 1541 | } 1542 | }, 1543 | "node_modules/path-key": { 1544 | "version": "3.1.1", 1545 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1546 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1547 | "engines": { 1548 | "node": ">=8" 1549 | } 1550 | }, 1551 | "node_modules/path-to-regexp": { 1552 | "version": "8.2.0", 1553 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 1554 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 1555 | "engines": { 1556 | "node": ">=16" 1557 | } 1558 | }, 1559 | "node_modules/pkce-challenge": { 1560 | "version": "5.0.0", 1561 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", 1562 | "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", 1563 | "engines": { 1564 | "node": ">=16.20.0" 1565 | } 1566 | }, 1567 | "node_modules/pngjs": { 1568 | "version": "5.0.0", 1569 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", 1570 | "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", 1571 | "engines": { 1572 | "node": ">=10.13.0" 1573 | } 1574 | }, 1575 | "node_modules/proxy-addr": { 1576 | "version": "2.0.7", 1577 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1578 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1579 | "dependencies": { 1580 | "forwarded": "0.2.0", 1581 | "ipaddr.js": "1.9.1" 1582 | }, 1583 | "engines": { 1584 | "node": ">= 0.10" 1585 | } 1586 | }, 1587 | "node_modules/proxy-from-env": { 1588 | "version": "1.1.0", 1589 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1590 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1591 | }, 1592 | "node_modules/qrcode": { 1593 | "version": "1.5.4", 1594 | "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", 1595 | "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", 1596 | "dependencies": { 1597 | "dijkstrajs": "^1.0.1", 1598 | "pngjs": "^5.0.0", 1599 | "yargs": "^15.3.1" 1600 | }, 1601 | "bin": { 1602 | "qrcode": "bin/qrcode" 1603 | }, 1604 | "engines": { 1605 | "node": ">=10.13.0" 1606 | } 1607 | }, 1608 | "node_modules/qs": { 1609 | "version": "6.14.0", 1610 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 1611 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 1612 | "dependencies": { 1613 | "side-channel": "^1.1.0" 1614 | }, 1615 | "engines": { 1616 | "node": ">=0.6" 1617 | }, 1618 | "funding": { 1619 | "url": "https://github.com/sponsors/ljharb" 1620 | } 1621 | }, 1622 | "node_modules/range-parser": { 1623 | "version": "1.2.1", 1624 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1625 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1626 | "engines": { 1627 | "node": ">= 0.6" 1628 | } 1629 | }, 1630 | "node_modules/raw-body": { 1631 | "version": "3.0.0", 1632 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 1633 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1634 | "dependencies": { 1635 | "bytes": "3.1.2", 1636 | "http-errors": "2.0.0", 1637 | "iconv-lite": "0.6.3", 1638 | "unpipe": "1.0.0" 1639 | }, 1640 | "engines": { 1641 | "node": ">= 0.8" 1642 | } 1643 | }, 1644 | "node_modules/require-directory": { 1645 | "version": "2.1.1", 1646 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1647 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1648 | "engines": { 1649 | "node": ">=0.10.0" 1650 | } 1651 | }, 1652 | "node_modules/require-main-filename": { 1653 | "version": "2.0.0", 1654 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1655 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1656 | }, 1657 | "node_modules/resolve-pkg-maps": { 1658 | "version": "1.0.0", 1659 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 1660 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 1661 | "dev": true, 1662 | "funding": { 1663 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 1664 | } 1665 | }, 1666 | "node_modules/router": { 1667 | "version": "2.2.0", 1668 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", 1669 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 1670 | "dependencies": { 1671 | "debug": "^4.4.0", 1672 | "depd": "^2.0.0", 1673 | "is-promise": "^4.0.0", 1674 | "parseurl": "^1.3.3", 1675 | "path-to-regexp": "^8.0.0" 1676 | }, 1677 | "engines": { 1678 | "node": ">= 18" 1679 | } 1680 | }, 1681 | "node_modules/safe-buffer": { 1682 | "version": "5.2.1", 1683 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1684 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1685 | "funding": [ 1686 | { 1687 | "type": "github", 1688 | "url": "https://github.com/sponsors/feross" 1689 | }, 1690 | { 1691 | "type": "patreon", 1692 | "url": "https://www.patreon.com/feross" 1693 | }, 1694 | { 1695 | "type": "consulting", 1696 | "url": "https://feross.org/support" 1697 | } 1698 | ] 1699 | }, 1700 | "node_modules/safer-buffer": { 1701 | "version": "2.1.2", 1702 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1703 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1704 | }, 1705 | "node_modules/send": { 1706 | "version": "1.2.0", 1707 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", 1708 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 1709 | "dependencies": { 1710 | "debug": "^4.3.5", 1711 | "encodeurl": "^2.0.0", 1712 | "escape-html": "^1.0.3", 1713 | "etag": "^1.8.1", 1714 | "fresh": "^2.0.0", 1715 | "http-errors": "^2.0.0", 1716 | "mime-types": "^3.0.1", 1717 | "ms": "^2.1.3", 1718 | "on-finished": "^2.4.1", 1719 | "range-parser": "^1.2.1", 1720 | "statuses": "^2.0.1" 1721 | }, 1722 | "engines": { 1723 | "node": ">= 18" 1724 | } 1725 | }, 1726 | "node_modules/serve-static": { 1727 | "version": "2.2.0", 1728 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", 1729 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 1730 | "dependencies": { 1731 | "encodeurl": "^2.0.0", 1732 | "escape-html": "^1.0.3", 1733 | "parseurl": "^1.3.3", 1734 | "send": "^1.2.0" 1735 | }, 1736 | "engines": { 1737 | "node": ">= 18" 1738 | } 1739 | }, 1740 | "node_modules/set-blocking": { 1741 | "version": "2.0.0", 1742 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1743 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 1744 | }, 1745 | "node_modules/setprototypeof": { 1746 | "version": "1.2.0", 1747 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1748 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1749 | }, 1750 | "node_modules/shebang-command": { 1751 | "version": "2.0.0", 1752 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1753 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1754 | "dependencies": { 1755 | "shebang-regex": "^3.0.0" 1756 | }, 1757 | "engines": { 1758 | "node": ">=8" 1759 | } 1760 | }, 1761 | "node_modules/shebang-regex": { 1762 | "version": "3.0.0", 1763 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1764 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1765 | "engines": { 1766 | "node": ">=8" 1767 | } 1768 | }, 1769 | "node_modules/side-channel": { 1770 | "version": "1.1.0", 1771 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 1772 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1773 | "dependencies": { 1774 | "es-errors": "^1.3.0", 1775 | "object-inspect": "^1.13.3", 1776 | "side-channel-list": "^1.0.0", 1777 | "side-channel-map": "^1.0.1", 1778 | "side-channel-weakmap": "^1.0.2" 1779 | }, 1780 | "engines": { 1781 | "node": ">= 0.4" 1782 | }, 1783 | "funding": { 1784 | "url": "https://github.com/sponsors/ljharb" 1785 | } 1786 | }, 1787 | "node_modules/side-channel-list": { 1788 | "version": "1.0.0", 1789 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 1790 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1791 | "dependencies": { 1792 | "es-errors": "^1.3.0", 1793 | "object-inspect": "^1.13.3" 1794 | }, 1795 | "engines": { 1796 | "node": ">= 0.4" 1797 | }, 1798 | "funding": { 1799 | "url": "https://github.com/sponsors/ljharb" 1800 | } 1801 | }, 1802 | "node_modules/side-channel-map": { 1803 | "version": "1.0.1", 1804 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 1805 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1806 | "dependencies": { 1807 | "call-bound": "^1.0.2", 1808 | "es-errors": "^1.3.0", 1809 | "get-intrinsic": "^1.2.5", 1810 | "object-inspect": "^1.13.3" 1811 | }, 1812 | "engines": { 1813 | "node": ">= 0.4" 1814 | }, 1815 | "funding": { 1816 | "url": "https://github.com/sponsors/ljharb" 1817 | } 1818 | }, 1819 | "node_modules/side-channel-weakmap": { 1820 | "version": "1.0.2", 1821 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 1822 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1823 | "dependencies": { 1824 | "call-bound": "^1.0.2", 1825 | "es-errors": "^1.3.0", 1826 | "get-intrinsic": "^1.2.5", 1827 | "object-inspect": "^1.13.3", 1828 | "side-channel-map": "^1.0.1" 1829 | }, 1830 | "engines": { 1831 | "node": ">= 0.4" 1832 | }, 1833 | "funding": { 1834 | "url": "https://github.com/sponsors/ljharb" 1835 | } 1836 | }, 1837 | "node_modules/statuses": { 1838 | "version": "2.0.1", 1839 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1840 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1841 | "engines": { 1842 | "node": ">= 0.8" 1843 | } 1844 | }, 1845 | "node_modules/string-width": { 1846 | "version": "4.2.3", 1847 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1848 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1849 | "dependencies": { 1850 | "emoji-regex": "^8.0.0", 1851 | "is-fullwidth-code-point": "^3.0.0", 1852 | "strip-ansi": "^6.0.1" 1853 | }, 1854 | "engines": { 1855 | "node": ">=8" 1856 | } 1857 | }, 1858 | "node_modules/strip-ansi": { 1859 | "version": "6.0.1", 1860 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1861 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1862 | "dependencies": { 1863 | "ansi-regex": "^5.0.1" 1864 | }, 1865 | "engines": { 1866 | "node": ">=8" 1867 | } 1868 | }, 1869 | "node_modules/toidentifier": { 1870 | "version": "1.0.1", 1871 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1872 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1873 | "engines": { 1874 | "node": ">=0.6" 1875 | } 1876 | }, 1877 | "node_modules/ts-node": { 1878 | "version": "10.9.2", 1879 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 1880 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 1881 | "dev": true, 1882 | "dependencies": { 1883 | "@cspotcode/source-map-support": "^0.8.0", 1884 | "@tsconfig/node10": "^1.0.7", 1885 | "@tsconfig/node12": "^1.0.7", 1886 | "@tsconfig/node14": "^1.0.0", 1887 | "@tsconfig/node16": "^1.0.2", 1888 | "acorn": "^8.4.1", 1889 | "acorn-walk": "^8.1.1", 1890 | "arg": "^4.1.0", 1891 | "create-require": "^1.1.0", 1892 | "diff": "^4.0.1", 1893 | "make-error": "^1.1.1", 1894 | "v8-compile-cache-lib": "^3.0.1", 1895 | "yn": "3.1.1" 1896 | }, 1897 | "bin": { 1898 | "ts-node": "dist/bin.js", 1899 | "ts-node-cwd": "dist/bin-cwd.js", 1900 | "ts-node-esm": "dist/bin-esm.js", 1901 | "ts-node-script": "dist/bin-script.js", 1902 | "ts-node-transpile-only": "dist/bin-transpile.js", 1903 | "ts-script": "dist/bin-script-deprecated.js" 1904 | }, 1905 | "peerDependencies": { 1906 | "@swc/core": ">=1.2.50", 1907 | "@swc/wasm": ">=1.2.50", 1908 | "@types/node": "*", 1909 | "typescript": ">=2.7" 1910 | }, 1911 | "peerDependenciesMeta": { 1912 | "@swc/core": { 1913 | "optional": true 1914 | }, 1915 | "@swc/wasm": { 1916 | "optional": true 1917 | } 1918 | } 1919 | }, 1920 | "node_modules/tsx": { 1921 | "version": "4.19.4", 1922 | "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", 1923 | "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", 1924 | "dev": true, 1925 | "dependencies": { 1926 | "esbuild": "~0.25.0", 1927 | "get-tsconfig": "^4.7.5" 1928 | }, 1929 | "bin": { 1930 | "tsx": "dist/cli.mjs" 1931 | }, 1932 | "engines": { 1933 | "node": ">=18.0.0" 1934 | }, 1935 | "optionalDependencies": { 1936 | "fsevents": "~2.3.3" 1937 | } 1938 | }, 1939 | "node_modules/type-is": { 1940 | "version": "2.0.1", 1941 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", 1942 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 1943 | "dependencies": { 1944 | "content-type": "^1.0.5", 1945 | "media-typer": "^1.1.0", 1946 | "mime-types": "^3.0.0" 1947 | }, 1948 | "engines": { 1949 | "node": ">= 0.6" 1950 | } 1951 | }, 1952 | "node_modules/typescript": { 1953 | "version": "5.8.3", 1954 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 1955 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1956 | "dev": true, 1957 | "bin": { 1958 | "tsc": "bin/tsc", 1959 | "tsserver": "bin/tsserver" 1960 | }, 1961 | "engines": { 1962 | "node": ">=14.17" 1963 | } 1964 | }, 1965 | "node_modules/undici-types": { 1966 | "version": "6.21.0", 1967 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 1968 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" 1969 | }, 1970 | "node_modules/unpipe": { 1971 | "version": "1.0.0", 1972 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1973 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1974 | "engines": { 1975 | "node": ">= 0.8" 1976 | } 1977 | }, 1978 | "node_modules/uuid": { 1979 | "version": "11.1.0", 1980 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", 1981 | "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", 1982 | "funding": [ 1983 | "https://github.com/sponsors/broofa", 1984 | "https://github.com/sponsors/ctavan" 1985 | ], 1986 | "bin": { 1987 | "uuid": "dist/esm/bin/uuid" 1988 | } 1989 | }, 1990 | "node_modules/v8-compile-cache-lib": { 1991 | "version": "3.0.1", 1992 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1993 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1994 | "dev": true 1995 | }, 1996 | "node_modules/vary": { 1997 | "version": "1.1.2", 1998 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1999 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2000 | "engines": { 2001 | "node": ">= 0.8" 2002 | } 2003 | }, 2004 | "node_modules/which": { 2005 | "version": "2.0.2", 2006 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2007 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2008 | "dependencies": { 2009 | "isexe": "^2.0.0" 2010 | }, 2011 | "bin": { 2012 | "node-which": "bin/node-which" 2013 | }, 2014 | "engines": { 2015 | "node": ">= 8" 2016 | } 2017 | }, 2018 | "node_modules/which-module": { 2019 | "version": "2.0.1", 2020 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", 2021 | "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" 2022 | }, 2023 | "node_modules/wrap-ansi": { 2024 | "version": "6.2.0", 2025 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2026 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2027 | "dependencies": { 2028 | "ansi-styles": "^4.0.0", 2029 | "string-width": "^4.1.0", 2030 | "strip-ansi": "^6.0.0" 2031 | }, 2032 | "engines": { 2033 | "node": ">=8" 2034 | } 2035 | }, 2036 | "node_modules/wrappy": { 2037 | "version": "1.0.2", 2038 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2039 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2040 | }, 2041 | "node_modules/y18n": { 2042 | "version": "4.0.3", 2043 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 2044 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" 2045 | }, 2046 | "node_modules/yargs": { 2047 | "version": "15.4.1", 2048 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 2049 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 2050 | "dependencies": { 2051 | "cliui": "^6.0.0", 2052 | "decamelize": "^1.2.0", 2053 | "find-up": "^4.1.0", 2054 | "get-caller-file": "^2.0.1", 2055 | "require-directory": "^2.1.1", 2056 | "require-main-filename": "^2.0.0", 2057 | "set-blocking": "^2.0.0", 2058 | "string-width": "^4.2.0", 2059 | "which-module": "^2.0.0", 2060 | "y18n": "^4.0.0", 2061 | "yargs-parser": "^18.1.2" 2062 | }, 2063 | "engines": { 2064 | "node": ">=8" 2065 | } 2066 | }, 2067 | "node_modules/yargs-parser": { 2068 | "version": "18.1.3", 2069 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 2070 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 2071 | "dependencies": { 2072 | "camelcase": "^5.0.0", 2073 | "decamelize": "^1.2.0" 2074 | }, 2075 | "engines": { 2076 | "node": ">=6" 2077 | } 2078 | }, 2079 | "node_modules/yn": { 2080 | "version": "3.1.1", 2081 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2082 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2083 | "dev": true, 2084 | "engines": { 2085 | "node": ">=6" 2086 | } 2087 | }, 2088 | "node_modules/zod": { 2089 | "version": "3.24.4", 2090 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", 2091 | "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", 2092 | "funding": { 2093 | "url": "https://github.com/sponsors/colinhacks" 2094 | } 2095 | }, 2096 | "node_modules/zod-to-json-schema": { 2097 | "version": "3.24.5", 2098 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", 2099 | "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", 2100 | "peerDependencies": { 2101 | "zod": "^3.24.1" 2102 | } 2103 | } 2104 | } 2105 | } 2106 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-kai", 3 | "version": "1.0.15", 4 | "type": "module", 5 | "main": "./dist/server.js", 6 | "bin": { 7 | "mcp-kai": "./cli.cjs" 8 | }, 9 | "scripts": { 10 | "dev": "tsx watch server.ts", 11 | "start": "tsx server.ts", 12 | "build": "tsc", 13 | "publish-all": "npm publish --access public", 14 | "link-all": "npm link" 15 | }, 16 | "dependencies": { 17 | "@modelcontextprotocol/sdk": "^1.11.2", 18 | "@types/express": "^5.0.1", 19 | "axios": "^1.8.4", 20 | "express": "^5.1.0", 21 | "qrcode": "^1.5.4", 22 | "uuid": "^11.1.0", 23 | "zod": "^3.24.2" 24 | }, 25 | "devDependencies": { 26 | "@types/node": "^22.14.1", 27 | "@types/qrcode": "^1.5.5", 28 | "ts-node": "^10.9.2", 29 | "tsx": "^4.19.3", 30 | "typescript": "^5.8.3" 31 | }, 32 | "files": [ 33 | "dist" 34 | ] 35 | } -------------------------------------------------------------------------------- /server.ts: -------------------------------------------------------------------------------- 1 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 2 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 3 | import { z } from "zod"; 4 | import axios from "axios"; 5 | import { Lane, ResponseList, Station, Train } from "./type"; 6 | import { v4 as uuidv4 } from 'uuid'; 7 | import * as QRCode from 'qrcode' 8 | 9 | //TODO NEED TO MOVE TO ENV 10 | const BASE_URL = "https://api-partner.krl.co.id/krl-webs/v1"; 11 | const TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIzIiwianRpIjoiMDYzNWIyOGMzYzg3YTY3ZTRjYWE4YTI0MjYxZGYwYzIxNjYzODA4NWM2NWU4ZjhiYzQ4OGNlM2JiZThmYWNmODU4YzY0YmI0MjgyM2EwOTUiLCJpYXQiOjE3MjI2MTc1MTQsIm5iZiI6MTcyMjYxNzUxNCwiZXhwIjoxNzU0MTUzNTE0LCJzdWIiOiI1Iiwic2NvcGVzIjpbXX0.Jz_sedcMtaZJ4dj0eWVc4_pr_wUQ3s1-UgpopFGhEmJt_iGzj6BdnOEEhcDDdIz-gydQL5ek0S_36v5h6P_X3OQyII3JmHp1SEDJMwrcy4FCY63-jGnhPBb4sprqUFruDRFSEIs1cNQ-3rv3qRDzJtGYc_bAkl2MfgZj85bvt2DDwBWPraZuCCkwz2fJvox-6qz6P7iK9YdQq8AjJfuNdl7t_1hMHixmtDG0KooVnfBV7PoChxvcWvs8FOmtYRdqD7RSEIoOXym2kcwqK-rmbWf9VuPQCN5gjLPimL4t2TbifBg5RWNIAAuHLcYzea48i3okbhkqGGlYTk3iVMU6Hf_Jruns1WJr3A961bd4rny62lNXyGPgNLRJJKedCs5lmtUTr4gZRec4Pz_MqDzlEYC3QzRAOZv0Ergp8-W1Vrv5gYyYNr-YQNdZ01mc7JH72N2dpU9G00K5kYxlcXDNVh8520-R-MrxYbmiFGVlNF2BzEH8qq6Ko9m0jT0NiKEOjetwegrbNdNq_oN4KmHvw2sHkGWY06rUeciYJMhBF1JZuRjj3JTwBUBVXcYZMFtwUAoikVByzKuaZZeTo1AtCiSjejSHNdpLxyKk_SFUzog5MOkUN1ktAhFnBFoz6SlWAJBJIS-lHYsdFLSug2YNiaNllkOUsDbYkiDtmPc9XWc" 12 | const TIKETID = uuidv4(); 13 | 14 | // Inisialisasi MCP server 15 | const server = new McpServer({ 16 | name: "mcp-kai", 17 | version: "1.0.0", 18 | }); 19 | // untuk generate ID unik 20 | 21 | server.tool( 22 | "get_ticket_qrcode", 23 | "Mendapatkan QR Code untuk tiket kereta", 24 | {}, 25 | async () => { 26 | 27 | const ticketUrl = `https://yourapp.com/ticket/${TIKETID}` 28 | 29 | const qr = await QRCode.toDataURL(ticketUrl).then(url => { 30 | return url; 31 | }); 32 | 33 | return { 34 | content: [{ 35 | type: "text", 36 | text: `QR Code untuk tiket kereta: ${qr}`, 37 | }] 38 | }; 39 | } 40 | ); 41 | 42 | 43 | server.tool("get_station_list", "Mendapatkan daftar stasiun kereta", {}, async () => { 44 | try { 45 | const response = await axios.get>(`${BASE_URL}/krl-station`); 46 | const stations = response.data.data; // Sesuaikan dengan struktur data dari API 47 | return { 48 | content: [ 49 | { 50 | type: "text", 51 | text: `Data stasiun pertama: ${stations.map((station: Station) => `- ${station.sta_name} (${station.sta_id})`).join("\n")}`, // Coba kembalikan JSON stasiun pertama 52 | }, 53 | ], 54 | }; 55 | } catch (error) { 56 | const errorMessage = error instanceof Error ? error.message : String(error); 57 | return { 58 | content: [ 59 | { 60 | type: "text", 61 | text: `Gagal mengambil daftar stasiun: ${errorMessage}`, 62 | }, 63 | ], 64 | isError: true, 65 | }; 66 | } 67 | }); 68 | 69 | server.tool( 70 | "get_train_schedule", 71 | "Mendapatkan jadwal kereta berdasarkan stasiun keberangkatan dan waktu keberangkatan dan waktu tujuan dalam rentang waktu jam. Format waktu: HH:MM presisi tidak ada menit seperti 12:00, 13:00, 14:00, dst.", 72 | { 73 | stationid: z.string().describe("Stasiun keberangkatan"), 74 | timefrom: z.string().describe("Waktu keberangkatan"), 75 | timeto: z.string().describe("Waktu tujuan"), 76 | }, 77 | async ({ stationid, timefrom, timeto }: { stationid: string, timefrom: string, timeto: string }) => { 78 | try { 79 | // Ganti URL berikut dengan endpoint API jadwal kereta yang valid 80 | const response = await axios.get>(`${BASE_URL}/schedule`, { 81 | params: { 82 | stationid: stationid, 83 | timefrom: timefrom, 84 | timeto: timeto, 85 | }, 86 | headers: { 87 | "Authorization": "Bearer " + TOKEN, 88 | }, 89 | }); 90 | const schedule = response.data.data; 91 | 92 | return { 93 | content: [ 94 | { 95 | type: "text", 96 | text: `Jadwal kereta dari ${stationid} jam ${timefrom} sampai ${timeto}:\n\n${schedule.map((train: Train) => 97 | `🚂 ${train.ka_name}\n` + 98 | ` No. KA: ${train.train_id}\n` + 99 | ` Rute: ${train.route_name}\n` + 100 | ` Tujuan: ${train.dest}\n` + 101 | ` Waktu Berangkat: ${train.time_est}\n` + 102 | ` Waktu Tiba: ${train.dest_time}\n` 103 | ).join("\n")}`, 104 | }, 105 | ], 106 | }; 107 | } catch (error) { 108 | const errorMessage = error instanceof Error ? error.message : String(error); 109 | return { 110 | content: [ 111 | { 112 | type: "text", 113 | text: `Gagal mengambil jadwal kereta: ${errorMessage}`, 114 | }, 115 | ], 116 | isError: true, 117 | }; 118 | } 119 | } 120 | ); 121 | 122 | server.tool( 123 | "get_lane_list", 124 | "Mendapatkan daftar stasiun yang dilewati kereta berdasarkan ID kereta.", 125 | { 126 | trainid: z.string().describe("ID kereta"), 127 | }, 128 | async ({ trainid }: { trainid: string }) => { 129 | try { 130 | const response = await axios.get>(`${BASE_URL}/schedule-train`, { 131 | params: { 132 | trainid: trainid, 133 | }, 134 | headers: { 135 | "Authorization": "Bearer " + TOKEN, 136 | }, 137 | }); 138 | const trains = response.data.data; 139 | 140 | return { 141 | content: [ 142 | { 143 | type: "text", 144 | text: `Daftar kereta yang tersedia: 145 | ${trains.map((t: Lane) => `- ${t.station_name} - ${t.time_est} - ${t.transit_station ? "Transit" : "Tidak Transit"}`).join("\n")}`, 146 | }, 147 | ], 148 | }; 149 | } catch (error) { 150 | const errorMessage = error instanceof Error ? error.message : String(error); 151 | return { 152 | content: [ 153 | { 154 | type: "text", 155 | text: `Gagal mengambil daftar kereta: ${errorMessage}`, 156 | }, 157 | ], 158 | isError: true, 159 | }; 160 | } 161 | } 162 | ); 163 | 164 | 165 | server.tool( 166 | "buy_train_ticket", 167 | "Membeli tiket kereta berdasarkan stasiun keberangkatan dan stasiun tujuan dan waktu keberangkatan dan waktu tujuan.", 168 | { 169 | stationFrom: z.string().describe("Stasiun keberangkatan"), 170 | stationTo: z.string().describe("Stasiun tujuan"), 171 | timeFrom: z.string().describe("Waktu keberangkatan"), 172 | }, 173 | async ({ stationFrom, stationTo, timeFrom }: { stationFrom: string, stationTo: string, timeFrom: string }) => { 174 | //TODO: This only mock the ticket purchase process 175 | return { 176 | content: [ 177 | { 178 | type: "text", 179 | text: `Tiket berhasil dibeli!\n\nDetail tiket:\n- Stasiun Keberangkatan: ${stationFrom}\n- Stasiun Tujuan: ${stationTo}\n- Waktu Keberangkatan: ${timeFrom}\n\n, tiket berhasil dibeli, tiket id: ${TIKETID}`, 180 | }, 181 | ], 182 | }; 183 | } 184 | ); 185 | 186 | server.tool( 187 | "get_ticket_status", 188 | "Mendapatkan status tiket kereta berdasarkan ID tiket.", 189 | { 190 | ticketid: z.string().describe("ID tiket"), 191 | }, 192 | async ({ ticketid }: { ticketid: string }) => { 193 | if (ticketid === TIKETID) { 194 | return { 195 | content: [ 196 | { 197 | type: "text", 198 | text: `Berikut adalah status tiket dengan ID ${ticketid}: https://placehold.co/400x400`, 199 | }, 200 | ], 201 | }; 202 | } else { 203 | return { 204 | content: [ 205 | { 206 | type: "text", 207 | text: "Tiket tidak ditemukan", 208 | }, 209 | ], 210 | isError: true, 211 | }; 212 | } 213 | } 214 | ); 215 | 216 | 217 | 218 | async function main() { 219 | // console.log("Starting MCP Server..."); 220 | const transport = new StdioServerTransport(); 221 | await server.connect(transport); 222 | // console.log("MCP Server is running and ready to accept connections"); 223 | } 224 | 225 | main().catch((error) => { 226 | console.error("Error starting MCP Server:", error); 227 | process.exit(1); 228 | }); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "outDir": "dist", 7 | "rootDir": "./", 8 | "esModuleInterop": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "strict": true, 11 | "skipLibCheck": true 12 | }, 13 | "include": [ 14 | "**/*.ts" 15 | ], 16 | "exclude": [ 17 | "node_modules", 18 | "dist" 19 | ] 20 | } -------------------------------------------------------------------------------- /type.ts: -------------------------------------------------------------------------------- 1 | export interface ResponseList { 2 | status: number 3 | message: string 4 | data: T[] 5 | } 6 | 7 | export interface ResponseDetail { 8 | status: number 9 | message: string 10 | data: T 11 | } 12 | 13 | export interface Station { 14 | sta_id: string 15 | sta_name: string 16 | group_wil: number 17 | fg_enable: number 18 | } 19 | 20 | 21 | export interface Train { 22 | train_id: string 23 | ka_name: string 24 | route_name: string 25 | dest: string 26 | time_est: string 27 | color: string 28 | dest_time: string 29 | } 30 | 31 | 32 | export interface Lane { 33 | train_id: string 34 | ka_name: string 35 | station_id: string 36 | station_name: string 37 | time_est: string 38 | transit_station: boolean 39 | color: string 40 | transit: any 41 | } 42 | --------------------------------------------------------------------------------