mcpField
S
sales-prospecting

sales-prospecting

github.com/crustdata营销与增长11321 次安装2 周前更新
代码仓库

关于 sales-prospecting

sales-prospecting 是一项销售研究技能,可将需求分派到七种 Prospecting 工作流,并使用 Crustdata 工具发现和排序公司、联系人及信号。它面向构建客户名单和识别销售机会的团队。

主要功能

  1. 01将需求分派到七种 Prospecting 工作流
  2. 02查找公司及相似客户
  3. 03根据公司数据排列客户名单
  4. 04识别活动潜客和采购联系人
  5. 05发现扩张机会与关键联系人变动

适用场景

  1. 01根据 ICP 建立新公司名单
  2. 02排列区域或 CRM 导出中的客户优先级
  3. 03查找与活动相关的潜客
  4. 04跟踪客户扩张机会和离职的关键联系人

MCP 相关

该技能通过 Code Mode MCP 调用 Crustdata 数据工具,使用 JavaScript execute 脚本和 callTool。文档涵盖公司、个人、活动及客户信号搜索。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/crustdata/skills --skill sales-prospecting

安装后在 Claude Code 中输入/sales-prospecting确认已加载。

附带文件evals/evals.jsonREADME.md

详细介绍

销售线索挖掘

线索挖掘中心。始终以“你的目标是什么?”开场,并展示 7 个子技能。确定方向后,严格按照该子技能的操作流程执行。以下每套流程都经过实测,务必遵循,包括其中的注意事项。

步骤 0:上下文(绝不阻止执行)

  • 如果工作目录中存在 config/gtm-config.md 或 config/persona-profile.md,请读取其中的 ICP、销售内容、买家职位、客户名单和技术栈。
  • 如果这些文件不存在,请在对话中快速提问 1~2 个问题(“你向谁销售——行业、规模、地区?哪些职位负责采购?”),或引导用户使用 icp-builder 技能来正确构建配置。配置缺失绝不能阻止执行。
  • 消耗额度前,用一句话确认用户的需求。

目标菜单(先展示此菜单)

  1. 寻找新公司——“我有一个 ICP,帮我建立一份全新的名单”
  2. 寻找相似公司——“寻找与我的最佳客户相似的公司”
  3. 为我的客户账户排序——“这是我的客户账户(客户组合/区域/CSV)——我应该先联系谁?”
  4. 活动线索挖掘——“我应该去 结识哪些人?”
  5. 扩展机会雷达——“我可以在现有客户中拓展哪些业务?”
  6. TAM 构建器——“我的市场有多大?请提供真实数据。”
  7. 拥护者追踪器——“当拥护者离开我的客户公司时提醒我”(实时监控)

每次搜索的执行方式(Code Mode 基本规则)

