From ac95d3b66b968a1e069722633faa67c6e7aed8f0 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Fri, 28 Nov 2025 18:03:35 +0900 Subject: [PATCH 01/10] Remove package-lock.json and add pnpm-lock.yaml for dependency management transition --- package-lock.json | 2694 --------------------------------------------- pnpm-lock.yaml | 1732 +++++++++++++++++++++++++++++ 2 files changed, 1732 insertions(+), 2694 deletions(-) delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 97c09a8..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2694 +0,0 @@ -{ - "name": "microcms-mcp-server", - "version": "0.5.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "microcms-mcp-server", - "version": "0.5.2", - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.0.0", - "microcms-js-sdk": "^3.1.2" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.0.0", - "prettier": "^3.0.0", - "typescript": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.1.tgz", - "integrity": "sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==", - "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/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.17.57", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.57.tgz", - "integrity": "sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "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/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "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/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "license": "MIT", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "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/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "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/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/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "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/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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/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/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "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/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "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/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/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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/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/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "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/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/microcms-js-sdk": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/microcms-js-sdk/-/microcms-js-sdk-3.2.0.tgz", - "integrity": "sha512-08TyGuBg3oBU27CUT0rn7GDgLu58pZ9F3aBpAa5boJJsllkz9BosLWsqOM9dfGTcVOga+/9tMtwHtmq17MK2KQ==", - "license": "Apache-2.0", - "dependencies": { - "async-retry": "^1.3.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "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/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "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/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/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "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/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/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "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", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "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/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.49", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.49.tgz", - "integrity": "sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q==", - "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/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c1d24f7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1732 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@modelcontextprotocol/sdk': + specifier: ^1.0.0 + version: 1.12.1 + microcms-js-sdk: + specifier: ^3.1.2 + version: 3.2.0 + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.17.57 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + eslint: + specifier: ^8.0.0 + version: 8.57.1 + prettier: + specifier: ^3.0.0 + version: 3.5.3 + typescript: + specifier: ^5.0.0 + version: 5.8.3 + +packages: + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@modelcontextprotocol/sdk@1.12.1': + resolution: {integrity: sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==} + engines: {node: '>=18'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@20.17.57': + resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.0.2: + resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + express-rate-limit@7.5.0: + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + engines: {node: '>= 16'} + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + microcms-js-sdk@3.2.0: + resolution: {integrity: sha512-08TyGuBg3oBU27CUT0rn7GDgLu58pZ9F3aBpAa5boJJsllkz9BosLWsqOM9dfGTcVOga+/9tMtwHtmq17MK2KQ==} + engines: {node: '>=18.0.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + + zod@3.25.49: + resolution: {integrity: sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q==} + +snapshots: + + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@modelcontextprotocol/sdk@1.12.1': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + express: 5.1.0 + express-rate-limit: 7.5.0(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.25.49 + zod-to-json-schema: 3.24.5(zod@3.25.49) + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@types/json-schema@7.0.15': {} + + '@types/node@20.17.57': + dependencies: + undici-types: 6.19.8 + + '@types/semver@7.7.0': {} + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + eslint: 8.57.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + balanced-match@1.0.2: {} + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + 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.1 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + depd@2.0.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventsource-parser@3.0.2: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.2 + + express-rate-limit@7.5.0(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + 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.1 + 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.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-promise@4.0.0: {} + + isexe@2.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + merge2@1.4.1: {} + + microcms-js-sdk@3.2.0: + dependencies: + async-retry: 1.3.3 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.54.0: {} + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-to-regexp@8.2.0: {} + + path-type@4.0.0: {} + + picomatch@2.3.1: {} + + pkce-challenge@5.0.0: {} + + prelude-ls@1.2.1: {} + + prettier@3.5.3: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + resolve-from@4.0.0: {} + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + 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 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + slash@3.0.0: {} + + statuses@2.0.1: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + text-table@0.2.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + ts-api-utils@1.4.3(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typescript@5.8.3: {} + + undici-types@6.19.8: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vary@1.1.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yocto-queue@0.1.0: {} + + zod-to-json-schema@3.24.5(zod@3.25.49): + dependencies: + zod: 3.25.49 + + zod@3.25.49: {} From e04dac4404de699875f248c1935364b445013dea Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Fri, 28 Nov 2025 18:06:55 +0900 Subject: [PATCH 02/10] Add ESLint configuration for TypeScript support - Introduced a new `.eslintrc.cjs` file to set up ESLint with TypeScript. - Configured parser, environment, and rules to enhance code quality and maintainability. --- eslint.config.js => .eslintrc.cjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename eslint.config.js => .eslintrc.cjs (89%) diff --git a/eslint.config.js b/.eslintrc.cjs similarity index 89% rename from eslint.config.js rename to .eslintrc.cjs index b34e7d5..ae90723 100644 --- a/eslint.config.js +++ b/.eslintrc.cjs @@ -1,8 +1,8 @@ -export default { +module.exports = { parser: '@typescript-eslint/parser', extends: [ 'eslint:recommended', - '@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended', ], plugins: ['@typescript-eslint'], parserOptions: { @@ -20,4 +20,4 @@ export default { 'no-console': ['warn', { allow: ['warn', 'error'] }], }, ignorePatterns: ['dist/', 'node_modules/'], -}; \ No newline at end of file +}; From c5709d7a34ed992548f3ab1a7a72fdedb9c56ab3 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Fri, 28 Nov 2025 18:10:39 +0900 Subject: [PATCH 03/10] Enhance microCMS Management API support with multi-service mode - Updated `.env.example` to include configuration for multi-service mode, allowing connection to multiple microCMS services via a JSON array. - Expanded `README.md` with detailed instructions for using single and multi-service modes, including examples and notes on configuration. - Refactored `cli.ts`, `client.ts`, and `config.ts` to support multi-service functionality, including client initialization and service ID handling. - Updated various tools to accept `serviceId` as an optional parameter, ensuring compatibility with both single and multi-service modes. - Enhanced error handling and validation for service configurations. - Improved server request handling to accommodate new multi-service capabilities. --- .env.example | 25 +- README.md | 81 +++++- src/cli.ts | 66 +++-- src/client.ts | 334 ++++++++++++++++++---- src/config.ts | 130 ++++++++- src/server.ts | 266 ++++++++++------- src/tools/create-content-draft.ts | 17 +- src/tools/create-content-published.ts | 17 +- src/tools/delete-content.ts | 16 +- src/tools/delete-media.ts | 19 +- src/tools/get-api-info.ts | 20 +- src/tools/get-apis-list.ts | 20 +- src/tools/get-content-meta.ts | 16 +- src/tools/get-content.ts | 18 +- src/tools/get-contents-list-management.ts | 62 ++-- src/tools/get-list-meta.ts | 72 ++--- src/tools/get-list.ts | 18 +- src/tools/get-media.ts | 38 ++- src/tools/get-member.ts | 16 +- src/tools/patch-content-created-by.ts | 27 +- src/tools/patch-content-status.ts | 17 +- src/tools/patch-content.ts | 18 +- src/tools/update-content-draft.ts | 17 +- src/tools/update-content-published.ts | 18 +- src/tools/upload-media.ts | 39 ++- src/types.ts | 78 ++++- 26 files changed, 1130 insertions(+), 335 deletions(-) diff --git a/.env.example b/.env.example index 35900ff..3545981 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,9 @@ # microCMS Service Configuration # Copy this file to .env and fill in your actual values +# ============================================ +# Single Service Mode (従来の設定方法) +# ============================================ # Your microCMS service id (without .microcms.io) # Example: If your URL is https://my-blog.microcms.io, set this to "my-blog" MICROCMS_SERVICE_ID=your-service-id @@ -9,6 +12,22 @@ MICROCMS_SERVICE_ID=your-service-id # Get this from your microCMS dashboard MICROCMS_API_KEY=your-api-key -# Note: You can also pass these as command line arguments: -# node dist/index.js --service-id your-service-id --api-key your-api-key -# Command line arguments take precedence over environment variables. \ No newline at end of file +# ============================================ +# Multi Service Mode (複数サービス対応) +# ============================================ +# 複数のmicroCMSサービスに接続する場合は、以下の形式でJSON配列を設定します。 +# MICROCMS_SERVICES が設定されている場合、上記の単一サービス設定より優先されます。 +# +# 例: 2つのサービス (blog と shop) に接続する場合 +# MICROCMS_SERVICES=[{"id":"blog","apiKey":"your-blog-api-key"},{"id":"shop","apiKey":"your-shop-api-key"}] +# +# 複数サービスモードでは、各ツール呼び出し時に serviceId パラメータを指定します。 +# ツール名は単一サービスモードと同じ microcms_* 形式です。 +# 設定済みサービスの一覧は microcms://services リソースで確認できます。 + +# ============================================ +# Notes +# ============================================ +# - You can also pass these as command line arguments (single service mode only): +# node dist/index.js --service-id your-service-id --api-key your-api-key +# - Command line arguments take precedence over environment variables. diff --git a/README.md b/README.md index 4355cb1..4839184 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Claude Desktopに導入する場合、mcpbファイルを使って簡単にイ 2. ダウンロードしたmcpbファイルをダブルクリックで開く 3. サービスIDとAPIキーを設定する -### 方法2: npx をつかう +### 方法2: npx をつかう(単一サービス) ```json { @@ -38,6 +38,42 @@ Claude Desktopに導入する場合、mcpbファイルを使って簡単にイ 設定更新後はクライアントを再起動してください。 +### 方法3: 複数サービスを使う + +複数のmicroCMSサービスに接続する場合は、`MICROCMS_SERVICES` 環境変数にJSON形式でサービス情報を設定します。 + +```json +{ + "mcpServers": { + "microcms-multi": { + "command": "npx", + "args": ["-y", "microcms-mcp-server@latest"], + "env": { + "MICROCMS_SERVICES": "[{\"id\":\"blog\",\"apiKey\":\"xxx-api-key\"},{\"id\":\"shop\",\"apiKey\":\"yyy-api-key\"}]" + } + } + } +} +``` + +#### 複数サービスモードの動作 + +複数サービスモードでは、各ツールに `serviceId` パラメータが必須になります。 + +- ツール名は単一サービスモードと同じ `microcms_*` 形式です +- 各ツール呼び出し時に `serviceId` を指定してサービスを選択します +- 設定済みサービスの一覧は `microcms://services` リソースで確認できます + +#### 後方互換性 + +| 設定方法 | モード | serviceIdパラメータ | +|---------|-------|-------------------| +| `MICROCMS_SERVICE_ID` + `MICROCMS_API_KEY` | 単一サービス | 省略可(自動でデフォルトサービスを使用) | +| `MICROCMS_SERVICES` (JSON) | 複数サービス | 必須 | + +- 従来の環境変数設定をそのまま使う場合、serviceIdを指定せずに今まで通り動作します +- 両方の設定が存在する場合、`MICROCMS_SERVICES` が優先されます + ## 利用方法 microCMSのコンテンツを確認する @@ -68,6 +104,49 @@ microCMSのメディア一覧に画像をアップロードする - https://example.com/sample-image-3.png ``` +### 複数サービスモードでの使用例 + +複数サービスモードでは、サービスIDを指定して各サービスを操作できます。 + +``` +blogサービスの記事一覧を取得して +``` + +``` +shopサービスに新しい商品を追加して +``` + +``` +blogの最新記事をshopの商品説明にコピーして +``` + +#### サービス一覧の確認 + +`microcms://services` リソースを読み取ることで、設定済みサービスと各サービスのAPI(エンドポイント)一覧を確認できます。AIエージェントはこの情報を使って、指定されたendpointがどのサービスに属するか判断できます。 + +```json +{ + "mode": "multi", + "description": "Multi service mode - serviceId parameter is required for all tools. Use the serviceId that contains the endpoint you need.", + "services": [ + { + "id": "blog", + "apis": [ + { "name": "ブログ記事", "endpoint": "blogs", "type": "list" }, + { "name": "カテゴリー", "endpoint": "categories", "type": "list" } + ] + }, + { + "id": "shop", + "apis": [ + { "name": "商品", "endpoint": "products", "type": "list" }, + { "name": "注文", "endpoint": "orders", "type": "list" } + ] + } + ] +} +``` + ### より詳しい使い方 以下の記事でより詳しい使い方を紹介しています。 diff --git a/src/cli.ts b/src/cli.ts index 8699bc0..ff4ad49 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,10 +1,9 @@ #!/usr/bin/env node import { parseArgs } from 'node:util'; -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; export function showHelp() { + // eslint-disable-next-line no-console console.log(` microCMS MCP Server @@ -14,34 +13,56 @@ Usage: npx microcms-mcp-server [options] Options: - --service-id microCMS service ID (required) - --api-key microCMS API key (required) + --service-id microCMS service ID (for single service mode) + --api-key microCMS API key (for single service mode) --help Show this help message --version Show version information Environment Variables: - MICROCMS_SERVICE_ID Service ID (fallback) - MICROCMS_API_KEY API key (fallback) + Single service mode: + MICROCMS_SERVICE_ID Service ID + MICROCMS_API_KEY API key + + Multi service mode: + MICROCMS_SERVICES JSON array of services + Example: '[{"id":"blog","apiKey":"xxx"},{"id":"shop","apiKey":"yyy"}]' Examples: + # Single service mode npx microcms-mcp-server --service-id my-blog --api-key your-key - # Using environment variables + # Using environment variables (single service) export MICROCMS_SERVICE_ID=my-blog export MICROCMS_API_KEY=your-key npx microcms-mcp-server -Claude Desktop Configuration: + # Multi service mode + export MICROCMS_SERVICES='[{"id":"blog","apiKey":"xxx"},{"id":"shop","apiKey":"yyy"}]' + npx microcms-mcp-server + +Claude Desktop Configuration (Single Service): +{ + "mcpServers": { + "microcms": { + "command": "npx", + "args": ["-y", "microcms-mcp-server"], + "env": { + "MICROCMS_SERVICE_ID": "your-service-id", + "MICROCMS_API_KEY": "your-api-key" + } + } + } +} + +Claude Desktop Configuration (Multi Service): { "mcpServers": { "microcms": { "command": "npx", - "args": [ - "-y", - "microcms-mcp-server", - "--service-id", "your-service-id", - "--api-key", "your-api-key" - ] + "args": ["-y", "microcms-mcp-server"], + "env": { + "MICROCMS_SERVICES": "[{\\"id\\":\\"blog\\",\\"apiKey\\":\\"xxx\\"},{\\"id\\":\\"shop\\",\\"apiKey\\":\\"yyy\\"}]" + } } } } @@ -50,7 +71,7 @@ Claude Desktop Configuration: export async function runCli() { try { - const { values, positionals } = parseArgs({ + const { values } = parseArgs({ args: process.argv.slice(2), options: { 'service-id': { @@ -83,12 +104,21 @@ export async function runCli() { } // 設定の検証 - if (!process.env.MICROCMS_SERVICE_ID || !process.env.MICROCMS_API_KEY) { + // MICROCMS_SERVICES が設定されている場合はマルチサービスモード(単一サービス設定は不要) + const hasMultiServiceConfig = !!process.env.MICROCMS_SERVICES; + const hasSingleServiceConfig = !!(process.env.MICROCMS_SERVICE_ID && process.env.MICROCMS_API_KEY); + + if (!hasMultiServiceConfig && !hasSingleServiceConfig) { console.error('Error: microCMS credentials are required.'); console.error(''); console.error('Provide them via:'); - console.error(' --service-id --api-key '); - console.error(' or environment variables MICROCMS_SERVICE_ID and MICROCMS_API_KEY'); + console.error(' Single service mode:'); + console.error(' --service-id --api-key '); + console.error(' or environment variables MICROCMS_SERVICE_ID and MICROCMS_API_KEY'); + console.error(''); + console.error(' Multi service mode:'); + console.error(' environment variable MICROCMS_SERVICES (JSON array)'); + console.error(' Example: MICROCMS_SERVICES=\'[{"id":"blog","apiKey":"xxx"}]\''); console.error(''); console.error('Run with --help for more information.'); process.exit(1); diff --git a/src/client.ts b/src/client.ts index 3102936..449a029 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,29 +1,200 @@ import { createClient, createManagementClient, MicroCMSQueries } from 'microcms-js-sdk'; -import type { MicroCMSContent, MicroCMSListResponse } from './types.js'; import { parseConfig } from './config.js'; +import type { + ApiInfo, + ApiListResponse, + AppConfig, + ContentMeta, + ContentMetaListResponse, + MediaListResponse, + MediaUploadResponse, + MemberInfo, + MicroCMSContent, + MicroCMSListResponse, + ServiceConfig, +} from './types.js'; + +// Use ReturnType to get actual client types from factory functions +type ContentClient = ReturnType; +type ManagementClient = ReturnType; + +// Client storage for multi-service mode +interface ServiceClients { + client: ContentClient; + managementClient: ManagementClient; + serviceDomain: string; + apiKey: string; +} + +const clientMap = new Map(); +let appConfig: AppConfig | null = null; +let defaultServiceId: string | null = null; + +/** + * Initialize clients based on configuration. + * Call this once at server startup. + */ +export function initializeClients(): AppConfig { + appConfig = parseConfig(); + + if (appConfig.mode === 'single') { + // Single service mode (legacy) + const clients = createClientsForService({ + id: appConfig.serviceDomain, + apiKey: appConfig.apiKey, + }); + clientMap.set(appConfig.serviceDomain, clients); + defaultServiceId = appConfig.serviceDomain; + } else { + // Multi service mode + for (const service of appConfig.services) { + const clients = createClientsForService(service); + clientMap.set(service.id, clients); + } + defaultServiceId = appConfig.services[0].id; + } + + return appConfig; +} + +/** + * Create microCMS clients for a service + */ +function createClientsForService(service: ServiceConfig): ServiceClients { + return { + client: createClient({ + serviceDomain: service.id, + apiKey: service.apiKey, + }), + managementClient: createManagementClient({ + serviceDomain: service.id, + apiKey: service.apiKey, + }), + serviceDomain: service.id, + apiKey: service.apiKey, + }; +} + +/** + * Get current app configuration + */ +export function getAppConfig(): AppConfig { + if (!appConfig) { + throw new Error('Clients not initialized. Call initializeClients() first.'); + } + return appConfig; +} + +/** + * Get all registered service IDs + */ +export function getServiceIds(): string[] { + return Array.from(clientMap.keys()); +} + +/** + * Check if a service is registered + */ +export function hasService(serviceId: string): boolean { + return clientMap.has(serviceId); +} + +/** + * Get clients for a specific service. + * In single-service mode, serviceId is optional and defaults to the configured service. + * In multi-service mode, serviceId is required. + * Automatically initializes clients if not already done (lazy initialization). + */ +export function getClientsForService(serviceId?: string): ServiceClients { + ensureInitialized(); + + // Validate serviceId requirement based on mode + if (!serviceId) { + if (appConfig?.mode === 'multi') { + const available = getServiceIds().join(', '); + throw new Error( + `serviceId is required in multi-service mode. Available services: ${available}` + ); + } + return getDefaultClients(); + } + + const clients = clientMap.get(serviceId); + if (!clients) { + const available = getServiceIds().join(', '); + throw new Error( + `Service "${serviceId}" not found. Available services: ${available || 'none'}` + ); + } + return clients; +} + +/** + * Ensure clients are initialized. + * This provides lazy initialization for backward compatibility with legacy exports. + */ +function ensureInitialized(): void { + if (!appConfig) { + initializeClients(); + } +} -const config = parseConfig(); +/** + * Get the default service clients (for backward compatibility) + * Automatically initializes clients if not already done (lazy initialization). + */ +function getDefaultClients(): ServiceClients { + ensureInitialized(); + if (!defaultServiceId) { + throw new Error('Clients not initialized. This should not happen.'); + } + return getClientsForService(defaultServiceId); +} -export const microCMSClient = createClient({ - serviceDomain: config.serviceDomain, - apiKey: config.apiKey, -}); +// Legacy exports for backward compatibility +export const microCMSClient = { + getList: (params: { endpoint: string; queries?: MicroCMSQueries }) => { + return getDefaultClients().client.getList(params); + }, + getListDetail: (params: { endpoint: string; contentId: string; queries?: MicroCMSQueries }) => { + return getDefaultClients().client.getListDetail(params); + }, + create: (params: { endpoint: string; content: Record; contentId?: string; isDraft?: boolean }) => { + return getDefaultClients().client.create(params); + }, + update: (params: { endpoint: string; contentId: string; content: Record; isDraft?: boolean }) => { + return getDefaultClients().client.update(params); + }, + delete: (params: { endpoint: string; contentId: string }) => { + return getDefaultClients().client.delete(params); + }, +}; -export const microCMSManagementClient = createManagementClient({ - serviceDomain: config.serviceDomain, - apiKey: config.apiKey, -}); +export const microCMSManagementClient = { + uploadMedia: (params: { data: File | Blob } | { url: string; fileName?: string; customRequestHeaders?: Record }) => { + // SDK types don't fully match API capabilities, type assertion required + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return getDefaultClients().managementClient.uploadMedia(params as any); + }, +}; export const microCMSConfig = { - serviceDomain: config.serviceDomain, - apiKey: config.apiKey, + get serviceDomain() { + return getDefaultClients().serviceDomain; + }, + get apiKey() { + return getDefaultClients().apiKey; + }, }; +// Service-specific API functions export async function getList( endpoint: string, - queries?: MicroCMSQueries + queries?: MicroCMSQueries, + serviceId?: string ): Promise> { - return await microCMSClient.getList({ + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + return await clients.client.getList({ endpoint, queries, }); @@ -32,9 +203,11 @@ export async function getList( export async function getListDetail( endpoint: string, contentId: string, - queries?: MicroCMSQueries + queries?: MicroCMSQueries, + serviceId?: string ): Promise { - return await microCMSClient.getListDetail({ + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + return await clients.client.getListDetail({ endpoint, contentId, queries, @@ -44,9 +217,11 @@ export async function getListDetail( export async function create( endpoint: string, content: Omit, - options?: { isDraft?: boolean; contentId?: string } + options?: { isDraft?: boolean; contentId?: string }, + serviceId?: string ): Promise<{ id: string }> { - return await microCMSClient.create({ + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + return await clients.client.create({ endpoint, content, ...options, @@ -57,9 +232,11 @@ export async function update( endpoint: string, contentId: string, content: Omit, - options?: { isDraft?: boolean } + options?: { isDraft?: boolean }, + serviceId?: string ): Promise<{ id: string }> { - return await microCMSClient.update({ + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + return await clients.client.update({ endpoint, contentId, content, @@ -71,9 +248,11 @@ export async function patch( endpoint: string, contentId: string, content: Partial>, - options?: { isDraft?: boolean } + options?: { isDraft?: boolean }, + serviceId?: string ): Promise<{ id: string }> { - return await microCMSClient.update({ + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + return await clients.client.update({ endpoint, contentId, content, @@ -83,21 +262,24 @@ export async function patch( export async function deleteContent( endpoint: string, - contentId: string + contentId: string, + serviceId?: string ): Promise { - return await microCMSClient.delete({ + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + return await clients.client.delete({ endpoint, contentId, }); } -export async function getApiInfo(endpoint: string): Promise { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/apis/${endpoint}`; +export async function getApiInfo(endpoint: string, serviceId?: string): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/apis/${endpoint}`; const response = await fetch(url, { method: 'GET', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, }); @@ -109,13 +291,14 @@ export async function getApiInfo(endpoint: string): Promise { return await response.json(); } -export async function getApiList(): Promise { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/apis`; +export async function getApiList(serviceId?: string): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/apis`; const response = await fetch(url, { method: 'GET', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, }); @@ -127,13 +310,14 @@ export async function getApiList(): Promise { return await response.json(); } -export async function getMember(memberId: string): Promise { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/members/${memberId}`; +export async function getMember(memberId: string, serviceId?: string): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/members/${memberId}`; const response = await fetch(url, { method: 'GET', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, }); @@ -145,13 +329,14 @@ export async function getMember(memberId: string): Promise { return await response.json(); } -export async function deleteMedia(mediaUrl: string): Promise<{ id: string }> { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v2/media?url=${encodeURIComponent(mediaUrl)}`; +export async function deleteMedia(mediaUrl: string, serviceId?: string): Promise<{ id: string }> { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v2/media?url=${encodeURIComponent(mediaUrl)}`; const response = await fetch(url, { method: 'DELETE', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, }); @@ -166,14 +351,16 @@ export async function deleteMedia(mediaUrl: string): Promise<{ id: string }> { export async function patchContentStatus( endpoint: string, contentId: string, - status: 'PUBLISH' | 'DRAFT' + status: 'PUBLISH' | 'DRAFT', + serviceId?: string ): Promise { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}/status`; + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}/status`; const response = await fetch(url, { method: 'PATCH', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ status: [status] }), @@ -188,14 +375,16 @@ export async function patchContentStatus( export async function patchContentCreatedBy( endpoint: string, contentId: string, - memberId: string + memberId: string, + serviceId?: string ): Promise<{ id: string }> { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}/createdBy`; + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}/createdBy`; const response = await fetch(url, { method: 'PATCH', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ createdBy: memberId }), @@ -211,18 +400,20 @@ export async function patchContentCreatedBy( export async function getListMeta( endpoint: string, - options?: { limit?: number; offset?: number } -): Promise { + options?: { limit?: number; offset?: number }, + serviceId?: string +): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); const queryParams = new URLSearchParams(); if (options?.limit) queryParams.append('limit', options.limit.toString()); if (options?.offset) queryParams.append('offset', options.offset.toString()); - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`; + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`; const response = await fetch(url, { method: 'GET', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, }); @@ -236,14 +427,16 @@ export async function getListMeta( export async function getContentManagement( endpoint: string, - contentId: string -): Promise { - const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}`; + contentId: string, + serviceId?: string +): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}`; const response = await fetch(url, { method: 'GET', headers: { - 'X-MICROCMS-API-KEY': config.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, }); @@ -253,4 +446,43 @@ export async function getContentManagement( } return await response.json(); -} \ No newline at end of file +} + +// Media functions with service support +export async function getMedia( + params?: { limit?: number; imageOnly?: boolean; fileName?: string; token?: string }, + serviceId?: string +): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const queryParams = new URLSearchParams(); + if (params?.limit) queryParams.append('limit', params.limit.toString()); + if (params?.imageOnly) queryParams.append('imageOnly', 'true'); + if (params?.fileName) queryParams.append('fileName', params.fileName); + if (params?.token) queryParams.append('token', params.token); + + const response = await fetch( + `https://${clients.serviceDomain}.microcms-management.io/api/v2/media?${queryParams}`, + { + method: 'GET', + headers: { + 'X-MICROCMS-API-KEY': clients.apiKey, + }, + } + ); + + if (!response.ok) { + throw new Error(`Media retrieval failed: ${response.status} ${response.statusText}`); + } + + return await response.json(); +} + +export async function uploadMedia( + params: { data: File | Blob; name?: string } | { url: string; fileName?: string; customRequestHeaders?: Record }, + serviceId?: string +): Promise { + const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + // SDK types don't fully match API capabilities, type assertion required + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return await clients.managementClient.uploadMedia(params as any); +} diff --git a/src/config.ts b/src/config.ts index d46b72d..62ec632 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,9 +1,87 @@ -export interface Config { - serviceDomain: string; - apiKey: string; +import type { AppConfig, ServiceConfig, SingleServiceConfig, MultiServiceConfig } from './types.js'; + +export type { AppConfig, ServiceConfig, SingleServiceConfig, MultiServiceConfig }; + +/** + * Parse and validate service configuration from environment variables or command line arguments. + * + * Supports two modes: + * 1. Single service mode (legacy): MICROCMS_SERVICE_ID + MICROCMS_API_KEY + * 2. Multi service mode: MICROCMS_SERVICES (JSON array) + * + * If MICROCMS_SERVICES is set, it takes priority over the legacy single service config. + */ +export function parseConfig(): AppConfig { + // Check for multi-service configuration first (takes priority) + const servicesJson = process.env.MICROCMS_SERVICES; + if (servicesJson) { + return parseMultiServiceConfig(servicesJson); + } + + // Fall back to single service configuration (legacy) + return parseSingleServiceConfig(); } -export function parseConfig(): Config { +/** + * Parse multi-service configuration from JSON string + */ +function parseMultiServiceConfig(jsonString: string): MultiServiceConfig { + let services: ServiceConfig[]; + + try { + services = JSON.parse(jsonString); + } catch (error) { + throw new Error( + 'Invalid MICROCMS_SERVICES JSON format.\n' + + 'Expected format: [{"id": "service-id", "apiKey": "api-key"}, ...]\n' + + `Parse error: ${error instanceof Error ? error.message : String(error)}` + ); + } + + if (!Array.isArray(services)) { + throw new Error( + 'MICROCMS_SERVICES must be a JSON array.\n' + + 'Expected format: [{"id": "service-id", "apiKey": "api-key"}, ...]' + ); + } + + if (services.length === 0) { + throw new Error('MICROCMS_SERVICES array cannot be empty.'); + } + + // Validate each service configuration + const seenIds = new Set(); + for (let i = 0; i < services.length; i++) { + const service = services[i]; + + if (!service || typeof service !== 'object') { + throw new Error(`MICROCMS_SERVICES[${i}]: Invalid service configuration.`); + } + + if (!service.id || typeof service.id !== 'string') { + throw new Error(`MICROCMS_SERVICES[${i}]: Missing or invalid "id" field.`); + } + + if (!service.apiKey || typeof service.apiKey !== 'string') { + throw new Error(`MICROCMS_SERVICES[${i}]: Missing or invalid "apiKey" field.`); + } + + if (seenIds.has(service.id)) { + throw new Error(`MICROCMS_SERVICES: Duplicate service id "${service.id}".`); + } + seenIds.add(service.id); + } + + return { + mode: 'multi', + services, + }; +} + +/** + * Parse single service configuration from environment variables or command line arguments (legacy mode) + */ +function parseSingleServiceConfig(): SingleServiceConfig { const args = process.argv.slice(2); // Parse command line arguments @@ -27,13 +105,51 @@ export function parseConfig(): Config { if (!serviceDomain || !apiKey) { throw new Error( 'microCMS credentials are required. Provide them via:\n' + - ' Command line: --service-id --api-key \n' + - ' Environment variables: MICROCMS_SERVICE_ID and MICROCMS_API_KEY' + ' Single service mode:\n' + + ' Command line: --service-id --api-key \n' + + ' Environment variables: MICROCMS_SERVICE_ID and MICROCMS_API_KEY\n' + + ' Multi service mode:\n' + + ' Environment variable: MICROCMS_SERVICES (JSON array)\n' + + ' Example: MICROCMS_SERVICES=\'[{"id":"blog","apiKey":"xxx"}]\'' ); } return { + mode: 'single', serviceDomain, apiKey, }; -} \ No newline at end of file +} + +// Legacy exports for backward compatibility +export interface Config { + serviceDomain: string; + apiKey: string; +} + +/** + * @deprecated Use parseConfig() instead. This function is kept for backward compatibility. + */ +export function parseLegacyConfig(): Config { + const config = parseConfig(); + + if (config.mode === 'single') { + return { + serviceDomain: config.serviceDomain, + apiKey: config.apiKey, + }; + } + + // For multi-service mode, return the first service as default + // This maintains backward compatibility but logs a warning + const firstService = config.services[0]; + console.error( + 'Warning: parseLegacyConfig() called in multi-service mode. ' + + `Using first service "${firstService.id}" as default.` + ); + + return { + serviceDomain: firstService.id, + apiKey: firstService.apiKey, + }; +} diff --git a/src/server.ts b/src/server.ts index f1893f6..6d3d629 100644 --- a/src/server.ts +++ b/src/server.ts @@ -2,28 +2,78 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, + ListResourcesRequestSchema, ListToolsRequestSchema, + ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; -import { getListTool, handleGetList } from './tools/get-list.js'; -import { getListMetaTool, handleGetListMeta as handleGetListMeta } from './tools/get-list-meta.js'; -import { getContentTool, handleGetContent } from './tools/get-content.js'; -import { getContentMetaTool, handleGetContentMeta } from './tools/get-content-meta.js'; -import { createContentPublishedTool, handleCreateContentPublished } from './tools/create-content-published.js'; +import { getApiList, getAppConfig, getServiceIds, initializeClients } from './client.js'; +import type { ToolParameters } from './types.js'; + +// Import tool definitions and handlers import { createContentDraftTool, handleCreateContentDraft } from './tools/create-content-draft.js'; -import { updateContentPublishedTool, handleUpdateContentPublished } from './tools/update-content-published.js'; -import { updateContentDraftTool, handleUpdateContentDraft } from './tools/update-content-draft.js'; -import { patchContentTool, handlePatchContent } from './tools/patch-content.js'; -import { patchContentStatusTool, handlePatchContentStatus } from './tools/patch-content-status.js'; -import { patchContentCreatedByTool, handlePatchContentCreatedBy } from './tools/patch-content-created-by.js'; +import { createContentPublishedTool, handleCreateContentPublished } from './tools/create-content-published.js'; import { deleteContentTool, handleDeleteContent } from './tools/delete-content.js'; -import { getMediaTool, handleGetMedia } from './tools/get-media.js'; -import { uploadMediaTool, handleUploadMedia } from './tools/upload-media.js'; import { deleteMediaTool, handleDeleteMedia } from './tools/delete-media.js'; import { getApiInfoTool, handleGetApiInfo } from './tools/get-api-info.js'; import { getApiListTool, handleGetApiList } from './tools/get-apis-list.js'; +import { getContentMetaTool, handleGetContentMeta } from './tools/get-content-meta.js'; +import { getContentTool, handleGetContent } from './tools/get-content.js'; +import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; +import { getListTool, handleGetList } from './tools/get-list.js'; +import { getMediaTool, handleGetMedia } from './tools/get-media.js'; import { getMemberTool, handleGetMember } from './tools/get-member.js'; -import type { ToolParameters, MediaToolParameters } from './types.js'; +import { handlePatchContentCreatedBy, patchContentCreatedByTool } from './tools/patch-content-created-by.js'; +import { handlePatchContentStatus, patchContentStatusTool } from './tools/patch-content-status.js'; +import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; +import { handleUpdateContentDraft, updateContentDraftTool } from './tools/update-content-draft.js'; +import { handleUpdateContentPublished, updateContentPublishedTool } from './tools/update-content-published.js'; +import { handleUploadMedia, uploadMediaTool } from './tools/upload-media.js'; + +// Fixed tool list (18 tools) +const tools = [ + getListTool, + getListMetaTool, + getContentTool, + getContentMetaTool, + createContentPublishedTool, + createContentDraftTool, + updateContentPublishedTool, + updateContentDraftTool, + patchContentTool, + patchContentStatusTool, + patchContentCreatedByTool, + deleteContentTool, + getMediaTool, + uploadMediaTool, + deleteMediaTool, + getApiInfoTool, + getApiListTool, + getMemberTool, +]; + +// Tool handlers map +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const toolHandlers: Record Promise> = { + 'microcms_get_list': handleGetList, + 'microcms_get_list_meta': handleGetListMeta, + 'microcms_get_content': handleGetContent, + 'microcms_get_content_meta': handleGetContentMeta, + 'microcms_create_content_published': handleCreateContentPublished, + 'microcms_create_content_draft': handleCreateContentDraft, + 'microcms_update_content_published': handleUpdateContentPublished, + 'microcms_update_content_draft': handleUpdateContentDraft, + 'microcms_patch_content': handlePatchContent, + 'microcms_patch_content_status': handlePatchContentStatus, + 'microcms_patch_content_created_by': handlePatchContentCreatedBy, + 'microcms_delete_content': handleDeleteContent, + 'microcms_get_media': handleGetMedia, + 'microcms_upload_media': handleUploadMedia, + 'microcms_delete_media': handleDeleteMedia, + 'microcms_get_api_info': handleGetApiInfo, + 'microcms_get_api_list': handleGetApiList, + 'microcms_get_member': handleGetMember, +}; const server = new Server( { @@ -34,101 +84,115 @@ const server = new Server( { capabilities: { tools: {}, + resources: {}, }, } ); +// List available tools server.setRequestHandler(ListToolsRequestSchema, async () => { + return { tools }; +}); + +// List available resources +server.setRequestHandler(ListResourcesRequestSchema, async () => { return { - tools: [ - getListTool, - getListMetaTool, - getContentTool, - getContentMetaTool, - createContentPublishedTool, - createContentDraftTool, - updateContentPublishedTool, - updateContentDraftTool, - patchContentTool, - patchContentStatusTool, - patchContentCreatedByTool, - deleteContentTool, - getMediaTool, - uploadMediaTool, - deleteMediaTool, - getApiInfoTool, - getApiListTool, - getMemberTool, + resources: [ + { + uri: 'microcms://services', + name: 'Available microCMS Services', + description: 'List of configured microCMS services. In multi-service mode, use serviceId parameter in tools to specify which service to use.', + mimeType: 'application/json', + }, ], }; }); +// Read resource +server.setRequestHandler(ReadResourceRequestSchema, async (request) => { + const { uri } = request.params; + + if (uri === 'microcms://services') { + const config = getAppConfig(); + + // Helper function to fetch API list for a service + const fetchApisForService = async (serviceId: string): Promise<{ name: string; endpoint: string; type: string }[]> => { + try { + const result = await getApiList(serviceId); + if (result && Array.isArray(result.apis)) { + return result.apis.map((api: { apiName?: string; name?: string; apiEndpoint?: string; endpoint?: string; apiType?: string[] }) => ({ + name: api.apiName || api.name || '', + endpoint: api.apiEndpoint || api.endpoint || '', + type: Array.isArray(api.apiType) && api.apiType.includes('LIST') ? 'list' : 'object', + })); + } + return []; + } catch { + return []; + } + }; + + let content: object; + if (config.mode === 'single') { + const apis = await fetchApisForService(config.serviceDomain); + content = { + mode: 'single', + description: 'Single service mode - serviceId parameter is optional', + services: [ + { + id: config.serviceDomain, + apis, + }, + ], + }; + } else { + // Fetch APIs for all services in parallel + const servicesWithApis = await Promise.all( + config.services.map(async (s) => { + const apis = await fetchApisForService(s.id); + return { + id: s.id, + apis, + }; + }) + ); + + content = { + mode: 'multi', + description: 'Multi service mode - serviceId parameter is required for all tools. Use the serviceId that contains the endpoint you need.', + services: servicesWithApis, + }; + } + + return { + contents: [ + { + uri, + mimeType: 'application/json', + text: JSON.stringify(content, null, 2), + }, + ], + }; + } + + throw new Error(`Unknown resource: ${uri}`); +}); + +// Handle tool calls server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; - const params = args as unknown as ToolParameters; + const params = args as unknown as ToolParameters & { serviceId?: string }; try { - let result; - - switch (name) { - case 'microcms_get_list': - result = await handleGetList(params); - break; - case 'microcms_get_list_meta': - result = await handleGetListMeta(params); - break; - case 'microcms_get_content': - result = await handleGetContent(params); - break; - case 'microcms_get_content_meta': - result = await handleGetContentMeta(params); - break; - case 'microcms_create_content_published': - result = await handleCreateContentPublished(params); - break; - case 'microcms_create_content_draft': - result = await handleCreateContentDraft(params); - break; - case 'microcms_update_content_published': - result = await handleUpdateContentPublished(params); - break; - case 'microcms_update_content_draft': - result = await handleUpdateContentDraft(params); - break; - case 'microcms_patch_content': - result = await handlePatchContent(params); - break; - case 'microcms_patch_content_status': - result = await handlePatchContentStatus(params as ToolParameters & { status: 'PUBLISH' | 'DRAFT' }); - break; - case 'microcms_patch_content_created_by': - result = await handlePatchContentCreatedBy(params as ToolParameters & { createdBy: string }); - break; - case 'microcms_delete_content': - result = await handleDeleteContent(params); - break; - case 'microcms_get_media': - result = await handleGetMedia(params as unknown as MediaToolParameters); - break; - case 'microcms_upload_media': - result = await handleUploadMedia(params as unknown as MediaToolParameters); - break; - case 'microcms_delete_media': - result = await handleDeleteMedia(params as unknown as MediaToolParameters & { url: string }); - break; - case 'microcms_get_api_info': - result = await handleGetApiInfo(params); - break; - case 'microcms_get_api_list': - result = await handleGetApiList(params); - break; - case 'microcms_get_member': - result = await handleGetMember(params as ToolParameters & { memberId: string }); - break; - default: - throw new Error(`Unknown tool: ${name}`); + const handler = toolHandlers[name]; + if (!handler) { + throw new Error(`Unknown tool: ${name}`); } + // Extract serviceId from params and pass to handler + const { serviceId, ...restParams } = params; + const result = await handler(restParams, serviceId); + return { content: [ { @@ -154,18 +218,24 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { export async function startServer() { try { - // Validate configuration early to provide better error messages - const { parseConfig } = await import('./config.js'); - parseConfig(); + // Initialize clients and get configuration + const config = initializeClients(); + + // Log mode information + if (config.mode === 'single') { + console.error(`microCMS MCP Server starting in single-service mode (service: ${config.serviceDomain})`); + } else { + const serviceIds = getServiceIds().join(', '); + console.error(`microCMS MCP Server starting in multi-service mode (services: ${serviceIds})`); + } const transport = new StdioServerTransport(); await server.connect(transport); - // console.error('microCMS MCP Server running on stdio'); } catch (error) { - if (error instanceof Error && error.message.includes('microCMS credentials')) { + if (error instanceof Error && (error.message.includes('microCMS credentials') || error.message.includes('MICROCMS_SERVICES'))) { console.error('Configuration Error:', error.message); process.exit(1); } throw error; } -} \ No newline at end of file +} diff --git a/src/tools/create-content-draft.ts b/src/tools/create-content-draft.ts index 10ebda5..57db273 100644 --- a/src/tools/create-content-draft.ts +++ b/src/tools/create-content-draft.ts @@ -9,13 +9,19 @@ export const createContentDraftTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', }, content: { type: 'object', - description: `Content data to create (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: + `Content data to create (JSON object). ` + FIELD_FORMATS_DESCRIPTION, }, contentId: { type: 'string', @@ -26,7 +32,10 @@ export const createContentDraftTool: Tool = { }, }; -export async function handleCreateContentDraft(params: ToolParameters) { +export async function handleCreateContentDraft( + params: ToolParameters, + serviceId?: string +) { const { endpoint, content, ...options } = params; if (!content) { @@ -39,5 +48,5 @@ export async function handleCreateContentDraft(params: ToolParameters) { if (options.contentId) createOptions.contentId = options.contentId; - return await create(endpoint, content, createOptions); -} \ No newline at end of file + return await create(endpoint, content, createOptions, serviceId); +} diff --git a/src/tools/create-content-published.ts b/src/tools/create-content-published.ts index ef406ec..d4435f2 100644 --- a/src/tools/create-content-published.ts +++ b/src/tools/create-content-published.ts @@ -9,13 +9,19 @@ export const createContentPublishedTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', }, content: { type: 'object', - description: `Content data to create (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: + `Content data to create (JSON object). ` + FIELD_FORMATS_DESCRIPTION, }, contentId: { type: 'string', @@ -26,7 +32,10 @@ export const createContentPublishedTool: Tool = { }, }; -export async function handleCreateContentPublished(params: ToolParameters) { +export async function handleCreateContentPublished( + params: ToolParameters, + serviceId?: string +) { const { endpoint, content, ...options } = params; if (!content) { @@ -39,5 +48,5 @@ export async function handleCreateContentPublished(params: ToolParameters) { if (options.contentId) createOptions.contentId = options.contentId; - return await create(endpoint, content, createOptions); -} \ No newline at end of file + return await create(endpoint, content, createOptions, serviceId); +} diff --git a/src/tools/delete-content.ts b/src/tools/delete-content.ts index b519398..77b2d1f 100644 --- a/src/tools/delete-content.ts +++ b/src/tools/delete-content.ts @@ -8,6 +8,11 @@ export const deleteContentTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -21,13 +26,16 @@ export const deleteContentTool: Tool = { }, }; -export async function handleDeleteContent(params: ToolParameters) { +export async function handleDeleteContent( + params: ToolParameters, + serviceId?: string +) { const { endpoint, contentId } = params; - + if (!contentId) { throw new Error('contentId is required'); } - await deleteContent(endpoint, contentId); + await deleteContent(endpoint, contentId, serviceId); return { message: `Content ${contentId} deleted successfully` }; -} \ No newline at end of file +} diff --git a/src/tools/delete-media.ts b/src/tools/delete-media.ts index c6e78ad..8af1f94 100644 --- a/src/tools/delete-media.ts +++ b/src/tools/delete-media.ts @@ -4,26 +4,35 @@ import type { MediaToolParameters } from '../types.js'; export const deleteMediaTool: Tool = { name: 'microcms_delete_media', - description: 'Delete media files from microCMS (Management API). Supports deletion of both images and files. Requires media deletion permissions. Note: Media referenced by content cannot be deleted.', + description: + 'Delete media files from microCMS (Management API). Supports deletion of both images and files. Requires media deletion permissions. Note: Media referenced by content cannot be deleted.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, url: { type: 'string', - description: 'URL of the media to delete (e.g., "https://images.microcms-assets.io/assets/xxxxx/yyyyy/hoge.jpg" or "https://files.microcms-assets.io/assets/xxxxx/yyyyy/hoge.pdf"). Custom domain URLs are also supported.', + description: + 'URL of the media to delete (e.g., "https://images.microcms-assets.io/assets/xxxxx/yyyyy/hoge.jpg" or "https://files.microcms-assets.io/assets/xxxxx/yyyyy/hoge.pdf"). Custom domain URLs are also supported.', }, }, required: ['url'], }, }; -export async function handleDeleteMedia(params: MediaToolParameters & { url: string }) { +export async function handleDeleteMedia( + params: MediaToolParameters & { url: string }, + serviceId?: string +) { const { url } = params; if (!url) { throw new Error('url is required'); } - return await deleteMedia(url); + return await deleteMedia(url, serviceId); } - diff --git a/src/tools/get-api-info.ts b/src/tools/get-api-info.ts index adfa07e..2cc38ac 100644 --- a/src/tools/get-api-info.ts +++ b/src/tools/get-api-info.ts @@ -4,21 +4,31 @@ import type { ToolParameters } from '../types.js'; export const getApiInfoTool: Tool = { name: 'microcms_get_api_info', - description: 'Get API schema information from microCMS Management API. In relation and relationList field, you can get its schema using referencedApiEndpoint and microcms_get_api_info tool.', + description: + 'Get API schema information from microCMS Management API. In relation and relationList field, you can get its schema using referencedApiEndpoint and microcms_get_api_info tool.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', - description: 'Content type name to get schema info (e.g., "blogs", "news")', + description: + 'Content type name to get schema info (e.g., "blogs", "news")', }, }, required: ['endpoint'], }, }; -export async function handleGetApiInfo(params: ToolParameters) { +export async function handleGetApiInfo( + params: ToolParameters, + serviceId?: string +) { const { endpoint } = params; - return await getApiInfo(endpoint); -} \ No newline at end of file + return await getApiInfo(endpoint, serviceId); +} diff --git a/src/tools/get-apis-list.ts b/src/tools/get-apis-list.ts index 4d23890..05a0ca9 100644 --- a/src/tools/get-apis-list.ts +++ b/src/tools/get-apis-list.ts @@ -1,17 +1,27 @@ import { Tool } from '@modelcontextprotocol/sdk/types.js'; -import { getApiList as getApiList } from '../client.js'; +import { getApiList } from '../client.js'; import type { ToolParameters } from '../types.js'; export const getApiListTool: Tool = { name: 'microcms_get_api_list', - description: 'Get list of all available APIs (endpoints) from microCMS Management API. Returns API name, endpoint, and type (list/object) for each API.', + description: + 'Get list of all available APIs (endpoints) from microCMS Management API. Returns API name, endpoint, and type (list/object) for each API.', inputSchema: { type: 'object', - properties: {}, + properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, + }, required: [], }, }; -export async function handleGetApiList(params: ToolParameters) { - return await getApiList(); +export async function handleGetApiList( + params: ToolParameters, + serviceId?: string +) { + return await getApiList(serviceId); } diff --git a/src/tools/get-content-meta.ts b/src/tools/get-content-meta.ts index 62f223c..5ffb908 100644 --- a/src/tools/get-content-meta.ts +++ b/src/tools/get-content-meta.ts @@ -4,10 +4,16 @@ import type { ToolParameters } from '../types.js'; export const getContentMetaTool: Tool = { name: 'microcms_get_content_meta', - description: 'Get a specific content with metadata from microCMS Management API. IMPORTANT: Use this tool ONLY when the user message contains "メタ" (meta) or "メタ情報" (metadata). This API returns metadata information such as status, createdBy, updatedBy, reservationTime, closedAt, and customStatus that are not available in the regular content API. For regular content retrieval, use microcms_get_content instead.', + description: + 'Get a specific content with metadata from microCMS Management API. IMPORTANT: Use this tool ONLY when the user message contains "メタ" (meta) or "メタ情報" (metadata). This API returns metadata information such as status, createdBy, updatedBy, reservationTime, closedAt, and customStatus that are not available in the regular content API. For regular content retrieval, use microcms_get_content instead.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -21,7 +27,10 @@ export const getContentMetaTool: Tool = { }, }; -export async function handleGetContentMeta(params: ToolParameters) { +export async function handleGetContentMeta( + params: ToolParameters, + serviceId?: string +) { const { endpoint, contentId } = params; if (!endpoint) { @@ -32,6 +41,5 @@ export async function handleGetContentMeta(params: ToolParameters) { throw new Error('contentId is required'); } - return await getContentManagement(endpoint, contentId); + return await getContentManagement(endpoint, contentId, serviceId); } - diff --git a/src/tools/get-content.ts b/src/tools/get-content.ts index 26bf883..593f321 100644 --- a/src/tools/get-content.ts +++ b/src/tools/get-content.ts @@ -8,6 +8,11 @@ export const getContentTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -35,18 +40,21 @@ export const getContentTool: Tool = { }, }; -export async function handleGetContent(params: ToolParameters) { +export async function handleGetContent( + params: ToolParameters, + serviceId?: string +) { const { endpoint, contentId, ...options } = params; - + if (!contentId) { throw new Error('contentId is required'); } const queries: MicroCMSGetOptions = {}; - + if (options.draftKey) queries.draftKey = options.draftKey; if (options.fields) queries.fields = options.fields; if (options.depth) queries.depth = options.depth; - return await getListDetail(endpoint, contentId, queries); -} \ No newline at end of file + return await getListDetail(endpoint, contentId, queries, serviceId); +} diff --git a/src/tools/get-contents-list-management.ts b/src/tools/get-contents-list-management.ts index f1d0385..d0a7dc4 100644 --- a/src/tools/get-contents-list-management.ts +++ b/src/tools/get-contents-list-management.ts @@ -3,42 +3,42 @@ import { getListMeta } from '../client.js'; import type { ToolParameters } from '../types.js'; export const getListMetaTool: Tool = { - name: 'microcms_get_list_meta', - description: 'Get a list of contents with metadata from microCMS Management API. IMPORTANT: Use this tool ONLY when the user message contains "メタ" (meta) or "メタ情報" (metadata). This API returns metadata information such as status, createdBy, updatedBy, reservationTime, closedAt, and customStatus that are not available in the regular content API. For regular content retrieval, use microcms_get_list instead.', - inputSchema: { - type: 'object', - properties: { - endpoint: { - type: 'string', - description: 'Content type name (e.g., "blogs", "news")', - }, - limit: { - type: 'number', - description: 'Number of contents to retrieve (default: 10, max: 100)', - minimum: 1, - maximum: 100, - }, - offset: { - type: 'number', - description: 'Offset for pagination (default: 0)', - minimum: 0, - }, - }, - required: ['endpoint'], + name: 'microcms_get_list_meta', + description: + 'Get a list of contents with metadata from microCMS Management API. IMPORTANT: Use this tool ONLY when the user message contains "メタ" (meta) or "メタ情報" (metadata). This API returns metadata information such as status, createdBy, updatedBy, reservationTime, closedAt, and customStatus that are not available in the regular content API. For regular content retrieval, use microcms_get_list instead.', + inputSchema: { + type: 'object', + properties: { + endpoint: { + type: 'string', + description: 'Content type name (e.g., "blogs", "news")', + }, + limit: { + type: 'number', + description: 'Number of contents to retrieve (default: 10, max: 100)', + minimum: 1, + maximum: 100, + }, + offset: { + type: 'number', + description: 'Offset for pagination (default: 0)', + minimum: 0, + }, }, + required: ['endpoint'], + }, }; export async function handleGetListMeta(params: ToolParameters) { - const { endpoint, limit, offset } = params; + const { endpoint, limit, offset } = params; - if (!endpoint) { - throw new Error('endpoint is required'); - } + if (!endpoint) { + throw new Error('endpoint is required'); + } - const options: { limit?: number; offset?: number } = {}; - if (limit !== undefined) options.limit = limit; - if (offset !== undefined) options.offset = offset; + const options: { limit?: number; offset?: number } = {}; + if (limit !== undefined) options.limit = limit; + if (offset !== undefined) options.offset = offset; - return await getListMeta(endpoint, options); + return await getListMeta(endpoint, options); } - diff --git a/src/tools/get-list-meta.ts b/src/tools/get-list-meta.ts index f1d0385..b3df003 100644 --- a/src/tools/get-list-meta.ts +++ b/src/tools/get-list-meta.ts @@ -3,42 +3,50 @@ import { getListMeta } from '../client.js'; import type { ToolParameters } from '../types.js'; export const getListMetaTool: Tool = { - name: 'microcms_get_list_meta', - description: 'Get a list of contents with metadata from microCMS Management API. IMPORTANT: Use this tool ONLY when the user message contains "メタ" (meta) or "メタ情報" (metadata). This API returns metadata information such as status, createdBy, updatedBy, reservationTime, closedAt, and customStatus that are not available in the regular content API. For regular content retrieval, use microcms_get_list instead.', - inputSchema: { - type: 'object', - properties: { - endpoint: { - type: 'string', - description: 'Content type name (e.g., "blogs", "news")', - }, - limit: { - type: 'number', - description: 'Number of contents to retrieve (default: 10, max: 100)', - minimum: 1, - maximum: 100, - }, - offset: { - type: 'number', - description: 'Offset for pagination (default: 0)', - minimum: 0, - }, - }, - required: ['endpoint'], + name: 'microcms_get_list_meta', + description: + 'Get a list of contents with metadata from microCMS Management API. IMPORTANT: Use this tool ONLY when the user message contains "メタ" (meta) or "メタ情報" (metadata). This API returns metadata information such as status, createdBy, updatedBy, reservationTime, closedAt, and customStatus that are not available in the regular content API. For regular content retrieval, use microcms_get_list instead.', + inputSchema: { + type: 'object', + properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, + endpoint: { + type: 'string', + description: 'Content type name (e.g., "blogs", "news")', + }, + limit: { + type: 'number', + description: 'Number of contents to retrieve (default: 10, max: 100)', + minimum: 1, + maximum: 100, + }, + offset: { + type: 'number', + description: 'Offset for pagination (default: 0)', + minimum: 0, + }, }, + required: ['endpoint'], + }, }; -export async function handleGetListMeta(params: ToolParameters) { - const { endpoint, limit, offset } = params; +export async function handleGetListMeta( + params: ToolParameters, + serviceId?: string +) { + const { endpoint, limit, offset } = params; - if (!endpoint) { - throw new Error('endpoint is required'); - } + if (!endpoint) { + throw new Error('endpoint is required'); + } - const options: { limit?: number; offset?: number } = {}; - if (limit !== undefined) options.limit = limit; - if (offset !== undefined) options.offset = offset; + const options: { limit?: number; offset?: number } = {}; + if (limit !== undefined) options.limit = limit; + if (offset !== undefined) options.offset = offset; - return await getListMeta(endpoint, options); + return await getListMeta(endpoint, options, serviceId); } - diff --git a/src/tools/get-list.ts b/src/tools/get-list.ts index 51f1611..de56197 100644 --- a/src/tools/get-list.ts +++ b/src/tools/get-list.ts @@ -8,6 +8,11 @@ export const getListTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -58,11 +63,14 @@ export const getListTool: Tool = { }, }; -export async function handleGetList(params: ToolParameters) { +export async function handleGetList( + params: ToolParameters, + serviceId?: string +) { const { endpoint, ...options } = params; - + const queries: MicroCMSListOptions = {}; - + if (options.draftKey) queries.draftKey = options.draftKey; if (options.limit) queries.limit = options.limit; if (options.offset) queries.offset = options.offset; @@ -73,5 +81,5 @@ export async function handleGetList(params: ToolParameters) { if (options.filters) queries.filters = options.filters; if (options.depth) queries.depth = options.depth; - return await getList(endpoint, queries); -} \ No newline at end of file + return await getList(endpoint, queries, serviceId); +} diff --git a/src/tools/get-media.ts b/src/tools/get-media.ts index 6bbfdd7..2a8f3d5 100644 --- a/src/tools/get-media.ts +++ b/src/tools/get-media.ts @@ -1,37 +1,51 @@ import { Tool } from '@modelcontextprotocol/sdk/types.js'; -import { microCMSConfig } from '../client.js'; +import { getClientsForService } from '../client.js'; import type { MediaToolParameters } from '../types.js'; export const getMediaTool: Tool = { name: 'microcms_get_media', - description: 'Get media files from microCMS (Management API). Returns media information including URLs, dimensions for images. Supports pagination via token (15-second validity). Requires media retrieval permissions.', + description: + 'Get media files from microCMS (Management API). Returns media information including URLs, dimensions for images. Supports pagination via token (15-second validity). Requires media retrieval permissions.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, limit: { type: 'number', - description: 'Number of media to retrieve (max 100, default 10). Only valid on first request.', + description: + 'Number of media to retrieve (max 100, default 10). Only valid on first request.', minimum: 1, maximum: 100, }, imageOnly: { type: 'boolean', - description: 'Set to true to retrieve only image files. Only valid on first request.', + description: + 'Set to true to retrieve only image files. Only valid on first request.', }, fileName: { type: 'string', - description: 'Filter media by partial filename match (includes file extension)', + description: + 'Filter media by partial filename match (includes file extension)', }, token: { type: 'string', - description: 'Continuation token for pagination (obtained from previous response, 15-second validity)', + description: + 'Continuation token for pagination (obtained from previous response, 15-second validity)', }, }, required: [], }, }; -export async function handleGetMedia(params: MediaToolParameters) { +export async function handleGetMedia( + params: MediaToolParameters, + serviceId?: string +) { + const clients = getClientsForService(serviceId); const queryParams = new URLSearchParams(); if (params.limit) queryParams.append('limit', params.limit.toString()); @@ -40,18 +54,20 @@ export async function handleGetMedia(params: MediaToolParameters) { if (params.token) queryParams.append('token', params.token); const response = await fetch( - `https://${microCMSConfig.serviceDomain}.microcms-management.io/api/v2/media?${queryParams}`, + `https://${clients.serviceDomain}.microcms-management.io/api/v2/media?${queryParams}`, { method: 'GET', headers: { - 'X-MICROCMS-API-KEY': microCMSConfig.apiKey, + 'X-MICROCMS-API-KEY': clients.apiKey, }, } ); if (!response.ok) { - throw new Error(`Media retrieval failed: ${response.status} ${response.statusText}`); + throw new Error( + `Media retrieval failed: ${response.status} ${response.statusText}` + ); } return await response.json(); -} \ No newline at end of file +} diff --git a/src/tools/get-member.ts b/src/tools/get-member.ts index 18d5a66..7c6077e 100644 --- a/src/tools/get-member.ts +++ b/src/tools/get-member.ts @@ -4,10 +4,16 @@ import type { ToolParameters } from '../types.js'; export const getMemberTool: Tool = { name: 'microcms_get_member', - description: 'Get a specific member from microCMS Management API. Returns member information including ID, name, email, and MFA status.', + description: + 'Get a specific member from microCMS Management API. Returns member information including ID, name, email, and MFA status.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, memberId: { type: 'string', description: 'Member ID to retrieve', @@ -17,9 +23,11 @@ export const getMemberTool: Tool = { }, }; -export async function handleGetMember(params: ToolParameters & { memberId: string }) { +export async function handleGetMember( + params: ToolParameters & { memberId: string }, + serviceId?: string +) { const { memberId } = params; - return await getMember(memberId); + return await getMember(memberId, serviceId); } - diff --git a/src/tools/patch-content-created-by.ts b/src/tools/patch-content-created-by.ts index 01619fa..fe9f583 100644 --- a/src/tools/patch-content-created-by.ts +++ b/src/tools/patch-content-created-by.ts @@ -4,10 +4,16 @@ import type { ToolParameters } from '../types.js'; export const patchContentCreatedByTool: Tool = { name: 'microcms_patch_content_created_by', - description: 'Change content creator in microCMS (Management API). Updates the createdBy field of a content item to a specified member ID. Member ID can be found in the member detail screen in the management console.', + description: + 'Change content creator in microCMS (Management API). Updates the createdBy field of a content item to a specified member ID. Member ID can be found in the member detail screen in the management console.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -18,7 +24,8 @@ export const patchContentCreatedByTool: Tool = { }, createdBy: { type: 'string', - description: 'Member ID to set as the creator. Member ID can be found in the member detail screen in the management console.', + description: + 'Member ID to set as the creator. Member ID can be found in the member detail screen in the management console.', }, }, required: ['endpoint', 'contentId', 'createdBy'], @@ -26,7 +33,8 @@ export const patchContentCreatedByTool: Tool = { }; export async function handlePatchContentCreatedBy( - params: ToolParameters & { createdBy: string } + params: ToolParameters & { createdBy: string }, + serviceId?: string ) { const { endpoint, contentId, createdBy } = params; @@ -42,7 +50,14 @@ export async function handlePatchContentCreatedBy( throw new Error('createdBy is required'); } - const result = await patchContentCreatedBy(endpoint, contentId, createdBy); - return { message: `Content ${contentId} creator changed to ${createdBy}`, id: result.id }; + const result = await patchContentCreatedBy( + endpoint, + contentId, + createdBy, + serviceId + ); + return { + message: `Content ${contentId} creator changed to ${createdBy}`, + id: result.id, + }; } - diff --git a/src/tools/patch-content-status.ts b/src/tools/patch-content-status.ts index 060ffb8..484be94 100644 --- a/src/tools/patch-content-status.ts +++ b/src/tools/patch-content-status.ts @@ -4,10 +4,16 @@ import type { ToolParameters } from '../types.js'; export const patchContentStatusTool: Tool = { name: 'microcms_patch_content_status', - description: 'Change content publication status in microCMS (Management API). Can change status between PUBLISH (published) and DRAFT (draft). Note: Only transitions between "published" and "draft" are supported.', + description: + 'Change content publication status in microCMS (Management API). Can change status between PUBLISH (published) and DRAFT (draft). Note: Only transitions between "published" and "draft" are supported.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -19,7 +25,8 @@ export const patchContentStatusTool: Tool = { status: { type: 'string', enum: ['PUBLISH', 'DRAFT'], - description: 'Target status: "PUBLISH" to publish content, "DRAFT" to set as draft', + description: + 'Target status: "PUBLISH" to publish content, "DRAFT" to set as draft', }, }, required: ['endpoint', 'contentId', 'status'], @@ -27,7 +34,8 @@ export const patchContentStatusTool: Tool = { }; export async function handlePatchContentStatus( - params: ToolParameters & { status: 'PUBLISH' | 'DRAFT' } + params: ToolParameters & { status: 'PUBLISH' | 'DRAFT' }, + serviceId?: string ) { const { endpoint, contentId, status } = params; @@ -43,7 +51,6 @@ export async function handlePatchContentStatus( throw new Error('status must be either "PUBLISH" or "DRAFT"'); } - await patchContentStatus(endpoint, contentId, status); + await patchContentStatus(endpoint, contentId, status, serviceId); return { message: `Content ${contentId} status changed to ${status}` }; } - diff --git a/src/tools/patch-content.ts b/src/tools/patch-content.ts index 504bca1..661213d 100644 --- a/src/tools/patch-content.ts +++ b/src/tools/patch-content.ts @@ -9,6 +9,11 @@ export const patchContentTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -19,7 +24,9 @@ export const patchContentTool: Tool = { }, content: { type: 'object', - description: `Partial content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: + `Partial content data to update (JSON object). ` + + FIELD_FORMATS_DESCRIPTION, }, isDraft: { type: 'boolean', @@ -30,7 +37,10 @@ export const patchContentTool: Tool = { }, }; -export async function handlePatchContent(params: ToolParameters) { +export async function handlePatchContent( + params: ToolParameters, + serviceId?: string +) { const { endpoint, contentId, content, ...options } = params; if (!contentId) { @@ -45,5 +55,5 @@ export async function handlePatchContent(params: ToolParameters) { if (options.isDraft !== undefined) updateOptions.isDraft = options.isDraft; - return await patch(endpoint, contentId, content, updateOptions); -} \ No newline at end of file + return await patch(endpoint, contentId, content, updateOptions, serviceId); +} diff --git a/src/tools/update-content-draft.ts b/src/tools/update-content-draft.ts index 57cac78..0913c2d 100644 --- a/src/tools/update-content-draft.ts +++ b/src/tools/update-content-draft.ts @@ -9,6 +9,11 @@ export const updateContentDraftTool: Tool = { inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -19,14 +24,18 @@ export const updateContentDraftTool: Tool = { }, content: { type: 'object', - description: `Content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: + `Content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, }, }, required: ['endpoint', 'contentId', 'content'], }, }; -export async function handleUpdateContentDraft(params: ToolParameters) { +export async function handleUpdateContentDraft( + params: ToolParameters, + serviceId?: string +) { const { endpoint, contentId, content } = params; if (!contentId) { @@ -41,5 +50,5 @@ export async function handleUpdateContentDraft(params: ToolParameters) { isDraft: true, // Always save as draft }; - return await update(endpoint, contentId, content, updateOptions); -} \ No newline at end of file + return await update(endpoint, contentId, content, updateOptions, serviceId); +} diff --git a/src/tools/update-content-published.ts b/src/tools/update-content-published.ts index 36f572b..f9e80f7 100644 --- a/src/tools/update-content-published.ts +++ b/src/tools/update-content-published.ts @@ -2,12 +2,18 @@ import { Tool } from '@modelcontextprotocol/sdk/types.js'; import { update } from '../client.js'; import type { ToolParameters, MicroCMSUpdateOptions } from '../types.js'; import { FIELD_FORMATS_DESCRIPTION } from '../constants.js'; + export const updateContentPublishedTool: Tool = { name: 'microcms_update_content_published', description: FIELD_FORMATS_DESCRIPTION, inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, endpoint: { type: 'string', description: 'Content type name (e.g., "blogs", "news")', @@ -18,14 +24,18 @@ export const updateContentPublishedTool: Tool = { }, content: { type: 'object', - description: `Content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: + `Content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, }, }, required: ['endpoint', 'contentId', 'content'], }, }; -export async function handleUpdateContentPublished(params: ToolParameters) { +export async function handleUpdateContentPublished( + params: ToolParameters, + serviceId?: string +) { const { endpoint, contentId, content } = params; if (!contentId) { @@ -40,5 +50,5 @@ export async function handleUpdateContentPublished(params: ToolParameters) { isDraft: false, // Always publish }; - return await update(endpoint, contentId, content, updateOptions); -} \ No newline at end of file + return await update(endpoint, contentId, content, updateOptions, serviceId); +} diff --git a/src/tools/upload-media.ts b/src/tools/upload-media.ts index c7b0ad6..7350408 100644 --- a/src/tools/upload-media.ts +++ b/src/tools/upload-media.ts @@ -1,42 +1,55 @@ import { Tool } from '@modelcontextprotocol/sdk/types.js'; -import { microCMSManagementClient } from '../client.js'; +import { getClientsForService } from '../client.js'; import type { MediaToolParameters } from '../types.js'; export const uploadMediaTool: Tool = { name: 'microcms_upload_media', - description: 'Upload media files to microCMS using JS SDK (Management API). Supports two methods: 1) Upload file data (base64) with filename and mimeType, 2) Upload from external URL. Returns microCMS asset URL. Requires media upload permissions. Available on Team, Business, Advanced, and Enterprise plans.', + description: + 'Upload media files to microCMS using JS SDK (Management API). Supports two methods: 1) Upload file data (base64) with filename and mimeType, 2) Upload from external URL. Returns microCMS asset URL. Requires media upload permissions. Available on Team, Business, Advanced, and Enterprise plans.', inputSchema: { type: 'object', properties: { + serviceId: { + type: 'string', + description: + 'Service ID (required in multi-service mode, optional in single-service mode)', + }, fileData: { type: 'string', description: 'Base64 encoded file data (for direct file upload)', }, fileName: { type: 'string', - description: 'File name with extension (e.g., "image.jpg", "document.pdf") - required when using fileData', + description: + 'File name with extension (e.g., "image.jpg", "document.pdf") - required when using fileData', }, mimeType: { type: 'string', - description: 'MIME type of the file (e.g., "image/jpeg", "application/pdf") - required when using fileData', + description: + 'MIME type of the file (e.g., "image/jpeg", "application/pdf") - required when using fileData', }, externalUrl: { type: 'string', - description: 'External URL of the file to upload (alternative to fileData)', + description: + 'External URL of the file to upload (alternative to fileData)', }, }, }, }; -export async function handleUploadMedia(params: MediaToolParameters) { +export async function handleUploadMedia( + params: MediaToolParameters, + serviceId?: string +) { const { fileData, fileName, mimeType, externalUrl } = params; + const clients = getClientsForService(serviceId); try { // Method 1: Upload from external URL + // Note: SDK types may not include 'url' property, but API supports it if (externalUrl) { - const result = await microCMSManagementClient.uploadMedia({ - data: externalUrl, - }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const result = await clients.managementClient.uploadMedia({ url: externalUrl } as any); return result; } @@ -53,7 +66,7 @@ export async function handleUploadMedia(params: MediaToolParameters) { // Create Blob from buffer (for Node.js environment) const data = new Blob([buffer], { type: mimeType }); - const result = await microCMSManagementClient.uploadMedia({ + const result = await clients.managementClient.uploadMedia({ data, name: fileName, }); @@ -61,11 +74,13 @@ export async function handleUploadMedia(params: MediaToolParameters) { return result; } - throw new Error('Either externalUrl or (fileData + fileName + mimeType) must be provided'); + throw new Error( + 'Either externalUrl or (fileData + fileName + mimeType) must be provided' + ); } catch (error) { if (error instanceof Error) { throw new Error(`Media upload failed: ${error.message}`); } throw new Error('Media upload failed: Unknown error'); } -} \ No newline at end of file +} diff --git a/src/types.ts b/src/types.ts index bce9596..4fc01bd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,25 @@ +// Service configuration types +export interface ServiceConfig { + id: string; // サービスID (serviceDomain) + apiKey: string; // APIキー +} + +export type ConfigMode = 'single' | 'multi'; + +export interface SingleServiceConfig { + mode: 'single'; + serviceDomain: string; + apiKey: string; +} + +export interface MultiServiceConfig { + mode: 'multi'; + services: ServiceConfig[]; +} + +export type AppConfig = SingleServiceConfig | MultiServiceConfig; + +// microCMS API types export interface MicroCMSListOptions { draftKey?: string; limit?: number; @@ -31,7 +53,7 @@ export interface MicroCMSContent { updatedAt: string; publishedAt?: string; revisedAt?: string; - [key: string]: any; + [key: string]: unknown; } export interface MicroCMSListResponse { @@ -59,7 +81,7 @@ export interface MemberInfo { export interface ToolParameters { endpoint: string; contentId?: string; - content?: Record; + content?: Record; draftKey?: string; limit?: number; offset?: number; @@ -93,4 +115,54 @@ export interface MediaToolParameters { mimeType?: string; externalUrl?: string; url?: string; -} \ No newline at end of file +} + +// Management API types +export interface ApiInfo { + apiName: string; + apiEndpoint: string; + apiType: string[]; + apiFields: unknown[]; + customFields?: unknown[]; +} + +export interface ApiListResponse { + apis: ApiInfo[]; +} + +export interface ContentMeta { + id: string; + status: string[]; + createdBy?: string; + updatedBy?: string; + reservationTime?: string | null; + closedAt?: string | null; + customStatus?: unknown; + [key: string]: unknown; +} + +export interface ContentMetaListResponse { + contents: ContentMeta[]; + totalCount: number; + offset: number; + limit: number; +} + +export interface MediaItem { + url: string; + width?: number; + height?: number; + fileName?: string; + fileSize?: number; + mimeType?: string; + createdAt: string; +} + +export interface MediaListResponse { + media: MediaItem[]; + token?: string; +} + +export interface MediaUploadResponse { + url: string; +} From 0f629405877ca8dcbf9e287ef782456e220f018a Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Fri, 28 Nov 2025 18:16:07 +0900 Subject: [PATCH 04/10] Remove ESLint and Prettier configurations, and introduce Biome for linting and formatting - Deleted `.eslintrc.cjs` and `.prettierrc` files to remove previous configurations. - Added `biome.json` for new linting and formatting rules. - Updated `package.json` scripts to use Biome for linting and formatting tasks. --- .eslintrc.cjs | 23 ----------------------- .prettierrc | 8 -------- biome.json | 39 +++++++++++++++++++++++++++++++++++++++ package.json | 11 +++++------ 4 files changed, 44 insertions(+), 37 deletions(-) delete mode 100644 .eslintrc.cjs delete mode 100644 .prettierrc create mode 100644 biome.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index ae90723..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - parser: '@typescript-eslint/parser', - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - ], - plugins: ['@typescript-eslint'], - parserOptions: { - ecmaVersion: 2022, - sourceType: 'module', - }, - env: { - node: true, - es2022: true, - }, - rules: { - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/no-explicit-any': 'warn', - 'no-console': ['warn', { allow: ['warn', 'error'] }], - }, - ignorePatterns: ['dist/', 'node_modules/'], -}; diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 46f2372..0000000 --- a/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "semi": true, - "trailingComma": "es5", - "singleQuote": true, - "printWidth": 80, - "tabWidth": 2, - "useTabs": false -} \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..040f43b --- /dev/null +++ b/biome.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.4/schema.json", + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "warn", + "noConsole": "off" + } + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 80 + }, + "javascript": { + "formatter": { + "semicolons": "always", + "quoteStyle": "single", + "trailingCommas": "es5" + } + }, + "files": { + "includes": ["src/**"] + } +} diff --git a/package.json b/package.json index 059ebc0..384600f 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,10 @@ "start": "node dist/index.js", "start:args": "node dist/index.js --service-id your-service-id --api-key your-api-key", "dev": "tsc --watch & node --watch dist/index.js", - "lint": "eslint src/**/*.ts", - "format": "prettier --write src/**/*.ts", + "lint": "biome lint src/", + "format": "biome format --write src/", + "check": "biome check src/", + "check:fix": "biome check --write src/", "prepublishOnly": "npm run build", "test": "echo \"No tests specified\" && exit 0" }, @@ -52,11 +54,8 @@ "microcms-js-sdk": "^3.1.2" }, "devDependencies": { + "@biomejs/biome": "2.3.4", "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.0.0", - "prettier": "^3.0.0", "typescript": "^5.0.0" }, "engines": { From f8539bf75b7dc3954e0d985b375a6007caa3e380 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Fri, 28 Nov 2025 18:16:16 +0900 Subject: [PATCH 05/10] Update pnpm-lock.yaml to include Biome dependencies and remove obsolete packages - Added '@biomejs/biome' and related CLI packages for linting and formatting. - Removed outdated ESLint and Prettier dependencies along with their configurations. - Cleaned up unnecessary packages to streamline the dependency tree. --- pnpm-lock.yaml | 1028 ++++-------------------------------------------- 1 file changed, 86 insertions(+), 942 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1d24f7..8ff2674 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,196 +15,96 @@ importers: specifier: ^3.1.2 version: 3.2.0 devDependencies: + '@biomejs/biome': + specifier: 2.3.4 + version: 2.3.4 '@types/node': specifier: ^20.0.0 version: 20.17.57 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) - eslint: - specifier: ^8.0.0 - version: 8.57.1 - prettier: - specifier: ^3.0.0 - version: 3.5.3 typescript: specifier: ^5.0.0 version: 5.8.3 packages: - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@biomejs/biome@2.3.4': + resolution: {integrity: sha512-TU08LXjBHdy0mEY9APtEtZdNQQijXUDSXR7IK1i45wgoPD5R0muK7s61QcFir6FpOj/RP1+YkPx5QJlycXUU3w==} + engines: {node: '>=14.21.3'} + hasBin: true - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@biomejs/cli-darwin-arm64@2.3.4': + resolution: {integrity: sha512-w40GvlNzLaqmuWYiDU6Ys9FNhJiclngKqcGld3iJIiy2bpJ0Q+8n3haiaC81uTPY/NA0d8Q/I3Z9+ajc14102Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.3.4': + resolution: {integrity: sha512-3s7TLVtjJ7ni1xADXsS7x7GMUrLBZXg8SemXc3T0XLslzvqKj/dq1xGeBQ+pOWQzng9MaozfacIHdK2UlJ3jGA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.3.4': + resolution: {integrity: sha512-IruVGQRwMURivWazchiq7gKAqZSFs5so6gi0hJyxk7x6HR+iwZbO2IxNOqyLURBvL06qkIHs7Wffl6Bw30vCbQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.3.4': + resolution: {integrity: sha512-y7efHyyM2gYmHy/AdWEip+VgTMe9973aP7XYKPzu/j8JxnPHuSUXftzmPhkVw0lfm4ECGbdBdGD6+rLmTgNZaA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.3.4': + resolution: {integrity: sha512-mzKFFv/w66e4/jCobFmD3kymCqG+FuWE7sVa4Yjqd9v7qt2UhXo67MSZKY9Ih18V2IwPzRKQPCw6KwdZs6AXSA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.3.4': + resolution: {integrity: sha512-gKfjWR/6/dfIxPJCw8REdEowiXCkIpl9jycpNVHux8aX2yhWPLjydOshkDL6Y/82PcQJHn95VCj7J+BRcE5o1Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.3.4': + resolution: {integrity: sha512-5TJ6JfVez+yyupJ/iGUici2wzKf0RrSAxJhghQXtAEsc67OIpdwSKAQboemILrwKfHDi5s6mu7mX+VTCTUydkw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.3.4': + resolution: {integrity: sha512-FGCijXecmC4IedQ0esdYNlMpx0Jxgf4zceCaMu6fkjWyjgn50ZQtMiqZZQ0Q/77yqPxvtkgZAvt5uGw0gAAjig==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] '@modelcontextprotocol/sdk@1.12.1': resolution: {integrity: sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==} engines: {node: '>=18'} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.17.57': resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - body-parser@2.2.0: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -217,24 +117,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - content-disposition@1.0.0: resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} engines: {node: '>= 0.6'} @@ -268,21 +150,10 @@ packages: supports-color: optional: true - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -309,44 +180,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -372,42 +205,13 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - finalhandler@2.1.0: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -416,9 +220,6 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -430,37 +231,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -477,22 +251,6 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -500,55 +258,15 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -561,18 +279,10 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - microcms-js-sdk@3.2.0: resolution: {integrity: sha512-08TyGuBg3oBU27CUT0rn7GDgLu58pZ9F3aBpAa5boJJsllkz9BosLWsqOM9dfGTcVOga+/9tMtwHtmq17MK2KQ==} engines: {node: '>=18.0.0'} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} @@ -581,19 +291,9 @@ packages: resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -613,34 +313,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -649,27 +325,10 @@ packages: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - pkce-challenge@5.0.0: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} - hasBin: true - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -682,9 +341,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -693,41 +349,20 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - send@1.2.0: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} @@ -763,51 +398,14 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -836,17 +434,9 @@ packages: engines: {node: '>= 8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - zod-to-json-schema@3.24.5: resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} peerDependencies: @@ -857,40 +447,40 @@ packages: snapshots: - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 + '@biomejs/biome@2.3.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.4 + '@biomejs/cli-darwin-x64': 2.3.4 + '@biomejs/cli-linux-arm64': 2.3.4 + '@biomejs/cli-linux-arm64-musl': 2.3.4 + '@biomejs/cli-linux-x64': 2.3.4 + '@biomejs/cli-linux-x64-musl': 2.3.4 + '@biomejs/cli-win32-arm64': 2.3.4 + '@biomejs/cli-win32-x64': 2.3.4 - '@eslint-community/regexpp@4.12.1': {} + '@biomejs/cli-darwin-arm64@2.3.4': + optional: true - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.1 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@biomejs/cli-darwin-x64@2.3.4': + optional: true - '@eslint/js@8.57.1': {} + '@biomejs/cli-linux-arm64-musl@2.3.4': + optional: true - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@biomejs/cli-linux-arm64@2.3.4': + optional: true + + '@biomejs/cli-linux-x64-musl@2.3.4': + optional: true - '@humanwhocodes/module-importer@1.0.1': {} + '@biomejs/cli-linux-x64@2.3.4': + optional: true - '@humanwhocodes/object-schema@2.0.3': {} + '@biomejs/cli-win32-arm64@2.3.4': + optional: true + + '@biomejs/cli-win32-x64@2.3.4': + optional: true '@modelcontextprotocol/sdk@1.12.1': dependencies: @@ -908,125 +498,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@types/json-schema@7.0.15': {} - '@types/node@20.17.57': dependencies: undici-types: 6.19.8 - '@types/semver@7.7.0': {} - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - eslint: 8.57.1 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.3.0': {} - accepts@2.0.0: dependencies: mime-types: 3.0.1 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -1034,22 +514,10 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - argparse@2.0.1: {} - - array-union@2.1.0: {} - async-retry@1.3.3: dependencies: retry: 0.13.1 - balanced-match@1.0.2: {} - body-parser@2.2.0: dependencies: bytes: 3.1.2 @@ -1064,19 +532,6 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - bytes@3.1.2: {} call-bind-apply-helpers@1.0.2: @@ -1089,21 +544,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - callsites@3.1.0: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - concat-map@0.0.1: {} - content-disposition@1.0.0: dependencies: safe-buffer: 5.2.1 @@ -1129,18 +569,8 @@ snapshots: dependencies: ms: 2.1.3 - deep-is@0.1.4: {} - depd@2.0.0: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1161,76 +591,6 @@ snapshots: escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 3.4.3 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - etag@1.8.1: {} eventsource-parser@3.0.2: {} @@ -1277,30 +637,8 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} - fast-levenshtein@2.0.6: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - finalhandler@2.1.0: dependencies: debug: 4.4.1 @@ -1312,25 +650,10 @@ snapshots: transitivePeerDependencies: - supports-color - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.3: {} - forwarded@0.2.0: {} fresh@2.0.0: {} - fs.realpath@1.0.0: {} - function-bind@1.1.2: {} get-intrinsic@1.3.0: @@ -1351,42 +674,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - gopd@1.2.0: {} - graphemer@1.4.0: {} - - has-flag@4.0.0: {} - has-symbols@1.1.0: {} hasown@2.0.2: @@ -1405,98 +694,34 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ignore@5.3.2: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ipaddr.js@1.9.1: {} - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - is-promise@4.0.0: {} isexe@2.0.0: {} - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-buffer@3.0.1: {} - json-schema-traverse@0.4.1: {} - json-stable-stringify-without-jsonify@1.0.1: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - math-intrinsics@1.1.0: {} media-typer@1.1.0: {} merge-descriptors@2.0.0: {} - merge2@1.4.1: {} - microcms-js-sdk@3.2.0: dependencies: async-retry: 1.3.3 - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - mime-db@1.54.0: {} mime-types@3.0.1: dependencies: mime-db: 1.54.0 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - ms@2.1.3: {} - natural-compare@1.4.0: {} - negotiator@1.0.0: {} object-assign@4.1.1: {} @@ -1511,47 +736,14 @@ snapshots: dependencies: wrappy: 1.0.2 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parseurl@1.3.3: {} - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-to-regexp@8.2.0: {} - path-type@4.0.0: {} - - picomatch@2.3.1: {} - pkce-challenge@5.0.0: {} - prelude-ls@1.2.1: {} - - prettier@3.5.3: {} - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -1563,8 +755,6 @@ snapshots: dependencies: side-channel: 1.1.0 - queue-microtask@1.2.3: {} - range-parser@1.2.1: {} raw-body@3.0.0: @@ -1574,16 +764,8 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - resolve-from@4.0.0: {} - retry@0.13.1: {} - reusify@1.1.0: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - router@2.2.0: dependencies: debug: 4.4.1 @@ -1594,16 +776,10 @@ snapshots: transitivePeerDependencies: - supports-color - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} - semver@7.7.2: {} - send@1.2.0: dependencies: debug: 4.4.1 @@ -1665,38 +841,10 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - slash@3.0.0: {} - statuses@2.0.1: {} - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-json-comments@3.1.1: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - text-table@0.2.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - toidentifier@1.0.1: {} - ts-api-utils@1.4.3(typescript@5.8.3): - dependencies: - typescript: 5.8.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -1719,12 +867,8 @@ snapshots: dependencies: isexe: 2.0.0 - word-wrap@1.2.5: {} - wrappy@1.0.2: {} - yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.5(zod@3.25.49): dependencies: zod: 3.25.49 From ad505c8708812a1c7133a99e3d3b638255b3d96e Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Fri, 28 Nov 2025 18:16:32 +0900 Subject: [PATCH 06/10] Refactor code for improved readability and consistency - Cleaned up formatting in `cli.ts`, `client.ts`, `config.ts`, and various tool files for better readability. - Standardized import statements and added type imports where necessary. - Enhanced error messages and comments for clarity. - Ensured consistent use of line breaks and spacing across files. --- src/cli.ts | 21 ++- src/client.ts | 189 +++++++++++++++++----- src/config.ts | 76 +++++---- src/constants.ts | 2 +- src/index.ts | 2 +- src/server.ts | 140 +++++++++++----- src/tools/create-content-draft.ts | 4 +- src/tools/create-content-published.ts | 4 +- src/tools/delete-content.ts | 2 +- src/tools/delete-media.ts | 2 +- src/tools/get-api-info.ts | 2 +- src/tools/get-apis-list.ts | 2 +- src/tools/get-content-meta.ts | 2 +- src/tools/get-content.ts | 4 +- src/tools/get-contents-list-management.ts | 2 +- src/tools/get-list-meta.ts | 2 +- src/tools/get-list.ts | 4 +- src/tools/get-media.ts | 2 +- src/tools/get-member.ts | 2 +- src/tools/patch-content-created-by.ts | 2 +- src/tools/patch-content-status.ts | 2 +- src/tools/patch-content.ts | 4 +- src/tools/update-content-draft.ts | 4 +- src/tools/update-content-published.ts | 4 +- src/tools/upload-media.ts | 6 +- src/types.ts | 4 +- 26 files changed, 338 insertions(+), 152 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index ff4ad49..b448859 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -82,10 +82,10 @@ export async function runCli() { type: 'string', short: 'k', }, - 'help': { + help: { type: 'boolean', short: 'h', - } + }, }, allowPositionals: true, }); @@ -106,19 +106,25 @@ export async function runCli() { // 設定の検証 // MICROCMS_SERVICES が設定されている場合はマルチサービスモード(単一サービス設定は不要) const hasMultiServiceConfig = !!process.env.MICROCMS_SERVICES; - const hasSingleServiceConfig = !!(process.env.MICROCMS_SERVICE_ID && process.env.MICROCMS_API_KEY); - + const hasSingleServiceConfig = !!( + process.env.MICROCMS_SERVICE_ID && process.env.MICROCMS_API_KEY + ); + if (!hasMultiServiceConfig && !hasSingleServiceConfig) { console.error('Error: microCMS credentials are required.'); console.error(''); console.error('Provide them via:'); console.error(' Single service mode:'); console.error(' --service-id --api-key '); - console.error(' or environment variables MICROCMS_SERVICE_ID and MICROCMS_API_KEY'); + console.error( + ' or environment variables MICROCMS_SERVICE_ID and MICROCMS_API_KEY' + ); console.error(''); console.error(' Multi service mode:'); console.error(' environment variable MICROCMS_SERVICES (JSON array)'); - console.error(' Example: MICROCMS_SERVICES=\'[{"id":"blog","apiKey":"xxx"}]\''); + console.error( + ' Example: MICROCMS_SERVICES=\'[{"id":"blog","apiKey":"xxx"}]\'' + ); console.error(''); console.error('Run with --help for more information.'); process.exit(1); @@ -127,7 +133,6 @@ export async function runCli() { // サーバーを起動 const { startServer } = await import('./server.js'); await startServer(); - } catch (error) { if (error instanceof Error) { console.error('Error:', error.message); @@ -141,4 +146,4 @@ export async function runCli() { // 直接実行された場合 if (import.meta.url === `file://${process.argv[1]}`) { runCli(); -} \ No newline at end of file +} diff --git a/src/client.ts b/src/client.ts index 449a029..877a5ba 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,4 +1,8 @@ -import { createClient, createManagementClient, MicroCMSQueries } from 'microcms-js-sdk'; +import { + createClient, + createManagementClient, + type MicroCMSQueries, +} from 'microcms-js-sdk'; import { parseConfig } from './config.js'; import type { ApiInfo, @@ -107,7 +111,7 @@ export function hasService(serviceId: string): boolean { */ export function getClientsForService(serviceId?: string): ServiceClients { ensureInitialized(); - + // Validate serviceId requirement based on mode if (!serviceId) { if (appConfig?.mode === 'multi') { @@ -118,7 +122,7 @@ export function getClientsForService(serviceId?: string): ServiceClients { } return getDefaultClients(); } - + const clients = clientMap.get(serviceId); if (!clients) { const available = getServiceIds().join(', '); @@ -153,16 +157,33 @@ function getDefaultClients(): ServiceClients { // Legacy exports for backward compatibility export const microCMSClient = { - getList: (params: { endpoint: string; queries?: MicroCMSQueries }) => { + getList: (params: { + endpoint: string; + queries?: MicroCMSQueries; + }) => { return getDefaultClients().client.getList(params); }, - getListDetail: (params: { endpoint: string; contentId: string; queries?: MicroCMSQueries }) => { + getListDetail: (params: { + endpoint: string; + contentId: string; + queries?: MicroCMSQueries; + }) => { return getDefaultClients().client.getListDetail(params); }, - create: (params: { endpoint: string; content: Record; contentId?: string; isDraft?: boolean }) => { + create: (params: { + endpoint: string; + content: Record; + contentId?: string; + isDraft?: boolean; + }) => { return getDefaultClients().client.create(params); }, - update: (params: { endpoint: string; contentId: string; content: Record; isDraft?: boolean }) => { + update: (params: { + endpoint: string; + contentId: string; + content: Record; + isDraft?: boolean; + }) => { return getDefaultClients().client.update(params); }, delete: (params: { endpoint: string; contentId: string }) => { @@ -171,7 +192,15 @@ export const microCMSClient = { }; export const microCMSManagementClient = { - uploadMedia: (params: { data: File | Blob } | { url: string; fileName?: string; customRequestHeaders?: Record }) => { + uploadMedia: ( + params: + | { data: File | Blob } + | { + url: string; + fileName?: string; + customRequestHeaders?: Record; + } + ) => { // SDK types don't fully match API capabilities, type assertion required // eslint-disable-next-line @typescript-eslint/no-explicit-any return getDefaultClients().managementClient.uploadMedia(params as any); @@ -193,7 +222,9 @@ export async function getList( queries?: MicroCMSQueries, serviceId?: string ): Promise> { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); return await clients.client.getList({ endpoint, queries, @@ -206,7 +237,9 @@ export async function getListDetail( queries?: MicroCMSQueries, serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); return await clients.client.getListDetail({ endpoint, contentId, @@ -216,11 +249,16 @@ export async function getListDetail( export async function create( endpoint: string, - content: Omit, + content: Omit< + T, + 'id' | 'createdAt' | 'updatedAt' | 'publishedAt' | 'revisedAt' + >, options?: { isDraft?: boolean; contentId?: string }, serviceId?: string ): Promise<{ id: string }> { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); return await clients.client.create({ endpoint, content, @@ -231,11 +269,16 @@ export async function create( export async function update( endpoint: string, contentId: string, - content: Omit, + content: Omit< + T, + 'id' | 'createdAt' | 'updatedAt' | 'publishedAt' | 'revisedAt' + >, options?: { isDraft?: boolean }, serviceId?: string ): Promise<{ id: string }> { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); return await clients.client.update({ endpoint, contentId, @@ -247,11 +290,15 @@ export async function update( export async function patch( endpoint: string, contentId: string, - content: Partial>, + content: Partial< + Omit + >, options?: { isDraft?: boolean }, serviceId?: string ): Promise<{ id: string }> { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); return await clients.client.update({ endpoint, contentId, @@ -265,15 +312,22 @@ export async function deleteContent( contentId: string, serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); return await clients.client.delete({ endpoint, contentId, }); } -export async function getApiInfo(endpoint: string, serviceId?: string): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); +export async function getApiInfo( + endpoint: string, + serviceId?: string +): Promise { + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/apis/${endpoint}`; const response = await fetch(url, { @@ -285,14 +339,18 @@ export async function getApiInfo(endpoint: string, serviceId?: string): Promise< if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to get API info: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to get API info: ${response.status} ${response.statusText} - ${errorText}` + ); } return await response.json(); } export async function getApiList(serviceId?: string): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/apis`; const response = await fetch(url, { @@ -304,14 +362,21 @@ export async function getApiList(serviceId?: string): Promise { if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to get API list: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to get API list: ${response.status} ${response.statusText} - ${errorText}` + ); } return await response.json(); } -export async function getMember(memberId: string, serviceId?: string): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); +export async function getMember( + memberId: string, + serviceId?: string +): Promise { + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/members/${memberId}`; const response = await fetch(url, { @@ -323,14 +388,21 @@ export async function getMember(memberId: string, serviceId?: string): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); +export async function deleteMedia( + mediaUrl: string, + serviceId?: string +): Promise<{ id: string }> { + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v2/media?url=${encodeURIComponent(mediaUrl)}`; const response = await fetch(url, { @@ -342,7 +414,9 @@ export async function deleteMedia(mediaUrl: string, serviceId?: string): Promise if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to delete media: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to delete media: ${response.status} ${response.statusText} - ${errorText}` + ); } return await response.json(); @@ -354,7 +428,9 @@ export async function patchContentStatus( status: 'PUBLISH' | 'DRAFT', serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}/status`; const response = await fetch(url, { @@ -368,7 +444,9 @@ export async function patchContentStatus( if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to patch content status: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to patch content status: ${response.status} ${response.statusText} - ${errorText}` + ); } } @@ -378,7 +456,9 @@ export async function patchContentCreatedBy( memberId: string, serviceId?: string ): Promise<{ id: string }> { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}/createdBy`; const response = await fetch(url, { @@ -392,7 +472,9 @@ export async function patchContentCreatedBy( if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to patch content createdBy: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to patch content createdBy: ${response.status} ${response.statusText} - ${errorText}` + ); } return await response.json(); @@ -403,7 +485,9 @@ export async function getListMeta( options?: { limit?: number; offset?: number }, serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const queryParams = new URLSearchParams(); if (options?.limit) queryParams.append('limit', options.limit.toString()); if (options?.offset) queryParams.append('offset', options.offset.toString()); @@ -419,7 +503,9 @@ export async function getListMeta( if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to get contents list: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to get contents list: ${response.status} ${response.statusText} - ${errorText}` + ); } return await response.json(); @@ -430,7 +516,9 @@ export async function getContentManagement( contentId: string, serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const url = `https://${clients.serviceDomain}.microcms-management.io/api/v1/contents/${endpoint}/${contentId}`; const response = await fetch(url, { @@ -442,7 +530,9 @@ export async function getContentManagement( if (!response.ok) { const errorText = await response.text(); - throw new Error(`Failed to get content: ${response.status} ${response.statusText} - ${errorText}`); + throw new Error( + `Failed to get content: ${response.status} ${response.statusText} - ${errorText}` + ); } return await response.json(); @@ -450,10 +540,17 @@ export async function getContentManagement( // Media functions with service support export async function getMedia( - params?: { limit?: number; imageOnly?: boolean; fileName?: string; token?: string }, + params?: { + limit?: number; + imageOnly?: boolean; + fileName?: string; + token?: string; + }, serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); const queryParams = new URLSearchParams(); if (params?.limit) queryParams.append('limit', params.limit.toString()); if (params?.imageOnly) queryParams.append('imageOnly', 'true'); @@ -471,17 +568,27 @@ export async function getMedia( ); if (!response.ok) { - throw new Error(`Media retrieval failed: ${response.status} ${response.statusText}`); + throw new Error( + `Media retrieval failed: ${response.status} ${response.statusText}` + ); } return await response.json(); } export async function uploadMedia( - params: { data: File | Blob; name?: string } | { url: string; fileName?: string; customRequestHeaders?: Record }, + params: + | { data: File | Blob; name?: string } + | { + url: string; + fileName?: string; + customRequestHeaders?: Record; + }, serviceId?: string ): Promise { - const clients = serviceId ? getClientsForService(serviceId) : getDefaultClients(); + const clients = serviceId + ? getClientsForService(serviceId) + : getDefaultClients(); // SDK types don't fully match API capabilities, type assertion required // eslint-disable-next-line @typescript-eslint/no-explicit-any return await clients.managementClient.uploadMedia(params as any); diff --git a/src/config.ts b/src/config.ts index 62ec632..69141db 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,14 +1,24 @@ -import type { AppConfig, ServiceConfig, SingleServiceConfig, MultiServiceConfig } from './types.js'; +import type { + AppConfig, + MultiServiceConfig, + ServiceConfig, + SingleServiceConfig, +} from './types.js'; -export type { AppConfig, ServiceConfig, SingleServiceConfig, MultiServiceConfig }; +export type { + AppConfig, + ServiceConfig, + SingleServiceConfig, + MultiServiceConfig, +}; /** * Parse and validate service configuration from environment variables or command line arguments. - * + * * Supports two modes: * 1. Single service mode (legacy): MICROCMS_SERVICE_ID + MICROCMS_API_KEY * 2. Multi service mode: MICROCMS_SERVICES (JSON array) - * + * * If MICROCMS_SERVICES is set, it takes priority over the legacy single service config. */ export function parseConfig(): AppConfig { @@ -27,21 +37,21 @@ export function parseConfig(): AppConfig { */ function parseMultiServiceConfig(jsonString: string): MultiServiceConfig { let services: ServiceConfig[]; - + try { services = JSON.parse(jsonString); } catch (error) { throw new Error( 'Invalid MICROCMS_SERVICES JSON format.\n' + - 'Expected format: [{"id": "service-id", "apiKey": "api-key"}, ...]\n' + - `Parse error: ${error instanceof Error ? error.message : String(error)}` + 'Expected format: [{"id": "service-id", "apiKey": "api-key"}, ...]\n' + + `Parse error: ${error instanceof Error ? error.message : String(error)}` ); } if (!Array.isArray(services)) { throw new Error( 'MICROCMS_SERVICES must be a JSON array.\n' + - 'Expected format: [{"id": "service-id", "apiKey": "api-key"}, ...]' + 'Expected format: [{"id": "service-id", "apiKey": "api-key"}, ...]' ); } @@ -53,21 +63,29 @@ function parseMultiServiceConfig(jsonString: string): MultiServiceConfig { const seenIds = new Set(); for (let i = 0; i < services.length; i++) { const service = services[i]; - + if (!service || typeof service !== 'object') { - throw new Error(`MICROCMS_SERVICES[${i}]: Invalid service configuration.`); + throw new Error( + `MICROCMS_SERVICES[${i}]: Invalid service configuration.` + ); } if (!service.id || typeof service.id !== 'string') { - throw new Error(`MICROCMS_SERVICES[${i}]: Missing or invalid "id" field.`); + throw new Error( + `MICROCMS_SERVICES[${i}]: Missing or invalid "id" field.` + ); } if (!service.apiKey || typeof service.apiKey !== 'string') { - throw new Error(`MICROCMS_SERVICES[${i}]: Missing or invalid "apiKey" field.`); + throw new Error( + `MICROCMS_SERVICES[${i}]: Missing or invalid "apiKey" field.` + ); } if (seenIds.has(service.id)) { - throw new Error(`MICROCMS_SERVICES: Duplicate service id "${service.id}".`); + throw new Error( + `MICROCMS_SERVICES: Duplicate service id "${service.id}".` + ); } seenIds.add(service.id); } @@ -83,37 +101,37 @@ function parseMultiServiceConfig(jsonString: string): MultiServiceConfig { */ function parseSingleServiceConfig(): SingleServiceConfig { const args = process.argv.slice(2); - + // Parse command line arguments let serviceDomain: string | undefined; let apiKey: string | undefined; - + const serviceIdIndex = args.indexOf('--service-id'); if (serviceIdIndex !== -1 && serviceIdIndex + 1 < args.length) { serviceDomain = args[serviceIdIndex + 1]; } - + const apiKeyIndex = args.indexOf('--api-key'); if (apiKeyIndex !== -1 && apiKeyIndex + 1 < args.length) { apiKey = args[apiKeyIndex + 1]; } - + // Fallback to environment variables if not provided via command line serviceDomain = serviceDomain || process.env.MICROCMS_SERVICE_ID; apiKey = apiKey || process.env.MICROCMS_API_KEY; - + if (!serviceDomain || !apiKey) { throw new Error( 'microCMS credentials are required. Provide them via:\n' + - ' Single service mode:\n' + - ' Command line: --service-id --api-key \n' + - ' Environment variables: MICROCMS_SERVICE_ID and MICROCMS_API_KEY\n' + - ' Multi service mode:\n' + - ' Environment variable: MICROCMS_SERVICES (JSON array)\n' + - ' Example: MICROCMS_SERVICES=\'[{"id":"blog","apiKey":"xxx"}]\'' + ' Single service mode:\n' + + ' Command line: --service-id --api-key \n' + + ' Environment variables: MICROCMS_SERVICE_ID and MICROCMS_API_KEY\n' + + ' Multi service mode:\n' + + ' Environment variable: MICROCMS_SERVICES (JSON array)\n' + + ' Example: MICROCMS_SERVICES=\'[{"id":"blog","apiKey":"xxx"}]\'' ); } - + return { mode: 'single', serviceDomain, @@ -132,22 +150,22 @@ export interface Config { */ export function parseLegacyConfig(): Config { const config = parseConfig(); - + if (config.mode === 'single') { return { serviceDomain: config.serviceDomain, apiKey: config.apiKey, }; } - + // For multi-service mode, return the first service as default // This maintains backward compatibility but logs a warning const firstService = config.services[0]; console.error( 'Warning: parseLegacyConfig() called in multi-service mode. ' + - `Using first service "${firstService.id}" as default.` + `Using first service "${firstService.id}" as default.` ); - + return { serviceDomain: firstService.id, apiKey: firstService.apiKey, diff --git a/src/constants.ts b/src/constants.ts index 3a51001..7685a9f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -22,4 +22,4 @@ export const FIELD_FORMATS_DESCRIPTION = ` "key2": "", } \`\`\` - `; \ No newline at end of file + `; diff --git a/src/index.ts b/src/index.ts index cfaaf89..d6bdd66 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,4 +6,4 @@ async function main() { await startServer(); } -main(); \ No newline at end of file +main(); diff --git a/src/server.ts b/src/server.ts index 6d3d629..ca5f796 100644 --- a/src/server.ts +++ b/src/server.ts @@ -7,28 +7,56 @@ import { ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; -import { getApiList, getAppConfig, getServiceIds, initializeClients } from './client.js'; -import type { ToolParameters } from './types.js'; - +import { + getApiList, + getAppConfig, + getServiceIds, + initializeClients, +} from './client.js'; // Import tool definitions and handlers -import { createContentDraftTool, handleCreateContentDraft } from './tools/create-content-draft.js'; -import { createContentPublishedTool, handleCreateContentPublished } from './tools/create-content-published.js'; -import { deleteContentTool, handleDeleteContent } from './tools/delete-content.js'; +import { + createContentDraftTool, + handleCreateContentDraft, +} from './tools/create-content-draft.js'; +import { + createContentPublishedTool, + handleCreateContentPublished, +} from './tools/create-content-published.js'; +import { + deleteContentTool, + handleDeleteContent, +} from './tools/delete-content.js'; import { deleteMediaTool, handleDeleteMedia } from './tools/delete-media.js'; import { getApiInfoTool, handleGetApiInfo } from './tools/get-api-info.js'; import { getApiListTool, handleGetApiList } from './tools/get-apis-list.js'; -import { getContentMetaTool, handleGetContentMeta } from './tools/get-content-meta.js'; import { getContentTool, handleGetContent } from './tools/get-content.js'; -import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; +import { + getContentMetaTool, + handleGetContentMeta, +} from './tools/get-content-meta.js'; import { getListTool, handleGetList } from './tools/get-list.js'; +import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; import { getMediaTool, handleGetMedia } from './tools/get-media.js'; import { getMemberTool, handleGetMember } from './tools/get-member.js'; -import { handlePatchContentCreatedBy, patchContentCreatedByTool } from './tools/patch-content-created-by.js'; -import { handlePatchContentStatus, patchContentStatusTool } from './tools/patch-content-status.js'; import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; -import { handleUpdateContentDraft, updateContentDraftTool } from './tools/update-content-draft.js'; -import { handleUpdateContentPublished, updateContentPublishedTool } from './tools/update-content-published.js'; +import { + handlePatchContentCreatedBy, + patchContentCreatedByTool, +} from './tools/patch-content-created-by.js'; +import { + handlePatchContentStatus, + patchContentStatusTool, +} from './tools/patch-content-status.js'; +import { + handleUpdateContentDraft, + updateContentDraftTool, +} from './tools/update-content-draft.js'; +import { + handleUpdateContentPublished, + updateContentPublishedTool, +} from './tools/update-content-published.js'; import { handleUploadMedia, uploadMediaTool } from './tools/upload-media.js'; +import type { ToolParameters } from './types.js'; // Fixed tool list (18 tools) const tools = [ @@ -54,25 +82,28 @@ const tools = [ // Tool handlers map // eslint-disable-next-line @typescript-eslint/no-explicit-any -const toolHandlers: Record Promise> = { - 'microcms_get_list': handleGetList, - 'microcms_get_list_meta': handleGetListMeta, - 'microcms_get_content': handleGetContent, - 'microcms_get_content_meta': handleGetContentMeta, - 'microcms_create_content_published': handleCreateContentPublished, - 'microcms_create_content_draft': handleCreateContentDraft, - 'microcms_update_content_published': handleUpdateContentPublished, - 'microcms_update_content_draft': handleUpdateContentDraft, - 'microcms_patch_content': handlePatchContent, - 'microcms_patch_content_status': handlePatchContentStatus, - 'microcms_patch_content_created_by': handlePatchContentCreatedBy, - 'microcms_delete_content': handleDeleteContent, - 'microcms_get_media': handleGetMedia, - 'microcms_upload_media': handleUploadMedia, - 'microcms_delete_media': handleDeleteMedia, - 'microcms_get_api_info': handleGetApiInfo, - 'microcms_get_api_list': handleGetApiList, - 'microcms_get_member': handleGetMember, +const toolHandlers: Record< + string, + (params: any, serviceId?: string) => Promise +> = { + microcms_get_list: handleGetList, + microcms_get_list_meta: handleGetListMeta, + microcms_get_content: handleGetContent, + microcms_get_content_meta: handleGetContentMeta, + microcms_create_content_published: handleCreateContentPublished, + microcms_create_content_draft: handleCreateContentDraft, + microcms_update_content_published: handleUpdateContentPublished, + microcms_update_content_draft: handleUpdateContentDraft, + microcms_patch_content: handlePatchContent, + microcms_patch_content_status: handlePatchContentStatus, + microcms_patch_content_created_by: handlePatchContentCreatedBy, + microcms_delete_content: handleDeleteContent, + microcms_get_media: handleGetMedia, + microcms_upload_media: handleUploadMedia, + microcms_delete_media: handleDeleteMedia, + microcms_get_api_info: handleGetApiInfo, + microcms_get_api_list: handleGetApiList, + microcms_get_member: handleGetMember, }; const server = new Server( @@ -101,7 +132,8 @@ server.setRequestHandler(ListResourcesRequestSchema, async () => { { uri: 'microcms://services', name: 'Available microCMS Services', - description: 'List of configured microCMS services. In multi-service mode, use serviceId parameter in tools to specify which service to use.', + description: + 'List of configured microCMS services. In multi-service mode, use serviceId parameter in tools to specify which service to use.', mimeType: 'application/json', }, ], @@ -116,15 +148,28 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => { const config = getAppConfig(); // Helper function to fetch API list for a service - const fetchApisForService = async (serviceId: string): Promise<{ name: string; endpoint: string; type: string }[]> => { + const fetchApisForService = async ( + serviceId: string + ): Promise<{ name: string; endpoint: string; type: string }[]> => { try { const result = await getApiList(serviceId); if (result && Array.isArray(result.apis)) { - return result.apis.map((api: { apiName?: string; name?: string; apiEndpoint?: string; endpoint?: string; apiType?: string[] }) => ({ - name: api.apiName || api.name || '', - endpoint: api.apiEndpoint || api.endpoint || '', - type: Array.isArray(api.apiType) && api.apiType.includes('LIST') ? 'list' : 'object', - })); + return result.apis.map( + (api: { + apiName?: string; + name?: string; + apiEndpoint?: string; + endpoint?: string; + apiType?: string[]; + }) => ({ + name: api.apiName || api.name || '', + endpoint: api.apiEndpoint || api.endpoint || '', + type: + Array.isArray(api.apiType) && api.apiType.includes('LIST') + ? 'list' + : 'object', + }) + ); } return []; } catch { @@ -159,7 +204,8 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => { content = { mode: 'multi', - description: 'Multi service mode - serviceId parameter is required for all tools. Use the serviceId that contains the endpoint you need.', + description: + 'Multi service mode - serviceId parameter is required for all tools. Use the serviceId that contains the endpoint you need.', services: servicesWithApis, }; } @@ -220,19 +266,27 @@ export async function startServer() { try { // Initialize clients and get configuration const config = initializeClients(); - + // Log mode information if (config.mode === 'single') { - console.error(`microCMS MCP Server starting in single-service mode (service: ${config.serviceDomain})`); + console.error( + `microCMS MCP Server starting in single-service mode (service: ${config.serviceDomain})` + ); } else { const serviceIds = getServiceIds().join(', '); - console.error(`microCMS MCP Server starting in multi-service mode (services: ${serviceIds})`); + console.error( + `microCMS MCP Server starting in multi-service mode (services: ${serviceIds})` + ); } const transport = new StdioServerTransport(); await server.connect(transport); } catch (error) { - if (error instanceof Error && (error.message.includes('microCMS credentials') || error.message.includes('MICROCMS_SERVICES'))) { + if ( + error instanceof Error && + (error.message.includes('microCMS credentials') || + error.message.includes('MICROCMS_SERVICES')) + ) { console.error('Configuration Error:', error.message); process.exit(1); } diff --git a/src/tools/create-content-draft.ts b/src/tools/create-content-draft.ts index 57db273..8fb09ab 100644 --- a/src/tools/create-content-draft.ts +++ b/src/tools/create-content-draft.ts @@ -1,7 +1,7 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { create } from '../client.js'; -import type { ToolParameters, MicroCMSCreateOptions } from '../types.js'; import { FIELD_FORMATS_DESCRIPTION } from '../constants.js'; +import type { MicroCMSCreateOptions, ToolParameters } from '../types.js'; export const createContentDraftTool: Tool = { name: 'microcms_create_content_draft', diff --git a/src/tools/create-content-published.ts b/src/tools/create-content-published.ts index d4435f2..b6c7be3 100644 --- a/src/tools/create-content-published.ts +++ b/src/tools/create-content-published.ts @@ -1,7 +1,7 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { create } from '../client.js'; -import type { ToolParameters, MicroCMSCreateOptions } from '../types.js'; import { FIELD_FORMATS_DESCRIPTION } from '../constants.js'; +import type { MicroCMSCreateOptions, ToolParameters } from '../types.js'; export const createContentPublishedTool: Tool = { name: 'microcms_create_content_published', diff --git a/src/tools/delete-content.ts b/src/tools/delete-content.ts index 77b2d1f..283370d 100644 --- a/src/tools/delete-content.ts +++ b/src/tools/delete-content.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { deleteContent } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/delete-media.ts b/src/tools/delete-media.ts index 8af1f94..3fe71b1 100644 --- a/src/tools/delete-media.ts +++ b/src/tools/delete-media.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { deleteMedia } from '../client.js'; import type { MediaToolParameters } from '../types.js'; diff --git a/src/tools/get-api-info.ts b/src/tools/get-api-info.ts index 2cc38ac..60bcb9e 100644 --- a/src/tools/get-api-info.ts +++ b/src/tools/get-api-info.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getApiInfo } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/get-apis-list.ts b/src/tools/get-apis-list.ts index 05a0ca9..683bcd2 100644 --- a/src/tools/get-apis-list.ts +++ b/src/tools/get-apis-list.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getApiList } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/get-content-meta.ts b/src/tools/get-content-meta.ts index 5ffb908..b8863e2 100644 --- a/src/tools/get-content-meta.ts +++ b/src/tools/get-content-meta.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getContentManagement } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/get-content.ts b/src/tools/get-content.ts index 593f321..1f83a57 100644 --- a/src/tools/get-content.ts +++ b/src/tools/get-content.ts @@ -1,6 +1,6 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getListDetail } from '../client.js'; -import type { ToolParameters, MicroCMSGetOptions } from '../types.js'; +import type { MicroCMSGetOptions, ToolParameters } from '../types.js'; export const getContentTool: Tool = { name: 'microcms_get_content', diff --git a/src/tools/get-contents-list-management.ts b/src/tools/get-contents-list-management.ts index d0a7dc4..bed0e2b 100644 --- a/src/tools/get-contents-list-management.ts +++ b/src/tools/get-contents-list-management.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getListMeta } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/get-list-meta.ts b/src/tools/get-list-meta.ts index b3df003..c344915 100644 --- a/src/tools/get-list-meta.ts +++ b/src/tools/get-list-meta.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getListMeta } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/get-list.ts b/src/tools/get-list.ts index de56197..a775ac2 100644 --- a/src/tools/get-list.ts +++ b/src/tools/get-list.ts @@ -1,6 +1,6 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getList } from '../client.js'; -import type { ToolParameters, MicroCMSListOptions } from '../types.js'; +import type { MicroCMSListOptions, ToolParameters } from '../types.js'; export const getListTool: Tool = { name: 'microcms_get_list', diff --git a/src/tools/get-media.ts b/src/tools/get-media.ts index 2a8f3d5..0d74d51 100644 --- a/src/tools/get-media.ts +++ b/src/tools/get-media.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getClientsForService } from '../client.js'; import type { MediaToolParameters } from '../types.js'; diff --git a/src/tools/get-member.ts b/src/tools/get-member.ts index 7c6077e..aba26f3 100644 --- a/src/tools/get-member.ts +++ b/src/tools/get-member.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getMember } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/patch-content-created-by.ts b/src/tools/patch-content-created-by.ts index fe9f583..168e240 100644 --- a/src/tools/patch-content-created-by.ts +++ b/src/tools/patch-content-created-by.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { patchContentCreatedBy } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/patch-content-status.ts b/src/tools/patch-content-status.ts index 484be94..71c02c2 100644 --- a/src/tools/patch-content-status.ts +++ b/src/tools/patch-content-status.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { patchContentStatus } from '../client.js'; import type { ToolParameters } from '../types.js'; diff --git a/src/tools/patch-content.ts b/src/tools/patch-content.ts index 661213d..c752adb 100644 --- a/src/tools/patch-content.ts +++ b/src/tools/patch-content.ts @@ -1,7 +1,7 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { patch } from '../client.js'; -import type { ToolParameters, MicroCMSUpdateOptions } from '../types.js'; import { FIELD_FORMATS_DESCRIPTION } from '../constants.js'; +import type { MicroCMSUpdateOptions, ToolParameters } from '../types.js'; export const patchContentTool: Tool = { name: 'microcms_patch_content', diff --git a/src/tools/update-content-draft.ts b/src/tools/update-content-draft.ts index 0913c2d..3f77e3f 100644 --- a/src/tools/update-content-draft.ts +++ b/src/tools/update-content-draft.ts @@ -1,7 +1,7 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { update } from '../client.js'; -import type { ToolParameters, MicroCMSUpdateOptions } from '../types.js'; import { FIELD_FORMATS_DESCRIPTION } from '../constants.js'; +import type { MicroCMSUpdateOptions, ToolParameters } from '../types.js'; export const updateContentDraftTool: Tool = { name: 'microcms_update_content_draft', diff --git a/src/tools/update-content-published.ts b/src/tools/update-content-published.ts index f9e80f7..43696d2 100644 --- a/src/tools/update-content-published.ts +++ b/src/tools/update-content-published.ts @@ -1,7 +1,7 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { update } from '../client.js'; -import type { ToolParameters, MicroCMSUpdateOptions } from '../types.js'; import { FIELD_FORMATS_DESCRIPTION } from '../constants.js'; +import type { MicroCMSUpdateOptions, ToolParameters } from '../types.js'; export const updateContentPublishedTool: Tool = { name: 'microcms_update_content_published', diff --git a/src/tools/upload-media.ts b/src/tools/upload-media.ts index 7350408..e5cd091 100644 --- a/src/tools/upload-media.ts +++ b/src/tools/upload-media.ts @@ -1,4 +1,4 @@ -import { Tool } from '@modelcontextprotocol/sdk/types.js'; +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { getClientsForService } from '../client.js'; import type { MediaToolParameters } from '../types.js'; @@ -49,7 +49,9 @@ export async function handleUploadMedia( // Note: SDK types may not include 'url' property, but API supports it if (externalUrl) { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result = await clients.managementClient.uploadMedia({ url: externalUrl } as any); + const result = await clients.managementClient.uploadMedia({ + url: externalUrl, + } as any); return result; } diff --git a/src/types.ts b/src/types.ts index 4fc01bd..99cf4ae 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,7 +1,7 @@ // Service configuration types export interface ServiceConfig { - id: string; // サービスID (serviceDomain) - apiKey: string; // APIキー + id: string; // サービスID (serviceDomain) + apiKey: string; // APIキー } export type ConfigMode = 'single' | 'multi'; From 2afcb6b5a105b97a26387c7ac5d2ee726a1eb893 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Thu, 4 Dec 2025 15:38:58 +0900 Subject: [PATCH 07/10] Update dependencies and refactor import statements in server.ts - Upgraded '@modelcontextprotocol/sdk' to version 1.12.1 in package.json. - Refactored import statements in server.ts for improved organization and consistency, ensuring all necessary tools are correctly imported. --- package.json | 2 +- src/server.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 384600f..e2100b4 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "homepage": "https://github.com/microcmsio/microcms-mcp-server#readme", "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.0.0", + "@modelcontextprotocol/sdk": "^1.12.1", "microcms-js-sdk": "^3.1.2" }, "devDependencies": { diff --git a/src/server.ts b/src/server.ts index ca5f796..aaeaee8 100644 --- a/src/server.ts +++ b/src/server.ts @@ -110,7 +110,6 @@ const server = new Server( { name: 'microcms-mcp-server', version: '1.0.0', - description: 'A Model Context Protocol server for microCMS API', }, { capabilities: { From bffd4e4a11bc6312ccd02faeb73ea6fec9993e95 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Thu, 4 Dec 2025 15:40:47 +0900 Subject: [PATCH 08/10] Refactor import statements in server.ts for improved organization - Reorganized import statements in server.ts to enhance clarity and maintainability. - Ensured all necessary tools are correctly imported, improving overall code structure. --- src/server.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/server.ts b/src/server.ts index aaeaee8..8761bed 100644 --- a/src/server.ts +++ b/src/server.ts @@ -29,16 +29,15 @@ import { import { deleteMediaTool, handleDeleteMedia } from './tools/delete-media.js'; import { getApiInfoTool, handleGetApiInfo } from './tools/get-api-info.js'; import { getApiListTool, handleGetApiList } from './tools/get-apis-list.js'; -import { getContentTool, handleGetContent } from './tools/get-content.js'; import { getContentMetaTool, handleGetContentMeta, } from './tools/get-content-meta.js'; -import { getListTool, handleGetList } from './tools/get-list.js'; +import { getContentTool, handleGetContent } from './tools/get-content.js'; import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; +import { getListTool, handleGetList } from './tools/get-list.js'; import { getMediaTool, handleGetMedia } from './tools/get-media.js'; import { getMemberTool, handleGetMember } from './tools/get-member.js'; -import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; import { handlePatchContentCreatedBy, patchContentCreatedByTool, @@ -47,6 +46,7 @@ import { handlePatchContentStatus, patchContentStatusTool, } from './tools/patch-content-status.js'; +import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; import { handleUpdateContentDraft, updateContentDraftTool, From 1b48547852ca9a8c351bbce61fb1c940c96bb842 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Mon, 8 Dec 2025 20:48:49 +0900 Subject: [PATCH 09/10] Enhance microCMS functionality with new service management tool and documentation updates - Introduced `getServicesTool` to retrieve configured microCMS services and their APIs, facilitating service discovery. - Updated `README.md` to reflect changes in service listing methods and added details on using the new tool. - Refactored import statements in `server.ts` for improved organization and included the new service tool. - Cleaned up code comments and descriptions across various tools for better clarity and consistency. --- README.md | 3 +- scripts/test-service-info.ts | 130 ++++++++++++++++++++++++++ src/client.ts | 4 +- src/server.ts | 25 +++-- src/tools/create-content-draft.ts | 3 +- src/tools/create-content-published.ts | 3 +- src/tools/get-apis-list.ts | 2 +- src/tools/get-services.ts | 94 +++++++++++++++++++ src/tools/update-content-draft.ts | 3 +- src/tools/update-content-published.ts | 3 +- src/tools/upload-media.ts | 8 +- 11 files changed, 254 insertions(+), 24 deletions(-) create mode 100644 scripts/test-service-info.ts create mode 100644 src/tools/get-services.ts diff --git a/README.md b/README.md index 4839184..0a0ab19 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,8 @@ Claude Desktopに導入する場合、mcpbファイルを使って簡単にイ - ツール名は単一サービスモードと同じ `microcms_*` 形式です - 各ツール呼び出し時に `serviceId` を指定してサービスを選択します -- 設定済みサービスの一覧は `microcms://services` リソースで確認できます +- 設定済みサービスの一覧は `microcms_get_services` ツールで確認できます +- MCPリソース `microcms://services` からも同様の情報を取得できます #### 後方互換性 diff --git a/scripts/test-service-info.ts b/scripts/test-service-info.ts new file mode 100644 index 0000000..243fa56 --- /dev/null +++ b/scripts/test-service-info.ts @@ -0,0 +1,130 @@ +/** + * Test script to debug getServiceInfo function + * + * Usage: + * # With .env file (recommended) + * pnpm run debug:service-info + * + * # With arguments (single service) + * npx tsx scripts/test-service-info.ts + * + * # With environment variables + * MICROCMS_SERVICE_ID=xxx MICROCMS_API_KEY=yyy npx tsx scripts/test-service-info.ts + * MICROCMS_SERVICES='[{"id":"xxx","apiKey":"yyy"}]' npx tsx scripts/test-service-info.ts + */ + +interface ServiceConfig { + id: string; + apiKey: string; +} + +async function fetchServiceInfo(serviceId: string, apiKey: string) { + const url = `https://${serviceId}.microcms-management.io/api/v1/service`; + console.log(`\n📡 Fetching: ${url}`); + + const response = await fetch(url, { + method: 'GET', + headers: { + 'X-MICROCMS-API-KEY': apiKey, + }, + }); + + console.log(` Status: ${response.status} ${response.statusText}`); + + if (!response.ok) { + const errorText = await response.text(); + console.error(` ❌ Error: ${errorText}`); + return null; + } + + const data = await response.json(); + return data; +} + +async function testSingleService(serviceId: string, apiKey: string) { + console.log(`\n🔍 Testing service: ${serviceId}`); + console.log('─'.repeat(50)); + + const data = await fetchServiceInfo(serviceId, apiKey); + + if (data) { + console.log('\n📋 Response JSON:'); + console.log(JSON.stringify(data, null, 2)); + console.log('\n✅ Field check:'); + console.log(` serviceName: "${data.serviceName}"`); + console.log(` serviceId: "${data.serviceId}"`); + console.log(` All keys: ${Object.keys(data).join(', ')}`); + } + + return data; +} + +async function testMultiService(services: ServiceConfig[]) { + console.log(`\n🔧 Multi-service mode detected: ${services.length} service(s)`); + + const results: Record = {}; + + for (const service of services) { + const data = await testSingleService(service.id, service.apiKey); + results[service.id] = data; + } + + console.log('\n' + '═'.repeat(50)); + console.log('📊 Summary:'); + console.log('═'.repeat(50)); + + for (const [serviceId, data] of Object.entries(results)) { + if (data) { + console.log(` ${serviceId} → serviceName: "${data.serviceName}"`); + } else { + console.log(` ${serviceId} → ❌ Failed to fetch`); + } + } +} + +async function main() { + console.log('🚀 microCMS Service Info Debug Tool'); + console.log('═'.repeat(50)); + + // Check for command line arguments first + const serviceIdArg = process.argv[2]; + const apiKeyArg = process.argv[3]; + + if (serviceIdArg && apiKeyArg) { + await testSingleService(serviceIdArg, apiKeyArg); + return; + } + + // Check for MICROCMS_SERVICES (multi-service mode) + const servicesJson = process.env.MICROCMS_SERVICES; + if (servicesJson) { + try { + const services: ServiceConfig[] = JSON.parse(servicesJson); + if (Array.isArray(services) && services.length > 0) { + await testMultiService(services); + return; + } + } catch (error) { + console.error('❌ Failed to parse MICROCMS_SERVICES:', error); + } + } + + // Check for single service env vars + const serviceId = process.env.MICROCMS_SERVICE_ID; + const apiKey = process.env.MICROCMS_API_KEY; + + if (serviceId && apiKey) { + await testSingleService(serviceId, apiKey); + return; + } + + // No configuration found + console.error('\n❌ No configuration found!'); + console.error('\nUsage:'); + console.error(' 1. Set MICROCMS_SERVICES in .env file and run: pnpm run debug:service-info'); + console.error(' 2. Set MICROCMS_SERVICE_ID and MICROCMS_API_KEY in .env file'); + console.error(' 3. Run with arguments: npx tsx scripts/test-service-info.ts '); + process.exit(1); +} + +main().catch(console.error); diff --git a/src/client.ts b/src/client.ts index 877a5ba..b9b725e 100644 --- a/src/client.ts +++ b/src/client.ts @@ -202,7 +202,7 @@ export const microCMSManagementClient = { } ) => { // SDK types don't fully match API capabilities, type assertion required - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // biome-ignore lint/suspicious/noExplicitAny: SDK type limitation return getDefaultClients().managementClient.uploadMedia(params as any); }, }; @@ -590,6 +590,6 @@ export async function uploadMedia( ? getClientsForService(serviceId) : getDefaultClients(); // SDK types don't fully match API capabilities, type assertion required - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // biome-ignore lint/suspicious/noExplicitAny: SDK type limitation return await clients.managementClient.uploadMedia(params as any); } diff --git a/src/server.ts b/src/server.ts index 8761bed..4d8d710 100644 --- a/src/server.ts +++ b/src/server.ts @@ -29,15 +29,17 @@ import { import { deleteMediaTool, handleDeleteMedia } from './tools/delete-media.js'; import { getApiInfoTool, handleGetApiInfo } from './tools/get-api-info.js'; import { getApiListTool, handleGetApiList } from './tools/get-apis-list.js'; +import { getContentTool, handleGetContent } from './tools/get-content.js'; import { getContentMetaTool, handleGetContentMeta, } from './tools/get-content-meta.js'; -import { getContentTool, handleGetContent } from './tools/get-content.js'; -import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; import { getListTool, handleGetList } from './tools/get-list.js'; +import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; import { getMediaTool, handleGetMedia } from './tools/get-media.js'; import { getMemberTool, handleGetMember } from './tools/get-member.js'; +import { getServicesTool, handleGetServices } from './tools/get-services.js'; +import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; import { handlePatchContentCreatedBy, patchContentCreatedByTool, @@ -46,7 +48,6 @@ import { handlePatchContentStatus, patchContentStatusTool, } from './tools/patch-content-status.js'; -import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; import { handleUpdateContentDraft, updateContentDraftTool, @@ -58,8 +59,9 @@ import { import { handleUploadMedia, uploadMediaTool } from './tools/upload-media.js'; import type { ToolParameters } from './types.js'; -// Fixed tool list (18 tools) +// Fixed tool list (19 tools) const tools = [ + getServicesTool, getListTool, getListMetaTool, getContentTool, @@ -80,12 +82,17 @@ const tools = [ getMemberTool, ]; -// Tool handlers map -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// Tool handlers map - using 'any' for generic handler type that accepts multiple tool parameter types const toolHandlers: Record< string, - (params: any, serviceId?: string) => Promise + ( + // biome-ignore lint/suspicious/noExplicitAny: Generic handler type for multiple tools + params: any, + serviceId?: string + // biome-ignore lint/suspicious/noExplicitAny: Generic return type for multiple tools + ) => Promise > = { + microcms_get_services: handleGetServices, microcms_get_list: handleGetList, microcms_get_list_meta: handleGetListMeta, microcms_get_content: handleGetContent, @@ -160,11 +167,13 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => { apiEndpoint?: string; endpoint?: string; apiType?: string[]; + type?: string; }) => ({ name: api.apiName || api.name || '', endpoint: api.apiEndpoint || api.endpoint || '', type: - Array.isArray(api.apiType) && api.apiType.includes('LIST') + api.type === 'list' || + (Array.isArray(api.apiType) && api.apiType.includes('LIST')) ? 'list' : 'object', }) diff --git a/src/tools/create-content-draft.ts b/src/tools/create-content-draft.ts index 8fb09ab..6c5daf4 100644 --- a/src/tools/create-content-draft.ts +++ b/src/tools/create-content-draft.ts @@ -20,8 +20,7 @@ export const createContentDraftTool: Tool = { }, content: { type: 'object', - description: - `Content data to create (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: `Content data to create (JSON object). ${FIELD_FORMATS_DESCRIPTION}`, }, contentId: { type: 'string', diff --git a/src/tools/create-content-published.ts b/src/tools/create-content-published.ts index b6c7be3..4cb9e40 100644 --- a/src/tools/create-content-published.ts +++ b/src/tools/create-content-published.ts @@ -20,8 +20,7 @@ export const createContentPublishedTool: Tool = { }, content: { type: 'object', - description: - `Content data to create (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: `Content data to create (JSON object). ${FIELD_FORMATS_DESCRIPTION}`, }, contentId: { type: 'string', diff --git a/src/tools/get-apis-list.ts b/src/tools/get-apis-list.ts index 683bcd2..4426643 100644 --- a/src/tools/get-apis-list.ts +++ b/src/tools/get-apis-list.ts @@ -20,7 +20,7 @@ export const getApiListTool: Tool = { }; export async function handleGetApiList( - params: ToolParameters, + _params: ToolParameters, serviceId?: string ) { return await getApiList(serviceId); diff --git a/src/tools/get-services.ts b/src/tools/get-services.ts new file mode 100644 index 0000000..2506ea5 --- /dev/null +++ b/src/tools/get-services.ts @@ -0,0 +1,94 @@ +import type { Tool } from '@modelcontextprotocol/sdk/types.js'; +import { getApiList, getAppConfig } from '../client.js'; + +export const getServicesTool: Tool = { + name: 'microcms_get_services', + description: + 'Get list of configured microCMS services and their available APIs (endpoints). Use this tool first to discover which services are available and find the correct serviceId for other tools. In multi-service mode, serviceId is required for all other tools.', + inputSchema: { + type: 'object', + properties: {}, + required: [], + }, +}; + +interface ServiceInfo { + id: string; + apis: { name: string; endpoint: string; type: string }[]; +} + +interface ServicesResponse { + mode: 'single' | 'multi'; + description: string; + services: ServiceInfo[]; +} + +/** + * Fetch API list for a service + */ +async function fetchApisForService( + serviceId: string +): Promise<{ name: string; endpoint: string; type: string }[]> { + try { + const result = await getApiList(serviceId); + if (result && Array.isArray(result.apis)) { + return result.apis.map( + (api: { + apiName?: string; + name?: string; + apiEndpoint?: string; + endpoint?: string; + apiType?: string[]; + type?: string; + }) => ({ + name: api.apiName || api.name || '', + endpoint: api.apiEndpoint || api.endpoint || '', + type: + api.type === 'list' || + (Array.isArray(api.apiType) && api.apiType.includes('LIST')) + ? 'list' + : 'object', + }) + ); + } + return []; + } catch { + return []; + } +} + +export async function handleGetServices(): Promise { + const config = getAppConfig(); + + if (config.mode === 'single') { + const apis = await fetchApisForService(config.serviceDomain); + return { + mode: 'single', + description: 'Single service mode - serviceId parameter is optional', + services: [ + { + id: config.serviceDomain, + apis, + }, + ], + }; + } + + // Multi service mode - fetch APIs for all services in parallel + const servicesWithApis = await Promise.all( + config.services.map(async (s) => { + const apis = await fetchApisForService(s.id); + return { + id: s.id, + apis, + }; + }) + ); + + return { + mode: 'multi', + description: + 'Multi service mode - serviceId parameter is required for all tools. Use the serviceId that contains the endpoint you need.', + services: servicesWithApis, + }; +} diff --git a/src/tools/update-content-draft.ts b/src/tools/update-content-draft.ts index 3f77e3f..a4677e1 100644 --- a/src/tools/update-content-draft.ts +++ b/src/tools/update-content-draft.ts @@ -24,8 +24,7 @@ export const updateContentDraftTool: Tool = { }, content: { type: 'object', - description: - `Content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: `Content data to update (JSON object). ${FIELD_FORMATS_DESCRIPTION}`, }, }, required: ['endpoint', 'contentId', 'content'], diff --git a/src/tools/update-content-published.ts b/src/tools/update-content-published.ts index 43696d2..703493d 100644 --- a/src/tools/update-content-published.ts +++ b/src/tools/update-content-published.ts @@ -24,8 +24,7 @@ export const updateContentPublishedTool: Tool = { }, content: { type: 'object', - description: - `Content data to update (JSON object). ` + FIELD_FORMATS_DESCRIPTION, + description: `Content data to update (JSON object). ${FIELD_FORMATS_DESCRIPTION}`, }, }, required: ['endpoint', 'contentId', 'content'], diff --git a/src/tools/upload-media.ts b/src/tools/upload-media.ts index e5cd091..b669c88 100644 --- a/src/tools/upload-media.ts +++ b/src/tools/upload-media.ts @@ -48,10 +48,10 @@ export async function handleUploadMedia( // Method 1: Upload from external URL // Note: SDK types may not include 'url' property, but API supports it if (externalUrl) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result = await clients.managementClient.uploadMedia({ - url: externalUrl, - } as any); + const result = await clients.managementClient.uploadMedia( + // biome-ignore lint/suspicious/noExplicitAny: SDK type limitation + { url: externalUrl } as any + ); return result; } From e3f021f106840efdfb200a8b48fba686ec251609 Mon Sep 17 00:00:00 2001 From: Hiroshi MORISHIGE Date: Mon, 8 Dec 2025 20:48:58 +0900 Subject: [PATCH 10/10] Refactor import statements in client.ts and server.ts for improved organization - Standardized import formatting in client.ts and server.ts for better readability and consistency. - Ensured all necessary tools are correctly imported, enhancing overall code structure. --- src/client.ts | 28 ++++++++++++++-------------- src/server.ts | 6 +++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/client.ts b/src/client.ts index b9b725e..7cbce55 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,21 +1,21 @@ import { - createClient, - createManagementClient, - type MicroCMSQueries, + createClient, + createManagementClient, + type MicroCMSQueries, } from 'microcms-js-sdk'; import { parseConfig } from './config.js'; import type { - ApiInfo, - ApiListResponse, - AppConfig, - ContentMeta, - ContentMetaListResponse, - MediaListResponse, - MediaUploadResponse, - MemberInfo, - MicroCMSContent, - MicroCMSListResponse, - ServiceConfig, + ApiInfo, + ApiListResponse, + AppConfig, + ContentMeta, + ContentMetaListResponse, + MediaListResponse, + MediaUploadResponse, + MemberInfo, + MicroCMSContent, + MicroCMSListResponse, + ServiceConfig, } from './types.js'; // Use ReturnType to get actual client types from factory functions diff --git a/src/server.ts b/src/server.ts index 4d8d710..d51e66b 100644 --- a/src/server.ts +++ b/src/server.ts @@ -29,17 +29,16 @@ import { import { deleteMediaTool, handleDeleteMedia } from './tools/delete-media.js'; import { getApiInfoTool, handleGetApiInfo } from './tools/get-api-info.js'; import { getApiListTool, handleGetApiList } from './tools/get-apis-list.js'; -import { getContentTool, handleGetContent } from './tools/get-content.js'; import { getContentMetaTool, handleGetContentMeta, } from './tools/get-content-meta.js'; -import { getListTool, handleGetList } from './tools/get-list.js'; +import { getContentTool, handleGetContent } from './tools/get-content.js'; import { getListMetaTool, handleGetListMeta } from './tools/get-list-meta.js'; +import { getListTool, handleGetList } from './tools/get-list.js'; import { getMediaTool, handleGetMedia } from './tools/get-media.js'; import { getMemberTool, handleGetMember } from './tools/get-member.js'; import { getServicesTool, handleGetServices } from './tools/get-services.js'; -import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; import { handlePatchContentCreatedBy, patchContentCreatedByTool, @@ -48,6 +47,7 @@ import { handlePatchContentStatus, patchContentStatusTool, } from './tools/patch-content-status.js'; +import { handlePatchContent, patchContentTool } from './tools/patch-content.js'; import { handleUpdateContentDraft, updateContentDraftTool,