#
tokens: 36722/50000 10/10 files
lines: on (toggle) GitHub
raw markdown copy reset
# Directory Structure

```
├── .package-lock.json
├── package-lock.json
├── package.json
├── README.md
├── src
│   ├── handlers.js
│   ├── handlers.ts
│   ├── prompt.ts
│   ├── resource.ts
│   ├── server.js
│   └── server.ts
└── tsconfig.json
```

# Files

--------------------------------------------------------------------------------
/.package-lock.json:
--------------------------------------------------------------------------------

```json
   1 | {
   2 |   "name": "mcp-spotify",
   3 |   "version": "1.0.0",
   4 |   "lockfileVersion": 3,
   5 |   "requires": true,
   6 |   "packages": {
   7 |     "node_modules/@cspotcode/source-map-support": {
   8 |       "version": "0.8.1",
   9 |       "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
  10 |       "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
  11 |       "dev": true,
  12 |       "license": "MIT",
  13 |       "dependencies": {
  14 |         "@jridgewell/trace-mapping": "0.3.9"
  15 |       },
  16 |       "engines": {
  17 |         "node": ">=12"
  18 |       }
  19 |     },
  20 |     "node_modules/@esbuild/win32-x64": {
  21 |       "version": "0.25.1",
  22 |       "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
  23 |       "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
  24 |       "cpu": [
  25 |         "x64"
  26 |       ],
  27 |       "dev": true,
  28 |       "license": "MIT",
  29 |       "optional": true,
  30 |       "os": [
  31 |         "win32"
  32 |       ],
  33 |       "engines": {
  34 |         "node": ">=18"
  35 |       }
  36 |     },
  37 |     "node_modules/@jridgewell/resolve-uri": {
  38 |       "version": "3.1.2",
  39 |       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
  40 |       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
  41 |       "dev": true,
  42 |       "license": "MIT",
  43 |       "engines": {
  44 |         "node": ">=6.0.0"
  45 |       }
  46 |     },
  47 |     "node_modules/@jridgewell/sourcemap-codec": {
  48 |       "version": "1.5.0",
  49 |       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
  50 |       "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
  51 |       "dev": true,
  52 |       "license": "MIT"
  53 |     },
  54 |     "node_modules/@jridgewell/trace-mapping": {
  55 |       "version": "0.3.9",
  56 |       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
  57 |       "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
  58 |       "dev": true,
  59 |       "license": "MIT",
  60 |       "dependencies": {
  61 |         "@jridgewell/resolve-uri": "^3.0.3",
  62 |         "@jridgewell/sourcemap-codec": "^1.4.10"
  63 |       }
  64 |     },
  65 |     "node_modules/@tsconfig/node10": {
  66 |       "version": "1.0.11",
  67 |       "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
  68 |       "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
  69 |       "dev": true,
  70 |       "license": "MIT"
  71 |     },
  72 |     "node_modules/@tsconfig/node12": {
  73 |       "version": "1.0.11",
  74 |       "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
  75 |       "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
  76 |       "dev": true,
  77 |       "license": "MIT"
  78 |     },
  79 |     "node_modules/@tsconfig/node14": {
  80 |       "version": "1.0.3",
  81 |       "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
  82 |       "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
  83 |       "dev": true,
  84 |       "license": "MIT"
  85 |     },
  86 |     "node_modules/@tsconfig/node16": {
  87 |       "version": "1.0.4",
  88 |       "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
  89 |       "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
  90 |       "dev": true,
  91 |       "license": "MIT"
  92 |     },
  93 |     "node_modules/@types/body-parser": {
  94 |       "version": "1.19.5",
  95 |       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
  96 |       "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
  97 |       "dev": true,
  98 |       "license": "MIT",
  99 |       "dependencies": {
 100 |         "@types/connect": "*",
 101 |         "@types/node": "*"
 102 |       }
 103 |     },
 104 |     "node_modules/@types/connect": {
 105 |       "version": "3.4.38",
 106 |       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
 107 |       "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
 108 |       "dev": true,
 109 |       "license": "MIT",
 110 |       "dependencies": {
 111 |         "@types/node": "*"
 112 |       }
 113 |     },
 114 |     "node_modules/@types/cors": {
 115 |       "version": "2.8.17",
 116 |       "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
 117 |       "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
 118 |       "license": "MIT",
 119 |       "dependencies": {
 120 |         "@types/node": "*"
 121 |       }
 122 |     },
 123 |     "node_modules/@types/express": {
 124 |       "version": "5.0.0",
 125 |       "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz",
 126 |       "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==",
 127 |       "dev": true,
 128 |       "license": "MIT",
 129 |       "dependencies": {
 130 |         "@types/body-parser": "*",
 131 |         "@types/express-serve-static-core": "^5.0.0",
 132 |         "@types/qs": "*",
 133 |         "@types/serve-static": "*"
 134 |       }
 135 |     },
 136 |     "node_modules/@types/express-serve-static-core": {
 137 |       "version": "5.0.6",
 138 |       "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz",
 139 |       "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==",
 140 |       "dev": true,
 141 |       "license": "MIT",
 142 |       "dependencies": {
 143 |         "@types/node": "*",
 144 |         "@types/qs": "*",
 145 |         "@types/range-parser": "*",
 146 |         "@types/send": "*"
 147 |       }
 148 |     },
 149 |     "node_modules/@types/http-errors": {
 150 |       "version": "2.0.4",
 151 |       "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
 152 |       "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
 153 |       "dev": true,
 154 |       "license": "MIT"
 155 |     },
 156 |     "node_modules/@types/mime": {
 157 |       "version": "1.3.5",
 158 |       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
 159 |       "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
 160 |       "dev": true,
 161 |       "license": "MIT"
 162 |     },
 163 |     "node_modules/@types/node": {
 164 |       "version": "22.13.10",
 165 |       "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
 166 |       "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
 167 |       "license": "MIT",
 168 |       "dependencies": {
 169 |         "undici-types": "~6.20.0"
 170 |       }
 171 |     },
 172 |     "node_modules/@types/qs": {
 173 |       "version": "6.9.18",
 174 |       "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
 175 |       "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
 176 |       "dev": true,
 177 |       "license": "MIT"
 178 |     },
 179 |     "node_modules/@types/range-parser": {
 180 |       "version": "1.2.7",
 181 |       "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
 182 |       "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
 183 |       "dev": true,
 184 |       "license": "MIT"
 185 |     },
 186 |     "node_modules/@types/send": {
 187 |       "version": "0.17.4",
 188 |       "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
 189 |       "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
 190 |       "dev": true,
 191 |       "license": "MIT",
 192 |       "dependencies": {
 193 |         "@types/mime": "^1",
 194 |         "@types/node": "*"
 195 |       }
 196 |     },
 197 |     "node_modules/@types/serve-static": {
 198 |       "version": "1.15.7",
 199 |       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
 200 |       "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
 201 |       "dev": true,
 202 |       "license": "MIT",
 203 |       "dependencies": {
 204 |         "@types/http-errors": "*",
 205 |         "@types/node": "*",
 206 |         "@types/send": "*"
 207 |       }
 208 |     },
 209 |     "node_modules/accepts": {
 210 |       "version": "1.3.8",
 211 |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
 212 |       "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
 213 |       "license": "MIT",
 214 |       "dependencies": {
 215 |         "mime-types": "~2.1.34",
 216 |         "negotiator": "0.6.3"
 217 |       },
 218 |       "engines": {
 219 |         "node": ">= 0.6"
 220 |       }
 221 |     },
 222 |     "node_modules/acorn": {
 223 |       "version": "8.14.1",
 224 |       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
 225 |       "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
 226 |       "dev": true,
 227 |       "license": "MIT",
 228 |       "bin": {
 229 |         "acorn": "bin/acorn"
 230 |       },
 231 |       "engines": {
 232 |         "node": ">=0.4.0"
 233 |       }
 234 |     },
 235 |     "node_modules/acorn-walk": {
 236 |       "version": "8.3.4",
 237 |       "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
 238 |       "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
 239 |       "dev": true,
 240 |       "license": "MIT",
 241 |       "dependencies": {
 242 |         "acorn": "^8.11.0"
 243 |       },
 244 |       "engines": {
 245 |         "node": ">=0.4.0"
 246 |       }
 247 |     },
 248 |     "node_modules/arg": {
 249 |       "version": "4.1.3",
 250 |       "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
 251 |       "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
 252 |       "dev": true,
 253 |       "license": "MIT"
 254 |     },
 255 |     "node_modules/array-flatten": {
 256 |       "version": "1.1.1",
 257 |       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 258 |       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
 259 |       "license": "MIT"
 260 |     },
 261 |     "node_modules/asynckit": {
 262 |       "version": "0.4.0",
 263 |       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 264 |       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
 265 |       "license": "MIT"
 266 |     },
 267 |     "node_modules/axios": {
 268 |       "version": "1.8.3",
 269 |       "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
 270 |       "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
 271 |       "license": "MIT",
 272 |       "dependencies": {
 273 |         "follow-redirects": "^1.15.6",
 274 |         "form-data": "^4.0.0",
 275 |         "proxy-from-env": "^1.1.0"
 276 |       }
 277 |     },
 278 |     "node_modules/body-parser": {
 279 |       "version": "1.20.3",
 280 |       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
 281 |       "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
 282 |       "license": "MIT",
 283 |       "dependencies": {
 284 |         "bytes": "3.1.2",
 285 |         "content-type": "~1.0.5",
 286 |         "debug": "2.6.9",
 287 |         "depd": "2.0.0",
 288 |         "destroy": "1.2.0",
 289 |         "http-errors": "2.0.0",
 290 |         "iconv-lite": "0.4.24",
 291 |         "on-finished": "2.4.1",
 292 |         "qs": "6.13.0",
 293 |         "raw-body": "2.5.2",
 294 |         "type-is": "~1.6.18",
 295 |         "unpipe": "1.0.0"
 296 |       },
 297 |       "engines": {
 298 |         "node": ">= 0.8",
 299 |         "npm": "1.2.8000 || >= 1.4.16"
 300 |       }
 301 |     },
 302 |     "node_modules/bundle-name": {
 303 |       "version": "4.1.0",
 304 |       "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
 305 |       "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
 306 |       "license": "MIT",
 307 |       "dependencies": {
 308 |         "run-applescript": "^7.0.0"
 309 |       },
 310 |       "engines": {
 311 |         "node": ">=18"
 312 |       },
 313 |       "funding": {
 314 |         "url": "https://github.com/sponsors/sindresorhus"
 315 |       }
 316 |     },
 317 |     "node_modules/bytes": {
 318 |       "version": "3.1.2",
 319 |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 320 |       "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
 321 |       "license": "MIT",
 322 |       "engines": {
 323 |         "node": ">= 0.8"
 324 |       }
 325 |     },
 326 |     "node_modules/call-bind-apply-helpers": {
 327 |       "version": "1.0.2",
 328 |       "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
 329 |       "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
 330 |       "license": "MIT",
 331 |       "dependencies": {
 332 |         "es-errors": "^1.3.0",
 333 |         "function-bind": "^1.1.2"
 334 |       },
 335 |       "engines": {
 336 |         "node": ">= 0.4"
 337 |       }
 338 |     },
 339 |     "node_modules/call-bound": {
 340 |       "version": "1.0.4",
 341 |       "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
 342 |       "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
 343 |       "license": "MIT",
 344 |       "dependencies": {
 345 |         "call-bind-apply-helpers": "^1.0.2",
 346 |         "get-intrinsic": "^1.3.0"
 347 |       },
 348 |       "engines": {
 349 |         "node": ">= 0.4"
 350 |       },
 351 |       "funding": {
 352 |         "url": "https://github.com/sponsors/ljharb"
 353 |       }
 354 |     },
 355 |     "node_modules/combined-stream": {
 356 |       "version": "1.0.8",
 357 |       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 358 |       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 359 |       "license": "MIT",
 360 |       "dependencies": {
 361 |         "delayed-stream": "~1.0.0"
 362 |       },
 363 |       "engines": {
 364 |         "node": ">= 0.8"
 365 |       }
 366 |     },
 367 |     "node_modules/content-disposition": {
 368 |       "version": "0.5.4",
 369 |       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 370 |       "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
 371 |       "license": "MIT",
 372 |       "dependencies": {
 373 |         "safe-buffer": "5.2.1"
 374 |       },
 375 |       "engines": {
 376 |         "node": ">= 0.6"
 377 |       }
 378 |     },
 379 |     "node_modules/content-type": {
 380 |       "version": "1.0.5",
 381 |       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
 382 |       "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
 383 |       "license": "MIT",
 384 |       "engines": {
 385 |         "node": ">= 0.6"
 386 |       }
 387 |     },
 388 |     "node_modules/cookie": {
 389 |       "version": "0.7.1",
 390 |       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
 391 |       "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
 392 |       "license": "MIT",
 393 |       "engines": {
 394 |         "node": ">= 0.6"
 395 |       }
 396 |     },
 397 |     "node_modules/cookie-signature": {
 398 |       "version": "1.0.6",
 399 |       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 400 |       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
 401 |       "license": "MIT"
 402 |     },
 403 |     "node_modules/cors": {
 404 |       "version": "2.8.5",
 405 |       "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
 406 |       "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
 407 |       "license": "MIT",
 408 |       "dependencies": {
 409 |         "object-assign": "^4",
 410 |         "vary": "^1"
 411 |       },
 412 |       "engines": {
 413 |         "node": ">= 0.10"
 414 |       }
 415 |     },
 416 |     "node_modules/create-require": {
 417 |       "version": "1.1.1",
 418 |       "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
 419 |       "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
 420 |       "dev": true,
 421 |       "license": "MIT"
 422 |     },
 423 |     "node_modules/debug": {
 424 |       "version": "2.6.9",
 425 |       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 426 |       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 427 |       "license": "MIT",
 428 |       "dependencies": {
 429 |         "ms": "2.0.0"
 430 |       }
 431 |     },
 432 |     "node_modules/default-browser": {
 433 |       "version": "5.2.1",
 434 |       "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
 435 |       "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
 436 |       "license": "MIT",
 437 |       "dependencies": {
 438 |         "bundle-name": "^4.1.0",
 439 |         "default-browser-id": "^5.0.0"
 440 |       },
 441 |       "engines": {
 442 |         "node": ">=18"
 443 |       },
 444 |       "funding": {
 445 |         "url": "https://github.com/sponsors/sindresorhus"
 446 |       }
 447 |     },
 448 |     "node_modules/default-browser-id": {
 449 |       "version": "5.0.0",
 450 |       "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
 451 |       "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
 452 |       "license": "MIT",
 453 |       "engines": {
 454 |         "node": ">=18"
 455 |       },
 456 |       "funding": {
 457 |         "url": "https://github.com/sponsors/sindresorhus"
 458 |       }
 459 |     },
 460 |     "node_modules/define-lazy-prop": {
 461 |       "version": "3.0.0",
 462 |       "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
 463 |       "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
 464 |       "license": "MIT",
 465 |       "engines": {
 466 |         "node": ">=12"
 467 |       },
 468 |       "funding": {
 469 |         "url": "https://github.com/sponsors/sindresorhus"
 470 |       }
 471 |     },
 472 |     "node_modules/delayed-stream": {
 473 |       "version": "1.0.0",
 474 |       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 475 |       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
 476 |       "license": "MIT",
 477 |       "engines": {
 478 |         "node": ">=0.4.0"
 479 |       }
 480 |     },
 481 |     "node_modules/depd": {
 482 |       "version": "2.0.0",
 483 |       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
 484 |       "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
 485 |       "license": "MIT",
 486 |       "engines": {
 487 |         "node": ">= 0.8"
 488 |       }
 489 |     },
 490 |     "node_modules/destroy": {
 491 |       "version": "1.2.0",
 492 |       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
 493 |       "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
 494 |       "license": "MIT",
 495 |       "engines": {
 496 |         "node": ">= 0.8",
 497 |         "npm": "1.2.8000 || >= 1.4.16"
 498 |       }
 499 |     },
 500 |     "node_modules/diff": {
 501 |       "version": "4.0.2",
 502 |       "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 503 |       "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
 504 |       "dev": true,
 505 |       "license": "BSD-3-Clause",
 506 |       "engines": {
 507 |         "node": ">=0.3.1"
 508 |       }
 509 |     },
 510 |     "node_modules/dotenv": {
 511 |       "version": "16.4.7",
 512 |       "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
 513 |       "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
 514 |       "license": "BSD-2-Clause",
 515 |       "engines": {
 516 |         "node": ">=12"
 517 |       },
 518 |       "funding": {
 519 |         "url": "https://dotenvx.com"
 520 |       }
 521 |     },
 522 |     "node_modules/dunder-proto": {
 523 |       "version": "1.0.1",
 524 |       "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
 525 |       "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
 526 |       "license": "MIT",
 527 |       "dependencies": {
 528 |         "call-bind-apply-helpers": "^1.0.1",
 529 |         "es-errors": "^1.3.0",
 530 |         "gopd": "^1.2.0"
 531 |       },
 532 |       "engines": {
 533 |         "node": ">= 0.4"
 534 |       }
 535 |     },
 536 |     "node_modules/ee-first": {
 537 |       "version": "1.1.1",
 538 |       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 539 |       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
 540 |       "license": "MIT"
 541 |     },
 542 |     "node_modules/encodeurl": {
 543 |       "version": "2.0.0",
 544 |       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
 545 |       "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
 546 |       "license": "MIT",
 547 |       "engines": {
 548 |         "node": ">= 0.8"
 549 |       }
 550 |     },
 551 |     "node_modules/es-define-property": {
 552 |       "version": "1.0.1",
 553 |       "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
 554 |       "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
 555 |       "license": "MIT",
 556 |       "engines": {
 557 |         "node": ">= 0.4"
 558 |       }
 559 |     },
 560 |     "node_modules/es-errors": {
 561 |       "version": "1.3.0",
 562 |       "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
 563 |       "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
 564 |       "license": "MIT",
 565 |       "engines": {
 566 |         "node": ">= 0.4"
 567 |       }
 568 |     },
 569 |     "node_modules/es-object-atoms": {
 570 |       "version": "1.1.1",
 571 |       "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
 572 |       "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
 573 |       "license": "MIT",
 574 |       "dependencies": {
 575 |         "es-errors": "^1.3.0"
 576 |       },
 577 |       "engines": {
 578 |         "node": ">= 0.4"
 579 |       }
 580 |     },
 581 |     "node_modules/es-set-tostringtag": {
 582 |       "version": "2.1.0",
 583 |       "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
 584 |       "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
 585 |       "license": "MIT",
 586 |       "dependencies": {
 587 |         "es-errors": "^1.3.0",
 588 |         "get-intrinsic": "^1.2.6",
 589 |         "has-tostringtag": "^1.0.2",
 590 |         "hasown": "^2.0.2"
 591 |       },
 592 |       "engines": {
 593 |         "node": ">= 0.4"
 594 |       }
 595 |     },
 596 |     "node_modules/esbuild": {
 597 |       "version": "0.25.1",
 598 |       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
 599 |       "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
 600 |       "dev": true,
 601 |       "hasInstallScript": true,
 602 |       "license": "MIT",
 603 |       "bin": {
 604 |         "esbuild": "bin/esbuild"
 605 |       },
 606 |       "engines": {
 607 |         "node": ">=18"
 608 |       },
 609 |       "optionalDependencies": {
 610 |         "@esbuild/aix-ppc64": "0.25.1",
 611 |         "@esbuild/android-arm": "0.25.1",
 612 |         "@esbuild/android-arm64": "0.25.1",
 613 |         "@esbuild/android-x64": "0.25.1",
 614 |         "@esbuild/darwin-arm64": "0.25.1",
 615 |         "@esbuild/darwin-x64": "0.25.1",
 616 |         "@esbuild/freebsd-arm64": "0.25.1",
 617 |         "@esbuild/freebsd-x64": "0.25.1",
 618 |         "@esbuild/linux-arm": "0.25.1",
 619 |         "@esbuild/linux-arm64": "0.25.1",
 620 |         "@esbuild/linux-ia32": "0.25.1",
 621 |         "@esbuild/linux-loong64": "0.25.1",
 622 |         "@esbuild/linux-mips64el": "0.25.1",
 623 |         "@esbuild/linux-ppc64": "0.25.1",
 624 |         "@esbuild/linux-riscv64": "0.25.1",
 625 |         "@esbuild/linux-s390x": "0.25.1",
 626 |         "@esbuild/linux-x64": "0.25.1",
 627 |         "@esbuild/netbsd-arm64": "0.25.1",
 628 |         "@esbuild/netbsd-x64": "0.25.1",
 629 |         "@esbuild/openbsd-arm64": "0.25.1",
 630 |         "@esbuild/openbsd-x64": "0.25.1",
 631 |         "@esbuild/sunos-x64": "0.25.1",
 632 |         "@esbuild/win32-arm64": "0.25.1",
 633 |         "@esbuild/win32-ia32": "0.25.1",
 634 |         "@esbuild/win32-x64": "0.25.1"
 635 |       }
 636 |     },
 637 |     "node_modules/escape-html": {
 638 |       "version": "1.0.3",
 639 |       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 640 |       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
 641 |       "license": "MIT"
 642 |     },
 643 |     "node_modules/etag": {
 644 |       "version": "1.8.1",
 645 |       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
 646 |       "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
 647 |       "license": "MIT",
 648 |       "engines": {
 649 |         "node": ">= 0.6"
 650 |       }
 651 |     },
 652 |     "node_modules/express": {
 653 |       "version": "4.21.2",
 654 |       "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
 655 |       "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
 656 |       "license": "MIT",
 657 |       "dependencies": {
 658 |         "accepts": "~1.3.8",
 659 |         "array-flatten": "1.1.1",
 660 |         "body-parser": "1.20.3",
 661 |         "content-disposition": "0.5.4",
 662 |         "content-type": "~1.0.4",
 663 |         "cookie": "0.7.1",
 664 |         "cookie-signature": "1.0.6",
 665 |         "debug": "2.6.9",
 666 |         "depd": "2.0.0",
 667 |         "encodeurl": "~2.0.0",
 668 |         "escape-html": "~1.0.3",
 669 |         "etag": "~1.8.1",
 670 |         "finalhandler": "1.3.1",
 671 |         "fresh": "0.5.2",
 672 |         "http-errors": "2.0.0",
 673 |         "merge-descriptors": "1.0.3",
 674 |         "methods": "~1.1.2",
 675 |         "on-finished": "2.4.1",
 676 |         "parseurl": "~1.3.3",
 677 |         "path-to-regexp": "0.1.12",
 678 |         "proxy-addr": "~2.0.7",
 679 |         "qs": "6.13.0",
 680 |         "range-parser": "~1.2.1",
 681 |         "safe-buffer": "5.2.1",
 682 |         "send": "0.19.0",
 683 |         "serve-static": "1.16.2",
 684 |         "setprototypeof": "1.2.0",
 685 |         "statuses": "2.0.1",
 686 |         "type-is": "~1.6.18",
 687 |         "utils-merge": "1.0.1",
 688 |         "vary": "~1.1.2"
 689 |       },
 690 |       "engines": {
 691 |         "node": ">= 0.10.0"
 692 |       },
 693 |       "funding": {
 694 |         "type": "opencollective",
 695 |         "url": "https://opencollective.com/express"
 696 |       }
 697 |     },
 698 |     "node_modules/finalhandler": {
 699 |       "version": "1.3.1",
 700 |       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
 701 |       "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
 702 |       "license": "MIT",
 703 |       "dependencies": {
 704 |         "debug": "2.6.9",
 705 |         "encodeurl": "~2.0.0",
 706 |         "escape-html": "~1.0.3",
 707 |         "on-finished": "2.4.1",
 708 |         "parseurl": "~1.3.3",
 709 |         "statuses": "2.0.1",
 710 |         "unpipe": "~1.0.0"
 711 |       },
 712 |       "engines": {
 713 |         "node": ">= 0.8"
 714 |       }
 715 |     },
 716 |     "node_modules/follow-redirects": {
 717 |       "version": "1.15.9",
 718 |       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
 719 |       "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
 720 |       "funding": [
 721 |         {
 722 |           "type": "individual",
 723 |           "url": "https://github.com/sponsors/RubenVerborgh"
 724 |         }
 725 |       ],
 726 |       "license": "MIT",
 727 |       "engines": {
 728 |         "node": ">=4.0"
 729 |       },
 730 |       "peerDependenciesMeta": {
 731 |         "debug": {
 732 |           "optional": true
 733 |         }
 734 |       }
 735 |     },
 736 |     "node_modules/form-data": {
 737 |       "version": "4.0.2",
 738 |       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
 739 |       "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
 740 |       "license": "MIT",
 741 |       "dependencies": {
 742 |         "asynckit": "^0.4.0",
 743 |         "combined-stream": "^1.0.8",
 744 |         "es-set-tostringtag": "^2.1.0",
 745 |         "mime-types": "^2.1.12"
 746 |       },
 747 |       "engines": {
 748 |         "node": ">= 6"
 749 |       }
 750 |     },
 751 |     "node_modules/forwarded": {
 752 |       "version": "0.2.0",
 753 |       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
 754 |       "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
 755 |       "license": "MIT",
 756 |       "engines": {
 757 |         "node": ">= 0.6"
 758 |       }
 759 |     },
 760 |     "node_modules/fresh": {
 761 |       "version": "0.5.2",
 762 |       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
 763 |       "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
 764 |       "license": "MIT",
 765 |       "engines": {
 766 |         "node": ">= 0.6"
 767 |       }
 768 |     },
 769 |     "node_modules/function-bind": {
 770 |       "version": "1.1.2",
 771 |       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
 772 |       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
 773 |       "license": "MIT",
 774 |       "funding": {
 775 |         "url": "https://github.com/sponsors/ljharb"
 776 |       }
 777 |     },
 778 |     "node_modules/get-intrinsic": {
 779 |       "version": "1.3.0",
 780 |       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 781 |       "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
 782 |       "license": "MIT",
 783 |       "dependencies": {
 784 |         "call-bind-apply-helpers": "^1.0.2",
 785 |         "es-define-property": "^1.0.1",
 786 |         "es-errors": "^1.3.0",
 787 |         "es-object-atoms": "^1.1.1",
 788 |         "function-bind": "^1.1.2",
 789 |         "get-proto": "^1.0.1",
 790 |         "gopd": "^1.2.0",
 791 |         "has-symbols": "^1.1.0",
 792 |         "hasown": "^2.0.2",
 793 |         "math-intrinsics": "^1.1.0"
 794 |       },
 795 |       "engines": {
 796 |         "node": ">= 0.4"
 797 |       },
 798 |       "funding": {
 799 |         "url": "https://github.com/sponsors/ljharb"
 800 |       }
 801 |     },
 802 |     "node_modules/get-proto": {
 803 |       "version": "1.0.1",
 804 |       "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
 805 |       "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
 806 |       "license": "MIT",
 807 |       "dependencies": {
 808 |         "dunder-proto": "^1.0.1",
 809 |         "es-object-atoms": "^1.0.0"
 810 |       },
 811 |       "engines": {
 812 |         "node": ">= 0.4"
 813 |       }
 814 |     },
 815 |     "node_modules/get-tsconfig": {
 816 |       "version": "4.10.0",
 817 |       "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
 818 |       "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
 819 |       "dev": true,
 820 |       "license": "MIT",
 821 |       "dependencies": {
 822 |         "resolve-pkg-maps": "^1.0.0"
 823 |       },
 824 |       "funding": {
 825 |         "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
 826 |       }
 827 |     },
 828 |     "node_modules/gopd": {
 829 |       "version": "1.2.0",
 830 |       "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 831 |       "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
 832 |       "license": "MIT",
 833 |       "engines": {
 834 |         "node": ">= 0.4"
 835 |       },
 836 |       "funding": {
 837 |         "url": "https://github.com/sponsors/ljharb"
 838 |       }
 839 |     },
 840 |     "node_modules/has-symbols": {
 841 |       "version": "1.1.0",
 842 |       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
 843 |       "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
 844 |       "license": "MIT",
 845 |       "engines": {
 846 |         "node": ">= 0.4"
 847 |       },
 848 |       "funding": {
 849 |         "url": "https://github.com/sponsors/ljharb"
 850 |       }
 851 |     },
 852 |     "node_modules/has-tostringtag": {
 853 |       "version": "1.0.2",
 854 |       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
 855 |       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
 856 |       "license": "MIT",
 857 |       "dependencies": {
 858 |         "has-symbols": "^1.0.3"
 859 |       },
 860 |       "engines": {
 861 |         "node": ">= 0.4"
 862 |       },
 863 |       "funding": {
 864 |         "url": "https://github.com/sponsors/ljharb"
 865 |       }
 866 |     },
 867 |     "node_modules/hasown": {
 868 |       "version": "2.0.2",
 869 |       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 870 |       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
 871 |       "license": "MIT",
 872 |       "dependencies": {
 873 |         "function-bind": "^1.1.2"
 874 |       },
 875 |       "engines": {
 876 |         "node": ">= 0.4"
 877 |       }
 878 |     },
 879 |     "node_modules/http-errors": {
 880 |       "version": "2.0.0",
 881 |       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
 882 |       "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
 883 |       "license": "MIT",
 884 |       "dependencies": {
 885 |         "depd": "2.0.0",
 886 |         "inherits": "2.0.4",
 887 |         "setprototypeof": "1.2.0",
 888 |         "statuses": "2.0.1",
 889 |         "toidentifier": "1.0.1"
 890 |       },
 891 |       "engines": {
 892 |         "node": ">= 0.8"
 893 |       }
 894 |     },
 895 |     "node_modules/iconv-lite": {
 896 |       "version": "0.4.24",
 897 |       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 898 |       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 899 |       "license": "MIT",
 900 |       "dependencies": {
 901 |         "safer-buffer": ">= 2.1.2 < 3"
 902 |       },
 903 |       "engines": {
 904 |         "node": ">=0.10.0"
 905 |       }
 906 |     },
 907 |     "node_modules/inherits": {
 908 |       "version": "2.0.4",
 909 |       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
 910 |       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
 911 |       "license": "ISC"
 912 |     },
 913 |     "node_modules/ipaddr.js": {
 914 |       "version": "1.9.1",
 915 |       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 916 |       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
 917 |       "license": "MIT",
 918 |       "engines": {
 919 |         "node": ">= 0.10"
 920 |       }
 921 |     },
 922 |     "node_modules/is-docker": {
 923 |       "version": "3.0.0",
 924 |       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
 925 |       "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
 926 |       "license": "MIT",
 927 |       "bin": {
 928 |         "is-docker": "cli.js"
 929 |       },
 930 |       "engines": {
 931 |         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 932 |       },
 933 |       "funding": {
 934 |         "url": "https://github.com/sponsors/sindresorhus"
 935 |       }
 936 |     },
 937 |     "node_modules/is-inside-container": {
 938 |       "version": "1.0.0",
 939 |       "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
 940 |       "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
 941 |       "license": "MIT",
 942 |       "dependencies": {
 943 |         "is-docker": "^3.0.0"
 944 |       },
 945 |       "bin": {
 946 |         "is-inside-container": "cli.js"
 947 |       },
 948 |       "engines": {
 949 |         "node": ">=14.16"
 950 |       },
 951 |       "funding": {
 952 |         "url": "https://github.com/sponsors/sindresorhus"
 953 |       }
 954 |     },
 955 |     "node_modules/is-wsl": {
 956 |       "version": "3.1.0",
 957 |       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
 958 |       "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
 959 |       "license": "MIT",
 960 |       "dependencies": {
 961 |         "is-inside-container": "^1.0.0"
 962 |       },
 963 |       "engines": {
 964 |         "node": ">=16"
 965 |       },
 966 |       "funding": {
 967 |         "url": "https://github.com/sponsors/sindresorhus"
 968 |       }
 969 |     },
 970 |     "node_modules/make-error": {
 971 |       "version": "1.3.6",
 972 |       "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
 973 |       "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
 974 |       "dev": true,
 975 |       "license": "ISC"
 976 |     },
 977 |     "node_modules/math-intrinsics": {
 978 |       "version": "1.1.0",
 979 |       "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 980 |       "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
 981 |       "license": "MIT",
 982 |       "engines": {
 983 |         "node": ">= 0.4"
 984 |       }
 985 |     },
 986 |     "node_modules/media-typer": {
 987 |       "version": "0.3.0",
 988 |       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
 989 |       "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
 990 |       "license": "MIT",
 991 |       "engines": {
 992 |         "node": ">= 0.6"
 993 |       }
 994 |     },
 995 |     "node_modules/merge-descriptors": {
 996 |       "version": "1.0.3",
 997 |       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
 998 |       "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
 999 |       "license": "MIT",
1000 |       "funding": {
1001 |         "url": "https://github.com/sponsors/sindresorhus"
1002 |       }
1003 |     },
1004 |     "node_modules/methods": {
1005 |       "version": "1.1.2",
1006 |       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1007 |       "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1008 |       "license": "MIT",
1009 |       "engines": {
1010 |         "node": ">= 0.6"
1011 |       }
1012 |     },
1013 |     "node_modules/mime": {
1014 |       "version": "1.6.0",
1015 |       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1016 |       "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1017 |       "license": "MIT",
1018 |       "bin": {
1019 |         "mime": "cli.js"
1020 |       },
1021 |       "engines": {
1022 |         "node": ">=4"
1023 |       }
1024 |     },
1025 |     "node_modules/mime-db": {
1026 |       "version": "1.52.0",
1027 |       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1028 |       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1029 |       "license": "MIT",
1030 |       "engines": {
1031 |         "node": ">= 0.6"
1032 |       }
1033 |     },
1034 |     "node_modules/mime-types": {
1035 |       "version": "2.1.35",
1036 |       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1037 |       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1038 |       "license": "MIT",
1039 |       "dependencies": {
1040 |         "mime-db": "1.52.0"
1041 |       },
1042 |       "engines": {
1043 |         "node": ">= 0.6"
1044 |       }
1045 |     },
1046 |     "node_modules/ms": {
1047 |       "version": "2.0.0",
1048 |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1049 |       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1050 |       "license": "MIT"
1051 |     },
1052 |     "node_modules/negotiator": {
1053 |       "version": "0.6.3",
1054 |       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1055 |       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1056 |       "license": "MIT",
1057 |       "engines": {
1058 |         "node": ">= 0.6"
1059 |       }
1060 |     },
1061 |     "node_modules/object-assign": {
1062 |       "version": "4.1.1",
1063 |       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1064 |       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1065 |       "license": "MIT",
1066 |       "engines": {
1067 |         "node": ">=0.10.0"
1068 |       }
1069 |     },
1070 |     "node_modules/object-inspect": {
1071 |       "version": "1.13.4",
1072 |       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1073 |       "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1074 |       "license": "MIT",
1075 |       "engines": {
1076 |         "node": ">= 0.4"
1077 |       },
1078 |       "funding": {
1079 |         "url": "https://github.com/sponsors/ljharb"
1080 |       }
1081 |     },
1082 |     "node_modules/on-finished": {
1083 |       "version": "2.4.1",
1084 |       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1085 |       "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1086 |       "license": "MIT",
1087 |       "dependencies": {
1088 |         "ee-first": "1.1.1"
1089 |       },
1090 |       "engines": {
1091 |         "node": ">= 0.8"
1092 |       }
1093 |     },
1094 |     "node_modules/open": {
1095 |       "version": "10.1.0",
1096 |       "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
1097 |       "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
1098 |       "license": "MIT",
1099 |       "dependencies": {
1100 |         "default-browser": "^5.2.1",
1101 |         "define-lazy-prop": "^3.0.0",
1102 |         "is-inside-container": "^1.0.0",
1103 |         "is-wsl": "^3.1.0"
1104 |       },
1105 |       "engines": {
1106 |         "node": ">=18"
1107 |       },
1108 |       "funding": {
1109 |         "url": "https://github.com/sponsors/sindresorhus"
1110 |       }
1111 |     },
1112 |     "node_modules/parseurl": {
1113 |       "version": "1.3.3",
1114 |       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1115 |       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1116 |       "license": "MIT",
1117 |       "engines": {
1118 |         "node": ">= 0.8"
1119 |       }
1120 |     },
1121 |     "node_modules/path-to-regexp": {
1122 |       "version": "0.1.12",
1123 |       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
1124 |       "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
1125 |       "license": "MIT"
1126 |     },
1127 |     "node_modules/proxy-addr": {
1128 |       "version": "2.0.7",
1129 |       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1130 |       "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1131 |       "license": "MIT",
1132 |       "dependencies": {
1133 |         "forwarded": "0.2.0",
1134 |         "ipaddr.js": "1.9.1"
1135 |       },
1136 |       "engines": {
1137 |         "node": ">= 0.10"
1138 |       }
1139 |     },
1140 |     "node_modules/proxy-from-env": {
1141 |       "version": "1.1.0",
1142 |       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1143 |       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
1144 |       "license": "MIT"
1145 |     },
1146 |     "node_modules/qs": {
1147 |       "version": "6.13.0",
1148 |       "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
1149 |       "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
1150 |       "license": "BSD-3-Clause",
1151 |       "dependencies": {
1152 |         "side-channel": "^1.0.6"
1153 |       },
1154 |       "engines": {
1155 |         "node": ">=0.6"
1156 |       },
1157 |       "funding": {
1158 |         "url": "https://github.com/sponsors/ljharb"
1159 |       }
1160 |     },
1161 |     "node_modules/querystring": {
1162 |       "version": "0.2.1",
1163 |       "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
1164 |       "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
1165 |       "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
1166 |       "license": "MIT",
1167 |       "engines": {
1168 |         "node": ">=0.4.x"
1169 |       }
1170 |     },
1171 |     "node_modules/range-parser": {
1172 |       "version": "1.2.1",
1173 |       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1174 |       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1175 |       "license": "MIT",
1176 |       "engines": {
1177 |         "node": ">= 0.6"
1178 |       }
1179 |     },
1180 |     "node_modules/raw-body": {
1181 |       "version": "2.5.2",
1182 |       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1183 |       "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1184 |       "license": "MIT",
1185 |       "dependencies": {
1186 |         "bytes": "3.1.2",
1187 |         "http-errors": "2.0.0",
1188 |         "iconv-lite": "0.4.24",
1189 |         "unpipe": "1.0.0"
1190 |       },
1191 |       "engines": {
1192 |         "node": ">= 0.8"
1193 |       }
1194 |     },
1195 |     "node_modules/resolve-pkg-maps": {
1196 |       "version": "1.0.0",
1197 |       "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
1198 |       "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
1199 |       "dev": true,
1200 |       "license": "MIT",
1201 |       "funding": {
1202 |         "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
1203 |       }
1204 |     },
1205 |     "node_modules/run-applescript": {
1206 |       "version": "7.0.0",
1207 |       "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
1208 |       "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
1209 |       "license": "MIT",
1210 |       "engines": {
1211 |         "node": ">=18"
1212 |       },
1213 |       "funding": {
1214 |         "url": "https://github.com/sponsors/sindresorhus"
1215 |       }
1216 |     },
1217 |     "node_modules/safe-buffer": {
1218 |       "version": "5.2.1",
1219 |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1220 |       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1221 |       "funding": [
1222 |         {
1223 |           "type": "github",
1224 |           "url": "https://github.com/sponsors/feross"
1225 |         },
1226 |         {
1227 |           "type": "patreon",
1228 |           "url": "https://www.patreon.com/feross"
1229 |         },
1230 |         {
1231 |           "type": "consulting",
1232 |           "url": "https://feross.org/support"
1233 |         }
1234 |       ],
1235 |       "license": "MIT"
1236 |     },
1237 |     "node_modules/safer-buffer": {
1238 |       "version": "2.1.2",
1239 |       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1240 |       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1241 |       "license": "MIT"
1242 |     },
1243 |     "node_modules/send": {
1244 |       "version": "0.19.0",
1245 |       "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1246 |       "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1247 |       "license": "MIT",
1248 |       "dependencies": {
1249 |         "debug": "2.6.9",
1250 |         "depd": "2.0.0",
1251 |         "destroy": "1.2.0",
1252 |         "encodeurl": "~1.0.2",
1253 |         "escape-html": "~1.0.3",
1254 |         "etag": "~1.8.1",
1255 |         "fresh": "0.5.2",
1256 |         "http-errors": "2.0.0",
1257 |         "mime": "1.6.0",
1258 |         "ms": "2.1.3",
1259 |         "on-finished": "2.4.1",
1260 |         "range-parser": "~1.2.1",
1261 |         "statuses": "2.0.1"
1262 |       },
1263 |       "engines": {
1264 |         "node": ">= 0.8.0"
1265 |       }
1266 |     },
1267 |     "node_modules/send/node_modules/encodeurl": {
1268 |       "version": "1.0.2",
1269 |       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1270 |       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1271 |       "license": "MIT",
1272 |       "engines": {
1273 |         "node": ">= 0.8"
1274 |       }
1275 |     },
1276 |     "node_modules/send/node_modules/ms": {
1277 |       "version": "2.1.3",
1278 |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1279 |       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1280 |       "license": "MIT"
1281 |     },
1282 |     "node_modules/serve-static": {
1283 |       "version": "1.16.2",
1284 |       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1285 |       "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1286 |       "license": "MIT",
1287 |       "dependencies": {
1288 |         "encodeurl": "~2.0.0",
1289 |         "escape-html": "~1.0.3",
1290 |         "parseurl": "~1.3.3",
1291 |         "send": "0.19.0"
1292 |       },
1293 |       "engines": {
1294 |         "node": ">= 0.8.0"
1295 |       }
1296 |     },
1297 |     "node_modules/setprototypeof": {
1298 |       "version": "1.2.0",
1299 |       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1300 |       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1301 |       "license": "ISC"
1302 |     },
1303 |     "node_modules/side-channel": {
1304 |       "version": "1.1.0",
1305 |       "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1306 |       "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1307 |       "license": "MIT",
1308 |       "dependencies": {
1309 |         "es-errors": "^1.3.0",
1310 |         "object-inspect": "^1.13.3",
1311 |         "side-channel-list": "^1.0.0",
1312 |         "side-channel-map": "^1.0.1",
1313 |         "side-channel-weakmap": "^1.0.2"
1314 |       },
1315 |       "engines": {
1316 |         "node": ">= 0.4"
1317 |       },
1318 |       "funding": {
1319 |         "url": "https://github.com/sponsors/ljharb"
1320 |       }
1321 |     },
1322 |     "node_modules/side-channel-list": {
1323 |       "version": "1.0.0",
1324 |       "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1325 |       "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1326 |       "license": "MIT",
1327 |       "dependencies": {
1328 |         "es-errors": "^1.3.0",
1329 |         "object-inspect": "^1.13.3"
1330 |       },
1331 |       "engines": {
1332 |         "node": ">= 0.4"
1333 |       },
1334 |       "funding": {
1335 |         "url": "https://github.com/sponsors/ljharb"
1336 |       }
1337 |     },
1338 |     "node_modules/side-channel-map": {
1339 |       "version": "1.0.1",
1340 |       "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1341 |       "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1342 |       "license": "MIT",
1343 |       "dependencies": {
1344 |         "call-bound": "^1.0.2",
1345 |         "es-errors": "^1.3.0",
1346 |         "get-intrinsic": "^1.2.5",
1347 |         "object-inspect": "^1.13.3"
1348 |       },
1349 |       "engines": {
1350 |         "node": ">= 0.4"
1351 |       },
1352 |       "funding": {
1353 |         "url": "https://github.com/sponsors/ljharb"
1354 |       }
1355 |     },
1356 |     "node_modules/side-channel-weakmap": {
1357 |       "version": "1.0.2",
1358 |       "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1359 |       "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1360 |       "license": "MIT",
1361 |       "dependencies": {
1362 |         "call-bound": "^1.0.2",
1363 |         "es-errors": "^1.3.0",
1364 |         "get-intrinsic": "^1.2.5",
1365 |         "object-inspect": "^1.13.3",
1366 |         "side-channel-map": "^1.0.1"
1367 |       },
1368 |       "engines": {
1369 |         "node": ">= 0.4"
1370 |       },
1371 |       "funding": {
1372 |         "url": "https://github.com/sponsors/ljharb"
1373 |       }
1374 |     },
1375 |     "node_modules/statuses": {
1376 |       "version": "2.0.1",
1377 |       "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1378 |       "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1379 |       "license": "MIT",
1380 |       "engines": {
1381 |         "node": ">= 0.8"
1382 |       }
1383 |     },
1384 |     "node_modules/toidentifier": {
1385 |       "version": "1.0.1",
1386 |       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1387 |       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1388 |       "license": "MIT",
1389 |       "engines": {
1390 |         "node": ">=0.6"
1391 |       }
1392 |     },
1393 |     "node_modules/ts-node": {
1394 |       "version": "10.9.2",
1395 |       "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
1396 |       "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
1397 |       "dev": true,
1398 |       "license": "MIT",
1399 |       "dependencies": {
1400 |         "@cspotcode/source-map-support": "^0.8.0",
1401 |         "@tsconfig/node10": "^1.0.7",
1402 |         "@tsconfig/node12": "^1.0.7",
1403 |         "@tsconfig/node14": "^1.0.0",
1404 |         "@tsconfig/node16": "^1.0.2",
1405 |         "acorn": "^8.4.1",
1406 |         "acorn-walk": "^8.1.1",
1407 |         "arg": "^4.1.0",
1408 |         "create-require": "^1.1.0",
1409 |         "diff": "^4.0.1",
1410 |         "make-error": "^1.1.1",
1411 |         "v8-compile-cache-lib": "^3.0.1",
1412 |         "yn": "3.1.1"
1413 |       },
1414 |       "bin": {
1415 |         "ts-node": "dist/bin.js",
1416 |         "ts-node-cwd": "dist/bin-cwd.js",
1417 |         "ts-node-esm": "dist/bin-esm.js",
1418 |         "ts-node-script": "dist/bin-script.js",
1419 |         "ts-node-transpile-only": "dist/bin-transpile.js",
1420 |         "ts-script": "dist/bin-script-deprecated.js"
1421 |       },
1422 |       "peerDependencies": {
1423 |         "@swc/core": ">=1.2.50",
1424 |         "@swc/wasm": ">=1.2.50",
1425 |         "@types/node": "*",
1426 |         "typescript": ">=2.7"
1427 |       },
1428 |       "peerDependenciesMeta": {
1429 |         "@swc/core": {
1430 |           "optional": true
1431 |         },
1432 |         "@swc/wasm": {
1433 |           "optional": true
1434 |         }
1435 |       }
1436 |     },
1437 |     "node_modules/tsx": {
1438 |       "version": "4.19.3",
1439 |       "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz",
1440 |       "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==",
1441 |       "dev": true,
1442 |       "license": "MIT",
1443 |       "dependencies": {
1444 |         "esbuild": "~0.25.0",
1445 |         "get-tsconfig": "^4.7.5"
1446 |       },
1447 |       "bin": {
1448 |         "tsx": "dist/cli.mjs"
1449 |       },
1450 |       "engines": {
1451 |         "node": ">=18.0.0"
1452 |       },
1453 |       "optionalDependencies": {
1454 |         "fsevents": "~2.3.3"
1455 |       }
1456 |     },
1457 |     "node_modules/type-is": {
1458 |       "version": "1.6.18",
1459 |       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1460 |       "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1461 |       "license": "MIT",
1462 |       "dependencies": {
1463 |         "media-typer": "0.3.0",
1464 |         "mime-types": "~2.1.24"
1465 |       },
1466 |       "engines": {
1467 |         "node": ">= 0.6"
1468 |       }
1469 |     },
1470 |     "node_modules/typescript": {
1471 |       "version": "5.8.2",
1472 |       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
1473 |       "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
1474 |       "dev": true,
1475 |       "license": "Apache-2.0",
1476 |       "bin": {
1477 |         "tsc": "bin/tsc",
1478 |         "tsserver": "bin/tsserver"
1479 |       },
1480 |       "engines": {
1481 |         "node": ">=14.17"
1482 |       }
1483 |     },
1484 |     "node_modules/undici-types": {
1485 |       "version": "6.20.0",
1486 |       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
1487 |       "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
1488 |       "license": "MIT"
1489 |     },
1490 |     "node_modules/unpipe": {
1491 |       "version": "1.0.0",
1492 |       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1493 |       "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1494 |       "license": "MIT",
1495 |       "engines": {
1496 |         "node": ">= 0.8"
1497 |       }
1498 |     },
1499 |     "node_modules/utils-merge": {
1500 |       "version": "1.0.1",
1501 |       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1502 |       "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1503 |       "license": "MIT",
1504 |       "engines": {
1505 |         "node": ">= 0.4.0"
1506 |       }
1507 |     },
1508 |     "node_modules/v8-compile-cache-lib": {
1509 |       "version": "3.0.1",
1510 |       "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
1511 |       "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
1512 |       "dev": true,
1513 |       "license": "MIT"
1514 |     },
1515 |     "node_modules/vary": {
1516 |       "version": "1.1.2",
1517 |       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1518 |       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1519 |       "license": "MIT",
1520 |       "engines": {
1521 |         "node": ">= 0.8"
1522 |       }
1523 |     },
1524 |     "node_modules/yn": {
1525 |       "version": "3.1.1",
1526 |       "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1527 |       "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1528 |       "dev": true,
1529 |       "license": "MIT",
1530 |       "engines": {
1531 |         "node": ">=6"
1532 |       }
1533 |     }
1534 |   }
1535 | }
1536 | 
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # MCP-spotify
2 | Model Context Protocol for running Spotify through Claude
3 | This allows the user to access their playlist information on Spotify through Claude Desktop. This model context protocol is build in 4 files, server.ts containing the main code to be exeuted, resources.ts that contains resources to add to the Claude Desktop, handler.ts containing the handlers for the code and lastly prompt.ts that contains the prompt responses for various prompts.
4 | 
```

