├── .cursor ├── mcp.json └── rules │ └── typescript.mdc ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── smithery.yaml ├── src └── index.ts └── tsconfig.json /.cursor/mcp.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "think": { 4 | "command": "node", 5 | "args": ["./build/index.js"] 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.cursor/rules/typescript.mdc: -------------------------------------------------------------------------------- 1 | --- 2 | description: 3 | globs: *.tsx,*.ts 4 | alwaysApply: false 5 | --- 6 | ## Using the think tool for TypeScript Development 7 | 8 | Before implementing any TypeScript code or responding to technical questions, use the think tool to: 9 | - Analyze type definitions and interfaces that might be relevant 10 | - Check for potential type errors or edge cases 11 | - Reason through generics and type constraints 12 | - Verify the correct usage of TypeScript features 13 | 14 | Here's an example of TypeScript-specific reasoning with the think tool: 15 | 16 | 17 | User wants to implement a generic state management hook in React TypeScript 18 | - Analysis of requirements: 19 | * Need to handle any data type (generic typing) 20 | * Must preserve type information throughout state lifecycle 21 | * Should provide typesafe update methods 22 | * Need to consider immutability patterns 23 | 24 | - Type constraints to consider: 25 | * Should T extend object, or allow primitives? 26 | * Is Partial appropriate for updates? 27 | * Should we use Record as fallback? 28 | 29 | - Implementation considerations: 30 | * useState as foundation 31 | * Add typed setter methods that preserve generics 32 | * Consider callback pattern for atomic updates 33 | * Check for compatibility with React's rules of hooks 34 | 35 | - Approach: 36 | 1. Define generic interface for the hook's return value 37 | 2. Implement useState with proper generic typing 38 | 3. Create typed update methods that maintain type safety 39 | 4. Add JSDoc comments for better developer experience 40 | 5. Return immutable state with properly typed methods 41 | 42 | 43 | When helping with TypeScript challenges: 44 | 1. First analyze the type system implications 45 | 2. Consider TypeScript-specific edge cases 46 | 3. Reason through type narrowing and widening 47 | 4. Check for compatibility with the TypeScript compiler version 48 | 5. Consider type inference and explicit type annotations -------------------------------------------------------------------------------- /.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.* 137 | 138 | # Build output 139 | build/ 140 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Use Node.js 21 base image 2 | FROM node:21-alpine AS builder 3 | 4 | # Set working directory 5 | WORKDIR /app 6 | 7 | # Copy all source files first 8 | COPY . . 9 | 10 | # Install all dependencies including dev dependencies 11 | RUN npm ci 12 | 13 | # Build the TypeScript files 14 | RUN npm run build 15 | 16 | # Use a smaller base image for the release 17 | FROM node:21-slim AS release 18 | 19 | # Set working directory 20 | WORKDIR /app 21 | 22 | # Copy only the necessary files from builder 23 | COPY --from=builder /app/build /app/build 24 | COPY --from=builder /app/package.json /app/package.json 25 | COPY --from=builder /app/package-lock.json /app/package-lock.json 26 | 27 | # Install only production dependencies without running prepare script 28 | RUN npm ci --omit=dev --ignore-scripts 29 | 30 | # Set environment variable for Node.js 31 | ENV NODE_ENV=production 32 | 33 | # Set the entrypoint 34 | ENTRYPOINT ["node", "build/index.js"] 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Marco Pesani 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # think-mcp-server 2 | [![smithery badge](https://smithery.ai/badge/@marcopesani/think-mcp-server)](https://smithery.ai/server/@marcopesani/think-mcp-server) 3 | 4 | A minimal MCP Server based on the Anthropic's "think" tool research 5 | 6 | ## Overview 7 | 8 | This project implements a minimal Message Control Protocol (MCP) server that provides Claude AI models with the "think" tool capability. Based on Anthropic's research published on March 20, 2025, this implementation enables Claude to perform better on complex reasoning tasks involving multi-step tool usage. 9 | 10 | ## What is the "think" tool? 11 | 12 | The "think" tool gives Claude the ability to include an additional thinking step—with its own designated space—as part of reaching a final answer. Unlike extended thinking (which happens before response generation), the "think" tool allows Claude to pause during response generation to consider whether it has all necessary information to proceed. 13 | 14 | Key benefits: 15 | - Improves complex problem-solving performance 16 | - Enhances policy adherence in tool usage 17 | - Increases consistency in decision making 18 | - Helps with multi-step problems requiring careful reasoning 19 | 20 | ## Implementation 21 | 22 | This server implements the "think" tool with the following specification: 23 | 24 | ```json 25 | { 26 | "name": "think", 27 | "description": "Use the tool to think about something. It will not obtain new information or change the database, but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.", 28 | "input_schema": { 29 | "type": "object", 30 | "properties": { 31 | "thought": { 32 | "type": "string", 33 | "description": "A thought to think about." 34 | } 35 | }, 36 | "required": ["thought"] 37 | } 38 | } 39 | ``` 40 | 41 | ## When to Use the "think" Tool 42 | 43 | Based on Anthropic's research, this tool is most beneficial for: 44 | 45 | 1. **Tool Output Analysis**: When Claude needs to process previous tool call outputs before acting 46 | 2. **Policy-Heavy Environments**: When Claude must follow detailed guidelines 47 | 3. **Sequential Decision Making**: When each action builds on previous ones and mistakes are costly 48 | 49 | ## Implementation Best Practices 50 | 51 | ### Strategic Prompting 52 | 53 | For best results, include clear instructions in your prompts on when and how to use the "think" tool. Consider providing domain-specific examples that show: 54 | - Expected detail level in reasoning 55 | - How to break down complex instructions into steps 56 | - Decision trees for common scenarios 57 | - Information verification processes 58 | 59 | ### System Prompt Integration 60 | 61 | Complex guidance works best when placed in the system prompt rather than the tool description itself. 62 | 63 | ## How It Works 64 | 65 | The server operates using the Model Context Protocol (MCP) to communicate with Claude and similar AI assistants. It: 66 | 67 | - Runs as a standalone process using stdio for communication 68 | - Registers the "think" tool for Claude to use during reasoning 69 | - Returns structured responses that can be processed by AI assistants 70 | - Logs thinking steps without affecting the external environment 71 | 72 | ## Features 73 | 74 | ### Tools 75 | 76 | - **think** - Enables Claude to think about a problem or analyze information 77 | - Required: thought (string containing Claude's thinking process) 78 | 79 | ## Development 80 | 81 | Install dependencies: 82 | 83 | ```bash 84 | npm install 85 | ``` 86 | 87 | Build the server: 88 | 89 | ```bash 90 | npm run build 91 | ``` 92 | 93 | For development with auto-rebuild: 94 | 95 | ```bash 96 | npm run watch 97 | ``` 98 | 99 | ## Debugging 100 | 101 | Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector: 102 | 103 | ```bash 104 | npm run inspector 105 | ``` 106 | 107 | The Inspector will provide a URL to access debugging tools in your browser. 108 | 109 | ## Installation 110 | 111 | ### Installing via npm 112 | 113 | ```bash 114 | npm install -g think-mcp-server 115 | ``` 116 | 117 | ### Claude Desktop 118 | 119 | Add the server config at: 120 | 121 | - MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json` 122 | - Windows: `%APPDATA%/Claude/claude_desktop_config.json` 123 | 124 | ```json 125 | { 126 | "mcpServers": { 127 | "think": { 128 | "command": "npx", 129 | "args": ["-y", "think-mcp-server"] 130 | } 131 | } 132 | } 133 | ``` 134 | 135 | ### Cline 136 | 137 | 1. Open the Cline extension settings 138 | 2. Open "MCP Servers" tab 139 | 3. Click on "Configure MCP Servers" 140 | 4. Add the server config: 141 | 142 | ```json 143 | { 144 | "mcpServers": { 145 | "github.com/marcopesani/think-mcp-server": { 146 | "command": "npx", 147 | "args": ["-y", "think-mcp-server"], 148 | "disabled": false, 149 | "autoApprove": ["think"] 150 | } 151 | } 152 | } 153 | ``` 154 | 155 | Additional Cline configuration options: 156 | - `disabled`: Set to false to enable the server 157 | - `autoApprove`: List of tools that don't require explicit approval for each use 158 | 159 | ### Cursor 160 | 161 | 1. Open the Cursor settings 162 | 2. Open "Features" settings 163 | 3. In the "MCP Servers" section, click on "Add new MCP Server" 164 | 4. Choose a name, and select "command" as "Type" 165 | 5. In the "Command" field, enter the following: 166 | ``` 167 | npx -y think-mcp-server 168 | ``` 169 | 170 | ### Docker 171 | 172 | You can also run the server using Docker. First, build the image: 173 | 174 | ```bash 175 | docker build -t think-mcp-server . 176 | ``` 177 | 178 | Then run the container: 179 | 180 | ```bash 181 | docker run -it think-mcp-server 182 | ``` 183 | 184 | For development, you might want to mount your source code as a volume: 185 | 186 | ```bash 187 | docker run -v $(pwd):/app think-mcp-server 188 | ``` 189 | 190 | ## Getting Started 191 | 192 | 1. Install the server using one of the methods above 193 | 2. Configure your AI client to use the think-mcp-server 194 | 3. In your prompts to Claude, include instructions for using the "think" tool 195 | 4. For best results, add examples of effective thinking patterns in your system prompt 196 | 197 | ## TypeScript Development Example 198 | 199 | Here's an example prompt focused on TypeScript development to help Claude leverage the "think" tool effectively: 200 | 201 | ``` 202 | ## Using the think tool for TypeScript Development 203 | 204 | Before implementing any TypeScript code or responding to technical questions, use the think tool to: 205 | - Analyze type definitions and interfaces that might be relevant 206 | - Check for potential type errors or edge cases 207 | - Reason through generics and type constraints 208 | - Verify the correct usage of TypeScript features 209 | 210 | Here's an example of TypeScript-specific reasoning with the think tool: 211 | 212 | 213 | User wants to implement a generic state management hook in React TypeScript 214 | - Analysis of requirements: 215 | * Need to handle any data type (generic typing) 216 | * Must preserve type information throughout state lifecycle 217 | * Should provide typesafe update methods 218 | * Need to consider immutability patterns 219 | 220 | - Type constraints to consider: 221 | * Should T extend object, or allow primitives? 222 | * Is Partial appropriate for updates? 223 | * Should we use Record as fallback? 224 | 225 | - Implementation considerations: 226 | * useState as foundation 227 | * Add typed setter methods that preserve generics 228 | * Consider callback pattern for atomic updates 229 | * Check for compatibility with React's rules of hooks 230 | 231 | - Approach: 232 | 1. Define generic interface for the hook's return value 233 | 2. Implement useState with proper generic typing 234 | 3. Create typed update methods that maintain type safety 235 | 4. Add JSDoc comments for better developer experience 236 | 5. Return immutable state with properly typed methods 237 | 238 | 239 | When helping with TypeScript challenges: 240 | 1. First analyze the type system implications 241 | 2. Consider TypeScript-specific edge cases 242 | 3. Reason through type narrowing and widening 243 | 4. Check for compatibility with the TypeScript compiler version 244 | 5. Consider type inference and explicit type annotations 245 | ``` 246 | 247 | ## Performance Benefits 248 | 249 | Anthropic's evaluations showed significant improvements when using the "think" tool: 250 | - 54% relative improvement on τ-Bench airline domain (pass^1 metric: 0.570 vs 0.370 baseline) 251 | - Improved performance on SWE-bench by 1.6% on average 252 | - Enhanced consistency across multiple trials 253 | 254 | ## References 255 | 256 | This implementation is based on Anthropic's research article "[The 'think' tool: Enabling Claude to stop and think in complex tool use situations](https://www.anthropic.com/engineering/claude-think-tool)" published March 20, 2025. 257 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "think-mcp-server", 3 | "version": "0.1.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "think-mcp-server", 9 | "version": "0.1.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.7.0", 13 | "zod": "^3.24.2" 14 | }, 15 | "bin": { 16 | "think-mcp-server": "build/index.js" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^20.11.24", 20 | "typescript": "^5.3.3" 21 | } 22 | }, 23 | "node_modules/@modelcontextprotocol/sdk": { 24 | "version": "1.7.0", 25 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.7.0.tgz", 26 | "integrity": "sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==", 27 | "license": "MIT", 28 | "dependencies": { 29 | "content-type": "^1.0.5", 30 | "cors": "^2.8.5", 31 | "eventsource": "^3.0.2", 32 | "express": "^5.0.1", 33 | "express-rate-limit": "^7.5.0", 34 | "pkce-challenge": "^4.1.0", 35 | "raw-body": "^3.0.0", 36 | "zod": "^3.23.8", 37 | "zod-to-json-schema": "^3.24.1" 38 | }, 39 | "engines": { 40 | "node": ">=18" 41 | } 42 | }, 43 | "node_modules/@types/node": { 44 | "version": "20.17.25", 45 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.25.tgz", 46 | "integrity": "sha512-bT+r2haIlplJUYtlZrEanFHdPIZTeiMeh/fSOEbOOfWf9uTn+lg8g0KU6Q3iMgjd9FLuuMAgfCNSkjUbxL6E3Q==", 47 | "dev": true, 48 | "license": "MIT", 49 | "dependencies": { 50 | "undici-types": "~6.19.2" 51 | } 52 | }, 53 | "node_modules/accepts": { 54 | "version": "2.0.0", 55 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 56 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 57 | "license": "MIT", 58 | "dependencies": { 59 | "mime-types": "^3.0.0", 60 | "negotiator": "^1.0.0" 61 | }, 62 | "engines": { 63 | "node": ">= 0.6" 64 | } 65 | }, 66 | "node_modules/body-parser": { 67 | "version": "2.1.0", 68 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", 69 | "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", 70 | "license": "MIT", 71 | "dependencies": { 72 | "bytes": "^3.1.2", 73 | "content-type": "^1.0.5", 74 | "debug": "^4.4.0", 75 | "http-errors": "^2.0.0", 76 | "iconv-lite": "^0.5.2", 77 | "on-finished": "^2.4.1", 78 | "qs": "^6.14.0", 79 | "raw-body": "^3.0.0", 80 | "type-is": "^2.0.0" 81 | }, 82 | "engines": { 83 | "node": ">=18" 84 | } 85 | }, 86 | "node_modules/body-parser/node_modules/debug": { 87 | "version": "4.4.0", 88 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 89 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 90 | "license": "MIT", 91 | "dependencies": { 92 | "ms": "^2.1.3" 93 | }, 94 | "engines": { 95 | "node": ">=6.0" 96 | }, 97 | "peerDependenciesMeta": { 98 | "supports-color": { 99 | "optional": true 100 | } 101 | } 102 | }, 103 | "node_modules/body-parser/node_modules/ms": { 104 | "version": "2.1.3", 105 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 106 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 107 | "license": "MIT" 108 | }, 109 | "node_modules/body-parser/node_modules/qs": { 110 | "version": "6.14.0", 111 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 112 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 113 | "license": "BSD-3-Clause", 114 | "dependencies": { 115 | "side-channel": "^1.1.0" 116 | }, 117 | "engines": { 118 | "node": ">=0.6" 119 | }, 120 | "funding": { 121 | "url": "https://github.com/sponsors/ljharb" 122 | } 123 | }, 124 | "node_modules/bytes": { 125 | "version": "3.1.2", 126 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 127 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 128 | "license": "MIT", 129 | "engines": { 130 | "node": ">= 0.8" 131 | } 132 | }, 133 | "node_modules/call-bind-apply-helpers": { 134 | "version": "1.0.2", 135 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 136 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 137 | "license": "MIT", 138 | "dependencies": { 139 | "es-errors": "^1.3.0", 140 | "function-bind": "^1.1.2" 141 | }, 142 | "engines": { 143 | "node": ">= 0.4" 144 | } 145 | }, 146 | "node_modules/call-bound": { 147 | "version": "1.0.4", 148 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 149 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 150 | "license": "MIT", 151 | "dependencies": { 152 | "call-bind-apply-helpers": "^1.0.2", 153 | "get-intrinsic": "^1.3.0" 154 | }, 155 | "engines": { 156 | "node": ">= 0.4" 157 | }, 158 | "funding": { 159 | "url": "https://github.com/sponsors/ljharb" 160 | } 161 | }, 162 | "node_modules/content-disposition": { 163 | "version": "1.0.0", 164 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 165 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 166 | "license": "MIT", 167 | "dependencies": { 168 | "safe-buffer": "5.2.1" 169 | }, 170 | "engines": { 171 | "node": ">= 0.6" 172 | } 173 | }, 174 | "node_modules/content-disposition/node_modules/safe-buffer": { 175 | "version": "5.2.1", 176 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 177 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 178 | "funding": [ 179 | { 180 | "type": "github", 181 | "url": "https://github.com/sponsors/feross" 182 | }, 183 | { 184 | "type": "patreon", 185 | "url": "https://www.patreon.com/feross" 186 | }, 187 | { 188 | "type": "consulting", 189 | "url": "https://feross.org/support" 190 | } 191 | ], 192 | "license": "MIT" 193 | }, 194 | "node_modules/content-type": { 195 | "version": "1.0.5", 196 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 197 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 198 | "license": "MIT", 199 | "engines": { 200 | "node": ">= 0.6" 201 | } 202 | }, 203 | "node_modules/cookie": { 204 | "version": "0.7.1", 205 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 206 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 207 | "license": "MIT", 208 | "engines": { 209 | "node": ">= 0.6" 210 | } 211 | }, 212 | "node_modules/cookie-signature": { 213 | "version": "1.2.2", 214 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 215 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 216 | "license": "MIT", 217 | "engines": { 218 | "node": ">=6.6.0" 219 | } 220 | }, 221 | "node_modules/cors": { 222 | "version": "2.8.5", 223 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 224 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 225 | "license": "MIT", 226 | "dependencies": { 227 | "object-assign": "^4", 228 | "vary": "^1" 229 | }, 230 | "engines": { 231 | "node": ">= 0.10" 232 | } 233 | }, 234 | "node_modules/debug": { 235 | "version": "4.3.6", 236 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 237 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 238 | "license": "MIT", 239 | "dependencies": { 240 | "ms": "2.1.2" 241 | }, 242 | "engines": { 243 | "node": ">=6.0" 244 | }, 245 | "peerDependenciesMeta": { 246 | "supports-color": { 247 | "optional": true 248 | } 249 | } 250 | }, 251 | "node_modules/depd": { 252 | "version": "2.0.0", 253 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 254 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 255 | "license": "MIT", 256 | "engines": { 257 | "node": ">= 0.8" 258 | } 259 | }, 260 | "node_modules/destroy": { 261 | "version": "1.2.0", 262 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 263 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 264 | "license": "MIT", 265 | "engines": { 266 | "node": ">= 0.8", 267 | "npm": "1.2.8000 || >= 1.4.16" 268 | } 269 | }, 270 | "node_modules/dunder-proto": { 271 | "version": "1.0.1", 272 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 273 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 274 | "license": "MIT", 275 | "dependencies": { 276 | "call-bind-apply-helpers": "^1.0.1", 277 | "es-errors": "^1.3.0", 278 | "gopd": "^1.2.0" 279 | }, 280 | "engines": { 281 | "node": ">= 0.4" 282 | } 283 | }, 284 | "node_modules/ee-first": { 285 | "version": "1.1.1", 286 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 287 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 288 | "license": "MIT" 289 | }, 290 | "node_modules/encodeurl": { 291 | "version": "2.0.0", 292 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 293 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 294 | "license": "MIT", 295 | "engines": { 296 | "node": ">= 0.8" 297 | } 298 | }, 299 | "node_modules/es-define-property": { 300 | "version": "1.0.1", 301 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 302 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 303 | "license": "MIT", 304 | "engines": { 305 | "node": ">= 0.4" 306 | } 307 | }, 308 | "node_modules/es-errors": { 309 | "version": "1.3.0", 310 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 311 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 312 | "license": "MIT", 313 | "engines": { 314 | "node": ">= 0.4" 315 | } 316 | }, 317 | "node_modules/es-object-atoms": { 318 | "version": "1.1.1", 319 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 320 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 321 | "license": "MIT", 322 | "dependencies": { 323 | "es-errors": "^1.3.0" 324 | }, 325 | "engines": { 326 | "node": ">= 0.4" 327 | } 328 | }, 329 | "node_modules/escape-html": { 330 | "version": "1.0.3", 331 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 332 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 333 | "license": "MIT" 334 | }, 335 | "node_modules/etag": { 336 | "version": "1.8.1", 337 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 338 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 339 | "license": "MIT", 340 | "engines": { 341 | "node": ">= 0.6" 342 | } 343 | }, 344 | "node_modules/eventsource": { 345 | "version": "3.0.5", 346 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz", 347 | "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==", 348 | "license": "MIT", 349 | "dependencies": { 350 | "eventsource-parser": "^3.0.0" 351 | }, 352 | "engines": { 353 | "node": ">=18.0.0" 354 | } 355 | }, 356 | "node_modules/eventsource-parser": { 357 | "version": "3.0.0", 358 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz", 359 | "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==", 360 | "license": "MIT", 361 | "engines": { 362 | "node": ">=18.0.0" 363 | } 364 | }, 365 | "node_modules/express": { 366 | "version": "5.0.1", 367 | "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", 368 | "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", 369 | "license": "MIT", 370 | "dependencies": { 371 | "accepts": "^2.0.0", 372 | "body-parser": "^2.0.1", 373 | "content-disposition": "^1.0.0", 374 | "content-type": "~1.0.4", 375 | "cookie": "0.7.1", 376 | "cookie-signature": "^1.2.1", 377 | "debug": "4.3.6", 378 | "depd": "2.0.0", 379 | "encodeurl": "~2.0.0", 380 | "escape-html": "~1.0.3", 381 | "etag": "~1.8.1", 382 | "finalhandler": "^2.0.0", 383 | "fresh": "2.0.0", 384 | "http-errors": "2.0.0", 385 | "merge-descriptors": "^2.0.0", 386 | "methods": "~1.1.2", 387 | "mime-types": "^3.0.0", 388 | "on-finished": "2.4.1", 389 | "once": "1.4.0", 390 | "parseurl": "~1.3.3", 391 | "proxy-addr": "~2.0.7", 392 | "qs": "6.13.0", 393 | "range-parser": "~1.2.1", 394 | "router": "^2.0.0", 395 | "safe-buffer": "5.2.1", 396 | "send": "^1.1.0", 397 | "serve-static": "^2.1.0", 398 | "setprototypeof": "1.2.0", 399 | "statuses": "2.0.1", 400 | "type-is": "^2.0.0", 401 | "utils-merge": "1.0.1", 402 | "vary": "~1.1.2" 403 | }, 404 | "engines": { 405 | "node": ">= 18" 406 | } 407 | }, 408 | "node_modules/express-rate-limit": { 409 | "version": "7.5.0", 410 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 411 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 412 | "license": "MIT", 413 | "engines": { 414 | "node": ">= 16" 415 | }, 416 | "funding": { 417 | "url": "https://github.com/sponsors/express-rate-limit" 418 | }, 419 | "peerDependencies": { 420 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 421 | } 422 | }, 423 | "node_modules/express/node_modules/safe-buffer": { 424 | "version": "5.2.1", 425 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 426 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 427 | "funding": [ 428 | { 429 | "type": "github", 430 | "url": "https://github.com/sponsors/feross" 431 | }, 432 | { 433 | "type": "patreon", 434 | "url": "https://www.patreon.com/feross" 435 | }, 436 | { 437 | "type": "consulting", 438 | "url": "https://feross.org/support" 439 | } 440 | ], 441 | "license": "MIT" 442 | }, 443 | "node_modules/finalhandler": { 444 | "version": "2.1.0", 445 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 446 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 447 | "license": "MIT", 448 | "dependencies": { 449 | "debug": "^4.4.0", 450 | "encodeurl": "^2.0.0", 451 | "escape-html": "^1.0.3", 452 | "on-finished": "^2.4.1", 453 | "parseurl": "^1.3.3", 454 | "statuses": "^2.0.1" 455 | }, 456 | "engines": { 457 | "node": ">= 0.8" 458 | } 459 | }, 460 | "node_modules/finalhandler/node_modules/debug": { 461 | "version": "4.4.0", 462 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 463 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 464 | "license": "MIT", 465 | "dependencies": { 466 | "ms": "^2.1.3" 467 | }, 468 | "engines": { 469 | "node": ">=6.0" 470 | }, 471 | "peerDependenciesMeta": { 472 | "supports-color": { 473 | "optional": true 474 | } 475 | } 476 | }, 477 | "node_modules/finalhandler/node_modules/ms": { 478 | "version": "2.1.3", 479 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 480 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 481 | "license": "MIT" 482 | }, 483 | "node_modules/forwarded": { 484 | "version": "0.2.0", 485 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 486 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 487 | "license": "MIT", 488 | "engines": { 489 | "node": ">= 0.6" 490 | } 491 | }, 492 | "node_modules/fresh": { 493 | "version": "2.0.0", 494 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 495 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 496 | "license": "MIT", 497 | "engines": { 498 | "node": ">= 0.8" 499 | } 500 | }, 501 | "node_modules/function-bind": { 502 | "version": "1.1.2", 503 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 504 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 505 | "license": "MIT", 506 | "funding": { 507 | "url": "https://github.com/sponsors/ljharb" 508 | } 509 | }, 510 | "node_modules/get-intrinsic": { 511 | "version": "1.3.0", 512 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 513 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 514 | "license": "MIT", 515 | "dependencies": { 516 | "call-bind-apply-helpers": "^1.0.2", 517 | "es-define-property": "^1.0.1", 518 | "es-errors": "^1.3.0", 519 | "es-object-atoms": "^1.1.1", 520 | "function-bind": "^1.1.2", 521 | "get-proto": "^1.0.1", 522 | "gopd": "^1.2.0", 523 | "has-symbols": "^1.1.0", 524 | "hasown": "^2.0.2", 525 | "math-intrinsics": "^1.1.0" 526 | }, 527 | "engines": { 528 | "node": ">= 0.4" 529 | }, 530 | "funding": { 531 | "url": "https://github.com/sponsors/ljharb" 532 | } 533 | }, 534 | "node_modules/get-proto": { 535 | "version": "1.0.1", 536 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 537 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 538 | "license": "MIT", 539 | "dependencies": { 540 | "dunder-proto": "^1.0.1", 541 | "es-object-atoms": "^1.0.0" 542 | }, 543 | "engines": { 544 | "node": ">= 0.4" 545 | } 546 | }, 547 | "node_modules/gopd": { 548 | "version": "1.2.0", 549 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 550 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 551 | "license": "MIT", 552 | "engines": { 553 | "node": ">= 0.4" 554 | }, 555 | "funding": { 556 | "url": "https://github.com/sponsors/ljharb" 557 | } 558 | }, 559 | "node_modules/has-symbols": { 560 | "version": "1.1.0", 561 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 562 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 563 | "license": "MIT", 564 | "engines": { 565 | "node": ">= 0.4" 566 | }, 567 | "funding": { 568 | "url": "https://github.com/sponsors/ljharb" 569 | } 570 | }, 571 | "node_modules/hasown": { 572 | "version": "2.0.2", 573 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 574 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 575 | "license": "MIT", 576 | "dependencies": { 577 | "function-bind": "^1.1.2" 578 | }, 579 | "engines": { 580 | "node": ">= 0.4" 581 | } 582 | }, 583 | "node_modules/http-errors": { 584 | "version": "2.0.0", 585 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 586 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 587 | "license": "MIT", 588 | "dependencies": { 589 | "depd": "2.0.0", 590 | "inherits": "2.0.4", 591 | "setprototypeof": "1.2.0", 592 | "statuses": "2.0.1", 593 | "toidentifier": "1.0.1" 594 | }, 595 | "engines": { 596 | "node": ">= 0.8" 597 | } 598 | }, 599 | "node_modules/iconv-lite": { 600 | "version": "0.5.2", 601 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", 602 | "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", 603 | "license": "MIT", 604 | "dependencies": { 605 | "safer-buffer": ">= 2.1.2 < 3" 606 | }, 607 | "engines": { 608 | "node": ">=0.10.0" 609 | } 610 | }, 611 | "node_modules/inherits": { 612 | "version": "2.0.4", 613 | "license": "ISC" 614 | }, 615 | "node_modules/ipaddr.js": { 616 | "version": "1.9.1", 617 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 618 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 619 | "license": "MIT", 620 | "engines": { 621 | "node": ">= 0.10" 622 | } 623 | }, 624 | "node_modules/is-promise": { 625 | "version": "4.0.0", 626 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 627 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 628 | "license": "MIT" 629 | }, 630 | "node_modules/math-intrinsics": { 631 | "version": "1.1.0", 632 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 633 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 634 | "license": "MIT", 635 | "engines": { 636 | "node": ">= 0.4" 637 | } 638 | }, 639 | "node_modules/media-typer": { 640 | "version": "1.1.0", 641 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 642 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 643 | "license": "MIT", 644 | "engines": { 645 | "node": ">= 0.8" 646 | } 647 | }, 648 | "node_modules/merge-descriptors": { 649 | "version": "2.0.0", 650 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 651 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 652 | "license": "MIT", 653 | "engines": { 654 | "node": ">=18" 655 | }, 656 | "funding": { 657 | "url": "https://github.com/sponsors/sindresorhus" 658 | } 659 | }, 660 | "node_modules/methods": { 661 | "version": "1.1.2", 662 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 663 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 664 | "license": "MIT", 665 | "engines": { 666 | "node": ">= 0.6" 667 | } 668 | }, 669 | "node_modules/mime-db": { 670 | "version": "1.54.0", 671 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 672 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 673 | "license": "MIT", 674 | "engines": { 675 | "node": ">= 0.6" 676 | } 677 | }, 678 | "node_modules/mime-types": { 679 | "version": "3.0.0", 680 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", 681 | "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", 682 | "license": "MIT", 683 | "dependencies": { 684 | "mime-db": "^1.53.0" 685 | }, 686 | "engines": { 687 | "node": ">= 0.6" 688 | } 689 | }, 690 | "node_modules/ms": { 691 | "version": "2.1.2", 692 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 693 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 694 | "license": "MIT" 695 | }, 696 | "node_modules/negotiator": { 697 | "version": "1.0.0", 698 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 699 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 700 | "license": "MIT", 701 | "engines": { 702 | "node": ">= 0.6" 703 | } 704 | }, 705 | "node_modules/object-assign": { 706 | "version": "4.1.1", 707 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 708 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 709 | "license": "MIT", 710 | "engines": { 711 | "node": ">=0.10.0" 712 | } 713 | }, 714 | "node_modules/object-inspect": { 715 | "version": "1.13.4", 716 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 717 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 718 | "license": "MIT", 719 | "engines": { 720 | "node": ">= 0.4" 721 | }, 722 | "funding": { 723 | "url": "https://github.com/sponsors/ljharb" 724 | } 725 | }, 726 | "node_modules/on-finished": { 727 | "version": "2.4.1", 728 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 729 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 730 | "license": "MIT", 731 | "dependencies": { 732 | "ee-first": "1.1.1" 733 | }, 734 | "engines": { 735 | "node": ">= 0.8" 736 | } 737 | }, 738 | "node_modules/once": { 739 | "version": "1.4.0", 740 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 741 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 742 | "license": "ISC", 743 | "dependencies": { 744 | "wrappy": "1" 745 | } 746 | }, 747 | "node_modules/parseurl": { 748 | "version": "1.3.3", 749 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 750 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 751 | "license": "MIT", 752 | "engines": { 753 | "node": ">= 0.8" 754 | } 755 | }, 756 | "node_modules/path-to-regexp": { 757 | "version": "8.2.0", 758 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 759 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 760 | "license": "MIT", 761 | "engines": { 762 | "node": ">=16" 763 | } 764 | }, 765 | "node_modules/pkce-challenge": { 766 | "version": "4.1.0", 767 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-4.1.0.tgz", 768 | "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", 769 | "license": "MIT", 770 | "engines": { 771 | "node": ">=16.20.0" 772 | } 773 | }, 774 | "node_modules/proxy-addr": { 775 | "version": "2.0.7", 776 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 777 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 778 | "license": "MIT", 779 | "dependencies": { 780 | "forwarded": "0.2.0", 781 | "ipaddr.js": "1.9.1" 782 | }, 783 | "engines": { 784 | "node": ">= 0.10" 785 | } 786 | }, 787 | "node_modules/qs": { 788 | "version": "6.13.0", 789 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 790 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 791 | "license": "BSD-3-Clause", 792 | "dependencies": { 793 | "side-channel": "^1.0.6" 794 | }, 795 | "engines": { 796 | "node": ">=0.6" 797 | }, 798 | "funding": { 799 | "url": "https://github.com/sponsors/ljharb" 800 | } 801 | }, 802 | "node_modules/range-parser": { 803 | "version": "1.2.1", 804 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 805 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 806 | "license": "MIT", 807 | "engines": { 808 | "node": ">= 0.6" 809 | } 810 | }, 811 | "node_modules/raw-body": { 812 | "version": "3.0.0", 813 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 814 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 815 | "license": "MIT", 816 | "dependencies": { 817 | "bytes": "3.1.2", 818 | "http-errors": "2.0.0", 819 | "iconv-lite": "0.6.3", 820 | "unpipe": "1.0.0" 821 | }, 822 | "engines": { 823 | "node": ">= 0.8" 824 | } 825 | }, 826 | "node_modules/raw-body/node_modules/iconv-lite": { 827 | "version": "0.6.3", 828 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 829 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 830 | "license": "MIT", 831 | "dependencies": { 832 | "safer-buffer": ">= 2.1.2 < 3.0.0" 833 | }, 834 | "engines": { 835 | "node": ">=0.10.0" 836 | } 837 | }, 838 | "node_modules/router": { 839 | "version": "2.1.0", 840 | "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", 841 | "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", 842 | "license": "MIT", 843 | "dependencies": { 844 | "is-promise": "^4.0.0", 845 | "parseurl": "^1.3.3", 846 | "path-to-regexp": "^8.0.0" 847 | }, 848 | "engines": { 849 | "node": ">= 18" 850 | } 851 | }, 852 | "node_modules/safer-buffer": { 853 | "version": "2.1.2", 854 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 855 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 856 | "license": "MIT" 857 | }, 858 | "node_modules/send": { 859 | "version": "1.1.0", 860 | "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", 861 | "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", 862 | "license": "MIT", 863 | "dependencies": { 864 | "debug": "^4.3.5", 865 | "destroy": "^1.2.0", 866 | "encodeurl": "^2.0.0", 867 | "escape-html": "^1.0.3", 868 | "etag": "^1.8.1", 869 | "fresh": "^0.5.2", 870 | "http-errors": "^2.0.0", 871 | "mime-types": "^2.1.35", 872 | "ms": "^2.1.3", 873 | "on-finished": "^2.4.1", 874 | "range-parser": "^1.2.1", 875 | "statuses": "^2.0.1" 876 | }, 877 | "engines": { 878 | "node": ">= 18" 879 | } 880 | }, 881 | "node_modules/send/node_modules/fresh": { 882 | "version": "0.5.2", 883 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 884 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 885 | "license": "MIT", 886 | "engines": { 887 | "node": ">= 0.6" 888 | } 889 | }, 890 | "node_modules/send/node_modules/mime-db": { 891 | "version": "1.52.0", 892 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 893 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 894 | "license": "MIT", 895 | "engines": { 896 | "node": ">= 0.6" 897 | } 898 | }, 899 | "node_modules/send/node_modules/mime-types": { 900 | "version": "2.1.35", 901 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 902 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 903 | "license": "MIT", 904 | "dependencies": { 905 | "mime-db": "1.52.0" 906 | }, 907 | "engines": { 908 | "node": ">= 0.6" 909 | } 910 | }, 911 | "node_modules/send/node_modules/ms": { 912 | "version": "2.1.3", 913 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 914 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 915 | "license": "MIT" 916 | }, 917 | "node_modules/serve-static": { 918 | "version": "2.1.0", 919 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", 920 | "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", 921 | "license": "MIT", 922 | "dependencies": { 923 | "encodeurl": "^2.0.0", 924 | "escape-html": "^1.0.3", 925 | "parseurl": "^1.3.3", 926 | "send": "^1.0.0" 927 | }, 928 | "engines": { 929 | "node": ">= 18" 930 | } 931 | }, 932 | "node_modules/setprototypeof": { 933 | "version": "1.2.0", 934 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 935 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 936 | "license": "ISC" 937 | }, 938 | "node_modules/side-channel": { 939 | "version": "1.1.0", 940 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 941 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 942 | "license": "MIT", 943 | "dependencies": { 944 | "es-errors": "^1.3.0", 945 | "object-inspect": "^1.13.3", 946 | "side-channel-list": "^1.0.0", 947 | "side-channel-map": "^1.0.1", 948 | "side-channel-weakmap": "^1.0.2" 949 | }, 950 | "engines": { 951 | "node": ">= 0.4" 952 | }, 953 | "funding": { 954 | "url": "https://github.com/sponsors/ljharb" 955 | } 956 | }, 957 | "node_modules/side-channel-list": { 958 | "version": "1.0.0", 959 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 960 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 961 | "license": "MIT", 962 | "dependencies": { 963 | "es-errors": "^1.3.0", 964 | "object-inspect": "^1.13.3" 965 | }, 966 | "engines": { 967 | "node": ">= 0.4" 968 | }, 969 | "funding": { 970 | "url": "https://github.com/sponsors/ljharb" 971 | } 972 | }, 973 | "node_modules/side-channel-map": { 974 | "version": "1.0.1", 975 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 976 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 977 | "license": "MIT", 978 | "dependencies": { 979 | "call-bound": "^1.0.2", 980 | "es-errors": "^1.3.0", 981 | "get-intrinsic": "^1.2.5", 982 | "object-inspect": "^1.13.3" 983 | }, 984 | "engines": { 985 | "node": ">= 0.4" 986 | }, 987 | "funding": { 988 | "url": "https://github.com/sponsors/ljharb" 989 | } 990 | }, 991 | "node_modules/side-channel-weakmap": { 992 | "version": "1.0.2", 993 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 994 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 995 | "license": "MIT", 996 | "dependencies": { 997 | "call-bound": "^1.0.2", 998 | "es-errors": "^1.3.0", 999 | "get-intrinsic": "^1.2.5", 1000 | "object-inspect": "^1.13.3", 1001 | "side-channel-map": "^1.0.1" 1002 | }, 1003 | "engines": { 1004 | "node": ">= 0.4" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/ljharb" 1008 | } 1009 | }, 1010 | "node_modules/statuses": { 1011 | "version": "2.0.1", 1012 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1013 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1014 | "license": "MIT", 1015 | "engines": { 1016 | "node": ">= 0.8" 1017 | } 1018 | }, 1019 | "node_modules/toidentifier": { 1020 | "version": "1.0.1", 1021 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1022 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1023 | "license": "MIT", 1024 | "engines": { 1025 | "node": ">=0.6" 1026 | } 1027 | }, 1028 | "node_modules/type-is": { 1029 | "version": "2.0.0", 1030 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", 1031 | "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", 1032 | "license": "MIT", 1033 | "dependencies": { 1034 | "content-type": "^1.0.5", 1035 | "media-typer": "^1.1.0", 1036 | "mime-types": "^3.0.0" 1037 | }, 1038 | "engines": { 1039 | "node": ">= 0.6" 1040 | } 1041 | }, 1042 | "node_modules/typescript": { 1043 | "version": "5.8.2", 1044 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1045 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1046 | "dev": true, 1047 | "license": "Apache-2.0", 1048 | "bin": { 1049 | "tsc": "bin/tsc", 1050 | "tsserver": "bin/tsserver" 1051 | }, 1052 | "engines": { 1053 | "node": ">=14.17" 1054 | } 1055 | }, 1056 | "node_modules/undici-types": { 1057 | "version": "6.19.8", 1058 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1059 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1060 | "dev": true, 1061 | "license": "MIT" 1062 | }, 1063 | "node_modules/unpipe": { 1064 | "version": "1.0.0", 1065 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1066 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1067 | "license": "MIT", 1068 | "engines": { 1069 | "node": ">= 0.8" 1070 | } 1071 | }, 1072 | "node_modules/utils-merge": { 1073 | "version": "1.0.1", 1074 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1075 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1076 | "license": "MIT", 1077 | "engines": { 1078 | "node": ">= 0.4.0" 1079 | } 1080 | }, 1081 | "node_modules/vary": { 1082 | "version": "1.1.2", 1083 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1084 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1085 | "license": "MIT", 1086 | "engines": { 1087 | "node": ">= 0.8" 1088 | } 1089 | }, 1090 | "node_modules/wrappy": { 1091 | "version": "1.0.2", 1092 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1093 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1094 | "license": "ISC" 1095 | }, 1096 | "node_modules/zod": { 1097 | "version": "3.24.2", 1098 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 1099 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 1100 | "license": "MIT", 1101 | "funding": { 1102 | "url": "https://github.com/sponsors/colinhacks" 1103 | } 1104 | }, 1105 | "node_modules/zod-to-json-schema": { 1106 | "version": "3.24.5", 1107 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", 1108 | "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", 1109 | "license": "ISC", 1110 | "peerDependencies": { 1111 | "zod": "^3.24.1" 1112 | } 1113 | } 1114 | } 1115 | } 1116 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "think-mcp-server", 3 | "version": "0.1.1", 4 | "description": "A minimal MCP Server based on the Anthropic's \"think\" tool research", 5 | "keywords": [ 6 | "think", 7 | "anthropic", 8 | "ai", 9 | "agent", 10 | "mcp", 11 | "model context protocol" 12 | ], 13 | "author": "Marco Pesani ", 14 | "license": "MIT", 15 | "type": "module", 16 | "bin": { 17 | "think-mcp-server": "./build/index.js" 18 | }, 19 | "files": [ 20 | "build" 21 | ], 22 | "scripts": { 23 | "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", 24 | "prepare": "npm run build", 25 | "watch": "tsc --watch", 26 | "inspector": "npx @modelcontextprotocol/inspector build/index.js" 27 | }, 28 | "dependencies": { 29 | "@modelcontextprotocol/sdk": "^1.7.0", 30 | "zod": "^3.24.2" 31 | }, 32 | "devDependencies": { 33 | "@types/node": "^20.11.24", 34 | "typescript": "^5.3.3" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /smithery.yaml: -------------------------------------------------------------------------------- 1 | # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml 2 | 3 | startCommand: 4 | type: stdio 5 | configSchema: 6 | # JSON Schema defining the configuration options for the MCP. 7 | {} 8 | commandFunction: 9 | # A function that produces the CLI command to start the MCP on stdio. 10 | |- 11 | (config) => ({ 12 | "command": "node", 13 | "args": [ 14 | "build/index.js" 15 | ] 16 | }) 17 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 2 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 3 | import { z } from "zod"; 4 | 5 | // Create an MCP server 6 | const server = new McpServer({ 7 | name: "Think MCP Server", 8 | version: "0.1.0", 9 | }); 10 | 11 | // Add the "think" tool 12 | server.tool( 13 | "think", 14 | "Use the tool to think about something. It will not obtain new information or change the database, " + 15 | "but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.", 16 | { 17 | thought: z.string().describe("A thought to think about."), 18 | }, 19 | async () => { 20 | const encouragements = [ 21 | "Great thinking.", 22 | "Excellent reflection.", 23 | "Insightful thinking process.", 24 | ]; 25 | const randomEncouragement = 26 | encouragements[Math.floor(Math.random() * encouragements.length)]; 27 | 28 | return { 29 | content: [{ type: "text", text: randomEncouragement }], 30 | }; 31 | } 32 | ); 33 | 34 | // Start receiving messages on stdin and sending messages on stdout 35 | const transport = new StdioServerTransport(); 36 | server.connect(transport).then(() => { 37 | console.log("Server started"); 38 | }); 39 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "outDir": "./build", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "include": ["src/**/*"], 14 | "exclude": ["node_modules"] 15 | } 16 | --------------------------------------------------------------------------------