关于 company-contact-finder
company-contact-finder 是仅在 GooseWorks coworker 中运行的技能,可按公司和职位查找决策者。它先搜索 Fiber,结果不足时再使用付费的 Crustdata 和 PDL,并跨来源去重。
主要功能
- 01按公司和职位搜索
- 02优先使用 Fiber 的分层搜索
- 03Crustdata 与 PDL 备用搜索
- 04筛选并去重联系人
- 05付费搜索前征求确认
适用场景
- 01查找指定公司的财务负责人
- 02按目标职位识别高管
- 03首个来源结果不足时继续搜索
MCP 相关
该技能依赖 GooseWorks coworker 的人员搜索工具,只能在 GooseWorks coworker 中运行;外部 Agent 连接的 GooseWorks 服务不提供这些工具。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ gooseworks-ai/ goose-skills --skill company-contact-finder安装后在 Claude Code 中输入/company-contact-finder确认已加载。
附带文件skill.meta.json
详细介绍
company-contact-finder
按姓名和目标职位查找特定公司的决策者。使用 GooseWorks 同事的人员搜索工具(Fiber、Crustdata、PDL),并采用分层回退机制,因此只有在上一个数据源结果不足时,才会使用下一个数据源并付费。
运行位置
此技能仅在 GooseWorks 同事中运行(即 GooseWorks 应用中的同事)。它使用的人员搜索工具仅在该处提供。Claude、ChatGPT 和其他外部 Agent 所连接的 GooseWorks 服务不提供这些工具。
如果你的工具列表中没有 fiber_person_search、crustdata_person_search 和 pdl_person_search,说明你不在该同事环境中。请告知用户,此联系人搜索仅在 GooseWorks 同事中运行,然后停止。不要尝试用其他工具代替。
费用规则
此技能中的每次搜索都需要付费。每次进行付费搜索或翻页前,都要告知客户费用并等待其确认。
- 根据工具自身的说明,报出你即将请求的页面大小对应的价格。不要凭记忆或根据此文件报价。
- 每次请求下一页或使用下一个数据源前,都要再次询问。一次确认仅适用于一次搜索,不适用于整个回退链。
- 如果客户拒绝,请停止并展示目前已有的结果。
输入
| 输入 | 必填 | 默认值 | 说明 |
|---|---|---|---|
| company_name | 是 | -- | 要搜索的公司(例如,“EisnerAmper”) |
| company_linkedin_url | 否 | -- | 用于消除歧义的公司 LinkedIn URL |
| target_titles | 是 | -- | 要查找的职位列表(例如,["Partner", "Controller", "VP Finance"]) |
| num_results | 否 | 10 | 要返回的联系人数量 |
流程
Step 1:了解请求
解析用户的请求,提取:
- company_name(必填)——要搜索的公司
- company_linkedin_url(可选)——用于区分常见名称
- target_titles(必填)——要查找的职位或角色列表(例如,["Partner", "Controller", "VP Finance", "CFO"])
- num_results(可选,默认值为 10)——要返回的联系人数量
如果用户没有提供目标职位,请向其询问。根据上下文建议常见的高级职位:
- 会计师事务所/CPA 事务所:Partner、Managing Director、Controller、CFO、VP Finance
- 科技公司:VP Engineering、CTO、Head of Product、Director of Engineering
- 一般 B2B:VP、Director、C-Level、Head of
Step 2:Fiber 搜索(主要)
Fiber 接受自然语言查询,并按返回的记录数量收费,因此只请求所需数量的记录。
报出此页面大小对应的价格,并取得客户确认。然后使用 fiber_person_search:
fiber_person_search(
query: "[title1] OR [title2] OR [title3] at [company_name]",
page_size: 10
)
将 page_size 设为 num_results(最多为 100)。请求下一页时,在获得新的确认后,传入上一条响应中的 cursor。
你可以在 search_params 中传入结构化筛选条件,而不是使用 query(例如 {"job_titles": ["CFO"], "locations": ["New York"]})。如果两者都传入,则以 query 为准。
解析响应: 从每条结果中提取姓名、职位、公司、LinkedIn URL 和所在地,整理到工作列表中。
Step 3:评估结果
检查目前找到的结果中,有多少符合目标公司的目标职位。
质量检查:
- 筛除公司名称不匹配的结果(可接受模糊匹配——“EisnerAmper LLP”与“EisnerAmper”匹配)
- 筛除职位与任何目标职位都不合理匹配的结果
- 统计剩余的高质量匹配结果
决策:
- 如果找到 3 个或更多高质量匹配结果:跳至 Step 6(输出)
- 如果少于 3 个高质量匹配结果:继续执行 Step 4
第 4 步:Crustdata 结构化搜索(备选方案 1)
Crustdata 的筛选搜索能更精准地匹配公司和职位。无论页面大小如何,它都按页收费,因此请将 limit 设为你愿意使用的最大结果数(最多 100 条)。
先报出一页的价格并征得客户同意。然后使用 crustdata_person_search:
crustdata_person_search(
conditions: [
{"column": "current_employers.name", "type": "=", "value": "[company_name]"},
{"column": "current_employers.title", "type": "(.)", "value": "[title1]|[title2]|[title3]"}
],
filter_op: "and",
limit: 25
)
(.) 表示包含/模式匹配,因此一次搜索可以用 | 连接多个职位。如果没有找到结果,就改为每个职位分别搜索;每次搜索都单独按页收费,因此需要逐次报价并征得同意。公司名称精确匹配不到时,也对公司名称使用 (.)(例如 “EisnerAmper LLP”)。
示例:搜索 EisnerAmper 的合伙人和财务总监:
crustdata_person_search(
conditions: [
{"column": "current_employers.name", "type": "=", "value": "EisnerAmper"},
{"column": "current_employers.title", "type": "(.)", "value": "Partner|Controller"}
],
filter_op: "and",
limit: 25
)
**广泛搜索高级领导者:**如果用户想找高级决策者,而不是特定职位,请匹配职位,而不是资历字段:
{"column": "current_employers.title", "type": "(.)", "value": "Chief|VP|Vice President|Director|Head of|Partner"}
要搜索下一页,请在再次征得同意后,传入上一条响应中的 cursor。
返回结果后:
- 与之前的所有结果合并
- 按 LinkedIn URL 去重(保留首次出现的结果)
决策:
- 如果总计有 3 条或更多符合条件的唯一结果:跳至第 6 步(输出)
- 如果仍少于 3 条:继续第 5 步
第 5 步:PDL 搜索(备选方案 2,最后手段)
在这三个数据源中,PeopleDataLabs 的单条记录费用最高。只有其他来源结果不足时才使用,并且只搜索仍缺少的记录。
先报出搜索这些记录的价格并征得客户同意。然后使用 pdl_person_search:
pdl_person_search(
job_titles: ["Partner", "Controller", "VP Finance"],
company_names: ["EisnerAmper"],
num_results: 5
)
num_results 默认值为 1,最多为 25。请使用结构化字段;只有在无法表达搜索条件时,才将 query 用作备用方案。
返回结果后:
- 解析结果(提取姓名、职位、公司、LinkedIn URL、位置)
- 与之前的所有结果合并
- 按 LinkedIn URL 去重
第 6 步:输出
呈现最终去重后的联系人列表。
表格格式(供用户查看):
| # | 姓名 | 职位 | 公司 | LinkedIn URL | 位置 |
|---|---|---|---|---|---|
| 1 | Jane Smith | 合伙人 | EisnerAmper | https://linkedin.com/in/janesmith | New York, NY |
| 2 | John Doe | 财务总监 | EisnerAmper | https://linkedin.com/in/johndoe | Chicago, IL |
| ... |
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": ["fiber", "crustdata", "pdl"]
}
摘要行:
在 [公司] 找到 X 位符合 [职位] 条件的联系人。使用的数据源:[返回结果的数据源列表]。
如果所有备选方案都用过后仍少于 3 位联系人,请告知用户:
仅找到 X 位联系人。该公司可能规模较小、这些职位可能不常见,或者数据库对该公司的覆盖有限。请考虑扩大目标职位范围,或尝试其他公司名称拼写。
人员搜索工具参考
这三个工具都仅在 GooseWorks coworker 上提供,且都需要付费。每个工具的描述中都注明了价格;每次搜索前都要报价。
| 工具 | 用途 | 收费方式 | 参数 |
|---|---|---|---|
fiber_person_search | 自然语言或结构化人员搜索 | 按返回记录数收费 | query(自然语言)、search_params(结构化)、page_size(1-100,默认 25)、cursor |
crustdata_person_search | 结构化筛选搜索 | 按页收费,无论 limit 为何 | conditions(由 column / type / value 组成的列表)、filter_op(and 或 or)、limit(1-100,默认 25)、cursor |
pdl_person_search | 高级人员搜索,最后手段 | 按返回记录数收费 | job_titles、company_names、job_title_levels、job_title_role、location_country、location_region、location_locality、num_results(1-25,默认 1)、query(备用方案) |
Apollo 人员搜索功能已在 GooseWorks 中弃用:它会隐藏姓氏,因此无法用于联系外联。请勿使用。
Crustdata 筛选列
| 列 | 类型 | 示例值 |
|---|---|---|
current_employers.name | =(精确匹配),(.)(包含) | "EisnerAmper" |
current_employers.title | (.)(包含 / 模式匹配),=(精确匹配) | "Partner","CFO|Controller" |
region | = | "San Francisco" |
country | = | "United States" |
skills | (.) | "python" |
years_of_experience | >、<、between("min,max") | "8" |
headline | (.) | "fractional CFO" |
示例
基本:查找 EisnerAmper 的合伙人和控制人
Find Partners and Controllers at EisnerAmper
Agent 报出 10 条记录的 Fiber 价格,获得肯定答复后,使用 query: "Partner OR Controller at EisnerAmper", page_size: 10 运行 Fiber 搜索(步骤 2)。
更多职位:查找 Sage Intacct 用户公司的财务副总裁和首席财务官
Find VP Finance and CFO at companies using Sage Intacct
Agent 构建 Fiber 查询 "VP Finance OR CFO at companies using Sage Intacct"。
特定类型公司的高级领导
Find Managing Directors at CPA firms in San Francisco
Agent 构建 Fiber 查询 "Managing Director at CPA firm San Francisco"。
使用 LinkedIn URL 消除歧义
Find Partners at EisnerAmper (https://linkedin.com/company/eisneramper)
Agent 按公司名称“EisnerAmper”搜索,并在核查结果时使用 LinkedIn URL 将其与名称相近的公司区分开。
故障排除
无法使用人员搜索工具
你当前不在 GooseWorks coworker 中。请告知用户,此联系人搜索只能在 GooseWorks coworker 中运行,然后停止(参见“运行位置”)。
未返回结果
- 尝试公司的其他拼写(例如,“EisnerAmper”、“Eisner Amper”或“EisnerAmper LLP”),或在 Crustdata 公司列使用
(.)而不是= - 放宽目标职位条件(例如,在“Partner”之外添加“Managing Director”)
- 在客户同意价格后,转到下一个来源(步骤 4-5)
无关结果过多
- 添加更具体的职位词,而不是宽泛的词
- 在 Crustdata 中,使用
=精确匹配职位,而不是使用(.) - 添加
region或country条件
不同来源中的重复联系人
此技能会按 LinkedIn URL 去重。如果发现 URL 略有不同的近似重复项(例如,末尾带有斜杠),请先去掉末尾的斜杠和查询参数,再进行去重。
元数据
metadata:
requires:
mcp_servers: ["gooseworks"]
runs_in: "GooseWorks coworker only"
cost: "Paid per search; quote the price the tool states and get the customer's yes first"