--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "spotify-mcp",
 3 |   "version": "1.0.0",
 4 |   "description": "A Model Context Protocol server for accessing Spotify via Claude Desktop.",
 5 |   "type": "module",
 6 |   "scripts": {
 7 |     "start": "npx ts-node src/server.ts",
 8 |     "dev": "npx nodemon src/server.ts",
 9 |     "build": "tsc",
10 |     "serve": "node dist/server.js"
11 |   },
12 |   "dependencies": {
13 |     "axios": "^1.6.0",
14 |     "cors": "^2.8.5",
15 |     "dotenv": "^16.0.3",
16 |     "express": "^4.18.2"
17 |   },
18 |   "devDependencies": {
19 |     "@types/express": "^4.17.14",
20 |     "@types/node": "^18.16.3",
21 |     "nodemon": "^3.0.0",
22 |     "ts-node": "^10.9.1",
23 |     "typescript": "^5.2.2"
24 |   }
25 | }
26 | 
```

--------------------------------------------------------------------------------
/src/prompt.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import axios from "axios";
 2 | 
 3 | // Function to process Claude chatbot queries
 4 | export const handleClaudeQuery = async (userInput: string): Promise<string> => {
 5 |   const searchTypes = ["track", "artist", "album"];
 6 |   let type = "track"; // Default to song search
 7 | 
 8 |   // Determine the type based on user input
 9 |   if (userInput.toLowerCase().includes("artist")) {
10 |     type = "artist";
11 |   } else if (userInput.toLowerCase().includes("album")) {
12 |     type = "album";
13 |   }
14 | 
15 |   try {
16 |     const response = await axios.get(`http://localhost:3000/search`, {
17 |       params: { query: userInput, type: type },
18 |     });
19 | 
20 |     // Extract the first result
21 |     const results = response.data[type + "s"].items;
22 |     if (results.length > 0) {
23 |       return `Found ${type}: ${results[0].name} by ${results[0].artists?.[0]?.name || "Unknown Artist"}`;
24 |     } else {
25 |       return "No results found.";
26 |     }
27 |   } catch (error) {
28 |     console.error("Error processing Claude's query:", error);
29 |     return "There was an issue processing your request.";
30 |   }
31 | };
32 | 
```

--------------------------------------------------------------------------------
/src/server.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import express, { Request, Response } from "express";
 2 | import dotenv from "dotenv";
 3 | import cors from "cors";
 4 | import { getSpotifyToken, searchSpotify, playMusic } from "./handlers.ts";
 5 | 
 6 | dotenv.config();
 7 | 
 8 | const app = express();
 9 | app.use(express.json());
10 | app.use(cors());
11 | 
12 | const PORT = process.env.PORT || 5000;
13 | 
14 | // 🎵 Route: Authenticate & Get Spotify Token
15 | app.get("/auth", async (req, res) => {
16 |   try {
17 |     const token = await getSpotifyToken();
18 |     res.json({ access_token: token });
19 |   } catch (error) {
20 |     res.status(500).json({ error: "Failed to authenticate with Spotify" });
21 |   }
22 | });
23 | 
24 | // 🔍 Route: Search for Songs
25 | app.get("/search", async (req, res) => {
26 |   const { query } = req.query;
27 |   if (!query) res.status(400).json({ error: "Query is required" });
28 | 
29 |   try {
30 |     const results = await searchSpotify(query as string);
31 |     res.json(results);
32 |   } catch (error) {
33 |     res.status(500).json({ error: "Failed to fetch search results" });
34 |   }
35 | });
36 | 
37 | // ▶️ Route: Play a Song (Mock Response for Now)
38 | app.post("/play", async (req, res) => {
39 |   const { songUri } = req.body;
40 |   if (!songUri) res.status(400).json({ error: "Song URI required" });
41 | 
42 |   try {
43 |     const response = await playMusic(songUri);
44 |     res.json(response);
45 |   } catch (error) {
46 |     res.status(500).json({ error: "Failed to play song" });
47 |   }
48 | });
49 | 
50 | app.listen(PORT, () => {
51 |   console.log(`🎧 Spotify MCP Server running on http://localhost:${PORT}`);
52 | });
53 | 
```

--------------------------------------------------------------------------------
/src/handlers.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import axios from "axios";
 2 | import dotenv from "dotenv";
 3 | 
 4 | dotenv.config();
 5 | 
 6 | const SPOTIFY_API = "https://api.spotify.com/v1";
 7 | const CLIENT_ID = process.env.SPOTIFY_CLIENT_ID!;
 8 | const CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET!;
 9 | let ACCESS_TOKEN = "";
10 | 
11 | // 🎵 Function: Get Spotify Access Token
12 | export async function getSpotifyToken(): Promise<string> {
13 |   try {
14 |     const response = await axios.post(
15 |       "https://accounts.spotify.com/api/token",
16 |       new URLSearchParams({ grant_type: "client_credentials" }),
17 |       {
18 |         headers: {
19 |           Authorization: `Basic ${Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString("base64")}`,
20 |           "Content-Type": "application/x-www-form-urlencoded",
21 |         },
22 |       }
23 |     );
24 |     ACCESS_TOKEN = response.data.access_token;
25 |     return ACCESS_TOKEN;
26 |   } catch (error) {
27 |     throw new Error("Error getting Spotify token");
28 |   }
29 | }
30 | 
31 | // 🔍 Function: Search for Songs on Spotify
32 | export async function searchSpotify(query: string) {
33 |   if (!ACCESS_TOKEN) await getSpotifyToken();
34 |   
35 |   try {
36 |     const response = await axios.get(`${SPOTIFY_API}/search`, {
37 |       headers: { Authorization: `Bearer ${ACCESS_TOKEN}` },
38 |       params: { q: query, type: "track", limit: 10 },
39 |     });
40 | 
41 |     return response.data.tracks.items.map((track: any) => ({
42 |       name: track.name,
43 |       artist: track.artists.map((a: any) => a.name).join(", "),
44 |       album: track.album.name,
45 |       uri: track.uri,
46 |     }));
47 |   } catch (error) {
48 |     throw new Error("Error searching Spotify");
49 |   }
50 | }
51 | 
52 | // ▶️ Function: Play Music (Mock Response)
53 | export async function playMusic(songUri: string) {
54 |   if (!ACCESS_TOKEN) await getSpotifyToken();
55 | 
56 |   // 🚀 Real implementation would require Spotify Premium & User Authentication
57 |   return { message: `Playing song: ${songUri} (Mock Response - Requires User Token)` };
58 | }
59 | 
```

