search_people
Find business contacts and prospects using filters like job title, company, location, industry, and seniority to identify leads for sales outreach.
Instructions
Search for people/contacts in Apollo's database with advanced filters. Use this to find prospects, leads, or specific individuals based on criteria like job title, company, location, industry, seniority, etc.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| q_keywords | No | Search keywords for person name or title | |
| person_titles | No | Job titles (e.g., ["CEO", "CTO", "VP Sales"]) | |
| person_seniorities | No | Seniority levels: "senior", "manager", "director", "vp", "c_suite", "owner", "partner" | |
| organization_ids | No | Filter by specific organization IDs | |
| organization_locations | No | Locations (e.g., ["San Francisco, CA", "New York, NY"]) | |
| organization_industry_tag_ids | No | Industry tags to filter by | |
| person_locations | No | Person locations | |
| page | No | Page number (default: 1) | |
| per_page | No | Results per page (default: 25, max: 100) |
Implementation Reference
- src/index.ts:603-630 (handler)Executes the search_people tool by posting search parameters to Apollo's /mixed_people/search API endpoint, processes the response data, and returns formatted text results listing matching people with their details including ID, title, company, location, email, LinkedIn, and seniority.private async searchPeople(args: any) { const response = await this.axiosInstance.post("/mixed_people/search", args); const people = response.data.people || []; const pagination = response.data.pagination || {}; let result = `Found ${pagination.total_entries || people.length} people\n`; result += `Page ${pagination.page || 1} of ${pagination.total_pages || 1}\n\n`; people.forEach((person: any, index: number) => { result += `${index + 1}. ${person.first_name} ${person.last_name}\n`; result += ` ID: ${person.id}\n`; result += ` Title: ${person.title || "N/A"}\n`; result += ` Company: ${person.organization?.name || "N/A"}\n`; result += ` Location: ${person.city ? `${person.city}, ${person.state || ""}` : "N/A"}\n`; result += ` Email: ${person.email || "N/A"}\n`; result += ` LinkedIn: ${person.linkedin_url || "N/A"}\n`; result += ` Seniority: ${person.seniority || "N/A"}\n\n`; }); return { content: [ { type: "text", text: result, }, ], }; }
- src/index.ts:122-169 (schema)Defines the input schema for the search_people tool, specifying parameters like keywords, titles, seniorities, organization filters, locations, pagination for validating and documenting tool inputs.inputSchema: { type: "object", properties: { q_keywords: { type: "string", description: "Search keywords for person name or title", }, person_titles: { type: "array", items: { type: "string" }, description: 'Job titles (e.g., ["CEO", "CTO", "VP Sales"])', }, person_seniorities: { type: "array", items: { type: "string" }, description: 'Seniority levels: "senior", "manager", "director", "vp", "c_suite", "owner", "partner"', }, organization_ids: { type: "array", items: { type: "string" }, description: "Filter by specific organization IDs", }, organization_locations: { type: "array", items: { type: "string" }, description: 'Locations (e.g., ["San Francisco, CA", "New York, NY"])', }, organization_industry_tag_ids: { type: "array", items: { type: "string" }, description: "Industry tags to filter by", }, person_locations: { type: "array", items: { type: "string" }, description: "Person locations", }, page: { type: "number", description: "Page number (default: 1)", }, per_page: { type: "number", description: "Results per page (default: 25, max: 100)", }, }, },
- src/index.ts:118-170 (registration)Registers the search_people tool in the MCP server's tool list returned by getTools(), including name, description, and input schema. This makes it discoverable via ListTools.{ name: "search_people", description: "Search for people/contacts in Apollo's database with advanced filters. Use this to find prospects, leads, or specific individuals based on criteria like job title, company, location, industry, seniority, etc.", inputSchema: { type: "object", properties: { q_keywords: { type: "string", description: "Search keywords for person name or title", }, person_titles: { type: "array", items: { type: "string" }, description: 'Job titles (e.g., ["CEO", "CTO", "VP Sales"])', }, person_seniorities: { type: "array", items: { type: "string" }, description: 'Seniority levels: "senior", "manager", "director", "vp", "c_suite", "owner", "partner"', }, organization_ids: { type: "array", items: { type: "string" }, description: "Filter by specific organization IDs", }, organization_locations: { type: "array", items: { type: "string" }, description: 'Locations (e.g., ["San Francisco, CA", "New York, NY"])', }, organization_industry_tag_ids: { type: "array", items: { type: "string" }, description: "Industry tags to filter by", }, person_locations: { type: "array", items: { type: "string" }, description: "Person locations", }, page: { type: "number", description: "Page number (default: 1)", }, per_page: { type: "number", description: "Results per page (default: 25, max: 100)", }, }, }, },
- src/index.ts:62-63 (registration)Dispatches calls to the search_people handler in the CallToolRequestSchema request handler switch statement.case "search_people": return await this.searchPeople(args);