关于 contact-hunter-skill
contact-hunter-skill 使用 HubSpot、Apollo 和 Clay 查找、补充并筛选特定人员或公司的联系信息,面向 BDR 和销售团队。它先执行资格审查,再按条件逐级丰富资料,并提供联系卡片或 CSV。
主要功能
- 01优先搜索 HubSpot 现有联系人
- 02逐个候选人执行资格审查
- 03通过 Apollo 和 Clay 补充信息
- 04输出含分级与抑制状态的联系卡
- 05支持 CSV 交接或 Gmail 草稿
适用场景
- 01查找某公司特定职位的联系人
- 02核验并补充已有联系人资料
- 03整理拨打名单或序列导入 CSV
MCP 相关
该技能通过 MCP 工具调用 HubSpot、Apollo 和 Clay,搜索联系人、执行资格审查并丰富联系资料。联系卡片、CSV 交接或 Gmail 草稿是其输出形式。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scientiacapital/ skills --skill contact-hunter-skill安装后在 Claude Code 中输入/contact-hunter-skill确认已加载。
附带文件config.json
详细介绍
联系人猎手
使用实时 MCP 工具调用 HubSpot、Apollo 和 Clay,查找、补充并筛选特定人员或公司的联系信息。返回联系人卡片,包含电子邮件、电话、职务、ATL/BTL 层级和抑制状态,可直接用于 BDR 拨号名单或序列加载。 关键词:`contact hunter`、`find contacts`、`who works at`、`enrich contact`<quick_start> 触发条件:“查找 [Company] 的销售副总裁”或“获取 [Name] 在 [Company] 的联系信息”或“搜寻 [Company] 的联系人” **输入:**人员姓名、公司、职位、所在地或 LinkedIn URL **输出:**经过筛选的联系人卡片,包含电子邮件、电话、LinkedIn、ATL/BTL 层级、抑制状态和 HubSpot 记录链接
工具顺序:
hubspot_search_contacts(Epiphan AI)——联系人 / 公司是否已存在?qualify_lead(Epiphan AI)——对每个候选对象执行 Gate Q:排除 / STALE AE LEAD / ATL-BTL 层级。未经判定,不得将任何对象送去补充信息。apollo_contacts_search(Apollo 插件)→find-and-enrich-contacts-at-company(Clay)——仅对通过 Gate Q 的联系人使用瀑布式查找。- 交付:联系人卡片 + 摘要行;如果请求是拨号名单(Gate D),则为每个潜在客户使用 Gmail
create_draft;否则将 CSV 交接给sequence-load-skill。 </quick_start>
<house_rules> 面向客户的技能。输出前,按顺序执行各道关卡(详情:~/.claude/skills/epiphan-house-rules-skill/reference/gates.md): S:在提出任何产品相关声明前,使用 Epiphan AI 的 search_product_catalog 或 Epiphan Knowledge 搜索。 B:对每条面向客户的文本使用 check_my_copy。 Q:拉取候选对象后立即执行 qualify_lead,先于层级划分 / 信息补充 / 草稿创建。 D:外发文本必须创建 Gmail 草稿,绝不发送。 标识符(所有者 ID、portal、电子邮件、席位)请从该技能的 reference/identifiers.md 获取——此处不要重复说明。 任何关卡失败时,遵循 reference/self-healing.md(重试、降级并添加标记、通知 Tim、停止),并向 ~/.claude/skill-runs/.jsonl 追加一行。 </house_rules>
<success_criteria>
- 首先搜索 HubSpot(检查联系人是否已存在)
- 对每个候选对象先运行
qualify_lead,再进行信息补充——排除客户、渠道合作伙伴、仅互动过产品的对象、由 AE 积极负责的对象、已抑制对象和非 NA 对象;将过期的 AE 潜在客户标记为STALE AE LEAD - 仅当 HubSpot 未返回结果且对象通过 Gate Q 时,才运行 Apollo 瀑布式查找
- 如果 Apollo 仅提供电子邮件,则运行 Clay 信息补充以获取电话 / LinkedIn
- ATL/BTL 层级采用
qualify_lead的判定结果(不得通过内联关键词匹配) - 输出包含 HubSpot 记录 URL 的联系人卡片;摘要行注明排除 / 抑制数量
- 在摘要和 sidecar 中区分空结果与工具错误
- 写入结果 sidecar + 运行日志行 </success_criteria>
第 1 阶段:首先搜索 HubSpot
MCP 工具: mcp__claude_ai_Epiphan_Ai__hubspot_search_contacts
Search by: company name OR person name OR email domain
Return: contactId, firstName, lastName, email, phone, jobtitle, hubspot_owner_id,
lifecyclestage, device_count, bdr_suppression_until, last_activity_date, country
无论是否找到结果,每个候选对象(现有记录或搜索目标本身)都进入第 2 阶段。如果此时确认目标公司是现有客户,则停止操作并告知 Tim,不要补充信息。
阶段 2:Gate Q — qualify_lead(去重、分层和抑制的事实来源)
MCP 工具: mcp__claude_ai_Epiphan_Ai__qualify_lead — 每位候选联系人调用一次(寻找某个职位时,则每家公司调用一次,然后对返回的每位人员再调用一次)。
判定结果按以下顺序决定:
- 排除 — 现有客户、渠道合作伙伴、仅与产品互动的对象、近期有活动的 AE 负责人(< 90 天)、已抑制对象,或位于美国/加拿大以外的对象(除非请求指定了其他地理区域)。
- 过时的 AE 线索 — AE 负责人且活动时间 > 90 天(Lex 和 Phil 仅限北美):向 Tim 展示其分层和建议操作;由 Tim 决定。在他同意前,不要进行数据丰富。
- 分层 —
power_level的 atl / btl / unknown 对应卡片上的 ATL/BTL 分层。unknown→ 标记为GRAY,以供人工审核。不要重新实现关键词表;它们位于 CLAUDE.md 中。
黄金规则详情和 AE 负责人 ID:~/.claude/skills/epiphan-house-rules-skill/reference/gates.md
和 reference/identifiers.md。默认情况下,qualify_lead 为试运行模式 — 此技能绝不能传入
writeToHubSpot: true。
如果重试一次后 qualify_lead 仍不可用:停止此次搜寻,报告“Gate Q unavailable”,
通知 Tim。绝不输出未经 Gate Q 审核的名单。
在 HubSpot 中找到且通过 Gate Q 的联系人,直接进入阶段 4(其数据丰富程度已足够)。 在 HubSpot 中找不到匹配项的职位搜寻则继续进入阶段 3。
阶段 3:数据丰富流程(仅限通过 Gate Q 的对象)
MCP 工具: mcp__plugin_sales_apollo__apollo_contacts_search
Search by: person_title OR organization_name
Filters: country IN [US, CA], seniority IN [director, vp, c_suite, owner]
Limit: 10 results
Apollo 返回的新人员必须重新经过阶段 2(qualify_lead),之后才能进一步丰富数据或展示。
如果 Apollo 有电子邮箱但没有电话号码 → 运行 Clay 数据丰富:
MCP 工具: mcp__claude_ai_Clay__find-and-enrich-contacts-at-company
company: [company name]
title_keywords: [from search parameters]
enrich_phone: true
分层流程: 某一层没有结果 → 进入下一层。所有层均无结果 → 报告数量为零,并说明每层的原因(“Apollo:0 个匹配项”“Clay:无电话号码”)。某一层发生错误(身份验证、速率限制、超时)时,重试一次,然后跳过并在摘要中注明 — 绝不能报告为“找到 0 个”。 不要猜测电子邮箱模式,也不要使用网络搜索技巧:仅使用已验证来源(HubSpot、Apollo、Clay)。
阶段 4:输出联系人卡片
对于每位通过 Gate Q 的联系人,输出一张卡片(统一格式):
┌─────────────────────────────────────────────────────┐
│ JOHN SMITH [ATL — VP] │
│ VP of Engineering @ Acme Corp │
├─────────────────────────────────────────────────────┤
│ Email: [email protected] (Apollo, verified) │
│ Phone: +1 (415) 555-0123 (Clay waterfall) │
│ LinkedIn: linkedin.com/in/johnsmith │
│ Location: San Francisco, CA │
├─────────────────────────────────────────────────────┤
│ HubSpot: <contact URL per identifiers.md> │
│ Owner: Unowned (eligible for BDR outreach) │
│ Qualify: pass · tier ATL · not suppressed │
└─────────────────────────────────────────────────────┘
批量输出(用于序列加载的 CSV 格式):
First,Last,Title,Company,Email,Phone,LinkedIn,ATL_Tier,HubSpot_ID
John,Smith,VP Engineering,Acme Corp,[email protected],+14155550123,linkedin.com/in/johnsmith,ATL,{id}
每次搜寻后的摘要行:
Found: [N] contacts | [A] ATL | [G] Gray | [B] BTL | [X] excluded by qualify_lead | [S] stale AE surfaced | tiers skipped: [none|Apollo error|Clay error]
阶段 5:交付(Gate D)
- 呼叫名单请求(“搜寻联系人并设置外联”):为每张卡片,通过
mcp__claude_ai_Gmail__create_draft使用[email protected]创建 Gmail 草稿。草稿中提及的任何产品线 都必须先通过 Gate S;正文必须通过check_my_copy(Gate B)。绝不发送。 - 序列请求:将 CSV 交给
sequence-load-skill(先确认再加入)。 - 仅查询:输出卡片和摘要行,不创建草稿。
合规性: 所有数据均来自 HubSpot(现有 CRM 记录)、Apollo(公开的职业数据)或 Clay(已验证的数据丰富来源)。不得抓取数据。外联须遵守 CAN-SPAM。
<self_healing>
partial = 已生成卡片,但某个阶段降级:某个数据丰富层出错后被跳过、Clay 未返回电话号码,或草稿跳过了 Gate B/S(分别加上前缀 [brand check skipped] /
[spec unverified])。error = 未生成卡片,且没有附带原因的零结果摘要(HubSpot 搜索重试后仍失败,或无法将输入解析为个人/公司)。halt = qualify_lead
不可用 → 停止、通知 Tim 并写入状态。按
~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md 中的流程处理:重试一次 → 降级并添加标记 → 通知 Tim → 停止。每次运行都向 ~/.claude/skill-runs/contact-hunter-skill.jsonl 追加一行。
</self_healing>
写入结果旁文件
作为最后一步,写入 ~/.claude/skill-analytics/last-outcome-contact-hunter-skill.json:
{"ts":"[UTC ISO8601]","skill":"contact-hunter-skill","version":"<frontmatter version>","variant":"default",
"status":"[success|partial|error]","runtime_ms":[estimated ms from start],
"metrics":{"contacts_searched":[n],"contacts_found":[n],"phones_found":[n],"emails_found":[n],"excluded_by_qualify":[n],"stale_ae_surfaced":[n],"tiers_errored":[n]},
"error":null,"session_id":"[YYYY-MM-DD]"}
如果某些阶段失败但已生成结果,请使用状态 "partial";error 必须注明失败阶段。只有在未生成任何输出时才使用 "error"。