Systems Lab

Agent skill

contact-research

Contact research skill for Claude Code and Codex: given a list of people, match and enrich each one with Vibe Prospecting — verified work email, LinkedIn, direct phone, current role, work history, seniority, and recent job changes — then write a 4-6 sentence professional synopsis per person.

activeNeeds a keyActs undeclared1,397 words

Filed under Prospecting and list building.

From explorium-ai/gtm-skills · 22 skill entries · 200 · pushed 2026-10-11

What it does when it runs

Contact research skill for Claude Code and Codex: given a list of people, match and enrich each one with Vibe Prospecting — verified work email, LinkedIn, direct phone, current role, work history, seniority, and recent job changes — then write a 4-6 sentence professional synopsis per person. Use for pre-call research, account intelligence, founder diligence, recruiting, and conference prep. Triggers on 'research these people', 'profile this contact list', 'who are these attendees', 'background on these prospects'. Works in Claude Code, Codex, Grok, and Claude Cowork.

Automated analysis of the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • YOUR_VP_API_KEY
  • mcp__*__fetch-entities
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shell

Ask about contact-research

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/explorium-ai/gtm-skills.git /tmp/gtm-skills
git -C /tmp/gtm-skills sparse-checkout set "skills/contact-research"
mkdir -p ~/.claude/skills/contact-research
cp -R "/tmp/gtm-skills/skills/contact-research/." ~/.claude/skills/contact-research/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 22 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add explorium-ai/gtm-skills
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs mcp__*__fetch-entities, YOUR_VP_API_KEY, which you have to obtain separately.

Reproduced in full from explorium-ai/gtm-skills/blob/8b9a83b05a738356cbdf285589ae2afb3794ac74/skills/contact-research/SKILL.md, which is licensed MIT (repository). 1,397 words, 16 headings.

Contact Research — Vibe Prospecting Deep Profile

Given a list of people, match and enrich each one with Vibe Prospecting, then have Claude write a professional synopsis — who they are, what they do, their career trajectory, and what's relevant to know before engaging with them.

What you'll end up with:

  • Verified contact info (work email, LinkedIn, direct phone) for each person
  • A full professional profile: current role, work history, seniority, department, company context
  • Recent career signals: job changes, promotions
  • A 4–6 sentence professional synopsis per person, written by Claude in plain English

Good for: pre-call research, account intelligence, investor diligence on founders, recruiting, conference prep.


Step 0 — Credential Check (Claude: always do this first)

Cowork mode: confirm mcp__*__fetch-entities is in your tool list.

  • ✅ Found → proceed
  • ❌ Missing → tell the user: "Please connect the Vibe Prospecting connector from the connector store, then let me know." Wait. Do not continue.

Claude Code / terminal:

npx @vibeprospecting/vpai@latest --help
  • ✅ Lists tools → proceed
  • ❌ Error → run: npx @vibeprospecting/vpai@latest config --api-key "YOUR_VP_API_KEY"

Phase 1 — Prepare Your People List

Ask the user how they want to provide their list:

"How would you like to provide the people? You can: (A) paste names and companies directly in chat, (B) share a CSV file, or (C) describe who you're targeting and I'll find them from Vibe Prospecting's database."

Option A — Paste in chat

Claude converts the input into a structured CSV. Minimum needed per person: full_name + one of company_name, email, or linkedin.

Option B — CSV file

Accepted columns (use whatever you have — more is better for matching):

ColumnDescription
full_nameFull name (or first_name + last_name separately)
emailWork or personal email
linkedinLinkedIn profile URL
company_nameCurrent company name
business_idVibe Prospecting business ID (skip match step if you have this)

Save the file as people-input.csv.

Option C — Find them from scratch

If the user describes a persona (e.g. "CFOs at fintech companies in the US"), use fetch-entities with entity_type: prospects to build the list, then proceed from Phase 2. Sample 5 first before scaling.

npx @vibeprospecting/vpai@latest fetch-entities \
  --args '{
    "entity_type": "prospects",
    "filters": {
      "job_level": {"values": ["c_suite"]},
      "job_department": {"values": ["finance"]},
      "linkedin_category": {"values": ["Financial Services"]},
      "company_country_code": {"values": ["US"]},
      "has_email": true
    }
  }' \
  --number-of-results 5 \
  --tool-reasoning '<user request verbatim>'

Phase 2 — Match to Vibe Prospecting IDs

Resolve each person to an Explorium prospect ID. This unlocks all downstream enrichment.

npx @vibeprospecting/vpai@latest match-prospects --all-parameters

# From CSV
npx @vibeprospecting/vpai@latest match-prospects \
  --file-path people-input.csv \
  --schema '{"full_name":"full_name","email":"email","linkedin":"linkedin","company_name":"company_name"}' \
  --tool-reasoning 'Match people list for deep contact research'

Note the session_id and table_name from the output.

On low match confidence: drop records with confidence < 0.7 and flag them for the user — they may need a cleaner input (e.g. adding LinkedIn URL or email helps significantly).


Phase 3 — Enrich Profiles and Contact Info

