SYMBOL INDEX (60 symbols across 17 files) FILE: api/mcp.ts function initializeRateLimiters (line 28) | function initializeRateLimiters(): boolean { function getClientIp (line 75) | function getClientIp(request: Request): string { constant RATE_LIMIT_ERROR_MESSAGE (line 84) | const RATE_LIMIT_ERROR_MESSAGE = `You've hit Exa's free MCP rate limit. ... function createRateLimitResponse (line 96) | function createRateLimitResponse(retryAfterSeconds: number, reset: numbe... function isRateLimitedMethod (line 124) | function isRateLimitedMethod(body: string): boolean { function saveBypassRequestInfo (line 137) | async function saveBypassRequestInfo(ip: string, userAgent: string, debu... function checkRateLimits (line 165) | async function checkRateLimits(ip: string, debug: boolean): Promise { FILE: api/well-known-mcp-config.ts constant AVAILABLE_TOOLS (line 9) | const AVAILABLE_TOOLS = [ function GET (line 49) | function GET(): Response { function OPTIONS (line 62) | function OPTIONS(): Response { FILE: src/mcp-handler.ts type McpConfig (line 31) | interface McpConfig { function initializeMcpServer (line 45) | function initializeMcpServer(server: any, config: McpConfig = {}) { FILE: src/tools/companyResearch.ts function registerCompanyResearchTool (line 11) | function registerCompanyResearchTool(server: McpServer, config?: { exaAp... FILE: src/tools/config.ts constant API_CONFIG (line 2) | const API_CONFIG = { FILE: src/tools/crawling.ts function registerCrawlingTool (line 10) | function registerCrawlingTool(server: McpServer, config?: { exaApiKey?: ... FILE: src/tools/deepResearchCheck.ts function delay (line 11) | function delay(ms: number): Promise { function registerDeepResearchCheckTool (line 15) | function registerDeepResearchCheckTool(server: McpServer, config?: { exa... FILE: src/tools/deepResearchStart.ts function registerDeepResearchStartTool (line 10) | function registerDeepResearchStartTool(server: McpServer, config?: { exa... FILE: src/tools/deepSearch.ts function registerDeepSearchTool (line 11) | function registerDeepSearchTool(server: McpServer, config?: { exaApiKey?... FILE: src/tools/exaCode.ts function registerExaCodeTool (line 10) | function registerExaCodeTool(server: McpServer, config?: { exaApiKey?: s... FILE: src/tools/linkedInSearch.ts function registerLinkedInSearchTool (line 11) | function registerLinkedInSearchTool(server: McpServer, config?: { exaApi... FILE: src/tools/peopleSearch.ts function registerPeopleSearchTool (line 11) | function registerPeopleSearchTool(server: McpServer, config?: { exaApiKe... FILE: src/tools/webSearch.ts function registerWebSearchTool (line 11) | function registerWebSearchTool(server: McpServer, config?: { exaApiKey?:... FILE: src/tools/webSearchAdvanced.ts function registerWebSearchAdvancedTool (line 11) | function registerWebSearchAdvancedTool(server: McpServer, config?: { exa... FILE: src/types.ts type ExaSearchRequest (line 2) | interface ExaSearchRequest { type ExaAdvancedSearchRequest (line 32) | interface ExaAdvancedSearchRequest { type ExaSearchResult (line 70) | interface ExaSearchResult { type ExaSearchStatus (line 91) | interface ExaSearchStatus { type ExaCostDollars (line 97) | interface ExaCostDollars { type ExaSearchResponse (line 103) | interface ExaSearchResponse { type ExaDeepSearchRequest (line 127) | interface ExaDeepSearchRequest { type ExaDeepSearchResponse (line 144) | interface ExaDeepSearchResponse { type ExaContentsResponse (line 166) | interface ExaContentsResponse { type DeepResearchRequest (line 174) | interface DeepResearchRequest { type DeepResearchStartResponse (line 180) | interface DeepResearchStartResponse { type DeepResearchCheckResponse (line 189) | interface DeepResearchCheckResponse { type DeepResearchErrorResponse (line 214) | interface DeepResearchErrorResponse { type ExaCodeRequest (line 227) | interface ExaCodeRequest { type ExaCodeResponse (line 233) | interface ExaCodeResponse { FILE: src/utils/errorHandler.ts constant FREE_MCP_RATE_LIMIT_MESSAGE (line 7) | const FREE_MCP_RATE_LIMIT_MESSAGE = `You've hit Exa's free MCP rate limi... function handleRateLimitError (line 19) | function handleRateLimitError( FILE: src/utils/exaResponseSanitizer.ts constant SENSITIVE_RESPONSE_KEYS (line 3) | const SENSITIVE_RESPONSE_KEYS = new Set(["requestTags"]); function isRecord (line 5) | function isRecord(value: unknown): value is Record { function sanitizeStringArray (line 9) | function sanitizeStringArray(value: unknown): string[] | undefined { function sanitizeNumberArray (line 18) | function sanitizeNumberArray(value: unknown): number[] | undefined { function sanitizeObjectArray (line 27) | function sanitizeObjectArray(value: unknown): Record[] ... function sanitizeStatuses (line 39) | function sanitizeStatuses(value: unknown): Array<{ id: string; status: s... function sanitizeExtras (line 62) | function sanitizeExtras(value: unknown): { links?: string[]; imageLinks?... function sanitizeSearchOutput (line 82) | function sanitizeSearchOutput(value: unknown): Record |... function stripSensitiveKeys (line 139) | function stripSensitiveKeys(value: unknown): unknown { function sanitizeSearchResult (line 161) | function sanitizeSearchResult(value: unknown): Record |... function sanitizeSearchResults (line 216) | function sanitizeSearchResults(value: unknown): Record[... function sanitizeTopLevelResponse (line 228) | function sanitizeTopLevelResponse(value: unknown): Record