所有 Crustdata 数据工具都在 execute({ code }) 中运行——这是一个纯 JavaScript 脚本(根据 get_schema 提供的类型化接口编写,但不要写任何类型注释;: Type、as 或泛型都会导致解析错误,使整个运行在产生任何费用前失败)。

  • 每个脚本都以查询注释开头——用户的原始请求使用 // user query: ...,派生步骤使用 // model query: ...。没有注释的脚本会在运行前被拒绝。
  • 只有一种 I/O 原语:const r = await callTool(name, params) 返回 { ok: true, data } 或 { ok: false, status, errorType, message }。始终检查 r.ok 并分支处理——调用失败不会中止脚本,因此未检查的失败会让脚本在空数据上静默继续,看起来像是“没有结果”。
  • fields 是响应白名单。 结果仅包含你列出的分组/路径;后续读取未列出的分组时会得到 undefined,看起来像数据缺失。列出你读取的每个分组。
  • 只返回最精简的投影。 只有脚本返回的内容会传给模型——映射为名称/ID/URL/信号行,绝不要返回原始个人资料。
  • 使用 await parallelMap(items, fn) 扇出调用独立调用;先使用 chunk(list, 25) 分批。绝不要并行处理游标分页或有依赖关系的阶段。在耗时阶段之后调用 checkpoint(acc),以便超时时返回部分进度。
  • 类别值是封闭集合。 看似合理但实际错误的值会静默返回 0 行。筛选前,先使用 company_autocomplete / person_autocomplete(免费)解析准确的存储值:basic_info.industries、taxonomy.professional_network_industry、funding.last_round_type、basic_info.company_type、职称、资历、function_category。
  • 资历词汇表(person_search):Entry Level、Entry Level Manager、Experienced Manager、Senior、Director、Vice President、CXO、Owner / Partner、In Training、Strategic。筛选前务必通过 person_autocomplete 确认。
  • 受套餐限制的投影会使整个调用因 403 失败,并指出相应字段——删除该字段后重新运行。已知字段:person_search 中的 professional_network.followers 和 metadata。绝不要投影 followers;改用 professional_network.connections 筛选(gte(..., 100) 可用)。
  • 筛选路径 ≠ 响应路径(person_search):筛选 ...current.company_name → 返回在 ...current[].name 下;筛选 ...current.company_id → 返回在 ...current[].crustdata_company_id 下;筛选 ...current.company_website_domain → 返回在 ...current[].company_website 下。个人资料 URL 返回在 social_handles.professional_network_identifier.profile_url 下(使用 profileUrl(p) 访问器),且不可用于筛选。
  • 值格式:公司 locations.country 接受 ISO-3(USA)作为筛选值,但返回的是标准化后的全名——不要将响应值与 "USA" 比较。雇主总部国家使用 ISO-3;个人 basic_profile.location.country 使用全名(United States);域名不带前缀(stripe.com);融资阶段使用小写蛇形命名法(series_a——in/not_in 与准确存储的字符串匹配,= 不区分大小写)。
  • 嵌套数组 AND(person_search):对一个嵌套数组字段(experience.*)使用普通 and_,表示同一个数组元素必须满足所有条件——因此,“在公司 X 担任工程师”是默认行为,且可正常工作。对于跨元素条件(“曾在 A 担任工程师,并且在 B 担任经理”,即两个不同职位),普通 and_ 不会返回结果;请改用 all_of 组。查询构建器没有 all_of 辅助函数,因此请直接编写原始筛选对象:{ op: "all_of", conditions: [ {...}, {...} ] }。同一字段有多个必需值时,has_all 的作用相同。
  • 0 个结果 ≠ 没有匹配项。 格式正确的查询也可能表达了一个定义不当的请求。请拆分请求,用低成本计数测试每个谓词的选择性,并在相信多步骤结果之前,查看 execute 响应中的 trajectory(每次调用的筛选条件和计数)。
  • 跨轮次去重:在 person_search 上使用 post_processing: { exclude_profiles: [...], exclude_names: [...] }。

子技能用法示例

1. 寻找新公司(净新增)

输入:ICP(行业/规模/地区/阶段)+ 信号(见下方列表)+ 目标职位 + 所需行数。

步骤 1 — 通过自动补全验证每个类别值。 值错误会导致结果静默为零。

// model query: resolve exact industry and funding-stage values before filtering
const probes = [
  ["basic_info.industries", "software"],
  ["funding.last_round_type", "series a"],
];
const values = await parallelMap(probes, async ([field, query]) => {
  const r = await callTool("company_autocomplete", { field, query });
  return { field, values: r.ok ? r.data : r.message };
});
return values;

步骤 2 — 先进行宽泛的 company_search,再检查前 10 个结果并迭代优化 2-4 轮。 优化项:锁定阶段(funding.last_round_type)、金额范围(funding.total_investment_usd、funding.last_round_amount_usd)、basic_info.year_founded、增长下限 gt("headcount.growth_percent.12m", N) — 可筛选但不可排序;若要按增长排名,可按此项筛选,再按 headcount.total 或 funding.last_fundraise_date 排序。说明每轮筛选保留和排除了哪些结果。