--------------------------------------------------------------------------------
/src/resource.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import axios from "axios";
 2 | import dotenv from "dotenv";
 3 | import querystring from "querystring";
 4 | 
 5 | dotenv.config();
 6 | 
 7 | const SPOTIFY_ACCOUNTS_URL = "https://accounts.spotify.com/api/token";
 8 | const SPOTIFY_API_URL = "https://api.spotify.com/v1";
 9 | 
10 | let accessToken = "";
11 | let refreshToken = "";
12 | 
13 | // Function to get a new access token
14 | export const getAccessToken = async (code: string): Promise<void> => {
15 |   try {
16 |     const response = await axios.post(
17 |       SPOTIFY_ACCOUNTS_URL,
18 |       querystring.stringify({
19 |         grant_type: "authorization_code",
20 |         code: code,
21 |         redirect_uri: process.env.SPOTIFY_REDIRECT_URI,
22 |         client_id: process.env.SPOTIFY_CLIENT_ID,
23 |         client_secret: process.env.SPOTIFY_CLIENT_SECRET,
24 |       }),
25 |       { headers: { "Content-Type": "application/x-www-form-urlencoded" } }
26 |     );
27 | 
28 |     accessToken = response.data.access_token;
29 |     refreshToken = response.data.refresh_token;
30 |   } catch (error) {
31 |     console.error("Error getting access token:", error);
32 |   }
33 | };
34 | 
35 | // Function to refresh the access token
36 | export const refreshAccessToken = async (): Promise<void> => {
37 |   try {
38 |     const response = await axios.post(
39 |       SPOTIFY_ACCOUNTS_URL,
40 |       querystring.stringify({
41 |         grant_type: "refresh_token",
42 |         refresh_token: refreshToken,
43 |         client_id: process.env.SPOTIFY_CLIENT_ID,
44 |         client_secret: process.env.SPOTIFY_CLIENT_SECRET,
45 |       }),
46 |       { headers: { "Content-Type": "application/x-www-form-urlencoded" } }
47 |     );
48 | 
49 |     accessToken = response.data.access_token;
50 |   } catch (error) {
51 |     console.error("Failed to refresh token:", error);
52 |   }
53 | };
54 | 
55 | // Function to search for songs, artists, or albums
56 | export const searchSpotify = async (query: string, type: string): Promise<any> => {
57 |   if (!accessToken) {
58 |     throw new Error("Access token is missing. Authenticate first.");
59 |   }
60 | 
61 |   try {
62 |     const response = await axios.get(`${SPOTIFY_API_URL}/search`, {
63 |       headers: { Authorization: `Bearer ${accessToken}` },
64 |       params: { q: query, type: type, limit: 5 },
65 |     });
66 | 
67 |     return response.data;
68 |   } catch (error) {
69 |     console.error("Spotify search error:", error);
70 |     throw new Error("Failed to fetch data from Spotify");
71 |   }
72 | };
73 | 
```

--------------------------------------------------------------------------------
/src/server.js:
--------------------------------------------------------------------------------

```javascript
  1 | "use strict";
  2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  3 |     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  4 |     return new (P || (P = Promise))(function (resolve, reject) {
  5 |         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  6 |         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  7 |         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  8 |         step((generator = generator.apply(thisArg, _arguments || [])).next());
  9 |     });
 10 | };
 11 | var __generator = (this && this.__generator) || function (thisArg, body) {
 12 |     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
 13 |     return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
 14 |     function verb(n) { return function (v) { return step([n, v]); }; }
 15 |     function step(op) {
 16 |         if (f) throw new TypeError("Generator is already executing.");
 17 |         while (g && (g = 0, op[0] && (_ = 0)), _) try {
 18 |             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
 19 |             if (y = 0, t) op = [op[0] & 2, t.value];
 20 |             switch (op[0]) {
 21 |                 case 0: case 1: t = op; break;
 22 |                 case 4: _.label++; return { value: op[1], done: false };
 23 |                 case 5: _.label++; y = op[1]; op = [0]; continue;
 24 |                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
 25 |                 default:
 26 |                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
 27 |                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
 28 |                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
 29 |                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
 30 |                     if (t[2]) _.ops.pop();
 31 |                     _.trys.pop(); continue;
 32 |             }
 33 |             op = body.call(thisArg, _);
 34 |         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
 35 |         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
 36 |     }
 37 | };
 38 | Object.defineProperty(exports, "__esModule", { value: true });
 39 | var express_1 = require("express");
 40 | var dotenv_1 = require("dotenv");
 41 | var cors_1 = require("cors");
 42 | var handlers_ts_1 = require("./handlers.ts");
 43 | dotenv_1.default.config();
 44 | var app = (0, express_1.default)();
 45 | app.use(express_1.default.json());
 46 | app.use((0, cors_1.default)());
 47 | var PORT = process.env.PORT || 5000;
 48 | // 🎵 Route: Authenticate & Get Spotify Token
 49 | app.get("/auth", function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
 50 |     var token, error_1;
 51 |     return __generator(this, function (_a) {
 52 |         switch (_a.label) {
 53 |             case 0:
 54 |                 _a.trys.push([0, 2, , 3]);
 55 |                 return [4 /*yield*/, (0, handlers_ts_1.getSpotifyToken)()];
 56 |             case 1:
 57 |                 token = _a.sent();
 58 |                 res.json({ access_token: token });
 59 |                 return [3 /*break*/, 3];
 60 |             case 2:
 61 |                 error_1 = _a.sent();
 62 |                 res.status(500).json({ error: "Failed to authenticate with Spotify" });
 63 |                 return [3 /*break*/, 3];
 64 |             case 3: return [2 /*return*/];
 65 |         }
 66 |     });
 67 | }); });
 68 | // 🔍 Route: Search for Songs
 69 | app.get("/search", function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
 70 |     var query, results, error_2;
 71 |     return __generator(this, function (_a) {
 72 |         switch (_a.label) {
 73 |             case 0:
 74 |                 query = req.query.query;
 75 |                 if (!query)
 76 |                     res.status(400).json({ error: "Query is required" });
 77 |                 _a.label = 1;
 78 |             case 1:
 79 |                 _a.trys.push([1, 3, , 4]);
 80 |                 return [4 /*yield*/, (0, handlers_ts_1.searchSpotify)(query)];
 81 |             case 2:
 82 |                 results = _a.sent();
 83 |                 res.json(results);
 84 |                 return [3 /*break*/, 4];
 85 |             case 3:
 86 |                 error_2 = _a.sent();
 87 |                 res.status(500).json({ error: "Failed to fetch search results" });
 88 |                 return [3 /*break*/, 4];
 89 |             case 4: return [2 /*return*/];
 90 |         }
 91 |     });
 92 | }); });
 93 | // ▶️ Route: Play a Song (Mock Response for Now)
 94 | app.post("/play", function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
 95 |     var songUri, response, error_3;
 96 |     return __generator(this, function (_a) {
 97 |         switch (_a.label) {
 98 |             case 0:
 99 |                 songUri = req.body.songUri;
100 |                 if (!songUri)
101 |                     res.status(400).json({ error: "Song URI required" });
102 |                 _a.label = 1;
103 |             case 1:
104 |                 _a.trys.push([1, 3, , 4]);
105 |                 return [4 /*yield*/, (0, handlers_ts_1.playMusic)(songUri)];
106 |             case 2:
107 |                 response = _a.sent();
108 |                 res.json(response);
109 |                 return [3 /*break*/, 4];
110 |             case 3:
111 |                 error_3 = _a.sent();
112 |                 res.status(500).json({ error: "Failed to play song" });
113 |                 return [3 /*break*/, 4];
114 |             case 4: return [2 /*return*/];
115 |         }
116 |     });
117 | }); });
118 | app.listen(PORT, function () {
119 |     console.log("\uD83C\uDFA7 Spotify MCP Server running on http://localhost:".concat(PORT));
120 | });
121 | 
```

--------------------------------------------------------------------------------
/src/handlers.js:
--------------------------------------------------------------------------------

```javascript
  1 | "use strict";
  2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  3 |     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  4 |     return new (P || (P = Promise))(function (resolve, reject) {
  5 |         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  6 |         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  7 |         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  8 |         step((generator = generator.apply(thisArg, _arguments || [])).next());
  9 |     });
 10 | };
 11 | var __generator = (this && this.__generator) || function (thisArg, body) {
 12 |     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
 13 |     return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
 14 |     function verb(n) { return function (v) { return step([n, v]); }; }
 15 |     function step(op) {
 16 |         if (f) throw new TypeError("Generator is already executing.");
 17 |         while (g && (g = 0, op[0] && (_ = 0)), _) try {
 18 |             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
 19 |             if (y = 0, t) op = [op[0] & 2, t.value];
 20 |             switch (op[0]) {
 21 |                 case 0: case 1: t = op; break;
 22 |                 case 4: _.label++; return { value: op[1], done: false };
 23 |                 case 5: _.label++; y = op[1]; op = [0]; continue;
 24 |                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
 25 |                 default:
 26 |                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
 27 |                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
 28 |                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
 29 |                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
 30 |                     if (t[2]) _.ops.pop();
 31 |                     _.trys.pop(); continue;
 32 |             }
 33 |             op = body.call(thisArg, _);
 34 |         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
 35 |         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
 36 |     }
 37 | };
 38 | Object.defineProperty(exports, "__esModule", { value: true });
 39 | exports.getSpotifyToken = getSpotifyToken;
 40 | exports.searchSpotify = searchSpotify;
 41 | exports.playMusic = playMusic;
 42 | var axios_1 = require("axios");
 43 | var dotenv_1 = require("dotenv");
 44 | dotenv_1.default.config();
 45 | var SPOTIFY_API = "https://api.spotify.com/v1";
 46 | var CLIENT_ID = process.env.SPOTIFY_CLIENT_ID;
 47 | var CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET;
 48 | var ACCESS_TOKEN = "";
 49 | // 🎵 Function: Get Spotify Access Token
 50 | function getSpotifyToken() {
 51 |     return __awaiter(this, void 0, void 0, function () {
 52 |         var response, error_1;
 53 |         return __generator(this, function (_a) {
 54 |             switch (_a.label) {
 55 |                 case 0:
 56 |                     _a.trys.push([0, 2, , 3]);
 57 |                     return [4 /*yield*/, axios_1.default.post("https://accounts.spotify.com/api/token", new URLSearchParams({ grant_type: "client_credentials" }), {
 58 |                             headers: {
 59 |                                 Authorization: "Basic ".concat(Buffer.from("".concat(CLIENT_ID, ":").concat(CLIENT_SECRET)).toString("base64")),
 60 |                                 "Content-Type": "application/x-www-form-urlencoded",
 61 |                             },
 62 |                         })];
 63 |                 case 1:
 64 |                     response = _a.sent();
 65 |                     ACCESS_TOKEN = response.data.access_token;
 66 |                     return [2 /*return*/, ACCESS_TOKEN];
 67 |                 case 2:
 68 |                     error_1 = _a.sent();
 69 |                     throw new Error("Error getting Spotify token");
 70 |                 case 3: return [2 /*return*/];
 71 |             }
 72 |         });
 73 |     });
 74 | }
 75 | // 🔍 Function: Search for Songs on Spotify
 76 | function searchSpotify(query) {
 77 |     return __awaiter(this, void 0, void 0, function () {
 78 |         var response, error_2;
 79 |         return __generator(this, function (_a) {
 80 |             switch (_a.label) {
 81 |                 case 0:
 82 |                     if (!!ACCESS_TOKEN) return [3 /*break*/, 2];
 83 |                     return [4 /*yield*/, getSpotifyToken()];
 84 |                 case 1:
 85 |                     _a.sent();
 86 |                     _a.label = 2;
 87 |                 case 2:
 88 |                     _a.trys.push([2, 4, , 5]);
 89 |                     return [4 /*yield*/, axios_1.default.get("".concat(SPOTIFY_API, "/search"), {
 90 |                             headers: { Authorization: "Bearer ".concat(ACCESS_TOKEN) },
 91 |                             params: { q: query, type: "track", limit: 10 },
 92 |                         })];
 93 |                 case 3:
 94 |                     response = _a.sent();
 95 |                     return [2 /*return*/, response.data.tracks.items.map(function (track) { return ({
 96 |                             name: track.name,
 97 |                             artist: track.artists.map(function (a) { return a.name; }).join(", "),
 98 |                             album: track.album.name,
 99 |                             uri: track.uri,
100 |                         }); })];
101 |                 case 4:
102 |                     error_2 = _a.sent();
103 |                     throw new Error("Error searching Spotify");
104 |                 case 5: return [2 /*return*/];
105 |             }
106 |         });
107 |     });
108 | }
109 | // ▶️ Function: Play Music (Mock Response)
110 | function playMusic(songUri) {
111 |     return __awaiter(this, void 0, void 0, function () {
112 |         return __generator(this, function (_a) {
113 |             switch (_a.label) {
114 |                 case 0:
115 |                     if (!!ACCESS_TOKEN) return [3 /*break*/, 2];
116 |                     return [4 /*yield*/, getSpotifyToken()];
117 |                 case 1:
118 |                     _a.sent();
119 |                     _a.label = 2;
120 |                 case 2: 
121 |                 // 🚀 Real implementation would require Spotify Premium & User Authentication
122 |                 return [2 /*return*/, { message: "Playing song: ".concat(songUri, " (Mock Response - Requires User Token)") }];
123 |             }
124 |         });
125 |     });
126 | }
127 | 
```

--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------

```json
  1 | {
  2 |   "compilerOptions": {
  3 |     /* Visit https://aka.ms/tsconfig to read more about this file */
  4 | 
  5 |     /* Projects */
  6 |     // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
  7 |     // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
  8 |     // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */
  9 |     // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */
 10 |     // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
 11 |     // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */
 12 | 
 13 |     /* Language and Environment */
 14 |     "target": "es2016",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
 15 |     // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */
 16 |     // "jsx": "preserve",                                /* Specify what JSX code is generated. */
 17 |     // "libReplacement": true,                           /* Enable lib replacement. */
 18 |     // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */
 19 |     // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
 20 |     // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
 21 |     // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
 22 |     // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
 23 |     // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
 24 |     // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
 25 |     // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
 26 |     // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */
 27 | 
 28 |     /* Modules */
 29 |     "module": "commonjs",                                /* Specify what module code is generated. */
 30 |     // "rootDir": "./",                                  /* Specify the root folder within your source files. */
 31 |     // "moduleResolution": "node10",                     /* Specify how TypeScript looks up a file from a given module specifier. */
 32 |     // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
 33 |     // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
 34 |     // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
 35 |     // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */
 36 |     // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */
 37 |     // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
 38 |     // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */
 39 |     // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
 40 |     // "rewriteRelativeImportExtensions": true,          /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
 41 |     // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */
 42 |     // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */
 43 |     // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
 44 |     // "noUncheckedSideEffectImports": true,             /* Check side effect imports. */
 45 |     // "resolveJsonModule": true,                        /* Enable importing .json files. */
 46 |     // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */
 47 |     // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
 48 | 
 49 |     /* JavaScript Support */
 50 |     // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
 51 |     // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
 52 |     // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
 53 | 
 54 |     /* Emit */
 55 |     // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
 56 |     // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
 57 |     // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
 58 |     // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
 59 |     // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
 60 |     // "noEmit": true,                                   /* Disable emitting files from a compilation. */
 61 |     // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
 62 |     // "outDir": "./",                                   /* Specify an output folder for all emitted files. */
 63 |     // "removeComments": true,                           /* Disable emitting comments. */
 64 |     // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
 65 |     // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
 66 |     // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
 67 |     // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
 68 |     // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
 69 |     // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
 70 |     // "newLine": "crlf",                                /* Set the newline character for emitting files. */
 71 |     // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
 72 |     // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */
 73 |     // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
 74 |     // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */
 75 |     // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
 76 | 
 77 |     /* Interop Constraints */
 78 |     // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
 79 |     // "verbatimModuleSyntax": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
 80 |     // "isolatedDeclarations": true,                     /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
 81 |     // "erasableSyntaxOnly": true,                       /* Do not allow runtime constructs that are not part of ECMAScript. */
 82 |     // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
 83 |     "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
 84 |     // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
 85 |     "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */
 86 | 
 87 |     /* Type Checking */
 88 |     "strict": true,                                      /* Enable all strict type-checking options. */
 89 |     // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */
 90 |     // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */
 91 |     // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
 92 |     // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
 93 |     // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */
 94 |     // "strictBuiltinIteratorReturn": true,              /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
 95 |     // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */
 96 |     // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */
 97 |     // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
 98 |     // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */
 99 |     // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */
100 |     // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
101 |     // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
102 |     // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
103 |     // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */
104 |     // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
105 |     // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */
106 |     // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
107 |     // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
108 | 
109 |     /* Completeness */
110 |     // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
111 |     "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
112 |   }
113 | }
114 | 
```