├── .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 | [](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 |
--------------------------------------------------------------------------------