diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..12d0d18 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1274 @@ +{ + "name": "dify-6c0370d8-mcp", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dify-6c0370d8-mcp", + "version": "1.0.0", + "dependencies": { + "@mintlify/openapi-types": "^0.0.0", + "@mintlify/validation": "^0.1.320", + "@modelcontextprotocol/sdk": "^1.6.1", + "axios": "^1.8.1", + "dashify": "^2.0.0", + "js-yaml": "^4.1.0", + "trieve-ts-sdk": "^0.0.62" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@mintlify/models": { + "version": "0.0.193", + "resolved": "https://registry.npmjs.org/@mintlify/models/-/models-0.0.193.tgz", + "integrity": "sha512-Y1FjNGSTttZu7y7EUUVsBBIrMEWhRkMNsUxOAc88gLeDy3fQkONyCgFQus0FNdG/G9DzKxZDPurFLUul0VPmCQ==", + "license": "Elastic-2.0", + "dependencies": { + "axios": "^1.4.0", + "openapi-types": "^12.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@mintlify/openapi-types": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mintlify/openapi-types/-/openapi-types-0.0.0.tgz", + "integrity": "sha512-3IwycnOl+YrxO0EeYdyRikl1EZmzuLrN6z0zrkMV+kB7E+eHQ2hkJR+n3YGGVRzE68rEPAbFLD9fTtqTQhQZvQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@mintlify/validation": { + "version": "0.1.375", + "resolved": "https://registry.npmjs.org/@mintlify/validation/-/validation-0.1.375.tgz", + "integrity": "sha512-RFd0A9NrShueqe1rcC1NmMFPHtwu9loBys35kafLJkmBT/hajyZxu+w4akepdS3Cv5BDNfAeq4XHQCc6/OKl/Q==", + "license": "Elastic-2.0", + "dependencies": { + "@mintlify/models": "0.0.193", + "lcm": "^0.0.3", + "lodash": "^4.17.21", + "openapi-types": "^12.0.0", + "zod": "^3.20.6", + "zod-to-json-schema": "^3.20.3" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.0.tgz", + "integrity": "sha512-m//7RlINx1F3sz3KqwY1WWzVgTcYX52HYk4bJ1hkBXV3zccAEth+jRvG8DBRrdaQuRsPAJOx2MH3zaHNCKL7Zg==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dashify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dashify/-/dashify-2.0.0.tgz", + "integrity": "sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz", + "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gcd": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/gcd/-/gcd-0.0.1.tgz", + "integrity": "sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw==", + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/lcm": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/lcm/-/lcm-0.0.3.tgz", + "integrity": "sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ==", + "license": "MIT", + "dependencies": { + "gcd": "^0.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trieve-ts-sdk": { + "version": "0.0.62", + "resolved": "https://registry.npmjs.org/trieve-ts-sdk/-/trieve-ts-sdk-0.0.62.tgz", + "integrity": "sha512-N0397vNUr6PC6P3jfCisqqWjypVR7qGxldfWGX6hmYSFrfUwOc4QH13hS5HfntfgH18neH/PmlPZL49CGAnwFQ==", + "license": "MIT" + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.25.28", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.28.tgz", + "integrity": "sha512-/nt/67WYKnr5by3YS7LroZJbtcCBurDKKPBPWWzaxvVCGuG/NOsiKkrjoOhI8mJ+SQUXEbUzeB3S+6XDUEEj7Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..77ec916 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "dify-6c0370d8-mcp", + "version": "1.0.0", + "type": "module", + "description": "MCP server generated for the dify-6c0370d8 subdomain from Mintlify", + "engines": { + "node": ">=18.0.0" + }, + "main": "src/index.js", + "scripts": { + "start": "node src/index.js" + }, + "author": "Mintlify", + "dependencies": { + "@mintlify/openapi-types": "^0.0.0", + "@mintlify/validation": "^0.1.320", + "@modelcontextprotocol/sdk": "^1.6.1", + "axios": "^1.8.1", + "dashify": "^2.0.0", + "js-yaml": "^4.1.0", + "trieve-ts-sdk": "^0.0.62" + } +} \ No newline at end of file diff --git a/settings.d.ts b/settings.d.ts new file mode 100644 index 0000000..78eae9f --- /dev/null +++ b/settings.d.ts @@ -0,0 +1,2 @@ +export declare const SERVER_NAME: string; +export declare const SERVER_VERSION: string; diff --git a/settings.js b/settings.js new file mode 100644 index 0000000..0db7f99 --- /dev/null +++ b/settings.js @@ -0,0 +1,2 @@ +export const SERVER_NAME = 'mintlify'; +export const SERVER_VERSION = '1.0.0'; diff --git a/src/config.readonly.d.ts b/src/config.readonly.d.ts new file mode 100644 index 0000000..e101bb2 --- /dev/null +++ b/src/config.readonly.d.ts @@ -0,0 +1,2 @@ +export declare const SUBDOMAIN: Readonly; +export declare const SERVER_URL: Readonly; diff --git a/src/config.readonly.js b/src/config.readonly.js new file mode 100644 index 0000000..28f44b8 --- /dev/null +++ b/src/config.readonly.js @@ -0,0 +1,3 @@ +// read-only +export const SUBDOMAIN = 'dify-6c0370d8'; +export const SERVER_URL = 'https://leaves.mintlify.com'; diff --git a/src/connect.d.ts b/src/connect.d.ts new file mode 100644 index 0000000..a439652 --- /dev/null +++ b/src/connect.d.ts @@ -0,0 +1,2 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +export declare function connectServer(server: McpServer): Promise; diff --git a/src/connect.js b/src/connect.js new file mode 100644 index 0000000..e4cd872 --- /dev/null +++ b/src/connect.js @@ -0,0 +1,17 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +export function connectServer(server) { + return __awaiter(this, void 0, void 0, function* () { + const transport = new StdioServerTransport(); + yield server.connect(transport); + console.error('MCP Server running on stdio'); + }); +} diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..b934cc7 --- /dev/null +++ b/src/index.js @@ -0,0 +1,26 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { connectServer } from './connect.js'; +import { initialize } from './initialize.js'; +import { createSearchTool } from './search.js'; +import { createTools } from './tools/index.js'; +function main() { + return __awaiter(this, void 0, void 0, function* () { + const server = initialize(); + const existingTools = new Set(); + yield createSearchTool(server); + yield createTools(server, existingTools); + yield connectServer(server); + }); +} +main().catch((error) => { + console.error('Fatal error in trying to initialize MCP server: ', error); + process.exit(1); +}); diff --git a/src/initialize.d.ts b/src/initialize.d.ts new file mode 100644 index 0000000..eaaaf92 --- /dev/null +++ b/src/initialize.d.ts @@ -0,0 +1,2 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +export declare function initialize(): McpServer; diff --git a/src/initialize.js b/src/initialize.js new file mode 100644 index 0000000..0a219e8 --- /dev/null +++ b/src/initialize.js @@ -0,0 +1,10 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { SERVER_NAME, SERVER_VERSION } from '../settings.js'; +export function initialize() { + console.error('Initializing MCP Server...'); + const server = new McpServer({ + name: SERVER_NAME, + version: SERVER_VERSION, + }); + return server; +} diff --git a/src/search.d.ts b/src/search.d.ts new file mode 100644 index 0000000..e378ebe --- /dev/null +++ b/src/search.d.ts @@ -0,0 +1,4 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { InitializationConfiguration } from './types.js'; +export declare function fetchSearchConfigurationAndTools(subdomain: string): Promise; +export declare function createSearchTool(server: McpServer): Promise; diff --git a/src/search.js b/src/search.js new file mode 100644 index 0000000..efac8a5 --- /dev/null +++ b/src/search.js @@ -0,0 +1,81 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import axios from 'axios'; +import { TrieveSDK } from 'trieve-ts-sdk'; +import { z } from 'zod'; +import { SUBDOMAIN } from './config.readonly.js'; +import { SERVER_URL } from './config.readonly.js'; +import { formatErr, throwOnAxiosError } from './utils.js'; +const DEFAULT_BASE_URL = 'https://api.mintlifytrieve.com'; +export function fetchSearchConfigurationAndTools(subdomain) { + return __awaiter(this, void 0, void 0, function* () { + try { + const response = yield axios.get(`${SERVER_URL}/api/mcp/config/${subdomain}`, { + validateStatus() { + return true; + }, + }); + throwOnAxiosError(response, 'Failed to fetch MCP config'); + return response.data; + } + catch (err) { + throw new Error(formatErr(err).replace('Request failed with status code 404', `${subdomain} not found`)); + } + }); +} +function search(query, config) { + return __awaiter(this, void 0, void 0, function* () { + const trieve = new TrieveSDK({ + apiKey: config.trieveApiKey, + datasetId: config.trieveDatasetId, + baseUrl: DEFAULT_BASE_URL, + }); + const data = yield trieve.autocomplete({ + page_size: 10, + query, + search_type: 'fulltext', + extend_results: true, + score_threshold: 1, + }); + if (data.chunks === undefined || data.chunks.length === 0) { + throw new Error('No results found'); + } + return data.chunks.map((result) => { + const { chunk } = result; + // TODO: Append custom domain to the link + return { + title: chunk.metadata.title, + content: chunk.chunk_html, + link: chunk.link, + }; + }); + }); +} +export function createSearchTool(server) { + return __awaiter(this, void 0, void 0, function* () { + const config = yield fetchSearchConfigurationAndTools(SUBDOMAIN); + server.tool('search', `Search across the ${config.name} documentation to fetch relevant context for a given query`, { + query: z.string(), + }, (_a) => __awaiter(this, [_a], void 0, function* ({ query }) { + const results = yield search(query, config); + const content = results.map((result) => { + const { title, content, link } = result; + const text = `Title: ${title}\nContent: ${content}\nLink: ${link}`; + return { + type: 'text', + text, + }; + }); + return { + content, + }; + })); + }); +} diff --git a/src/tools.json b/src/tools.json new file mode 100644 index 0000000..e4b754d --- /dev/null +++ b/src/tools.json @@ -0,0 +1,8 @@ +[ + { + "tool": { + "name": "search", + "description": "Search across the Dify Docs documentation to fetch relevant context for a given query" + } + } +] \ No newline at end of file diff --git a/src/tools/helpers.d.ts b/src/tools/helpers.d.ts new file mode 100644 index 0000000..b15ebf2 --- /dev/null +++ b/src/tools/helpers.d.ts @@ -0,0 +1,23 @@ +import { OpenAPI } from '@mintlify/openapi-types'; +import { HttpMethod } from '@mintlify/validation'; +import { Endpoint } from '@mintlify/validation'; +import { DataSchemaArray } from '@mintlify/validation'; +import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import { ServerParams, ToolWithEndpoint } from '../types.js'; +import { SimpleRecord } from '../utils.js'; +export declare function convertStrToTitle(str: string): string; +export declare function findNextIteration(set: Set, str: string): number; +export declare function getMcpEnabledEndpointsFromOpenApiSpec(spec: OpenAPI.Document): Endpoint[]; +export declare function convertEndpointToTool(endpoint: Endpoint): Omit; +export declare function getMcpToolsAndEndpointsFromOpenApiSpec(spec: OpenAPI.Document): ToolWithEndpoint[]; +export declare function getEndpointsFromOpenApi(specification: OpenAPI.Document): Endpoint[]; +export declare function loadEnv(key: string): SimpleRecord; +export declare function convertEndpointToCategorizedZod(envKey: string, endpoint: Endpoint): { + url: string; + method: HttpMethod; + paths: ServerParams; + queries: ServerParams; + body: ServerParams | undefined; + headers: ServerParams; + cookies: ServerParams; +}; diff --git a/src/tools/helpers.js b/src/tools/helpers.js new file mode 100644 index 0000000..f282e3f --- /dev/null +++ b/src/tools/helpers.js @@ -0,0 +1,176 @@ +import { OpenApiToEndpointConverter, } from '@mintlify/validation'; +import dashify from 'dashify'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { OpenAPIV3 } from 'openapi-types'; +import { z } from 'zod'; +import { initializeObject } from '../utils.js'; +import { dataSchemaArrayToZod, dataSchemaToZod } from './zod.js'; +export function convertStrToTitle(str) { + const spacedString = str.replace(/[-_]/g, ' '); + const words = spacedString.split(/(?=[A-Z])|\s+/); + const titleCasedWords = words.map((word) => { + return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); + }); + return titleCasedWords.join(' '); +} +export function findNextIteration(set, str) { + let count = 1; + set.forEach((val) => { + if (val.startsWith(`${str}---`)) { + count = Number(val.replace(`${str}---`, '')); + } + }); + return count + 1; +} +export function getMcpEnabledEndpointsFromOpenApiSpec(spec) { + var _a; + const mcpEnabledEndpoints = []; + const isMcpEnabledGloballyInSpec = ((_a = spec['x-mcp']) === null || _a === void 0 ? void 0 : _a.enabled) === true; + const endpoints = getEndpointsFromOpenApi(spec); + if (isMcpEnabledGloballyInSpec) { + const notDisabledEndpoints = endpoints.filter((endpoint) => { var _a; return ((_a = endpoint.xMcp) === null || _a === void 0 ? void 0 : _a.enabled) !== false; }); + mcpEnabledEndpoints.push(...notDisabledEndpoints); + } + else { + const enabledEndpoints = endpoints.filter((endpoint) => { var _a; return ((_a = endpoint.xMcp) === null || _a === void 0 ? void 0 : _a.enabled) === true; }); + mcpEnabledEndpoints.push(...enabledEndpoints); + } + return mcpEnabledEndpoints; +} +export function convertEndpointToTool(endpoint) { + var _a, _b; + let name; + if ((_a = endpoint.xMcp) === null || _a === void 0 ? void 0 : _a.name) { + name = endpoint.xMcp.name; + } + else if (endpoint.title) { + name = dashify(endpoint.title); + } + else { + name = convertStrToTitle(endpoint.path); + } + let description; + if ((_b = endpoint.xMcp) === null || _b === void 0 ? void 0 : _b.description) { + description = endpoint.xMcp.description; + } + else if (endpoint.description) { + description = endpoint.description; + } + else { + description = `${endpoint.method} ${endpoint.path}`; + } + return { + name, + description, + }; +} +export function getMcpToolsAndEndpointsFromOpenApiSpec(spec) { + const endpoints = getMcpEnabledEndpointsFromOpenApiSpec(spec); + const toolsWithEndpoints = []; + endpoints.forEach((endpoint) => { + const tool = convertEndpointToTool(endpoint); + toolsWithEndpoints.push({ + tool, + endpoint, + }); + }); + return toolsWithEndpoints; +} +export function getEndpointsFromOpenApi(specification) { + const endpoints = []; + const paths = specification.paths; + for (const path in paths) { + const pathObj = paths[path]; + const httpMethods = Object.values(OpenAPIV3.HttpMethods); + for (const method of httpMethods) { + if (!pathObj || !(method in pathObj)) { + continue; + } + const endpoint = OpenApiToEndpointConverter.convert(specification, path, method, true); + endpoints.push(endpoint); + } + } + return endpoints; +} +export function loadEnv(key) { + var _a; + let envVars = {}; + try { + const envPath = path.join(fileURLToPath(import.meta.url), '../../../../', '.env.json'); + if (fs.existsSync(envPath)) { + envVars = JSON.parse(fs.readFileSync(envPath).toString()); + return (_a = envVars[key]) !== null && _a !== void 0 ? _a : {}; + } + } + catch (error) { + // if there's no env, the user will be prompted + // for their auth info at runtime if necessary + // (shouldn't happen either way) + } + return envVars; +} +function convertParameterSection(parameters, paramSection) { + Object.entries(parameters).forEach(([key, value]) => { + const schema = value.schema; + paramSection[key] = dataSchemaArrayToZod(schema); + }); +} +function convertParametersAndAddToRelevantParamGroups(parameters, paths, queries, headers, cookies) { + convertParameterSection(parameters.path, paths); + convertParameterSection(parameters.query, queries); + convertParameterSection(parameters.header, headers); + convertParameterSection(parameters.cookie, cookies); +} +function convertSecurityParameterSection(securityParameters, securityParamSection, envVariables, location) { + Object.entries(securityParameters).forEach(([key, value]) => { + let envKeyList = []; + let targetKey = ''; + switch (value.type) { + case 'apiKey': + envKeyList = [location, key]; + targetKey = 'API_KEY'; + break; + case 'http': + envKeyList = [location, key, 'HTTP']; + targetKey = value.scheme; + break; + case 'oauth2': + default: + break; + } + const target = initializeObject(Object.assign({}, envVariables), envKeyList); + if (envKeyList.length && !target[targetKey]) { + securityParamSection[key] = z.string(); + } + }); +} +function convertSecurityParametersAndAddToRelevantParamGroups(securityParameters, queries, headers, cookies, envVariables) { + convertSecurityParameterSection(securityParameters.query, queries, envVariables, 'query'); + convertSecurityParameterSection(securityParameters.header, headers, envVariables, 'header'); + convertSecurityParameterSection(securityParameters.cookie, cookies, envVariables, 'cookie'); +} +export function convertEndpointToCategorizedZod(envKey, endpoint) { + var _a, _b, _c; + const envVariables = loadEnv(envKey); + const url = `${((_b = (_a = endpoint.servers) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.url) || ''}${endpoint.path}`; + const method = endpoint.method; + const paths = {}; + const queries = {}; + const headers = {}; + const cookies = {}; + let body = undefined; + convertParametersAndAddToRelevantParamGroups(endpoint.request.parameters, paths, queries, headers, cookies); + if ((_c = endpoint.request.security[0]) === null || _c === void 0 ? void 0 : _c.parameters) { + convertSecurityParametersAndAddToRelevantParamGroups(endpoint.request.security[0].parameters, queries, headers, cookies, envVariables); + } + const jsonBodySchema = endpoint.request.body['application/json']; + const bodySchemaArray = jsonBodySchema === null || jsonBodySchema === void 0 ? void 0 : jsonBodySchema.schemaArray; + const bodySchema = bodySchemaArray === null || bodySchemaArray === void 0 ? void 0 : bodySchemaArray[0]; + if (bodySchema) { + const zodBodySchema = dataSchemaToZod(bodySchema); + body = { body: zodBodySchema }; + } + return { url, method, paths, queries, body, headers, cookies }; +} diff --git a/src/tools/index.d.ts b/src/tools/index.d.ts new file mode 100644 index 0000000..7f00e37 --- /dev/null +++ b/src/tools/index.d.ts @@ -0,0 +1,2 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +export declare function createTools(server: McpServer, existingTools: Set): Promise; diff --git a/src/tools/index.js b/src/tools/index.js new file mode 100644 index 0000000..87ebfc7 --- /dev/null +++ b/src/tools/index.js @@ -0,0 +1,138 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import axios, { isAxiosError } from 'axios'; +import dashify from 'dashify'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { convertEndpointToCategorizedZod, convertStrToTitle, findNextIteration, loadEnv, } from './helpers.js'; +export function createTools(server, existingTools) { + return __awaiter(this, void 0, void 0, function* () { + const toolsDir = path.join(fileURLToPath(import.meta.url), '..', '..'); + let tools = JSON.parse(fs.readFileSync(path.join(toolsDir, 'tools.json'), 'utf-8')); + tools = tools.filter((tool) => tool.endpoint); + tools.forEach(({ uuid, endpoint }) => { + const envVars = loadEnv(uuid); + const { url: urlSchema, method: methodSchema, paths: pathsSchema, queries: queriesSchema, body: bodySchema, headers: headersSchema, cookies: cookiesSchema, } = convertEndpointToCategorizedZod(uuid, endpoint); + const serverArgumentsSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, pathsSchema), queriesSchema), bodySchema), headersSchema), cookiesSchema); + if (!endpoint.title) { + endpoint.title = `${endpoint.method} ${convertStrToTitle(endpoint.path)}`; + } + if (existingTools.has(endpoint.title)) { + const lastCount = findNextIteration(existingTools, endpoint.title); + endpoint.title = `${endpoint.title}---${lastCount}`; + } + if (endpoint.title.length > 64) { + endpoint.title = endpoint.title.slice(0, -64); + } + existingTools.add(endpoint.title); + server.tool(dashify(endpoint.title), endpoint.description || endpoint.title, serverArgumentsSchemas, (inputArgs) => __awaiter(this, void 0, void 0, function* () { + var _a; + const inputParams = {}; + const inputHeaders = {}; + const inputCookies = {}; + let urlWithPathParams = urlSchema; + let inputBody = undefined; + if ('body' in inputArgs) { + inputBody = inputArgs.body; + delete inputArgs.body; + } + Object.entries(inputArgs).forEach(([key, value]) => { + if (key in pathsSchema) { + urlWithPathParams = urlWithPathParams.replace(`{${key}}`, value); + } + else if (key in queriesSchema) { + inputParams[key] = value; + } + else if (key in headersSchema) { + inputHeaders[key] = value; + } + else if (key in cookiesSchema) { + inputCookies[key] = value; + } + }); + if (endpoint.request.security.length > 0) { + const securityParams = (_a = endpoint.request.security[0]) === null || _a === void 0 ? void 0 : _a.parameters; + if (securityParams) { + Object.entries(securityParams.query).forEach(([key, value]) => { + let envKey = ''; + if (value.type === 'apiKey') { + envKey = `query_${key}_APIKEY`; + } + else if (value.type === 'http') { + envKey = `query_${key}_HTTP_${value.scheme}`; + } + if (envKey && envKey in envVars) { + inputParams[key] = envVars[envKey]; + } + }); + Object.entries(securityParams.header).forEach(([key, value]) => { + let envKey = ''; + if (value.type === 'apiKey') { + envKey = `header_${key}_APIKEY`; + } + else if (value.type === 'http') { + envKey = `header_${key}_HTTP_${value.scheme}`; + if (value.scheme === 'bearer' && envKey in envVars) { + inputHeaders['Authorization'] = `Bearer ${envVars[envKey]}`; + return; + } + } + if (envKey && envKey in envVars) { + inputHeaders[key] = envVars[envKey]; + } + }); + Object.entries(securityParams.cookie).forEach(([key, value]) => { + let envKey = ''; + if (value.type === 'apiKey') { + envKey = `cookie_${key}_APIKEY`; + } + else if (value.type === 'http') { + envKey = `cookie_${key}_HTTP_${value.scheme}`; + } + if (envKey && envKey in envVars) { + inputCookies[key] = envVars[envKey]; + } + }); + } + } + try { + const response = yield axios({ + url: urlWithPathParams, + method: methodSchema, + params: inputParams, + data: inputBody, + headers: inputHeaders, + }); + return { + content: [ + { + type: 'text', + text: JSON.stringify(response.data, undefined, 2), + }, + ], + }; + } + catch (error) { + const errMsg = JSON.stringify(error, undefined, 2); + return { + isError: true, + content: [ + { + type: 'text', + text: isAxiosError(error) ? `${error.message}\n\n${errMsg}` : errMsg, + }, + ], + }; + } + })); + }); + }); +} diff --git a/src/tools/zod.d.ts b/src/tools/zod.d.ts new file mode 100644 index 0000000..09f771b --- /dev/null +++ b/src/tools/zod.d.ts @@ -0,0 +1,6 @@ +import { DataSchema, DataSchemaArray, IncrementalDataSchema, IncrementalDataSchemaArray } from '@mintlify/validation'; +import { z } from 'zod'; +type SchemaInput = DataSchema | IncrementalDataSchema; +export declare function dataSchemaArrayToZod(schemas: DataSchemaArray | IncrementalDataSchemaArray): z.ZodTypeAny; +export declare function dataSchemaToZod(schema: SchemaInput): z.ZodTypeAny; +export {}; diff --git a/src/tools/zod.js b/src/tools/zod.js new file mode 100644 index 0000000..93c6d95 --- /dev/null +++ b/src/tools/zod.js @@ -0,0 +1,185 @@ +import { Blob } from 'node:buffer'; +import { z } from 'zod'; +function panic(error) { + throw error; +} +// WebFile polyfill implementation partly taken from the fetch-blob package: +// https://github.com/node-fetch/fetch-blob/blob/main/file.js - MIT License +const WebFile = class File extends Blob { + constructor(init, name = panic(new TypeError('File constructor requires name argument')), options = {}) { + if (arguments.length < 2) { + throw new TypeError(`Failed to construct 'File': 2 arguments required, but only ${arguments.length} present.`); + } + super(init, options); + this._lastModified = 0; + this._name = ''; + // Simulate WebIDL type casting for NaN value in lastModified option. + const lastModified = options.lastModified === undefined ? Date.now() : Number(options.lastModified); + if (!Number.isNaN(lastModified)) { + this._lastModified = lastModified; + } + this._name = String(name); + } + get name() { + return this._name; + } + get lastModified() { + return this._lastModified; + } + get [Symbol.toStringTag]() { + return 'File'; + } + static [Symbol.hasInstance](object) { + return (!!object && object instanceof Blob && /^(File)$/.test(String(object[Symbol.toStringTag]))); + } +}; +const File = typeof global.File === 'undefined' ? WebFile : global.File; +const ANY = z.any(); +const ANY_OPT = ANY.optional(); +const BOOLEAN = z.boolean(); +const BOOLEAN_OPT = BOOLEAN.optional(); +const DATE = z.coerce.date(); +const DATE_OPT = DATE.optional(); +const FILE = z.instanceof(File); +const FILE_OPT = FILE.optional(); +const NULL = z.null(); +const NULL_OPT = NULL.optional(); +const RECORD = z.record(z.any()); +const RECORD_WITH_DEFAULT = RECORD.default({}); +const RECORD_OPT = RECORD.optional(); +const STRING = z.string(); +const NUMBER = z.number(); +const INTEGER = z.number().int(); +export function dataSchemaArrayToZod(schemas) { + const firstSchema = dataSchemaToZod(schemas[0]); + if (!schemas[1]) { + return firstSchema; + } + const secondSchema = dataSchemaToZod(schemas[1]); + const zodSchemas = [firstSchema, secondSchema]; + for (const schema of schemas.slice(2)) { + zodSchemas.push(dataSchemaToZod(schema)); + } + return z.union(zodSchemas).array(); +} +function getEnumSchema(enumList, type) { + const zodSchema = z.enum(enumList.map(String)); + if (type === 'string') + return zodSchema; + return zodSchema.transform(Number); +} +export function dataSchemaToZod(schema) { + if (!('type' in schema) || Object.keys(schema).length === 0) { + return schema.required ? ANY : ANY_OPT; + } + switch (schema.type) { + case 'null': + return schema.required ? NULL : NULL_OPT; + case 'boolean': + return schema.required ? BOOLEAN : BOOLEAN_OPT; + case 'enum': + const strEnumSchema = getEnumSchema(schema.enum, 'string'); + return schema.required ? strEnumSchema : strEnumSchema.optional(); + case 'enum': + case 'enum': + const numEnumSchema = getEnumSchema(schema.enum, 'number'); + return schema.required ? numEnumSchema : numEnumSchema.optional(); + case 'file': + return schema.required ? FILE : FILE_OPT; + case 'any': + return schema.required ? ANY : ANY_OPT; + case 'string': + if ('enum' in schema && Array.isArray(schema.enum)) { + return schema.required + ? z.enum(schema.enum) + : z.enum(schema.enum).optional(); + } + if (schema.format === 'binary') { + return schema.required ? FILE : FILE_OPT; + } + let stringSchema = STRING; + if (schema.minLength !== undefined) { + stringSchema = stringSchema.min(schema.minLength); + } + if (schema.maxLength !== undefined) { + stringSchema = stringSchema.max(schema.maxLength); + } + if (schema.pattern !== undefined) { + stringSchema = stringSchema.regex(new RegExp(schema.pattern)); + } + switch (schema.format) { + case 'email': + stringSchema = stringSchema.email(); + break; + case 'uri': + case 'url': + stringSchema = stringSchema.url(); + break; + case 'uuid': + stringSchema = stringSchema.uuid(); + break; + case 'date-time': + return schema.required ? DATE : DATE_OPT; + } + return schema.required ? stringSchema : stringSchema.optional(); + case 'number': + case 'integer': + if ('enum' in schema && Array.isArray(schema.enum)) { + const numEnumSchema = getEnumSchema(schema.enum, schema.type); + return schema.required ? numEnumSchema : numEnumSchema.optional(); + } + let numberSchema = schema.type === 'integer' ? INTEGER : NUMBER; + if (schema.minimum !== undefined) { + numberSchema = numberSchema.min(schema.minimum); + } + if (schema.maximum !== undefined) { + numberSchema = numberSchema.max(schema.maximum); + } + if (schema.exclusiveMinimum !== undefined && schema.minimum !== undefined) { + numberSchema = numberSchema.gt(schema.minimum); + } + if (schema.exclusiveMaximum !== undefined && schema.maximum !== undefined) { + numberSchema = numberSchema.lt(schema.maximum); + } + return schema.required ? numberSchema : numberSchema.optional(); + case 'array': + let itemSchema; + let arraySchema = z.any().array(); + if (Array.isArray(schema.items)) { + itemSchema = dataSchemaArrayToZod(schema.items); + if (schema.items.length > 1) { + arraySchema = itemSchema; + } + else { + arraySchema = itemSchema.array(); + } + } + else { + itemSchema = dataSchemaToZod(schema.items); + arraySchema = itemSchema.array(); + } + if (schema.minItems !== undefined) { + arraySchema = arraySchema.min(schema.minItems); + } + if (schema.maxItems !== undefined) { + arraySchema = arraySchema.max(schema.maxItems); + } + return schema.required ? arraySchema : arraySchema.optional(); + case 'object': + const shape = {}; + const requiredProperties = schema.requiredProperties; + const requiredPropertiesSet = new Set(requiredProperties !== null && requiredProperties !== void 0 ? requiredProperties : []); + for (const [key, propSchema] of Object.entries(schema.properties)) { + const zodPropSchema = Array.isArray(propSchema) + ? dataSchemaArrayToZod(propSchema) + : dataSchemaToZod(propSchema); + shape[key] = requiredPropertiesSet.has(key) ? zodPropSchema : zodPropSchema.optional(); + } + if (Object.keys(shape).length === 0) { + return schema.required ? RECORD_WITH_DEFAULT : RECORD_OPT; + } + return schema.required ? z.object(shape) : z.object(shape).optional(); + default: + return ANY; + } +} diff --git a/src/utils.d.ts b/src/utils.d.ts new file mode 100644 index 0000000..1688cd4 --- /dev/null +++ b/src/utils.d.ts @@ -0,0 +1,10 @@ +import { OpenAPI } from '@mintlify/openapi-types'; +import { AxiosResponse } from 'axios'; +export type NestedRecord = string | { + [key: string]: NestedRecord; +}; +export type SimpleRecord = Record; +export declare function initializeObject(obj: SimpleRecord, path: string[]): SimpleRecord; +export declare function getFileId(spec: OpenAPI.Document, index: number): string | number; +export declare function throwOnAxiosError(response: AxiosResponse, errMsg: string): void; +export declare function formatErr(err: unknown): any; diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..966d2ab --- /dev/null +++ b/src/utils.js @@ -0,0 +1,55 @@ +import axios from 'axios'; +export function initializeObject(obj, path) { + let current = obj; + for (const key of path) { + if (!current[key] || typeof current[key] !== 'object') { + current[key] = {}; + } + current = current[key]; + } + return current; +} +export function getFileId(spec, index) { + var _a; + return ((_a = spec.info) === null || _a === void 0 ? void 0 : _a.title) && spec.info.version + ? `${spec.info.title} - ${spec.info.version}` + : index; +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function throwOnAxiosError(response, errMsg) { + var _a, _b; + if (response.status !== 200) { + if (((_a = response.headers['content-type']) === null || _a === void 0 ? void 0 : _a.includes('application/json')) && ((_b = response.data) === null || _b === void 0 ? void 0 : _b.error)) { + throw new Error(`${errMsg}: ${response.data.error}`); + } + else { + throw new Error(`${errMsg}: ${response.status} ${response.statusText || ''}`); + } + } + if (!response.data) { + throw new Error(`${errMsg}: ${response.status} ${response.statusText}`); + } +} +export function formatErr(err) { + var _a, _b; + if (axios.isAxiosError(err)) { + if (err.message) { + return err.message; + } + else if (err.response) { + return (_b = (_a = err.response.data) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : `${err.response.status} ${err.response.statusText}`; + } + else if (err.request) { + return 'No response received from server'; + } + else { + err = 'An unknown error occurred'; + } + } + else if (err instanceof Error) { + return err.message; + } + else { + return JSON.stringify(err, undefined, 2); + } +}