├── .gitignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── COPYING ├── README.md ├── eslint.config.mjs ├── package-lock.json ├── package.json ├── src └── index.mts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 27 | node_modules 28 | 29 | lib 30 | test-dist 31 | docs 32 | 33 | # WebStorm 34 | .idea/ 35 | 36 | dist/ 37 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "auto" 3 | } 4 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Code of Conduct 2 | 3 | As contributors and maintainers of this project, and in the interest of 4 | fostering an open and welcoming community, we pledge to respect all people who 5 | contribute through reporting issues, posting feature requests, updating 6 | documentation, submitting pull requests or patches, and other activities. 7 | 8 | We are committed to making participation in this project a harassment-free 9 | experience for everyone, regardless of level of experience, gender, gender 10 | identity and expression, sexual orientation, disability, personal appearance, 11 | body size, race, ethnicity, age, religion, or nationality. 12 | 13 | Examples of unacceptable behavior by participants include: 14 | 15 | - The use of sexualized language or imagery 16 | - Personal attacks 17 | - Trolling or insulting/derogatory comments 18 | - Public or private harassment 19 | - Publishing other's private information, such as physical or electronic 20 | addresses, without explicit permission 21 | - Other unethical or unprofessional conduct 22 | 23 | Project maintainers have the right and responsibility to remove, edit, or 24 | reject comments, commits, code, wiki edits, issues, and other contributions 25 | that are not aligned to this Code of Conduct, or to ban temporarily or 26 | permanently any contributor for other behaviors that they deem inappropriate, 27 | threatening, offensive, or harmful. 28 | 29 | By adopting this Code of Conduct, project maintainers commit themselves to 30 | fairly and consistently applying these principles to every aspect of managing 31 | this project. Project maintainers who do not follow or enforce the Code of 32 | Conduct may be permanently removed from the project team. 33 | 34 | This Code of Conduct applies both within project spaces and in public spaces 35 | when an individual is representing the project or its community. 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 38 | reported by contacting a project maintainer at anais@anaisbetts.org. All 39 | complaints will be reviewed and investigated and will result in a response that 40 | is deemed necessary and appropriate to the circumstances. Maintainers are 41 | obligated to maintain confidentiality with regard to the reporter of an 42 | incident. 43 | 44 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 45 | version 1.3.0, available at 46 | [http://contributor-covenant.org/version/1/3/0/][version] 47 | 48 | [homepage]: http://contributor-covenant.org 49 | [version]: http://contributor-covenant.org/version/1/3/0/ 50 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | Copyright (c) 2024 Anaïs Betts 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mcp-installer - A MCP Server to install MCP Servers 2 | 3 | This server is a server that installs other MCP servers for you. Install it, and you can ask Claude to install MCP servers hosted in npm or PyPi for you. Requires `npx` and `uv` to be installed for node and Python servers respectively. 4 | 5 | ![image](https://github.com/user-attachments/assets/d082e614-b4bc-485c-a7c5-f80680348793) 6 | 7 | ### How to install: 8 | 9 | Put this into your `claude_desktop_config.json` (either at `~/Library/Application Support/Claude` on macOS or `C:\Users\NAME\AppData\Roaming\Claude` on Windows): 10 | 11 | ```json 12 | "mcpServers": { 13 | "mcp-installer": { 14 | "command": "npx", 15 | "args": [ 16 | "@anaisbetts/mcp-installer" 17 | ] 18 | } 19 | } 20 | ``` 21 | 22 | ### Example prompts 23 | 24 | > Hey Claude, install the MCP server named mcp-server-fetch 25 | 26 | > Hey Claude, install the @modelcontextprotocol/server-filesystem package as an MCP server. Use ['/Users/anibetts/Desktop'] for the arguments 27 | 28 | > Hi Claude, please install the MCP server at /Users/anibetts/code/mcp-youtube, I'm too lazy to do it myself. 29 | 30 | > Install the server @modelcontextprotocol/server-github. Set the environment variable GITHUB_PERSONAL_ACCESS_TOKEN to '1234567890' 31 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import typescriptEslint from "@typescript-eslint/eslint-plugin"; 2 | import prettier from "eslint-plugin-prettier"; 3 | import tsParser from "@typescript-eslint/parser"; 4 | import path from "node:path"; 5 | import { fileURLToPath } from "node:url"; 6 | import js from "@eslint/js"; 7 | import { FlatCompat } from "@eslint/eslintrc"; 8 | 9 | const __filename = fileURLToPath(import.meta.url); 10 | const __dirname = path.dirname(__filename); 11 | const compat = new FlatCompat({ 12 | baseDirectory: __dirname, 13 | recommendedConfig: js.configs.recommended, 14 | allConfig: js.configs.all, 15 | }); 16 | 17 | export default [ 18 | ...compat.extends( 19 | "eslint:recommended", 20 | "prettier", 21 | "plugin:@typescript-eslint/eslint-recommended", 22 | "plugin:@typescript-eslint/recommended", 23 | ), 24 | { 25 | files: ["./src/*.{ts,tsx}", "./test/*.{ts,tsx}"], 26 | plugins: { 27 | "@typescript-eslint": typescriptEslint, 28 | prettier, 29 | }, 30 | 31 | languageOptions: { 32 | globals: {}, 33 | parser: tsParser, 34 | ecmaVersion: 5, 35 | sourceType: "script", 36 | 37 | parserOptions: { 38 | project: "./tsconfig.json", 39 | }, 40 | }, 41 | 42 | rules: { 43 | "prettier/prettier": "warn", 44 | 45 | "spaced-comment": [ 46 | "error", 47 | "always", 48 | { 49 | markers: ["/"], 50 | }, 51 | ], 52 | 53 | "no-fallthrough": "error", 54 | "@typescript-eslint/ban-ts-comment": "warn", 55 | 56 | "@typescript-eslint/consistent-type-imports": [ 57 | "error", 58 | { 59 | prefer: "type-imports", 60 | }, 61 | ], 62 | 63 | "@typescript-eslint/no-inferrable-types": [ 64 | "error", 65 | { 66 | ignoreParameters: false, 67 | ignoreProperties: false, 68 | }, 69 | ], 70 | 71 | "@typescript-eslint/no-non-null-assertion": "off", 72 | "@typescript-eslint/no-floating-promises": "error", 73 | 74 | "@typescript-eslint/no-unused-vars": [ 75 | "warn", 76 | { 77 | args: "after-used", 78 | argsIgnorePattern: "^_", 79 | varsIgnorePattern: "^_", 80 | ignoreRestSiblings: true, 81 | }, 82 | ], 83 | 84 | "@typescript-eslint/no-empty-function": ["error"], 85 | "@typescript-eslint/restrict-template-expressions": "off", 86 | }, 87 | }, 88 | ]; 89 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-installer", 3 | "version": "0.5.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "mcp-installer", 9 | "version": "0.5.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.0.1", 13 | "rimraf": "^6.0.1", 14 | "spawn-rx": "^4.0.0" 15 | }, 16 | "bin": { 17 | "mcp-youtube": "lib/index.mjs" 18 | }, 19 | "devDependencies": { 20 | "shx": "^0.3.4", 21 | "ts-node": "^10.9.2", 22 | "typescript": "^5.6.3" 23 | } 24 | }, 25 | "node_modules/@cspotcode/source-map-support": { 26 | "version": "0.8.1", 27 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 28 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 29 | "dev": true, 30 | "license": "MIT", 31 | "dependencies": { 32 | "@jridgewell/trace-mapping": "0.3.9" 33 | }, 34 | "engines": { 35 | "node": ">=12" 36 | } 37 | }, 38 | "node_modules/@isaacs/cliui": { 39 | "version": "8.0.2", 40 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 41 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 42 | "license": "ISC", 43 | "dependencies": { 44 | "string-width": "^5.1.2", 45 | "string-width-cjs": "npm:string-width@^4.2.0", 46 | "strip-ansi": "^7.0.1", 47 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 48 | "wrap-ansi": "^8.1.0", 49 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 50 | }, 51 | "engines": { 52 | "node": ">=12" 53 | } 54 | }, 55 | "node_modules/@jridgewell/resolve-uri": { 56 | "version": "3.1.2", 57 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 58 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 59 | "dev": true, 60 | "license": "MIT", 61 | "engines": { 62 | "node": ">=6.0.0" 63 | } 64 | }, 65 | "node_modules/@jridgewell/sourcemap-codec": { 66 | "version": "1.5.0", 67 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 68 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 69 | "dev": true, 70 | "license": "MIT" 71 | }, 72 | "node_modules/@jridgewell/trace-mapping": { 73 | "version": "0.3.9", 74 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 75 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 76 | "dev": true, 77 | "license": "MIT", 78 | "dependencies": { 79 | "@jridgewell/resolve-uri": "^3.0.3", 80 | "@jridgewell/sourcemap-codec": "^1.4.10" 81 | } 82 | }, 83 | "node_modules/@modelcontextprotocol/sdk": { 84 | "version": "1.0.1", 85 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.0.1.tgz", 86 | "integrity": "sha512-slLdFaxQJ9AlRg+hw28iiTtGvShAOgOKXcD0F91nUcRYiOMuS9ZBYjcdNZRXW9G5JQ511GRTdUy1zQVZDpJ+4w==", 87 | "license": "MIT", 88 | "dependencies": { 89 | "content-type": "^1.0.5", 90 | "raw-body": "^3.0.0", 91 | "zod": "^3.23.8" 92 | } 93 | }, 94 | "node_modules/@tsconfig/node10": { 95 | "version": "1.0.11", 96 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 97 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 98 | "dev": true, 99 | "license": "MIT" 100 | }, 101 | "node_modules/@tsconfig/node12": { 102 | "version": "1.0.11", 103 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 104 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 105 | "dev": true, 106 | "license": "MIT" 107 | }, 108 | "node_modules/@tsconfig/node14": { 109 | "version": "1.0.3", 110 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 111 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 112 | "dev": true, 113 | "license": "MIT" 114 | }, 115 | "node_modules/@tsconfig/node16": { 116 | "version": "1.0.4", 117 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 118 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 119 | "dev": true, 120 | "license": "MIT" 121 | }, 122 | "node_modules/@types/node": { 123 | "version": "22.9.0", 124 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", 125 | "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", 126 | "dev": true, 127 | "license": "MIT", 128 | "peer": true, 129 | "dependencies": { 130 | "undici-types": "~6.19.8" 131 | } 132 | }, 133 | "node_modules/acorn": { 134 | "version": "8.14.0", 135 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 136 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 137 | "dev": true, 138 | "license": "MIT", 139 | "bin": { 140 | "acorn": "bin/acorn" 141 | }, 142 | "engines": { 143 | "node": ">=0.4.0" 144 | } 145 | }, 146 | "node_modules/acorn-walk": { 147 | "version": "8.3.4", 148 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 149 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 150 | "dev": true, 151 | "license": "MIT", 152 | "dependencies": { 153 | "acorn": "^8.11.0" 154 | }, 155 | "engines": { 156 | "node": ">=0.4.0" 157 | } 158 | }, 159 | "node_modules/ansi-regex": { 160 | "version": "6.1.0", 161 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 162 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 163 | "license": "MIT", 164 | "engines": { 165 | "node": ">=12" 166 | }, 167 | "funding": { 168 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 169 | } 170 | }, 171 | "node_modules/ansi-styles": { 172 | "version": "6.2.1", 173 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 174 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 175 | "license": "MIT", 176 | "engines": { 177 | "node": ">=12" 178 | }, 179 | "funding": { 180 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 181 | } 182 | }, 183 | "node_modules/arg": { 184 | "version": "4.1.3", 185 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 186 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 187 | "dev": true, 188 | "license": "MIT" 189 | }, 190 | "node_modules/balanced-match": { 191 | "version": "1.0.2", 192 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 193 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 194 | "license": "MIT" 195 | }, 196 | "node_modules/brace-expansion": { 197 | "version": "2.0.1", 198 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 199 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 200 | "license": "MIT", 201 | "dependencies": { 202 | "balanced-match": "^1.0.0" 203 | } 204 | }, 205 | "node_modules/bytes": { 206 | "version": "3.1.2", 207 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 208 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 209 | "license": "MIT", 210 | "engines": { 211 | "node": ">= 0.8" 212 | } 213 | }, 214 | "node_modules/color-convert": { 215 | "version": "2.0.1", 216 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 217 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 218 | "license": "MIT", 219 | "dependencies": { 220 | "color-name": "~1.1.4" 221 | }, 222 | "engines": { 223 | "node": ">=7.0.0" 224 | } 225 | }, 226 | "node_modules/color-name": { 227 | "version": "1.1.4", 228 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 229 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 230 | "license": "MIT" 231 | }, 232 | "node_modules/concat-map": { 233 | "version": "0.0.1", 234 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 235 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 236 | "dev": true, 237 | "license": "MIT" 238 | }, 239 | "node_modules/content-type": { 240 | "version": "1.0.5", 241 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 242 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 243 | "license": "MIT", 244 | "engines": { 245 | "node": ">= 0.6" 246 | } 247 | }, 248 | "node_modules/create-require": { 249 | "version": "1.1.1", 250 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 251 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 252 | "dev": true, 253 | "license": "MIT" 254 | }, 255 | "node_modules/cross-spawn": { 256 | "version": "7.0.5", 257 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", 258 | "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", 259 | "license": "MIT", 260 | "dependencies": { 261 | "path-key": "^3.1.0", 262 | "shebang-command": "^2.0.0", 263 | "which": "^2.0.1" 264 | }, 265 | "engines": { 266 | "node": ">= 8" 267 | } 268 | }, 269 | "node_modules/debug": { 270 | "version": "4.3.7", 271 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 272 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 273 | "license": "MIT", 274 | "dependencies": { 275 | "ms": "^2.1.3" 276 | }, 277 | "engines": { 278 | "node": ">=6.0" 279 | }, 280 | "peerDependenciesMeta": { 281 | "supports-color": { 282 | "optional": true 283 | } 284 | } 285 | }, 286 | "node_modules/depd": { 287 | "version": "2.0.0", 288 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 289 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 290 | "license": "MIT", 291 | "engines": { 292 | "node": ">= 0.8" 293 | } 294 | }, 295 | "node_modules/diff": { 296 | "version": "4.0.2", 297 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 298 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 299 | "dev": true, 300 | "license": "BSD-3-Clause", 301 | "engines": { 302 | "node": ">=0.3.1" 303 | } 304 | }, 305 | "node_modules/eastasianwidth": { 306 | "version": "0.2.0", 307 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 308 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 309 | "license": "MIT" 310 | }, 311 | "node_modules/emoji-regex": { 312 | "version": "9.2.2", 313 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 314 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 315 | "license": "MIT" 316 | }, 317 | "node_modules/foreground-child": { 318 | "version": "3.3.0", 319 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 320 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 321 | "license": "ISC", 322 | "dependencies": { 323 | "cross-spawn": "^7.0.0", 324 | "signal-exit": "^4.0.1" 325 | }, 326 | "engines": { 327 | "node": ">=14" 328 | }, 329 | "funding": { 330 | "url": "https://github.com/sponsors/isaacs" 331 | } 332 | }, 333 | "node_modules/fs.realpath": { 334 | "version": "1.0.0", 335 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 336 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 337 | "dev": true, 338 | "license": "ISC" 339 | }, 340 | "node_modules/function-bind": { 341 | "version": "1.1.2", 342 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 343 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 344 | "dev": true, 345 | "license": "MIT", 346 | "funding": { 347 | "url": "https://github.com/sponsors/ljharb" 348 | } 349 | }, 350 | "node_modules/glob": { 351 | "version": "11.0.0", 352 | "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", 353 | "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", 354 | "license": "ISC", 355 | "dependencies": { 356 | "foreground-child": "^3.1.0", 357 | "jackspeak": "^4.0.1", 358 | "minimatch": "^10.0.0", 359 | "minipass": "^7.1.2", 360 | "package-json-from-dist": "^1.0.0", 361 | "path-scurry": "^2.0.0" 362 | }, 363 | "bin": { 364 | "glob": "dist/esm/bin.mjs" 365 | }, 366 | "engines": { 367 | "node": "20 || >=22" 368 | }, 369 | "funding": { 370 | "url": "https://github.com/sponsors/isaacs" 371 | } 372 | }, 373 | "node_modules/hasown": { 374 | "version": "2.0.2", 375 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 376 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 377 | "dev": true, 378 | "license": "MIT", 379 | "dependencies": { 380 | "function-bind": "^1.1.2" 381 | }, 382 | "engines": { 383 | "node": ">= 0.4" 384 | } 385 | }, 386 | "node_modules/http-errors": { 387 | "version": "2.0.0", 388 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 389 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 390 | "license": "MIT", 391 | "dependencies": { 392 | "depd": "2.0.0", 393 | "inherits": "2.0.4", 394 | "setprototypeof": "1.2.0", 395 | "statuses": "2.0.1", 396 | "toidentifier": "1.0.1" 397 | }, 398 | "engines": { 399 | "node": ">= 0.8" 400 | } 401 | }, 402 | "node_modules/iconv-lite": { 403 | "version": "0.6.3", 404 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 405 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 406 | "license": "MIT", 407 | "dependencies": { 408 | "safer-buffer": ">= 2.1.2 < 3.0.0" 409 | }, 410 | "engines": { 411 | "node": ">=0.10.0" 412 | } 413 | }, 414 | "node_modules/inflight": { 415 | "version": "1.0.6", 416 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 417 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 418 | "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.", 419 | "dev": true, 420 | "license": "ISC", 421 | "dependencies": { 422 | "once": "^1.3.0", 423 | "wrappy": "1" 424 | } 425 | }, 426 | "node_modules/inherits": { 427 | "version": "2.0.4", 428 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 429 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 430 | "license": "ISC" 431 | }, 432 | "node_modules/interpret": { 433 | "version": "1.4.0", 434 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 435 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 436 | "dev": true, 437 | "license": "MIT", 438 | "engines": { 439 | "node": ">= 0.10" 440 | } 441 | }, 442 | "node_modules/is-core-module": { 443 | "version": "2.15.1", 444 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 445 | "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 446 | "dev": true, 447 | "license": "MIT", 448 | "dependencies": { 449 | "hasown": "^2.0.2" 450 | }, 451 | "engines": { 452 | "node": ">= 0.4" 453 | }, 454 | "funding": { 455 | "url": "https://github.com/sponsors/ljharb" 456 | } 457 | }, 458 | "node_modules/is-fullwidth-code-point": { 459 | "version": "3.0.0", 460 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 461 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 462 | "license": "MIT", 463 | "engines": { 464 | "node": ">=8" 465 | } 466 | }, 467 | "node_modules/isexe": { 468 | "version": "2.0.0", 469 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 470 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 471 | "license": "ISC" 472 | }, 473 | "node_modules/jackspeak": { 474 | "version": "4.0.2", 475 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", 476 | "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", 477 | "license": "BlueOak-1.0.0", 478 | "dependencies": { 479 | "@isaacs/cliui": "^8.0.2" 480 | }, 481 | "engines": { 482 | "node": "20 || >=22" 483 | }, 484 | "funding": { 485 | "url": "https://github.com/sponsors/isaacs" 486 | } 487 | }, 488 | "node_modules/lodash.assign": { 489 | "version": "4.2.0", 490 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 491 | "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", 492 | "license": "MIT" 493 | }, 494 | "node_modules/lru-cache": { 495 | "version": "11.0.2", 496 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", 497 | "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", 498 | "license": "ISC", 499 | "engines": { 500 | "node": "20 || >=22" 501 | } 502 | }, 503 | "node_modules/make-error": { 504 | "version": "1.3.6", 505 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 506 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 507 | "dev": true, 508 | "license": "ISC" 509 | }, 510 | "node_modules/minimatch": { 511 | "version": "10.0.1", 512 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", 513 | "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", 514 | "license": "ISC", 515 | "dependencies": { 516 | "brace-expansion": "^2.0.1" 517 | }, 518 | "engines": { 519 | "node": "20 || >=22" 520 | }, 521 | "funding": { 522 | "url": "https://github.com/sponsors/isaacs" 523 | } 524 | }, 525 | "node_modules/minimist": { 526 | "version": "1.2.8", 527 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 528 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 529 | "dev": true, 530 | "license": "MIT", 531 | "funding": { 532 | "url": "https://github.com/sponsors/ljharb" 533 | } 534 | }, 535 | "node_modules/minipass": { 536 | "version": "7.1.2", 537 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 538 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 539 | "license": "ISC", 540 | "engines": { 541 | "node": ">=16 || 14 >=14.17" 542 | } 543 | }, 544 | "node_modules/ms": { 545 | "version": "2.1.3", 546 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 547 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 548 | "license": "MIT" 549 | }, 550 | "node_modules/once": { 551 | "version": "1.4.0", 552 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 553 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 554 | "dev": true, 555 | "license": "ISC", 556 | "dependencies": { 557 | "wrappy": "1" 558 | } 559 | }, 560 | "node_modules/package-json-from-dist": { 561 | "version": "1.0.1", 562 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 563 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 564 | "license": "BlueOak-1.0.0" 565 | }, 566 | "node_modules/path-is-absolute": { 567 | "version": "1.0.1", 568 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 569 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 570 | "dev": true, 571 | "license": "MIT", 572 | "engines": { 573 | "node": ">=0.10.0" 574 | } 575 | }, 576 | "node_modules/path-key": { 577 | "version": "3.1.1", 578 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 579 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 580 | "license": "MIT", 581 | "engines": { 582 | "node": ">=8" 583 | } 584 | }, 585 | "node_modules/path-parse": { 586 | "version": "1.0.7", 587 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 588 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 589 | "dev": true, 590 | "license": "MIT" 591 | }, 592 | "node_modules/path-scurry": { 593 | "version": "2.0.0", 594 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", 595 | "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", 596 | "license": "BlueOak-1.0.0", 597 | "dependencies": { 598 | "lru-cache": "^11.0.0", 599 | "minipass": "^7.1.2" 600 | }, 601 | "engines": { 602 | "node": "20 || >=22" 603 | }, 604 | "funding": { 605 | "url": "https://github.com/sponsors/isaacs" 606 | } 607 | }, 608 | "node_modules/raw-body": { 609 | "version": "3.0.0", 610 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 611 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 612 | "license": "MIT", 613 | "dependencies": { 614 | "bytes": "3.1.2", 615 | "http-errors": "2.0.0", 616 | "iconv-lite": "0.6.3", 617 | "unpipe": "1.0.0" 618 | }, 619 | "engines": { 620 | "node": ">= 0.8" 621 | } 622 | }, 623 | "node_modules/rechoir": { 624 | "version": "0.6.2", 625 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 626 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 627 | "dev": true, 628 | "dependencies": { 629 | "resolve": "^1.1.6" 630 | }, 631 | "engines": { 632 | "node": ">= 0.10" 633 | } 634 | }, 635 | "node_modules/resolve": { 636 | "version": "1.22.8", 637 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 638 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 639 | "dev": true, 640 | "license": "MIT", 641 | "dependencies": { 642 | "is-core-module": "^2.13.0", 643 | "path-parse": "^1.0.7", 644 | "supports-preserve-symlinks-flag": "^1.0.0" 645 | }, 646 | "bin": { 647 | "resolve": "bin/resolve" 648 | }, 649 | "funding": { 650 | "url": "https://github.com/sponsors/ljharb" 651 | } 652 | }, 653 | "node_modules/rimraf": { 654 | "version": "6.0.1", 655 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", 656 | "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", 657 | "license": "ISC", 658 | "dependencies": { 659 | "glob": "^11.0.0", 660 | "package-json-from-dist": "^1.0.0" 661 | }, 662 | "bin": { 663 | "rimraf": "dist/esm/bin.mjs" 664 | }, 665 | "engines": { 666 | "node": "20 || >=22" 667 | }, 668 | "funding": { 669 | "url": "https://github.com/sponsors/isaacs" 670 | } 671 | }, 672 | "node_modules/rxjs": { 673 | "version": "7.8.1", 674 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", 675 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", 676 | "license": "Apache-2.0", 677 | "dependencies": { 678 | "tslib": "^2.1.0" 679 | } 680 | }, 681 | "node_modules/safer-buffer": { 682 | "version": "2.1.2", 683 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 684 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 685 | "license": "MIT" 686 | }, 687 | "node_modules/setprototypeof": { 688 | "version": "1.2.0", 689 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 690 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 691 | "license": "ISC" 692 | }, 693 | "node_modules/shebang-command": { 694 | "version": "2.0.0", 695 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 696 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 697 | "license": "MIT", 698 | "dependencies": { 699 | "shebang-regex": "^3.0.0" 700 | }, 701 | "engines": { 702 | "node": ">=8" 703 | } 704 | }, 705 | "node_modules/shebang-regex": { 706 | "version": "3.0.0", 707 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 708 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 709 | "license": "MIT", 710 | "engines": { 711 | "node": ">=8" 712 | } 713 | }, 714 | "node_modules/shelljs": { 715 | "version": "0.8.5", 716 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 717 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 718 | "dev": true, 719 | "license": "BSD-3-Clause", 720 | "dependencies": { 721 | "glob": "^7.0.0", 722 | "interpret": "^1.0.0", 723 | "rechoir": "^0.6.2" 724 | }, 725 | "bin": { 726 | "shjs": "bin/shjs" 727 | }, 728 | "engines": { 729 | "node": ">=4" 730 | } 731 | }, 732 | "node_modules/shelljs/node_modules/brace-expansion": { 733 | "version": "1.1.11", 734 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 735 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 736 | "dev": true, 737 | "license": "MIT", 738 | "dependencies": { 739 | "balanced-match": "^1.0.0", 740 | "concat-map": "0.0.1" 741 | } 742 | }, 743 | "node_modules/shelljs/node_modules/glob": { 744 | "version": "7.2.3", 745 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 746 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 747 | "deprecated": "Glob versions prior to v9 are no longer supported", 748 | "dev": true, 749 | "license": "ISC", 750 | "dependencies": { 751 | "fs.realpath": "^1.0.0", 752 | "inflight": "^1.0.4", 753 | "inherits": "2", 754 | "minimatch": "^3.1.1", 755 | "once": "^1.3.0", 756 | "path-is-absolute": "^1.0.0" 757 | }, 758 | "engines": { 759 | "node": "*" 760 | }, 761 | "funding": { 762 | "url": "https://github.com/sponsors/isaacs" 763 | } 764 | }, 765 | "node_modules/shelljs/node_modules/minimatch": { 766 | "version": "3.1.2", 767 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 768 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 769 | "dev": true, 770 | "license": "ISC", 771 | "dependencies": { 772 | "brace-expansion": "^1.1.7" 773 | }, 774 | "engines": { 775 | "node": "*" 776 | } 777 | }, 778 | "node_modules/shx": { 779 | "version": "0.3.4", 780 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", 781 | "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", 782 | "dev": true, 783 | "license": "MIT", 784 | "dependencies": { 785 | "minimist": "^1.2.3", 786 | "shelljs": "^0.8.5" 787 | }, 788 | "bin": { 789 | "shx": "lib/cli.js" 790 | }, 791 | "engines": { 792 | "node": ">=6" 793 | } 794 | }, 795 | "node_modules/signal-exit": { 796 | "version": "4.1.0", 797 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 798 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 799 | "license": "ISC", 800 | "engines": { 801 | "node": ">=14" 802 | }, 803 | "funding": { 804 | "url": "https://github.com/sponsors/isaacs" 805 | } 806 | }, 807 | "node_modules/spawn-rx": { 808 | "version": "4.0.0", 809 | "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-4.0.0.tgz", 810 | "integrity": "sha512-N4cXZu2xWaIq39IcwcibBhhtArRt43/P3nHI5c1GVmlqbtN4oM6VuumdcZYs3TsH4Z17dsTRpqJls3Y8Foy26w==", 811 | "license": "MIT", 812 | "dependencies": { 813 | "debug": "^4.3.7", 814 | "lodash.assign": "^4.2.0", 815 | "rxjs": "^7.8.1" 816 | } 817 | }, 818 | "node_modules/statuses": { 819 | "version": "2.0.1", 820 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 821 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 822 | "license": "MIT", 823 | "engines": { 824 | "node": ">= 0.8" 825 | } 826 | }, 827 | "node_modules/string-width": { 828 | "version": "5.1.2", 829 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 830 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 831 | "license": "MIT", 832 | "dependencies": { 833 | "eastasianwidth": "^0.2.0", 834 | "emoji-regex": "^9.2.2", 835 | "strip-ansi": "^7.0.1" 836 | }, 837 | "engines": { 838 | "node": ">=12" 839 | }, 840 | "funding": { 841 | "url": "https://github.com/sponsors/sindresorhus" 842 | } 843 | }, 844 | "node_modules/string-width-cjs": { 845 | "name": "string-width", 846 | "version": "4.2.3", 847 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 848 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 849 | "license": "MIT", 850 | "dependencies": { 851 | "emoji-regex": "^8.0.0", 852 | "is-fullwidth-code-point": "^3.0.0", 853 | "strip-ansi": "^6.0.1" 854 | }, 855 | "engines": { 856 | "node": ">=8" 857 | } 858 | }, 859 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 860 | "version": "5.0.1", 861 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 862 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 863 | "license": "MIT", 864 | "engines": { 865 | "node": ">=8" 866 | } 867 | }, 868 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 869 | "version": "8.0.0", 870 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 871 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 872 | "license": "MIT" 873 | }, 874 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 875 | "version": "6.0.1", 876 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 877 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 878 | "license": "MIT", 879 | "dependencies": { 880 | "ansi-regex": "^5.0.1" 881 | }, 882 | "engines": { 883 | "node": ">=8" 884 | } 885 | }, 886 | "node_modules/strip-ansi": { 887 | "version": "7.1.0", 888 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 889 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 890 | "license": "MIT", 891 | "dependencies": { 892 | "ansi-regex": "^6.0.1" 893 | }, 894 | "engines": { 895 | "node": ">=12" 896 | }, 897 | "funding": { 898 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 899 | } 900 | }, 901 | "node_modules/strip-ansi-cjs": { 902 | "name": "strip-ansi", 903 | "version": "6.0.1", 904 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 905 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 906 | "license": "MIT", 907 | "dependencies": { 908 | "ansi-regex": "^5.0.1" 909 | }, 910 | "engines": { 911 | "node": ">=8" 912 | } 913 | }, 914 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 915 | "version": "5.0.1", 916 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 917 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 918 | "license": "MIT", 919 | "engines": { 920 | "node": ">=8" 921 | } 922 | }, 923 | "node_modules/supports-preserve-symlinks-flag": { 924 | "version": "1.0.0", 925 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 926 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 927 | "dev": true, 928 | "license": "MIT", 929 | "engines": { 930 | "node": ">= 0.4" 931 | }, 932 | "funding": { 933 | "url": "https://github.com/sponsors/ljharb" 934 | } 935 | }, 936 | "node_modules/toidentifier": { 937 | "version": "1.0.1", 938 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 939 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 940 | "license": "MIT", 941 | "engines": { 942 | "node": ">=0.6" 943 | } 944 | }, 945 | "node_modules/ts-node": { 946 | "version": "10.9.2", 947 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 948 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 949 | "dev": true, 950 | "license": "MIT", 951 | "dependencies": { 952 | "@cspotcode/source-map-support": "^0.8.0", 953 | "@tsconfig/node10": "^1.0.7", 954 | "@tsconfig/node12": "^1.0.7", 955 | "@tsconfig/node14": "^1.0.0", 956 | "@tsconfig/node16": "^1.0.2", 957 | "acorn": "^8.4.1", 958 | "acorn-walk": "^8.1.1", 959 | "arg": "^4.1.0", 960 | "create-require": "^1.1.0", 961 | "diff": "^4.0.1", 962 | "make-error": "^1.1.1", 963 | "v8-compile-cache-lib": "^3.0.1", 964 | "yn": "3.1.1" 965 | }, 966 | "bin": { 967 | "ts-node": "dist/bin.js", 968 | "ts-node-cwd": "dist/bin-cwd.js", 969 | "ts-node-esm": "dist/bin-esm.js", 970 | "ts-node-script": "dist/bin-script.js", 971 | "ts-node-transpile-only": "dist/bin-transpile.js", 972 | "ts-script": "dist/bin-script-deprecated.js" 973 | }, 974 | "peerDependencies": { 975 | "@swc/core": ">=1.2.50", 976 | "@swc/wasm": ">=1.2.50", 977 | "@types/node": "*", 978 | "typescript": ">=2.7" 979 | }, 980 | "peerDependenciesMeta": { 981 | "@swc/core": { 982 | "optional": true 983 | }, 984 | "@swc/wasm": { 985 | "optional": true 986 | } 987 | } 988 | }, 989 | "node_modules/tslib": { 990 | "version": "2.8.1", 991 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 992 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 993 | "license": "0BSD" 994 | }, 995 | "node_modules/typescript": { 996 | "version": "5.6.3", 997 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", 998 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", 999 | "dev": true, 1000 | "license": "Apache-2.0", 1001 | "bin": { 1002 | "tsc": "bin/tsc", 1003 | "tsserver": "bin/tsserver" 1004 | }, 1005 | "engines": { 1006 | "node": ">=14.17" 1007 | } 1008 | }, 1009 | "node_modules/undici-types": { 1010 | "version": "6.19.8", 1011 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1012 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1013 | "dev": true, 1014 | "license": "MIT", 1015 | "peer": true 1016 | }, 1017 | "node_modules/unpipe": { 1018 | "version": "1.0.0", 1019 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1020 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1021 | "license": "MIT", 1022 | "engines": { 1023 | "node": ">= 0.8" 1024 | } 1025 | }, 1026 | "node_modules/v8-compile-cache-lib": { 1027 | "version": "3.0.1", 1028 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1029 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1030 | "dev": true, 1031 | "license": "MIT" 1032 | }, 1033 | "node_modules/which": { 1034 | "version": "2.0.2", 1035 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1036 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1037 | "license": "ISC", 1038 | "dependencies": { 1039 | "isexe": "^2.0.0" 1040 | }, 1041 | "bin": { 1042 | "node-which": "bin/node-which" 1043 | }, 1044 | "engines": { 1045 | "node": ">= 8" 1046 | } 1047 | }, 1048 | "node_modules/wrap-ansi": { 1049 | "version": "8.1.0", 1050 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1051 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1052 | "license": "MIT", 1053 | "dependencies": { 1054 | "ansi-styles": "^6.1.0", 1055 | "string-width": "^5.0.1", 1056 | "strip-ansi": "^7.0.1" 1057 | }, 1058 | "engines": { 1059 | "node": ">=12" 1060 | }, 1061 | "funding": { 1062 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1063 | } 1064 | }, 1065 | "node_modules/wrap-ansi-cjs": { 1066 | "name": "wrap-ansi", 1067 | "version": "7.0.0", 1068 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1069 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1070 | "license": "MIT", 1071 | "dependencies": { 1072 | "ansi-styles": "^4.0.0", 1073 | "string-width": "^4.1.0", 1074 | "strip-ansi": "^6.0.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">=10" 1078 | }, 1079 | "funding": { 1080 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1081 | } 1082 | }, 1083 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1084 | "version": "5.0.1", 1085 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1086 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1087 | "license": "MIT", 1088 | "engines": { 1089 | "node": ">=8" 1090 | } 1091 | }, 1092 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1093 | "version": "4.3.0", 1094 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1095 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1096 | "license": "MIT", 1097 | "dependencies": { 1098 | "color-convert": "^2.0.1" 1099 | }, 1100 | "engines": { 1101 | "node": ">=8" 1102 | }, 1103 | "funding": { 1104 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1105 | } 1106 | }, 1107 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1108 | "version": "8.0.0", 1109 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1110 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1111 | "license": "MIT" 1112 | }, 1113 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1114 | "version": "4.2.3", 1115 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1116 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1117 | "license": "MIT", 1118 | "dependencies": { 1119 | "emoji-regex": "^8.0.0", 1120 | "is-fullwidth-code-point": "^3.0.0", 1121 | "strip-ansi": "^6.0.1" 1122 | }, 1123 | "engines": { 1124 | "node": ">=8" 1125 | } 1126 | }, 1127 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1128 | "version": "6.0.1", 1129 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1130 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1131 | "license": "MIT", 1132 | "dependencies": { 1133 | "ansi-regex": "^5.0.1" 1134 | }, 1135 | "engines": { 1136 | "node": ">=8" 1137 | } 1138 | }, 1139 | "node_modules/wrappy": { 1140 | "version": "1.0.2", 1141 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1142 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1143 | "dev": true, 1144 | "license": "ISC" 1145 | }, 1146 | "node_modules/yn": { 1147 | "version": "3.1.1", 1148 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1149 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1150 | "dev": true, 1151 | "license": "MIT", 1152 | "engines": { 1153 | "node": ">=6" 1154 | } 1155 | }, 1156 | "node_modules/zod": { 1157 | "version": "3.23.8", 1158 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1159 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 1160 | "license": "MIT", 1161 | "funding": { 1162 | "url": "https://github.com/sponsors/colinhacks" 1163 | } 1164 | } 1165 | } 1166 | } 1167 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@anaisbetts/mcp-installer", 3 | "version": "0.5.0", 4 | "bin": { 5 | "mcp-installer": "./lib/index.mjs" 6 | }, 7 | "description": "A MCP server to install other MCP servers", 8 | "main": "index.js", 9 | "scripts": { 10 | "prepare": "tsc && shx chmod +x ./lib/index.mjs" 11 | }, 12 | "author": "Ani Betts ", 13 | "license": "MIT", 14 | "dependencies": { 15 | "@modelcontextprotocol/sdk": "^1.0.1", 16 | "rimraf": "^6.0.1", 17 | "spawn-rx": "^4.0.0" 18 | }, 19 | "devDependencies": { 20 | "shx": "^0.3.4", 21 | "ts-node": "^10.9.2", 22 | "typescript": "^5.6.3" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/index.mts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Server } from "@modelcontextprotocol/sdk/server/index.js"; 4 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 5 | import { 6 | CallToolRequestSchema, 7 | ListToolsRequestSchema, 8 | } from "@modelcontextprotocol/sdk/types.js"; 9 | import * as os from "os"; 10 | import * as fs from "fs"; 11 | import * as path from "path"; 12 | import { spawnPromise } from "spawn-rx"; 13 | 14 | const server = new Server( 15 | { 16 | name: "mcp-installer", 17 | version: "0.5.0", 18 | }, 19 | { 20 | capabilities: { 21 | tools: {}, 22 | }, 23 | } 24 | ); 25 | 26 | server.setRequestHandler(ListToolsRequestSchema, async () => { 27 | return { 28 | tools: [ 29 | { 30 | name: "install_repo_mcp_server", 31 | description: "Install an MCP server via npx or uvx", 32 | inputSchema: { 33 | type: "object", 34 | properties: { 35 | name: { 36 | type: "string", 37 | description: "The package name of the MCP server", 38 | }, 39 | args: { 40 | type: "array", 41 | items: { type: "string" }, 42 | description: "The arguments to pass along", 43 | }, 44 | env: { 45 | type: "array", 46 | items: { type: "string" }, 47 | description: "The environment variables to set, delimited by =", 48 | }, 49 | }, 50 | required: ["name"], 51 | }, 52 | }, 53 | { 54 | name: "install_local_mcp_server", 55 | description: 56 | "Install an MCP server whose code is cloned locally on your computer", 57 | inputSchema: { 58 | type: "object", 59 | properties: { 60 | path: { 61 | type: "string", 62 | description: 63 | "The path to the MCP server code cloned on your computer", 64 | }, 65 | args: { 66 | type: "array", 67 | items: { type: "string" }, 68 | description: "The arguments to pass along", 69 | }, 70 | env: { 71 | type: "array", 72 | items: { type: "string" }, 73 | description: "The environment variables to set, delimited by =", 74 | }, 75 | }, 76 | required: ["path"], 77 | }, 78 | }, 79 | ], 80 | }; 81 | }); 82 | 83 | async function hasNodeJs() { 84 | try { 85 | await spawnPromise("node", ["--version"]); 86 | return true; 87 | } catch (e) { 88 | return false; 89 | } 90 | } 91 | 92 | async function hasUvx() { 93 | try { 94 | await spawnPromise("uvx", ["--version"]); 95 | return true; 96 | } catch (e) { 97 | return false; 98 | } 99 | } 100 | 101 | async function isNpmPackage(name: string) { 102 | try { 103 | await spawnPromise("npm", ["view", name, "version"]); 104 | return true; 105 | } catch (e) { 106 | return false; 107 | } 108 | } 109 | 110 | function installToClaudeDesktop( 111 | name: string, 112 | cmd: string, 113 | args: string[], 114 | env?: string[] 115 | ) { 116 | const configPath = 117 | process.platform === "win32" 118 | ? path.join( 119 | os.homedir(), 120 | "AppData", 121 | "Roaming", 122 | "Claude", 123 | "claude_desktop_config.json" 124 | ) 125 | : path.join( 126 | os.homedir(), 127 | "Library", 128 | "Application Support", 129 | "Claude", 130 | "claude_desktop_config.json" 131 | ); 132 | 133 | let config: any; 134 | try { 135 | config = JSON.parse(fs.readFileSync(configPath, "utf8")); 136 | } catch (e) { 137 | config = {}; 138 | } 139 | 140 | const envObj = (env ?? []).reduce((acc, val) => { 141 | const [key, value] = val.split("="); 142 | acc[key] = value; 143 | 144 | return acc; 145 | }, {} as Record); 146 | 147 | const newServer = { 148 | command: cmd, 149 | args: args, 150 | ...(env ? { env: envObj } : {}), 151 | }; 152 | 153 | const mcpServers = config.mcpServers ?? {}; 154 | mcpServers[name] = newServer; 155 | config.mcpServers = mcpServers; 156 | fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); 157 | } 158 | 159 | function installRepoWithArgsToClaudeDesktop( 160 | name: string, 161 | npmIfTrueElseUvx: boolean, 162 | args?: string[], 163 | env?: string[] 164 | ) { 165 | // If the name is in a scoped package, we need to remove the scope 166 | const serverName = /^@.*\//i.test(name) ? name.split("/")[1] : name; 167 | 168 | installToClaudeDesktop( 169 | serverName, 170 | npmIfTrueElseUvx ? "npx" : "uvx", 171 | [name, ...(args ?? [])], 172 | env 173 | ); 174 | } 175 | 176 | async function attemptNodeInstall( 177 | directory: string 178 | ): Promise> { 179 | await spawnPromise("npm", ["install"], { cwd: directory }); 180 | 181 | // Run down package.json looking for bins 182 | const pkg = JSON.parse( 183 | fs.readFileSync(path.join(directory, "package.json"), "utf-8") 184 | ); 185 | 186 | if (pkg.bin) { 187 | return Object.keys(pkg.bin).reduce((acc, key) => { 188 | acc[key] = path.resolve(directory, pkg.bin[key]); 189 | return acc; 190 | }, {} as Record); 191 | } 192 | 193 | if (pkg.main) { 194 | return { [pkg.name]: path.resolve(directory, pkg.main) }; 195 | } 196 | 197 | return {}; 198 | } 199 | 200 | async function installLocalMcpServer( 201 | dirPath: string, 202 | args?: string[], 203 | env?: string[] 204 | ) { 205 | if (!fs.existsSync(dirPath)) { 206 | return { 207 | content: [ 208 | { 209 | type: "text", 210 | text: `Path ${dirPath} does not exist locally!`, 211 | }, 212 | ], 213 | isError: true, 214 | }; 215 | } 216 | 217 | if (fs.existsSync(path.join(dirPath, "package.json"))) { 218 | const servers = await attemptNodeInstall(dirPath); 219 | 220 | Object.keys(servers).forEach((name) => { 221 | installToClaudeDesktop( 222 | name, 223 | "node", 224 | [servers[name], ...(args ?? [])], 225 | env 226 | ); 227 | }); 228 | 229 | return { 230 | content: [ 231 | { 232 | type: "text", 233 | text: `Installed the following servers via npm successfully! ${Object.keys( 234 | servers 235 | ).join(";")} Tell the user to restart the app`, 236 | }, 237 | ], 238 | }; 239 | } 240 | 241 | return { 242 | content: [ 243 | { 244 | type: "text", 245 | text: `Can't figure out how to install ${dirPath}`, 246 | }, 247 | ], 248 | isError: true, 249 | }; 250 | } 251 | 252 | async function installRepoMcpServer( 253 | name: string, 254 | args?: string[], 255 | env?: string[] 256 | ) { 257 | if (!(await hasNodeJs())) { 258 | return { 259 | content: [ 260 | { 261 | type: "text", 262 | text: `Node.js is not installed, please install it!`, 263 | }, 264 | ], 265 | isError: true, 266 | }; 267 | } 268 | 269 | if (await isNpmPackage(name)) { 270 | installRepoWithArgsToClaudeDesktop(name, true, args, env); 271 | 272 | return { 273 | content: [ 274 | { 275 | type: "text", 276 | text: "Installed MCP server via npx successfully! Tell the user to restart the app", 277 | }, 278 | ], 279 | }; 280 | } 281 | 282 | if (!(await hasUvx())) { 283 | return { 284 | content: [ 285 | { 286 | type: "text", 287 | text: `Python uv is not installed, please install it! Tell users to go to https://docs.astral.sh/uv`, 288 | }, 289 | ], 290 | isError: true, 291 | }; 292 | } 293 | 294 | installRepoWithArgsToClaudeDesktop(name, false, args, env); 295 | 296 | return { 297 | content: [ 298 | { 299 | type: "text", 300 | text: "Installed MCP server via uvx successfully! Tell the user to restart the app", 301 | }, 302 | ], 303 | }; 304 | } 305 | 306 | server.setRequestHandler(CallToolRequestSchema, async (request) => { 307 | try { 308 | if (request.params.name === "install_repo_mcp_server") { 309 | const { name, args, env } = request.params.arguments as { 310 | name: string; 311 | args?: string[]; 312 | env?: string[]; 313 | }; 314 | 315 | return await installRepoMcpServer(name, args, env); 316 | } 317 | 318 | if (request.params.name === "install_local_mcp_server") { 319 | const dirPath = request.params.arguments!.path as string; 320 | const { args, env } = request.params.arguments as { 321 | args?: string[]; 322 | env?: string[]; 323 | }; 324 | 325 | return await installLocalMcpServer(dirPath, args, env); 326 | } 327 | 328 | throw new Error(`Unknown tool: ${request.params.name}`); 329 | } catch (err) { 330 | return { 331 | content: [ 332 | { 333 | type: "text", 334 | text: `Error setting up package: ${err}`, 335 | }, 336 | ], 337 | isError: true, 338 | }; 339 | } 340 | }); 341 | 342 | async function runServer() { 343 | const transport = new StdioServerTransport(); 344 | await server.connect(transport); 345 | } 346 | 347 | runServer().catch(console.error); 348 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "removeComments": false, 4 | "preserveConstEnums": true, 5 | "sourceMap": true, 6 | "declaration": true, 7 | "noImplicitAny": true, 8 | "noImplicitReturns": true, 9 | "strictNullChecks": true, 10 | "noUnusedLocals": true, 11 | "noImplicitThis": true, 12 | "noUnusedParameters": true, 13 | "module": "commonjs", 14 | "moduleResolution": "node", 15 | "pretty": true, 16 | "target": "es2015", 17 | "outDir": "lib", 18 | "lib": ["dom", "es2015"] 19 | }, 20 | "formatCodeOptions": { 21 | "indentSize": 2, 22 | "tabSize": 2 23 | }, 24 | "include": ["src/**/*.mts"], 25 | "exclude": ["node_modules", "lib"] 26 | } 27 | --------------------------------------------------------------------------------