// model query: US software companies 51-1000, raised $5M+, growing >20% — refine round 2
const r = await callTool("company_search", {
  filters: and_(
    in_("basic_info.industries", ["Software Development"]),
    eq("locations.country", "USA"),
    between("headcount.total", 51, 1000),
    gt("funding.total_investment_usd", 5000000),
    gt("headcount.growth_percent.12m", 20)
  ),
  fields: ["crustdata_company_id", "basic_info", "headcount", "funding"],
  sorts: [{ field: "funding.last_fundraise_date", order: "desc" }],
  limit: 25,
});
if (!r.ok) return { error: r.message };
return {
  total: r.data.total_count,
  rows: r.data.companies.map(c => ({
    id: c.crustdata_company_id,
    name: c.basic_info?.name,
    domain: c.basic_info?.primary_domain,
    hc: c.headcount?.total,
    growth12m: c.headcount?.growth_percent?.["12m"],
    lastRound: c.funding?.last_round_type,
    lastRaise: c.funding?.last_fundraise_date,
  })),
};

步骤 3 — 拉取人员。 使用一次 person_search,限定在入围公司的 ID + 目标职位/资历(先通过 person_autocomplete 解析资历值)。在同一查询中筛除无关结果:连接数下限、排除顾问/投资人(excludes() 会为每个值构建一个模糊否定条件 — 多个条件之间为 AND)。

// model query: buyer-title people at the shortlisted companies
const r = await callTool("person_search", {
  filters: and_(
    in_("experience.employment_details.current.company_id", inputs.ids),
    in_("experience.employment_details.current.seniority_level", ["Director", "Vice President", "CXO"]),
    gte("professional_network.connections", 100),
    excludes("experience.employment_details.current.title", "advisor"),
    excludes("experience.employment_details.current.title", "investor")
  ),
  fields: ["basic_profile", "experience", "social_handles"],
  limit: 50,
});
if (!r.ok) return { error: r.message };
return r.data.profiles.map(p => ({
  name: p.basic_profile?.name,
  title: p.basic_profile?.current_title,
  company: p.experience?.employment_details?.current?.[0]?.name,
  url: profileUrl(p),
}));

步骤 4 — 对 FIT x TIMING x WARMTH 评分 → 🔥/🟡/⚪,每行显示起决定作用的信号及其日期。仅使用免费数据;联系人信息补充为自选项(见通用规则)。

2. 相似公司
  1. 对种子客户使用 company_identify — 免费;每次调用只能使用一种标识符类型(domains 或 names,均为数组)。识别为模糊匹配:一个域名可能匹配多家公司 — 为每个标识符选取 confidence_score 最高的匹配项。
  2. 使用一次 company_search 和 in_("crustdata_company_id", seedIds),读取它们共有的特征(行业值、规模范围、阶段、增长、地区)。
// model query: resolve seed customers and read the traits they share
const idr = await callTool("company_identify", {
  domains: inputs.seedDomains,
  fields: ["crustdata_company_id", "basic_info"],
});
if (!idr.ok) return { error: idr.message };
const ids = idr.data
  .map(m => m.matches?.[0]?.company_data?.crustdata_company_id)
  .filter(Boolean);
const r = await callTool("company_search", {
  filters: in_("crustdata_company_id", ids),
  fields: ["crustdata_company_id", "basic_info", "headcount", "funding", "taxonomy", "locations"],
  limit: ids.length,
});
if (!r.ok) return { error: r.message };
return r.data.companies.map(c => ({
  name: c.basic_info?.name,
  industries: c.basic_info?.industries,
  hc: c.headcount?.total,
  growth12m: c.headcount?.growth_percent?.["12m"],
  stage: c.funding?.last_round_type,
  country: c.locations?.country,
}));
  1. 将这些共同特征作为筛选条件 → 从步骤 2 开始运行配方 1。使用 nin_("crustdata_company_id", excludeIds) 排除种子客户和现有客户。
