import type { HunterDiscoverParams, HunterDiscoverResponse } from '@/tools/hunter/types' import { DISCOVER_RESULTS_OUTPUT, HUNTER_API_KEY_PREFIX } from '@/tools/hunter/types' import type { ToolConfig } from '@/tools/types' export const discoverTool: ToolConfig = { id: 'hunter_discover', name: 'Hunter Discover', description: 'Returns companies matching a set of criteria using Hunter.io AI-powered search.', version: '1.0.0', hosting: { envKeyPrefix: HUNTER_API_KEY_PREFIX, apiKeyParam: 'apiKey', byokProviderId: 'hunter', // Discover is free on Hunter — no credits consumed. pricing: { type: 'per_request', cost: 0 }, rateLimit: { mode: 'per_request', requestsPerMinute: 30, }, }, params: { query: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Natural language search query for companies', }, domain: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Company domain name to filter by (e.g., "stripe.com", "company.io")', }, headcount: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Company size filter (e.g., "1-10", "11-50")', }, company_type: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Type of organization', }, technology: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Technology used by companies', }, apiKey: { type: 'string', required: true, visibility: 'user-only', description: 'Hunter.io API Key', }, }, request: { url: (params) => { // Validate that at least one search parameter is provided if ( !params.query && !params.domain && !params.headcount && !params.company_type && !params.technology ) { throw new Error( 'At least one search parameter (query, domain, headcount, company_type, or technology) must be provided' ) } const url = new URL('https://api.hunter.io/v2/discover') url.searchParams.append('api_key', params.apiKey) return url.toString() }, method: 'POST', headers: () => ({ 'Content-Type': 'application/json', }), body: (params) => { const body: Record = {} if (params.query) body.query = params.query if (params.domain) body.organization = { domain: [params.domain] } if (params.headcount) body.headcount = [params.headcount] if (params.company_type) body.company_type = { include: [params.company_type] } if (params.technology) { body.technology = { include: [params.technology], } } return body }, }, transformResponse: async (response: Response) => { const data = await response.json() const companies: Array<{ domain?: string organization?: string emails_count?: { personal?: number; generic?: number; total?: number } }> = Array.isArray(data?.data) ? data.data : [] return { success: true, output: { results: companies.map((c) => ({ domain: c.domain ?? '', organization: c.organization ?? '', personal_emails: c.emails_count?.personal ?? 0, generic_emails: c.emails_count?.generic ?? 0, total_emails: c.emails_count?.total ?? 0, })), }, } }, outputs: { results: DISCOVER_RESULTS_OUTPUT, }, }