get_key_people
Identify key people at a company including founders, executives, and team members by scraping the company's website, Wikipedia, and GitHub. Returns names, titles, and sources. Provide a domain name to get started.
Instructions
Find key people at a company including founders, C-suite executives, and team members. Scrapes the company's website (e.g. /about, /team pages), checks Wikipedia, and cross-references GitHub org members. Returns names, titles, and sources. Use this when you need leadership or team information specifically. Requires a domain name.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Company website domain without protocol (e.g. 'openai.com'). The tool will scrape the site's about/team pages. |
Implementation Reference
- src/aggregator.ts:370-432 (handler)The core handler function `buildKeyPeople` that implements the get_key_people tool logic. It takes a domain and env, normalizes the domain, checks cache, then fetches key people from three sources in parallel: web scraping (website about/team pages), Hunter.io API, and OpenCorporates corporate registry. Results are deduplicated by name and returned with source attribution.
export async function buildKeyPeople( domainOrName: string, env: Env ): Promise<{ domain: string; people: Person[]; sources: string[]; }> { const domain = normalizeDomain(domainOrName); const cacheKey = `keypeople:${domain}`; const cached = await getCachedJSON<{ domain: string; people: Person[]; sources: string[] }>(env, cacheKey); if (cached) return cached; const companyNameGuess = domain.split(".")[0]; const [webData, hunterData, corpData] = await Promise.allSettled([ scrapeCompanyWebsite(domain), fetchHunterData(domain, env.HUNTER_API_KEY), searchOpenCorporates(companyNameGuess, env.OPENCORPORATES_TOKEN), ]); const web = webData.status === "fulfilled" ? webData.value : {}; const hunter = hunterData.status === "fulfilled" ? hunterData.value : null; const corp = corpData.status === "fulfilled" ? corpData.value : null; const people: Person[] = []; const seen = new Set<string>(); for (const source of [ corp?.officers?.map((o) => ({ name: o.name, title: o.position, source: "opencorporates" as const, })) || [], hunter?.people?.map((p) => ({ name: p.name, title: p.title, source: "hunter.io" as const, })) || [], web.keyPeople || [], ]) { for (const p of source) { if (p.name && !seen.has(p.name.toLowerCase())) { seen.add(p.name.toLowerCase()); people.push(p); } } } const result = { domain, people: people.slice(0, 20), sources: [ ...(web.sources || []), ...(hunter ? ["hunter.io"] : []), ...(corp ? ["opencorporates.com"] : []), ], }; await setCachedJSON(env, cacheKey, result); return result; } - src/index.ts:199-215 (registration)Tool registration for 'get_key_people' in the Cloudflare Worker (src/index.ts). Registers the tool with MCP SDK, defines the 'domain' input schema using Zod, and the handler calls `buildKeyPeople(domain, env)`.
// Tool 3: Key people server.tool( "get_key_people", "Find key people at a company including founders, C-suite executives, and team members. Scrapes the company's website (e.g. /about, /team pages), checks Wikipedia, and cross-references GitHub org members. Returns names, titles, and sources. Use this when you need leadership or team information specifically. Requires a domain name.", { domain: z.string().describe("Company website domain without protocol (e.g. 'openai.com'). The tool will scrape the site's about/team pages.") }, async ({ domain }) => { const result = await buildKeyPeople(domain, env); return { content: [ { type: "text" as const, text: JSON.stringify(result, null, 2), }, ], }; } ); - src/server.js:94-109 (registration)Tool registration for 'get_key_people' in the local stdio proxy server (src/server.js). Registers the tool and proxies calls to the remote CompanyScope API via `callRemoteTool('get_key_people', { domain })`.
// Tool 3: Key people server.tool( "get_key_people", "Find key people at a company including founders, C-suite executives, and team members. Scrapes the company's website (e.g. /about, /team pages), checks Wikipedia, and cross-references GitHub org members. Returns names, titles, and sources. Use this when you need leadership or team information specifically. Requires a domain name.", { domain: z .string() .describe( "Company website domain without protocol (e.g. 'openai.com'). The tool will scrape the site's about/team pages." ), }, async ({ domain }) => { const result = await callRemoteTool("get_key_people", { domain }); return result; } ); - bin/cli.js:83-88 (registration)Tool registration for 'get_key_people' in the CLI (bin/cli.js). Registers the tool for npx invocation, proxying to the remote API.
server.tool( "get_key_people", "Find key people at a company including founders, C-suite executives, and team members. Scrapes the company's website (e.g. /about, /team pages), checks Wikipedia, and cross-references GitHub org members. Returns names, titles, and sources. Use this when you need leadership or team information specifically. Requires a domain name.", { domain: z.string().describe("Company website domain without protocol (e.g. 'openai.com'). The tool will scrape the site's about/team pages.") }, async ({ domain }) => callRemoteTool("get_key_people", { domain }) ); - src/types.ts:69-73 (schema)The `Person` interface used by the key people handler. Defines the shape: name (string), title (string|null), and source (string).
export interface Person { name: string; title: string | null; source: string; }