3. 排名我的客户账户(客户名册、区域或粘贴的 CSV — 一项子技能)

输入:任意来源的客户账户名称/域名/CSV。

  1. 使用 company_identify 解析所有行(免费;通过 chunk(domains, 25) + parallelMap 分批;每次调用只能使用一种标识符类型)。如实标记无法解析的行 — 绝不静默丢弃。模糊匹配可能返回多个结果;每行选取 confidence_score 最高的匹配项。
  2. 使用一次 company_search 和 in_("crustdata_company_id", ids),并设置 fields: ["crustdata_company_id", "basic_info", "funding", "headcount"]。增长数据包含在 headcount 组中(headcount.growth_percent.{1m,3m,6m,12m})— 无需额外调用。请记住,fields 是白名单:列出你读取的每个组。
// user query: rank my account list — who do I work first?
const batches = chunk(inputs.domains, 25);
const identified = await parallelMap(batches, async (batch) => {
  const r = await callTool("company_identify", {
    domains: batch,
    fields: ["crustdata_company_id", "basic_info"],
  });
  return r.ok ? r.data : batch.map(d => ({ matched_on: d, matches: [], error: r.message }));
});
const rows = identified.flat();
const unresolved = rows.filter(m => !m.matches?.length).map(m => m.matched_on);
const ids = rows.map(m => m.matches?.[0]?.company_data?.crustdata_company_id).filter(Boolean);
checkpoint({ ids, unresolved });
const r = await callTool("company_search", {
  filters: in_("crustdata_company_id", ids),
  fields: ["crustdata_company_id", "basic_info", "funding", "headcount"],
  limit: ids.length,
});
if (!r.ok) return { error: r.message, unresolved };
return {
  unresolved,
  accounts: r.data.companies.map(c => ({
    id: c.crustdata_company_id,
    name: c.basic_info?.name,
    lastRound: c.funding?.last_round_type,
    lastRaise: c.funding?.last_fundraise_date,
    raisedUsd: c.funding?.total_investment_usd,
    hc: c.headcount?.total,
    growth3m: c.headcount?.growth_percent?.["3m"],
    growth12m: c.headcount?.growth_percent?.["12m"],
  })),
};
  1. 可选:针对热门客户账户深入查询,使用 job_search 并设置 aggregations + limit: 0,获取开放职位数量(低成本的招聘信号 — 代码片段见扩张雷达)。
  2. 评分:按 TIMING 加权。融资 <3 个月 = 🔥;3-9 个月 = 🟡;>12 个月 = ⚪;员工人数增长或招聘激增可提升一个等级。输出:排名表 + 每行的“原因” + 本周前 5 名。
4. 活动线索挖掘
  1. 务必从真实来源获取参会名单 — 绝不编造参会者。 使用 web_search_live 搜索 " sponsors exhibitors"(活动官网的 /sponsors 页面通常会在搜索摘要中列出各级别赞助商),然后使用 web_enrich_live 获取页面上的完整名单。销售代表提供的名单也可使用。
// model query: find the official sponsor page for the event and pull the roster
const s = await callTool("web_search_live", { query: `${inputs.event} sponsors exhibitors` });
if (!s.ok) return { error: s.message };
const page = s.data.results.find(x => /sponsor|exhibitor/i.test(x.url));
if (!page) return { candidates: s.data.results.map(x => ({ title: x.title, url: x.url })) };
const f = await callTool("web_enrich_live", { urls: [page.url] });
if (!f.ok) return { error: f.message };
return { url: page.url, page: f.data };
  1. 使用 company_identify 解析名单(免费,使用 chunk(25) + parallelMap)→ 使用一次范围限定的 company_search 筛选符合 ICP 的公司 → 按配方 1 步骤 3 查找人员。优先选择已发布活动相关内容的人员:使用活动名称调用 social_post_search_live — 每篇帖子消耗 1 个额度(使用 exact_keyword_match 时为 3 个),因此请谨慎设置 limit(10-20)。
  2. 交付内容:按 ICP 匹配度排名的会面名单,附展位/级别信息 + 一段提及活动的建议开场白(按下方的反敷衍规则撰写)。
