Skip to content
Marketing
Skill

/company-contact-finder

Find decision-makers at a specific company using Apollo, Crustdata, Fiber, and PDL people search via Gooseworks MCP. Given a company name and target titles, returns a list of contacts with name, title, LinkedIn URL, and location.

From plugin
goose-skills
1.2k200 skills
Install
$ npx -y skills add gooseworks-ai/goose-skills --skill company-contact-finder --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/company-contact-finder

Context preview

The summary Claude sees to decide when to auto-load this skill.

Find decision-makers at a specific company using Apollo, Crustdata, Fiber, and PDL people search via Gooseworks MCP. Given a company name and target titles, returns a list of contacts with name, title, LinkedIn URL, and location.

SKILL.md

company-contact-finder.SKILL.md
name: company-contact-finder
description: >
  Find decision-makers at a specific company using Apollo, Crustdata, Fiber,
  and PDL people search via Gooseworks MCP. Given a company name and target
  titles, returns a list of contacts with name, title, LinkedIn URL, and location.
tags: [lead-generation]

company-contact-finder

Find decision-makers at a specific company by name and target titles. Uses Gooseworks MCP tools (Apollo, Crustdata, Fiber, PDL) with a layered fallback strategy to maximize results while minimizing cost.

Inputs

| Input | Required | Default | Description | |-------|----------|---------|-------------| | company_name | Yes | -- | The company to search (e.g., "EisnerAmper") | | company_linkedin_url | No | -- | Company LinkedIn URL for disambiguation | | target_titles | Yes | -- | List of titles to find (e.g., ["Partner", "Controller", "VP Finance"]) | | num_results | No | 10 | How many contacts to return |

Procedure

Step 1: Understand the Request

Parse the user's request to extract:

  • **company_name** (required) -- the company to search at
  • **company_linkedin_url** (optional) -- helps disambiguate common names
  • **target_titles** (required) -- list of job titles or roles to find (e.g., ["Partner", "Controller", "VP Finance", "CFO"])
  • **num_results** (optional, default 10) -- how many contacts to return

If the user does not provide target titles, ask for them. Suggest common senior titles based on context:

  • For accounting/CPA firms: Partner, Managing Director, Controller, CFO, VP Finance
  • For tech companies: VP Engineering, CTO, Head of Product, Director of Engineering
  • For general B2B: VP, Director, C-Level, Head of

Step 2: Apollo Search (Primary — cheapest at $0.01/call)

Apollo is the cheapest search provider. Start here for all searches.

**Call:**

apollo_person_search(
  person_titles: ["Partner", "Controller", "VP Finance"],
  organization_domains: ["eisneramper.com"],
  per_page: 25
)

If you don't have the company domain, use `q_keywords` with the company name:

apollo_person_search(
  person_titles: ["Partner", "Controller", "VP Finance"],
  q_keywords: "EisnerAmper",
  per_page: 25
)

**Parse the response:** Each result contains: name, title, company, LinkedIn URL, location, email, and other profile fields. Extract and collect all results into a working list.

Step 3: Evaluate Results

Check how many results from Step 2 match the target titles at the target company.

**Quality checks:** 1. Filter out results where the company name does not match (fuzzy match is fine -- "EisnerAmper LLP" matches "EisnerAmper") 2. Filter out results where the title does not reasonably match any target title 3. Count remaining high-quality matches

**Decision:**

  • If 3+ quality matches found: skip to Step 7 (Output)
  • If fewer than 3 quality matches: proceed to Step 4

Step 4: Fiber Search (Fallback 1 — $0.02/record)

Fiber supports natural-language queries and may have profiles Apollo does not.

**Call:**

fiber_person_search(
  query: "[title1] OR [title2] OR [title3] at [company_name]",
  page_size: 25
)

**After results return:** 1. Parse results (extract name, title, company, LinkedIn URL, location) 2. Merge with all previous results 3. Deduplicate by LinkedIn URL

**Decision:**

  • If 3+ total unique quality matches: skip to Step 7 (Output)
  • If still fewer than 3: proceed to Step 5

Step 5: Crustdata Structured Search (Fallback 2 — $0.66/page)

Use Crustdata's structured filter search for more precise matching. Run one search per target title, then merge results.

**For each target title, call:**

crustdata_person_search(
  conditions: [
    {"column": "current_employers.name", "type": "in", "value": "[company_name]"},
    {"column": "current_employers.title", "type": "(.)", "value": "[target_title]"}
  ],
  filter_op: "and",
  limit: 25
)

**Example for "Partner" at EisnerAmper:**

crustdata_person_search(
  conditions: [
    {"column": "current_employers.name", "type": "=", "value": "EisnerAmper"},
    {"column": "current_employers.title", "type": "(.)", "value": "Partner"}
  ],
  filter_op: "and",
  limit: 25
)

**Optional seniority filter:** If the user requests senior decision-makers broadly (rather than specific titles), add:

{"column": "current_employers.seniority_level", "type": "in", "value": "VP,C-Level,Director"}

**TIP:** Use `preview: true` first to check result count for free before fetching full data.

**After all title searches complete:** 1. Merge all results into one list 2. Deduplicate by LinkedIn URL (keep the first occurrence) 3. Combine with results from previous steps

**Decision:**

  • If 3+ total unique quality matches: skip to Step 7 (Output)
  • If still fewer than 3: proceed to Step 6

Step 6: PDL Search (Fallback 3 — $0.30/record, most expensive)

PeopleDataLabs is the most expensive search provider. Only use as a last resort when other sources have insufficient results.

**Call:**

pdl_person_search(
  job_titles: ["Partner", "Controller", "VP Finance"],
  company_names: ["EisnerAmper"],
  num_results: 10
)

**After results return:** 1. Parse results (extract name, title, company, LinkedIn URL, location) 2. Merge with all previous results 3. Deduplicate by LinkedIn URL

Step 7: Output

Present the final deduplicated contact list.

**Table format (for the user):**

| # | Name | Title | Company | LinkedIn URL | Location | |---|------|-------|---------|--------------|----------| | 1 | Jane Smith | Partner | EisnerAmper | https://linkedin.com/in/janesmith | New York, NY | | 2 | John Doe | Controller | EisnerAmper | https://linkedin.com/in/johndoe | Chicago, IL | | ... | | | | | |

**JSON format (for downstream skills):**

{
  "company": "EisnerAmper",
  "search_titles": ["Partner", "Controller", "VP Finance"],
  "contacts": [
    {
      "name": "Jane Smith",
      "title": "Partner",
      "company": "EisnerAmper",
      "linkedin_url": "h
Read more
Ships withgoose-skills

Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.

Get the whole plugin

Other skills on goose-skills.