├── .gitignore ├── LICENSE ├── package.json ├── pnpm-lock.yaml ├── src └── index.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # vitepress build output 108 | **/.vitepress/dist 109 | 110 | # vitepress cache directory 111 | **/.vitepress/cache 112 | 113 | # Docusaurus cache and generated files 114 | .docusaurus 115 | 116 | # Serverless directories 117 | .serverless/ 118 | 119 | # FuseBox cache 120 | .fusebox/ 121 | 122 | # DynamoDB Local files 123 | .dynamodb/ 124 | 125 | # TernJS port file 126 | .tern-port 127 | 128 | # Stores VSCode versions used for testing VSCode extensions 129 | .vscode-test 130 | 131 | # yarn v2 132 | .yarn/cache 133 | .yarn/unplugged 134 | .yarn/build-state.yml 135 | .yarn/install-state.gz 136 | .pnp.* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Better Stack Community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-template-ts", 3 | "version": "1.0.0", 4 | "description": "MCP server template for TypeScript", 5 | "license": "MIT", 6 | "author": "Better Stack (https://betterstack.com)", 7 | "type": "module", 8 | "bin": { 9 | "mcp-template-ts": "dist/index.js" 10 | }, 11 | "files": [ 12 | "dist" 13 | ], 14 | "scripts": { 15 | "build": "tsc && shx chmod +x dist/*.js", 16 | "prepare": "npm run build", 17 | "watch": "tsc --watch" 18 | }, 19 | "dependencies": { 20 | "@modelcontextprotocol/sdk": "^1.6.0", 21 | "zod": "^3.24.2" 22 | }, 23 | "devDependencies": { 24 | "shx": "^0.3.4", 25 | "typescript": "^5.7.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@modelcontextprotocol/sdk': 12 | specifier: ^1.6.0 13 | version: 1.6.0 14 | zod: 15 | specifier: ^3.24.2 16 | version: 3.24.2 17 | devDependencies: 18 | shx: 19 | specifier: ^0.3.4 20 | version: 0.3.4 21 | typescript: 22 | specifier: ^5.7.3 23 | version: 5.7.3 24 | 25 | packages: 26 | 27 | '@modelcontextprotocol/sdk@1.6.0': 28 | resolution: {integrity: sha512-585s8g+jzuGBomzgzDeP5l8gEyiSs+KhoAHbA2ZZ24Zgm83IZsyCLl/fmWhPHbfYsuLG8NE6SWGZA5ZBql8jSw==} 29 | engines: {node: '>=18'} 30 | 31 | accepts@2.0.0: 32 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 33 | engines: {node: '>= 0.6'} 34 | 35 | balanced-match@1.0.2: 36 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 37 | 38 | body-parser@2.1.0: 39 | resolution: {integrity: sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==} 40 | engines: {node: '>=18'} 41 | 42 | brace-expansion@1.1.11: 43 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 44 | 45 | bytes@3.1.2: 46 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 47 | engines: {node: '>= 0.8'} 48 | 49 | call-bind-apply-helpers@1.0.2: 50 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 51 | engines: {node: '>= 0.4'} 52 | 53 | call-bound@1.0.3: 54 | resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} 55 | engines: {node: '>= 0.4'} 56 | 57 | concat-map@0.0.1: 58 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 59 | 60 | content-disposition@1.0.0: 61 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 62 | engines: {node: '>= 0.6'} 63 | 64 | content-type@1.0.5: 65 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 66 | engines: {node: '>= 0.6'} 67 | 68 | cookie-signature@1.2.2: 69 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 70 | engines: {node: '>=6.6.0'} 71 | 72 | cookie@0.7.1: 73 | resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} 74 | engines: {node: '>= 0.6'} 75 | 76 | cors@2.8.5: 77 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 78 | engines: {node: '>= 0.10'} 79 | 80 | debug@2.6.9: 81 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 82 | peerDependencies: 83 | supports-color: '*' 84 | peerDependenciesMeta: 85 | supports-color: 86 | optional: true 87 | 88 | debug@4.3.6: 89 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 90 | engines: {node: '>=6.0'} 91 | peerDependencies: 92 | supports-color: '*' 93 | peerDependenciesMeta: 94 | supports-color: 95 | optional: true 96 | 97 | debug@4.4.0: 98 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 99 | engines: {node: '>=6.0'} 100 | peerDependencies: 101 | supports-color: '*' 102 | peerDependenciesMeta: 103 | supports-color: 104 | optional: true 105 | 106 | depd@2.0.0: 107 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 108 | engines: {node: '>= 0.8'} 109 | 110 | destroy@1.2.0: 111 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 112 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 113 | 114 | dunder-proto@1.0.1: 115 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 116 | engines: {node: '>= 0.4'} 117 | 118 | ee-first@1.1.1: 119 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 120 | 121 | encodeurl@1.0.2: 122 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 123 | engines: {node: '>= 0.8'} 124 | 125 | encodeurl@2.0.0: 126 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 127 | engines: {node: '>= 0.8'} 128 | 129 | es-define-property@1.0.1: 130 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 131 | engines: {node: '>= 0.4'} 132 | 133 | es-errors@1.3.0: 134 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 135 | engines: {node: '>= 0.4'} 136 | 137 | es-object-atoms@1.1.1: 138 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 139 | engines: {node: '>= 0.4'} 140 | 141 | escape-html@1.0.3: 142 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 143 | 144 | etag@1.8.1: 145 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 146 | engines: {node: '>= 0.6'} 147 | 148 | eventsource-parser@3.0.0: 149 | resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} 150 | engines: {node: '>=18.0.0'} 151 | 152 | eventsource@3.0.5: 153 | resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==} 154 | engines: {node: '>=18.0.0'} 155 | 156 | express-rate-limit@7.5.0: 157 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 158 | engines: {node: '>= 16'} 159 | peerDependencies: 160 | express: ^4.11 || 5 || ^5.0.0-beta.1 161 | 162 | express@5.0.1: 163 | resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} 164 | engines: {node: '>= 18'} 165 | 166 | finalhandler@2.0.0: 167 | resolution: {integrity: sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==} 168 | engines: {node: '>= 0.8'} 169 | 170 | forwarded@0.2.0: 171 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 172 | engines: {node: '>= 0.6'} 173 | 174 | fresh@0.5.2: 175 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 176 | engines: {node: '>= 0.6'} 177 | 178 | fresh@2.0.0: 179 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 180 | engines: {node: '>= 0.8'} 181 | 182 | fs.realpath@1.0.0: 183 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 184 | 185 | function-bind@1.1.2: 186 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 187 | 188 | get-intrinsic@1.3.0: 189 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 190 | engines: {node: '>= 0.4'} 191 | 192 | get-proto@1.0.1: 193 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 194 | engines: {node: '>= 0.4'} 195 | 196 | glob@7.2.3: 197 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 198 | deprecated: Glob versions prior to v9 are no longer supported 199 | 200 | gopd@1.2.0: 201 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 202 | engines: {node: '>= 0.4'} 203 | 204 | has-symbols@1.1.0: 205 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 206 | engines: {node: '>= 0.4'} 207 | 208 | hasown@2.0.2: 209 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 210 | engines: {node: '>= 0.4'} 211 | 212 | http-errors@2.0.0: 213 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 214 | engines: {node: '>= 0.8'} 215 | 216 | iconv-lite@0.5.2: 217 | resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} 218 | engines: {node: '>=0.10.0'} 219 | 220 | iconv-lite@0.6.3: 221 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 222 | engines: {node: '>=0.10.0'} 223 | 224 | inflight@1.0.6: 225 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 226 | 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. 227 | 228 | inherits@2.0.4: 229 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 230 | 231 | interpret@1.4.0: 232 | resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} 233 | engines: {node: '>= 0.10'} 234 | 235 | ipaddr.js@1.9.1: 236 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 237 | engines: {node: '>= 0.10'} 238 | 239 | is-core-module@2.16.1: 240 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 241 | engines: {node: '>= 0.4'} 242 | 243 | is-promise@4.0.0: 244 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 245 | 246 | math-intrinsics@1.1.0: 247 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 248 | engines: {node: '>= 0.4'} 249 | 250 | media-typer@1.1.0: 251 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 252 | engines: {node: '>= 0.8'} 253 | 254 | merge-descriptors@2.0.0: 255 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 256 | engines: {node: '>=18'} 257 | 258 | methods@1.1.2: 259 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 260 | engines: {node: '>= 0.6'} 261 | 262 | mime-db@1.52.0: 263 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 264 | engines: {node: '>= 0.6'} 265 | 266 | mime-db@1.53.0: 267 | resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} 268 | engines: {node: '>= 0.6'} 269 | 270 | mime-types@2.1.35: 271 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 272 | engines: {node: '>= 0.6'} 273 | 274 | mime-types@3.0.0: 275 | resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} 276 | engines: {node: '>= 0.6'} 277 | 278 | minimatch@3.1.2: 279 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 280 | 281 | minimist@1.2.8: 282 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 283 | 284 | ms@2.0.0: 285 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 286 | 287 | ms@2.1.2: 288 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 289 | 290 | ms@2.1.3: 291 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 292 | 293 | negotiator@1.0.0: 294 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 295 | engines: {node: '>= 0.6'} 296 | 297 | object-assign@4.1.1: 298 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 299 | engines: {node: '>=0.10.0'} 300 | 301 | object-inspect@1.13.4: 302 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 303 | engines: {node: '>= 0.4'} 304 | 305 | on-finished@2.4.1: 306 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 307 | engines: {node: '>= 0.8'} 308 | 309 | once@1.4.0: 310 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 311 | 312 | parseurl@1.3.3: 313 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 314 | engines: {node: '>= 0.8'} 315 | 316 | path-is-absolute@1.0.1: 317 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 318 | engines: {node: '>=0.10.0'} 319 | 320 | path-parse@1.0.7: 321 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 322 | 323 | path-to-regexp@8.2.0: 324 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 325 | engines: {node: '>=16'} 326 | 327 | pkce-challenge@4.1.0: 328 | resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==} 329 | engines: {node: '>=16.20.0'} 330 | 331 | proxy-addr@2.0.7: 332 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 333 | engines: {node: '>= 0.10'} 334 | 335 | qs@6.13.0: 336 | resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} 337 | engines: {node: '>=0.6'} 338 | 339 | qs@6.14.0: 340 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 341 | engines: {node: '>=0.6'} 342 | 343 | range-parser@1.2.1: 344 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 345 | engines: {node: '>= 0.6'} 346 | 347 | raw-body@3.0.0: 348 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 349 | engines: {node: '>= 0.8'} 350 | 351 | rechoir@0.6.2: 352 | resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} 353 | engines: {node: '>= 0.10'} 354 | 355 | resolve@1.22.10: 356 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 357 | engines: {node: '>= 0.4'} 358 | hasBin: true 359 | 360 | router@2.1.0: 361 | resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} 362 | engines: {node: '>= 18'} 363 | 364 | safe-buffer@5.2.1: 365 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 366 | 367 | safer-buffer@2.1.2: 368 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 369 | 370 | send@1.1.0: 371 | resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} 372 | engines: {node: '>= 18'} 373 | 374 | serve-static@2.1.0: 375 | resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} 376 | engines: {node: '>= 18'} 377 | 378 | setprototypeof@1.2.0: 379 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 380 | 381 | shelljs@0.8.5: 382 | resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} 383 | engines: {node: '>=4'} 384 | hasBin: true 385 | 386 | shx@0.3.4: 387 | resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} 388 | engines: {node: '>=6'} 389 | hasBin: true 390 | 391 | side-channel-list@1.0.0: 392 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 393 | engines: {node: '>= 0.4'} 394 | 395 | side-channel-map@1.0.1: 396 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 397 | engines: {node: '>= 0.4'} 398 | 399 | side-channel-weakmap@1.0.2: 400 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 401 | engines: {node: '>= 0.4'} 402 | 403 | side-channel@1.1.0: 404 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 405 | engines: {node: '>= 0.4'} 406 | 407 | statuses@2.0.1: 408 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 409 | engines: {node: '>= 0.8'} 410 | 411 | supports-preserve-symlinks-flag@1.0.0: 412 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 413 | engines: {node: '>= 0.4'} 414 | 415 | toidentifier@1.0.1: 416 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 417 | engines: {node: '>=0.6'} 418 | 419 | type-is@2.0.0: 420 | resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} 421 | engines: {node: '>= 0.6'} 422 | 423 | typescript@5.7.3: 424 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 425 | engines: {node: '>=14.17'} 426 | hasBin: true 427 | 428 | unpipe@1.0.0: 429 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 430 | engines: {node: '>= 0.8'} 431 | 432 | utils-merge@1.0.1: 433 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 434 | engines: {node: '>= 0.4.0'} 435 | 436 | vary@1.1.2: 437 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 438 | engines: {node: '>= 0.8'} 439 | 440 | wrappy@1.0.2: 441 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 442 | 443 | zod-to-json-schema@3.24.3: 444 | resolution: {integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==} 445 | peerDependencies: 446 | zod: ^3.24.1 447 | 448 | zod@3.24.2: 449 | resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} 450 | 451 | snapshots: 452 | 453 | '@modelcontextprotocol/sdk@1.6.0': 454 | dependencies: 455 | content-type: 1.0.5 456 | cors: 2.8.5 457 | eventsource: 3.0.5 458 | express: 5.0.1 459 | express-rate-limit: 7.5.0(express@5.0.1) 460 | pkce-challenge: 4.1.0 461 | raw-body: 3.0.0 462 | zod: 3.24.2 463 | zod-to-json-schema: 3.24.3(zod@3.24.2) 464 | transitivePeerDependencies: 465 | - supports-color 466 | 467 | accepts@2.0.0: 468 | dependencies: 469 | mime-types: 3.0.0 470 | negotiator: 1.0.0 471 | 472 | balanced-match@1.0.2: {} 473 | 474 | body-parser@2.1.0: 475 | dependencies: 476 | bytes: 3.1.2 477 | content-type: 1.0.5 478 | debug: 4.4.0 479 | http-errors: 2.0.0 480 | iconv-lite: 0.5.2 481 | on-finished: 2.4.1 482 | qs: 6.14.0 483 | raw-body: 3.0.0 484 | type-is: 2.0.0 485 | transitivePeerDependencies: 486 | - supports-color 487 | 488 | brace-expansion@1.1.11: 489 | dependencies: 490 | balanced-match: 1.0.2 491 | concat-map: 0.0.1 492 | 493 | bytes@3.1.2: {} 494 | 495 | call-bind-apply-helpers@1.0.2: 496 | dependencies: 497 | es-errors: 1.3.0 498 | function-bind: 1.1.2 499 | 500 | call-bound@1.0.3: 501 | dependencies: 502 | call-bind-apply-helpers: 1.0.2 503 | get-intrinsic: 1.3.0 504 | 505 | concat-map@0.0.1: {} 506 | 507 | content-disposition@1.0.0: 508 | dependencies: 509 | safe-buffer: 5.2.1 510 | 511 | content-type@1.0.5: {} 512 | 513 | cookie-signature@1.2.2: {} 514 | 515 | cookie@0.7.1: {} 516 | 517 | cors@2.8.5: 518 | dependencies: 519 | object-assign: 4.1.1 520 | vary: 1.1.2 521 | 522 | debug@2.6.9: 523 | dependencies: 524 | ms: 2.0.0 525 | 526 | debug@4.3.6: 527 | dependencies: 528 | ms: 2.1.2 529 | 530 | debug@4.4.0: 531 | dependencies: 532 | ms: 2.1.3 533 | 534 | depd@2.0.0: {} 535 | 536 | destroy@1.2.0: {} 537 | 538 | dunder-proto@1.0.1: 539 | dependencies: 540 | call-bind-apply-helpers: 1.0.2 541 | es-errors: 1.3.0 542 | gopd: 1.2.0 543 | 544 | ee-first@1.1.1: {} 545 | 546 | encodeurl@1.0.2: {} 547 | 548 | encodeurl@2.0.0: {} 549 | 550 | es-define-property@1.0.1: {} 551 | 552 | es-errors@1.3.0: {} 553 | 554 | es-object-atoms@1.1.1: 555 | dependencies: 556 | es-errors: 1.3.0 557 | 558 | escape-html@1.0.3: {} 559 | 560 | etag@1.8.1: {} 561 | 562 | eventsource-parser@3.0.0: {} 563 | 564 | eventsource@3.0.5: 565 | dependencies: 566 | eventsource-parser: 3.0.0 567 | 568 | express-rate-limit@7.5.0(express@5.0.1): 569 | dependencies: 570 | express: 5.0.1 571 | 572 | express@5.0.1: 573 | dependencies: 574 | accepts: 2.0.0 575 | body-parser: 2.1.0 576 | content-disposition: 1.0.0 577 | content-type: 1.0.5 578 | cookie: 0.7.1 579 | cookie-signature: 1.2.2 580 | debug: 4.3.6 581 | depd: 2.0.0 582 | encodeurl: 2.0.0 583 | escape-html: 1.0.3 584 | etag: 1.8.1 585 | finalhandler: 2.0.0 586 | fresh: 2.0.0 587 | http-errors: 2.0.0 588 | merge-descriptors: 2.0.0 589 | methods: 1.1.2 590 | mime-types: 3.0.0 591 | on-finished: 2.4.1 592 | once: 1.4.0 593 | parseurl: 1.3.3 594 | proxy-addr: 2.0.7 595 | qs: 6.13.0 596 | range-parser: 1.2.1 597 | router: 2.1.0 598 | safe-buffer: 5.2.1 599 | send: 1.1.0 600 | serve-static: 2.1.0 601 | setprototypeof: 1.2.0 602 | statuses: 2.0.1 603 | type-is: 2.0.0 604 | utils-merge: 1.0.1 605 | vary: 1.1.2 606 | transitivePeerDependencies: 607 | - supports-color 608 | 609 | finalhandler@2.0.0: 610 | dependencies: 611 | debug: 2.6.9 612 | encodeurl: 1.0.2 613 | escape-html: 1.0.3 614 | on-finished: 2.4.1 615 | parseurl: 1.3.3 616 | statuses: 2.0.1 617 | unpipe: 1.0.0 618 | transitivePeerDependencies: 619 | - supports-color 620 | 621 | forwarded@0.2.0: {} 622 | 623 | fresh@0.5.2: {} 624 | 625 | fresh@2.0.0: {} 626 | 627 | fs.realpath@1.0.0: {} 628 | 629 | function-bind@1.1.2: {} 630 | 631 | get-intrinsic@1.3.0: 632 | dependencies: 633 | call-bind-apply-helpers: 1.0.2 634 | es-define-property: 1.0.1 635 | es-errors: 1.3.0 636 | es-object-atoms: 1.1.1 637 | function-bind: 1.1.2 638 | get-proto: 1.0.1 639 | gopd: 1.2.0 640 | has-symbols: 1.1.0 641 | hasown: 2.0.2 642 | math-intrinsics: 1.1.0 643 | 644 | get-proto@1.0.1: 645 | dependencies: 646 | dunder-proto: 1.0.1 647 | es-object-atoms: 1.1.1 648 | 649 | glob@7.2.3: 650 | dependencies: 651 | fs.realpath: 1.0.0 652 | inflight: 1.0.6 653 | inherits: 2.0.4 654 | minimatch: 3.1.2 655 | once: 1.4.0 656 | path-is-absolute: 1.0.1 657 | 658 | gopd@1.2.0: {} 659 | 660 | has-symbols@1.1.0: {} 661 | 662 | hasown@2.0.2: 663 | dependencies: 664 | function-bind: 1.1.2 665 | 666 | http-errors@2.0.0: 667 | dependencies: 668 | depd: 2.0.0 669 | inherits: 2.0.4 670 | setprototypeof: 1.2.0 671 | statuses: 2.0.1 672 | toidentifier: 1.0.1 673 | 674 | iconv-lite@0.5.2: 675 | dependencies: 676 | safer-buffer: 2.1.2 677 | 678 | iconv-lite@0.6.3: 679 | dependencies: 680 | safer-buffer: 2.1.2 681 | 682 | inflight@1.0.6: 683 | dependencies: 684 | once: 1.4.0 685 | wrappy: 1.0.2 686 | 687 | inherits@2.0.4: {} 688 | 689 | interpret@1.4.0: {} 690 | 691 | ipaddr.js@1.9.1: {} 692 | 693 | is-core-module@2.16.1: 694 | dependencies: 695 | hasown: 2.0.2 696 | 697 | is-promise@4.0.0: {} 698 | 699 | math-intrinsics@1.1.0: {} 700 | 701 | media-typer@1.1.0: {} 702 | 703 | merge-descriptors@2.0.0: {} 704 | 705 | methods@1.1.2: {} 706 | 707 | mime-db@1.52.0: {} 708 | 709 | mime-db@1.53.0: {} 710 | 711 | mime-types@2.1.35: 712 | dependencies: 713 | mime-db: 1.52.0 714 | 715 | mime-types@3.0.0: 716 | dependencies: 717 | mime-db: 1.53.0 718 | 719 | minimatch@3.1.2: 720 | dependencies: 721 | brace-expansion: 1.1.11 722 | 723 | minimist@1.2.8: {} 724 | 725 | ms@2.0.0: {} 726 | 727 | ms@2.1.2: {} 728 | 729 | ms@2.1.3: {} 730 | 731 | negotiator@1.0.0: {} 732 | 733 | object-assign@4.1.1: {} 734 | 735 | object-inspect@1.13.4: {} 736 | 737 | on-finished@2.4.1: 738 | dependencies: 739 | ee-first: 1.1.1 740 | 741 | once@1.4.0: 742 | dependencies: 743 | wrappy: 1.0.2 744 | 745 | parseurl@1.3.3: {} 746 | 747 | path-is-absolute@1.0.1: {} 748 | 749 | path-parse@1.0.7: {} 750 | 751 | path-to-regexp@8.2.0: {} 752 | 753 | pkce-challenge@4.1.0: {} 754 | 755 | proxy-addr@2.0.7: 756 | dependencies: 757 | forwarded: 0.2.0 758 | ipaddr.js: 1.9.1 759 | 760 | qs@6.13.0: 761 | dependencies: 762 | side-channel: 1.1.0 763 | 764 | qs@6.14.0: 765 | dependencies: 766 | side-channel: 1.1.0 767 | 768 | range-parser@1.2.1: {} 769 | 770 | raw-body@3.0.0: 771 | dependencies: 772 | bytes: 3.1.2 773 | http-errors: 2.0.0 774 | iconv-lite: 0.6.3 775 | unpipe: 1.0.0 776 | 777 | rechoir@0.6.2: 778 | dependencies: 779 | resolve: 1.22.10 780 | 781 | resolve@1.22.10: 782 | dependencies: 783 | is-core-module: 2.16.1 784 | path-parse: 1.0.7 785 | supports-preserve-symlinks-flag: 1.0.0 786 | 787 | router@2.1.0: 788 | dependencies: 789 | is-promise: 4.0.0 790 | parseurl: 1.3.3 791 | path-to-regexp: 8.2.0 792 | 793 | safe-buffer@5.2.1: {} 794 | 795 | safer-buffer@2.1.2: {} 796 | 797 | send@1.1.0: 798 | dependencies: 799 | debug: 4.3.6 800 | destroy: 1.2.0 801 | encodeurl: 2.0.0 802 | escape-html: 1.0.3 803 | etag: 1.8.1 804 | fresh: 0.5.2 805 | http-errors: 2.0.0 806 | mime-types: 2.1.35 807 | ms: 2.1.3 808 | on-finished: 2.4.1 809 | range-parser: 1.2.1 810 | statuses: 2.0.1 811 | transitivePeerDependencies: 812 | - supports-color 813 | 814 | serve-static@2.1.0: 815 | dependencies: 816 | encodeurl: 2.0.0 817 | escape-html: 1.0.3 818 | parseurl: 1.3.3 819 | send: 1.1.0 820 | transitivePeerDependencies: 821 | - supports-color 822 | 823 | setprototypeof@1.2.0: {} 824 | 825 | shelljs@0.8.5: 826 | dependencies: 827 | glob: 7.2.3 828 | interpret: 1.4.0 829 | rechoir: 0.6.2 830 | 831 | shx@0.3.4: 832 | dependencies: 833 | minimist: 1.2.8 834 | shelljs: 0.8.5 835 | 836 | side-channel-list@1.0.0: 837 | dependencies: 838 | es-errors: 1.3.0 839 | object-inspect: 1.13.4 840 | 841 | side-channel-map@1.0.1: 842 | dependencies: 843 | call-bound: 1.0.3 844 | es-errors: 1.3.0 845 | get-intrinsic: 1.3.0 846 | object-inspect: 1.13.4 847 | 848 | side-channel-weakmap@1.0.2: 849 | dependencies: 850 | call-bound: 1.0.3 851 | es-errors: 1.3.0 852 | get-intrinsic: 1.3.0 853 | object-inspect: 1.13.4 854 | side-channel-map: 1.0.1 855 | 856 | side-channel@1.1.0: 857 | dependencies: 858 | es-errors: 1.3.0 859 | object-inspect: 1.13.4 860 | side-channel-list: 1.0.0 861 | side-channel-map: 1.0.1 862 | side-channel-weakmap: 1.0.2 863 | 864 | statuses@2.0.1: {} 865 | 866 | supports-preserve-symlinks-flag@1.0.0: {} 867 | 868 | toidentifier@1.0.1: {} 869 | 870 | type-is@2.0.0: 871 | dependencies: 872 | content-type: 1.0.5 873 | media-typer: 1.1.0 874 | mime-types: 3.0.0 875 | 876 | typescript@5.7.3: {} 877 | 878 | unpipe@1.0.0: {} 879 | 880 | utils-merge@1.0.1: {} 881 | 882 | vary@1.1.2: {} 883 | 884 | wrappy@1.0.2: {} 885 | 886 | zod-to-json-schema@3.24.3(zod@3.24.2): 887 | dependencies: 888 | zod: 3.24.2 889 | 890 | zod@3.24.2: {} 891 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { 4 | McpServer, 5 | ResourceTemplate, 6 | } from "@modelcontextprotocol/sdk/server/mcp.js"; 7 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 8 | import { z } from "zod"; 9 | 10 | // Create an MCP server 11 | const server = new McpServer({ 12 | name: "Demo", 13 | version: "1.0.0", 14 | }); 15 | 16 | // Add a dynamic greeting resource 17 | server.resource( 18 | "greeting", 19 | new ResourceTemplate("greeting://{name}", { list: undefined }), 20 | async (uri, { name }) => ({ 21 | contents: [ 22 | { 23 | uri: uri.href, 24 | text: `Hello, ${name}!`, 25 | }, 26 | ], 27 | }) 28 | ); 29 | 30 | // Add an addition tool 31 | server.tool("add", { a: z.number(), b: z.number() }, async ({ a, b }) => ({ 32 | content: [{ type: "text", text: String(a + b) }], 33 | })); 34 | 35 | server.prompt("review-code", { code: z.string() }, ({ code }) => ({ 36 | messages: [ 37 | { 38 | role: "user", 39 | content: { 40 | type: "text", 41 | text: `Please review this code:\n\n${code}`, 42 | }, 43 | }, 44 | ], 45 | })); 46 | 47 | // Start receiving messages on stdin and sending messages on stdout 48 | const transport = new StdioServerTransport(); 49 | await server.connect(transport); 50 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "resolveJsonModule": true, 11 | "outDir": "./dist", 12 | "rootDir": "./src" 13 | }, 14 | "include": ["src/**/*"], 15 | "exclude": ["node_modules"] 16 | } 17 | --------------------------------------------------------------------------------