5. 扩张雷达(显而易见的隐性收入)

输入:客户名单(CRM 导出或销售代表提供)。扫描四个扩张面——三次限定范围的搜索即可覆盖整个客户群,无需逐个账户调用:

  • 新增资金 — 使用按账户排名的限定范围 company_search(融资字段):刚完成融资 = 有预算。
  • 新增人员 — 调用一次 person_search,使用 in_("experience.employment_details.current.company_id", customerIds) 和高级别层级;读取 current[].start_date,筛选最近约 6 个月入职的人员。你所销售的职能部门新上任的高管,是最佳的扩张触发信号。另外:查看 job_search 招聘职位(见下文)。
  • 新增领域 — 尚未覆盖的团队/地理区域/职能部门:使用同一限定范围的 person_search,在脚本中按 function_category/地区分组,并与现有联系人所在位置进行比较。
  • 暖关系路径 — 客户中的支持者,以及他们可以介绍的人(按脚本发起转介绍请求)。数据来自配置中的客户名单和支持者跟踪器输出。
// model query: new senior hires in the last 6 months across customer accounts
const cutoff = new Date(Date.now() - 183 * 24 * 3600 * 1000).toISOString().slice(0, 10);
const r = await callTool("person_search", {
  filters: and_(
    in_("experience.employment_details.current.company_id", inputs.customerIds),
    in_("experience.employment_details.current.seniority_level", ["Director", "Vice President", "CXO"])
  ),
  fields: ["basic_profile", "experience", "social_handles"],
  limit: 100,
});
if (!r.ok) return { error: r.message };
return r.data.profiles.map(p => {
  const cur = p.experience?.employment_details?.current?.[0];
  return {
    name: p.basic_profile?.name,
    title: cur?.title,
    company: cur?.name,
    started: cur?.start_date,
    url: profileUrl(p),
  };
}).filter(x => x.started && x.started >= cutoff);
// model query: open-role counts per customer account (hiring signal, counts only)
const r = await callTool("job_search", {
  filters: in_("company.basic_info.company_id", inputs.customerIds),
  aggregations: [{ type: "group_by", field: "company.basic_info.crustdata_company_id", agg: "count", size: 100 }],
  limit: 0,
});
if (!r.ok) return { error: r.message };
return r.data.aggregations;

招聘信息中的技术栈检测:使用 [.] 对 content.description 中的品牌/产品/技术名称进行筛选(精确匹配词元);(.) 对拼写错误有容错能力,也会匹配相似词,因此仅在匹配描述性多词短语时使用。按 metadata.date_added 对招聘信息排序,以确保时效性。

每个客户的输出:机会 — 扩张面 — 证据(注明日期)— 预估规模(席位/团队)— 暖关系路径 — 建议策略。按扩张就绪度对整个客户群排序。

6. TAM 构建器(经过研究的方法——务必做好)

自下而上,根据实际公司数量计算,比自上而下估算更可靠(实际公司数 × ACV)。构建三个层级,每层执行一次 company_search 计数查询:limit: 1,读取 total_count,每次约 0.03 个积分——成本很低,可以按需进行各种细分。注意:company_search 没有 count 参数;limit: 1 + total_count 就是计数查询。(person_search 有 count 参数,且不能与 limit 同时使用。)

  • TAM — 最宽泛的合格定义(任何未来可能购买的客户)。已测试示例:美国“软件开发”行业,员工人数 51–1000 = 8,244。
  • SAM — 当前产品/GTM 能服务的市场(增加融资/阶段/地区限制)。已测试:再加上融资超过 $5M = 3,132。(再加上过去 12 个月增长率超过 20%,缩小至 1,245——这是一个有用的“增长中的 SAM”细分。)
  • SOM — 实际可争取的市场:SAM × 可信的赢单率百分比,或按产能计算(销售代表人数 × 每年成交数)。
