├── .env.example ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── package.json ├── src ├── apollo-client.ts └── index.ts ├── tsconfig.json └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | # Apollo.io API Key 2 | # Get your API key from https://app.apollo.io/ > Settings > API 3 | APOLLO_IO_API_KEY=your_api_key_here 4 | 5 | # Authentication Server URL (for mcp-proxy-auth) 6 | # AUTH_SERVER_URL=https://your-auth-server.com/verify 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directories 2 | node_modules/ 3 | 4 | # Build output 5 | dist/ 6 | build/ 7 | 8 | # Environment variables 9 | .env 10 | .env.local 11 | .env.development.local 12 | .env.test.local 13 | .env.production.local 14 | 15 | # Logs 16 | logs 17 | *.log 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | 22 | # Editor directories and files 23 | .idea 24 | .vscode 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw? 30 | 31 | # OS generated files 32 | .DS_Store 33 | .DS_Store? 34 | ._* 35 | .Spotlight-V100 36 | .Trashes 37 | ehthumbs.db 38 | Thumbs.db 39 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.12-alpine AS builder 2 | 3 | COPY . /app 4 | 5 | WORKDIR /app 6 | 7 | RUN npm install 8 | 9 | FROM node:22-alpine AS release 10 | 11 | WORKDIR /app 12 | 13 | COPY --from=builder /app/dist /app/dist 14 | COPY --from=builder /app/package.json /app/package.json 15 | COPY --from=builder /app/package-lock.json /app/package-lock.json 16 | 17 | ENV NODE_ENV=production 18 | 19 | 20 | RUN npm ci --ignore-scripts --omit-dev 21 | EXPOSE 8080 22 | ENTRYPOINT ["npx", "mcp-proxy", "node", "dist/index.js"] 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Lakhvinder Singh 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 | # Apollo.io MCP Server 2 | 3 | [![TypeScript](https://img.shields.io/badge/TypeScript-4.9.5-blue.svg)](https://www.typescriptlang.org/) 4 | [![Apollo.io API](https://img.shields.io/badge/Apollo.io%20API-v1-orange.svg)](https://docs.apollo.io/reference/introduction) 5 | [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-1.8.0-green.svg)](https://github.com/modelcontextprotocol/sdk) 6 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 7 | 8 | A powerful Model Context Protocol (MCP) server implementation for seamless Apollo.io API integration, enabling AI assistants to interact with Apollo.io data. 9 | 10 | 11 | Apollo.io Server MCP server 12 | 13 | 14 | ## Overview 15 | 16 | This MCP server provides a comprehensive set of tools for interacting with the Apollo.io API, allowing AI assistants to: 17 | 18 | - Enrich data for people and organizations 19 | - Search for people and organizations 20 | - Find job postings for specific organizations 21 | - Perform Apollo.io operations without leaving your AI assistant interface 22 | 23 | ## Why Use This MCP Server? 24 | 25 | - **Seamless AI Integration**: Connect your AI assistants directly to Apollo.io data 26 | - **Simplified API Operations**: Perform common Apollo.io tasks through natural language commands 27 | - **Real-time Data Access**: Get up-to-date information from Apollo.io 28 | - **Secure Authentication**: Uses Apollo.io's secure API token authentication 29 | - **Extensible Design**: Easily add more Apollo.io API capabilities as needed 30 | 31 | ## Installation 32 | 33 | ```bash 34 | # Clone the repository 35 | git clone https://github.com/lkm1developer/apollo-io-mcp-server.git 36 | cd apollo-io-mcp-server 37 | 38 | # Install dependencies 39 | npm install 40 | 41 | # Build the project 42 | npm run build 43 | ``` 44 | 45 | ## Configuration 46 | 47 | The server requires an Apollo.io API access token. You can obtain one by: 48 | 49 | 1. Going to your [Apollo.io Account](https://app.apollo.io/) 50 | 2. Navigating to Settings > API 51 | 3. Generating an API key 52 | 53 | You can provide the token in two ways: 54 | 55 | 1. As an environment variable: 56 | ``` 57 | APOLLO_IO_API_KEY=your-api-key 58 | ``` 59 | 60 | 2. As a command-line argument: 61 | ``` 62 | npm start -- --api-key=your-api-key 63 | ``` 64 | 65 | For development, create a `.env` file in the project root to store your environment variables: 66 | 67 | ``` 68 | APOLLO_IO_API_KEY=your-api-key 69 | ``` 70 | 71 | ## Usage 72 | 73 | ### Starting the Server 74 | 75 | ```bash 76 | # Start the server 77 | npm start 78 | 79 | # Or with a specific API key 80 | npm start -- --api-key=your-api-key 81 | 82 | # Run the SSE server with authentication 83 | npx mcp-proxy-auth node dist/index.js 84 | ``` 85 | 86 | ### Implementing Authentication in SSE Server 87 | 88 | The SSE server uses the [mcp-proxy-auth](https://www.npmjs.com/package/mcp-proxy-auth) package for authentication. To implement authentication: 89 | 90 | 1. Install the package: 91 | ```bash 92 | npm install mcp-proxy-auth 93 | ``` 94 | 95 | 2. Set the `AUTH_SERVER_URL` environment variable to point to your API key verification endpoint: 96 | ```bash 97 | export AUTH_SERVER_URL=https://your-auth-server.com/verify 98 | ``` 99 | 100 | 3. Run the SSE server with authentication: 101 | ```bash 102 | npx mcp-proxy-auth node dist/index.js 103 | ``` 104 | 105 | 4. The SSE URL will be available at: 106 | ``` 107 | localhost:8080/sse?apiKey=apikey 108 | ``` 109 | 110 | Replace `apikey` with your actual API key for authentication. 111 | 112 | The `mcp-proxy-auth` package acts as a proxy that: 113 | - Intercepts requests to your SSE server 114 | - Verifies API keys against your authentication server 115 | - Only allows authenticated requests to reach your SSE endpoint 116 | 117 | ### Integrating with AI Assistants 118 | 119 | This MCP server is designed to work with AI assistants that support the Model Context Protocol. Once running, the server exposes a set of tools that can be used by compatible AI assistants to interact with Apollo.io data. 120 | 121 | ### Available Tools 122 | 123 | The server exposes the following powerful Apollo.io integration tools: 124 | 125 | 1. **people_enrichment** 126 | - Use the People Enrichment endpoint to enrich data for 1 person 127 | - Parameters: 128 | - `first_name` (string, optional): Person's first name 129 | - `last_name` (string, optional): Person's last name 130 | - `email` (string, optional): Person's email address 131 | - `domain` (string, optional): Company domain 132 | - `organization_name` (string, optional): Organization name 133 | - Example: 134 | ```json 135 | { 136 | "first_name": "John", 137 | "last_name": "Doe", 138 | "email": "john.doe@example.com" 139 | } 140 | ``` 141 | 142 | 2. **organization_enrichment** 143 | - Use the Organization Enrichment endpoint to enrich data for 1 company 144 | - Parameters: 145 | - `domain` (string, optional): Company domain 146 | - `name` (string, optional): Company name 147 | - Example: 148 | ```json 149 | { 150 | "domain": "apollo.io" 151 | } 152 | ``` 153 | 154 | 3. **people_search** 155 | - Use the People Search endpoint to find people 156 | - Parameters: 157 | - `q_organization_domains_list` (array, optional): List of organization domains to search within 158 | - `person_titles` (array, optional): List of job titles to search for 159 | - `person_seniorities` (array, optional): List of seniority levels to search for 160 | - Example: 161 | ```json 162 | { 163 | "person_titles": ["Marketing Manager"], 164 | "person_seniorities": ["vp"], 165 | "q_organization_domains_list": ["apollo.io"] 166 | } 167 | ``` 168 | 169 | 4. **organization_search** 170 | - Use the Organization Search endpoint to find organizations 171 | - Parameters: 172 | - `q_organization_domains_list` (array, optional): List of organization domains to search for 173 | - `organization_locations` (array, optional): List of organization locations to search for 174 | - Example: 175 | ```json 176 | { 177 | "organization_locations": ["Japan", "Ireland"] 178 | } 179 | ``` 180 | 181 | 5. **organization_job_postings** 182 | - Use the Organization Job Postings endpoint to find job postings for a specific organization 183 | - Parameters: 184 | - `organization_id` (string, required): Apollo.io organization ID 185 | - Example: 186 | ```json 187 | { 188 | "organization_id": "5e60b6381c85b4008c83" 189 | } 190 | ``` 191 | 192 | ## Extending the Server 193 | 194 | The server is designed to be easily extensible. To add new Apollo.io API capabilities: 195 | 196 | 1. Add new methods to the `ApolloClient` class in `src/apollo-client.ts` 197 | 2. Register new tools in the `setupToolHandlers` method in `src/index.ts` 198 | 3. Rebuild the project with `npm run build` 199 | 200 | ## License 201 | 202 | This project is licensed under the MIT License - see the LICENSE file for details. 203 | 204 | ## Keywords 205 | 206 | Apollo.io, Model Context Protocol, MCP, AI Assistant, TypeScript, API Integration, Apollo.io API, People Enrichment, Organization Enrichment, People Search, Organization Search, Job Postings, AI Tools -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apollo-io-mcp-server", 3 | "version": "0.1.0", 4 | "description": "A powerful Model Context Protocol (MCP) server implementation for seamless Apollo.io API integration, enabling AI assistants to interact with Apollo.io data", 5 | "main": "dist/index.js", 6 | "type": "module", 7 | "scripts": { 8 | "build": "tsc", 9 | "start": "node dist/index.js", 10 | "dev": "tsx --watch src/index.ts", 11 | "stdio": "node dist/index.js" 12 | }, 13 | "keywords": [ 14 | "mcp", 15 | "apollo-io", 16 | "model-context-protocol", 17 | "ai-assistant", 18 | "apollo-io-api", 19 | "apollo-io-integration", 20 | "typescript", 21 | "people-enrichment", 22 | "organization-enrichment", 23 | "people-search", 24 | "organization-search", 25 | "job-postings", 26 | "ai-tools" 27 | ], 28 | "author": "lakhvinder singh", 29 | "license": "MIT", 30 | "dependencies": { 31 | "@modelcontextprotocol/sdk": "^1.8.0", 32 | "axios": "^1.6.7", 33 | "dotenv": "^16.4.7", 34 | "mcp-proxy-auth": "^1.0.1", 35 | "zod": "^3.24.2" 36 | }, 37 | "devDependencies": { 38 | "@types/node": "^20.10.5", 39 | "tsx": "^4.7.0", 40 | "typescript": "^5.3.3" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/apollo-client.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosInstance } from 'axios'; 2 | import dotenv from 'dotenv'; 3 | 4 | // Load environment variables 5 | dotenv.config(); 6 | 7 | // Helper function to strip URL 8 | const stripUrl = (url?: string): string | undefined => { 9 | if (!url) return undefined; 10 | 11 | try { 12 | // Remove protocol (http://, https://) 13 | let stripped = url.replace(/^https?:\/\//, ''); 14 | 15 | // Remove www. 16 | stripped = stripped.replace(/^www\./, ''); 17 | 18 | // Remove trailing slash 19 | stripped = stripped.replace(/\/$/, ''); 20 | 21 | // Convert to lowercase 22 | stripped = stripped.toLowerCase(); 23 | 24 | return stripped; 25 | } catch (error) { 26 | console.error('Error stripping URL:', error); 27 | return url; 28 | } 29 | }; 30 | 31 | // Type definitions for Apollo.io API responses 32 | export interface PeopleEnrichmentQuery { 33 | first_name?: string; 34 | last_name?: string; 35 | email?: string; 36 | domain?: string; 37 | organization_name?: string; 38 | [key: string]: any; 39 | } 40 | 41 | export interface OrganizationEnrichmentQuery { 42 | domain?: string; 43 | name?: string; 44 | [key: string]: any; 45 | } 46 | 47 | export interface PeopleSearchQuery { 48 | q_organization_domains_list?: string[]; 49 | person_titles?: string[]; 50 | person_seniorities?: string[]; 51 | [key: string]: any; 52 | } 53 | 54 | export interface OrganizationSearchQuery { 55 | q_organization_domains_list?: string[]; 56 | organization_locations?: string[]; 57 | [key: string]: any; 58 | } 59 | 60 | export interface EmployeesOfCompanyQuery { 61 | company: string; 62 | website_url?: string; 63 | linkedin_url?: string; 64 | [key: string]: any; 65 | } 66 | 67 | export class ApolloClient { 68 | private apiKey: string; 69 | private baseUrl: string; 70 | private headers: Record; 71 | private axiosInstance: AxiosInstance; 72 | 73 | constructor(apiKey?: string) { 74 | this.apiKey = apiKey || process.env.APOLLO_IO_API_KEY || ''; 75 | 76 | if (!this.apiKey) { 77 | throw new Error('APOLLO_IO_API_KEY environment variable is required'); 78 | } 79 | 80 | this.baseUrl = 'https://api.apollo.io/api/v1'; 81 | this.headers = { 82 | 'Content-Type': 'application/json', 83 | 'Cache-Control': 'no-cache', 84 | 'x-api-key': this.apiKey 85 | }; 86 | 87 | this.axiosInstance = axios.create({ 88 | baseURL: this.baseUrl, 89 | headers: this.headers 90 | }); 91 | } 92 | 93 | /** 94 | * Use the People Enrichment endpoint to enrich data for 1 person. 95 | * https://docs.apollo.io/reference/people-enrichment 96 | */ 97 | async peopleEnrichment(query: PeopleEnrichmentQuery): Promise { 98 | try { 99 | const url = `${this.baseUrl}/people/match`; 100 | console.log('url', url); 101 | console.log('query', query); 102 | const response = await this.axiosInstance.post(url, query); 103 | 104 | if (response.status === 200) { 105 | return response.data; 106 | } else { 107 | console.error(`Error: ${response.status} - ${response.statusText}`); 108 | return null; 109 | } 110 | } catch (error: any) { 111 | console.error(`Error: ${error.response?.status} - ${error.response?.statusText || error.message}`); 112 | return null; 113 | } 114 | } 115 | 116 | /** 117 | * Use the Organization Enrichment endpoint to enrich data for 1 company. 118 | * https://docs.apollo.io/reference/organization-enrichment 119 | */ 120 | async organizationEnrichment(query: OrganizationEnrichmentQuery): Promise { 121 | try { 122 | const url = `${this.baseUrl}/organizations/enrich`; 123 | const response = await this.axiosInstance.get(url, { params: query }); 124 | 125 | if (response.status === 200) { 126 | return response.data; 127 | } else { 128 | console.error(`Error: ${response.status} - ${response.statusText}`); 129 | return null; 130 | } 131 | } catch (error: any) { 132 | console.error(`Error: ${error.response?.status} - ${error.response?.statusText || error.message}`); 133 | return null; 134 | } 135 | } 136 | 137 | /** 138 | * Use the People Search endpoint to find people. 139 | * https://docs.apollo.io/reference/people-search 140 | */ 141 | async peopleSearch(query: PeopleSearchQuery): Promise { 142 | try { 143 | const url = `${this.baseUrl}/mixed_people/search`; 144 | const response = await this.axiosInstance.post(url, query); 145 | 146 | if (response.status === 200) { 147 | return response.data; 148 | } else { 149 | console.error(`Error: ${response.status} - ${response.statusText}`); 150 | return null; 151 | } 152 | } catch (error: any) { 153 | console.error(`Error: ${error.response?.status} - ${error.response?.statusText || error.message}`); 154 | return null; 155 | } 156 | } 157 | 158 | /** 159 | * Use the Organization Search endpoint to find organizations. 160 | * https://docs.apollo.io/reference/organization-search 161 | */ 162 | async organizationSearch(query: OrganizationSearchQuery): Promise { 163 | try { 164 | const url = `${this.baseUrl}/mixed_companies/search`; 165 | const response = await this.axiosInstance.post(url, query); 166 | 167 | if (response.status === 200) { 168 | return response.data; 169 | } else { 170 | console.error(`Error: ${response.status} - ${response.statusText}`); 171 | return null; 172 | } 173 | } catch (error: any) { 174 | console.error(`Error: ${error.response?.status} - ${error.response?.statusText || error.message}`); 175 | return null; 176 | } 177 | } 178 | 179 | /** 180 | * Use the Organization Job Postings endpoint to find job postings for a specific organization. 181 | * https://docs.apollo.io/reference/organization-jobs-postings 182 | */ 183 | async organizationJobPostings(organizationId: string): Promise { 184 | try { 185 | const url = `${this.baseUrl}/organizations/${organizationId}/job_postings`; 186 | const response = await this.axiosInstance.get(url); 187 | 188 | if (response.status === 200) { 189 | return response.data; 190 | } else { 191 | console.error(`Error: ${response.status} - ${response.statusText}`); 192 | return null; 193 | } 194 | } catch (error: any) { 195 | console.error(`Error: ${error.response?.status} - ${error.response?.statusText || error.message}`); 196 | return null; 197 | } 198 | } 199 | 200 | /** 201 | * Get email address for a person using their Apollo ID 202 | */ 203 | async getPersonEmail(apolloId: string): Promise { 204 | try { 205 | if (!apolloId) { 206 | throw new Error('Apollo ID is required'); 207 | } 208 | 209 | const baseUrl = `https://app.apollo.io/api/v1/mixed_people/add_to_my_prospects`; 210 | const payload = { 211 | entity_ids: [apolloId], 212 | analytics_context: 'Searcher: Individual Add Button', 213 | skip_fetching_people: true, 214 | cta_name: 'Access email', 215 | cacheKey: Date.now() 216 | }; 217 | 218 | const response = await axios.post(baseUrl, payload, { 219 | headers: { 220 | 'X-Api-Key': this.apiKey, 221 | 'Content-Type': 'application/json' 222 | } 223 | }); 224 | 225 | if (!response.data) { 226 | throw new Error('No data received from Apollo API'); 227 | } 228 | 229 | const emails = (response?.data?.contacts ?? []).map((item: any) => item.email); 230 | return emails; 231 | } catch (error: any) { 232 | console.error(`Error getting person email: ${error.message}`); 233 | return null; 234 | } 235 | } 236 | 237 | /** 238 | * Find employees of a company using company name or website/LinkedIn URL 239 | */ 240 | async employeesOfCompany(query: EmployeesOfCompanyQuery): Promise { 241 | try { 242 | const { company, website_url, linkedin_url } = query; 243 | 244 | if (!company) { 245 | throw new Error('Company name is required'); 246 | } 247 | 248 | const strippedWebsiteUrl = stripUrl(website_url); 249 | const strippedLinkedinUrl = stripUrl(linkedin_url); 250 | 251 | // First search for the company 252 | const companySearchPayload = { 253 | q_organization_name: company, 254 | page: 1, 255 | limit: 100 256 | }; 257 | 258 | const mixedCompaniesResponse = await axios.post( 259 | 'https://api.apollo.io/v1/mixed_companies/search', 260 | companySearchPayload, 261 | { 262 | headers: { 263 | 'Content-Type': 'application/json', 264 | 'X-Api-Key': this.apiKey 265 | } 266 | } 267 | ); 268 | 269 | if (!mixedCompaniesResponse.data) { 270 | throw new Error('No data received from Apollo API'); 271 | } 272 | 273 | let organizations = mixedCompaniesResponse.data.organizations; 274 | if (organizations.length === 0) { 275 | throw new Error('No organizations found'); 276 | } 277 | 278 | // Filter companies by website or LinkedIn URL if provided 279 | const companyObjs = organizations.filter((item: any) => { 280 | const companyLinkedin = stripUrl(item.linkedin_url); 281 | const companyWebsite = stripUrl(item.website_url); 282 | 283 | if (strippedLinkedinUrl && companyLinkedin && companyLinkedin === strippedLinkedinUrl) { 284 | return true; 285 | } else if (strippedWebsiteUrl && companyWebsite && companyWebsite === strippedWebsiteUrl) { 286 | return true; 287 | } 288 | return false; 289 | }); 290 | 291 | // If we have filtered results, use the first one, otherwise use the first from the original search 292 | const companyObj = companyObjs.length > 0 ? companyObjs[0] : organizations[0]; 293 | const companyId = companyObj.id; 294 | 295 | if (!companyId) { 296 | throw new Error('Could not determine company ID'); 297 | } 298 | 299 | // Now search for employees 300 | const peopleSearchPayload: any = { 301 | organization_ids: [companyId], 302 | page: 1, 303 | limit: 100 304 | }; 305 | 306 | // Add optional filters if provided in the tool config 307 | if (query.person_seniorities) { 308 | peopleSearchPayload.person_titles = (query.person_seniorities ?? '').split(',').map((item: string) => item.trim()); 309 | } 310 | 311 | if (query.contact_email_status) { 312 | peopleSearchPayload.contact_email_status_v2 = (query.contact_email_status ?? '').split(',').map((item: string) => item.trim()); 313 | } 314 | 315 | const peopleResponse = await axios.post( 316 | 'https://api.apollo.io/v1/mixed_people/search', 317 | peopleSearchPayload, 318 | { 319 | headers: { 320 | 'Content-Type': 'application/json', 321 | 'X-Api-Key': this.apiKey 322 | } 323 | } 324 | ); 325 | 326 | if (!peopleResponse.data) { 327 | throw new Error('No data received from Apollo API'); 328 | } 329 | 330 | return peopleResponse.data.people || []; 331 | } catch (error: any) { 332 | console.error(`Error finding employees: ${error.message}`); 333 | return null; 334 | } 335 | } 336 | } 337 | 338 | // Example usage (for testing) 339 | async function main() { 340 | try { 341 | // Get API key from environment variable 342 | const apiKey = process.env.APOLLO_IO_API_KEY; 343 | if (!apiKey) { 344 | throw new Error('APOLLO_IO_API_KEY environment variable is required'); 345 | } 346 | 347 | const client = new ApolloClient(apiKey); 348 | 349 | // Example People Enrichment 350 | const peopleEnrichmentQuery: PeopleEnrichmentQuery = { 351 | first_name: "Tim", 352 | last_name: "Zheng" 353 | }; 354 | const peopleEnrichmentResponse = await client.peopleEnrichment(peopleEnrichmentQuery); 355 | if (peopleEnrichmentResponse) { 356 | console.log("People Enrichment Response:", JSON.stringify(peopleEnrichmentResponse, null, 2)); 357 | } else { 358 | console.log("People Enrichment failed."); 359 | } 360 | 361 | // Example Organization Enrichment 362 | const organizationEnrichmentQuery: OrganizationEnrichmentQuery = { 363 | domain: "apollo.io" 364 | }; 365 | const organizationEnrichmentResponse = await client.organizationEnrichment(organizationEnrichmentQuery); 366 | if (organizationEnrichmentResponse) { 367 | console.log("Organization Enrichment Response:", JSON.stringify(organizationEnrichmentResponse, null, 2)); 368 | } else { 369 | console.log("Organization Enrichment failed."); 370 | } 371 | 372 | // Example People Search 373 | const peopleSearchQuery: PeopleSearchQuery = { 374 | person_titles: ["Marketing Manager"], 375 | person_seniorities: ["vp"], 376 | q_organization_domains_list: ["apollo.io"] 377 | }; 378 | const peopleSearchResponse = await client.peopleSearch(peopleSearchQuery); 379 | if (peopleSearchResponse) { 380 | console.log("People Search Response:", JSON.stringify(peopleSearchResponse, null, 2)); 381 | } else { 382 | console.log("People Search failed."); 383 | } 384 | 385 | // Example Organization Search 386 | const organizationSearchQuery: OrganizationSearchQuery = { 387 | organization_locations: ["Japan", "Ireland"] 388 | }; 389 | const organizationSearchResponse = await client.organizationSearch(organizationSearchQuery); 390 | if (organizationSearchResponse) { 391 | console.log("Organization Search Response:", JSON.stringify(organizationSearchResponse, null, 2)); 392 | } else { 393 | console.log("Organization Search failed."); 394 | } 395 | 396 | // Example Organization Job Postings 397 | // Note: You need a valid organization ID for this to work 398 | const organizationId = "5e60b6381c85b4008c83"; // Replace with a valid organization ID 399 | const organizationJobPostingsResponse = await client.organizationJobPostings(organizationId); 400 | if (organizationJobPostingsResponse) { 401 | console.log("Organization Job Postings Response:", JSON.stringify(organizationJobPostingsResponse, null, 2)); 402 | } else { 403 | console.log("Organization Job Postings failed."); 404 | } 405 | } catch (error) { 406 | console.error("Error:", error); 407 | } 408 | } 409 | 410 | // Run the example if this file is executed directly 411 | if (process.argv[1] === import.meta.url) { 412 | main(); 413 | } 414 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { Server } from '@modelcontextprotocol/sdk/server/index.js'; 3 | import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; 4 | import { 5 | CallToolRequestSchema, 6 | ErrorCode, 7 | ListToolsRequestSchema, 8 | McpError, 9 | Tool 10 | } from '@modelcontextprotocol/sdk/types.js'; 11 | import { ApolloClient } from './apollo-client.js'; 12 | import dotenv from 'dotenv'; 13 | import { parseArgs } from 'node:util'; 14 | 15 | // Load environment variables 16 | dotenv.config(); 17 | 18 | // Parse command line arguments 19 | const { values } = parseArgs({ 20 | options: { 21 | 'api-key': { type: 'string' } 22 | } 23 | }); 24 | 25 | // Initialize Apollo.io client 26 | const apiKey = values['api-key'] || process.env.APOLLO_IO_API_KEY; 27 | if (!apiKey) { 28 | throw new Error('APOLLO_IO_API_KEY environment variable is required'); 29 | } 30 | 31 | class ApolloServer { 32 | // Core server properties 33 | private server: Server; 34 | private apollo: ApolloClient; 35 | 36 | constructor() { 37 | this.server = new Server( 38 | { 39 | name: 'apollo-io-manager', 40 | version: '0.1.0', 41 | }, 42 | { 43 | capabilities: { 44 | resources: {}, 45 | tools: {}, 46 | }, 47 | } 48 | ); 49 | 50 | this.apollo = new ApolloClient(apiKey); 51 | 52 | this.setupToolHandlers(); 53 | this.setupErrorHandling(); 54 | } 55 | 56 | private setupErrorHandling(): void { 57 | this.server.onerror = (error) => { 58 | console.error('[MCP Error]', error); 59 | }; 60 | 61 | process.on('SIGINT', async () => { 62 | await this.server.close(); 63 | process.exit(0); 64 | }); 65 | 66 | process.on('uncaughtException', (error) => { 67 | console.error('Uncaught exception:', error); 68 | }); 69 | 70 | process.on('unhandledRejection', (reason, promise) => { 71 | console.error('Unhandled rejection at:', promise, 'reason:', reason); 72 | }); 73 | } 74 | 75 | private setupToolHandlers(): void { 76 | this.server.setRequestHandler(ListToolsRequestSchema, async () => { 77 | // Define available tools 78 | const tools: Tool[] = [ 79 | { 80 | name: 'people_enrichment', 81 | description: 'Use the People Enrichment endpoint to enrich data for 1 person', 82 | inputSchema: { 83 | type: 'object', 84 | properties: { 85 | first_name: { 86 | type: 'string', 87 | description: "Person's first name" 88 | }, 89 | last_name: { 90 | type: 'string', 91 | description: "Person's last name" 92 | }, 93 | email: { 94 | type: 'string', 95 | description: "Person's email address" 96 | }, 97 | domain: { 98 | type: 'string', 99 | description: "Company domain" 100 | }, 101 | organization_name: { 102 | type: 'string', 103 | description: "Organization name" 104 | }, 105 | linkedin_url: { 106 | type: 'string', 107 | description: "Person's LinkedIn profile URL" 108 | } 109 | } 110 | } 111 | }, 112 | { 113 | name: 'organization_enrichment', 114 | description: 'Use the Organization Enrichment endpoint to enrich data for 1 company', 115 | inputSchema: { 116 | type: 'object', 117 | properties: { 118 | domain: { 119 | type: 'string', 120 | description: 'Company domain' 121 | }, 122 | name: { 123 | type: 'string', 124 | description: 'Company name' 125 | } 126 | } 127 | } 128 | }, 129 | { 130 | name: 'people_search', 131 | description: 'Use the People Search endpoint to find people', 132 | inputSchema: { 133 | type: 'object', 134 | properties: { 135 | q_organization_domains_list: { 136 | type: 'array', 137 | items: { type: 'string' }, 138 | description: 'List of organization domains to search within' 139 | }, 140 | person_titles: { 141 | type: 'array', 142 | items: { type: 'string' }, 143 | description: 'List of job titles to search for' 144 | }, 145 | person_seniorities: { 146 | type: 'array', 147 | items: { type: 'string' }, 148 | description: 'List of seniority levels to search for' 149 | } 150 | } 151 | } 152 | }, 153 | { 154 | name: 'organization_search', 155 | description: 'Use the Organization Search endpoint to find organizations', 156 | inputSchema: { 157 | type: 'object', 158 | properties: { 159 | q_organization_domains_list: { 160 | type: 'array', 161 | items: { type: 'string' }, 162 | description: 'List of organization domains to search for' 163 | }, 164 | organization_locations: { 165 | type: 'array', 166 | items: { type: 'string' }, 167 | description: 'List of organization locations to search for' 168 | } 169 | } 170 | } 171 | }, 172 | { 173 | name: 'organization_job_postings', 174 | description: 'Use the Organization Job Postings endpoint to find job postings for a specific organization', 175 | inputSchema: { 176 | type: 'object', 177 | properties: { 178 | organization_id: { 179 | type: 'string', 180 | description: 'Apollo.io organization ID' 181 | } 182 | }, 183 | required: ['organization_id'] 184 | } 185 | }, 186 | { 187 | name: 'get_person_email', 188 | description: 'Get email address for a person using their Apollo ID', 189 | inputSchema: { 190 | type: 'object', 191 | properties: { 192 | apollo_id: { 193 | type: 'string', 194 | description: 'Apollo.io person ID' 195 | } 196 | }, 197 | required: ['apollo_id'] 198 | } 199 | }, 200 | { 201 | name: 'employees_of_company', 202 | description: 'Find employees of a company using company name or website/LinkedIn URL', 203 | inputSchema: { 204 | type: 'object', 205 | properties: { 206 | company: { 207 | type: 'string', 208 | description: 'Company name' 209 | }, 210 | website_url: { 211 | type: 'string', 212 | description: 'Company website URL' 213 | }, 214 | linkedin_url: { 215 | type: 'string', 216 | description: 'Company LinkedIn URL' 217 | } 218 | }, 219 | required: ['company'] 220 | } 221 | } 222 | ]; 223 | 224 | return { tools }; 225 | }); 226 | 227 | this.server.setRequestHandler(CallToolRequestSchema, async (request) => { 228 | try { 229 | const args = request.params.arguments ?? {}; 230 | 231 | switch (request.params.name) { 232 | case 'people_enrichment': { 233 | const result = await this.apollo.peopleEnrichment(args); 234 | return { 235 | content: [{ 236 | type: 'text', 237 | text: JSON.stringify(result, null, 2) 238 | }] 239 | }; 240 | } 241 | 242 | case 'organization_enrichment': { 243 | const result = await this.apollo.organizationEnrichment(args); 244 | return { 245 | content: [{ 246 | type: 'text', 247 | text: JSON.stringify(result, null, 2) 248 | }] 249 | }; 250 | } 251 | 252 | case 'people_search': { 253 | const result = await this.apollo.peopleSearch(args); 254 | return { 255 | content: [{ 256 | type: 'text', 257 | text: JSON.stringify(result, null, 2) 258 | }] 259 | }; 260 | } 261 | 262 | case 'organization_search': { 263 | const result = await this.apollo.organizationSearch(args); 264 | return { 265 | content: [{ 266 | type: 'text', 267 | text: JSON.stringify(result, null, 2) 268 | }] 269 | }; 270 | } 271 | 272 | case 'organization_job_postings': { 273 | const result = await this.apollo.organizationJobPostings(args.organization_id as string); 274 | return { 275 | content: [{ 276 | type: 'text', 277 | text: JSON.stringify(result, null, 2) 278 | }] 279 | }; 280 | } 281 | 282 | case 'get_person_email': { 283 | const result = await this.apollo.getPersonEmail(args.apollo_id as string); 284 | return { 285 | content: [{ 286 | type: 'text', 287 | text: JSON.stringify(result, null, 2) 288 | }] 289 | }; 290 | } 291 | 292 | case 'employees_of_company': { 293 | const result = await this.apollo.employeesOfCompany(args as any); 294 | return { 295 | content: [{ 296 | type: 'text', 297 | text: JSON.stringify(result, null, 2) 298 | }] 299 | }; 300 | } 301 | 302 | default: 303 | throw new McpError( 304 | ErrorCode.MethodNotFound, 305 | `Unknown tool: ${request.params.name}` 306 | ); 307 | } 308 | } catch (error: any) { 309 | console.error(`Error executing tool ${request.params.name}:`, error); 310 | return { 311 | content: [{ 312 | type: 'text', 313 | text: `Apollo.io API error: ${error.message}` 314 | }], 315 | isError: true, 316 | }; 317 | } 318 | }); 319 | } 320 | 321 | async run(): Promise { 322 | const transport = new StdioServerTransport(); 323 | await this.server.connect(transport); 324 | console.log('Apollo.io MCP server started'); 325 | } 326 | } 327 | 328 | export async function serve(): Promise { 329 | const server = new ApolloServer(); 330 | await server.run(); 331 | } 332 | 333 | const server = new ApolloServer(); 334 | server.run().catch(console.error); 335 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "outDir": "dist", 9 | "sourceMap": true, 10 | "declaration": true, 11 | "skipLibCheck": true, 12 | "forceConsistentCasingInFileNames": true 13 | }, 14 | "include": ["src/**/*"], 15 | "exclude": ["node_modules", "dist"] 16 | } 17 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@esbuild/aix-ppc64@0.25.2": 6 | version "0.25.2" 7 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" 8 | integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== 9 | 10 | "@esbuild/android-arm64@0.25.2": 11 | version "0.25.2" 12 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" 13 | integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== 14 | 15 | "@esbuild/android-arm@0.25.2": 16 | version "0.25.2" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" 18 | integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== 19 | 20 | "@esbuild/android-x64@0.25.2": 21 | version "0.25.2" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" 23 | integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== 24 | 25 | "@esbuild/darwin-arm64@0.25.2": 26 | version "0.25.2" 27 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" 28 | integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== 29 | 30 | "@esbuild/darwin-x64@0.25.2": 31 | version "0.25.2" 32 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" 33 | integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== 34 | 35 | "@esbuild/freebsd-arm64@0.25.2": 36 | version "0.25.2" 37 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" 38 | integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== 39 | 40 | "@esbuild/freebsd-x64@0.25.2": 41 | version "0.25.2" 42 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" 43 | integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== 44 | 45 | "@esbuild/linux-arm64@0.25.2": 46 | version "0.25.2" 47 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" 48 | integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== 49 | 50 | "@esbuild/linux-arm@0.25.2": 51 | version "0.25.2" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" 53 | integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== 54 | 55 | "@esbuild/linux-ia32@0.25.2": 56 | version "0.25.2" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" 58 | integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== 59 | 60 | "@esbuild/linux-loong64@0.25.2": 61 | version "0.25.2" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" 63 | integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== 64 | 65 | "@esbuild/linux-mips64el@0.25.2": 66 | version "0.25.2" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" 68 | integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== 69 | 70 | "@esbuild/linux-ppc64@0.25.2": 71 | version "0.25.2" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" 73 | integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== 74 | 75 | "@esbuild/linux-riscv64@0.25.2": 76 | version "0.25.2" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" 78 | integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== 79 | 80 | "@esbuild/linux-s390x@0.25.2": 81 | version "0.25.2" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" 83 | integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== 84 | 85 | "@esbuild/linux-x64@0.25.2": 86 | version "0.25.2" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" 88 | integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== 89 | 90 | "@esbuild/netbsd-arm64@0.25.2": 91 | version "0.25.2" 92 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" 93 | integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== 94 | 95 | "@esbuild/netbsd-x64@0.25.2": 96 | version "0.25.2" 97 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" 98 | integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== 99 | 100 | "@esbuild/openbsd-arm64@0.25.2": 101 | version "0.25.2" 102 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" 103 | integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== 104 | 105 | "@esbuild/openbsd-x64@0.25.2": 106 | version "0.25.2" 107 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" 108 | integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== 109 | 110 | "@esbuild/sunos-x64@0.25.2": 111 | version "0.25.2" 112 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" 113 | integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== 114 | 115 | "@esbuild/win32-arm64@0.25.2": 116 | version "0.25.2" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" 118 | integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== 119 | 120 | "@esbuild/win32-ia32@0.25.2": 121 | version "0.25.2" 122 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" 123 | integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== 124 | 125 | "@esbuild/win32-x64@0.25.2": 126 | version "0.25.2" 127 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" 128 | integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== 129 | 130 | "@modelcontextprotocol/sdk@^1.6.0", "@modelcontextprotocol/sdk@^1.8.0": 131 | version "1.9.0" 132 | resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.9.0.tgz#1bf7a4843870b81da26983b8e69bf398d87055f1" 133 | integrity sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA== 134 | dependencies: 135 | content-type "^1.0.5" 136 | cors "^2.8.5" 137 | cross-spawn "^7.0.3" 138 | eventsource "^3.0.2" 139 | express "^5.0.1" 140 | express-rate-limit "^7.5.0" 141 | pkce-challenge "^5.0.0" 142 | raw-body "^3.0.0" 143 | zod "^3.23.8" 144 | zod-to-json-schema "^3.24.1" 145 | 146 | "@types/node@^20.10.5": 147 | version "20.17.30" 148 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.30.tgz#1d93f656d3b869dbef7b796568ac457606ba58d0" 149 | integrity sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg== 150 | dependencies: 151 | undici-types "~6.19.2" 152 | 153 | accepts@^2.0.0: 154 | version "2.0.0" 155 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" 156 | integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== 157 | dependencies: 158 | mime-types "^3.0.0" 159 | negotiator "^1.0.0" 160 | 161 | ansi-regex@^5.0.1: 162 | version "5.0.1" 163 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 164 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 165 | 166 | ansi-styles@^4.0.0: 167 | version "4.3.0" 168 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 169 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 170 | dependencies: 171 | color-convert "^2.0.1" 172 | 173 | asynckit@^0.4.0: 174 | version "0.4.0" 175 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 176 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 177 | 178 | axios@^1.6.7: 179 | version "1.8.4" 180 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447" 181 | integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw== 182 | dependencies: 183 | follow-redirects "^1.15.6" 184 | form-data "^4.0.0" 185 | proxy-from-env "^1.1.0" 186 | 187 | body-parser@^2.2.0: 188 | version "2.2.0" 189 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" 190 | integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== 191 | dependencies: 192 | bytes "^3.1.2" 193 | content-type "^1.0.5" 194 | debug "^4.4.0" 195 | http-errors "^2.0.0" 196 | iconv-lite "^0.6.3" 197 | on-finished "^2.4.1" 198 | qs "^6.14.0" 199 | raw-body "^3.0.0" 200 | type-is "^2.0.0" 201 | 202 | bytes@3.1.2, bytes@^3.1.2: 203 | version "3.1.2" 204 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 205 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 206 | 207 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 208 | version "1.0.2" 209 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 210 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 211 | dependencies: 212 | es-errors "^1.3.0" 213 | function-bind "^1.1.2" 214 | 215 | call-bound@^1.0.2: 216 | version "1.0.4" 217 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 218 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 219 | dependencies: 220 | call-bind-apply-helpers "^1.0.2" 221 | get-intrinsic "^1.3.0" 222 | 223 | cliui@^8.0.1: 224 | version "8.0.1" 225 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 226 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 227 | dependencies: 228 | string-width "^4.2.0" 229 | strip-ansi "^6.0.1" 230 | wrap-ansi "^7.0.0" 231 | 232 | color-convert@^2.0.1: 233 | version "2.0.1" 234 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 235 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 236 | dependencies: 237 | color-name "~1.1.4" 238 | 239 | color-name@~1.1.4: 240 | version "1.1.4" 241 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 242 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 243 | 244 | combined-stream@^1.0.8: 245 | version "1.0.8" 246 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 247 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 248 | dependencies: 249 | delayed-stream "~1.0.0" 250 | 251 | content-disposition@^1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" 254 | integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== 255 | dependencies: 256 | safe-buffer "5.2.1" 257 | 258 | content-type@^1.0.5: 259 | version "1.0.5" 260 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 261 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 262 | 263 | cookie-signature@^1.2.1: 264 | version "1.2.2" 265 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" 266 | integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== 267 | 268 | cookie@^0.7.1: 269 | version "0.7.2" 270 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" 271 | integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== 272 | 273 | cors@^2.8.5: 274 | version "2.8.5" 275 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 276 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 277 | dependencies: 278 | object-assign "^4" 279 | vary "^1" 280 | 281 | cross-spawn@^7.0.3: 282 | version "7.0.6" 283 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 284 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 285 | dependencies: 286 | path-key "^3.1.0" 287 | shebang-command "^2.0.0" 288 | which "^2.0.1" 289 | 290 | debug@^4.3.5, debug@^4.4.0: 291 | version "4.4.0" 292 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 293 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 294 | dependencies: 295 | ms "^2.1.3" 296 | 297 | delayed-stream@~1.0.0: 298 | version "1.0.0" 299 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 300 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 301 | 302 | depd@2.0.0, depd@^2.0.0: 303 | version "2.0.0" 304 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 305 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 306 | 307 | dotenv@^16.4.7: 308 | version "16.5.0" 309 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" 310 | integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== 311 | 312 | dunder-proto@^1.0.1: 313 | version "1.0.1" 314 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 315 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 316 | dependencies: 317 | call-bind-apply-helpers "^1.0.1" 318 | es-errors "^1.3.0" 319 | gopd "^1.2.0" 320 | 321 | ee-first@1.1.1: 322 | version "1.1.1" 323 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 324 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 325 | 326 | emoji-regex@^8.0.0: 327 | version "8.0.0" 328 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 329 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 330 | 331 | encodeurl@^2.0.0: 332 | version "2.0.0" 333 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" 334 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 335 | 336 | es-define-property@^1.0.1: 337 | version "1.0.1" 338 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 339 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 340 | 341 | es-errors@^1.3.0: 342 | version "1.3.0" 343 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 344 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 345 | 346 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 347 | version "1.1.1" 348 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 349 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 350 | dependencies: 351 | es-errors "^1.3.0" 352 | 353 | es-set-tostringtag@^2.1.0: 354 | version "2.1.0" 355 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" 356 | integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== 357 | dependencies: 358 | es-errors "^1.3.0" 359 | get-intrinsic "^1.2.6" 360 | has-tostringtag "^1.0.2" 361 | hasown "^2.0.2" 362 | 363 | esbuild@~0.25.0: 364 | version "0.25.2" 365 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" 366 | integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== 367 | optionalDependencies: 368 | "@esbuild/aix-ppc64" "0.25.2" 369 | "@esbuild/android-arm" "0.25.2" 370 | "@esbuild/android-arm64" "0.25.2" 371 | "@esbuild/android-x64" "0.25.2" 372 | "@esbuild/darwin-arm64" "0.25.2" 373 | "@esbuild/darwin-x64" "0.25.2" 374 | "@esbuild/freebsd-arm64" "0.25.2" 375 | "@esbuild/freebsd-x64" "0.25.2" 376 | "@esbuild/linux-arm" "0.25.2" 377 | "@esbuild/linux-arm64" "0.25.2" 378 | "@esbuild/linux-ia32" "0.25.2" 379 | "@esbuild/linux-loong64" "0.25.2" 380 | "@esbuild/linux-mips64el" "0.25.2" 381 | "@esbuild/linux-ppc64" "0.25.2" 382 | "@esbuild/linux-riscv64" "0.25.2" 383 | "@esbuild/linux-s390x" "0.25.2" 384 | "@esbuild/linux-x64" "0.25.2" 385 | "@esbuild/netbsd-arm64" "0.25.2" 386 | "@esbuild/netbsd-x64" "0.25.2" 387 | "@esbuild/openbsd-arm64" "0.25.2" 388 | "@esbuild/openbsd-x64" "0.25.2" 389 | "@esbuild/sunos-x64" "0.25.2" 390 | "@esbuild/win32-arm64" "0.25.2" 391 | "@esbuild/win32-ia32" "0.25.2" 392 | "@esbuild/win32-x64" "0.25.2" 393 | 394 | escalade@^3.1.1: 395 | version "3.2.0" 396 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 397 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 398 | 399 | escape-html@^1.0.3: 400 | version "1.0.3" 401 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 402 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 403 | 404 | etag@^1.8.1: 405 | version "1.8.1" 406 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 407 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 408 | 409 | eventsource-parser@^3.0.1: 410 | version "3.0.1" 411 | resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.1.tgz#5e358dba9a55ba64ca90da883c4ca35bd82467bd" 412 | integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA== 413 | 414 | eventsource@^3.0.2, eventsource@^3.0.5: 415 | version "3.0.6" 416 | resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.6.tgz#5c4b24cd70c0323eed2651a5ee07bd4bc391e656" 417 | integrity sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA== 418 | dependencies: 419 | eventsource-parser "^3.0.1" 420 | 421 | express-rate-limit@^7.5.0: 422 | version "7.5.0" 423 | resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f" 424 | integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== 425 | 426 | express@^5.0.1: 427 | version "5.1.0" 428 | resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" 429 | integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== 430 | dependencies: 431 | accepts "^2.0.0" 432 | body-parser "^2.2.0" 433 | content-disposition "^1.0.0" 434 | content-type "^1.0.5" 435 | cookie "^0.7.1" 436 | cookie-signature "^1.2.1" 437 | debug "^4.4.0" 438 | encodeurl "^2.0.0" 439 | escape-html "^1.0.3" 440 | etag "^1.8.1" 441 | finalhandler "^2.1.0" 442 | fresh "^2.0.0" 443 | http-errors "^2.0.0" 444 | merge-descriptors "^2.0.0" 445 | mime-types "^3.0.0" 446 | on-finished "^2.4.1" 447 | once "^1.4.0" 448 | parseurl "^1.3.3" 449 | proxy-addr "^2.0.7" 450 | qs "^6.14.0" 451 | range-parser "^1.2.1" 452 | router "^2.2.0" 453 | send "^1.1.0" 454 | serve-static "^2.2.0" 455 | statuses "^2.0.1" 456 | type-is "^2.0.1" 457 | vary "^1.1.2" 458 | 459 | finalhandler@^2.1.0: 460 | version "2.1.0" 461 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" 462 | integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== 463 | dependencies: 464 | debug "^4.4.0" 465 | encodeurl "^2.0.0" 466 | escape-html "^1.0.3" 467 | on-finished "^2.4.1" 468 | parseurl "^1.3.3" 469 | statuses "^2.0.1" 470 | 471 | follow-redirects@^1.15.6: 472 | version "1.15.9" 473 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" 474 | integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== 475 | 476 | form-data@^4.0.0: 477 | version "4.0.2" 478 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" 479 | integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== 480 | dependencies: 481 | asynckit "^0.4.0" 482 | combined-stream "^1.0.8" 483 | es-set-tostringtag "^2.1.0" 484 | mime-types "^2.1.12" 485 | 486 | forwarded@0.2.0: 487 | version "0.2.0" 488 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 489 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 490 | 491 | fresh@^2.0.0: 492 | version "2.0.0" 493 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" 494 | integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== 495 | 496 | fsevents@~2.3.3: 497 | version "2.3.3" 498 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 499 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 500 | 501 | function-bind@^1.1.2: 502 | version "1.1.2" 503 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 504 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 505 | 506 | get-caller-file@^2.0.5: 507 | version "2.0.5" 508 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 509 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 510 | 511 | get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: 512 | version "1.3.0" 513 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 514 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 515 | dependencies: 516 | call-bind-apply-helpers "^1.0.2" 517 | es-define-property "^1.0.1" 518 | es-errors "^1.3.0" 519 | es-object-atoms "^1.1.1" 520 | function-bind "^1.1.2" 521 | get-proto "^1.0.1" 522 | gopd "^1.2.0" 523 | has-symbols "^1.1.0" 524 | hasown "^2.0.2" 525 | math-intrinsics "^1.1.0" 526 | 527 | get-proto@^1.0.1: 528 | version "1.0.1" 529 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 530 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 531 | dependencies: 532 | dunder-proto "^1.0.1" 533 | es-object-atoms "^1.0.0" 534 | 535 | get-tsconfig@^4.7.5: 536 | version "4.10.0" 537 | resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" 538 | integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== 539 | dependencies: 540 | resolve-pkg-maps "^1.0.0" 541 | 542 | gopd@^1.2.0: 543 | version "1.2.0" 544 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 545 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 546 | 547 | has-symbols@^1.0.3, has-symbols@^1.1.0: 548 | version "1.1.0" 549 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 550 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 551 | 552 | has-tostringtag@^1.0.2: 553 | version "1.0.2" 554 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" 555 | integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== 556 | dependencies: 557 | has-symbols "^1.0.3" 558 | 559 | hasown@^2.0.2: 560 | version "2.0.2" 561 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 562 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 563 | dependencies: 564 | function-bind "^1.1.2" 565 | 566 | http-errors@2.0.0, http-errors@^2.0.0: 567 | version "2.0.0" 568 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 569 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 570 | dependencies: 571 | depd "2.0.0" 572 | inherits "2.0.4" 573 | setprototypeof "1.2.0" 574 | statuses "2.0.1" 575 | toidentifier "1.0.1" 576 | 577 | iconv-lite@0.6.3, iconv-lite@^0.6.3: 578 | version "0.6.3" 579 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 580 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 581 | dependencies: 582 | safer-buffer ">= 2.1.2 < 3.0.0" 583 | 584 | inherits@2.0.4: 585 | version "2.0.4" 586 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 587 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 588 | 589 | ipaddr.js@1.9.1: 590 | version "1.9.1" 591 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 592 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 593 | 594 | is-fullwidth-code-point@^3.0.0: 595 | version "3.0.0" 596 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 597 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 598 | 599 | is-promise@^4.0.0: 600 | version "4.0.0" 601 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" 602 | integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== 603 | 604 | isexe@^2.0.0: 605 | version "2.0.0" 606 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 607 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 608 | 609 | math-intrinsics@^1.1.0: 610 | version "1.1.0" 611 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 612 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 613 | 614 | mcp-proxy-auth@^1.0.1: 615 | version "1.0.2" 616 | resolved "https://registry.yarnpkg.com/mcp-proxy-auth/-/mcp-proxy-auth-1.0.2.tgz#980692e201706196a22bc113743af7b701c435d9" 617 | integrity sha512-vqVpdnSZbfpRpAW8m89yFWR5nfGK2QrFtlUqBjidgMyR40NYgb39A8l8gqQZqjmBtd5ZteiNFPnnw+6WFGh4Kg== 618 | dependencies: 619 | "@modelcontextprotocol/sdk" "^1.6.0" 620 | dotenv "^16.4.7" 621 | eventsource "^3.0.5" 622 | yargs "^17.7.2" 623 | 624 | media-typer@^1.1.0: 625 | version "1.1.0" 626 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" 627 | integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== 628 | 629 | merge-descriptors@^2.0.0: 630 | version "2.0.0" 631 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" 632 | integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== 633 | 634 | mime-db@1.52.0: 635 | version "1.52.0" 636 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 637 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 638 | 639 | mime-db@^1.54.0: 640 | version "1.54.0" 641 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" 642 | integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 643 | 644 | mime-types@^2.1.12: 645 | version "2.1.35" 646 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 647 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 648 | dependencies: 649 | mime-db "1.52.0" 650 | 651 | mime-types@^3.0.0, mime-types@^3.0.1: 652 | version "3.0.1" 653 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" 654 | integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== 655 | dependencies: 656 | mime-db "^1.54.0" 657 | 658 | ms@^2.1.3: 659 | version "2.1.3" 660 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 661 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 662 | 663 | negotiator@^1.0.0: 664 | version "1.0.0" 665 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" 666 | integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== 667 | 668 | object-assign@^4: 669 | version "4.1.1" 670 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 671 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 672 | 673 | object-inspect@^1.13.3: 674 | version "1.13.4" 675 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 676 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 677 | 678 | on-finished@^2.4.1: 679 | version "2.4.1" 680 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 681 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 682 | dependencies: 683 | ee-first "1.1.1" 684 | 685 | once@^1.4.0: 686 | version "1.4.0" 687 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 688 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 689 | dependencies: 690 | wrappy "1" 691 | 692 | parseurl@^1.3.3: 693 | version "1.3.3" 694 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 695 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 696 | 697 | path-key@^3.1.0: 698 | version "3.1.1" 699 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 700 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 701 | 702 | path-to-regexp@^8.0.0: 703 | version "8.2.0" 704 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" 705 | integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== 706 | 707 | pkce-challenge@^5.0.0: 708 | version "5.0.0" 709 | resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97" 710 | integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== 711 | 712 | proxy-addr@^2.0.7: 713 | version "2.0.7" 714 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 715 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 716 | dependencies: 717 | forwarded "0.2.0" 718 | ipaddr.js "1.9.1" 719 | 720 | proxy-from-env@^1.1.0: 721 | version "1.1.0" 722 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 723 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 724 | 725 | qs@^6.14.0: 726 | version "6.14.0" 727 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" 728 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 729 | dependencies: 730 | side-channel "^1.1.0" 731 | 732 | range-parser@^1.2.1: 733 | version "1.2.1" 734 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 735 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 736 | 737 | raw-body@^3.0.0: 738 | version "3.0.0" 739 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" 740 | integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== 741 | dependencies: 742 | bytes "3.1.2" 743 | http-errors "2.0.0" 744 | iconv-lite "0.6.3" 745 | unpipe "1.0.0" 746 | 747 | require-directory@^2.1.1: 748 | version "2.1.1" 749 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 750 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 751 | 752 | resolve-pkg-maps@^1.0.0: 753 | version "1.0.0" 754 | resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" 755 | integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== 756 | 757 | router@^2.2.0: 758 | version "2.2.0" 759 | resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" 760 | integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== 761 | dependencies: 762 | debug "^4.4.0" 763 | depd "^2.0.0" 764 | is-promise "^4.0.0" 765 | parseurl "^1.3.3" 766 | path-to-regexp "^8.0.0" 767 | 768 | safe-buffer@5.2.1: 769 | version "5.2.1" 770 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 771 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 772 | 773 | "safer-buffer@>= 2.1.2 < 3.0.0": 774 | version "2.1.2" 775 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 776 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 777 | 778 | send@^1.1.0, send@^1.2.0: 779 | version "1.2.0" 780 | resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" 781 | integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== 782 | dependencies: 783 | debug "^4.3.5" 784 | encodeurl "^2.0.0" 785 | escape-html "^1.0.3" 786 | etag "^1.8.1" 787 | fresh "^2.0.0" 788 | http-errors "^2.0.0" 789 | mime-types "^3.0.1" 790 | ms "^2.1.3" 791 | on-finished "^2.4.1" 792 | range-parser "^1.2.1" 793 | statuses "^2.0.1" 794 | 795 | serve-static@^2.2.0: 796 | version "2.2.0" 797 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" 798 | integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== 799 | dependencies: 800 | encodeurl "^2.0.0" 801 | escape-html "^1.0.3" 802 | parseurl "^1.3.3" 803 | send "^1.2.0" 804 | 805 | setprototypeof@1.2.0: 806 | version "1.2.0" 807 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 808 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 809 | 810 | shebang-command@^2.0.0: 811 | version "2.0.0" 812 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 813 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 814 | dependencies: 815 | shebang-regex "^3.0.0" 816 | 817 | shebang-regex@^3.0.0: 818 | version "3.0.0" 819 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 820 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 821 | 822 | side-channel-list@^1.0.0: 823 | version "1.0.0" 824 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 825 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 826 | dependencies: 827 | es-errors "^1.3.0" 828 | object-inspect "^1.13.3" 829 | 830 | side-channel-map@^1.0.1: 831 | version "1.0.1" 832 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 833 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 834 | dependencies: 835 | call-bound "^1.0.2" 836 | es-errors "^1.3.0" 837 | get-intrinsic "^1.2.5" 838 | object-inspect "^1.13.3" 839 | 840 | side-channel-weakmap@^1.0.2: 841 | version "1.0.2" 842 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 843 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 844 | dependencies: 845 | call-bound "^1.0.2" 846 | es-errors "^1.3.0" 847 | get-intrinsic "^1.2.5" 848 | object-inspect "^1.13.3" 849 | side-channel-map "^1.0.1" 850 | 851 | side-channel@^1.1.0: 852 | version "1.1.0" 853 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 854 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 855 | dependencies: 856 | es-errors "^1.3.0" 857 | object-inspect "^1.13.3" 858 | side-channel-list "^1.0.0" 859 | side-channel-map "^1.0.1" 860 | side-channel-weakmap "^1.0.2" 861 | 862 | statuses@2.0.1, statuses@^2.0.1: 863 | version "2.0.1" 864 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 865 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 866 | 867 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 868 | version "4.2.3" 869 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 870 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 871 | dependencies: 872 | emoji-regex "^8.0.0" 873 | is-fullwidth-code-point "^3.0.0" 874 | strip-ansi "^6.0.1" 875 | 876 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 877 | version "6.0.1" 878 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 879 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 880 | dependencies: 881 | ansi-regex "^5.0.1" 882 | 883 | toidentifier@1.0.1: 884 | version "1.0.1" 885 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 886 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 887 | 888 | tsx@^4.7.0: 889 | version "4.19.3" 890 | resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.3.tgz#2bdbcb87089374d933596f8645615142ed727666" 891 | integrity sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ== 892 | dependencies: 893 | esbuild "~0.25.0" 894 | get-tsconfig "^4.7.5" 895 | optionalDependencies: 896 | fsevents "~2.3.3" 897 | 898 | type-is@^2.0.0, type-is@^2.0.1: 899 | version "2.0.1" 900 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" 901 | integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== 902 | dependencies: 903 | content-type "^1.0.5" 904 | media-typer "^1.1.0" 905 | mime-types "^3.0.0" 906 | 907 | typescript@^5.3.3: 908 | version "5.8.3" 909 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" 910 | integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== 911 | 912 | undici-types@~6.19.2: 913 | version "6.19.8" 914 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 915 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 916 | 917 | unpipe@1.0.0: 918 | version "1.0.0" 919 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 920 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 921 | 922 | vary@^1, vary@^1.1.2: 923 | version "1.1.2" 924 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 925 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 926 | 927 | which@^2.0.1: 928 | version "2.0.2" 929 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 930 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 931 | dependencies: 932 | isexe "^2.0.0" 933 | 934 | wrap-ansi@^7.0.0: 935 | version "7.0.0" 936 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 937 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 938 | dependencies: 939 | ansi-styles "^4.0.0" 940 | string-width "^4.1.0" 941 | strip-ansi "^6.0.0" 942 | 943 | wrappy@1: 944 | version "1.0.2" 945 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 946 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 947 | 948 | y18n@^5.0.5: 949 | version "5.0.8" 950 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 951 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 952 | 953 | yargs-parser@^21.1.1: 954 | version "21.1.1" 955 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 956 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 957 | 958 | yargs@^17.7.2: 959 | version "17.7.2" 960 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 961 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 962 | dependencies: 963 | cliui "^8.0.1" 964 | escalade "^3.1.1" 965 | get-caller-file "^2.0.5" 966 | require-directory "^2.1.1" 967 | string-width "^4.2.3" 968 | y18n "^5.0.5" 969 | yargs-parser "^21.1.1" 970 | 971 | zod-to-json-schema@^3.24.1: 972 | version "3.24.5" 973 | resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" 974 | integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== 975 | 976 | zod@^3.23.8, zod@^3.24.2: 977 | version "3.24.2" 978 | resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3" 979 | integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== 980 | --------------------------------------------------------------------------------