Pull the full professional profile for each matched person, plus their verified contact details.

npx @vibeprospecting/vpai@latest enrich-prospects --all-parameters

npx @vibeprospecting/vpai@latest enrich-prospects \
  --args '{
    "enrichments": ["contacts", "profiles"]
  }' \
  --session-id <SESSION_ID> \
  --table-name <TABLE_NAME_FROM_MATCH_STEP> \
  --tool-reasoning 'Enrich profiles and contact info for research' \
  --csv

What "profiles" gives you:

  • Current job title, department, seniority level
  • Full work history (company, title, dates)
  • Education history
  • LinkedIn URL
  • Skills and areas of expertise

What "contacts" gives you:

  • Verified work email
  • Direct phone / mobile (when available)
  • LinkedIn URL (confirmed)

Phase 4 — Fetch Career Signals

Pull recent career events for each person — job changes and promotions are the most useful signals for understanding where someone is and why they might be receptive to a conversation.

npx @vibeprospecting/vpai@latest fetch-prospects-events --all-parameters

npx @vibeprospecting/vpai@latest fetch-prospects-events \
  --args '{
    "event_types": ["job_change", "promotion"],
    "timestamp_from": "<12 months ago, format YYYY-MM-DD>"
  }' \
  --session-id <SESSION_ID> \
  --table-name <TABLE_NAME_FROM_ENRICH_STEP> \
  --tool-reasoning 'Fetch career events for contact research' \
  --csv

Save the combined enriched + events data as people-enriched.csv.


Phase 5 — Write Professional Synopses

Read people-enriched.csv and write a professional brief for each person. Each synopsis should be in plain, natural English — like a colleague briefing you before a meeting, not a LinkedIn bio.

For each person, write a 4–6 sentence synopsis covering:

  1. Who they are right now — current role, company, seniority. What they're responsible for.
  2. How they got here — 1–2 relevant prior roles that show their trajectory or expertise.
  3. What they know — domain expertise, industries they've worked in, notable skills or patterns across their career.
  4. What's changed recently — any job change or promotion in the last 12 months. If nothing changed, note their tenure in the current role.
  5. What's worth knowing — one insight that would be useful before engaging: a shared background, a relevant company pivot, a pattern in their career, or a company context signal (e.g. their company just raised, or is in a growth stage).

Tone: confident, specific, no filler. Avoid phrases like "passionate about", "seasoned professional", or "proven track record." Use the actual data.

Example synopsis:

Sarah Chen is the VP of Revenue Operations at Lattice, where she owns the full RevOps stack — CRM, pipeline reporting, territory planning, and sales tool evaluation. Before Lattice she spent four years at Salesforce, first as a sales ops analyst and then as a senior manager, which explains her strong bias toward CRM-native workflows. Her career has stayed tightly in the revenue/GTM ops lane, moving from execution roles into leadership over the last three years. She joined Lattice 14 months ago, likely as part of a post-Series D scaling push. Worth knowing: Lattice runs HubSpot, not Salesforce — so she made a deliberate switch when she moved, which suggests she's not locked into any one platform.


Phase 6 — Deliver the Output

Present results in two formats:

1. In-chat briefing (for small lists, ≤ 10 people)

Show each person as a card:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
👤 [Full Name] — [Title] at [Company]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📧 [work_email]
🔗 [linkedin_url]
📱 [phone if available]

[Synopsis paragraph]

Career signals: [any job change/promotion in last 12 months, or "No recent changes — [X] years in current role"]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2. CSV export (for larger lists or when the user wants to save/share)

Write people-research.csv with columns:

ColumnDescription
full_nameFull name
job_titleCurrent title
company_nameCurrent company
work_emailVerified work email
linkedin_urlLinkedIn URL
phoneDirect phone (if available)
synopsisClaude's professional synopsis
career_signalMost recent job change or promotion (if any, last 12 months)
years_in_roleApproximate tenure in current role

Full Checklist

[ ] Step 0  — Vibe Prospecting connected
[ ] Phase 1 — People list prepared (pasted, CSV, or fetched)
[ ] Phase 2 — Matched to Vibe Prospecting prospect IDs
[ ] Phase 3 — Profiles and contact info enriched
[ ] Phase 4 — Career signals fetched (job changes, promotions)
[ ] Phase 5 — Professional synopses written by Claude
[ ] Phase 6 — Delivered as in-chat cards and/or CSV export

Troubleshooting

ProblemSolution
Vibe Prospecting tools missingConnect from connector store; wait for mcp__*__fetch-entities to appear
Low match rateAdd LinkedIn URLs or emails to input — they're the strongest match signals. Names alone match poorly for common names
Profile data sparseNot all profiles are equally populated. Flag thin records to the user and note what's missing
No contact info returnedSome people have limited public contact data. Note it in the synopsis card rather than leaving it blank
Career events emptyPerson may not have changed jobs recently — note their tenure in current role instead
Synopsis feels genericClaude needs data to work with — if enrichment returned little, flag the record rather than inventing details

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what contact-research does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.