// user query: how big is my market — TAM/SAM with real counts
const base = [
  in_("basic_info.industries", ["Software Development"]),
  eq("locations.country", "USA"),
  between("headcount.total", 51, 1000),
];
const layers = [
  { name: "TAM", extra: [] },
  { name: "SAM", extra: [gt("funding.total_investment_usd", 5000000)] },
  { name: "SAM-growing", extra: [gt("funding.total_investment_usd", 5000000), gt("headcount.growth_percent.12m", 20)] },
];
const counts = await parallelMap(layers, async (l) => {
  const r = await callTool("company_search", {
    filters: and_(...base, ...l.extra),
    fields: ["crustdata_company_id"],
    limit: 1,
  });
  return { layer: l.name, count: r.ok ? r.data.total_count : null, error: r.ok ? undefined : r.message };
});
return counts;

然后:$ = 数量 × ACV(ACV 来自配置或销售代表)。自上而下交叉验证:使用 web_search_live 查询分析师的市场规模数据,并并排展示两组数字。注明筛选条件——务必打印每个数量所依据的精确筛选条件,确保结果有据可依。还可以提供其他细分(按规模区间/地区/阶段);每次约 0.03 个积分,因此可通过 parallelMap 随时运行。

7. 冠军追踪器(当前列表 + 持续监控)

步骤 1 — 获取今天的列表。 使用 person_search,结合前雇主和 recently_changed_jobs:

// user query: champions who recently left my customer accounts
const r = await callTool("person_search", {
  filters: and_(
    in_("experience.employment_details.past.company_website_domain", inputs.customerDomains),
    eq("recently_changed_jobs", true),
    gte("professional_network.connections", 100),
    excludes("experience.employment_details.past.title", "advisor"),
    excludes("experience.employment_details.past.title", "investor"),
    excludes("experience.employment_details.past.title", "board")
  ),
  fields: ["basic_profile", "experience", "social_handles"],
  limit: 50,
});
if (!r.ok) return { error: r.message };
return r.data.profiles.map(p => {
  const cur = p.experience?.employment_details?.current?.[0];
  const past = p.experience?.employment_details?.past?.[0];
  return {
    name: p.basic_profile?.name,
    was: past?.title,
    at: past?.name,
    now: cur?.title,
    nowAt: cur?.name,
    landed: cur?.start_date,
    url: profileUrl(p),
  };
});

注意事项(均已实测):

  • experience.employment_details.past.end_date 不可用于筛选——不要尝试。受支持的做法是筛选前雇主 + recently_changed_jobs = true,然后读取 current[].start_date 并人工筛选。
  • 原始列表噪声较多——请逐行检查并剔除: 新公司仍是客户(或其更名后的公司)的内部调岗人员;子公司/收购导致的变动(实体只是更名或被并入,并没有人真正离职);任期早已结束的顾问/投资人/LP;最近换工作与客户无关的过期校友——在发送「恭喜」之前,确认客户是其最近的雇主。
  • excludes() 可提前排除大多数顾问/投资人职位;每个条件只能有一个值,但可组合多个条件(AND)。逐行检查可以发现其余情况。
  • 新公司信息从 current[].name 读取(筛选时使用 company_name;响应中的键是 name)。
  • 保留人脉连接数下限;绝不要投影关注者数。

步骤 2 — 持续监控(让追踪持续运行)。 监控器使用普通 REST,而非 Code Mode。Person Discovery Watcher 会将你刚刚验证过的筛选条件原样转换为持续推送的数据流,每周通过你选择的 webhook 仅发送新的匹配结果。首次运行 = 免费基准数据(最多 5 个匹配结果),之后每位新匹配人员消耗 0.5 个积分。

