├── .github └── workflows │ └── stale.yaml ├── .gitignore ├── LICENSE ├── README.md ├── next-env.d.ts ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── app │ ├── api │ │ └── mcp │ │ │ └── [...all] │ │ │ └── route.ts │ ├── globals.css │ ├── layout.tsx │ └── page.tsx ├── index.test.ts ├── index.ts └── server.ts ├── tsconfig.json └── tsconfig.stdio.json /.github/workflows/stale.yaml: -------------------------------------------------------------------------------- 1 | ##################################### 2 | # DO NOT EDIT DIRECTLY. # 3 | # This file is managed by Terraform # 4 | ##################################### 5 | 6 | name: "Close stale PRs" 7 | on: 8 | schedule: 9 | - cron: "30 1 * * *" 10 | 11 | jobs: 12 | stale: 13 | runs-on: ubuntu-latest 14 | # Read repo and write to PRs 15 | permissions: 16 | contents: read 17 | pull-requests: write 18 | issues: write 19 | steps: 20 | - uses: actions/stale@v9 21 | with: 22 | stale-pr-message: "This PR is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 7 days." 23 | close-pr-message: "This PR was closed because it has been stalled for 7 days with no activity." 24 | days-before-pr-stale: 30 25 | days-before-pr-close: 7 26 | exempt-pr-labels: "dependencies,security" 27 | operations-per-run: 60 # Default is 30 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules/ 3 | package-lock.json 4 | 5 | # Build output 6 | build/ 7 | dist/ 8 | 9 | # Environment variables 10 | .env 11 | .env.local 12 | .env.*.local 13 | 14 | # IDE and editor files 15 | .vscode/ 16 | .idea/ 17 | *.swp 18 | *.swo 19 | .DS_Store 20 | 21 | # Logs 22 | logs/ 23 | *.log 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # Test coverage 29 | coverage/ 30 | 31 | # Temporary files 32 | tmp/ 33 | temp/ 34 | 35 | .next/ 36 | .vercel/ 37 | .vercel/cache/ 38 | .vercel/output/ 39 | .vercel/output/static/ 40 | .vercel/output/standalone/ 41 | 42 | *.tsbuildinfo -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Groq, Inc. 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # groq-compound-mcp-server 2 | 3 | Provides a Model Context Protocol (MCP) server for interacting with Groq models, including compound/meta models. 4 | 5 | This server exposes the following tools: 6 | * `ask_with_realtime_information` 7 | * `ask_with_code_execution` 8 | 9 | ## Prerequisites 10 | 11 | * Node.js >= 18.0.0 12 | * A Groq API key set in the `GROQ_API_KEY` environment variable. 13 | 14 | ## Installation 15 | 16 | ```bash 17 | npm install groq-compound-mcp-server 18 | ``` 19 | 20 | ## Usage 21 | 22 | This server follows the standard MCP server pattern using stdio for transport. It's designed to be run by an MCP client (like Claude Desktop or a custom client). 23 | 24 | Refer to the official [MCP Quickstart for Server Developers](https://modelcontextprotocol.io/quickstart/server) for instructions on setting up and connecting MCP servers. 25 | 26 | When configuring your client, use the command `npx groq-compound-mcp-server` or `groq-compound-mcp-server` (if installed globally) to run this server. 27 | 28 | Here's an example of how you might configure an MCP client (e.g., in a `settings.json` file) to launch this server: 29 | 30 | ```json 31 | { 32 | "mcpServers": { 33 | "groq-compound": { 34 | "command": "npx", 35 | "args": [ 36 | "-y", 37 | "groq-compound-mcp-server" 38 | ], 39 | "env": { 40 | "GROQ_API_KEY": "YOUR_GROQ_API_KEY_HERE" 41 | } 42 | } 43 | } 44 | } 45 | ``` 46 | 47 | ## Hosting on Vercel 48 | 49 | This server can also be deployed to Vercel. 50 | 51 | 1. **Prerequisites**: 52 | * Ensure you have a Vercel account. 53 | * Connect your Git repository to Vercel. 54 | 55 | 2. **Environment Variables**: 56 | Set the following environment variables in your Vercel project settings: 57 | * `GROQ_API_KEY`: Your Groq API key. 58 | * `REDIS_URL`: (Recommended for SSE transport) The connection URL for a Redis instance (e.g., from Vercel KV or Upstash). 59 | 60 | 3. **Build Configuration**: 61 | Vercel should automatically detect it as a Next.js application. The build command `npm run build:vercel` (or `yarn build:vercel`/`pnpm build:vercel`) and the output directory (`.next`) will be used. 62 | 63 | 4. **Accessing the MCP Server**: 64 | Once deployed, your MCP server endpoints will be available at `https://your-deployment-url.vercel.app/api/mcp`. 65 | For example, the SSE endpoint would be `https://your-deployment-url.vercel.app/api/mcp/sse`. 66 | 67 | ## Development with Vercel CLI 68 | 69 | To run the Vercel deployment locally: 70 | 71 | 1. Install Vercel CLI: `npm install -g vercel` 72 | 2. Set up environment variables locally (e.g., in a `.env.local` file at the project root): 73 | ``` 74 | GROQ_API_KEY=your_groq_api_key 75 | REDIS_URL=your_redis_url 76 | ``` 77 | 3. Run the development server: `vercel dev` or `npm run dev:vercel`. 78 | 79 | ## License 80 | 81 | [MIT](LICENSE) 82 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | // Your Next.js configuration options go here. 4 | // For example, to enable experimental features or set up rewrites/redirects. 5 | // We might need to add specific configurations later if required for MCP. 6 | reactStrictMode: true, 7 | }; 8 | 9 | export default nextConfig; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "groq-compound-mcp-server", 3 | "version": "0.1.7", 4 | "description": "MCP server for interacting with Groq models", 5 | "main": "build/index.js", 6 | "type": "module", 7 | "bin": { 8 | "groq-compound-mcp-server": "build/index.js" 9 | }, 10 | "scripts": { 11 | "build": "next build && tsc -p tsconfig.stdio.json && chmod 755 build/index.js", 12 | "test": "tsx --test src/**/*.test.ts", 13 | "dev:vercel": "next dev", 14 | "build:vercel": "next build", 15 | "start:vercel": "next start" 16 | }, 17 | "keywords": [ 18 | "mcp", 19 | "groq", 20 | "compound" 21 | ], 22 | "author": "Rick Lamers", 23 | "license": "MIT", 24 | "repository": { 25 | "type": "git", 26 | "url": "git+https://github.com/groq/compound-mcp-server.git" 27 | }, 28 | "bugs": { 29 | "url": "https://github.com/groq/compound-mcp-server/issues" 30 | }, 31 | "homepage": "https://github.com/groq/compound-mcp-server#readme", 32 | "files": [ 33 | "build" 34 | ], 35 | "engines": { 36 | "node": ">=18.0.0" 37 | }, 38 | "dependencies": { 39 | "@modelcontextprotocol/sdk": "1.10.2", 40 | "groq-sdk": "^0.3.3", 41 | "zod": "^3.23.8", 42 | "@vercel/mcp-adapter": "^0.3.1", 43 | "next": "^14.2.3", 44 | "redis": "^4.6.13" 45 | }, 46 | "devDependencies": { 47 | "@types/node": "^20.12.12", 48 | "@types/react": "^18.3.3", 49 | "tsx": "^4.19.3", 50 | "typescript": "^5.4.5" 51 | }, 52 | "packageManager": "pnpm@10.9.0+sha512.0486e394640d3c1fb3c9d43d49cf92879ff74f8516959c235308f5a8f62e2e19528a65cdc2a3058f587cde71eba3d5b56327c8c33a97e4c4051ca48a10ca2d5f" 53 | } 54 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@modelcontextprotocol/sdk': 12 | specifier: 1.10.2 13 | version: 1.10.2 14 | '@vercel/mcp-adapter': 15 | specifier: ^0.3.1 16 | version: 0.3.1(next@14.2.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) 17 | groq-sdk: 18 | specifier: ^0.3.3 19 | version: 0.3.3 20 | next: 21 | specifier: ^14.2.3 22 | version: 14.2.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 23 | redis: 24 | specifier: ^4.6.13 25 | version: 4.7.1 26 | zod: 27 | specifier: ^3.23.8 28 | version: 3.24.4 29 | devDependencies: 30 | '@types/node': 31 | specifier: ^20.12.12 32 | version: 20.17.46 33 | '@types/react': 34 | specifier: ^18.3.3 35 | version: 18.3.21 36 | tsx: 37 | specifier: ^4.19.3 38 | version: 4.19.4 39 | typescript: 40 | specifier: ^5.4.5 41 | version: 5.8.3 42 | 43 | packages: 44 | 45 | '@esbuild/aix-ppc64@0.25.4': 46 | resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 47 | engines: {node: '>=18'} 48 | cpu: [ppc64] 49 | os: [aix] 50 | 51 | '@esbuild/android-arm64@0.25.4': 52 | resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 53 | engines: {node: '>=18'} 54 | cpu: [arm64] 55 | os: [android] 56 | 57 | '@esbuild/android-arm@0.25.4': 58 | resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 59 | engines: {node: '>=18'} 60 | cpu: [arm] 61 | os: [android] 62 | 63 | '@esbuild/android-x64@0.25.4': 64 | resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 65 | engines: {node: '>=18'} 66 | cpu: [x64] 67 | os: [android] 68 | 69 | '@esbuild/darwin-arm64@0.25.4': 70 | resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 71 | engines: {node: '>=18'} 72 | cpu: [arm64] 73 | os: [darwin] 74 | 75 | '@esbuild/darwin-x64@0.25.4': 76 | resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 77 | engines: {node: '>=18'} 78 | cpu: [x64] 79 | os: [darwin] 80 | 81 | '@esbuild/freebsd-arm64@0.25.4': 82 | resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 83 | engines: {node: '>=18'} 84 | cpu: [arm64] 85 | os: [freebsd] 86 | 87 | '@esbuild/freebsd-x64@0.25.4': 88 | resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 89 | engines: {node: '>=18'} 90 | cpu: [x64] 91 | os: [freebsd] 92 | 93 | '@esbuild/linux-arm64@0.25.4': 94 | resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 95 | engines: {node: '>=18'} 96 | cpu: [arm64] 97 | os: [linux] 98 | 99 | '@esbuild/linux-arm@0.25.4': 100 | resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 101 | engines: {node: '>=18'} 102 | cpu: [arm] 103 | os: [linux] 104 | 105 | '@esbuild/linux-ia32@0.25.4': 106 | resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 107 | engines: {node: '>=18'} 108 | cpu: [ia32] 109 | os: [linux] 110 | 111 | '@esbuild/linux-loong64@0.25.4': 112 | resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 113 | engines: {node: '>=18'} 114 | cpu: [loong64] 115 | os: [linux] 116 | 117 | '@esbuild/linux-mips64el@0.25.4': 118 | resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 119 | engines: {node: '>=18'} 120 | cpu: [mips64el] 121 | os: [linux] 122 | 123 | '@esbuild/linux-ppc64@0.25.4': 124 | resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 125 | engines: {node: '>=18'} 126 | cpu: [ppc64] 127 | os: [linux] 128 | 129 | '@esbuild/linux-riscv64@0.25.4': 130 | resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 131 | engines: {node: '>=18'} 132 | cpu: [riscv64] 133 | os: [linux] 134 | 135 | '@esbuild/linux-s390x@0.25.4': 136 | resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 137 | engines: {node: '>=18'} 138 | cpu: [s390x] 139 | os: [linux] 140 | 141 | '@esbuild/linux-x64@0.25.4': 142 | resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 143 | engines: {node: '>=18'} 144 | cpu: [x64] 145 | os: [linux] 146 | 147 | '@esbuild/netbsd-arm64@0.25.4': 148 | resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 149 | engines: {node: '>=18'} 150 | cpu: [arm64] 151 | os: [netbsd] 152 | 153 | '@esbuild/netbsd-x64@0.25.4': 154 | resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 155 | engines: {node: '>=18'} 156 | cpu: [x64] 157 | os: [netbsd] 158 | 159 | '@esbuild/openbsd-arm64@0.25.4': 160 | resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 161 | engines: {node: '>=18'} 162 | cpu: [arm64] 163 | os: [openbsd] 164 | 165 | '@esbuild/openbsd-x64@0.25.4': 166 | resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 167 | engines: {node: '>=18'} 168 | cpu: [x64] 169 | os: [openbsd] 170 | 171 | '@esbuild/sunos-x64@0.25.4': 172 | resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 173 | engines: {node: '>=18'} 174 | cpu: [x64] 175 | os: [sunos] 176 | 177 | '@esbuild/win32-arm64@0.25.4': 178 | resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 179 | engines: {node: '>=18'} 180 | cpu: [arm64] 181 | os: [win32] 182 | 183 | '@esbuild/win32-ia32@0.25.4': 184 | resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 185 | engines: {node: '>=18'} 186 | cpu: [ia32] 187 | os: [win32] 188 | 189 | '@esbuild/win32-x64@0.25.4': 190 | resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 191 | engines: {node: '>=18'} 192 | cpu: [x64] 193 | os: [win32] 194 | 195 | '@modelcontextprotocol/sdk@1.10.2': 196 | resolution: {integrity: sha512-rb6AMp2DR4SN+kc6L1ta2NCpApyA9WYNx3CrTSZvGxq9wH71bRur+zRqPfg0vQ9mjywR7qZdX2RGHOPq3ss+tA==} 197 | engines: {node: '>=18'} 198 | 199 | '@next/env@14.2.28': 200 | resolution: {integrity: sha512-PAmWhJfJQlP+kxZwCjrVd9QnR5x0R3u0mTXTiZDgSd4h5LdXmjxCCWbN9kq6hkZBOax8Rm3xDW5HagWyJuT37g==} 201 | 202 | '@next/swc-darwin-arm64@14.2.28': 203 | resolution: {integrity: sha512-kzGChl9setxYWpk3H6fTZXXPFFjg7urptLq5o5ZgYezCrqlemKttwMT5iFyx/p1e/JeglTwDFRtb923gTJ3R1w==} 204 | engines: {node: '>= 10'} 205 | cpu: [arm64] 206 | os: [darwin] 207 | 208 | '@next/swc-darwin-x64@14.2.28': 209 | resolution: {integrity: sha512-z6FXYHDJlFOzVEOiiJ/4NG8aLCeayZdcRSMjPDysW297Up6r22xw6Ea9AOwQqbNsth8JNgIK8EkWz2IDwaLQcw==} 210 | engines: {node: '>= 10'} 211 | cpu: [x64] 212 | os: [darwin] 213 | 214 | '@next/swc-linux-arm64-gnu@14.2.28': 215 | resolution: {integrity: sha512-9ARHLEQXhAilNJ7rgQX8xs9aH3yJSj888ssSjJLeldiZKR4D7N08MfMqljk77fAwZsWwsrp8ohHsMvurvv9liQ==} 216 | engines: {node: '>= 10'} 217 | cpu: [arm64] 218 | os: [linux] 219 | 220 | '@next/swc-linux-arm64-musl@14.2.28': 221 | resolution: {integrity: sha512-p6gvatI1nX41KCizEe6JkF0FS/cEEF0u23vKDpl+WhPe/fCTBeGkEBh7iW2cUM0rvquPVwPWdiUR6Ebr/kQWxQ==} 222 | engines: {node: '>= 10'} 223 | cpu: [arm64] 224 | os: [linux] 225 | 226 | '@next/swc-linux-x64-gnu@14.2.28': 227 | resolution: {integrity: sha512-nsiSnz2wO6GwMAX2o0iucONlVL7dNgKUqt/mDTATGO2NY59EO/ZKnKEr80BJFhuA5UC1KZOMblJHWZoqIJddpA==} 228 | engines: {node: '>= 10'} 229 | cpu: [x64] 230 | os: [linux] 231 | 232 | '@next/swc-linux-x64-musl@14.2.28': 233 | resolution: {integrity: sha512-+IuGQKoI3abrXFqx7GtlvNOpeExUH1mTIqCrh1LGFf8DnlUcTmOOCApEnPJUSLrSbzOdsF2ho2KhnQoO0I1RDw==} 234 | engines: {node: '>= 10'} 235 | cpu: [x64] 236 | os: [linux] 237 | 238 | '@next/swc-win32-arm64-msvc@14.2.28': 239 | resolution: {integrity: sha512-l61WZ3nevt4BAnGksUVFKy2uJP5DPz2E0Ma/Oklvo3sGj9sw3q7vBWONFRgz+ICiHpW5mV+mBrkB3XEubMrKaA==} 240 | engines: {node: '>= 10'} 241 | cpu: [arm64] 242 | os: [win32] 243 | 244 | '@next/swc-win32-ia32-msvc@14.2.28': 245 | resolution: {integrity: sha512-+Kcp1T3jHZnJ9v9VTJ/yf1t/xmtFAc/Sge4v7mVc1z+NYfYzisi8kJ9AsY8itbgq+WgEwMtOpiLLJsUy2qnXZw==} 246 | engines: {node: '>= 10'} 247 | cpu: [ia32] 248 | os: [win32] 249 | 250 | '@next/swc-win32-x64-msvc@14.2.28': 251 | resolution: {integrity: sha512-1gCmpvyhz7DkB1srRItJTnmR2UwQPAUXXIg9r0/56g3O8etGmwlX68skKXJOp9EejW3hhv7nSQUJ2raFiz4MoA==} 252 | engines: {node: '>= 10'} 253 | cpu: [x64] 254 | os: [win32] 255 | 256 | '@redis/bloom@1.2.0': 257 | resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} 258 | peerDependencies: 259 | '@redis/client': ^1.0.0 260 | 261 | '@redis/client@1.6.1': 262 | resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} 263 | engines: {node: '>=14'} 264 | 265 | '@redis/graph@1.1.1': 266 | resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} 267 | peerDependencies: 268 | '@redis/client': ^1.0.0 269 | 270 | '@redis/json@1.0.7': 271 | resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} 272 | peerDependencies: 273 | '@redis/client': ^1.0.0 274 | 275 | '@redis/search@1.2.0': 276 | resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} 277 | peerDependencies: 278 | '@redis/client': ^1.0.0 279 | 280 | '@redis/time-series@1.1.0': 281 | resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} 282 | peerDependencies: 283 | '@redis/client': ^1.0.0 284 | 285 | '@swc/counter@0.1.3': 286 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 287 | 288 | '@swc/helpers@0.5.5': 289 | resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} 290 | 291 | '@types/node-fetch@2.6.12': 292 | resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} 293 | 294 | '@types/node@18.19.100': 295 | resolution: {integrity: sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==} 296 | 297 | '@types/node@20.17.46': 298 | resolution: {integrity: sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==} 299 | 300 | '@types/prop-types@15.7.14': 301 | resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} 302 | 303 | '@types/react@18.3.21': 304 | resolution: {integrity: sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==} 305 | 306 | '@vercel/mcp-adapter@0.3.1': 307 | resolution: {integrity: sha512-8qZ5h0iiUhZXDnvsQDBYr6CIBPmsq2lH9uvKZCveVpDjdS9ngFhGJ8el25UthpMXGtS6saHBlTyvcreWskVSJA==} 308 | peerDependencies: 309 | next: '>=13.0.0' 310 | 311 | abort-controller@3.0.0: 312 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 313 | engines: {node: '>=6.5'} 314 | 315 | accepts@2.0.0: 316 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 317 | engines: {node: '>= 0.6'} 318 | 319 | agentkeepalive@4.6.0: 320 | resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} 321 | engines: {node: '>= 8.0.0'} 322 | 323 | asynckit@0.4.0: 324 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 325 | 326 | base-64@0.1.0: 327 | resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} 328 | 329 | body-parser@2.2.0: 330 | resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} 331 | engines: {node: '>=18'} 332 | 333 | busboy@1.6.0: 334 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 335 | engines: {node: '>=10.16.0'} 336 | 337 | bytes@3.1.2: 338 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 339 | engines: {node: '>= 0.8'} 340 | 341 | call-bind-apply-helpers@1.0.2: 342 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 343 | engines: {node: '>= 0.4'} 344 | 345 | call-bound@1.0.4: 346 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 347 | engines: {node: '>= 0.4'} 348 | 349 | caniuse-lite@1.0.30001717: 350 | resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} 351 | 352 | charenc@0.0.2: 353 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 354 | 355 | client-only@0.0.1: 356 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 357 | 358 | cluster-key-slot@1.1.2: 359 | resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} 360 | engines: {node: '>=0.10.0'} 361 | 362 | combined-stream@1.0.8: 363 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 364 | engines: {node: '>= 0.8'} 365 | 366 | content-disposition@1.0.0: 367 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 368 | engines: {node: '>= 0.6'} 369 | 370 | content-type@1.0.5: 371 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 372 | engines: {node: '>= 0.6'} 373 | 374 | cookie-signature@1.2.2: 375 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 376 | engines: {node: '>=6.6.0'} 377 | 378 | cookie@0.7.2: 379 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 380 | engines: {node: '>= 0.6'} 381 | 382 | cors@2.8.5: 383 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 384 | engines: {node: '>= 0.10'} 385 | 386 | cross-spawn@7.0.6: 387 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 388 | engines: {node: '>= 8'} 389 | 390 | crypt@0.0.2: 391 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 392 | 393 | csstype@3.1.3: 394 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 395 | 396 | debug@4.4.0: 397 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 398 | engines: {node: '>=6.0'} 399 | peerDependencies: 400 | supports-color: '*' 401 | peerDependenciesMeta: 402 | supports-color: 403 | optional: true 404 | 405 | delayed-stream@1.0.0: 406 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 407 | engines: {node: '>=0.4.0'} 408 | 409 | depd@2.0.0: 410 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 411 | engines: {node: '>= 0.8'} 412 | 413 | digest-fetch@1.3.0: 414 | resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} 415 | 416 | dunder-proto@1.0.1: 417 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 418 | engines: {node: '>= 0.4'} 419 | 420 | ee-first@1.1.1: 421 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 422 | 423 | encodeurl@2.0.0: 424 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 425 | engines: {node: '>= 0.8'} 426 | 427 | es-define-property@1.0.1: 428 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 429 | engines: {node: '>= 0.4'} 430 | 431 | es-errors@1.3.0: 432 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 433 | engines: {node: '>= 0.4'} 434 | 435 | es-object-atoms@1.1.1: 436 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 437 | engines: {node: '>= 0.4'} 438 | 439 | es-set-tostringtag@2.1.0: 440 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 441 | engines: {node: '>= 0.4'} 442 | 443 | esbuild@0.25.4: 444 | resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 445 | engines: {node: '>=18'} 446 | hasBin: true 447 | 448 | escape-html@1.0.3: 449 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 450 | 451 | etag@1.8.1: 452 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 453 | engines: {node: '>= 0.6'} 454 | 455 | event-target-shim@5.0.1: 456 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 457 | engines: {node: '>=6'} 458 | 459 | eventsource-parser@3.0.1: 460 | resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} 461 | engines: {node: '>=18.0.0'} 462 | 463 | eventsource@3.0.7: 464 | resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} 465 | engines: {node: '>=18.0.0'} 466 | 467 | express-rate-limit@7.5.0: 468 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 469 | engines: {node: '>= 16'} 470 | peerDependencies: 471 | express: ^4.11 || 5 || ^5.0.0-beta.1 472 | 473 | express@5.1.0: 474 | resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} 475 | engines: {node: '>= 18'} 476 | 477 | finalhandler@2.1.0: 478 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 479 | engines: {node: '>= 0.8'} 480 | 481 | form-data-encoder@1.7.2: 482 | resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} 483 | 484 | form-data@4.0.2: 485 | resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} 486 | engines: {node: '>= 6'} 487 | 488 | formdata-node@4.4.1: 489 | resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} 490 | engines: {node: '>= 12.20'} 491 | 492 | forwarded@0.2.0: 493 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 494 | engines: {node: '>= 0.6'} 495 | 496 | fresh@2.0.0: 497 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 498 | engines: {node: '>= 0.8'} 499 | 500 | fsevents@2.3.3: 501 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 502 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 503 | os: [darwin] 504 | 505 | function-bind@1.1.2: 506 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 507 | 508 | generic-pool@3.9.0: 509 | resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} 510 | engines: {node: '>= 4'} 511 | 512 | get-intrinsic@1.3.0: 513 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 514 | engines: {node: '>= 0.4'} 515 | 516 | get-proto@1.0.1: 517 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 518 | engines: {node: '>= 0.4'} 519 | 520 | get-tsconfig@4.10.0: 521 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 522 | 523 | gopd@1.2.0: 524 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 525 | engines: {node: '>= 0.4'} 526 | 527 | graceful-fs@4.2.11: 528 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 529 | 530 | groq-sdk@0.3.3: 531 | resolution: {integrity: sha512-wdOeZ2QymPjjP3tmFpUAnfMisoLbt7xF2MfpROeFAngcqWbfTyB9j9pMWSEAMF/E4gZx8f2Y+5zswO0q92CSxA==} 532 | 533 | has-symbols@1.1.0: 534 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 535 | engines: {node: '>= 0.4'} 536 | 537 | has-tostringtag@1.0.2: 538 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 539 | engines: {node: '>= 0.4'} 540 | 541 | hasown@2.0.2: 542 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 543 | engines: {node: '>= 0.4'} 544 | 545 | http-errors@2.0.0: 546 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 547 | engines: {node: '>= 0.8'} 548 | 549 | humanize-ms@1.2.1: 550 | resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 551 | 552 | iconv-lite@0.6.3: 553 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 554 | engines: {node: '>=0.10.0'} 555 | 556 | inherits@2.0.4: 557 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 558 | 559 | ipaddr.js@1.9.1: 560 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 561 | engines: {node: '>= 0.10'} 562 | 563 | is-buffer@1.1.6: 564 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 565 | 566 | is-promise@4.0.0: 567 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 568 | 569 | isexe@2.0.0: 570 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 571 | 572 | js-tokens@4.0.0: 573 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 574 | 575 | loose-envify@1.4.0: 576 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 577 | hasBin: true 578 | 579 | math-intrinsics@1.1.0: 580 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 581 | engines: {node: '>= 0.4'} 582 | 583 | md5@2.3.0: 584 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 585 | 586 | media-typer@1.1.0: 587 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 588 | engines: {node: '>= 0.8'} 589 | 590 | merge-descriptors@2.0.0: 591 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 592 | engines: {node: '>=18'} 593 | 594 | mime-db@1.52.0: 595 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 596 | engines: {node: '>= 0.6'} 597 | 598 | mime-db@1.54.0: 599 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 600 | engines: {node: '>= 0.6'} 601 | 602 | mime-types@2.1.35: 603 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 604 | engines: {node: '>= 0.6'} 605 | 606 | mime-types@3.0.1: 607 | resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} 608 | engines: {node: '>= 0.6'} 609 | 610 | ms@2.1.3: 611 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 612 | 613 | nanoid@3.3.11: 614 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 615 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 616 | hasBin: true 617 | 618 | negotiator@1.0.0: 619 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 620 | engines: {node: '>= 0.6'} 621 | 622 | next@14.2.28: 623 | resolution: {integrity: sha512-QLEIP/kYXynIxtcKB6vNjtWLVs3Y4Sb+EClTC/CSVzdLD1gIuItccpu/n1lhmduffI32iPGEK2cLLxxt28qgYA==} 624 | engines: {node: '>=18.17.0'} 625 | hasBin: true 626 | peerDependencies: 627 | '@opentelemetry/api': ^1.1.0 628 | '@playwright/test': ^1.41.2 629 | react: ^18.2.0 630 | react-dom: ^18.2.0 631 | sass: ^1.3.0 632 | peerDependenciesMeta: 633 | '@opentelemetry/api': 634 | optional: true 635 | '@playwright/test': 636 | optional: true 637 | sass: 638 | optional: true 639 | 640 | node-domexception@1.0.0: 641 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 642 | engines: {node: '>=10.5.0'} 643 | deprecated: Use your platform's native DOMException instead 644 | 645 | node-fetch@2.7.0: 646 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 647 | engines: {node: 4.x || >=6.0.0} 648 | peerDependencies: 649 | encoding: ^0.1.0 650 | peerDependenciesMeta: 651 | encoding: 652 | optional: true 653 | 654 | object-assign@4.1.1: 655 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 656 | engines: {node: '>=0.10.0'} 657 | 658 | object-inspect@1.13.4: 659 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 660 | engines: {node: '>= 0.4'} 661 | 662 | on-finished@2.4.1: 663 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 664 | engines: {node: '>= 0.8'} 665 | 666 | once@1.4.0: 667 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 668 | 669 | parseurl@1.3.3: 670 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 671 | engines: {node: '>= 0.8'} 672 | 673 | path-key@3.1.1: 674 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 675 | engines: {node: '>=8'} 676 | 677 | path-to-regexp@8.2.0: 678 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 679 | engines: {node: '>=16'} 680 | 681 | picocolors@1.1.1: 682 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 683 | 684 | pkce-challenge@5.0.0: 685 | resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} 686 | engines: {node: '>=16.20.0'} 687 | 688 | postcss@8.4.31: 689 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 690 | engines: {node: ^10 || ^12 || >=14} 691 | 692 | proxy-addr@2.0.7: 693 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 694 | engines: {node: '>= 0.10'} 695 | 696 | qs@6.14.0: 697 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 698 | engines: {node: '>=0.6'} 699 | 700 | range-parser@1.2.1: 701 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 702 | engines: {node: '>= 0.6'} 703 | 704 | raw-body@3.0.0: 705 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 706 | engines: {node: '>= 0.8'} 707 | 708 | react-dom@18.3.1: 709 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 710 | peerDependencies: 711 | react: ^18.3.1 712 | 713 | react@18.3.1: 714 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 715 | engines: {node: '>=0.10.0'} 716 | 717 | redis@4.7.1: 718 | resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} 719 | 720 | resolve-pkg-maps@1.0.0: 721 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 722 | 723 | router@2.2.0: 724 | resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 725 | engines: {node: '>= 18'} 726 | 727 | safe-buffer@5.2.1: 728 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 729 | 730 | safer-buffer@2.1.2: 731 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 732 | 733 | scheduler@0.23.2: 734 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 735 | 736 | send@1.2.0: 737 | resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} 738 | engines: {node: '>= 18'} 739 | 740 | serve-static@2.2.0: 741 | resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} 742 | engines: {node: '>= 18'} 743 | 744 | setprototypeof@1.2.0: 745 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 746 | 747 | shebang-command@2.0.0: 748 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 749 | engines: {node: '>=8'} 750 | 751 | shebang-regex@3.0.0: 752 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 753 | engines: {node: '>=8'} 754 | 755 | side-channel-list@1.0.0: 756 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 757 | engines: {node: '>= 0.4'} 758 | 759 | side-channel-map@1.0.1: 760 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 761 | engines: {node: '>= 0.4'} 762 | 763 | side-channel-weakmap@1.0.2: 764 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 765 | engines: {node: '>= 0.4'} 766 | 767 | side-channel@1.1.0: 768 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 769 | engines: {node: '>= 0.4'} 770 | 771 | source-map-js@1.2.1: 772 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 773 | engines: {node: '>=0.10.0'} 774 | 775 | statuses@2.0.1: 776 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 777 | engines: {node: '>= 0.8'} 778 | 779 | streamsearch@1.1.0: 780 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 781 | engines: {node: '>=10.0.0'} 782 | 783 | styled-jsx@5.1.1: 784 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 785 | engines: {node: '>= 12.0.0'} 786 | peerDependencies: 787 | '@babel/core': '*' 788 | babel-plugin-macros: '*' 789 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 790 | peerDependenciesMeta: 791 | '@babel/core': 792 | optional: true 793 | babel-plugin-macros: 794 | optional: true 795 | 796 | toidentifier@1.0.1: 797 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 798 | engines: {node: '>=0.6'} 799 | 800 | tr46@0.0.3: 801 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 802 | 803 | tslib@2.8.1: 804 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 805 | 806 | tsx@4.19.4: 807 | resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} 808 | engines: {node: '>=18.0.0'} 809 | hasBin: true 810 | 811 | type-is@2.0.1: 812 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 813 | engines: {node: '>= 0.6'} 814 | 815 | typescript@5.8.3: 816 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 817 | engines: {node: '>=14.17'} 818 | hasBin: true 819 | 820 | undici-types@5.26.5: 821 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 822 | 823 | undici-types@6.19.8: 824 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 825 | 826 | unpipe@1.0.0: 827 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 828 | engines: {node: '>= 0.8'} 829 | 830 | vary@1.1.2: 831 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 832 | engines: {node: '>= 0.8'} 833 | 834 | web-streams-polyfill@3.3.3: 835 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 836 | engines: {node: '>= 8'} 837 | 838 | web-streams-polyfill@4.0.0-beta.3: 839 | resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} 840 | engines: {node: '>= 14'} 841 | 842 | webidl-conversions@3.0.1: 843 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 844 | 845 | whatwg-url@5.0.0: 846 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 847 | 848 | which@2.0.2: 849 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 850 | engines: {node: '>= 8'} 851 | hasBin: true 852 | 853 | wrappy@1.0.2: 854 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 855 | 856 | yallist@4.0.0: 857 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 858 | 859 | zod-to-json-schema@3.24.5: 860 | resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} 861 | peerDependencies: 862 | zod: ^3.24.1 863 | 864 | zod@3.24.4: 865 | resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} 866 | 867 | snapshots: 868 | 869 | '@esbuild/aix-ppc64@0.25.4': 870 | optional: true 871 | 872 | '@esbuild/android-arm64@0.25.4': 873 | optional: true 874 | 875 | '@esbuild/android-arm@0.25.4': 876 | optional: true 877 | 878 | '@esbuild/android-x64@0.25.4': 879 | optional: true 880 | 881 | '@esbuild/darwin-arm64@0.25.4': 882 | optional: true 883 | 884 | '@esbuild/darwin-x64@0.25.4': 885 | optional: true 886 | 887 | '@esbuild/freebsd-arm64@0.25.4': 888 | optional: true 889 | 890 | '@esbuild/freebsd-x64@0.25.4': 891 | optional: true 892 | 893 | '@esbuild/linux-arm64@0.25.4': 894 | optional: true 895 | 896 | '@esbuild/linux-arm@0.25.4': 897 | optional: true 898 | 899 | '@esbuild/linux-ia32@0.25.4': 900 | optional: true 901 | 902 | '@esbuild/linux-loong64@0.25.4': 903 | optional: true 904 | 905 | '@esbuild/linux-mips64el@0.25.4': 906 | optional: true 907 | 908 | '@esbuild/linux-ppc64@0.25.4': 909 | optional: true 910 | 911 | '@esbuild/linux-riscv64@0.25.4': 912 | optional: true 913 | 914 | '@esbuild/linux-s390x@0.25.4': 915 | optional: true 916 | 917 | '@esbuild/linux-x64@0.25.4': 918 | optional: true 919 | 920 | '@esbuild/netbsd-arm64@0.25.4': 921 | optional: true 922 | 923 | '@esbuild/netbsd-x64@0.25.4': 924 | optional: true 925 | 926 | '@esbuild/openbsd-arm64@0.25.4': 927 | optional: true 928 | 929 | '@esbuild/openbsd-x64@0.25.4': 930 | optional: true 931 | 932 | '@esbuild/sunos-x64@0.25.4': 933 | optional: true 934 | 935 | '@esbuild/win32-arm64@0.25.4': 936 | optional: true 937 | 938 | '@esbuild/win32-ia32@0.25.4': 939 | optional: true 940 | 941 | '@esbuild/win32-x64@0.25.4': 942 | optional: true 943 | 944 | '@modelcontextprotocol/sdk@1.10.2': 945 | dependencies: 946 | content-type: 1.0.5 947 | cors: 2.8.5 948 | cross-spawn: 7.0.6 949 | eventsource: 3.0.7 950 | express: 5.1.0 951 | express-rate-limit: 7.5.0(express@5.1.0) 952 | pkce-challenge: 5.0.0 953 | raw-body: 3.0.0 954 | zod: 3.24.4 955 | zod-to-json-schema: 3.24.5(zod@3.24.4) 956 | transitivePeerDependencies: 957 | - supports-color 958 | 959 | '@next/env@14.2.28': {} 960 | 961 | '@next/swc-darwin-arm64@14.2.28': 962 | optional: true 963 | 964 | '@next/swc-darwin-x64@14.2.28': 965 | optional: true 966 | 967 | '@next/swc-linux-arm64-gnu@14.2.28': 968 | optional: true 969 | 970 | '@next/swc-linux-arm64-musl@14.2.28': 971 | optional: true 972 | 973 | '@next/swc-linux-x64-gnu@14.2.28': 974 | optional: true 975 | 976 | '@next/swc-linux-x64-musl@14.2.28': 977 | optional: true 978 | 979 | '@next/swc-win32-arm64-msvc@14.2.28': 980 | optional: true 981 | 982 | '@next/swc-win32-ia32-msvc@14.2.28': 983 | optional: true 984 | 985 | '@next/swc-win32-x64-msvc@14.2.28': 986 | optional: true 987 | 988 | '@redis/bloom@1.2.0(@redis/client@1.6.1)': 989 | dependencies: 990 | '@redis/client': 1.6.1 991 | 992 | '@redis/client@1.6.1': 993 | dependencies: 994 | cluster-key-slot: 1.1.2 995 | generic-pool: 3.9.0 996 | yallist: 4.0.0 997 | 998 | '@redis/graph@1.1.1(@redis/client@1.6.1)': 999 | dependencies: 1000 | '@redis/client': 1.6.1 1001 | 1002 | '@redis/json@1.0.7(@redis/client@1.6.1)': 1003 | dependencies: 1004 | '@redis/client': 1.6.1 1005 | 1006 | '@redis/search@1.2.0(@redis/client@1.6.1)': 1007 | dependencies: 1008 | '@redis/client': 1.6.1 1009 | 1010 | '@redis/time-series@1.1.0(@redis/client@1.6.1)': 1011 | dependencies: 1012 | '@redis/client': 1.6.1 1013 | 1014 | '@swc/counter@0.1.3': {} 1015 | 1016 | '@swc/helpers@0.5.5': 1017 | dependencies: 1018 | '@swc/counter': 0.1.3 1019 | tslib: 2.8.1 1020 | 1021 | '@types/node-fetch@2.6.12': 1022 | dependencies: 1023 | '@types/node': 20.17.46 1024 | form-data: 4.0.2 1025 | 1026 | '@types/node@18.19.100': 1027 | dependencies: 1028 | undici-types: 5.26.5 1029 | 1030 | '@types/node@20.17.46': 1031 | dependencies: 1032 | undici-types: 6.19.8 1033 | 1034 | '@types/prop-types@15.7.14': {} 1035 | 1036 | '@types/react@18.3.21': 1037 | dependencies: 1038 | '@types/prop-types': 15.7.14 1039 | csstype: 3.1.3 1040 | 1041 | '@vercel/mcp-adapter@0.3.1(next@14.2.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': 1042 | dependencies: 1043 | '@modelcontextprotocol/sdk': 1.10.2 1044 | next: 14.2.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1045 | redis: 4.7.1 1046 | transitivePeerDependencies: 1047 | - supports-color 1048 | 1049 | abort-controller@3.0.0: 1050 | dependencies: 1051 | event-target-shim: 5.0.1 1052 | 1053 | accepts@2.0.0: 1054 | dependencies: 1055 | mime-types: 3.0.1 1056 | negotiator: 1.0.0 1057 | 1058 | agentkeepalive@4.6.0: 1059 | dependencies: 1060 | humanize-ms: 1.2.1 1061 | 1062 | asynckit@0.4.0: {} 1063 | 1064 | base-64@0.1.0: {} 1065 | 1066 | body-parser@2.2.0: 1067 | dependencies: 1068 | bytes: 3.1.2 1069 | content-type: 1.0.5 1070 | debug: 4.4.0 1071 | http-errors: 2.0.0 1072 | iconv-lite: 0.6.3 1073 | on-finished: 2.4.1 1074 | qs: 6.14.0 1075 | raw-body: 3.0.0 1076 | type-is: 2.0.1 1077 | transitivePeerDependencies: 1078 | - supports-color 1079 | 1080 | busboy@1.6.0: 1081 | dependencies: 1082 | streamsearch: 1.1.0 1083 | 1084 | bytes@3.1.2: {} 1085 | 1086 | call-bind-apply-helpers@1.0.2: 1087 | dependencies: 1088 | es-errors: 1.3.0 1089 | function-bind: 1.1.2 1090 | 1091 | call-bound@1.0.4: 1092 | dependencies: 1093 | call-bind-apply-helpers: 1.0.2 1094 | get-intrinsic: 1.3.0 1095 | 1096 | caniuse-lite@1.0.30001717: {} 1097 | 1098 | charenc@0.0.2: {} 1099 | 1100 | client-only@0.0.1: {} 1101 | 1102 | cluster-key-slot@1.1.2: {} 1103 | 1104 | combined-stream@1.0.8: 1105 | dependencies: 1106 | delayed-stream: 1.0.0 1107 | 1108 | content-disposition@1.0.0: 1109 | dependencies: 1110 | safe-buffer: 5.2.1 1111 | 1112 | content-type@1.0.5: {} 1113 | 1114 | cookie-signature@1.2.2: {} 1115 | 1116 | cookie@0.7.2: {} 1117 | 1118 | cors@2.8.5: 1119 | dependencies: 1120 | object-assign: 4.1.1 1121 | vary: 1.1.2 1122 | 1123 | cross-spawn@7.0.6: 1124 | dependencies: 1125 | path-key: 3.1.1 1126 | shebang-command: 2.0.0 1127 | which: 2.0.2 1128 | 1129 | crypt@0.0.2: {} 1130 | 1131 | csstype@3.1.3: {} 1132 | 1133 | debug@4.4.0: 1134 | dependencies: 1135 | ms: 2.1.3 1136 | 1137 | delayed-stream@1.0.0: {} 1138 | 1139 | depd@2.0.0: {} 1140 | 1141 | digest-fetch@1.3.0: 1142 | dependencies: 1143 | base-64: 0.1.0 1144 | md5: 2.3.0 1145 | 1146 | dunder-proto@1.0.1: 1147 | dependencies: 1148 | call-bind-apply-helpers: 1.0.2 1149 | es-errors: 1.3.0 1150 | gopd: 1.2.0 1151 | 1152 | ee-first@1.1.1: {} 1153 | 1154 | encodeurl@2.0.0: {} 1155 | 1156 | es-define-property@1.0.1: {} 1157 | 1158 | es-errors@1.3.0: {} 1159 | 1160 | es-object-atoms@1.1.1: 1161 | dependencies: 1162 | es-errors: 1.3.0 1163 | 1164 | es-set-tostringtag@2.1.0: 1165 | dependencies: 1166 | es-errors: 1.3.0 1167 | get-intrinsic: 1.3.0 1168 | has-tostringtag: 1.0.2 1169 | hasown: 2.0.2 1170 | 1171 | esbuild@0.25.4: 1172 | optionalDependencies: 1173 | '@esbuild/aix-ppc64': 0.25.4 1174 | '@esbuild/android-arm': 0.25.4 1175 | '@esbuild/android-arm64': 0.25.4 1176 | '@esbuild/android-x64': 0.25.4 1177 | '@esbuild/darwin-arm64': 0.25.4 1178 | '@esbuild/darwin-x64': 0.25.4 1179 | '@esbuild/freebsd-arm64': 0.25.4 1180 | '@esbuild/freebsd-x64': 0.25.4 1181 | '@esbuild/linux-arm': 0.25.4 1182 | '@esbuild/linux-arm64': 0.25.4 1183 | '@esbuild/linux-ia32': 0.25.4 1184 | '@esbuild/linux-loong64': 0.25.4 1185 | '@esbuild/linux-mips64el': 0.25.4 1186 | '@esbuild/linux-ppc64': 0.25.4 1187 | '@esbuild/linux-riscv64': 0.25.4 1188 | '@esbuild/linux-s390x': 0.25.4 1189 | '@esbuild/linux-x64': 0.25.4 1190 | '@esbuild/netbsd-arm64': 0.25.4 1191 | '@esbuild/netbsd-x64': 0.25.4 1192 | '@esbuild/openbsd-arm64': 0.25.4 1193 | '@esbuild/openbsd-x64': 0.25.4 1194 | '@esbuild/sunos-x64': 0.25.4 1195 | '@esbuild/win32-arm64': 0.25.4 1196 | '@esbuild/win32-ia32': 0.25.4 1197 | '@esbuild/win32-x64': 0.25.4 1198 | 1199 | escape-html@1.0.3: {} 1200 | 1201 | etag@1.8.1: {} 1202 | 1203 | event-target-shim@5.0.1: {} 1204 | 1205 | eventsource-parser@3.0.1: {} 1206 | 1207 | eventsource@3.0.7: 1208 | dependencies: 1209 | eventsource-parser: 3.0.1 1210 | 1211 | express-rate-limit@7.5.0(express@5.1.0): 1212 | dependencies: 1213 | express: 5.1.0 1214 | 1215 | express@5.1.0: 1216 | dependencies: 1217 | accepts: 2.0.0 1218 | body-parser: 2.2.0 1219 | content-disposition: 1.0.0 1220 | content-type: 1.0.5 1221 | cookie: 0.7.2 1222 | cookie-signature: 1.2.2 1223 | debug: 4.4.0 1224 | encodeurl: 2.0.0 1225 | escape-html: 1.0.3 1226 | etag: 1.8.1 1227 | finalhandler: 2.1.0 1228 | fresh: 2.0.0 1229 | http-errors: 2.0.0 1230 | merge-descriptors: 2.0.0 1231 | mime-types: 3.0.1 1232 | on-finished: 2.4.1 1233 | once: 1.4.0 1234 | parseurl: 1.3.3 1235 | proxy-addr: 2.0.7 1236 | qs: 6.14.0 1237 | range-parser: 1.2.1 1238 | router: 2.2.0 1239 | send: 1.2.0 1240 | serve-static: 2.2.0 1241 | statuses: 2.0.1 1242 | type-is: 2.0.1 1243 | vary: 1.1.2 1244 | transitivePeerDependencies: 1245 | - supports-color 1246 | 1247 | finalhandler@2.1.0: 1248 | dependencies: 1249 | debug: 4.4.0 1250 | encodeurl: 2.0.0 1251 | escape-html: 1.0.3 1252 | on-finished: 2.4.1 1253 | parseurl: 1.3.3 1254 | statuses: 2.0.1 1255 | transitivePeerDependencies: 1256 | - supports-color 1257 | 1258 | form-data-encoder@1.7.2: {} 1259 | 1260 | form-data@4.0.2: 1261 | dependencies: 1262 | asynckit: 0.4.0 1263 | combined-stream: 1.0.8 1264 | es-set-tostringtag: 2.1.0 1265 | mime-types: 2.1.35 1266 | 1267 | formdata-node@4.4.1: 1268 | dependencies: 1269 | node-domexception: 1.0.0 1270 | web-streams-polyfill: 4.0.0-beta.3 1271 | 1272 | forwarded@0.2.0: {} 1273 | 1274 | fresh@2.0.0: {} 1275 | 1276 | fsevents@2.3.3: 1277 | optional: true 1278 | 1279 | function-bind@1.1.2: {} 1280 | 1281 | generic-pool@3.9.0: {} 1282 | 1283 | get-intrinsic@1.3.0: 1284 | dependencies: 1285 | call-bind-apply-helpers: 1.0.2 1286 | es-define-property: 1.0.1 1287 | es-errors: 1.3.0 1288 | es-object-atoms: 1.1.1 1289 | function-bind: 1.1.2 1290 | get-proto: 1.0.1 1291 | gopd: 1.2.0 1292 | has-symbols: 1.1.0 1293 | hasown: 2.0.2 1294 | math-intrinsics: 1.1.0 1295 | 1296 | get-proto@1.0.1: 1297 | dependencies: 1298 | dunder-proto: 1.0.1 1299 | es-object-atoms: 1.1.1 1300 | 1301 | get-tsconfig@4.10.0: 1302 | dependencies: 1303 | resolve-pkg-maps: 1.0.0 1304 | 1305 | gopd@1.2.0: {} 1306 | 1307 | graceful-fs@4.2.11: {} 1308 | 1309 | groq-sdk@0.3.3: 1310 | dependencies: 1311 | '@types/node': 18.19.100 1312 | '@types/node-fetch': 2.6.12 1313 | abort-controller: 3.0.0 1314 | agentkeepalive: 4.6.0 1315 | digest-fetch: 1.3.0 1316 | form-data-encoder: 1.7.2 1317 | formdata-node: 4.4.1 1318 | node-fetch: 2.7.0 1319 | web-streams-polyfill: 3.3.3 1320 | transitivePeerDependencies: 1321 | - encoding 1322 | 1323 | has-symbols@1.1.0: {} 1324 | 1325 | has-tostringtag@1.0.2: 1326 | dependencies: 1327 | has-symbols: 1.1.0 1328 | 1329 | hasown@2.0.2: 1330 | dependencies: 1331 | function-bind: 1.1.2 1332 | 1333 | http-errors@2.0.0: 1334 | dependencies: 1335 | depd: 2.0.0 1336 | inherits: 2.0.4 1337 | setprototypeof: 1.2.0 1338 | statuses: 2.0.1 1339 | toidentifier: 1.0.1 1340 | 1341 | humanize-ms@1.2.1: 1342 | dependencies: 1343 | ms: 2.1.3 1344 | 1345 | iconv-lite@0.6.3: 1346 | dependencies: 1347 | safer-buffer: 2.1.2 1348 | 1349 | inherits@2.0.4: {} 1350 | 1351 | ipaddr.js@1.9.1: {} 1352 | 1353 | is-buffer@1.1.6: {} 1354 | 1355 | is-promise@4.0.0: {} 1356 | 1357 | isexe@2.0.0: {} 1358 | 1359 | js-tokens@4.0.0: {} 1360 | 1361 | loose-envify@1.4.0: 1362 | dependencies: 1363 | js-tokens: 4.0.0 1364 | 1365 | math-intrinsics@1.1.0: {} 1366 | 1367 | md5@2.3.0: 1368 | dependencies: 1369 | charenc: 0.0.2 1370 | crypt: 0.0.2 1371 | is-buffer: 1.1.6 1372 | 1373 | media-typer@1.1.0: {} 1374 | 1375 | merge-descriptors@2.0.0: {} 1376 | 1377 | mime-db@1.52.0: {} 1378 | 1379 | mime-db@1.54.0: {} 1380 | 1381 | mime-types@2.1.35: 1382 | dependencies: 1383 | mime-db: 1.52.0 1384 | 1385 | mime-types@3.0.1: 1386 | dependencies: 1387 | mime-db: 1.54.0 1388 | 1389 | ms@2.1.3: {} 1390 | 1391 | nanoid@3.3.11: {} 1392 | 1393 | negotiator@1.0.0: {} 1394 | 1395 | next@14.2.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 1396 | dependencies: 1397 | '@next/env': 14.2.28 1398 | '@swc/helpers': 0.5.5 1399 | busboy: 1.6.0 1400 | caniuse-lite: 1.0.30001717 1401 | graceful-fs: 4.2.11 1402 | postcss: 8.4.31 1403 | react: 18.3.1 1404 | react-dom: 18.3.1(react@18.3.1) 1405 | styled-jsx: 5.1.1(react@18.3.1) 1406 | optionalDependencies: 1407 | '@next/swc-darwin-arm64': 14.2.28 1408 | '@next/swc-darwin-x64': 14.2.28 1409 | '@next/swc-linux-arm64-gnu': 14.2.28 1410 | '@next/swc-linux-arm64-musl': 14.2.28 1411 | '@next/swc-linux-x64-gnu': 14.2.28 1412 | '@next/swc-linux-x64-musl': 14.2.28 1413 | '@next/swc-win32-arm64-msvc': 14.2.28 1414 | '@next/swc-win32-ia32-msvc': 14.2.28 1415 | '@next/swc-win32-x64-msvc': 14.2.28 1416 | transitivePeerDependencies: 1417 | - '@babel/core' 1418 | - babel-plugin-macros 1419 | 1420 | node-domexception@1.0.0: {} 1421 | 1422 | node-fetch@2.7.0: 1423 | dependencies: 1424 | whatwg-url: 5.0.0 1425 | 1426 | object-assign@4.1.1: {} 1427 | 1428 | object-inspect@1.13.4: {} 1429 | 1430 | on-finished@2.4.1: 1431 | dependencies: 1432 | ee-first: 1.1.1 1433 | 1434 | once@1.4.0: 1435 | dependencies: 1436 | wrappy: 1.0.2 1437 | 1438 | parseurl@1.3.3: {} 1439 | 1440 | path-key@3.1.1: {} 1441 | 1442 | path-to-regexp@8.2.0: {} 1443 | 1444 | picocolors@1.1.1: {} 1445 | 1446 | pkce-challenge@5.0.0: {} 1447 | 1448 | postcss@8.4.31: 1449 | dependencies: 1450 | nanoid: 3.3.11 1451 | picocolors: 1.1.1 1452 | source-map-js: 1.2.1 1453 | 1454 | proxy-addr@2.0.7: 1455 | dependencies: 1456 | forwarded: 0.2.0 1457 | ipaddr.js: 1.9.1 1458 | 1459 | qs@6.14.0: 1460 | dependencies: 1461 | side-channel: 1.1.0 1462 | 1463 | range-parser@1.2.1: {} 1464 | 1465 | raw-body@3.0.0: 1466 | dependencies: 1467 | bytes: 3.1.2 1468 | http-errors: 2.0.0 1469 | iconv-lite: 0.6.3 1470 | unpipe: 1.0.0 1471 | 1472 | react-dom@18.3.1(react@18.3.1): 1473 | dependencies: 1474 | loose-envify: 1.4.0 1475 | react: 18.3.1 1476 | scheduler: 0.23.2 1477 | 1478 | react@18.3.1: 1479 | dependencies: 1480 | loose-envify: 1.4.0 1481 | 1482 | redis@4.7.1: 1483 | dependencies: 1484 | '@redis/bloom': 1.2.0(@redis/client@1.6.1) 1485 | '@redis/client': 1.6.1 1486 | '@redis/graph': 1.1.1(@redis/client@1.6.1) 1487 | '@redis/json': 1.0.7(@redis/client@1.6.1) 1488 | '@redis/search': 1.2.0(@redis/client@1.6.1) 1489 | '@redis/time-series': 1.1.0(@redis/client@1.6.1) 1490 | 1491 | resolve-pkg-maps@1.0.0: {} 1492 | 1493 | router@2.2.0: 1494 | dependencies: 1495 | debug: 4.4.0 1496 | depd: 2.0.0 1497 | is-promise: 4.0.0 1498 | parseurl: 1.3.3 1499 | path-to-regexp: 8.2.0 1500 | transitivePeerDependencies: 1501 | - supports-color 1502 | 1503 | safe-buffer@5.2.1: {} 1504 | 1505 | safer-buffer@2.1.2: {} 1506 | 1507 | scheduler@0.23.2: 1508 | dependencies: 1509 | loose-envify: 1.4.0 1510 | 1511 | send@1.2.0: 1512 | dependencies: 1513 | debug: 4.4.0 1514 | encodeurl: 2.0.0 1515 | escape-html: 1.0.3 1516 | etag: 1.8.1 1517 | fresh: 2.0.0 1518 | http-errors: 2.0.0 1519 | mime-types: 3.0.1 1520 | ms: 2.1.3 1521 | on-finished: 2.4.1 1522 | range-parser: 1.2.1 1523 | statuses: 2.0.1 1524 | transitivePeerDependencies: 1525 | - supports-color 1526 | 1527 | serve-static@2.2.0: 1528 | dependencies: 1529 | encodeurl: 2.0.0 1530 | escape-html: 1.0.3 1531 | parseurl: 1.3.3 1532 | send: 1.2.0 1533 | transitivePeerDependencies: 1534 | - supports-color 1535 | 1536 | setprototypeof@1.2.0: {} 1537 | 1538 | shebang-command@2.0.0: 1539 | dependencies: 1540 | shebang-regex: 3.0.0 1541 | 1542 | shebang-regex@3.0.0: {} 1543 | 1544 | side-channel-list@1.0.0: 1545 | dependencies: 1546 | es-errors: 1.3.0 1547 | object-inspect: 1.13.4 1548 | 1549 | side-channel-map@1.0.1: 1550 | dependencies: 1551 | call-bound: 1.0.4 1552 | es-errors: 1.3.0 1553 | get-intrinsic: 1.3.0 1554 | object-inspect: 1.13.4 1555 | 1556 | side-channel-weakmap@1.0.2: 1557 | dependencies: 1558 | call-bound: 1.0.4 1559 | es-errors: 1.3.0 1560 | get-intrinsic: 1.3.0 1561 | object-inspect: 1.13.4 1562 | side-channel-map: 1.0.1 1563 | 1564 | side-channel@1.1.0: 1565 | dependencies: 1566 | es-errors: 1.3.0 1567 | object-inspect: 1.13.4 1568 | side-channel-list: 1.0.0 1569 | side-channel-map: 1.0.1 1570 | side-channel-weakmap: 1.0.2 1571 | 1572 | source-map-js@1.2.1: {} 1573 | 1574 | statuses@2.0.1: {} 1575 | 1576 | streamsearch@1.1.0: {} 1577 | 1578 | styled-jsx@5.1.1(react@18.3.1): 1579 | dependencies: 1580 | client-only: 0.0.1 1581 | react: 18.3.1 1582 | 1583 | toidentifier@1.0.1: {} 1584 | 1585 | tr46@0.0.3: {} 1586 | 1587 | tslib@2.8.1: {} 1588 | 1589 | tsx@4.19.4: 1590 | dependencies: 1591 | esbuild: 0.25.4 1592 | get-tsconfig: 4.10.0 1593 | optionalDependencies: 1594 | fsevents: 2.3.3 1595 | 1596 | type-is@2.0.1: 1597 | dependencies: 1598 | content-type: 1.0.5 1599 | media-typer: 1.1.0 1600 | mime-types: 3.0.1 1601 | 1602 | typescript@5.8.3: {} 1603 | 1604 | undici-types@5.26.5: {} 1605 | 1606 | undici-types@6.19.8: {} 1607 | 1608 | unpipe@1.0.0: {} 1609 | 1610 | vary@1.1.2: {} 1611 | 1612 | web-streams-polyfill@3.3.3: {} 1613 | 1614 | web-streams-polyfill@4.0.0-beta.3: {} 1615 | 1616 | webidl-conversions@3.0.1: {} 1617 | 1618 | whatwg-url@5.0.0: 1619 | dependencies: 1620 | tr46: 0.0.3 1621 | webidl-conversions: 3.0.1 1622 | 1623 | which@2.0.2: 1624 | dependencies: 1625 | isexe: 2.0.0 1626 | 1627 | wrappy@1.0.2: {} 1628 | 1629 | yallist@4.0.0: {} 1630 | 1631 | zod-to-json-schema@3.24.5(zod@3.24.4): 1632 | dependencies: 1633 | zod: 3.24.4 1634 | 1635 | zod@3.24.4: {} 1636 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | ignoredBuiltDependencies: 2 | - esbuild 3 | -------------------------------------------------------------------------------- /src/app/api/mcp/[...all]/route.ts: -------------------------------------------------------------------------------- 1 | import { createMcpHandler } from '@vercel/mcp-adapter'; 2 | import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; 3 | import { realtimeTool, replTool } from '@/server'; 4 | 5 | const handler = createMcpHandler((adapterServer: McpServer) => { 6 | // Register tools from your existing server.ts on the server instance provided by the adapter 7 | adapterServer.tool(realtimeTool.name, realtimeTool.description, realtimeTool.schema, realtimeTool.handler); 8 | adapterServer.tool(replTool.name, replTool.description, replTool.schema, replTool.handler); 9 | }, undefined, { 10 | // AdapterConfig 11 | redisUrl: process.env.REDIS_URL, 12 | basePath: '/api/mcp', // This means your MCP endpoints will be /api/mcp/sse, /api/mcp/mcp, etc. 13 | verboseLogs: process.env.NODE_ENV === 'development', // Enable verbose logs in development 14 | maxDuration: 180, // Vercel Pro/Enterprise can go up to 300-900s for functions with Fluid enabled 15 | } 16 | ); 17 | 18 | export { handler as GET, handler as POST, handler as OPTIONS }; // Add OPTIONS for CORS preflight if needed by clients -------------------------------------------------------------------------------- /src/app/globals.css: -------------------------------------------------------------------------------- 1 | /* Add any global styles here */ 2 | body { 3 | margin: 0; 4 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 5 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 6 | sans-serif; 7 | -webkit-font-smoothing: antialiased; 8 | -moz-osx-font-smoothing: grayscale; 9 | } -------------------------------------------------------------------------------- /src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from 'next'; 2 | import './globals.css'; // Optional: if you want to add global styles 3 | 4 | export const metadata: Metadata = { 5 | title: 'MCP Server', 6 | description: 'MCP Server hosted on Vercel', 7 | }; 8 | 9 | export default function RootLayout({ 10 | children, 11 | }: { 12 | children: React.ReactNode; 13 | }) { 14 | return ( 15 | 16 | {children} 17 | 18 | ); 19 | } -------------------------------------------------------------------------------- /src/app/page.tsx: -------------------------------------------------------------------------------- 1 | export default function HomePage() { 2 | return ( 3 |
4 |

