# Directory Structure ``` ├── .gitignore ├── build │ ├── index.d.ts │ ├── index.js │ └── index.js.map ├── LICENSE ├── node_modules │ ├── .bin │ │ ├── node-which │ │ ├── nodemon │ │ ├── nodetouch │ │ ├── semver │ │ ├── tsc │ │ └── tsserver │ ├── .package-lock.json │ ├── @modelcontextprotocol │ │ └── sdk │ │ ├── dist │ │ │ ├── cjs │ │ │ │ ├── cli.d.ts │ │ │ │ ├── cli.d.ts.map │ │ │ │ ├── cli.js │ │ │ │ ├── cli.js.map │ │ │ │ ├── client │ │ │ │ │ ├── auth.d.ts │ │ │ │ │ ├── auth.d.ts.map │ │ │ │ │ ├── auth.js │ │ │ │ │ ├── auth.js.map │ │ │ │ │ ├── index.d.ts │ │ │ │ │ ├── index.d.ts.map │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index.js.map │ │ │ │ │ ├── sse.d.ts │ │ │ │ │ ├── sse.d.ts.map │ │ │ │ │ ├── sse.js │ │ │ │ │ ├── sse.js.map │ │ │ │ │ ├── stdio.d.ts │ │ │ │ │ ├── stdio.d.ts.map │ │ │ │ │ ├── stdio.js │ │ │ │ │ ├── stdio.js.map │ │ │ │ │ ├── websocket.d.ts │ │ │ │ │ ├── websocket.d.ts.map │ │ │ │ │ ├── websocket.js │ │ │ │ │ └── websocket.js.map │ │ │ │ ├── inMemory.d.ts │ │ │ │ ├── inMemory.d.ts.map │ │ │ │ ├── inMemory.js │ │ │ │ ├── inMemory.js.map │ │ │ │ ├── package.json │ │ │ │ ├── server │ │ │ │ │ ├── auth │ │ │ │ │ │ ├── clients.d.ts │ │ │ │ │ │ ├── clients.d.ts.map │ │ │ │ │ │ ├── clients.js │ │ │ │ │ │ ├── clients.js.map │ │ │ │ │ │ ├── errors.d.ts │ │ │ │ │ │ ├── errors.d.ts.map │ │ │ │ │ │ ├── errors.js │ │ │ │ │ │ ├── errors.js.map │ │ │ │ │ │ ├── handlers │ │ │ │ │ │ │ ├── authorize.d.ts │ │ │ │ │ │ │ ├── authorize.d.ts.map │ │ │ │ │ │ │ ├── authorize.js │ │ │ │ │ │ │ ├── authorize.js.map │ │ │ │ │ │ │ ├── metadata.d.ts │ │ │ │ │ │ │ ├── metadata.d.ts.map │ │ │ │ │ │ │ ├── metadata.js │ │ │ │ │ │ │ ├── metadata.js.map │ │ │ │ │ │ │ ├── register.d.ts │ │ │ │ │ │ │ ├── register.d.ts.map │ │ │ │ │ │ │ ├── register.js │ │ │ │ │ │ │ ├── register.js.map │ │ │ │ │ │ │ ├── revoke.d.ts │ │ │ │ │ │ │ ├── revoke.d.ts.map │ │ │ │ │ │ │ ├── revoke.js │ │ │ │ │ │ │ ├── revoke.js.map │ │ │ │ │ │ │ ├── token.d.ts │ │ │ │ │ │ │ ├── token.d.ts.map │ │ │ │ │ │ │ ├── token.js │ │ │ │ │ │ │ └── token.js.map │ │ │ │ │ │ ├── middleware │ │ │ │ │ │ │ ├── allowedMethods.d.ts │ │ │ │ │ │ │ ├── allowedMethods.d.ts.map │ │ │ │ │ │ │ ├── allowedMethods.js │ │ │ │ │ │ │ ├── allowedMethods.js.map │ │ │ │ │ │ │ ├── bearerAuth.d.ts │ │ │ │ │ │ │ ├── bearerAuth.d.ts.map │ │ │ │ │ │ │ ├── bearerAuth.js │ │ │ │ │ │ │ ├── bearerAuth.js.map │ │ │ │ │ │ │ ├── clientAuth.d.ts │ │ │ │ │ │ │ ├── clientAuth.d.ts.map │ │ │ │ │ │ │ ├── clientAuth.js │ │ │ │ │ │ │ └── clientAuth.js.map │ │ │ │ │ │ ├── provider.d.ts │ │ │ │ │ │ ├── provider.d.ts.map │ │ │ │ │ │ ├── provider.js │ │ │ │ │ │ ├── provider.js.map │ │ │ │ │ │ ├── providers │ │ │ │ │ │ │ ├── proxyProvider.d.ts │ │ │ │ │ │ │ ├── proxyProvider.d.ts.map │ │ │ │ │ │ │ ├── proxyProvider.js │ │ │ │ │ │ │ └── proxyProvider.js.map │ │ │ │ │ │ ├── router.d.ts │ │ │ │ │ │ ├── router.d.ts.map │ │ │ │ │ │ ├── router.js │ │ │ │ │ │ ├── router.js.map │ │ │ │ │ │ ├── types.d.ts │ │ │ │ │ │ ├── types.d.ts.map │ │ │ │ │ │ ├── types.js │ │ │ │ │ │ └── types.js.map │ │ │ │ │ ├── completable.d.ts │ │ │ │ │ ├── completable.d.ts.map │ │ │ │ │ ├── completable.js │ │ │ │ │ ├── completable.js.map │ │ │ │ │ ├── index.d.ts │ │ │ │ │ ├── index.d.ts.map │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index.js.map │ │ │ │ │ ├── mcp.d.ts │ │ │ │ │ ├── mcp.d.ts.map │ │ │ │ │ ├── mcp.js │ │ │ │ │ ├── mcp.js.map │ │ │ │ │ ├── sse.d.ts │ │ │ │ │ ├── sse.d.ts.map │ │ │ │ │ ├── sse.js │ │ │ │ │ ├── sse.js.map │ │ │ │ │ ├── stdio.d.ts │ │ │ │ │ ├── stdio.d.ts.map │ │ │ │ │ ├── stdio.js │ │ │ │ │ └── stdio.js.map │ │ │ │ ├── shared │ │ │ │ │ ├── auth.d.ts │ │ │ │ │ ├── auth.d.ts.map │ │ │ │ │ ├── auth.js │ │ │ │ │ ├── auth.js.map │ │ │ │ │ ├── protocol.d.ts │ │ │ │ │ ├── protocol.d.ts.map │ │ │ │ │ ├── protocol.js │ │ │ │ │ ├── protocol.js.map │ │ │ │ │ ├── stdio.d.ts │ │ │ │ │ ├── stdio.d.ts.map │ │ │ │ │ ├── stdio.js │ │ │ │ │ ├── stdio.js.map │ │ │ │ │ ├── transport.d.ts │ │ │ │ │ ├── transport.d.ts.map │ │ │ │ │ ├── transport.js │ │ │ │ │ ├── transport.js.map │ │ │ │ │ ├── uriTemplate.d.ts │ │ │ │ │ ├── uriTemplate.d.ts.map │ │ │ │ │ ├── uriTemplate.js │ │ │ │ │ └── uriTemplate.js.map │ │ │ │ ├── types.d.ts │ │ │ │ ├── types.d.ts.map │ │ │ │ ├── types.js │ │ │ │ └── types.js.map │ │ │ └── esm │ │ │ ├── cli.d.ts │ │ │ ├── cli.d.ts.map │ │ │ ├── cli.js │ │ │ ├── cli.js.map │ │ │ ├── client │ │ │ │ ├── auth.d.ts │ │ │ │ ├── auth.d.ts.map │ │ │ │ ├── auth.js │ │ │ │ ├── auth.js.map │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.d.ts.map │ │ │ │ ├── index.js │ │ │ │ ├── index.js.map │ │ │ │ ├── sse.d.ts │ │ │ │ ├── sse.d.ts.map │ │ │ │ ├── sse.js │ │ │ │ ├── sse.js.map │ │ │ │ ├── stdio.d.ts │ │ │ │ ├── stdio.d.ts.map │ │ │ │ ├── stdio.js │ │ │ │ ├── stdio.js.map │ │ │ │ ├── websocket.d.ts │ │ │ │ ├── websocket.d.ts.map │ │ │ │ ├── websocket.js │ │ │ │ └── websocket.js.map │ │ │ ├── inMemory.d.ts │ │ │ ├── inMemory.d.ts.map │ │ │ ├── inMemory.js │ │ │ ├── inMemory.js.map │ │ │ ├── package.json │ │ │ ├── server │ │ │ │ ├── auth │ │ │ │ │ ├── clients.d.ts │ │ │ │ │ ├── clients.d.ts.map │ │ │ │ │ ├── clients.js │ │ │ │ │ ├── clients.js.map │ │ │ │ │ ├── errors.d.ts │ │ │ │ │ ├── errors.d.ts.map │ │ │ │ │ ├── errors.js │ │ │ │ │ ├── errors.js.map │ │ │ │ │ ├── handlers │ │ │ │ │ │ ├── authorize.d.ts │ │ │ │ │ │ ├── authorize.d.ts.map │ │ │ │ │ │ ├── authorize.js │ │ │ │ │ │ ├── authorize.js.map │ │ │ │ │ │ ├── metadata.d.ts │ │ │ │ │ │ ├── metadata.d.ts.map │ │ │ │ │ │ ├── metadata.js │ │ │ │ │ │ ├── metadata.js.map │ │ │ │ │ │ ├── register.d.ts │ │ │ │ │ │ ├── register.d.ts.map │ │ │ │ │ │ ├── register.js │ │ │ │ │ │ ├── register.js.map │ │ │ │ │ │ ├── revoke.d.ts │ │ │ │ │ │ ├── revoke.d.ts.map │ │ │ │ │ │ ├── revoke.js │ │ │ │ │ │ ├── revoke.js.map │ │ │ │ │ │ ├── token.d.ts │ │ │ │ │ │ ├── token.d.ts.map │ │ │ │ │ │ ├── token.js │ │ │ │ │ │ └── token.js.map │ │ │ │ │ ├── middleware │ │ │ │ │ │ ├── allowedMethods.d.ts │ │ │ │ │ │ ├── allowedMethods.d.ts.map │ │ │ │ │ │ ├── allowedMethods.js │ │ │ │ │ │ ├── allowedMethods.js.map │ │ │ │ │ │ ├── bearerAuth.d.ts │ │ │ │ │ │ ├── bearerAuth.d.ts.map │ │ │ │ │ │ ├── bearerAuth.js │ │ │ │ │ │ ├── bearerAuth.js.map │ │ │ │ │ │ ├── clientAuth.d.ts │ │ │ │ │ │ ├── clientAuth.d.ts.map │ │ │ │ │ │ ├── clientAuth.js │ │ │ │ │ │ └── clientAuth.js.map │ │ │ │ │ ├── provider.d.ts │ │ │ │ │ ├── provider.d.ts.map │ │ │ │ │ ├── provider.js │ │ │ │ │ ├── provider.js.map │ │ │ │ │ ├── providers │ │ │ │ │ │ ├── proxyProvider.d.ts │ │ │ │ │ │ ├── proxyProvider.d.ts.map │ │ │ │ │ │ ├── proxyProvider.js │ │ │ │ │ │ └── proxyProvider.js.map │ │ │ │ │ ├── router.d.ts │ │ │ │ │ ├── router.d.ts.map │ │ │ │ │ ├── router.js │ │ │ │ │ ├── router.js.map │ │ │ │ │ ├── types.d.ts │ │ │ │ │ ├── types.d.ts.map │ │ │ │ │ ├── types.js │ │ │ │ │ └── types.js.map │ │ │ │ ├── completable.d.ts │ │ │ │ ├── completable.d.ts.map │ │ │ │ ├── completable.js │ │ │ │ ├── completable.js.map │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.d.ts.map │ │ │ │ ├── index.js │ │ │ │ ├── index.js.map │ │ │ │ ├── mcp.d.ts │ │ │ │ ├── mcp.d.ts.map │ │ │ │ ├── mcp.js │ │ │ │ ├── mcp.js.map │ │ │ │ ├── sse.d.ts │ │ │ │ ├── sse.d.ts.map │ │ │ │ ├── sse.js │ │ │ │ ├── sse.js.map │ │ │ │ ├── stdio.d.ts │ │ │ │ ├── stdio.d.ts.map │ │ │ │ ├── stdio.js │ │ │ │ └── stdio.js.map │ │ │ ├── shared │ │ │ │ ├── auth.d.ts │ │ │ │ ├── auth.d.ts.map │ │ │ │ ├── auth.js │ │ │ │ ├── auth.js.map │ │ │ │ ├── protocol.d.ts │ │ │ │ ├── protocol.d.ts.map │ │ │ │ ├── protocol.js │ │ │ │ ├── protocol.js.map │ │ │ │ ├── stdio.d.ts │ │ │ │ ├── stdio.d.ts.map │ │ │ │ ├── stdio.js │ │ │ │ ├── stdio.js.map │ │ │ │ ├── transport.d.ts │ │ │ │ ├── transport.d.ts.map │ │ │ │ ├── transport.js │ │ │ │ ├── transport.js.map │ │ │ │ ├── uriTemplate.d.ts │ │ │ │ ├── uriTemplate.d.ts.map │ │ │ │ ├── uriTemplate.js │ │ │ │ └── uriTemplate.js.map │ │ │ ├── types.d.ts │ │ │ ├── types.d.ts.map │ │ │ ├── types.js │ │ │ └── types.js.map │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── @types │ │ └── node │ │ ├── assert │ │ │ └── strict.d.ts │ │ ├── assert.d.ts │ │ ├── async_hooks.d.ts │ │ ├── buffer.buffer.d.ts │ │ ├── buffer.d.ts │ │ ├── child_process.d.ts │ │ ├── cluster.d.ts │ │ ├── compatibility │ │ │ ├── disposable.d.ts │ │ │ ├── index.d.ts │ │ │ ├── indexable.d.ts │ │ │ └── iterators.d.ts │ │ ├── console.d.ts │ │ ├── constants.d.ts │ │ ├── crypto.d.ts │ │ ├── dgram.d.ts │ │ ├── diagnostics_channel.d.ts │ │ ├── dns │ │ │ └── promises.d.ts │ │ ├── dns.d.ts │ │ ├── dom-events.d.ts │ │ ├── domain.d.ts │ │ ├── events.d.ts │ │ ├── fs │ │ │ └── promises.d.ts │ │ ├── fs.d.ts │ │ ├── globals.d.ts │ │ ├── globals.typedarray.d.ts │ │ ├── http.d.ts │ │ ├── http2.d.ts │ │ ├── https.d.ts │ │ ├── index.d.ts │ │ ├── inspector.d.ts │ │ ├── LICENSE │ │ ├── module.d.ts │ │ ├── net.d.ts │ │ ├── os.d.ts │ │ ├── package.json │ │ ├── path.d.ts │ │ ├── perf_hooks.d.ts │ │ ├── process.d.ts │ │ ├── punycode.d.ts │ │ ├── querystring.d.ts │ │ ├── readline │ │ │ └── promises.d.ts │ │ ├── readline.d.ts │ │ ├── README.md │ │ ├── repl.d.ts │ │ ├── sea.d.ts │ │ ├── stream │ │ │ ├── consumers.d.ts │ │ │ ├── promises.d.ts │ │ │ └── web.d.ts │ │ ├── stream.d.ts │ │ ├── string_decoder.d.ts │ │ ├── test.d.ts │ │ ├── timers │ │ │ └── promises.d.ts │ │ ├── timers.d.ts │ │ ├── tls.d.ts │ │ ├── trace_events.d.ts │ │ ├── ts5.6 │ │ │ ├── buffer.buffer.d.ts │ │ │ ├── globals.typedarray.d.ts │ │ │ └── index.d.ts │ │ ├── tty.d.ts │ │ ├── url.d.ts │ │ ├── util.d.ts │ │ ├── v8.d.ts │ │ ├── vm.d.ts │ │ ├── wasi.d.ts │ │ ├── worker_threads.d.ts │ │ └── zlib.d.ts │ ├── accepts │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── node_modules │ │ │ ├── mime-db │ │ │ │ ├── db.json │ │ │ │ ├── HISTORY.md │ │ │ │ ├── index.js │ │ │ │ ├── LICENSE │ │ │ │ ├── package.json │ │ │ │ └── README.md │ │ │ └── mime-types │ │ │ ├── HISTORY.md │ │ │ ├── index.js │ │ │ ├── LICENSE │ │ │ ├── mimeScore.js │ │ │ ├── package.json │ │ │ └── README.md │ │ ├── package.json │ │ └── README.md │ ├── anymatch │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── asynckit │ │ ├── bench.js │ │ ├── index.js │ │ ├── lib │ │ │ ├── abort.js │ │ │ ├── async.js │ │ │ ├── defer.js │ │ │ ├── iterate.js │ │ │ ├── readable_asynckit.js │ │ │ ├── readable_parallel.js │ │ │ ├── readable_serial_ordered.js │ │ │ ├── readable_serial.js │ │ │ ├── state.js │ │ │ ├── streamify.js │ │ │ └── terminator.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── parallel.js │ │ ├── README.md │ │ ├── serial.js │ │ ├── serialOrdered.js │ │ └── stream.js │ ├── axios │ │ ├── CHANGELOG.md │ │ ├── dist │ │ │ ├── axios.js │ │ │ ├── axios.js.map │ │ │ ├── axios.min.js │ │ │ ├── axios.min.js.map │ │ │ ├── browser │ │ │ │ ├── axios.cjs │ │ │ │ └── axios.cjs.map │ │ │ ├── esm │ │ │ │ ├── axios.js │ │ │ │ ├── axios.js.map │ │ │ │ ├── axios.min.js │ │ │ │ └── axios.min.js.map │ │ │ └── node │ │ │ ├── axios.cjs │ │ │ └── axios.cjs.map │ │ ├── index.d.cts │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── lib │ │ │ ├── adapters │ │ │ │ ├── adapters.js │ │ │ │ ├── fetch.js │ │ │ │ ├── http.js │ │ │ │ ├── README.md │ │ │ │ └── xhr.js │ │ │ ├── axios.js │ │ │ ├── cancel │ │ │ │ ├── CanceledError.js │ │ │ │ ├── CancelToken.js │ │ │ │ └── isCancel.js │ │ │ ├── core │ │ │ │ ├── Axios.js │ │ │ │ ├── AxiosError.js │ │ │ │ ├── AxiosHeaders.js │ │ │ │ ├── buildFullPath.js │ │ │ │ ├── dispatchRequest.js │ │ │ │ ├── InterceptorManager.js │ │ │ │ ├── mergeConfig.js │ │ │ │ ├── README.md │ │ │ │ ├── settle.js │ │ │ │ └── transformData.js │ │ │ ├── defaults │ │ │ │ ├── index.js │ │ │ │ └── transitional.js │ │ │ ├── env │ │ │ │ ├── classes │ │ │ │ │ └── FormData.js │ │ │ │ ├── data.js │ │ │ │ └── README.md │ │ │ ├── helpers │ │ │ │ ├── AxiosTransformStream.js │ │ │ │ ├── AxiosURLSearchParams.js │ │ │ │ ├── bind.js │ │ │ │ ├── buildURL.js │ │ │ │ ├── callbackify.js │ │ │ │ ├── combineURLs.js │ │ │ │ ├── composeSignals.js │ │ │ │ ├── cookies.js │ │ │ │ ├── deprecatedMethod.js │ │ │ │ ├── formDataToJSON.js │ │ │ │ ├── formDataToStream.js │ │ │ │ ├── fromDataURI.js │ │ │ │ ├── HttpStatusCode.js │ │ │ │ ├── isAbsoluteURL.js │ │ │ │ ├── isAxiosError.js │ │ │ │ ├── isURLSameOrigin.js │ │ │ │ ├── null.js │ │ │ │ ├── parseHeaders.js │ │ │ │ ├── parseProtocol.js │ │ │ │ ├── progressEventReducer.js │ │ │ │ ├── readBlob.js │ │ │ │ ├── README.md │ │ │ │ ├── resolveConfig.js │ │ │ │ ├── speedometer.js │ │ │ │ ├── spread.js │ │ │ │ ├── throttle.js │ │ │ │ ├── toFormData.js │ │ │ │ ├── toURLEncodedForm.js │ │ │ │ ├── trackStream.js │ │ │ │ ├── validator.js │ │ │ │ └── ZlibHeaderTransformStream.js │ │ │ ├── platform │ │ │ │ ├── browser │ │ │ │ │ ├── classes │ │ │ │ │ │ ├── Blob.js │ │ │ │ │ │ ├── FormData.js │ │ │ │ │ │ └── URLSearchParams.js │ │ │ │ │ └── index.js │ │ │ │ ├── common │ │ │ │ │ └── utils.js │ │ │ │ ├── index.js │ │ │ │ └── node │ │ │ │ ├── classes │ │ │ │ │ ├── FormData.js │ │ │ │ │ └── URLSearchParams.js │ │ │ │ └── index.js │ │ │ └── utils.js │ │ ├── LICENSE │ │ ├── MIGRATION_GUIDE.md │ │ ├── package.json │ │ └── README.md │ ├── balanced-match │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── index.js │ │ ├── LICENSE.md │ │ ├── package.json │ │ └── README.md │ ├── binary-extensions │ │ ├── binary-extensions.json │ │ ├── binary-extensions.json.d.ts │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── body-parser │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── lib │ │ │ ├── read.js │ │ │ ├── types │ │ │ │ ├── json.js │ │ │ │ ├── raw.js │ │ │ │ ├── text.js │ │ │ │ └── urlencoded.js │ │ │ └── utils.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── brace-expansion │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── braces │ │ ├── index.js │ │ ├── lib │ │ │ ├── compile.js │ │ │ ├── constants.js │ │ │ ├── expand.js │ │ │ ├── parse.js │ │ │ ├── stringify.js │ │ │ └── utils.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── bytes │ │ ├── History.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── Readme.md │ ├── call-bind-apply-helpers │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── actualApply.d.ts │ │ ├── actualApply.js │ │ ├── applyBind.d.ts │ │ ├── applyBind.js │ │ ├── CHANGELOG.md │ │ ├── functionApply.d.ts │ │ ├── functionApply.js │ │ ├── functionCall.d.ts │ │ ├── functionCall.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── reflectApply.d.ts │ │ ├── reflectApply.js │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── call-bound │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── chokidar │ │ ├── index.js │ │ ├── lib │ │ │ ├── constants.js │ │ │ ├── fsevents-handler.js │ │ │ └── nodefs-handler.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── types │ │ └── index.d.ts │ ├── combined-stream │ │ ├── lib │ │ │ └── combined_stream.js │ │ ├── License │ │ ├── package.json │ │ ├── Readme.md │ │ └── yarn.lock │ ├── concat-map │ │ ├── .travis.yml │ │ ├── example │ │ │ └── map.js │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.markdown │ │ └── test │ │ └── map.js │ ├── content-disposition │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── content-type │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── cookie │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── SECURITY.md │ ├── cookie-signature │ │ ├── History.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── Readme.md │ ├── cors │ │ ├── CONTRIBUTING.md │ │ ├── HISTORY.md │ │ ├── lib │ │ │ └── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── cross-spawn │ │ ├── index.js │ │ ├── lib │ │ │ ├── enoent.js │ │ │ ├── parse.js │ │ │ └── util │ │ │ ├── escape.js │ │ │ ├── readShebang.js │ │ │ └── resolveCommand.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── debug │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── src │ │ ├── browser.js │ │ ├── common.js │ │ ├── index.js │ │ └── node.js │ ├── delayed-stream │ │ ├── .npmignore │ │ ├── lib │ │ │ └── delayed_stream.js │ │ ├── License │ │ ├── Makefile │ │ ├── package.json │ │ └── Readme.md │ ├── depd │ │ ├── History.md │ │ ├── index.js │ │ ├── lib │ │ │ └── browser │ │ │ └── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── Readme.md │ ├── dunder-proto │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── get.d.ts │ │ ├── get.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── set.d.ts │ │ ├── set.js │ │ ├── test │ │ │ ├── get.js │ │ │ ├── index.js │ │ │ └── set.js │ │ └── tsconfig.json │ ├── ee-first │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── encodeurl │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── es-define-property │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── es-errors │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── CHANGELOG.md │ │ ├── eval.d.ts │ │ ├── eval.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── range.d.ts │ │ ├── range.js │ │ ├── README.md │ │ ├── ref.d.ts │ │ ├── ref.js │ │ ├── syntax.d.ts │ │ ├── syntax.js │ │ ├── test │ │ │ └── index.js │ │ ├── tsconfig.json │ │ ├── type.d.ts │ │ ├── type.js │ │ ├── uri.d.ts │ │ └── uri.js │ ├── es-object-atoms │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── isObject.d.ts │ │ ├── isObject.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── RequireObjectCoercible.d.ts │ │ ├── RequireObjectCoercible.js │ │ ├── test │ │ │ └── index.js │ │ ├── ToObject.d.ts │ │ ├── ToObject.js │ │ └── tsconfig.json │ ├── es-set-tostringtag │ │ ├── .eslintrc │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── escape-html │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── Readme.md │ ├── etag │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── eventsource │ │ ├── dist │ │ │ ├── index.cjs │ │ │ ├── index.cjs.map │ │ │ ├── index.d.cts │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── index.js.map │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── src │ │ ├── errors.ts │ │ ├── EventSource.ts │ │ ├── index.ts │ │ └── types.ts │ ├── eventsource-parser │ │ ├── dist │ │ │ ├── index.cjs │ │ │ ├── index.cjs.map │ │ │ ├── index.d.cts │ │ │ ├── index.d.ts │ │ │ ├── index.esm.js │ │ │ ├── index.esm.js.map │ │ │ ├── index.js │ │ │ ├── index.js.map │ │ │ ├── stats.html │ │ │ ├── stream.cjs │ │ │ ├── stream.cjs.map │ │ │ ├── stream.d.cts │ │ │ ├── stream.d.ts │ │ │ ├── stream.esm.js │ │ │ ├── stream.esm.js.map │ │ │ ├── stream.js │ │ │ └── stream.js.map │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── src │ │ │ ├── errors.ts │ │ │ ├── index.ts │ │ │ ├── parse.ts │ │ │ ├── stream.ts │ │ │ └── types.ts │ │ └── stream.js │ ├── express │ │ ├── History.md │ │ ├── index.js │ │ ├── lib │ │ │ ├── application.js │ │ │ ├── express.js │ │ │ ├── request.js │ │ │ ├── response.js │ │ │ ├── utils.js │ │ │ └── view.js │ │ ├── LICENSE │ │ ├── node_modules │ │ │ ├── mime-db │ │ │ │ ├── db.json │ │ │ │ ├── HISTORY.md │ │ │ │ ├── index.js │ │ │ │ ├── LICENSE │ │ │ │ ├── package.json │ │ │ │ └── README.md │ │ │ └── mime-types │ │ │ ├── HISTORY.md │ │ │ ├── index.js │ │ │ ├── LICENSE │ │ │ ├── mimeScore.js │ │ │ ├── package.json │ │ │ └── README.md │ │ ├── package.json │ │ └── Readme.md │ ├── express-rate-limit │ │ ├── dist │ │ │ ├── index.cjs │ │ │ ├── index.d.cts │ │ │ ├── index.d.mts │ │ │ ├── index.d.ts │ │ │ └── index.mjs │ │ ├── license.md │ │ ├── package.json │ │ ├── readme.md │ │ └── tsconfig.json │ ├── fill-range │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── finalhandler │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── follow-redirects │ │ ├── debug.js │ │ ├── http.js │ │ ├── https.js │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── form-data │ │ ├── index.d.ts │ │ ├── lib │ │ │ ├── browser.js │ │ │ ├── form_data.js │ │ │ └── populate.js │ │ ├── License │ │ ├── package.json │ │ └── Readme.md │ ├── forwarded │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── fresh │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── fsevents │ │ ├── fsevents.d.ts │ │ ├── fsevents.js │ │ ├── fsevents.node │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── function-bind │ │ ├── .eslintrc │ │ ├── .github │ │ │ ├── FUNDING.yml │ │ │ └── SECURITY.md │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── implementation.js │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── test │ │ ├── .eslintrc │ │ └── index.js │ ├── get-intrinsic │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── test │ │ └── GetIntrinsic.js │ ├── get-proto │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── Object.getPrototypeOf.d.ts │ │ ├── Object.getPrototypeOf.js │ │ ├── package.json │ │ ├── README.md │ │ ├── Reflect.getPrototypeOf.d.ts │ │ ├── Reflect.getPrototypeOf.js │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── glob-parent │ │ ├── CHANGELOG.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── gopd │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── CHANGELOG.md │ │ ├── gOPD.d.ts │ │ ├── gOPD.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── has-flag │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── has-symbols │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── shams.d.ts │ │ ├── shams.js │ │ ├── test │ │ │ ├── index.js │ │ │ ├── shams │ │ │ │ ├── core-js.js │ │ │ │ └── get-own-property-symbols.js │ │ │ └── tests.js │ │ └── tsconfig.json │ ├── has-tostringtag │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── shams.d.ts │ │ ├── shams.js │ │ ├── test │ │ │ ├── index.js │ │ │ ├── shams │ │ │ │ ├── core-js.js │ │ │ │ └── get-own-property-symbols.js │ │ │ └── tests.js │ │ └── tsconfig.json │ ├── hasown │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── tsconfig.json │ ├── http-errors │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── iconv-lite │ │ ├── .github │ │ │ └── dependabot.yml │ │ ├── .idea │ │ │ ├── codeStyles │ │ │ │ ├── codeStyleConfig.xml │ │ │ │ └── Project.xml │ │ │ ├── iconv-lite.iml │ │ │ ├── inspectionProfiles │ │ │ │ └── Project_Default.xml │ │ │ ├── modules.xml │ │ │ └── vcs.xml │ │ ├── Changelog.md │ │ ├── encodings │ │ │ ├── dbcs-codec.js │ │ │ ├── dbcs-data.js │ │ │ ├── index.js │ │ │ ├── internal.js │ │ │ ├── sbcs-codec.js │ │ │ ├── sbcs-data-generated.js │ │ │ ├── sbcs-data.js │ │ │ ├── tables │ │ │ │ ├── big5-added.json │ │ │ │ ├── cp936.json │ │ │ │ ├── cp949.json │ │ │ │ ├── cp950.json │ │ │ │ ├── eucjp.json │ │ │ │ ├── gb18030-ranges.json │ │ │ │ ├── gbk-added.json │ │ │ │ └── shiftjis.json │ │ │ ├── utf16.js │ │ │ ├── utf32.js │ │ │ └── utf7.js │ │ ├── lib │ │ │ ├── bom-handling.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── streams.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── ignore-by-default │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── inherits │ │ ├── inherits_browser.js │ │ ├── inherits.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── ipaddr.js │ │ ├── ipaddr.min.js │ │ ├── lib │ │ │ ├── ipaddr.js │ │ │ └── ipaddr.js.d.ts │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── is-binary-path │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── is-extglob │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── is-glob │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── is-number │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── is-promise │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── LICENSE │ │ ├── package.json │ │ └── readme.md │ ├── isexe │ │ ├── .npmignore │ │ ├── index.js │ │ ├── LICENSE │ │ ├── mode.js │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── basic.js │ │ └── windows.js │ ├── math-intrinsics │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── abs.d.ts │ │ ├── abs.js │ │ ├── CHANGELOG.md │ │ ├── constants │ │ │ ├── maxArrayLength.d.ts │ │ │ ├── maxArrayLength.js │ │ │ ├── maxSafeInteger.d.ts │ │ │ ├── maxSafeInteger.js │ │ │ ├── maxValue.d.ts │ │ │ └── maxValue.js │ │ ├── floor.d.ts │ │ ├── floor.js │ │ ├── isFinite.d.ts │ │ ├── isFinite.js │ │ ├── isInteger.d.ts │ │ ├── isInteger.js │ │ ├── isNaN.d.ts │ │ ├── isNaN.js │ │ ├── isNegativeZero.d.ts │ │ ├── isNegativeZero.js │ │ ├── LICENSE │ │ ├── max.d.ts │ │ ├── max.js │ │ ├── min.d.ts │ │ ├── min.js │ │ ├── mod.d.ts │ │ ├── mod.js │ │ ├── package.json │ │ ├── pow.d.ts │ │ ├── pow.js │ │ ├── README.md │ │ ├── round.d.ts │ │ ├── round.js │ │ ├── sign.d.ts │ │ ├── sign.js │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── media-typer │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── merge-descriptors │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── mime-db │ │ ├── db.json │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── mime-types │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── minimatch │ │ ├── LICENSE │ │ ├── minimatch.js │ │ ├── package.json │ │ └── README.md │ ├── ms │ │ ├── index.js │ │ ├── license.md │ │ ├── package.json │ │ └── readme.md │ ├── negotiator │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── lib │ │ │ ├── charset.js │ │ │ ├── encoding.js │ │ │ ├── language.js │ │ │ └── mediaType.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── nodemon │ │ ├── .prettierrc.json │ │ ├── bin │ │ │ ├── nodemon.js │ │ │ └── windows-kill.exe │ │ ├── doc │ │ │ └── cli │ │ │ ├── authors.txt │ │ │ ├── config.txt │ │ │ ├── help.txt │ │ │ ├── logo.txt │ │ │ ├── options.txt │ │ │ ├── topics.txt │ │ │ ├── usage.txt │ │ │ └── whoami.txt │ │ ├── index.d.ts │ │ ├── jsconfig.json │ │ ├── lib │ │ │ ├── cli │ │ │ │ ├── index.js │ │ │ │ └── parse.js │ │ │ ├── config │ │ │ │ ├── command.js │ │ │ │ ├── defaults.js │ │ │ │ ├── exec.js │ │ │ │ ├── index.js │ │ │ │ └── load.js │ │ │ ├── help │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── monitor │ │ │ │ ├── index.js │ │ │ │ ├── match.js │ │ │ │ ├── run.js │ │ │ │ ├── signals.js │ │ │ │ └── watch.js │ │ │ ├── nodemon.js │ │ │ ├── rules │ │ │ │ ├── add.js │ │ │ │ ├── index.js │ │ │ │ └── parse.js │ │ │ ├── spawn.js │ │ │ ├── utils │ │ │ │ ├── bus.js │ │ │ │ ├── clone.js │ │ │ │ ├── colour.js │ │ │ │ ├── index.js │ │ │ │ ├── log.js │ │ │ │ └── merge.js │ │ │ └── version.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── normalize-path │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── object-assign │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── object-inspect │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── example │ │ │ ├── all.js │ │ │ ├── circular.js │ │ │ ├── fn.js │ │ │ └── inspect.js │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package-support.json │ │ ├── package.json │ │ ├── readme.markdown │ │ ├── test │ │ │ ├── bigint.js │ │ │ ├── browser │ │ │ │ └── dom.js │ │ │ ├── circular.js │ │ │ ├── deep.js │ │ │ ├── element.js │ │ │ ├── err.js │ │ │ ├── fakes.js │ │ │ ├── fn.js │ │ │ ├── global.js │ │ │ ├── has.js │ │ │ ├── holes.js │ │ │ ├── indent-option.js │ │ │ ├── inspect.js │ │ │ ├── lowbyte.js │ │ │ ├── number.js │ │ │ ├── quoteStyle.js │ │ │ ├── toStringTag.js │ │ │ ├── undef.js │ │ │ └── values.js │ │ ├── test-core-js.js │ │ └── util.inspect.js │ ├── on-finished │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── once │ │ ├── LICENSE │ │ ├── once.js │ │ ├── package.json │ │ └── README.md │ ├── parseurl │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── path-key │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── path-to-regexp │ │ ├── dist │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── index.js.map │ │ ├── LICENSE │ │ ├── package.json │ │ └── Readme.md │ ├── picomatch │ │ ├── CHANGELOG.md │ │ ├── index.js │ │ ├── lib │ │ │ ├── constants.js │ │ │ ├── parse.js │ │ │ ├── picomatch.js │ │ │ ├── scan.js │ │ │ └── utils.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── pkce-challenge │ │ ├── dist │ │ │ ├── index.browser.d.ts │ │ │ ├── index.browser.js │ │ │ ├── index.node.cjs │ │ │ ├── index.node.d.cts │ │ │ ├── index.node.d.ts │ │ │ └── index.node.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── proxy-addr │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── proxy-from-env │ │ ├── .eslintrc │ │ ├── .travis.yml │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── test.js │ ├── pstree.remy │ │ ├── .travis.yml │ │ ├── lib │ │ │ ├── index.js │ │ │ ├── tree.js │ │ │ └── utils.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── tests │ │ ├── fixtures │ │ │ ├── index.js │ │ │ ├── out1 │ │ │ └── out2 │ │ └── index.test.js │ ├── qs │ │ ├── .editorconfig │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── dist │ │ │ └── qs.js │ │ ├── lib │ │ │ ├── formats.js │ │ │ ├── index.js │ │ │ ├── parse.js │ │ │ ├── stringify.js │ │ │ └── utils.js │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ └── test │ │ ├── empty-keys-cases.js │ │ ├── parse.js │ │ ├── stringify.js │ │ └── utils.js │ ├── range-parser │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── raw-body │ │ ├── HISTORY.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── SECURITY.md │ ├── readdirp │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── router │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── lib │ │ │ ├── layer.js │ │ │ └── route.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── safe-buffer │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── safer-buffer │ │ ├── dangerous.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── Porting-Buffer.md │ │ ├── Readme.md │ │ ├── safer.js │ │ └── tests.js │ ├── semver │ │ ├── bin │ │ │ └── semver.js │ │ ├── classes │ │ │ ├── comparator.js │ │ │ ├── index.js │ │ │ ├── range.js │ │ │ └── semver.js │ │ ├── functions │ │ │ ├── clean.js │ │ │ ├── cmp.js │ │ │ ├── coerce.js │ │ │ ├── compare-build.js │ │ │ ├── compare-loose.js │ │ │ ├── compare.js │ │ │ ├── diff.js │ │ │ ├── eq.js │ │ │ ├── gt.js │ │ │ ├── gte.js │ │ │ ├── inc.js │ │ │ ├── lt.js │ │ │ ├── lte.js │ │ │ ├── major.js │ │ │ ├── minor.js │ │ │ ├── neq.js │ │ │ ├── parse.js │ │ │ ├── patch.js │ │ │ ├── prerelease.js │ │ │ ├── rcompare.js │ │ │ ├── rsort.js │ │ │ ├── satisfies.js │ │ │ ├── sort.js │ │ │ └── valid.js │ │ ├── index.js │ │ ├── internal │ │ │ ├── constants.js │ │ │ ├── debug.js │ │ │ ├── identifiers.js │ │ │ ├── lrucache.js │ │ │ ├── parse-options.js │ │ │ └── re.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── preload.js │ │ ├── range.bnf │ │ ├── ranges │ │ │ ├── gtr.js │ │ │ ├── intersects.js │ │ │ ├── ltr.js │ │ │ ├── max-satisfying.js │ │ │ ├── min-satisfying.js │ │ │ ├── min-version.js │ │ │ ├── outside.js │ │ │ ├── simplify.js │ │ │ ├── subset.js │ │ │ ├── to-comparators.js │ │ │ └── valid.js │ │ └── README.md │ ├── send │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── node_modules │ │ │ ├── mime-db │ │ │ │ ├── db.json │ │ │ │ ├── HISTORY.md │ │ │ │ ├── index.js │ │ │ │ ├── LICENSE │ │ │ │ ├── package.json │ │ │ │ └── README.md │ │ │ └── mime-types │ │ │ ├── HISTORY.md │ │ │ ├── index.js │ │ │ ├── LICENSE │ │ │ ├── mimeScore.js │ │ │ ├── package.json │ │ │ └── README.md │ │ ├── package.json │ │ └── README.md │ ├── serve-static │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── setprototypeof │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── test │ │ └── index.js │ ├── shebang-command │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── shebang-regex │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── side-channel │ │ ├── .editorconfig │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── side-channel-list │ │ ├── .editorconfig │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── list.d.ts │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── side-channel-map │ │ ├── .editorconfig │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── side-channel-weakmap │ │ ├── .editorconfig │ │ ├── .eslintrc │ │ ├── .github │ │ │ └── FUNDING.yml │ │ ├── .nycrc │ │ ├── CHANGELOG.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ ├── test │ │ │ └── index.js │ │ └── tsconfig.json │ ├── simple-update-notifier │ │ ├── build │ │ │ ├── index.d.ts │ │ │ └── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── src │ │ ├── borderedText.ts │ │ ├── cache.spec.ts │ │ ├── cache.ts │ │ ├── getDistVersion.spec.ts │ │ ├── getDistVersion.ts │ │ ├── hasNewVersion.spec.ts │ │ ├── hasNewVersion.ts │ │ ├── index.spec.ts │ │ ├── index.ts │ │ ├── isNpmOrYarn.ts │ │ └── types.ts │ ├── statuses │ │ ├── codes.json │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── supports-color │ │ ├── browser.js │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ └── readme.md │ ├── to-regex-range │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── toidentifier │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── touch │ │ ├── bin │ │ │ └── nodetouch.js │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── type-is │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── node_modules │ │ │ ├── mime-db │ │ │ │ ├── db.json │ │ │ │ ├── HISTORY.md │ │ │ │ ├── index.js │ │ │ │ ├── LICENSE │ │ │ │ ├── package.json │ │ │ │ └── README.md │ │ │ └── mime-types │ │ │ ├── HISTORY.md │ │ │ ├── index.js │ │ │ ├── LICENSE │ │ │ ├── mimeScore.js │ │ │ ├── package.json │ │ │ └── README.md │ │ ├── package.json │ │ └── README.md │ ├── typescript │ │ ├── bin │ │ │ ├── tsc │ │ │ └── tsserver │ │ ├── lib │ │ │ ├── _tsc.js │ │ │ ├── _tsserver.js │ │ │ ├── _typingsInstaller.js │ │ │ ├── cs │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── de │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── es │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── fr │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── it │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── ja │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── ko │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── lib.d.ts │ │ │ ├── lib.decorators.d.ts │ │ │ ├── lib.decorators.legacy.d.ts │ │ │ ├── lib.dom.asynciterable.d.ts │ │ │ ├── lib.dom.d.ts │ │ │ ├── lib.dom.iterable.d.ts │ │ │ ├── lib.es2015.collection.d.ts │ │ │ ├── lib.es2015.core.d.ts │ │ │ ├── lib.es2015.d.ts │ │ │ ├── lib.es2015.generator.d.ts │ │ │ ├── lib.es2015.iterable.d.ts │ │ │ ├── lib.es2015.promise.d.ts │ │ │ ├── lib.es2015.proxy.d.ts │ │ │ ├── lib.es2015.reflect.d.ts │ │ │ ├── lib.es2015.symbol.d.ts │ │ │ ├── lib.es2015.symbol.wellknown.d.ts │ │ │ ├── lib.es2016.array.include.d.ts │ │ │ ├── lib.es2016.d.ts │ │ │ ├── lib.es2016.full.d.ts │ │ │ ├── lib.es2016.intl.d.ts │ │ │ ├── lib.es2017.arraybuffer.d.ts │ │ │ ├── lib.es2017.d.ts │ │ │ ├── lib.es2017.date.d.ts │ │ │ ├── lib.es2017.full.d.ts │ │ │ ├── lib.es2017.intl.d.ts │ │ │ ├── lib.es2017.object.d.ts │ │ │ ├── lib.es2017.sharedmemory.d.ts │ │ │ ├── lib.es2017.string.d.ts │ │ │ ├── lib.es2017.typedarrays.d.ts │ │ │ ├── lib.es2018.asyncgenerator.d.ts │ │ │ ├── lib.es2018.asynciterable.d.ts │ │ │ ├── lib.es2018.d.ts │ │ │ ├── lib.es2018.full.d.ts │ │ │ ├── lib.es2018.intl.d.ts │ │ │ ├── lib.es2018.promise.d.ts │ │ │ ├── lib.es2018.regexp.d.ts │ │ │ ├── lib.es2019.array.d.ts │ │ │ ├── lib.es2019.d.ts │ │ │ ├── lib.es2019.full.d.ts │ │ │ ├── lib.es2019.intl.d.ts │ │ │ ├── lib.es2019.object.d.ts │ │ │ ├── lib.es2019.string.d.ts │ │ │ ├── lib.es2019.symbol.d.ts │ │ │ ├── lib.es2020.bigint.d.ts │ │ │ ├── lib.es2020.d.ts │ │ │ ├── lib.es2020.date.d.ts │ │ │ ├── lib.es2020.full.d.ts │ │ │ ├── lib.es2020.intl.d.ts │ │ │ ├── lib.es2020.number.d.ts │ │ │ ├── lib.es2020.promise.d.ts │ │ │ ├── lib.es2020.sharedmemory.d.ts │ │ │ ├── lib.es2020.string.d.ts │ │ │ ├── lib.es2020.symbol.wellknown.d.ts │ │ │ ├── lib.es2021.d.ts │ │ │ ├── lib.es2021.full.d.ts │ │ │ ├── lib.es2021.intl.d.ts │ │ │ ├── lib.es2021.promise.d.ts │ │ │ ├── lib.es2021.string.d.ts │ │ │ ├── lib.es2021.weakref.d.ts │ │ │ ├── lib.es2022.array.d.ts │ │ │ ├── lib.es2022.d.ts │ │ │ ├── lib.es2022.error.d.ts │ │ │ ├── lib.es2022.full.d.ts │ │ │ ├── lib.es2022.intl.d.ts │ │ │ ├── lib.es2022.object.d.ts │ │ │ ├── lib.es2022.regexp.d.ts │ │ │ ├── lib.es2022.string.d.ts │ │ │ ├── lib.es2023.array.d.ts │ │ │ ├── lib.es2023.collection.d.ts │ │ │ ├── lib.es2023.d.ts │ │ │ ├── lib.es2023.full.d.ts │ │ │ ├── lib.es2023.intl.d.ts │ │ │ ├── lib.es2024.arraybuffer.d.ts │ │ │ ├── lib.es2024.collection.d.ts │ │ │ ├── lib.es2024.d.ts │ │ │ ├── lib.es2024.full.d.ts │ │ │ ├── lib.es2024.object.d.ts │ │ │ ├── lib.es2024.promise.d.ts │ │ │ ├── lib.es2024.regexp.d.ts │ │ │ ├── lib.es2024.sharedmemory.d.ts │ │ │ ├── lib.es2024.string.d.ts │ │ │ ├── lib.es5.d.ts │ │ │ ├── lib.es6.d.ts │ │ │ ├── lib.esnext.array.d.ts │ │ │ ├── lib.esnext.collection.d.ts │ │ │ ├── lib.esnext.d.ts │ │ │ ├── lib.esnext.decorators.d.ts │ │ │ ├── lib.esnext.disposable.d.ts │ │ │ ├── lib.esnext.float16.d.ts │ │ │ ├── lib.esnext.full.d.ts │ │ │ ├── lib.esnext.intl.d.ts │ │ │ ├── lib.esnext.iterator.d.ts │ │ │ ├── lib.esnext.promise.d.ts │ │ │ ├── lib.scripthost.d.ts │ │ │ ├── lib.webworker.asynciterable.d.ts │ │ │ ├── lib.webworker.d.ts │ │ │ ├── lib.webworker.importscripts.d.ts │ │ │ ├── lib.webworker.iterable.d.ts │ │ │ ├── pl │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── pt-br │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── ru │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── tr │ │ │ │ └── diagnosticMessages.generated.json │ │ │ ├── tsc.js │ │ │ ├── tsserver.js │ │ │ ├── tsserverlibrary.d.ts │ │ │ ├── tsserverlibrary.js │ │ │ ├── typescript.d.ts │ │ │ ├── typescript.js │ │ │ ├── typesMap.json │ │ │ ├── typingsInstaller.js │ │ │ ├── watchGuard.js │ │ │ ├── zh-cn │ │ │ │ └── diagnosticMessages.generated.json │ │ │ └── zh-tw │ │ │ └── diagnosticMessages.generated.json │ │ ├── LICENSE.txt │ │ ├── package.json │ │ ├── README.md │ │ ├── SECURITY.md │ │ └── ThirdPartyNoticeText.txt │ ├── undefsafe │ │ ├── .github │ │ │ └── workflows │ │ │ └── release.yml │ │ ├── .jscsrc │ │ ├── .jshintrc │ │ ├── .travis.yml │ │ ├── example.js │ │ ├── lib │ │ │ └── undefsafe.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── undici-types │ │ ├── agent.d.ts │ │ ├── api.d.ts │ │ ├── balanced-pool.d.ts │ │ ├── cache.d.ts │ │ ├── client.d.ts │ │ ├── connector.d.ts │ │ ├── content-type.d.ts │ │ ├── cookies.d.ts │ │ ├── diagnostics-channel.d.ts │ │ ├── dispatcher.d.ts │ │ ├── env-http-proxy-agent.d.ts │ │ ├── errors.d.ts │ │ ├── eventsource.d.ts │ │ ├── fetch.d.ts │ │ ├── file.d.ts │ │ ├── filereader.d.ts │ │ ├── formdata.d.ts │ │ ├── global-dispatcher.d.ts │ │ ├── global-origin.d.ts │ │ ├── handlers.d.ts │ │ ├── header.d.ts │ │ ├── index.d.ts │ │ ├── interceptors.d.ts │ │ ├── LICENSE │ │ ├── mock-agent.d.ts │ │ ├── mock-client.d.ts │ │ ├── mock-errors.d.ts │ │ ├── mock-interceptor.d.ts │ │ ├── mock-pool.d.ts │ │ ├── package.json │ │ ├── patch.d.ts │ │ ├── pool-stats.d.ts │ │ ├── pool.d.ts │ │ ├── proxy-agent.d.ts │ │ ├── readable.d.ts │ │ ├── README.md │ │ ├── retry-agent.d.ts │ │ ├── retry-handler.d.ts │ │ ├── util.d.ts │ │ ├── webidl.d.ts │ │ └── websocket.d.ts │ ├── unpipe │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── vary │ │ ├── HISTORY.md │ │ ├── index.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ ├── which │ │ ├── bin │ │ │ └── node-which │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── which.js │ ├── wrappy │ │ ├── LICENSE │ │ ├── package.json │ │ ├── README.md │ │ └── wrappy.js │ ├── zod │ │ ├── index.d.ts │ │ ├── lib │ │ │ ├── __tests__ │ │ │ │ ├── Mocker.d.ts │ │ │ │ └── Mocker.js │ │ │ ├── benchmarks │ │ │ │ ├── datetime.d.ts │ │ │ │ ├── datetime.js │ │ │ │ ├── discriminatedUnion.d.ts │ │ │ │ ├── discriminatedUnion.js │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ ├── ipv4.d.ts │ │ │ │ ├── ipv4.js │ │ │ │ ├── object.d.ts │ │ │ │ ├── object.js │ │ │ │ ├── primitives.d.ts │ │ │ │ ├── primitives.js │ │ │ │ ├── realworld.d.ts │ │ │ │ ├── realworld.js │ │ │ │ ├── string.d.ts │ │ │ │ ├── string.js │ │ │ │ ├── union.d.ts │ │ │ │ └── union.js │ │ │ ├── errors.d.ts │ │ │ ├── errors.js │ │ │ ├── external.d.ts │ │ │ ├── external.js │ │ │ ├── helpers │ │ │ │ ├── enumUtil.d.ts │ │ │ │ ├── enumUtil.js │ │ │ │ ├── errorUtil.d.ts │ │ │ │ ├── errorUtil.js │ │ │ │ ├── parseUtil.d.ts │ │ │ │ ├── parseUtil.js │ │ │ │ ├── partialUtil.d.ts │ │ │ │ ├── partialUtil.js │ │ │ │ ├── typeAliases.d.ts │ │ │ │ ├── typeAliases.js │ │ │ │ ├── util.d.ts │ │ │ │ └── util.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── index.mjs │ │ │ ├── index.umd.js │ │ │ ├── locales │ │ │ │ ├── en.d.ts │ │ │ │ └── en.js │ │ │ ├── standard-schema.d.ts │ │ │ ├── standard-schema.js │ │ │ ├── types.d.ts │ │ │ ├── types.js │ │ │ ├── ZodError.d.ts │ │ │ └── ZodError.js │ │ ├── LICENSE │ │ ├── package.json │ │ └── README.md │ └── zod-to-json-schema │ ├── .github │ │ ├── CR_logotype-full-color.png │ │ └── FUNDING.yml │ ├── .prettierrc.json │ ├── changelog.md │ ├── contributing.md │ ├── createIndex.ts │ ├── dist │ │ ├── cjs │ │ │ ├── errorMessages.js │ │ │ ├── index.js │ │ │ ├── Options.js │ │ │ ├── package.json │ │ │ ├── parseDef.js │ │ │ ├── parsers │ │ │ │ ├── any.js │ │ │ │ ├── array.js │ │ │ │ ├── bigint.js │ │ │ │ ├── boolean.js │ │ │ │ ├── branded.js │ │ │ │ ├── catch.js │ │ │ │ ├── date.js │ │ │ │ ├── default.js │ │ │ │ ├── effects.js │ │ │ │ ├── enum.js │ │ │ │ ├── intersection.js │ │ │ │ ├── literal.js │ │ │ │ ├── map.js │ │ │ │ ├── nativeEnum.js │ │ │ │ ├── never.js │ │ │ │ ├── null.js │ │ │ │ ├── nullable.js │ │ │ │ ├── number.js │ │ │ │ ├── object.js │ │ │ │ ├── optional.js │ │ │ │ ├── pipeline.js │ │ │ │ ├── promise.js │ │ │ │ ├── readonly.js │ │ │ │ ├── record.js │ │ │ │ ├── set.js │ │ │ │ ├── string.js │ │ │ │ ├── tuple.js │ │ │ │ ├── undefined.js │ │ │ │ ├── union.js │ │ │ │ └── unknown.js │ │ │ ├── parseTypes.js │ │ │ ├── Refs.js │ │ │ ├── selectParser.js │ │ │ └── zodToJsonSchema.js │ │ ├── esm │ │ │ ├── errorMessages.js │ │ │ ├── index.js │ │ │ ├── Options.js │ │ │ ├── package.json │ │ │ ├── parseDef.js │ │ │ ├── parsers │ │ │ │ ├── any.js │ │ │ │ ├── array.js │ │ │ │ ├── bigint.js │ │ │ │ ├── boolean.js │ │ │ │ ├── branded.js │ │ │ │ ├── catch.js │ │ │ │ ├── date.js │ │ │ │ ├── default.js │ │ │ │ ├── effects.js │ │ │ │ ├── enum.js │ │ │ │ ├── intersection.js │ │ │ │ ├── literal.js │ │ │ │ ├── map.js │ │ │ │ ├── nativeEnum.js │ │ │ │ ├── never.js │ │ │ │ ├── null.js │ │ │ │ ├── nullable.js │ │ │ │ ├── number.js │ │ │ │ ├── object.js │ │ │ │ ├── optional.js │ │ │ │ ├── pipeline.js │ │ │ │ ├── promise.js │ │ │ │ ├── readonly.js │ │ │ │ ├── record.js │ │ │ │ ├── set.js │ │ │ │ ├── string.js │ │ │ │ ├── tuple.js │ │ │ │ ├── undefined.js │ │ │ │ ├── union.js │ │ │ │ └── unknown.js │ │ │ ├── parseTypes.js │ │ │ ├── Refs.js │ │ │ ├── selectParser.js │ │ │ └── zodToJsonSchema.js │ │ └── types │ │ ├── errorMessages.d.ts │ │ ├── index.d.ts │ │ ├── Options.d.ts │ │ ├── parseDef.d.ts │ │ ├── parsers │ │ │ ├── any.d.ts │ │ │ ├── array.d.ts │ │ │ ├── bigint.d.ts │ │ │ ├── boolean.d.ts │ │ │ ├── branded.d.ts │ │ │ ├── catch.d.ts │ │ │ ├── date.d.ts │ │ │ ├── default.d.ts │ │ │ ├── effects.d.ts │ │ │ ├── enum.d.ts │ │ │ ├── intersection.d.ts │ │ │ ├── literal.d.ts │ │ │ ├── map.d.ts │ │ │ ├── nativeEnum.d.ts │ │ │ ├── never.d.ts │ │ │ ├── null.d.ts │ │ │ ├── nullable.d.ts │ │ │ ├── number.d.ts │ │ │ ├── object.d.ts │ │ │ ├── optional.d.ts │ │ │ ├── pipeline.d.ts │ │ │ ├── promise.d.ts │ │ │ ├── readonly.d.ts │ │ │ ├── record.d.ts │ │ │ ├── set.d.ts │ │ │ ├── string.d.ts │ │ │ ├── tuple.d.ts │ │ │ ├── undefined.d.ts │ │ │ ├── union.d.ts │ │ │ └── unknown.d.ts │ │ ├── parseTypes.d.ts │ │ ├── Refs.d.ts │ │ ├── selectParser.d.ts │ │ └── zodToJsonSchema.d.ts │ ├── LICENSE │ ├── package.json │ ├── postcjs.ts │ ├── postesm.ts │ ├── README.md │ └── SECURITY.md ├── package-lock.json ├── package.json ├── README.md ├── src │ └── index.ts ├── tsconfig.json ├── watchbase_api_reference.md └── watchbase-mcp ├── .gitignore ├── package.json ├── README.md ├── src │ └── index.ts └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` .DS_Store ``` -------------------------------------------------------------------------------- /watchbase-mcp/.gitignore: -------------------------------------------------------------------------------- ``` node_modules/ build/ *.log .env* ``` -------------------------------------------------------------------------------- /watchbase-mcp/README.md: -------------------------------------------------------------------------------- ```markdown # watchbase-mcp MCP Server Structured and standardized querying of watch-related metadata such as brands, families, and reference details from WatchBase.com This is a TypeScript-based MCP server that implements a simple notes system. It demonstrates core MCP concepts by providing: - Resources representing text notes with URIs and metadata - Tools for creating new notes - Prompts for generating summaries of notes ## Features ### Resources - List and access notes via `note://` URIs - Each note has a title, content and metadata - Plain text mime type for simple content access ### Tools - `create_note` - Create new text notes - Takes title and content as required parameters - Stores note in server state ### Prompts - `summarize_notes` - Generate a summary of all stored notes - Includes all note contents as embedded resources - Returns structured prompt for LLM summarization ## Development Install dependencies: ```bash npm install ``` Build the server: ```bash npm run build ``` For development with auto-rebuild: ```bash npm run watch ``` ## Installation To use with Claude Desktop, add the server config: On MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json` On Windows: `%APPDATA%/Claude/claude_desktop_config.json` ```json { "mcpServers": { "watchbase-mcp": { "command": "/path/to/watchbase-mcp/build/index.js" } } } ``` ### Debugging Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector), which is available as a package script: ```bash npm run inspector ``` The Inspector will provide a URL to access debugging tools in your browser. ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown # WatchBase MCP Server An MCP (Model Context Protocol) server providing access to the WatchBase Data Feed API for querying watch metadata. ## About WatchBase API The WatchBase Data Feed API provides structured access to a comprehensive database of watch information, including brands, families (collections), specific watch models, reference numbers, technical details, and images. It allows developers to integrate detailed watch data into their applications. More information can be found on the [WatchBase API Documentation](https://api.watchbase.com/docs). ## Features This MCP server exposes the following tools corresponding to the WatchBase API endpoints: * **`search`**: Search the database by brand name, family name, watch name, and reference number (matches whole words). * **`search_refnr`**: Search the database by reference number (allows partial matches). * **`list_brands`**: Retrieve a list of all watch brands in the database. * **`list_families`**: Retrieve a list of all families (collections) for a given brand ID. * **`list_watches`**: Retrieve a list of watches for a particular Brand ID and optionally Family ID. Can be filtered by update date. * **`get_watch_details`**: Retrieve the full details (all data fields) for a particular watch by its WatchBase ID. ## Prerequisites * **Node.js and npm:** Required to install dependencies and run the server. * **WatchBase API Key:** You need an API key from WatchBase. Visit the [WatchBase API page](https://api.watchbase.com/) to request access and obtain a key. ## Installation 1. **Clone the repository:** ```bash git clone https://github.com/watchdealer-pavel/watchbase-mcp.git cd watchbase-mcp ``` 2. **Install dependencies:** ```bash npm install ``` 3. **Build the server:** ```bash npm run build ``` This command compiles the TypeScript source code into JavaScript, placing the output in the `build/` directory (specifically `build/index.js`). ## Configuration The server requires your WatchBase API key to be provided via the `WATCHBASE_API_KEY` environment variable. You need to configure your MCP client (like Cline/Roo Code or the Claude Desktop App) to run this server and pass the environment variable. **Example Configuration:** Below are examples for common MCP clients. **Remember to replace `/path/to/your/watchbase-mcp/build/index.js` with the actual absolute path to the compiled server file on your system, and `YOUR_WATCHBASE_API_KEY` with your real WatchBase API key.** ### Cline / Roo Code (VS Code Extension) 1. Open your VS Code settings for MCP servers. On macOS, this is typically located at: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` *(Note: The exact path might vary based on your operating system and VS Code installation type. For Roo Code, replace `saoudrizwan.claude-dev` with `rooveterinaryinc.roo-cline`)* 2. Add the following configuration block under the `mcpServers` key: ```json "watchbase-mcp": { "command": "node", "args": ["/path/to/your/watchbase-mcp/build/index.js"], // <-- IMPORTANT: Replace with the ACTUAL absolute path to build/index.js "env": { "WATCHBASE_API_KEY": "YOUR_WATCHBASE_API_KEY" // <-- IMPORTANT: Replace with your WatchBase API Key }, "disabled": false, "autoApprove": [] // Or add specific tools you want to auto-approve } ``` ### Claude Desktop App 1. Open the Claude Desktop App configuration file. On macOS, this is typically located at: `~/Library/Application Support/Claude/claude_desktop_config.json` *(Note: The exact path might vary based on your operating system.)* 2. Add the following configuration block under the `mcpServers` key: ```json "watchbase-mcp": { "command": "node", "args": ["/path/to/your/watchbase-mcp/build/index.js"], // <-- IMPORTANT: Replace with the ACTUAL absolute path to build/index.js "env": { "WATCHBASE_API_KEY": "YOUR_WATCHBASE_API_KEY" // <-- IMPORTANT: Replace with your WatchBase API Key }, "disabled": false, "autoApprove": [] // Or add specific tools you want to auto-approve } ``` ## Usage Once configured, you can invoke the server's tools from your AI assistant using the `use_mcp_tool` command/tool. ### `search` Example ```xml <use_mcp_tool> <server_name>watchbase-mcp</server_name> <tool_name>search</tool_name> <arguments> { "q": "priors court" } </arguments> </use_mcp_tool> ``` ### `search_refnr` Example ```xml <use_mcp_tool> <server_name>watchbase-mcp</server_name> <tool_name>search_refnr</tool_name> <arguments> { "q": "P2/" } </arguments> </use_mcp_tool> ``` ### `list_brands` Example ```xml <use_mcp_tool> <server_name>watchbase-mcp</server_name> <tool_name>list_brands</tool_name> <arguments> {} </arguments> </use_mcp_tool> ``` ### `list_families` Example ```xml <use_mcp_tool> <server_name>watchbase-mcp</server_name> <tool_name>list_families</tool_name> <arguments> { "brand_id": 37 } </arguments> </use_mcp_tool> ``` ### `list_watches` Example ```xml <use_mcp_tool> <server_name>watchbase-mcp</server_name> <tool_name>list_watches</tool_name> <arguments> { "brand_id": 37, "family_id": 279 } </arguments> </use_mcp_tool> ``` ### `get_watch_details` Example ```xml <use_mcp_tool> <server_name>watchbase-mcp</server_name> <tool_name>get_watch_details</tool_name> <arguments> { "id": 17289 } </arguments> </use_mcp_tool> ``` ## License This MCP server project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. Please also refer to WatchBase terms of service regarding API usage. ``` -------------------------------------------------------------------------------- /watchbase-mcp/tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "target": "ES2022", "module": "Node16", "moduleResolution": "Node16", "outDir": "./build", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"], "exclude": ["node_modules"] } ``` -------------------------------------------------------------------------------- /watchbase-mcp/package.json: -------------------------------------------------------------------------------- ```json { "name": "watchbase-mcp", "version": "0.1.0", "description": "Structured and standardized querying of watch-related metadata such as brands, families, and reference details from WatchBase.com", "private": true, "type": "module", "bin": { "watchbase-mcp": "./build/index.js" }, "files": [ "build" ], "scripts": { "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", "prepare": "npm run build", "watch": "tsc --watch", "inspector": "npx @modelcontextprotocol/inspector build/index.js" }, "dependencies": { "@modelcontextprotocol/sdk": "0.6.0" }, "devDependencies": { "@types/node": "^20.11.24", "typescript": "^5.3.3" } } ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- ```json { "name": "watchbase-mcp", "version": "0.1.0", "description": "Structured and standardized querying of watch-related metadata such as brands families and reference details from WatchBase.com", "main": "build/index.js", "type": "module", "scripts": { "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", "watch": "tsc --watch", "start": "node build/index.js", "dev": "npm run watch & nodemon build/index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "bin": { "watchbase-mcp": "build/index.js" }, "keywords": [ "mcp", "watchbase", "watches" ], "author": "Cline", "license": "ISC", "dependencies": { "@modelcontextprotocol/sdk": "^1.9.0", "axios": "^1.8.4" }, "devDependencies": { "@types/node": "^20.11.19", "nodemon": "^3.0.3", "typescript": "^5.3.3" } } ``` -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "target": "ES2022", // Target modern ECMAScript version "module": "NodeNext", // Use Node.js native ES module support "moduleResolution": "NodeNext", // Module resolution strategy for NodeNext "outDir": "./build", // Output directory for compiled JavaScript "rootDir": "./src", // Root directory of source files "lib": ["ES2022", "DOM"], // Add ES library definitions "strict": true, // Enable all strict type-checking options "esModuleInterop": true, // Enables compatibility with CommonJS modules "skipLibCheck": true, // Skip type checking of declaration files "forceConsistentCasingInFileNames": true, // Disallow inconsistently-cased references "resolveJsonModule": true, // Allow importing JSON files "declaration": true, // Generate corresponding '.d.ts' files "sourceMap": true // Generate source maps for debugging }, "include": ["src/**/*"], // Include all files in the src directory "exclude": ["node_modules", "build"] // Exclude node_modules and build output } ``` -------------------------------------------------------------------------------- /watchbase_api_reference.md: -------------------------------------------------------------------------------- ```markdown # WatchBase Data Feed API (v1) _A concise reference for building an API connector_ > **Base URL:** `https://api.watchbase.com/v1/` > **Auth:** Every request must include `key=<YOUR_API_KEY>` as a query or POST parameter. > **Response formats:** XML (default) or JSON via `format=json`. --- ## 1 · Search Endpoints | Endpoint | Purpose | Required params | Optional params | Notes | |----------|---------|-----------------|-----------------|-------| | **`GET /search`** | Whole-word search across brand, family, watch name & reference number | `q` | `format` | Exact-match on words. | | **`GET /search/refnr`** | Sub-string search on reference numbers | `q` | `format` | Use for partial ref. numbers.| Example: ``` /search?q=priors+court&key=YOUR_KEY /search/refnr?q=p2/&key=YOUR_KEY&format=json ``` --- ## 2 · Reference Lists | Endpoint | Purpose | Required params | Optional params | |----------|---------|-----------------|-----------------| | **`GET /brands`** | All brands (`id`, `name`) | — | `format` | | **`GET /families`** | Families for a brand | `brand-id` | `format` | --- ## 3 · Watch Collections | Endpoint | Purpose | Required params | Optional params | Tip | |----------|---------|-----------------|-----------------|-----| | **`GET /watches`** | List watches for a brand and/or family | `brand-id` | `family-id`, `updated-since (YYYY-MM-DD)`, `format` | Use `updated-since` for incremental syncs. | | **`GET /watch`** | Full detail for one watch | `id` | `format` | Returns every data field (specs, images, metadata). | --- ## 4 · Entity Schemas (JSON) <details> <summary>⚙️ Click to view simplified field layout</summary> **Brand** ```jsonc { "id": 59, "name": "Audemars Piguet" } ``` **Family** ```jsonc { "id": 234, "name": "P-Series" } ``` **Watch (list response)** ```jsonc { "id": 11702, "refnr": "M1", "name": "M1", "brand": { ... }, "family": { ... }, "thumb": "http://cdn.watchbase.com/watch/medium/...", "updated": "2016-02-25" } ``` **Watch (detail response)** – adds nested objects such as `caliber`, `case`, `dial`, plus meta‐dates (`added`, `modified`, `published`). </details> --- ## 5 · Typical Integration Workflow 1. **Seed lookup tables** - `GET /brands` → store locally. - For each brand: `GET /families?brand-id={id}`. 2. **Initial import** - `GET /watches?brand-id={id}` (or include `family-id`) to pull IDs & basic data. 3. **Incremental updates** - Daily/weekly: `GET /watches?brand-id={id}&updated-since={YYYY-MM-DD}`. 4. **On-demand detail** - `GET /watch?id={watchId}` whenever full specifications are needed. --- ## 6 · Design Notes & Alternatives | Approach | When to choose it | Trade-offs | |----------|------------------|------------| | **Local mirror** of full watch details | Heavy read load, advanced search, offline ops | Larger storage; must schedule updates. | | **On-demand detail fetch** | Occasional look-ups, small apps | Slower first load; dependent on API uptime. | Additional tips: * Thumbnails in list results use `/medium/`; swap with `/large/` for hi-res images. * Rate limits are not documented—throttle conservatively and implement retry/backoff logic. * Check `num_results` before iterating to avoid null arrays. * Search endpoint is **whole-word**; use `/search/refnr` for fuzzy matching. --- ## 7 · Error Handling | HTTP Code | Likely cause | Suggested action | |-----------|--------------|------------------| | `401 / 403` | Missing or invalid `key` | Verify key, regenerate if needed | | `400` | Bad parameter name or type | Validate query string / body | | `500` | WatchBase internal error | Retry with backoff, alert if persistent | --- ## 8 · Change Log Strategy Store these dates per watch to detect changes: * `added` – first import date * `modified` – last metadata edit * `published` – publication date * `updated` (list responses) – identical to latest `modified` Use whichever best fits your sync policy (e.g., `modified >= lastSync`). --- _Source: [WatchBase Data Feed API documentation](https://watchbase.com/data-feed), accessed May 12 2025._ ``` -------------------------------------------------------------------------------- /watchbase-mcp/src/index.ts: -------------------------------------------------------------------------------- ```typescript #!/usr/bin/env node /** * This is a template MCP server that implements a simple notes system. * It demonstrates core MCP concepts like resources and tools by allowing: * - Listing notes as resources * - Reading individual notes * - Creating new notes via a tool * - Summarizing all notes via a prompt */ import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js"; /** * Type alias for a note object. */ type Note = { title: string, content: string }; /** * Simple in-memory storage for notes. * In a real implementation, this would likely be backed by a database. */ const notes: { [id: string]: Note } = { "1": { title: "First Note", content: "This is note 1" }, "2": { title: "Second Note", content: "This is note 2" } }; /** * Create an MCP server with capabilities for resources (to list/read notes), * tools (to create new notes), and prompts (to summarize notes). */ const server = new Server( { name: "watchbase-mcp", version: "0.1.0", }, { capabilities: { resources: {}, tools: {}, prompts: {}, }, } ); /** * Handler for listing available notes as resources. * Each note is exposed as a resource with: * - A note:// URI scheme * - Plain text MIME type * - Human readable name and description (now including the note title) */ server.setRequestHandler(ListResourcesRequestSchema, async () => { return { resources: Object.entries(notes).map(([id, note]) => ({ uri: `note:///${id}`, mimeType: "text/plain", name: note.title, description: `A text note: ${note.title}` })) }; }); /** * Handler for reading the contents of a specific note. * Takes a note:// URI and returns the note content as plain text. */ server.setRequestHandler(ReadResourceRequestSchema, async (request) => { const url = new URL(request.params.uri); const id = url.pathname.replace(/^\//, ''); const note = notes[id]; if (!note) { throw new Error(`Note ${id} not found`); } return { contents: [{ uri: request.params.uri, mimeType: "text/plain", text: note.content }] }; }); /** * Handler that lists available tools. * Exposes a single "create_note" tool that lets clients create new notes. */ server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: "create_note", description: "Create a new note", inputSchema: { type: "object", properties: { title: { type: "string", description: "Title of the note" }, content: { type: "string", description: "Text content of the note" } }, required: ["title", "content"] } } ] }; }); /** * Handler for the create_note tool. * Creates a new note with the provided title and content, and returns success message. */ server.setRequestHandler(CallToolRequestSchema, async (request) => { switch (request.params.name) { case "create_note": { const title = String(request.params.arguments?.title); const content = String(request.params.arguments?.content); if (!title || !content) { throw new Error("Title and content are required"); } const id = String(Object.keys(notes).length + 1); notes[id] = { title, content }; return { content: [{ type: "text", text: `Created note ${id}: ${title}` }] }; } default: throw new Error("Unknown tool"); } }); /** * Handler that lists available prompts. * Exposes a single "summarize_notes" prompt that summarizes all notes. */ server.setRequestHandler(ListPromptsRequestSchema, async () => { return { prompts: [ { name: "summarize_notes", description: "Summarize all notes", } ] }; }); /** * Handler for the summarize_notes prompt. * Returns a prompt that requests summarization of all notes, with the notes' contents embedded as resources. */ server.setRequestHandler(GetPromptRequestSchema, async (request) => { if (request.params.name !== "summarize_notes") { throw new Error("Unknown prompt"); } const embeddedNotes = Object.entries(notes).map(([id, note]) => ({ type: "resource" as const, resource: { uri: `note:///${id}`, mimeType: "text/plain", text: note.content } })); return { messages: [ { role: "user", content: { type: "text", text: "Please summarize the following notes:" } }, ...embeddedNotes.map(note => ({ role: "user" as const, content: note })), { role: "user", content: { type: "text", text: "Provide a concise summary of all the notes above." } } ] }; }); /** * Start the server using stdio transport. * This allows the server to communicate via standard input/output streams. */ async function main() { const transport = new StdioServerTransport(); await server.connect(transport); } main().catch((error) => { console.error("Server error:", error); process.exit(1); }); ``` -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- ```typescript #!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, // ToolDefinition removed - type will be inferred or is not needed explicitly } from '@modelcontextprotocol/sdk/types.js'; import axios, { type AxiosInstance, type AxiosError } from 'axios'; // Retrieve API key from environment variable set in MCP settings const API_KEY = process.env.WATCHBASE_API_KEY; if (!API_KEY) { console.error('WATCHBASE_API_KEY environment variable is required'); process.exit(1); // Exit if API key is not provided } // --- Type guards for tool arguments --- const isSearchArgs = (args: any): args is { q: string } => typeof args === 'object' && args !== null && typeof args.q === 'string'; const isListFamiliesArgs = (args: any): args is { brand_id: string | number } => typeof args === 'object' && args !== null && (typeof args.brand_id === 'string' || typeof args.brand_id === 'number'); const isListWatchesArgs = ( args: any ): args is { brand_id: string | number; family_id?: string | number; updated_since?: string; } => typeof args === 'object' && args !== null && (typeof args.brand_id === 'string' || typeof args.brand_id === 'number') && (args.family_id === undefined || typeof args.family_id === 'string' || typeof args.family_id === 'number') && (args.updated_since === undefined || (typeof args.updated_since === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(args.updated_since))); // Basic YYYY-MM-DD check const isGetWatchDetailsArgs = (args: any): args is { id: string | number } => typeof args === 'object' && args !== null && (typeof args.id === 'string' || typeof args.id === 'number'); // --- Main Server Class --- class WatchBaseServer { private server: Server; private axiosInstance: AxiosInstance; constructor() { this.server = new Server( { name: 'watchbase-mcp', version: '0.1.0', description: 'Structured and standardized querying of watch-related metadata such as brands families and reference details from WatchBase.com', }, { capabilities: { resources: {}, // No resources defined for this server tools: {}, }, } ); this.axiosInstance = axios.create({ baseURL: 'https://api.watchbase.com/v1/', params: { key: API_KEY, format: 'json', // Default to JSON format }, timeout: 15000, // 15 second timeout }); this.setupToolHandlers(); // Basic error handling this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); process.on('SIGTERM', async () => { await this.server.close(); process.exit(0); }); } private setupToolHandlers() { // Type annotation removed for tools - structure defines the type const tools = [ { name: 'search', description: 'Search the database by brand name, family name, watch name and reference number (whole words).', inputSchema: { type: 'object', properties: { q: { type: 'string', description: 'Search keywords' }, }, required: ['q'], }, }, { name: 'search_refnr', description: 'Search the database by reference number (allows partial matches).', inputSchema: { type: 'object', properties: { q: { type: 'string', description: 'Search keywords (reference number)' }, }, required: ['q'], }, }, { name: 'list_brands', description: 'Retrieve a list of all brands in the database.', inputSchema: { type: 'object', properties: {} }, // No input required }, { name: 'list_families', description: 'Retrieve a list of all families for a given brand.', inputSchema: { type: 'object', properties: { brand_id: { oneOf: [{ type: 'string' }, { type: 'number' }], description: 'BrandID of the brand', }, }, required: ['brand_id'], }, }, { name: 'list_watches', description: 'Retrieve a list of watches for a particular Brand and/or Family, optionally filtered by update date.', inputSchema: { type: 'object', properties: { brand_id: { oneOf: [{ type: 'string' }, { type: 'number' }], description: 'BrandID of the brand', }, family_id: { oneOf: [{ type: 'string' }, { type: 'number' }], description: 'Optional: FamilyID of the family', }, updated_since: { type: 'string', format: 'date', // Indicates YYYY-MM-DD format description: 'Optional: Limit results to watches updated after this date (YYYY-MM-DD)', }, }, required: ['brand_id'], }, }, { name: 'get_watch_details', description: 'Retrieve the full details for a particular watch by its ID.', inputSchema: { type: 'object', properties: { id: { oneOf: [{ type: 'string' }, { type: 'number' }], description: 'ID of the watch', }, }, required: ['id'], }, }, ]; this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; let apiPath = ''; let apiParams: Record<string, any> = {}; try { switch (name) { case 'search': if (!isSearchArgs(args)) throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for search'); apiPath = 'search'; apiParams = { q: args.q }; break; case 'search_refnr': if (!isSearchArgs(args)) throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for search_refnr'); apiPath = 'search/refnr'; apiParams = { q: args.q }; break; case 'list_brands': // No specific argument validation needed apiPath = 'brands'; break; case 'list_families': if (!isListFamiliesArgs(args)) throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for list_families'); apiPath = 'families'; apiParams = { 'brand-id': args.brand_id }; // API uses hyphen break; case 'list_watches': if (!isListWatchesArgs(args)) throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for list_watches'); apiPath = 'watches'; apiParams = { 'brand-id': args.brand_id }; // API uses hyphen if (args.family_id !== undefined) { apiParams['family-id'] = args.family_id; // API uses hyphen } if (args.updated_since !== undefined) { apiParams['updated-since'] = args.updated_since; // API uses hyphen } break; case 'get_watch_details': if (!isGetWatchDetailsArgs(args)) throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for get_watch_details'); apiPath = 'watch'; apiParams = { id: args.id }; break; default: throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); } // Make the API call const response = await this.axiosInstance.get(apiPath, { params: apiParams }); // Return successful response return { content: [ { type: 'text', // Corrected type to 'text' text: JSON.stringify(response.data, null, 2), // JSON content is in the text field }, ], }; } catch (error) { console.error(`Error calling tool ${name}:`, error); // Log the error server-side let errorMessage = `Failed to execute tool ${name}.`; let errorCode = ErrorCode.InternalError; if (axios.isAxiosError(error)) { const axiosError = error as AxiosError<any>; errorMessage = `WatchBase API error: ${axiosError.response?.data?.error || axiosError.response?.statusText || axiosError.message}`; // Map HTTP status codes to MCP error codes if desired if (axiosError.response?.status === 401 || axiosError.response?.status === 403) { errorCode = ErrorCode.InternalError; // Changed from PermissionDenied errorMessage = `WatchBase API error: Invalid or unauthorized API key. Status: ${axiosError.response?.status}`; } else if (axiosError.response?.status === 404) { errorCode = ErrorCode.InvalidRequest; // Changed from NotFound errorMessage = `WatchBase API error: Resource not found. Status: 404`; } else if (axiosError.response?.status === 400) { errorCode = ErrorCode.InvalidParams; // Bad request, likely invalid params errorMessage = `WatchBase API error: Bad request (check parameters). Status: 400. ${axiosError.response?.data?.error || ''}`; } } else if (error instanceof McpError) { // Re-throw specific MCP errors (like InvalidParams, MethodNotFound) throw error; } // Return error content return { content: [ { type: 'text', text: errorMessage, }, ], isError: true, errorCode: errorCode, // Provide specific error code }; } }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); // Use console.error for logs to avoid interfering with MCP stdout communication console.error('WatchBase MCP server running on stdio'); } } // Instantiate and run the server const server = new WatchBaseServer(); server.run().catch((err) => { console.error('Server failed to start:', err); process.exit(1); }); ```