流程:先运行步骤 1 的搜索,并与用户确认列表看起来正确 → 使用相同的筛选条件构建 curl 命令 → 展示命令 → 只有在用户明确同意后才创建。

curl -X POST https://api.crustdata.com/watch/person/search \
  -H "authorization: Bearer YOUR_API_KEY" \
  -H "x-api-version: 2025-11-01" \
  -H "content-type: application/json" \
  -d '{
    "filters": {
      "op": "and",
      "conditions": [
        { "field": "experience.employment_details.past.company_website_domain", "type": "in", "value": ["customer1.com", "customer2.com"] },
        { "field": "recently_changed_jobs", "type": "=", "value": true }
      ]
    },
    "config": { "trigger": { "type": "interval", "every_hours": 168 } },
    "notifications": [{ "type": "webhook", "url": "https://your-endpoint.example.com/champions" }]
  }'

步骤 3 — 输出行: 人员 — 曾任 [客户] 的 [职位] — 现任 [新公司] 的 [职位] — 于 [日期] 入职。交由你的外联工具发送「恭喜,你认识我们」的问候。


信号类别(在需求了解过程中提供,可组合使用)

增长(员工人数增长百分比、职位结构增长、收入区间)— 融资(近期程度、阶段、规模、投资人)— 招聘(你能解决其痛点的职位、招聘信息激增、招聘信息中提及的技术,通过 content.description [.])— 内容与意向(通过 social_post_search_live 查找发布某关键词的人员/公司、竞争对手提及)— 人员与流动(冠军换岗、新高管、离开竞争对手的员工、客户校友、同校校友)— 公司动态(新闻、产品发布、通过 web_search_live 查找新办公室)— 技术与表现(技术信息、软件评论数量/评分)— 关系热度(共同联系人、共同投资人、共同加速器)— 排除项(裁员、现有客户、竞争对手)— 自定义 AND 规则。

