company-contact-finder

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

380 stars

Best use case

company-contact-finder is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

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

Teams using company-contact-finder should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/company-contact-finder/SKILL.md --create-dirs "https://raw.githubusercontent.com/gooseworks-ai/goose-skills/main/skills/capabilities/company-contact-finder/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/company-contact-finder/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How company-contact-finder Compares

Feature / Agentcompany-contact-finderStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

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

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# company-contact-finder

Find decision-makers at a specific company by name and target titles. Uses Gooseworks MCP tools (Crustdata + SixtyFour databases) with a layered fallback strategy to maximize results.

## 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: Natural Language Search (Primary)

This is the fastest and most flexible search method. Build a natural-language query and call the Crustdata NL search.

**Build the query string:**
Join target titles with " OR " and append the company name:
```
"[title1] OR [title2] OR [title3] at [company_name]"
```

**Example:**
```
"Partner OR Controller OR VP Finance at EisnerAmper"
```

**Call:**
```
mcp__gooseworks__crustdata_nl_search(
  query: "Partner OR Controller OR VP Finance at EisnerAmper",
  num_results: 10
)
```

**Parse the response:**
Each result contains: name, title, company, LinkedIn URL, location, 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 6 (Output)
- If fewer than 3 quality matches: proceed to Step 4

### Step 4: Structured Filter Search (Fallback 1)

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

**For each target title, call:**
```
mcp__gooseworks__crustdata_search(
  filters: {
    "op": "and",
    "conditions": [
      {"column": "current_employers.name", "type": "in", "value": ["[company_name]"]},
      {"column": "current_employers.title", "type": "(.)", "value": "[target_title]"}
    ]
  },
  limit: 25
)
```

**Example for "Partner" at EisnerAmper:**
```
mcp__gooseworks__crustdata_search(
  filters: {
    "op": "and",
    "conditions": [
      {"column": "current_employers.name", "type": "in", "value": ["EisnerAmper"]},
      {"column": "current_employers.title", "type": "(.)", "value": "Partner"}
    ]
  },
  limit: 25
)
```

**Optional seniority filter:** If the user requests senior decision-makers broadly (rather than specific titles), use the seniority_level filter:
```
{"column": "current_employers.seniority_level", "type": "in", "value": ["VP", "C-Level", "Director"]}
```

**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 Step 2

**Decision:**
- If 3+ total unique quality matches: skip to Step 6 (Output)
- If still fewer than 3: proceed to Step 5

### Step 5: SixtyFour Search (Fallback 2)

SixtyFour is an alternative people database that may have profiles Crustdata does not.

**Call:**
```
mcp__gooseworks__sixtyfour_nl_search(
  query: "[title1] OR [title2] OR [title3] at [company_name]",
  num_results: 10,
  timeout_ms: 30000
)
```

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

### Step 6: 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):**

```json
{
  "company": "EisnerAmper",
  "search_titles": ["Partner", "Controller", "VP Finance"],
  "contacts": [
    {
      "name": "Jane Smith",
      "title": "Partner",
      "company": "EisnerAmper",
      "linkedin_url": "https://linkedin.com/in/janesmith",
      "location": "New York, NY"
    }
  ],
  "total_found": 10,
  "sources": ["crustdata_nl", "crustdata_structured", "sixtyfour"]
}
```

**Summary line:**
> Found X contacts matching [titles] at [company]. Sources used: [list of sources that returned results].

If fewer than 3 contacts were found after all fallbacks, tell the user:
> Only found X contacts. The company may be small, the titles may be uncommon, or the databases may have limited coverage for this company. Consider broadening the target titles or trying alternate company name spellings.

---

## Gooseworks MCP Tools Reference

| Tool | Purpose | Key Params |
|------|---------|------------|
| `mcp__gooseworks__crustdata_nl_search` | Natural-language people search | `query` (string), `num_results` (int, max 5000), `exclude_profiles` (LinkedIn URLs to skip) |
| `mcp__gooseworks__crustdata_search` | Structured filter search | `filters` (JSON), `limit` (max 1000), `offset` (pagination) |
| `mcp__gooseworks__crustdata_preview` | Preview result count before full search | `query` or `filters` |
| `mcp__gooseworks__crustdata_enrich` | Enrich a single person by LinkedIn URL | `linkedin_url` |
| `mcp__gooseworks__sixtyfour_nl_search` | Alternative NL people search | `query`, `num_results` (max 5000), `timeout_ms` (max 600000) |

### Structured Filter Columns

| Column | Operators | Example Values |
|--------|-----------|----------------|
| `current_employers.name` | `in` (exact list) | `["EisnerAmper", "EisnerAmper LLP"]` |
| `current_employers.title` | `(.)` (fuzzy), `in` (exact) | `"Partner"`, `["Partner", "Managing Partner"]` |
| `current_employers.seniority_level` | `in` | `["VP", "C-Level", "Director", "Manager"]` |
| `current_employers.company_headcount_latest` | `=>`, `<=` | `50`, `1000` |

---

## Examples

### Basic: Find Partners and Controllers at EisnerAmper
```
Find Partners and Controllers at EisnerAmper
```
Agent builds query: `"Partner OR Controller at EisnerAmper"`, calls `crustdata_nl_search` with `num_results=10`.

### With more titles: Find VP Finance and CFO at Sage Intacct users
```
Find VP Finance and CFO at companies using Sage Intacct
```
Agent builds query: `"VP Finance OR CFO at Sage Intacct"`.