MCP Server

5 |

This Next.js app hosts an MCP server.

6 |

The MCP API endpoints are available under /api/mcp.

7 |
8 | ); 9 | } -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import test from 'node:test'; 2 | import assert from 'node:assert'; 3 | import { 4 | realtimeToolArgsSchema, 5 | replToolArgsSchema 6 | } from './server.js'; // Import the exported Zod schemas 7 | 8 | test('Tool Argument Schemas', async (t) => { 9 | 10 | await t.test('Realtime Tool Schema Validation', () => { 11 | // Valid input 12 | const validResult1 = realtimeToolArgsSchema.safeParse({ 13 | question: "What is the weather today?", 14 | }); 15 | assert(validResult1.success, 'Valid input should parse successfully (1)'); 16 | assert.strictEqual(validResult1.data?.question, "What is the weather today?"); 17 | assert.strictEqual(validResult1.data?.model, 'compound-beta', 'Default model should be compound-beta'); 18 | 19 | // Valid input with explicit model 20 | const validResult2 = realtimeToolArgsSchema.safeParse({ 21 | question: "News summary?", 22 | model: "compound-beta-mini" 23 | }); 24 | assert(validResult2.success, 'Valid input with model should parse successfully (2)'); 25 | assert.strictEqual(validResult2.data?.model, 'compound-beta-mini'); 26 | 27 | // Invalid input (missing question) 28 | const invalidResult1 = realtimeToolArgsSchema.safeParse({ model: "compound-beta" }); 29 | assert(!invalidResult1.success, 'Missing question should fail parsing (3)'); 30 | 31 | // Invalid input (wrong model enum) 32 | const invalidResult2 = realtimeToolArgsSchema.safeParse({ question: "Q?", model: "invalid-model" }); 33 | assert(!invalidResult2.success, 'Invalid model enum should fail parsing (4)'); 34 | 35 | // Invalid input (wrong type for question) 36 | const invalidResult3 = realtimeToolArgsSchema.safeParse({ question: 123 }); 37 | assert(!invalidResult3.success, 'Wrong question type should fail parsing (5)'); 38 | }); 39 | 40 | await t.test('REPL Tool Schema Validation', () => { 41 | // Valid input 42 | const validResult1 = replToolArgsSchema.safeParse({ 43 | question: "Calculate 5*5", 44 | }); 45 | assert(validResult1.success, 'Valid input should parse successfully (6)'); 46 | assert.strictEqual(validResult1.data?.question, "Calculate 5*5"); 47 | assert.strictEqual(validResult1.data?.model, 'compound-beta', 'Default model should be compound-beta (7)'); 48 | 49 | // Invalid input (missing question) 50 | const invalidResult1 = replToolArgsSchema.safeParse({}); 51 | assert(!invalidResult1.success, 'Missing question should fail parsing (8)'); 52 | }); 53 | 54 | }); -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 4 | import { server } from "./server.js"; 5 | 6 | // Main function to run the server 7 | export async function main() { 8 | const transport = new StdioServerTransport(); 9 | await server.connect(transport); 10 | console.error("Groq MCP Server running on stdio"); 11 | } 12 | 13 | main().catch((error) => { 14 | console.error("Fatal error in main():", error); 15 | process.exit(1); 16 | }); -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 2 | import { z } from "zod"; 3 | import Groq from "groq-sdk"; 4 | 5 | const ModelEnum = z.enum(["compound-beta", "compound-beta-mini"]); 6 | const ModeEnum = z.enum(["minimal", "verbose"]); 7 | 8 | // Define Tool Schemas 9 | export const realtimeToolArgsSchema = z.object({ 10 | question: z.string().describe("The question to ask the model, especially if it requires real-time information (e.g., current news, recent events)."), 11 | model: ModelEnum.optional() 12 | .default("compound-beta") 13 | .describe("The model to use (compound-beta or compound-beta-mini). Defaults to compound-beta. Use compound-beta-mini for quick answers."), 14 | mode: ModeEnum.optional().default("minimal").describe("Response mode ('minimal' or 'verbose'). Defaults to 'minimal'. 'verbose' includes executed tools in the response. This is very verbose and should only be used when the user asks for it or when the user query cannot be answered without it (always first try without it)."), 15 | include_domains: z.array(z.string()).optional().describe("List of domains to specifically include in the search."), 16 | exclude_domains: z.array(z.string()).optional().describe("List of domains to exclude from the search."), 17 | }); 18 | 19 | export const replToolArgsSchema = z.object({ 20 | question: z.string().describe("The question to ask the model, especially one that benefits from Python REPL interaction (e.g., for intermediate calculations or code execution)."), 21 | model: ModelEnum.optional() 22 | .default("compound-beta") 23 | .describe("The model to use (compound-beta or compound-beta-mini). Defaults to compound-beta. Use compound-beta-mini for quick answers."), 24 | mode: ModeEnum.optional().default("minimal").describe("Response mode ('minimal' or 'verbose'). Defaults to 'minimal'. 'verbose' includes executed tools in the response. This is very verbose and should only be used when the user asks for it or when the user query cannot be answered without it (always first try without it)."), 25 | include_domains: z.array(z.string()).optional().describe("List of domains to specifically include in the search."), 26 | exclude_domains: z.array(z.string()).optional().describe("List of domains to exclude from the search."), 27 | }); 28 | 29 | // Type alias for the arguments 30 | type ToolArgs = z.infer | z.infer; 31 | 32 | // Helper function to execute Groq chat completion 33 | async function executeGroqQuery(args: ToolArgs) { 34 | // Initialize Groq client lazily 35 | const groq = new Groq(); 36 | try { 37 | const chatCompletion = await groq.chat.completions.create({ 38 | messages: [ 39 | { 40 | role: "user", 41 | content: args.question, 42 | }, 43 | ], 44 | model: args.model, 45 | // Add include_domains and exclude_domains if they exist in args 46 | ...(args.include_domains && { include_domains: args.include_domains }), 47 | ...(args.exclude_domains && { exclude_domains: args.exclude_domains }), 48 | }); 49 | 50 | const choice = chatCompletion.choices[0]?.message; 51 | const responseTextContent = choice?.content || "No response from model."; 52 | let finalResponseText = responseTextContent; 53 | 54 | // Check if verbose flag is true 55 | if ('mode' in args && args.mode === 'verbose') { 56 | // Use the logic to get executed_tools 57 | const executedTools = (choice as any)?.executed_tools ?? null; 58 | const responsePayload = { 59 | answer: responseTextContent, 60 | executed_tools: executedTools 61 | }; 62 | finalResponseText = JSON.stringify(responsePayload, null, 2); // Pretty print JSON 63 | } 64 | 65 | return { 66 | content: [ 67 | { 68 | type: "text" as const, 69 | text: finalResponseText, // Use the potentially modified response text 70 | }, 71 | ], 72 | }; 73 | } catch (error) { 74 | console.error("Error executing Groq query:", error); 75 | const errorMessage = error instanceof Error ? error.message : "An unknown error occurred"; 76 | return { 77 | content: [ 78 | { 79 | type: "text" as const, 80 | text: `Failed to get response from Groq: ${errorMessage}`, 81 | }, 82 | ], 83 | }; 84 | } 85 | } 86 | 87 | // --- Exportable Tool Definitions --- 88 | export const realtimeTool = { 89 | name: "ask_with_realtime_information", 90 | description: "Ask a question requiring real-time information (e.g., news, current events) using a Groq model.", 91 | schema: realtimeToolArgsSchema.shape, 92 | handler: executeGroqQuery, 93 | }; 94 | 95 | export const replTool = { 96 | name: "ask_with_code_execution", 97 | description: "Ask questions that benefit from Python REPL interaction (e.g., for intermediate calculations or code execution).", 98 | schema: replToolArgsSchema.shape, 99 | handler: executeGroqQuery, 100 | }; 101 | // ---------------------------------- 102 | 103 | // Create MCP server instance 104 | export const server = new McpServer({ 105 | name: "groq-interaction", 106 | version: "1.0.0", 107 | capabilities: { 108 | resources: {}, 109 | tools: {}, 110 | }, 111 | }); 112 | 113 | // Register tools using the exported definitions 114 | server.tool(realtimeTool.name, realtimeTool.description, realtimeTool.schema, realtimeTool.handler); 115 | server.tool(replTool.name, replTool.description, replTool.schema, replTool.handler); 116 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "outDir": "./build", 13 | "baseUrl": ".", 14 | "strict": true, 15 | "esModuleInterop": true, 16 | "skipLibCheck": true, 17 | "forceConsistentCasingInFileNames": true, 18 | "isolatedModules": true, 19 | "jsx": "preserve", 20 | "incremental": true, 21 | "plugins": [ 22 | { 23 | "name": "next" 24 | } 25 | ], 26 | "paths": { 27 | "@/*": [ 28 | "./src/*" 29 | ] 30 | }, 31 | "noEmit": true, 32 | "resolveJsonModule": true 33 | }, 34 | "include": [ 35 | "src/**/*.ts", 36 | "src/**/*.tsx", 37 | ".next/types/**/*.ts", 38 | "next-env.d.ts" 39 | ], 40 | "exclude": [ 41 | "node_modules", 42 | "build" 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /tsconfig.stdio.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "noEmit": false, 7 | "plugins": [] 8 | }, 9 | "include": [ 10 | "src/server.ts", 11 | "src/index.ts" 12 | // Add any other specific files for the stdio server here if they arise 13 | ], 14 | "exclude": [ 15 | "node_modules", 16 | "build", 17 | "src/app", // Exclude Next.js app directory 18 | "next-env.d.ts", // Exclude Next.js type declarations file 19 | "src/**/*.test.ts" // Assuming tests are run separately and not part of stdio build output 20 | ] 21 | } --------------------------------------------------------------------------------