通用规则

  • 先询问目标;用一行确认范围;然后执行方案,并说明各步骤。
  • 迭代,绝不直接给出第一轮结果。 说明每轮筛选删去了哪些内容,以及原因。
  • 优先使用免费数据。 联系方式补充信息为可选项,运行前必须确认费用。person_contact_enrich 是获取联系信息的默认工具:无基础费用;每人工作邮箱约 +1 个积分、个人邮箱约 +2 个积分、电话号码约 +2 个积分,每人最多 5 个积分;每次调用最多处理 25 个 URL(使用 chunk + parallelMap)。缩小 fields 范围以控制费用,并读取 credits_remaining 获取实际余额。务必先报出费用上限:“20 人的邮箱最多约需 100 个积分,可以吗?”
  • 公司信息补充(每个返回匹配结果 2 个积分;如果请求并返回了技术栈信息,则每个匹配结果额外 +2 个积分,也就是每个匹配结果 2–4 个积分)只能通过 crustdata_company_ids + exact_match: true 进行,并且必须先免费完成识别。
  • 始终过滤无效结果: 连接数少于 100、占位符式简介、顾问/投资人/董事会成员、地理位置或职位不匹配。
  • 监控项和任何外部写入操作都必须获得明确同意。
  • 始终询问交付方式: 电子表格——导出 CSV(供你的序列工具或 CRM 导入)——交由 account-research 技能深入研究重点客户——或仅提供表格。
  • 你起草的任何文本(开场白、行动方案、推荐话术):不得使用 em dash、不得使用 “delve”/“leverage”/“streamline”,不得填充套话。写得像一位了解该客户的同事。
  • 根据内容调整布局,绝不让布局掩盖内容。 品牌系统固定,布局不固定。如果真实内容放不下——公司或人名很长、标题有 12 个词、共有 200 行——就调整布局,而不是改动内容:增大卡片、换行而非截断、改为单列、加宽列、提高上限,或为宽内容单独设置滚动容器。绝不要通过裁切卡片、用省略号截断姓名或悄悄丢弃行来解决空间问题。如果确实无法避免设置上限,必须在 UI 中说明(“显示前 50 条,共 214 条”),让读者知道还有哪些内容未显示。查看渲染结果,并在交付前修复所有被截断的内容。
  • 渲染结果中的图标: 使用 Lucide(仪表板的图标集),以内联 SVG 形式呈现,并使用 currentColor 描边。产物 UI 中不得使用表情符号。🔥/🟡/⚪ 评分等级仅用于聊天;在渲染产物中应改用彩色标签或 Lucide 图标。
  • Logo 和照片均可免费使用,请在渲染结果中使用。 也要使用人物照片:basic_profile.profile_picture_permalink 已包含在 person_search 返回的 basic_profile 组中,因此渲染的人物列表应显示真实头像,而非姓名首字母。basic_info.logo_permalink 由你已调用的 company_identify 返回,用于解析每一行;也包含在 company_search 的 basic_info 组中。将其以内联 Base64 的 data:image/jpeg;base64,... URI 形式嵌入:媒体 CDN 会将这些图片作为 binary/octet-stream 提供,因此远程 <img src> 会显示空白。如果公司没有 Logo,则回退到姓名首字母图标。
  • 产物品牌标识: 默认交付聊天原生内容(表格、CSV),绝不要为了渲染而渲染产物。但如果用户希望将交付物制作为渲染页面或文档(HTML 列表、TAM 报告、文档),则必须在页眉或页脚加入 Crustdata 品牌标识组合:小号大写的 “Powered by” 引导文字,以及链接到 crustdata.com 的官方 Crustdata 字标。此技能的 assets/ 目录中提供成套字标图片:crustdata-logo-light.png(深色文字,适用于浅色背景)和 crustdata-logo-dark.png(白色文字,适用于深色背景);这与 app.crustdata.com 页眉使用的文件相同。根据主题以内联 Base64 方式嵌入对应版本,高度约为 17px(支持深色模式的页面需同时嵌入两个版本,并随主题切换),不得使用远程链接;渲染产物无法获取远程图片。品牌强调色:#5547E2(产品主色);深色背景上使用 #8387FF。正文使用 Geist 字体(如果可嵌入),否则使用系统字体栈。
  • 每个执行响应都会包含 credits + credits_remaining;account_credits(免费)可按需报告余额。

成本速查表

调用成本
company_identify、自动补全、get_schema免费
company_search / person_search / job_search~0.03 cr/条结果
计数查询(limit: 1,读取 total_count)~0.03-0.04 cr
job_search 聚合查询(limit: 0)仅计数,~免费
web_search_live1 cr/次查询
web_enrich_live1 cr/页
social_post_search_live1 cr/条帖子;使用 exact_keyword_match 时为 3 cr/条帖子;请谨慎设置 limit
person_contact_enrich无基础费用;每人最多 5 cr
company_enrich每条返回的匹配结果 2 cr;若请求并返回了技术画像,则额外加 2 cr(每条匹配结果共 2-4 cr)
Person Discovery Watcher首次运行免费建立基线,此后每新增一人收费 0.5 cr

工具依赖项

此技能需要:

  • Crustdata MCP 服务(install.crustdata.com/mcp):一个 Code Mode MCP,提供 list_tools、get_schema 和 execute。所有 Crustdata 数据工具都通过 execute({ code }) 中的纯 JavaScript 脚本调用:await callTool(name, params)。此处使用的工具:company_search、person_search、company_identify、company_autocomplete、person_autocomplete、job_search、web_search_live、web_enrich_live、social_post_search_live、person_contact_enrich(可选启用)、company_enrich(可选启用)、account_credits
  • Crustdata REST API(api.crustdata.com)仅用于 champion-tracker watcher——此技能会打印一条可直接运行的 curl 命令;用户提供 API 密钥并明确同意后运行

评论

支持 Markdown