### Senior leaders at a specific firm
```
Find Managing Directors at CPA firms in San Francisco
```
Agent builds query: `"Managing Director at CPA firm San Francisco"`.

### With a LinkedIn URL for disambiguation
```
Find Partners at EisnerAmper (https://linkedin.com/company/eisneramper)
```
Agent uses the company name "EisnerAmper" and can use the LinkedIn URL for enrichment if needed.

---

## Troubleshooting

### MCP tools not available / connection errors

The Gooseworks MCP tools require the Gooseworks MCP server to be configured in your environment. If you get errors like "tool not found" or connection failures:

1. **Check MCP server configuration:** Ensure the Gooseworks MCP server is listed in your MCP configuration (e.g., `claude_desktop_config.json` or equivalent).
2. **Server URL:** The Gooseworks server must be running and accessible. Check with your workspace admin for the correct server endpoint.
3. **Authentication:** Gooseworks may require an API key or auth token. Ensure credentials are configured in your MCP server settings.

### No results returned

- Try alternate spellings of the company name (e.g., "EisnerAmper" vs "Eisner Amper" vs "EisnerAmper LLP")
- Broaden target titles (e.g., add "Managing Director" alongside "Partner")
- Use the structured search (Step 4) with fuzzy title matching `(.)` operator
- Try SixtyFour as an alternative database (Step 5)

### Too many irrelevant results

- Add more specific title terms rather than broad ones
- Use the structured search with the `in` operator for exact title matching instead of fuzzy `(.)`
- Filter results by seniority_level to restrict to senior roles

### Duplicate contacts across sources

The skill deduplicates by LinkedIn URL automatically. If you see near-duplicates with slightly different URLs (e.g., trailing slashes), normalize URLs before deduplication by stripping trailing slashes and query parameters.

---

## Metadata

```yaml
metadata:
  requires:
    mcp_servers: ["gooseworks"]
  cost: "Free (Gooseworks MCP usage)"
```

Related Skills

newsletter-sponsorship-finder

381
from gooseworks-ai/goose-skills

Find newsletters relevant to a target audience/industry for sponsorship opportunities. Discovers newsletters through web search, newsletter directories, and industry research. Returns newsletter name, author, estimated audience, topic focus, sponsorship rates (if available), and contact info.

sponsored-newsletter-finder

380
from gooseworks-ai/goose-skills

Discover newsletters in a target niche relevant to your ICP, evaluate audience fit, estimate reach and CPM, and output a ranked shortlist of sponsorship opportunities. Uses web search to find newsletters, then scores each against ICP alignment criteria. Use when a marketing team wants to reach an existing engaged audience for less than the cost of building their own, or when testing a new channel before committing.

seo-opportunity-finder

380
from gooseworks-ai/goose-skills

Find quick-win SEO content opportunities by comparing your site's existing content against competitor keyword rankings. Chains site-content-catalog and seo-domain-analyzer to build a content inventory, then identifies gaps — topics competitors rank for that you don't cover yet. Outputs a prioritized list of posts to write or update. Use when a seed/Series A team wants to start winning organic traffic without guessing.

company-current-gtm-analysis

380
from gooseworks-ai/goose-skills

Comprehensive GTM analysis of any target company. Researches what a company is currently doing across all go-to-market dimensions — content/blog, founder LinkedIn activity, SEO/traffic, hiring signals, social/community presence, customer acquisition channels, podcast appearances, review sites, competitive positioning, and partnerships. Produces a structured report identifying what's working, what's missing, and where white space exists for new strategies. Use before designing GTM strategies for a client or prospect.

reddit-post-finder

380
from gooseworks-ai/goose-skills

Scrape and search Reddit posts using Apify. Use when you need to find Reddit discussions, track competitor mentions, monitor product feedback, discover pain points, or analyze subreddit content. Supports keyword filtering, time-based searches, and subreddit-specific queries.

orthogonal-contactout

380
from gooseworks-ai/goose-skills

Find emails, phone numbers, and enrich profiles using ContactOut. LinkedIn enrichment, people search, company enrichment, and batch operations.

orthogonal-company-intel

380
from gooseworks-ai/goose-skills

Full company intelligence report - overview, team, funding, products, news

orthogonal-company-funding-search

380
from gooseworks-ai/goose-skills

Find company funding history, investors, and investment details

contact-cache

380
from gooseworks-ai/goose-skills

Track all identified/contacted people across strategies. CSV-backed contact database with dedup by LinkedIn URL or email. Prevents duplicate outreach when running strategies on a recurring cadence.

apollo-lead-finder

380
from gooseworks-ai/goose-skills

Two-phase Apollo.io prospecting: free People Search to discover ICP-matching leads, then selective enrichment to reveal emails/phones (credits per contact). Creates Apollo lists. Deduplicates against existing contacts by LinkedIn URL.

competitor-monitoring-system

381
from gooseworks-ai/goose-skills

Set up and run ongoing competitive intelligence monitoring for a client. Tracks competitor content, ads, reviews, social, and product moves.

client-packet-engine

381
from gooseworks-ai/goose-skills

Batch client packet generator. Takes company names/URLs, runs intelligence + strategy generation, presents strategies for human selection, executes selected strategies in pitch-packet mode (no live campaigns or paid enrichment), and packages into local delivery packets.