├── .env.example ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── examples ├── python-client-example.py └── typescript-client-example.ts ├── install.sh ├── package-lock.json ├── package.json ├── run-server.sh ├── smithery.yaml ├── src └── index.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | # Octagon API Key 2 | OCTAGON_API_KEY=your_octagon_api_key_here 3 | 4 | # Base URL for Octagon API 5 | OCTAGON_API_BASE_URL=https://api.octagonagents.com/v1 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | build 4 | .env 5 | dist* -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-alpine 2 | 3 | WORKDIR /app 4 | 5 | # Copy package files 6 | COPY package*.json ./ 7 | 8 | # Install dependencies 9 | RUN npm install --ignore-scripts 10 | 11 | # Copy source code 12 | COPY . . 13 | 14 | # Build the application 15 | RUN npm run build 16 | 17 | # Run the server 18 | CMD ["node", "dist/index.js"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Octagon AI, 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Octagon: MCP for Market Data 2 | 3 | [![smithery badge](https://smithery.ai/badge/@OctagonAI/octagon-mcp-server)](https://smithery.ai/server/@OctagonAI/octagon-mcp-server) 4 | 5 | ![Favicon](https://docs.octagonagents.com/logo.svg) The Octagon MCP server provides specialized AI-powered financial research and analysis by integrating with the Octagon Market Intelligence API, enabling users to easily analyze and extract detailed insights from public filings, earnings call transcripts, financial metrics, stock market data, and extensive private market transactions within Claude Desktop and other popular MCP clients. 6 | 7 | [![Demo](https://docs.octagonagents.com/financial_model_demo_fast.gif)](https://docs.octagonagents.com/financial_model_demo.mp4) 8 | 9 | ## Features 10 | 11 | ✅ Specialized AI agents for **public market data** 12 | - SEC filings analysis and data extraction (8000+ public companies 10-K, 10-Q, 8-K, 20-F, S-1) 13 | - Earnings call transcript analysis (10 yrs of historical and current) 14 | - Financial metrics and ratios analysis (10 yrs of historical and current) 15 | - Stock market data access (over 10,000 active tickers, daily historical and current) 16 | 17 | ✅ Specialized AI agents for **private market data** 18 | - Private company research (3M+ companies) 19 | - Funding rounds and venture capital research (500k+ deals) 20 | - M&A and IPO transaction research (2M+ deals) 21 | - Debt transactions research (1M+ deals) 22 | 23 | ✅ Specialized AI agents for **deep research** 24 | - Web scraping capabilities (json, csv, python scripts) 25 | - Comprehensive deep research tools 26 | 27 | ## Get Your Octagon API Key 28 | 29 | To use Octagon MCP, you need to: 30 | 31 | 1. Sign up for a free account at [Octagon](https://app.octagonai.co/signup/?redirectToAfterSignup=https://app.octagonai.co/api-keys) 32 | 2. After logging in, from left menu, navigate to **API Keys** 33 | 3. Generate a new API key 34 | 4. Use this API key in your configuration as the `OCTAGON_API_KEY` value 35 | 36 | ## Prerequisites 37 | 38 | Before installing or running Octagon MCP, you need to have `npx` (which comes with Node.js and npm) installed on your system. 39 | 40 | ### Mac (macOS) 41 | 42 | 1. **Install Homebrew** (if you don't have it): 43 | ```bash 44 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 45 | ``` 46 | 2. **Install Node.js (includes npm and npx):** 47 | ```bash 48 | brew install node 49 | ``` 50 | This will install the latest version of Node.js, npm, and npx. 51 | 52 | 3. **Verify installation:** 53 | ```bash 54 | node -v 55 | npm -v 56 | npx -v 57 | ``` 58 | 59 | ### Windows 60 | 61 | 1. **Download the Node.js installer:** 62 | - Go to [https://nodejs.org/](https://nodejs.org/) and download the LTS version for Windows. 63 | 2. **Run the installer** and follow the prompts. This will install Node.js, npm, and npx. 64 | 3. **Verify installation:** 65 | Open Command Prompt and run: 66 | ```cmd 67 | node -v 68 | npm -v 69 | npx -v 70 | ``` 71 | 72 | If you see version numbers for all three, you are ready to proceed with the installation steps below. 73 | 74 | ## Installation 75 | 76 | 77 | ### Running on Claude Desktop 78 | 79 | To configure Octagon MCP for Claude Desktop: 80 | 81 | 1. Open Claude Desktop 82 | 2. Go to Settings > Developer > Edit Config 83 | 3. Add the following to your `claude_desktop_config.json` (Replace `your-octagon-api-key` with your Octagon API key): 84 | ```json 85 | { 86 | "mcpServers": { 87 | "octagon-mcp-server": { 88 | "command": "npx", 89 | "args": ["-y", "octagon-mcp@latest"], 90 | "env": { 91 | "OCTAGON_API_KEY": "YOUR_API_KEY_HERE" 92 | } 93 | } 94 | } 95 | } 96 | ``` 97 | 4. Restart Claude for the changes to take effect 98 | 99 | ### Running on Cursor 100 | 101 | Configuring Cursor Desktop 🖥️ 102 | Note: Requires Cursor version 0.45.6+ 103 | 104 | To configure Octagon MCP in Cursor: 105 | 106 | 1. Open Cursor Settings 107 | 2. Go to Features > MCP Servers 108 | 3. Click "+ Add New MCP Server" 109 | 4. Enter the following: 110 | - Name: "octagon-mcp" (or your preferred name) 111 | - Type: "command" 112 | - Command: `env OCTAGON_API_KEY=your-octagon-api-key npx -y octagon-mcp` 113 | 114 | > If you are using Windows and are running into issues, try `cmd /c "set OCTAGON_API_KEY=your-octagon-api-key && npx -y octagon-mcp"` 115 | 116 | Replace `your-octagon-api-key` with your Octagon API key. 117 | 118 | After adding, refresh the MCP server list to see the new tools. The Composer Agent will automatically use Octagon MCP when appropriate, but you can explicitly request it by describing your investment research needs. Access the Composer via Command+L (Mac), select "Agent" next to the submit button, and enter your query. 119 | 120 | 121 | 122 | ### Running on Windsurf 123 | 124 | Add this to your `./codeium/windsurf/model_config.json`: 125 | 126 | ```json 127 | { 128 | "mcpServers": { 129 | "octagon-mcp-server": { 130 | "command": "npx", 131 | "args": ["-y", "octagon-mcp@latest"], 132 | "env": { 133 | "OCTAGON_API_KEY": "YOUR_API_KEY_HERE" 134 | } 135 | } 136 | } 137 | } 138 | ``` 139 | 140 | ### Running with npx 141 | 142 | ```bash 143 | env OCTAGON_API_KEY=your_octagon_api_key npx -y octagon-mcp 144 | ``` 145 | 146 | ### Manual Installation 147 | 148 | ```bash 149 | npm install -g octagon-mcp 150 | ``` 151 | 152 | ## Documentation 153 | 154 | For comprehensive documentation on using Octagon agents, please visit our official documentation at: 155 | [https://docs.octagonagents.com](https://docs.octagonagents.com) 156 | 157 | The documentation includes: 158 | - Detailed API references 159 | - Agent-specific query guidelines 160 | - Examples and use cases 161 | - Best practices for investment research 162 | 163 | ## Available Tools 164 | 165 | Each tool uses a single `prompt` parameter that accepts a natural language query. Include all relevant details in your prompt. 166 | 167 | ### Comprehensive Market Intelligence 168 | 169 | #### octagon-agent 170 | Orchestrates all agents for comprehensive market intelligence analysis. Combines insights from SEC filings, earnings calls, financial metrics, stock data, institutional holdings, private company research, funding analysis, M&A transactions, investor intelligence, and debt analysis. 171 | 172 | Example queries: 173 | ``` 174 | Retrieve year-over-year growth in key income-statement items for AAPL, limited to 5 records and filtered by period FY 175 | Analyze the latest 10-K filing for AAPL and extract key financial metrics and risk factors 176 | Retrieve the daily closing prices for AAPL over the last 30 days 177 | Analyze AAPL's latest earnings call transcript and extract key insights about future guidance 178 | Provide a comprehensive overview of Stripe, including its business model and key metrics 179 | Retrieve the funding history for Stripe, including all rounds and investors 180 | List all M&A transactions involving Stripe in the last 2 years 181 | Provide a detailed profile of Sequoia Capital's investment strategy and portfolio 182 | Analyze Stripe's debt financing history and current debt structure 183 | Retrieve the most recent Form 13F and related filings submitted by institutional investors 184 | ``` 185 | 186 | ### Public Market Intelligence 187 | 188 | #### octagon-sec-agent 189 | Extract information from SEC filings. 190 | 191 | Example: 192 | ``` 193 | What was Apple's gross margin percentage from their latest 10-Q filing? 194 | ``` 195 | 196 | #### octagon-transcripts-agent 197 | Analyze earnings call transcripts. 198 | 199 | Example: 200 | ``` 201 | What did NVIDIA's CEO say about AI chip demand in their latest earnings call? 202 | ``` 203 | 204 | #### octagon-financials-agent 205 | Retrieve financial metrics and ratios. (Now also supports analysts' financial estimates.) 206 | 207 | Example: 208 | ``` 209 | Calculate the price-to-earnings ratio for Tesla over the last 4 quarters 210 | ``` 211 | 212 | #### octagon-stock-data-agent 213 | Access stock market data. 214 | 215 | Example: 216 | ``` 217 | How has Apple's stock performed compared to the S&P 500 over the last 6 months? 218 | ``` 219 | 220 | #### octagon-holdings-agent 221 | Analyze institutional ownership, Form 13F filings, and fund holdings data. 222 | 223 | Capabilities: 224 | - Retrieve the latest Form 13F and related institutional ownership filings 225 | - Analyze institutional holder filings for specific securities and periods 226 | - Summarize performance of institutional holders (funds, asset managers) 227 | - Break down institutional portfolios by industry/sector 228 | - Summarize institutional positions for a given security 229 | - Benchmark industry performance based on institutional holdings 230 | 231 | Example queries: 232 | ``` 233 | @octagon-holdings-agent Retrieve the most recent Form 13F and related filings submitted by institutional investors, limited to 50 records on page 0. 234 | @octagon-holdings-agent Retrieve analytics for institutional holder filings for AAPL in Q2 of 2023, limited to 20 records on page 0. 235 | @octagon-holdings-agent Get a summary of the performance of the institutional holder with CIK 0001166559. 236 | @octagon-holdings-agent Retrieve the industry breakdown for the holder with CIK 0001067983 for Q4 of 2024. 237 | @octagon-holdings-agent Get a summary of institutional positions for AAPL for Q4 of 2024. 238 | @octagon-holdings-agent Get a financial performance summary for all industries for Q4 of 2024. 239 | ``` 240 | 241 | ### Private Market Intelligence 242 | 243 | #### octagon-companies-agent 244 | Research private company information. 245 | 246 | Example: 247 | ``` 248 | What is the employee count and funding history for Anthropic? 249 | ``` 250 | 251 | #### octagon-funding-agent 252 | Research startup funding rounds and venture capital. 253 | 254 | Example: 255 | ``` 256 | What was OpenAI's latest funding round size, valuation, and key investors? 257 | ``` 258 | 259 | #### octagon-deals-agent 260 | Research M&A and IPO transactions. 261 | 262 | Example: 263 | ``` 264 | What was the acquisition price when Microsoft acquired GitHub? 265 | ``` 266 | 267 | #### octagon-investors-agent 268 | A specialized database agent for looking up information on investors. 269 | 270 | Example: 271 | ``` 272 | What is the latest investment criteria of Insight Partners? 273 | ``` 274 | 275 | #### octagon-debts-agent 276 | A specialized database agent for analyzing private debts, borrowers, and lenders. 277 | 278 | Example: 279 | ``` 280 | List all the debt activities from borrower American Tower 281 | ``` 282 | 283 | ### Additional Tools 284 | 285 | #### octagon-scraper-agent 286 | Extract data from any public website. 287 | 288 | Example: 289 | ``` 290 | Extract property prices and square footage data from zillow.com/san-francisco-ca/ 291 | ``` 292 | 293 | #### octagon-deep-research-agent 294 | Perform comprehensive research on any topic. 295 | 296 | Example: 297 | ``` 298 | Research the financial impact of Apple's privacy changes on digital advertising companies' revenue and margins 299 | ``` 300 | 301 | ## Example Queries 302 | 303 | 1. "What were Amazon's revenue and net income figures in Q4 2023?" 304 | 2. "Analyze Tesla's R&D spending trends over the last 3 years." 305 | 3. "What guidance did NVIDIA's CEO provide regarding AI chip demand in their latest earnings call?" 306 | 4. "Compare the price-to-earnings, price-to-sales, and EV/EBITDA ratios for the top 5 semiconductor companies." 307 | 5. "What was Anthropic's latest funding round size, valuation, and key investors?" 308 | 6. "Extract all data fields from zillow.com/san-francisco-ca/" 309 | 7. "Research the financial impact of Apple's privacy changes on digital advertising companies' revenue and margins" 310 | 8. "Compile all the debt activities from lender ING Group in Q4 2024" 311 | 9. "How many investments did Andreessen Horowitz make in AI startups in the last 12 months?" 312 | 313 | ## Troubleshooting 314 | 315 | 1. **API Key Issues**: Ensure your Octagon API key is correctly set in the environment or config file. 316 | 2. **Connection Issues**: Make sure the connectivity to the Octagon API is working properly. 317 | 3. **Rate Limiting**: If you encounter rate limiting errors, reduce the frequency of your requests. 318 | 319 | ## Installation 320 | 321 | ### Running with npx 322 | 323 | ```bash 324 | env OCTAGON_API_KEY=your_octagon_api_key npx -y octagon-mcp 325 | ``` 326 | 327 | ### Manual Installation 328 | 329 | ```bash 330 | npm install -g octagon-mcp 331 | ``` 332 | 333 | ## License 334 | 335 | MIT 336 | 337 | --- 338 | 339 | ⭐ Star this repo if you find it helpful! 340 | -------------------------------------------------------------------------------- /examples/python-client-example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import asyncio 3 | import os 4 | from typing import Optional 5 | from mcp import ClientSession, StdioServerParameters 6 | from mcp.client.stdio import stdio_client 7 | 8 | async def main(): 9 | # Create server parameters for stdio connection 10 | server_params = StdioServerParameters( 11 | command="node", 12 | args=["../build/index.js"], # Updated path to reflect the new location 13 | env=None 14 | ) 15 | 16 | # Connect to the server 17 | async with stdio_client(server_params) as (read, write): 18 | async with ClientSession(read, write) as session: 19 | # Initialize the connection 20 | await session.initialize() 21 | print("Connected to Octagon MCP server") 22 | 23 | # List available tools 24 | tools = await session.list_tools() 25 | print("Available tools:") 26 | for tool in tools.tools: 27 | print(f"- {tool.name}: {tool.description}") 28 | 29 | # Example: Query SEC filings 30 | print("\nQuerying SEC filings for Apple's revenue...") 31 | sec_result = await session.call_tool( 32 | "octagon-sec-agent", 33 | arguments={ 34 | "prompt": "What was Apple's revenue in the latest quarter according to their 10-Q filing?" 35 | } 36 | ) 37 | print("SEC Filing Result:") 38 | print(sec_result.content[0].text) 39 | 40 | # Example: Analyze earnings call 41 | print("\nAnalyzing earnings call for Microsoft...") 42 | earnings_result = await session.call_tool( 43 | "octagon-transcripts-agent", 44 | arguments={ 45 | "prompt": "What did Microsoft's CEO say about AI initiatives in their latest earnings call?" 46 | } 47 | ) 48 | print("Earnings Call Analysis:") 49 | print(earnings_result.content[0].text) 50 | 51 | if __name__ == "__main__": 52 | asyncio.run(main()) -------------------------------------------------------------------------------- /examples/typescript-client-example.ts: -------------------------------------------------------------------------------- 1 | import { Client } from "@modelcontextprotocol/sdk/client/index.js"; 2 | import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; 3 | 4 | async function main() { 5 | try { 6 | // Create a client 7 | const client = new Client({ 8 | name: "octagon-client-example", 9 | version: "1.0.0", 10 | }); 11 | 12 | // Connect to the server 13 | const transport = new StdioClientTransport({ 14 | command: "node", 15 | args: ["../build/index.js"], // Updated path to reflect the new location 16 | }); 17 | await client.connect(transport); 18 | 19 | console.log("Connected to Octagon MCP server"); 20 | 21 | // List available tools 22 | const toolsResult = await client.listTools(); 23 | console.log("Available tools:"); 24 | for (const tool of toolsResult.tools) { 25 | console.log(`- ${tool.name}: ${tool.description}`); 26 | } 27 | 28 | // Example: Query SEC filings 29 | console.log("\nQuerying SEC filings for Apple's revenue..."); 30 | const secResult = await client.callTool({ 31 | name: "octagon-sec-agent", 32 | arguments: { 33 | prompt: "What was Apple's revenue in the latest quarter according to their 10-Q filing?", 34 | }, 35 | }); 36 | 37 | console.log("SEC Filing Result:"); 38 | console.log(secResult.content[0].text); 39 | 40 | // Example: Analyze earnings call 41 | console.log("\nAnalyzing earnings call for Microsoft..."); 42 | const earningsResult = await client.callTool({ 43 | name: "octagon-transcripts-agent", 44 | arguments: { 45 | prompt: "What did Microsoft's CEO say about AI initiatives in their latest earnings call?", 46 | }, 47 | }); 48 | 49 | console.log("Earnings Call Analysis:"); 50 | console.log(earningsResult.content[0].text); 51 | 52 | // Close the client 53 | await client.close(); 54 | } catch (error) { 55 | console.error("Error:", error); 56 | process.exit(1); 57 | } 58 | } 59 | 60 | main(); -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Octagon MCP Server Installation Script 4 | 5 | echo "Installing Octagon MCP Server..." 6 | 7 | # Check if Node.js is installed 8 | if ! command -v node &> /dev/null; then 9 | echo "Node.js is not installed. Please install Node.js before continuing." 10 | exit 1 11 | fi 12 | 13 | # Check if npm is installed 14 | if ! command -v npm &> /dev/null; then 15 | echo "npm is not installed. Please install npm before continuing." 16 | exit 1 17 | fi 18 | 19 | # Install dependencies 20 | echo "Installing dependencies..." 21 | npm install 22 | 23 | # Build the server 24 | echo "Building the server..." 25 | npm run build 26 | 27 | # Create .env file if it doesn't exist 28 | if [ ! -f .env ]; then 29 | echo "Creating .env file..." 30 | cp .env.example .env 31 | echo "Please edit the .env file and add your Octagon API key." 32 | fi 33 | 34 | echo "Installation complete!" 35 | echo "" 36 | echo "There are multiple ways to use the Octagon MCP Server:" 37 | echo "" 38 | echo "1. Run directly with your API key:" 39 | echo " env OCTAGON_API_KEY=your_octagon_api_key node ./dist/index.js" 40 | echo "" 41 | echo "2. Install globally and run with npx:" 42 | echo " npm install -g ." 43 | echo " env OCTAGON_API_KEY=your_octagon_api_key npx octagon-mcp" 44 | echo "" 45 | echo "3. To use with Claude Desktop, add the following to your claude_desktop_config.json:" 46 | echo '{ 47 | "mcpServers": { 48 | "octagon": { 49 | "command": "env", 50 | "args": ["OCTAGON_API_KEY=your_octagon_api_key", "npx", "-y", "octagon-mcp"] 51 | } 52 | } 53 | }' 54 | echo "" 55 | echo "4. To use with Cursor, add a new MCP server with:" 56 | echo " - Name: octagon-mcp" 57 | echo " - Type: command" 58 | echo " - Command: env OCTAGON_API_KEY=your_octagon_api_key npx -y octagon-mcp" -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "octagon-mcp", 3 | "version": "1.0.13", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "octagon-mcp", 9 | "version": "1.0.13", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.0.0", 13 | "dotenv": "^16.3.1", 14 | "openai": "^4.20.1", 15 | "zod": "^3.22.4" 16 | }, 17 | "bin": { 18 | "octagon-mcp": "dist/index.js" 19 | }, 20 | "devDependencies": { 21 | "@types/node": "^20.10.0", 22 | "ts-node": "^10.9.2", 23 | "typescript": "^5.3.2" 24 | }, 25 | "engines": { 26 | "node": ">=18.0.0" 27 | } 28 | }, 29 | "node_modules/@cspotcode/source-map-support": { 30 | "version": "0.8.1", 31 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 32 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 33 | "dev": true, 34 | "license": "MIT", 35 | "dependencies": { 36 | "@jridgewell/trace-mapping": "0.3.9" 37 | }, 38 | "engines": { 39 | "node": ">=12" 40 | } 41 | }, 42 | "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/resolve-uri": { 43 | "version": "3.1.2", 44 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 45 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 46 | "dev": true, 47 | "license": "MIT", 48 | "engines": { 49 | "node": ">=6.0.0" 50 | } 51 | }, 52 | "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/sourcemap-codec": { 53 | "version": "1.5.0", 54 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 55 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 56 | "dev": true, 57 | "license": "MIT" 58 | }, 59 | "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { 60 | "version": "0.3.9", 61 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 62 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 63 | "dev": true, 64 | "license": "MIT", 65 | "dependencies": { 66 | "@jridgewell/resolve-uri": "^3.0.3", 67 | "@jridgewell/sourcemap-codec": "^1.4.10" 68 | } 69 | }, 70 | "node_modules/@modelcontextprotocol/sdk": { 71 | "version": "1.7.0", 72 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.7.0.tgz", 73 | "integrity": "sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==", 74 | "license": "MIT", 75 | "dependencies": { 76 | "content-type": "^1.0.5", 77 | "cors": "^2.8.5", 78 | "eventsource": "^3.0.2", 79 | "express": "^5.0.1", 80 | "express-rate-limit": "^7.5.0", 81 | "pkce-challenge": "^4.1.0", 82 | "raw-body": "^3.0.0", 83 | "zod": "^3.23.8", 84 | "zod-to-json-schema": "^3.24.1" 85 | }, 86 | "engines": { 87 | "node": ">=18" 88 | } 89 | }, 90 | "node_modules/@tsconfig/node10": { 91 | "version": "1.0.11", 92 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 93 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 94 | "dev": true, 95 | "license": "MIT" 96 | }, 97 | "node_modules/@tsconfig/node12": { 98 | "version": "1.0.11", 99 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 100 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 101 | "dev": true, 102 | "license": "MIT" 103 | }, 104 | "node_modules/@tsconfig/node14": { 105 | "version": "1.0.3", 106 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 107 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 108 | "dev": true, 109 | "license": "MIT" 110 | }, 111 | "node_modules/@tsconfig/node16": { 112 | "version": "1.0.4", 113 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 114 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 115 | "dev": true, 116 | "license": "MIT" 117 | }, 118 | "node_modules/@types/node": { 119 | "version": "20.17.24", 120 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.24.tgz", 121 | "integrity": "sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==", 122 | "license": "MIT", 123 | "dependencies": { 124 | "undici-types": "~6.19.2" 125 | } 126 | }, 127 | "node_modules/@types/node-fetch": { 128 | "version": "2.6.12", 129 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", 130 | "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", 131 | "license": "MIT", 132 | "dependencies": { 133 | "@types/node": "*", 134 | "form-data": "^4.0.0" 135 | } 136 | }, 137 | "node_modules/@types/node-fetch/node_modules/asynckit": { 138 | "version": "0.4.0", 139 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 140 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 141 | "license": "MIT" 142 | }, 143 | "node_modules/@types/node-fetch/node_modules/call-bind-apply-helpers": { 144 | "version": "1.0.2", 145 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 146 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 147 | "license": "MIT", 148 | "dependencies": { 149 | "es-errors": "^1.3.0", 150 | "function-bind": "^1.1.2" 151 | }, 152 | "engines": { 153 | "node": ">= 0.4" 154 | } 155 | }, 156 | "node_modules/@types/node-fetch/node_modules/combined-stream": { 157 | "version": "1.0.8", 158 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 159 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 160 | "license": "MIT", 161 | "dependencies": { 162 | "delayed-stream": "~1.0.0" 163 | }, 164 | "engines": { 165 | "node": ">= 0.8" 166 | } 167 | }, 168 | "node_modules/@types/node-fetch/node_modules/delayed-stream": { 169 | "version": "1.0.0", 170 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 171 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 172 | "license": "MIT", 173 | "engines": { 174 | "node": ">=0.4.0" 175 | } 176 | }, 177 | "node_modules/@types/node-fetch/node_modules/dunder-proto": { 178 | "version": "1.0.1", 179 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 180 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 181 | "license": "MIT", 182 | "dependencies": { 183 | "call-bind-apply-helpers": "^1.0.1", 184 | "es-errors": "^1.3.0", 185 | "gopd": "^1.2.0" 186 | }, 187 | "engines": { 188 | "node": ">= 0.4" 189 | } 190 | }, 191 | "node_modules/@types/node-fetch/node_modules/es-define-property": { 192 | "version": "1.0.1", 193 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 194 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 195 | "license": "MIT", 196 | "engines": { 197 | "node": ">= 0.4" 198 | } 199 | }, 200 | "node_modules/@types/node-fetch/node_modules/es-errors": { 201 | "version": "1.3.0", 202 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 203 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 204 | "license": "MIT", 205 | "engines": { 206 | "node": ">= 0.4" 207 | } 208 | }, 209 | "node_modules/@types/node-fetch/node_modules/es-object-atoms": { 210 | "version": "1.1.1", 211 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 212 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 213 | "license": "MIT", 214 | "dependencies": { 215 | "es-errors": "^1.3.0" 216 | }, 217 | "engines": { 218 | "node": ">= 0.4" 219 | } 220 | }, 221 | "node_modules/@types/node-fetch/node_modules/es-set-tostringtag": { 222 | "version": "2.1.0", 223 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 224 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 225 | "license": "MIT", 226 | "dependencies": { 227 | "es-errors": "^1.3.0", 228 | "get-intrinsic": "^1.2.6", 229 | "has-tostringtag": "^1.0.2", 230 | "hasown": "^2.0.2" 231 | }, 232 | "engines": { 233 | "node": ">= 0.4" 234 | } 235 | }, 236 | "node_modules/@types/node-fetch/node_modules/form-data": { 237 | "version": "4.0.2", 238 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 239 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 240 | "license": "MIT", 241 | "dependencies": { 242 | "asynckit": "^0.4.0", 243 | "combined-stream": "^1.0.8", 244 | "es-set-tostringtag": "^2.1.0", 245 | "mime-types": "^2.1.12" 246 | }, 247 | "engines": { 248 | "node": ">= 6" 249 | } 250 | }, 251 | "node_modules/@types/node-fetch/node_modules/function-bind": { 252 | "version": "1.1.2", 253 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 254 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 255 | "license": "MIT", 256 | "funding": { 257 | "url": "https://github.com/sponsors/ljharb" 258 | } 259 | }, 260 | "node_modules/@types/node-fetch/node_modules/get-intrinsic": { 261 | "version": "1.3.0", 262 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 263 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 264 | "license": "MIT", 265 | "dependencies": { 266 | "call-bind-apply-helpers": "^1.0.2", 267 | "es-define-property": "^1.0.1", 268 | "es-errors": "^1.3.0", 269 | "es-object-atoms": "^1.1.1", 270 | "function-bind": "^1.1.2", 271 | "get-proto": "^1.0.1", 272 | "gopd": "^1.2.0", 273 | "has-symbols": "^1.1.0", 274 | "hasown": "^2.0.2", 275 | "math-intrinsics": "^1.1.0" 276 | }, 277 | "engines": { 278 | "node": ">= 0.4" 279 | }, 280 | "funding": { 281 | "url": "https://github.com/sponsors/ljharb" 282 | } 283 | }, 284 | "node_modules/@types/node-fetch/node_modules/get-proto": { 285 | "version": "1.0.1", 286 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 287 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 288 | "license": "MIT", 289 | "dependencies": { 290 | "dunder-proto": "^1.0.1", 291 | "es-object-atoms": "^1.0.0" 292 | }, 293 | "engines": { 294 | "node": ">= 0.4" 295 | } 296 | }, 297 | "node_modules/@types/node-fetch/node_modules/gopd": { 298 | "version": "1.2.0", 299 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 300 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 301 | "license": "MIT", 302 | "engines": { 303 | "node": ">= 0.4" 304 | }, 305 | "funding": { 306 | "url": "https://github.com/sponsors/ljharb" 307 | } 308 | }, 309 | "node_modules/@types/node-fetch/node_modules/has-symbols": { 310 | "version": "1.1.0", 311 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 312 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 313 | "license": "MIT", 314 | "engines": { 315 | "node": ">= 0.4" 316 | }, 317 | "funding": { 318 | "url": "https://github.com/sponsors/ljharb" 319 | } 320 | }, 321 | "node_modules/@types/node-fetch/node_modules/has-tostringtag": { 322 | "version": "1.0.2", 323 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 324 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 325 | "license": "MIT", 326 | "dependencies": { 327 | "has-symbols": "^1.0.3" 328 | }, 329 | "engines": { 330 | "node": ">= 0.4" 331 | }, 332 | "funding": { 333 | "url": "https://github.com/sponsors/ljharb" 334 | } 335 | }, 336 | "node_modules/@types/node-fetch/node_modules/hasown": { 337 | "version": "2.0.2", 338 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 339 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 340 | "license": "MIT", 341 | "dependencies": { 342 | "function-bind": "^1.1.2" 343 | }, 344 | "engines": { 345 | "node": ">= 0.4" 346 | } 347 | }, 348 | "node_modules/@types/node-fetch/node_modules/math-intrinsics": { 349 | "version": "1.1.0", 350 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 351 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 352 | "license": "MIT", 353 | "engines": { 354 | "node": ">= 0.4" 355 | } 356 | }, 357 | "node_modules/@types/node-fetch/node_modules/mime-db": { 358 | "version": "1.52.0", 359 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 360 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 361 | "license": "MIT", 362 | "engines": { 363 | "node": ">= 0.6" 364 | } 365 | }, 366 | "node_modules/@types/node-fetch/node_modules/mime-types": { 367 | "version": "2.1.35", 368 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 369 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 370 | "license": "MIT", 371 | "dependencies": { 372 | "mime-db": "1.52.0" 373 | }, 374 | "engines": { 375 | "node": ">= 0.6" 376 | } 377 | }, 378 | "node_modules/abort-controller": { 379 | "version": "3.0.0", 380 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 381 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 382 | "license": "MIT", 383 | "dependencies": { 384 | "event-target-shim": "^5.0.0" 385 | }, 386 | "engines": { 387 | "node": ">=6.5" 388 | } 389 | }, 390 | "node_modules/abort-controller/node_modules/event-target-shim": { 391 | "version": "5.0.1", 392 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 393 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 394 | "license": "MIT", 395 | "engines": { 396 | "node": ">=6" 397 | } 398 | }, 399 | "node_modules/acorn": { 400 | "version": "8.14.1", 401 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 402 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 403 | "dev": true, 404 | "license": "MIT", 405 | "bin": { 406 | "acorn": "bin/acorn" 407 | }, 408 | "engines": { 409 | "node": ">=0.4.0" 410 | } 411 | }, 412 | "node_modules/acorn-walk": { 413 | "version": "8.3.4", 414 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 415 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 416 | "dev": true, 417 | "license": "MIT", 418 | "dependencies": { 419 | "acorn": "^8.11.0" 420 | }, 421 | "engines": { 422 | "node": ">=0.4.0" 423 | } 424 | }, 425 | "node_modules/agentkeepalive": { 426 | "version": "4.6.0", 427 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", 428 | "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", 429 | "license": "MIT", 430 | "dependencies": { 431 | "humanize-ms": "^1.2.1" 432 | }, 433 | "engines": { 434 | "node": ">= 8.0.0" 435 | } 436 | }, 437 | "node_modules/agentkeepalive/node_modules/humanize-ms": { 438 | "version": "1.2.1", 439 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 440 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 441 | "license": "MIT", 442 | "dependencies": { 443 | "ms": "^2.0.0" 444 | } 445 | }, 446 | "node_modules/agentkeepalive/node_modules/ms": { 447 | "version": "2.1.3", 448 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 449 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 450 | "license": "MIT" 451 | }, 452 | "node_modules/arg": { 453 | "version": "4.1.3", 454 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 455 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 456 | "dev": true, 457 | "license": "MIT" 458 | }, 459 | "node_modules/content-type": { 460 | "version": "1.0.5", 461 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 462 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 463 | "license": "MIT", 464 | "engines": { 465 | "node": ">= 0.6" 466 | } 467 | }, 468 | "node_modules/cors": { 469 | "version": "2.8.5", 470 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 471 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 472 | "license": "MIT", 473 | "dependencies": { 474 | "object-assign": "^4", 475 | "vary": "^1" 476 | }, 477 | "engines": { 478 | "node": ">= 0.10" 479 | } 480 | }, 481 | "node_modules/cors/node_modules/object-assign": { 482 | "version": "4.1.1", 483 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 484 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 485 | "license": "MIT", 486 | "engines": { 487 | "node": ">=0.10.0" 488 | } 489 | }, 490 | "node_modules/cors/node_modules/vary": { 491 | "version": "1.1.2", 492 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 493 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 494 | "license": "MIT", 495 | "engines": { 496 | "node": ">= 0.8" 497 | } 498 | }, 499 | "node_modules/create-require": { 500 | "version": "1.1.1", 501 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 502 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 503 | "dev": true, 504 | "license": "MIT" 505 | }, 506 | "node_modules/diff": { 507 | "version": "4.0.2", 508 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 509 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 510 | "dev": true, 511 | "license": "BSD-3-Clause", 512 | "engines": { 513 | "node": ">=0.3.1" 514 | } 515 | }, 516 | "node_modules/dotenv": { 517 | "version": "16.4.7", 518 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", 519 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", 520 | "license": "BSD-2-Clause", 521 | "engines": { 522 | "node": ">=12" 523 | }, 524 | "funding": { 525 | "url": "https://dotenvx.com" 526 | } 527 | }, 528 | "node_modules/eventsource": { 529 | "version": "3.0.5", 530 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz", 531 | "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==", 532 | "license": "MIT", 533 | "dependencies": { 534 | "eventsource-parser": "^3.0.0" 535 | }, 536 | "engines": { 537 | "node": ">=18.0.0" 538 | } 539 | }, 540 | "node_modules/eventsource/node_modules/eventsource-parser": { 541 | "version": "3.0.0", 542 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz", 543 | "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==", 544 | "license": "MIT", 545 | "engines": { 546 | "node": ">=18.0.0" 547 | } 548 | }, 549 | "node_modules/express": { 550 | "version": "5.0.1", 551 | "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", 552 | "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", 553 | "license": "MIT", 554 | "dependencies": { 555 | "accepts": "^2.0.0", 556 | "body-parser": "^2.0.1", 557 | "content-disposition": "^1.0.0", 558 | "content-type": "~1.0.4", 559 | "cookie": "0.7.1", 560 | "cookie-signature": "^1.2.1", 561 | "debug": "4.3.6", 562 | "depd": "2.0.0", 563 | "encodeurl": "~2.0.0", 564 | "escape-html": "~1.0.3", 565 | "etag": "~1.8.1", 566 | "finalhandler": "^2.0.0", 567 | "fresh": "2.0.0", 568 | "http-errors": "2.0.0", 569 | "merge-descriptors": "^2.0.0", 570 | "methods": "~1.1.2", 571 | "mime-types": "^3.0.0", 572 | "on-finished": "2.4.1", 573 | "once": "1.4.0", 574 | "parseurl": "~1.3.3", 575 | "proxy-addr": "~2.0.7", 576 | "qs": "6.13.0", 577 | "range-parser": "~1.2.1", 578 | "router": "^2.0.0", 579 | "safe-buffer": "5.2.1", 580 | "send": "^1.1.0", 581 | "serve-static": "^2.1.0", 582 | "setprototypeof": "1.2.0", 583 | "statuses": "2.0.1", 584 | "type-is": "^2.0.0", 585 | "utils-merge": "1.0.1", 586 | "vary": "~1.1.2" 587 | }, 588 | "engines": { 589 | "node": ">= 18" 590 | } 591 | }, 592 | "node_modules/express-rate-limit": { 593 | "version": "7.5.0", 594 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 595 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 596 | "license": "MIT", 597 | "engines": { 598 | "node": ">= 16" 599 | }, 600 | "funding": { 601 | "url": "https://github.com/sponsors/express-rate-limit" 602 | }, 603 | "peerDependencies": { 604 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 605 | } 606 | }, 607 | "node_modules/express/node_modules/accepts": { 608 | "version": "2.0.0", 609 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 610 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 611 | "license": "MIT", 612 | "dependencies": { 613 | "mime-types": "^3.0.0", 614 | "negotiator": "^1.0.0" 615 | }, 616 | "engines": { 617 | "node": ">= 0.6" 618 | } 619 | }, 620 | "node_modules/express/node_modules/body-parser": { 621 | "version": "2.1.0", 622 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", 623 | "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", 624 | "license": "MIT", 625 | "dependencies": { 626 | "bytes": "^3.1.2", 627 | "content-type": "^1.0.5", 628 | "debug": "^4.4.0", 629 | "http-errors": "^2.0.0", 630 | "iconv-lite": "^0.5.2", 631 | "on-finished": "^2.4.1", 632 | "qs": "^6.14.0", 633 | "raw-body": "^3.0.0", 634 | "type-is": "^2.0.0" 635 | }, 636 | "engines": { 637 | "node": ">=18" 638 | } 639 | }, 640 | "node_modules/express/node_modules/body-parser/node_modules/debug": { 641 | "version": "4.4.0", 642 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 643 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 644 | "license": "MIT", 645 | "dependencies": { 646 | "ms": "^2.1.3" 647 | }, 648 | "engines": { 649 | "node": ">=6.0" 650 | }, 651 | "peerDependenciesMeta": { 652 | "supports-color": { 653 | "optional": true 654 | } 655 | } 656 | }, 657 | "node_modules/express/node_modules/body-parser/node_modules/ms": { 658 | "version": "2.1.3", 659 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 660 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 661 | "license": "MIT" 662 | }, 663 | "node_modules/express/node_modules/body-parser/node_modules/qs": { 664 | "version": "6.14.0", 665 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 666 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 667 | "license": "BSD-3-Clause", 668 | "dependencies": { 669 | "side-channel": "^1.1.0" 670 | }, 671 | "engines": { 672 | "node": ">=0.6" 673 | }, 674 | "funding": { 675 | "url": "https://github.com/sponsors/ljharb" 676 | } 677 | }, 678 | "node_modules/express/node_modules/bytes": { 679 | "version": "3.1.2", 680 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 681 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 682 | "license": "MIT", 683 | "engines": { 684 | "node": ">= 0.8" 685 | } 686 | }, 687 | "node_modules/express/node_modules/call-bind-apply-helpers": { 688 | "version": "1.0.2", 689 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 690 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 691 | "license": "MIT", 692 | "dependencies": { 693 | "es-errors": "^1.3.0", 694 | "function-bind": "^1.1.2" 695 | }, 696 | "engines": { 697 | "node": ">= 0.4" 698 | } 699 | }, 700 | "node_modules/express/node_modules/call-bound": { 701 | "version": "1.0.4", 702 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 703 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 704 | "license": "MIT", 705 | "dependencies": { 706 | "call-bind-apply-helpers": "^1.0.2", 707 | "get-intrinsic": "^1.3.0" 708 | }, 709 | "engines": { 710 | "node": ">= 0.4" 711 | }, 712 | "funding": { 713 | "url": "https://github.com/sponsors/ljharb" 714 | } 715 | }, 716 | "node_modules/express/node_modules/content-disposition": { 717 | "version": "1.0.0", 718 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 719 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 720 | "license": "MIT", 721 | "dependencies": { 722 | "safe-buffer": "5.2.1" 723 | }, 724 | "engines": { 725 | "node": ">= 0.6" 726 | } 727 | }, 728 | "node_modules/express/node_modules/cookie": { 729 | "version": "0.7.1", 730 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 731 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 732 | "license": "MIT", 733 | "engines": { 734 | "node": ">= 0.6" 735 | } 736 | }, 737 | "node_modules/express/node_modules/cookie-signature": { 738 | "version": "1.2.2", 739 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 740 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 741 | "license": "MIT", 742 | "engines": { 743 | "node": ">=6.6.0" 744 | } 745 | }, 746 | "node_modules/express/node_modules/debug": { 747 | "version": "4.3.6", 748 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 749 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 750 | "license": "MIT", 751 | "dependencies": { 752 | "ms": "2.1.2" 753 | }, 754 | "engines": { 755 | "node": ">=6.0" 756 | }, 757 | "peerDependenciesMeta": { 758 | "supports-color": { 759 | "optional": true 760 | } 761 | } 762 | }, 763 | "node_modules/express/node_modules/depd": { 764 | "version": "2.0.0", 765 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 766 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 767 | "license": "MIT", 768 | "engines": { 769 | "node": ">= 0.8" 770 | } 771 | }, 772 | "node_modules/express/node_modules/destroy": { 773 | "version": "1.2.0", 774 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 775 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 776 | "license": "MIT", 777 | "engines": { 778 | "node": ">= 0.8", 779 | "npm": "1.2.8000 || >= 1.4.16" 780 | } 781 | }, 782 | "node_modules/express/node_modules/dunder-proto": { 783 | "version": "1.0.1", 784 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 785 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 786 | "license": "MIT", 787 | "dependencies": { 788 | "call-bind-apply-helpers": "^1.0.1", 789 | "es-errors": "^1.3.0", 790 | "gopd": "^1.2.0" 791 | }, 792 | "engines": { 793 | "node": ">= 0.4" 794 | } 795 | }, 796 | "node_modules/express/node_modules/ee-first": { 797 | "version": "1.1.1", 798 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 799 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 800 | "license": "MIT" 801 | }, 802 | "node_modules/express/node_modules/encodeurl": { 803 | "version": "2.0.0", 804 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 805 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 806 | "license": "MIT", 807 | "engines": { 808 | "node": ">= 0.8" 809 | } 810 | }, 811 | "node_modules/express/node_modules/es-define-property": { 812 | "version": "1.0.1", 813 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 814 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 815 | "license": "MIT", 816 | "engines": { 817 | "node": ">= 0.4" 818 | } 819 | }, 820 | "node_modules/express/node_modules/es-errors": { 821 | "version": "1.3.0", 822 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 823 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 824 | "license": "MIT", 825 | "engines": { 826 | "node": ">= 0.4" 827 | } 828 | }, 829 | "node_modules/express/node_modules/es-object-atoms": { 830 | "version": "1.1.1", 831 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 832 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 833 | "license": "MIT", 834 | "dependencies": { 835 | "es-errors": "^1.3.0" 836 | }, 837 | "engines": { 838 | "node": ">= 0.4" 839 | } 840 | }, 841 | "node_modules/express/node_modules/escape-html": { 842 | "version": "1.0.3", 843 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 844 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 845 | "license": "MIT" 846 | }, 847 | "node_modules/express/node_modules/etag": { 848 | "version": "1.8.1", 849 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 850 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 851 | "license": "MIT", 852 | "engines": { 853 | "node": ">= 0.6" 854 | } 855 | }, 856 | "node_modules/express/node_modules/finalhandler": { 857 | "version": "2.1.0", 858 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 859 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 860 | "license": "MIT", 861 | "dependencies": { 862 | "debug": "^4.4.0", 863 | "encodeurl": "^2.0.0", 864 | "escape-html": "^1.0.3", 865 | "on-finished": "^2.4.1", 866 | "parseurl": "^1.3.3", 867 | "statuses": "^2.0.1" 868 | }, 869 | "engines": { 870 | "node": ">= 0.8" 871 | } 872 | }, 873 | "node_modules/express/node_modules/finalhandler/node_modules/debug": { 874 | "version": "4.4.0", 875 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 876 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 877 | "license": "MIT", 878 | "dependencies": { 879 | "ms": "^2.1.3" 880 | }, 881 | "engines": { 882 | "node": ">=6.0" 883 | }, 884 | "peerDependenciesMeta": { 885 | "supports-color": { 886 | "optional": true 887 | } 888 | } 889 | }, 890 | "node_modules/express/node_modules/finalhandler/node_modules/ms": { 891 | "version": "2.1.3", 892 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 893 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 894 | "license": "MIT" 895 | }, 896 | "node_modules/express/node_modules/forwarded": { 897 | "version": "0.2.0", 898 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 899 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 900 | "license": "MIT", 901 | "engines": { 902 | "node": ">= 0.6" 903 | } 904 | }, 905 | "node_modules/express/node_modules/fresh": { 906 | "version": "2.0.0", 907 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 908 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 909 | "license": "MIT", 910 | "engines": { 911 | "node": ">= 0.8" 912 | } 913 | }, 914 | "node_modules/express/node_modules/function-bind": { 915 | "version": "1.1.2", 916 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 917 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 918 | "license": "MIT", 919 | "funding": { 920 | "url": "https://github.com/sponsors/ljharb" 921 | } 922 | }, 923 | "node_modules/express/node_modules/get-intrinsic": { 924 | "version": "1.3.0", 925 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 926 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 927 | "license": "MIT", 928 | "dependencies": { 929 | "call-bind-apply-helpers": "^1.0.2", 930 | "es-define-property": "^1.0.1", 931 | "es-errors": "^1.3.0", 932 | "es-object-atoms": "^1.1.1", 933 | "function-bind": "^1.1.2", 934 | "get-proto": "^1.0.1", 935 | "gopd": "^1.2.0", 936 | "has-symbols": "^1.1.0", 937 | "hasown": "^2.0.2", 938 | "math-intrinsics": "^1.1.0" 939 | }, 940 | "engines": { 941 | "node": ">= 0.4" 942 | }, 943 | "funding": { 944 | "url": "https://github.com/sponsors/ljharb" 945 | } 946 | }, 947 | "node_modules/express/node_modules/get-proto": { 948 | "version": "1.0.1", 949 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 950 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 951 | "license": "MIT", 952 | "dependencies": { 953 | "dunder-proto": "^1.0.1", 954 | "es-object-atoms": "^1.0.0" 955 | }, 956 | "engines": { 957 | "node": ">= 0.4" 958 | } 959 | }, 960 | "node_modules/express/node_modules/gopd": { 961 | "version": "1.2.0", 962 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 963 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 964 | "license": "MIT", 965 | "engines": { 966 | "node": ">= 0.4" 967 | }, 968 | "funding": { 969 | "url": "https://github.com/sponsors/ljharb" 970 | } 971 | }, 972 | "node_modules/express/node_modules/has-symbols": { 973 | "version": "1.1.0", 974 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 975 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 976 | "license": "MIT", 977 | "engines": { 978 | "node": ">= 0.4" 979 | }, 980 | "funding": { 981 | "url": "https://github.com/sponsors/ljharb" 982 | } 983 | }, 984 | "node_modules/express/node_modules/hasown": { 985 | "version": "2.0.2", 986 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 987 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 988 | "license": "MIT", 989 | "dependencies": { 990 | "function-bind": "^1.1.2" 991 | }, 992 | "engines": { 993 | "node": ">= 0.4" 994 | } 995 | }, 996 | "node_modules/express/node_modules/http-errors": { 997 | "version": "2.0.0", 998 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 999 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1000 | "license": "MIT", 1001 | "dependencies": { 1002 | "depd": "2.0.0", 1003 | "inherits": "2.0.4", 1004 | "setprototypeof": "1.2.0", 1005 | "statuses": "2.0.1", 1006 | "toidentifier": "1.0.1" 1007 | }, 1008 | "engines": { 1009 | "node": ">= 0.8" 1010 | } 1011 | }, 1012 | "node_modules/express/node_modules/iconv-lite": { 1013 | "version": "0.5.2", 1014 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", 1015 | "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", 1016 | "license": "MIT", 1017 | "dependencies": { 1018 | "safer-buffer": ">= 2.1.2 < 3" 1019 | }, 1020 | "engines": { 1021 | "node": ">=0.10.0" 1022 | } 1023 | }, 1024 | "node_modules/express/node_modules/inherits": { 1025 | "version": "2.0.4", 1026 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1027 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1028 | "license": "ISC" 1029 | }, 1030 | "node_modules/express/node_modules/ipaddr.js": { 1031 | "version": "1.9.1", 1032 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1033 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1034 | "license": "MIT", 1035 | "engines": { 1036 | "node": ">= 0.10" 1037 | } 1038 | }, 1039 | "node_modules/express/node_modules/is-promise": { 1040 | "version": "4.0.0", 1041 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 1042 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 1043 | "license": "MIT" 1044 | }, 1045 | "node_modules/express/node_modules/math-intrinsics": { 1046 | "version": "1.1.0", 1047 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 1048 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 1049 | "license": "MIT", 1050 | "engines": { 1051 | "node": ">= 0.4" 1052 | } 1053 | }, 1054 | "node_modules/express/node_modules/media-typer": { 1055 | "version": "1.1.0", 1056 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 1057 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 1058 | "license": "MIT", 1059 | "engines": { 1060 | "node": ">= 0.8" 1061 | } 1062 | }, 1063 | "node_modules/express/node_modules/merge-descriptors": { 1064 | "version": "2.0.0", 1065 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 1066 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 1067 | "license": "MIT", 1068 | "engines": { 1069 | "node": ">=18" 1070 | }, 1071 | "funding": { 1072 | "url": "https://github.com/sponsors/sindresorhus" 1073 | } 1074 | }, 1075 | "node_modules/express/node_modules/methods": { 1076 | "version": "1.1.2", 1077 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1078 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1079 | "license": "MIT", 1080 | "engines": { 1081 | "node": ">= 0.6" 1082 | } 1083 | }, 1084 | "node_modules/express/node_modules/mime-db": { 1085 | "version": "1.53.0", 1086 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", 1087 | "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", 1088 | "license": "MIT", 1089 | "engines": { 1090 | "node": ">= 0.6" 1091 | } 1092 | }, 1093 | "node_modules/express/node_modules/mime-types": { 1094 | "version": "3.0.0", 1095 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", 1096 | "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", 1097 | "license": "MIT", 1098 | "dependencies": { 1099 | "mime-db": "^1.53.0" 1100 | }, 1101 | "engines": { 1102 | "node": ">= 0.6" 1103 | } 1104 | }, 1105 | "node_modules/express/node_modules/ms": { 1106 | "version": "2.1.2", 1107 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1108 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1109 | "license": "MIT" 1110 | }, 1111 | "node_modules/express/node_modules/negotiator": { 1112 | "version": "1.0.0", 1113 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 1114 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 1115 | "license": "MIT", 1116 | "engines": { 1117 | "node": ">= 0.6" 1118 | } 1119 | }, 1120 | "node_modules/express/node_modules/object-inspect": { 1121 | "version": "1.13.4", 1122 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 1123 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 1124 | "license": "MIT", 1125 | "engines": { 1126 | "node": ">= 0.4" 1127 | }, 1128 | "funding": { 1129 | "url": "https://github.com/sponsors/ljharb" 1130 | } 1131 | }, 1132 | "node_modules/express/node_modules/on-finished": { 1133 | "version": "2.4.1", 1134 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1135 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1136 | "license": "MIT", 1137 | "dependencies": { 1138 | "ee-first": "1.1.1" 1139 | }, 1140 | "engines": { 1141 | "node": ">= 0.8" 1142 | } 1143 | }, 1144 | "node_modules/express/node_modules/once": { 1145 | "version": "1.4.0", 1146 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1147 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1148 | "license": "ISC", 1149 | "dependencies": { 1150 | "wrappy": "1" 1151 | } 1152 | }, 1153 | "node_modules/express/node_modules/parseurl": { 1154 | "version": "1.3.3", 1155 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1156 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1157 | "license": "MIT", 1158 | "engines": { 1159 | "node": ">= 0.8" 1160 | } 1161 | }, 1162 | "node_modules/express/node_modules/path-to-regexp": { 1163 | "version": "8.2.0", 1164 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 1165 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 1166 | "license": "MIT", 1167 | "engines": { 1168 | "node": ">=16" 1169 | } 1170 | }, 1171 | "node_modules/express/node_modules/proxy-addr": { 1172 | "version": "2.0.7", 1173 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1174 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1175 | "license": "MIT", 1176 | "dependencies": { 1177 | "forwarded": "0.2.0", 1178 | "ipaddr.js": "1.9.1" 1179 | }, 1180 | "engines": { 1181 | "node": ">= 0.10" 1182 | } 1183 | }, 1184 | "node_modules/express/node_modules/qs": { 1185 | "version": "6.13.0", 1186 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1187 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1188 | "license": "BSD-3-Clause", 1189 | "dependencies": { 1190 | "side-channel": "^1.0.6" 1191 | }, 1192 | "engines": { 1193 | "node": ">=0.6" 1194 | }, 1195 | "funding": { 1196 | "url": "https://github.com/sponsors/ljharb" 1197 | } 1198 | }, 1199 | "node_modules/express/node_modules/range-parser": { 1200 | "version": "1.2.1", 1201 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1202 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1203 | "license": "MIT", 1204 | "engines": { 1205 | "node": ">= 0.6" 1206 | } 1207 | }, 1208 | "node_modules/express/node_modules/router": { 1209 | "version": "2.1.0", 1210 | "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", 1211 | "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", 1212 | "license": "MIT", 1213 | "dependencies": { 1214 | "is-promise": "^4.0.0", 1215 | "parseurl": "^1.3.3", 1216 | "path-to-regexp": "^8.0.0" 1217 | }, 1218 | "engines": { 1219 | "node": ">= 18" 1220 | } 1221 | }, 1222 | "node_modules/express/node_modules/safe-buffer": { 1223 | "version": "5.2.1", 1224 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1225 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1226 | "funding": [ 1227 | { 1228 | "type": "github", 1229 | "url": "https://github.com/sponsors/feross" 1230 | }, 1231 | { 1232 | "type": "patreon", 1233 | "url": "https://www.patreon.com/feross" 1234 | }, 1235 | { 1236 | "type": "consulting", 1237 | "url": "https://feross.org/support" 1238 | } 1239 | ], 1240 | "license": "MIT" 1241 | }, 1242 | "node_modules/express/node_modules/safer-buffer": { 1243 | "version": "2.1.2", 1244 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1245 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1246 | "license": "MIT" 1247 | }, 1248 | "node_modules/express/node_modules/send": { 1249 | "version": "1.1.0", 1250 | "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", 1251 | "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", 1252 | "license": "MIT", 1253 | "dependencies": { 1254 | "debug": "^4.3.5", 1255 | "destroy": "^1.2.0", 1256 | "encodeurl": "^2.0.0", 1257 | "escape-html": "^1.0.3", 1258 | "etag": "^1.8.1", 1259 | "fresh": "^0.5.2", 1260 | "http-errors": "^2.0.0", 1261 | "mime-types": "^2.1.35", 1262 | "ms": "^2.1.3", 1263 | "on-finished": "^2.4.1", 1264 | "range-parser": "^1.2.1", 1265 | "statuses": "^2.0.1" 1266 | }, 1267 | "engines": { 1268 | "node": ">= 18" 1269 | } 1270 | }, 1271 | "node_modules/express/node_modules/send/node_modules/fresh": { 1272 | "version": "0.5.2", 1273 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1274 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1275 | "license": "MIT", 1276 | "engines": { 1277 | "node": ">= 0.6" 1278 | } 1279 | }, 1280 | "node_modules/express/node_modules/send/node_modules/mime-db": { 1281 | "version": "1.52.0", 1282 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1283 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1284 | "license": "MIT", 1285 | "engines": { 1286 | "node": ">= 0.6" 1287 | } 1288 | }, 1289 | "node_modules/express/node_modules/send/node_modules/mime-types": { 1290 | "version": "2.1.35", 1291 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1292 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1293 | "license": "MIT", 1294 | "dependencies": { 1295 | "mime-db": "1.52.0" 1296 | }, 1297 | "engines": { 1298 | "node": ">= 0.6" 1299 | } 1300 | }, 1301 | "node_modules/express/node_modules/send/node_modules/ms": { 1302 | "version": "2.1.3", 1303 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1304 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1305 | "license": "MIT" 1306 | }, 1307 | "node_modules/express/node_modules/serve-static": { 1308 | "version": "2.1.0", 1309 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", 1310 | "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", 1311 | "license": "MIT", 1312 | "dependencies": { 1313 | "encodeurl": "^2.0.0", 1314 | "escape-html": "^1.0.3", 1315 | "parseurl": "^1.3.3", 1316 | "send": "^1.0.0" 1317 | }, 1318 | "engines": { 1319 | "node": ">= 18" 1320 | } 1321 | }, 1322 | "node_modules/express/node_modules/setprototypeof": { 1323 | "version": "1.2.0", 1324 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1325 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1326 | "license": "ISC" 1327 | }, 1328 | "node_modules/express/node_modules/side-channel": { 1329 | "version": "1.1.0", 1330 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 1331 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1332 | "license": "MIT", 1333 | "dependencies": { 1334 | "es-errors": "^1.3.0", 1335 | "object-inspect": "^1.13.3", 1336 | "side-channel-list": "^1.0.0", 1337 | "side-channel-map": "^1.0.1", 1338 | "side-channel-weakmap": "^1.0.2" 1339 | }, 1340 | "engines": { 1341 | "node": ">= 0.4" 1342 | }, 1343 | "funding": { 1344 | "url": "https://github.com/sponsors/ljharb" 1345 | } 1346 | }, 1347 | "node_modules/express/node_modules/side-channel-list": { 1348 | "version": "1.0.0", 1349 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 1350 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1351 | "license": "MIT", 1352 | "dependencies": { 1353 | "es-errors": "^1.3.0", 1354 | "object-inspect": "^1.13.3" 1355 | }, 1356 | "engines": { 1357 | "node": ">= 0.4" 1358 | }, 1359 | "funding": { 1360 | "url": "https://github.com/sponsors/ljharb" 1361 | } 1362 | }, 1363 | "node_modules/express/node_modules/side-channel-map": { 1364 | "version": "1.0.1", 1365 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 1366 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1367 | "license": "MIT", 1368 | "dependencies": { 1369 | "call-bound": "^1.0.2", 1370 | "es-errors": "^1.3.0", 1371 | "get-intrinsic": "^1.2.5", 1372 | "object-inspect": "^1.13.3" 1373 | }, 1374 | "engines": { 1375 | "node": ">= 0.4" 1376 | }, 1377 | "funding": { 1378 | "url": "https://github.com/sponsors/ljharb" 1379 | } 1380 | }, 1381 | "node_modules/express/node_modules/side-channel-weakmap": { 1382 | "version": "1.0.2", 1383 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 1384 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1385 | "license": "MIT", 1386 | "dependencies": { 1387 | "call-bound": "^1.0.2", 1388 | "es-errors": "^1.3.0", 1389 | "get-intrinsic": "^1.2.5", 1390 | "object-inspect": "^1.13.3", 1391 | "side-channel-map": "^1.0.1" 1392 | }, 1393 | "engines": { 1394 | "node": ">= 0.4" 1395 | }, 1396 | "funding": { 1397 | "url": "https://github.com/sponsors/ljharb" 1398 | } 1399 | }, 1400 | "node_modules/express/node_modules/statuses": { 1401 | "version": "2.0.1", 1402 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1403 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1404 | "license": "MIT", 1405 | "engines": { 1406 | "node": ">= 0.8" 1407 | } 1408 | }, 1409 | "node_modules/express/node_modules/toidentifier": { 1410 | "version": "1.0.1", 1411 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1412 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1413 | "license": "MIT", 1414 | "engines": { 1415 | "node": ">=0.6" 1416 | } 1417 | }, 1418 | "node_modules/express/node_modules/type-is": { 1419 | "version": "2.0.0", 1420 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", 1421 | "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", 1422 | "license": "MIT", 1423 | "dependencies": { 1424 | "content-type": "^1.0.5", 1425 | "media-typer": "^1.1.0", 1426 | "mime-types": "^3.0.0" 1427 | }, 1428 | "engines": { 1429 | "node": ">= 0.6" 1430 | } 1431 | }, 1432 | "node_modules/express/node_modules/utils-merge": { 1433 | "version": "1.0.1", 1434 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1435 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1436 | "license": "MIT", 1437 | "engines": { 1438 | "node": ">= 0.4.0" 1439 | } 1440 | }, 1441 | "node_modules/express/node_modules/vary": { 1442 | "version": "1.1.2", 1443 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1444 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1445 | "license": "MIT", 1446 | "engines": { 1447 | "node": ">= 0.8" 1448 | } 1449 | }, 1450 | "node_modules/express/node_modules/wrappy": { 1451 | "version": "1.0.2", 1452 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1453 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1454 | "license": "ISC" 1455 | }, 1456 | "node_modules/form-data-encoder": { 1457 | "version": "1.7.2", 1458 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", 1459 | "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", 1460 | "license": "MIT" 1461 | }, 1462 | "node_modules/formdata-node": { 1463 | "version": "4.4.1", 1464 | "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", 1465 | "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", 1466 | "license": "MIT", 1467 | "dependencies": { 1468 | "node-domexception": "1.0.0", 1469 | "web-streams-polyfill": "4.0.0-beta.3" 1470 | }, 1471 | "engines": { 1472 | "node": ">= 12.20" 1473 | } 1474 | }, 1475 | "node_modules/formdata-node/node_modules/node-domexception": { 1476 | "version": "1.0.0", 1477 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1478 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1479 | "funding": [ 1480 | { 1481 | "type": "github", 1482 | "url": "https://github.com/sponsors/jimmywarting" 1483 | }, 1484 | { 1485 | "type": "github", 1486 | "url": "https://paypal.me/jimmywarting" 1487 | } 1488 | ], 1489 | "license": "MIT", 1490 | "engines": { 1491 | "node": ">=10.5.0" 1492 | } 1493 | }, 1494 | "node_modules/formdata-node/node_modules/web-streams-polyfill": { 1495 | "version": "4.0.0-beta.3", 1496 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", 1497 | "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", 1498 | "license": "MIT", 1499 | "engines": { 1500 | "node": ">= 14" 1501 | } 1502 | }, 1503 | "node_modules/make-error": { 1504 | "version": "1.3.6", 1505 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1506 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1507 | "dev": true, 1508 | "license": "ISC" 1509 | }, 1510 | "node_modules/node-fetch": { 1511 | "version": "2.7.0", 1512 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1513 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1514 | "license": "MIT", 1515 | "dependencies": { 1516 | "whatwg-url": "^5.0.0" 1517 | }, 1518 | "engines": { 1519 | "node": "4.x || >=6.0.0" 1520 | }, 1521 | "peerDependencies": { 1522 | "encoding": "^0.1.0" 1523 | }, 1524 | "peerDependenciesMeta": { 1525 | "encoding": { 1526 | "optional": true 1527 | } 1528 | } 1529 | }, 1530 | "node_modules/node-fetch/node_modules/tr46": { 1531 | "version": "0.0.3", 1532 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1533 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 1534 | "license": "MIT" 1535 | }, 1536 | "node_modules/node-fetch/node_modules/webidl-conversions": { 1537 | "version": "3.0.1", 1538 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1539 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 1540 | "license": "BSD-2-Clause" 1541 | }, 1542 | "node_modules/node-fetch/node_modules/whatwg-url": { 1543 | "version": "5.0.0", 1544 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1545 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1546 | "license": "MIT", 1547 | "dependencies": { 1548 | "tr46": "~0.0.3", 1549 | "webidl-conversions": "^3.0.0" 1550 | } 1551 | }, 1552 | "node_modules/openai": { 1553 | "version": "4.87.3", 1554 | "resolved": "https://registry.npmjs.org/openai/-/openai-4.87.3.tgz", 1555 | "integrity": "sha512-d2D54fzMuBYTxMW8wcNmhT1rYKcTfMJ8t+4KjH2KtvYenygITiGBgHoIrzHwnDQWW+C5oCA+ikIR2jgPCFqcKQ==", 1556 | "license": "Apache-2.0", 1557 | "dependencies": { 1558 | "@types/node": "^18.11.18", 1559 | "@types/node-fetch": "^2.6.4", 1560 | "abort-controller": "^3.0.0", 1561 | "agentkeepalive": "^4.2.1", 1562 | "form-data-encoder": "1.7.2", 1563 | "formdata-node": "^4.3.2", 1564 | "node-fetch": "^2.6.7" 1565 | }, 1566 | "bin": { 1567 | "openai": "bin/cli" 1568 | }, 1569 | "peerDependencies": { 1570 | "ws": "^8.18.0", 1571 | "zod": "^3.23.8" 1572 | }, 1573 | "peerDependenciesMeta": { 1574 | "ws": { 1575 | "optional": true 1576 | }, 1577 | "zod": { 1578 | "optional": true 1579 | } 1580 | } 1581 | }, 1582 | "node_modules/openai/node_modules/@types/node": { 1583 | "version": "18.19.80", 1584 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz", 1585 | "integrity": "sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==", 1586 | "license": "MIT", 1587 | "dependencies": { 1588 | "undici-types": "~5.26.4" 1589 | } 1590 | }, 1591 | "node_modules/openai/node_modules/undici-types": { 1592 | "version": "5.26.5", 1593 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1594 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1595 | "license": "MIT" 1596 | }, 1597 | "node_modules/pkce-challenge": { 1598 | "version": "4.1.0", 1599 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-4.1.0.tgz", 1600 | "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", 1601 | "license": "MIT", 1602 | "engines": { 1603 | "node": ">=16.20.0" 1604 | } 1605 | }, 1606 | "node_modules/raw-body": { 1607 | "version": "3.0.0", 1608 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 1609 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1610 | "license": "MIT", 1611 | "dependencies": { 1612 | "bytes": "3.1.2", 1613 | "http-errors": "2.0.0", 1614 | "iconv-lite": "0.6.3", 1615 | "unpipe": "1.0.0" 1616 | }, 1617 | "engines": { 1618 | "node": ">= 0.8" 1619 | } 1620 | }, 1621 | "node_modules/raw-body/node_modules/bytes": { 1622 | "version": "3.1.2", 1623 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1624 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 1625 | "license": "MIT", 1626 | "engines": { 1627 | "node": ">= 0.8" 1628 | } 1629 | }, 1630 | "node_modules/raw-body/node_modules/depd": { 1631 | "version": "2.0.0", 1632 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1633 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1634 | "license": "MIT", 1635 | "engines": { 1636 | "node": ">= 0.8" 1637 | } 1638 | }, 1639 | "node_modules/raw-body/node_modules/http-errors": { 1640 | "version": "2.0.0", 1641 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1642 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1643 | "license": "MIT", 1644 | "dependencies": { 1645 | "depd": "2.0.0", 1646 | "inherits": "2.0.4", 1647 | "setprototypeof": "1.2.0", 1648 | "statuses": "2.0.1", 1649 | "toidentifier": "1.0.1" 1650 | }, 1651 | "engines": { 1652 | "node": ">= 0.8" 1653 | } 1654 | }, 1655 | "node_modules/raw-body/node_modules/iconv-lite": { 1656 | "version": "0.6.3", 1657 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1658 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1659 | "license": "MIT", 1660 | "dependencies": { 1661 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1662 | }, 1663 | "engines": { 1664 | "node": ">=0.10.0" 1665 | } 1666 | }, 1667 | "node_modules/raw-body/node_modules/inherits": { 1668 | "version": "2.0.4", 1669 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1670 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1671 | "license": "ISC" 1672 | }, 1673 | "node_modules/raw-body/node_modules/safer-buffer": { 1674 | "version": "2.1.2", 1675 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1676 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1677 | "license": "MIT" 1678 | }, 1679 | "node_modules/raw-body/node_modules/setprototypeof": { 1680 | "version": "1.2.0", 1681 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1682 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1683 | "license": "ISC" 1684 | }, 1685 | "node_modules/raw-body/node_modules/statuses": { 1686 | "version": "2.0.1", 1687 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1688 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1689 | "license": "MIT", 1690 | "engines": { 1691 | "node": ">= 0.8" 1692 | } 1693 | }, 1694 | "node_modules/raw-body/node_modules/toidentifier": { 1695 | "version": "1.0.1", 1696 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1697 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1698 | "license": "MIT", 1699 | "engines": { 1700 | "node": ">=0.6" 1701 | } 1702 | }, 1703 | "node_modules/raw-body/node_modules/unpipe": { 1704 | "version": "1.0.0", 1705 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1706 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1707 | "license": "MIT", 1708 | "engines": { 1709 | "node": ">= 0.8" 1710 | } 1711 | }, 1712 | "node_modules/ts-node": { 1713 | "version": "10.9.2", 1714 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 1715 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 1716 | "dev": true, 1717 | "license": "MIT", 1718 | "dependencies": { 1719 | "@cspotcode/source-map-support": "^0.8.0", 1720 | "@tsconfig/node10": "^1.0.7", 1721 | "@tsconfig/node12": "^1.0.7", 1722 | "@tsconfig/node14": "^1.0.0", 1723 | "@tsconfig/node16": "^1.0.2", 1724 | "acorn": "^8.4.1", 1725 | "acorn-walk": "^8.1.1", 1726 | "arg": "^4.1.0", 1727 | "create-require": "^1.1.0", 1728 | "diff": "^4.0.1", 1729 | "make-error": "^1.1.1", 1730 | "v8-compile-cache-lib": "^3.0.1", 1731 | "yn": "3.1.1" 1732 | }, 1733 | "bin": { 1734 | "ts-node": "dist/bin.js", 1735 | "ts-node-cwd": "dist/bin-cwd.js", 1736 | "ts-node-esm": "dist/bin-esm.js", 1737 | "ts-node-script": "dist/bin-script.js", 1738 | "ts-node-transpile-only": "dist/bin-transpile.js", 1739 | "ts-script": "dist/bin-script-deprecated.js" 1740 | }, 1741 | "peerDependencies": { 1742 | "@swc/core": ">=1.2.50", 1743 | "@swc/wasm": ">=1.2.50", 1744 | "@types/node": "*", 1745 | "typescript": ">=2.7" 1746 | }, 1747 | "peerDependenciesMeta": { 1748 | "@swc/core": { 1749 | "optional": true 1750 | }, 1751 | "@swc/wasm": { 1752 | "optional": true 1753 | } 1754 | } 1755 | }, 1756 | "node_modules/typescript": { 1757 | "version": "5.8.2", 1758 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1759 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1760 | "dev": true, 1761 | "license": "Apache-2.0", 1762 | "bin": { 1763 | "tsc": "bin/tsc", 1764 | "tsserver": "bin/tsserver" 1765 | }, 1766 | "engines": { 1767 | "node": ">=14.17" 1768 | } 1769 | }, 1770 | "node_modules/undici-types": { 1771 | "version": "6.19.8", 1772 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1773 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1774 | "license": "MIT" 1775 | }, 1776 | "node_modules/v8-compile-cache-lib": { 1777 | "version": "3.0.1", 1778 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1779 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1780 | "dev": true, 1781 | "license": "MIT" 1782 | }, 1783 | "node_modules/yn": { 1784 | "version": "3.1.1", 1785 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1786 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1787 | "dev": true, 1788 | "license": "MIT", 1789 | "engines": { 1790 | "node": ">=6" 1791 | } 1792 | }, 1793 | "node_modules/zod": { 1794 | "version": "3.24.2", 1795 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 1796 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 1797 | "license": "MIT", 1798 | "funding": { 1799 | "url": "https://github.com/sponsors/colinhacks" 1800 | } 1801 | }, 1802 | "node_modules/zod-to-json-schema": { 1803 | "version": "3.24.3", 1804 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", 1805 | "integrity": "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==", 1806 | "license": "ISC", 1807 | "peerDependencies": { 1808 | "zod": "^3.24.1" 1809 | } 1810 | } 1811 | } 1812 | } 1813 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "octagon-mcp", 3 | "version": "1.0.20", 4 | "description": "MCP server for Octagon API. Provides specialized AI agents for investment research of public and private markets.", 5 | "main": "dist/index.js", 6 | "type": "module", 7 | "bin": { 8 | "octagon-mcp": "dist/index.js" 9 | }, 10 | "files": [ 11 | "dist" 12 | ], 13 | "publishConfig": { 14 | "access": "public" 15 | }, 16 | "scripts": { 17 | "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', '755')\"", 18 | "test": "echo \"No tests specified\"", 19 | "start": "node dist/index.js", 20 | "lint": "echo \"No linting configured\"", 21 | "format": "echo \"No formatting configured\"", 22 | "prepare": "npm run build", 23 | "release": "npm run build && npm publish" 24 | }, 25 | "keywords": [ 26 | "mcp", 27 | "octagon", 28 | "investment-research", 29 | "sec-filings", 30 | "earnings-transcripts", 31 | "financial-data", 32 | "market-data", 33 | "private-company-research" 34 | ], 35 | "author": "Octagon AI", 36 | "license": "MIT", 37 | "dependencies": { 38 | "@modelcontextprotocol/sdk": "^1.0.0", 39 | "dotenv": "^16.3.1", 40 | "openai": "^4.20.1", 41 | "zod": "^3.22.4" 42 | }, 43 | "devDependencies": { 44 | "@types/node": "^20.10.0", 45 | "ts-node": "^10.9.2", 46 | "typescript": "^5.3.2" 47 | }, 48 | "engines": { 49 | "node": ">=18.0.0" 50 | }, 51 | "repository": { 52 | "type": "git", 53 | "url": "git+https://github.com/OctagonAI/octagon-mcp-server.git" 54 | }, 55 | "bugs": { 56 | "url": "https://github.com/OctagonAI/octagon-mcp-server/issues" 57 | }, 58 | "homepage": "https://docs.octagonagents.com" 59 | } 60 | -------------------------------------------------------------------------------- /run-server.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Octagon MCP Server Run Script 4 | 5 | echo "Starting Octagon MCP Server..." 6 | 7 | # Check if the dist directory exists, if not, build the project 8 | if [ ! -d "./dist" ]; then 9 | echo "Dist directory not found. Building project..." 10 | npm run build 11 | fi 12 | 13 | # Check if OCTAGON_API_KEY is set 14 | if [ -z "$OCTAGON_API_KEY" ]; then 15 | # Try to load from .env file 16 | if [ -f ".env" ]; then 17 | export $(grep -v '^#' .env | xargs) 18 | fi 19 | 20 | # Check again if OCTAGON_API_KEY is set 21 | if [ -z "$OCTAGON_API_KEY" ]; then 22 | echo "Error: OCTAGON_API_KEY environment variable not set." 23 | echo "Please set your API key using: export OCTAGON_API_KEY=your_api_key" 24 | echo "Or create a .env file with OCTAGON_API_KEY=your_api_key" 25 | exit 1 26 | fi 27 | fi 28 | 29 | # Run the server 30 | echo "Running server..." 31 | node dist/index.js -------------------------------------------------------------------------------- /smithery.yaml: -------------------------------------------------------------------------------- 1 | startCommand: 2 | type: stdio 3 | configSchema: 4 | type: object 5 | required: 6 | - octagonApiKey 7 | properties: 8 | octagonApiKey: 9 | type: string 10 | description: Your Octagon API key (get a free one at https://app.octagonai.co/signup) 11 | commandFunction: | 12 | (config) => ({ 13 | command: 'node', 14 | args: ['dist/index.js'], 15 | env: { OCTAGON_API_KEY: config.octagonApiKey } 16 | }) -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 5 | import dotenv from "dotenv"; 6 | import { readFile } from "fs/promises"; 7 | import OpenAI from "openai"; 8 | import path from "path"; 9 | import { fileURLToPath } from "url"; 10 | import { z } from "zod"; 11 | 12 | // Get package.json info 13 | const __filename = fileURLToPath(import.meta.url); 14 | const __dirname = path.dirname(__filename); 15 | const packageJsonPath = path.join(__dirname, "..", "package.json"); 16 | const packageJsonContent = await readFile(packageJsonPath, "utf8"); 17 | const packageInfo = JSON.parse(packageJsonContent) as { name: string; version: string }; 18 | 19 | // Load environment variables 20 | dotenv.config(); 21 | 22 | // Check for required environment variables 23 | const OCTAGON_API_KEY = process.env.OCTAGON_API_KEY; 24 | const OCTAGON_API_BASE_URL = process.env.OCTAGON_API_BASE_URL || "https://api.octagonagents.com/v1"; 25 | 26 | if (!OCTAGON_API_KEY) { 27 | console.error("Error: OCTAGON_API_KEY is not set in the environment variables"); 28 | console.error("Please set the OCTAGON_API_KEY environment variable or use 'env OCTAGON_API_KEY=your_key npx -y octagon-mcp'"); 29 | process.exit(1); 30 | } 31 | 32 | // Initialize OpenAI client with Octagon API 33 | const octagonClient = new OpenAI({ 34 | apiKey: OCTAGON_API_KEY, 35 | baseURL: OCTAGON_API_BASE_URL, 36 | defaultHeaders: { 37 | "User-Agent": `${packageInfo.name}/${packageInfo.version} (Node.js/${process.versions.node})` 38 | }, 39 | }); 40 | 41 | // Create MCP server 42 | const server = new McpServer({ 43 | name: packageInfo.name, 44 | version: packageInfo.version, 45 | }); 46 | 47 | // Helper function to process streaming responses 48 | async function processStreamingResponse(stream: any): Promise { 49 | let fullResponse = ""; 50 | let citations: any[] = []; 51 | 52 | try { 53 | // Process the streaming response 54 | for await (const chunk of stream) { 55 | // For Chat Completions API 56 | if (chunk.choices && chunk.choices[0]?.delta?.content) { 57 | fullResponse += chunk.choices[0].delta.content; 58 | 59 | // Check for citations in the final chunk 60 | if (chunk.choices[0]?.finish_reason === "stop" && chunk.choices[0]?.citations) { 61 | citations = chunk.choices[0].citations; 62 | } 63 | } 64 | 65 | // For Responses API 66 | if (chunk.type === "response.output_text.delta") { 67 | fullResponse += chunk.text?.delta || ""; 68 | } 69 | } 70 | 71 | return fullResponse; 72 | } catch (error) { 73 | console.error("Error processing streaming response:", error); 74 | throw error; 75 | } 76 | } 77 | 78 | // Define a schema for the 'prompt' parameter that all tools will use 79 | const promptSchema = z.object({ 80 | prompt: z.string().describe("Your natural language query or request for the agent"), 81 | }); 82 | 83 | type PromptParams = { 84 | prompt: string; 85 | }; 86 | 87 | // Register a tool for each Octagon agent 88 | // Comprehensive Orchestration Agent 89 | server.tool( 90 | "octagon-agent", 91 | "[COMPREHENSIVE MARKET INTELLIGENCE] Orchestrates all agents for comprehensive market intelligence analysis. Capabilities: Combines insights from SEC filings, earnings calls, financial metrics, stock data, institutional holdings, private company research, funding analysis, M&A transactions, investor intelligence, and debt analysis to provide holistic market intelligence. Best for: Complex research requiring multiple data sources and comprehensive analysis across public and private markets. Example queries: 'Retrieve year-over-year growth in key income-statement items for AAPL, limited to 5 records and filtered by period FY', 'Analyze the latest 10-K filing for AAPL and extract key financial metrics and risk factors', 'Retrieve the daily closing prices for AAPL over the last 30 days', 'Analyze AAPL's latest earnings call transcript and extract key insights about future guidance', 'Provide a comprehensive overview of Stripe, including its business model and key metrics', 'Retrieve the funding history for Stripe, including all rounds and investors'.", 92 | { 93 | prompt: z.string().describe("Your natural language query or request for the agent"), 94 | }, 95 | async ({ prompt }: PromptParams) => { 96 | try { 97 | const response = await octagonClient.chat.completions.create({ 98 | model: "octagon-agent", 99 | messages: [{ role: "user", content: prompt }], 100 | stream: true, 101 | metadata: { tool: "mcp" } 102 | }); 103 | 104 | const result = await processStreamingResponse(response); 105 | return { 106 | content: [ 107 | { 108 | type: "text", 109 | text: result, 110 | }, 111 | ], 112 | }; 113 | } catch (error) { 114 | console.error("Error calling Octagon orchestration agent:", error); 115 | return { 116 | isError: true, 117 | content: [ 118 | { 119 | type: "text", 120 | text: `Error: Failed to process comprehensive market intelligence query. ${error}`, 121 | }, 122 | ], 123 | }; 124 | } 125 | } 126 | ); 127 | 128 | // SEC Filings Agent 129 | server.tool( 130 | "octagon-sec-agent", 131 | "[PUBLIC MARKET INTELLIGENCE] A specialized agent for SEC filings analysis and extraction. Covers over 8,000 public companies from SEC EDGAR with comprehensive coverage of annual and quarterly reports (10-K, 10-Q, 20-F), offering filings (S-1), amendments, and event filings (8-K). Updated daily with historical data dating back to 2018 for time-series analysis. Best for extracting management discussion, footnotes, risk factors, and quantitative data from SEC filings. Example queries:'Find the risk factors related to supply chain in Tesla's latest 10-K', 'List every material weakness in internal control that Salesforce disclosed between 2020 and 2024.', 'Compare executive compensation (total, cash, equity) for Amazon, Walmart, and Target in 2023'.", 132 | { 133 | prompt: z.string().describe("Your natural language query or request for the agent"), 134 | }, 135 | async ({ prompt }: PromptParams) => { 136 | try { 137 | const response = await octagonClient.chat.completions.create({ 138 | model: "octagon-sec-agent", 139 | messages: [{ role: "user", content: prompt }], 140 | stream: true, 141 | metadata: { tool: "mcp" } 142 | }); 143 | 144 | const result = await processStreamingResponse(response); 145 | return { 146 | content: [ 147 | { 148 | type: "text", 149 | text: result, 150 | }, 151 | ], 152 | }; 153 | } catch (error) { 154 | console.error("Error calling SEC agent:", error); 155 | return { 156 | isError: true, 157 | content: [ 158 | { 159 | type: "text", 160 | text: `Error: Failed to process SEC filings query. ${error}`, 161 | }, 162 | ], 163 | }; 164 | } 165 | } 166 | ); 167 | 168 | // Earnings Call Transcripts Agent 169 | server.tool( 170 | "octagon-transcripts-agent", 171 | "[PUBLIC MARKET INTELLIGENCE] A specialized agent for analyzing earnings call transcripts and management commentary. Covers over 8,000 public companies with continuous daily updates for real-time insights. Historical data dating back to 2018 enables robust time-series analysis. Extract information from earnings call transcripts, including executive statements, financial guidance, analyst questions, and forward-looking statements. Best for analyzing management sentiment, extracting guidance figures, and identifying key business trends. Example queries: 'What did Amazon's CEO say about AWS growth expectations in the latest earnings call?', 'Summarize key financial metrics mentioned in Tesla's Q2 2023 earnings call', 'What questions did analysts ask about margins during Netflix's latest earnings call?'.", 172 | { 173 | prompt: z.string().describe("Your natural language query or request for the agent"), 174 | }, 175 | async ({ prompt }: PromptParams) => { 176 | try { 177 | const response = await octagonClient.chat.completions.create({ 178 | model: "octagon-transcripts-agent", 179 | messages: [{ role: "user", content: prompt }], 180 | stream: true, 181 | metadata: { tool: "mcp" } 182 | }); 183 | 184 | const result = await processStreamingResponse(response); 185 | return { 186 | content: [ 187 | { 188 | type: "text", 189 | text: result, 190 | }, 191 | ], 192 | }; 193 | } catch (error) { 194 | console.error("Error calling Transcripts agent:", error); 195 | return { 196 | isError: true, 197 | content: [ 198 | { 199 | type: "text", 200 | text: `Error: Failed to process earnings call transcript query. ${error}`, 201 | }, 202 | ], 203 | }; 204 | } 205 | } 206 | ); 207 | 208 | // Financial Data Agent 209 | server.tool( 210 | "octagon-financials-agent", 211 | "[PUBLIC MARKET INTELLIGENCE] Specialized agent for public companies' financial statement analysis, financial ratio calculations, and analysts' estimates. Capabilities: Analyze financial statements including income statements, balance sheets, cash flow statements, product segments, geographic segments, analysts' financial estimates, calculate financial metrics, growth rates, compare ratios across companies, and evaluate performance indicators and operational efficiency. Best for: Deep financial analysis and comparison of company financial performance. Example queries: 'Extract quarterly revenue growth rates for Microsoft over the past 2 years', 'Compare the gross margins, operating margins, and net margins of Apple, Microsoft, and Google over the last 3 years', 'Analyze Tesla's cash flow statements from 2021 to 2023 and calculate free cash flow trends', 'Show me Amazon's capex to operating cash flow ratio for the past 3 years','What is NVDA's cash conversion cycle trend over the past 8 quarters?'.", 212 | { 213 | prompt: z.string().describe("Your natural language query or request for the agent"), 214 | }, 215 | async ({ prompt }: PromptParams) => { 216 | try { 217 | const response = await octagonClient.chat.completions.create({ 218 | model: "octagon-financials-agent", 219 | messages: [{ role: "user", content: prompt }], 220 | stream: true, 221 | metadata: { tool: "mcp" } 222 | }); 223 | 224 | const result = await processStreamingResponse(response); 225 | return { 226 | content: [ 227 | { 228 | type: "text", 229 | text: result, 230 | }, 231 | ], 232 | }; 233 | } catch (error) { 234 | console.error("Error calling Financials agent:", error); 235 | return { 236 | isError: true, 237 | content: [ 238 | { 239 | type: "text", 240 | text: `Error: Failed to process financial data query. ${error}`, 241 | }, 242 | ], 243 | }; 244 | } 245 | } 246 | ); 247 | 248 | // Stock Market Data Agent 249 | server.tool( 250 | "octagon-stock-data-agent", 251 | "[PUBLIC MARKET INTELLIGENCE] Specialized agent for stock market data and valuation analysis. Capabilities: Analyze stock price movements, trading volumes, stock indices performance by sector and industry, valuation metrics by company, sector, industry including P/E, EV/S ratios, analysts' price target and ratings, and technical indicators. Best for: Stock market research, equity analysis, and trading pattern identification. Example queries: 'How has Apple's stock performed compared to the S&P 500 over the last 6 months?', 'What is the monthly P/E ratio for NVDA over the past 24 months?', 'Analyze the trading volume patterns for Tesla stock before and after earnings releases', 'What were the major price movements for NVIDIA in 2023 and what were the catalysts?'.", 252 | { 253 | prompt: z.string().describe("Your natural language query or request for the agent"), 254 | }, 255 | async ({ prompt }: PromptParams) => { 256 | try { 257 | const response = await octagonClient.chat.completions.create({ 258 | model: "octagon-stock-data-agent", 259 | messages: [{ role: "user", content: prompt }], 260 | stream: true, 261 | metadata: { tool: "mcp" } 262 | }); 263 | 264 | const result = await processStreamingResponse(response); 265 | return { 266 | content: [ 267 | { 268 | type: "text", 269 | text: result, 270 | }, 271 | ], 272 | }; 273 | } catch (error) { 274 | console.error("Error calling Stock Data agent:", error); 275 | return { 276 | isError: true, 277 | content: [ 278 | { 279 | type: "text", 280 | text: `Error: Failed to process stock market data query. ${error}`, 281 | }, 282 | ], 283 | }; 284 | } 285 | } 286 | ); 287 | 288 | // Private Companies Agent 289 | server.tool( 290 | "octagon-companies-agent", 291 | "[PRIVATE MARKET INTELLIGENCE] A specialized database agent for looking up company information and financials. Capabilities: Query comprehensive company financial information and business intelligence from Octagon's company database. Best for: Finding basic information about companies, their financial metrics, and industry benchmarks. NOTE: For better and more accurate results, provide the company's website URL instead of just the company name. Example queries: 'What is the employee trends for Stripe (stripe.com)?', 'List the top 5 companies in the AI sector by revenue growth', 'Who are the top competitors to Databricks (databricks.com)?'.", 292 | { 293 | prompt: z.string().describe("Your natural language query or request for the agent"), 294 | }, 295 | async ({ prompt }: PromptParams) => { 296 | try { 297 | const response = await octagonClient.chat.completions.create({ 298 | model: "octagon-companies-agent", 299 | messages: [{ role: "user", content: prompt }], 300 | stream: true, 301 | metadata: { tool: "mcp" } 302 | }); 303 | 304 | const result = await processStreamingResponse(response); 305 | return { 306 | content: [ 307 | { 308 | type: "text", 309 | text: result, 310 | }, 311 | ], 312 | }; 313 | } catch (error) { 314 | console.error("Error calling Companies agent:", error); 315 | return { 316 | isError: true, 317 | content: [ 318 | { 319 | type: "text", 320 | text: `Error: Failed to process private company query. ${error}`, 321 | }, 322 | ], 323 | }; 324 | } 325 | } 326 | ); 327 | 328 | // Funding Agent 329 | server.tool( 330 | "octagon-funding-agent", 331 | "[PRIVATE MARKET INTELLIGENCE] A specialized database agent for company funding transactions. Capabilities: Extract information about funding rounds, investors, valuations, and investment trends. Best for: Researching startup funding history, investor activity, and venture capital patterns. NOTE: For better and more accurate results, provide the company's website URL instead of just the company name. Example queries: 'What was Anthropic's latest funding round size, valuation, and key investors (anthropic.com)?', 'How much has OpenAI raised in total funding and at what valuation (openai.com)?', 'Who were the lead investors in Databricks' Series G round and what was the post-money valuation (databricks.com)?'.", 332 | { 333 | prompt: z.string().describe("Your natural language query or request for the agent"), 334 | }, 335 | async ({ prompt }: PromptParams) => { 336 | try { 337 | const response = await octagonClient.chat.completions.create({ 338 | model: "octagon-funding-agent", 339 | messages: [{ role: "user", content: prompt }], 340 | stream: true, 341 | metadata: { tool: "mcp" } 342 | }); 343 | 344 | const result = await processStreamingResponse(response); 345 | return { 346 | content: [ 347 | { 348 | type: "text", 349 | text: result, 350 | }, 351 | ], 352 | }; 353 | } catch (error) { 354 | console.error("Error calling Funding agent:", error); 355 | return { 356 | isError: true, 357 | content: [ 358 | { 359 | type: "text", 360 | text: `Error: Failed to process funding data query. ${error}`, 361 | }, 362 | ], 363 | }; 364 | } 365 | } 366 | ); 367 | 368 | // Funds Agent 369 | server.tool( 370 | "octagon-funds-agent", 371 | "[PRIVATE MARKET INTELLIGENCE] A specialized agent for analyzing investment funds. Capabilities: Retrieve information about fund strategies, fund sizes, target sectors, LPs, dry powder, fund performance, distributions, and fundraising activities. Best for: Understanding private market fund characteristics, tracking fundraising events, and identifying active funds by region or focus. Example queries: 'List top-performing venture capital funds launched in 2020', 'What sectors does Andreessen Horowitz's latest fund target?', 'What are the typical LPs in early-stage crypto funds?', 'Which funds closed the largest raises in Q1 2024?'", 372 | { 373 | prompt: z.string().describe("Your natural language query or request for the agent"), 374 | }, 375 | async ({ prompt }: PromptParams) => { 376 | try { 377 | const response = await octagonClient.chat.completions.create({ 378 | model: "octagon-funds-agent", 379 | messages: [{ role: "user", content: prompt }], 380 | stream: true, 381 | metadata: { tool: "mcp" } 382 | }); 383 | 384 | const result = await processStreamingResponse(response); 385 | return { 386 | content: [ 387 | { 388 | type: "text", 389 | text: result, 390 | }, 391 | ], 392 | }; 393 | } catch (error) { 394 | console.error("Error calling Funds agent:", error); 395 | return { 396 | isError: true, 397 | content: [ 398 | { 399 | type: "text", 400 | text: `Error: Failed to process funds query. ${error}`, 401 | }, 402 | ], 403 | }; 404 | } 405 | } 406 | ); 407 | 408 | // M&A and IPO Deals Agent 409 | server.tool( 410 | "octagon-deals-agent", 411 | "[PRIVATE MARKET INTELLIGENCE] A specialized database agent for M&A and IPO transaction analysis. Capabilities: Retrieve information about mergers, acquisitions, initial public offerings, and other financial transactions. Best for: Research on corporate transactions, IPO valuations, and M&A activity. NOTE: For better and more accurate results, provide the company's website URL instead of just the company name. Example queries: 'What was the acquisition price when Microsoft (microsoft.com) acquired GitHub (github.com)?', 'List the valuation multiples for AI companies in 2024', 'List all the acquisitions and price, valuation by Salesforce (salesforce.com) in 2023?'.", 412 | { 413 | prompt: z.string().describe("Your natural language query or request for the agent"), 414 | }, 415 | async ({ prompt }: PromptParams) => { 416 | try { 417 | const response = await octagonClient.chat.completions.create({ 418 | model: "octagon-deals-agent", 419 | messages: [{ role: "user", content: prompt }], 420 | stream: true, 421 | metadata: { tool: "mcp" } 422 | }); 423 | 424 | const result = await processStreamingResponse(response); 425 | return { 426 | content: [ 427 | { 428 | type: "text", 429 | text: result, 430 | }, 431 | ], 432 | }; 433 | } catch (error) { 434 | console.error("Error calling Deals agent:", error); 435 | return { 436 | isError: true, 437 | content: [ 438 | { 439 | type: "text", 440 | text: `Error: Failed to process M&A/IPO query. ${error}`, 441 | }, 442 | ], 443 | }; 444 | } 445 | } 446 | ); 447 | 448 | // Investors Agent 449 | server.tool( 450 | "octagon-investors-agent", 451 | "[PRIVATE MARKET INTELLIGENCE] A specialized database agent for looking up information on investors including angel investors, venture capital, and private equity. Capabilities: Retrieve information about investors, their investment criteria, and past activities. Best for: Research on investors and details about their investment activities. NOTE: For better and more accurate results, provide the investor's website URL instead of just the investor name. Example queries: 'What is the latest investment criteria of Insight Partners (insightpartners.com)?', 'How many investments did Andreessen Horowitz (a16z.com) make in the last 6 months', 'What is the typical check size for QED Investors (qedinvestors.com)'.", 452 | { 453 | prompt: z.string().describe("Your natural language query or request for the agent"), 454 | }, 455 | async ({ prompt }: PromptParams) => { 456 | try { 457 | const response = await octagonClient.chat.completions.create({ 458 | model: "octagon-investors-agent", 459 | messages: [{ role: "user", content: prompt }], 460 | stream: true, 461 | metadata: { tool: "mcp" } 462 | }); 463 | 464 | const result = await processStreamingResponse(response); 465 | return { 466 | content: [ 467 | { 468 | type: "text", 469 | text: result, 470 | }, 471 | ], 472 | }; 473 | } catch (error) { 474 | console.error("Error calling Investors agent:", error); 475 | return { 476 | isError: true, 477 | content: [ 478 | { 479 | type: "text", 480 | text: `Error: Failed to process investors query. ${error}`, 481 | }, 482 | ], 483 | }; 484 | } 485 | } 486 | ); 487 | 488 | // Web Scraper Agent 489 | server.tool( 490 | "octagon-scraper-agent", 491 | "[PUBLIC & PRIVATE MARKET INTELLIGENCE] Specialized agent for financial data extraction from investor websites. Capabilities: Extract structured financial data from investor relations websites, tables, and online financial sources. Best for: Gathering financial data from websites that don't have accessible APIs. Example queries: 'Extract all data fields from zillow.com/san-francisco-ca/', 'Extract all data fields from www.carvana.com/cars/'.", 492 | { 493 | prompt: z.string().describe("Your natural language query or request for the agent"), 494 | }, 495 | async ({ prompt }: PromptParams) => { 496 | try { 497 | const response = await octagonClient.chat.completions.create({ 498 | model: "octagon-scraper-agent", 499 | messages: [{ role: "user", content: prompt }], 500 | stream: true, 501 | metadata: { tool: "mcp" } 502 | }); 503 | 504 | const result = await processStreamingResponse(response); 505 | return { 506 | content: [ 507 | { 508 | type: "text", 509 | text: result, 510 | }, 511 | ], 512 | }; 513 | } catch (error) { 514 | console.error("Error calling Scraper agent:", error); 515 | return { 516 | isError: true, 517 | content: [ 518 | { 519 | type: "text", 520 | text: `Error: Failed to process web scraping query. ${error}`, 521 | }, 522 | ], 523 | }; 524 | } 525 | } 526 | ); 527 | 528 | // Deep Research Agent 529 | server.tool( 530 | "octagon-deep-research-agent", 531 | "[PUBLIC & PRIVATE MARKET INTELLIGENCE] A comprehensive agent that can utilize multiple sources for deep research analysis. Capabilities: Aggregate research across multiple data sources, synthesize information, and provide comprehensive investment research. Best for: Investment research questions requiring up-to-date aggregated information from the web. Example queries: 'Research the financial impact of Apple's privacy changes on digital advertising companies' revenue and margins', 'Analyze the competitive landscape in the cloud computing sector, focusing on AWS, Azure, and Google Cloud margin and growth trends', 'Investigate the factors driving electric vehicle adoption and their impact on battery supplier financials'.", 532 | { 533 | prompt: z.string().describe("Your natural language query or request for the agent"), 534 | }, 535 | async ({ prompt }: PromptParams) => { 536 | try { 537 | const response = await octagonClient.chat.completions.create({ 538 | model: "octagon-deep-research-agent", 539 | messages: [{ role: "user", content: prompt }], 540 | stream: true, 541 | metadata: { tool: "mcp" } 542 | }); 543 | 544 | const result = await processStreamingResponse(response); 545 | return { 546 | content: [ 547 | { 548 | type: "text", 549 | text: result, 550 | }, 551 | ], 552 | }; 553 | } catch (error) { 554 | console.error("Error calling Deep Research agent:", error); 555 | return { 556 | isError: true, 557 | content: [ 558 | { 559 | type: "text", 560 | text: `Error: Failed to process deep research query. ${error}`, 561 | }, 562 | ], 563 | }; 564 | } 565 | } 566 | ); 567 | 568 | // Private Debts Agent 569 | server.tool( 570 | "octagon-debts-agent", 571 | "[PRIVATE MARKET INTELLIGENCE] A specialized database agent for analyzing private debts and lenders. Capabilities: Retrieve information about private debts and lenders. Best for: Research on borrowers, and lenders and details about the private debt facilities. Example queries: 'List all the debt activities from borrower American Tower', 'Compile all the debt activities from lender ING Group in Q4 2024'.", 572 | { 573 | prompt: z.string().describe("Your natural language query or request for the agent"), 574 | }, 575 | async ({ prompt }: PromptParams) => { 576 | try { 577 | const response = await octagonClient.chat.completions.create({ 578 | model: "octagon-debts-agent", 579 | messages: [{ role: "user", content: prompt }], 580 | stream: true, 581 | metadata: { tool: "mcp" } 582 | }); 583 | 584 | const result = await processStreamingResponse(response); 585 | return { 586 | content: [ 587 | { 588 | type: "text", 589 | text: result, 590 | }, 591 | ], 592 | }; 593 | } catch (error) { 594 | console.error("Error calling Debts agent:", error); 595 | return { 596 | isError: true, 597 | content: [ 598 | { 599 | type: "text", 600 | text: `Error: Failed to process private debts query. ${error}`, 601 | }, 602 | ], 603 | }; 604 | } 605 | } 606 | ); 607 | 608 | // Holdings Agent 609 | server.tool( 610 | "octagon-holdings-agent", 611 | "[PUBLIC MARKET INTELLIGENCE] Specialized agent for institutional ownership and holdings data, providing comprehensive insights into Form 13F filings, institutional investor activity, fund performance, and industry-level holdings analytics. Capabilities: Retrieve the latest Form 13F and related institutional ownership filings; Analyze institutional holder filings for specific securities and periods; Summarize performance of institutional holders (funds, asset managers); Break down institutional portfolios by industry/sector; Summarize institutional positions for a given security; Benchmark industry performance based on institutional holdings. Use Cases: Tracking institutional buying and selling activity for specific stocks; Analyzing fund manager performance and portfolio allocation; Benchmarking industry and sector performance based on institutional holdings; Identifying new or exited positions by major funds; Understanding industry exposure and concentration in institutional portfolios. Example queries: '@octagon-holdings-agent Retrieve the most recent Form 13F and related filings submitted by institutional investors, limited to 50 records on page 0.'; '@octagon-holdings-agent Retrieve analytics for institutional holder filings for AAPL in Q2 of 2023, limited to 20 records on page 0.'; '@octagon-holdings-agent Get a summary of the performance of the institutional holder with CIK 0001166559.'; '@octagon-holdings-agent Retrieve the industry breakdown for the holder with CIK 0001067983 for Q4 of 2024.'; '@octagon-holdings-agent Get a summary of institutional positions for AAPL for Q4 of 2024.'; '@octagon-holdings-agent Get a financial performance summary for all industries for Q4 of 2024.'", 612 | { 613 | prompt: z.string().describe("Your natural language query or request for the agent"), 614 | }, 615 | async ({ prompt }: PromptParams) => { 616 | try { 617 | const response = await octagonClient.chat.completions.create({ 618 | model: "octagon-holdings-agent", 619 | messages: [{ role: "user", content: prompt }], 620 | stream: true, 621 | metadata: { tool: "mcp" } 622 | }); 623 | 624 | const result = await processStreamingResponse(response); 625 | return { 626 | content: [ 627 | { 628 | type: "text", 629 | text: result, 630 | }, 631 | ], 632 | }; 633 | } catch (error) { 634 | console.error("Error calling Holdings agent:", error); 635 | return { 636 | isError: true, 637 | content: [ 638 | { 639 | type: "text", 640 | text: `Error: Failed to process holdings query. ${error}`, 641 | }, 642 | ], 643 | }; 644 | } 645 | } 646 | ); 647 | 648 | // Start the server with stdio transport 649 | async function main() { 650 | try { 651 | const transport = new StdioServerTransport(); 652 | await server.connect(transport); 653 | } catch (error) { 654 | process.exit(1); 655 | } 656 | } 657 | 658 | main(); 659 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "outDir": "./dist", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "include": ["src/**/*"], 14 | "exclude": ["node_modules", "dist", "examples"] 15 | } --------------------------------------------------------------------------------