关于 sales-prospecting
sales-prospecting 是一项销售研究技能,可将需求分派到七种 Prospecting 工作流,并使用 Crustdata 工具发现和排序公司、联系人及信号。它面向构建客户名单和识别销售机会的团队。
主要功能
- 01将需求分派到七种 Prospecting 工作流
- 02查找公司及相似客户
- 03根据公司数据排列客户名单
- 04识别活动潜客和采购联系人
- 05发现扩张机会与关键联系人变动
适用场景
- 01根据 ICP 建立新公司名单
- 02排列区域或 CRM 导出中的客户优先级
- 03查找与活动相关的潜客
- 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 技能来正确构建配置。配置缺失绝不能阻止执行。
- 消耗额度前,用一句话确认用户的需求。
目标菜单(先展示此菜单)
- 寻找新公司——“我有一个 ICP,帮我建立一份全新的名单”
- 寻找相似公司——“寻找与我的最佳客户相似的公司”
- 为我的客户账户排序——“这是我的客户账户(客户组合/区域/CSV)——我应该先联系谁?”
- 活动线索挖掘——“我应该去 结识哪些人?”
- 扩展机会雷达——“我可以在现有客户中拓展哪些业务?”
- TAM 构建器——“我的市场有多大?请提供真实数据。”
- 拥护者追踪器——“当拥护者离开我的客户公司时提醒我”(实时监控)
每次搜索的执行方式(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. 相似公司
- 对种子客户使用
company_identify— 免费;每次调用只能使用一种标识符类型(domains或names,均为数组)。识别为模糊匹配:一个域名可能匹配多家公司 — 为每个标识符选取confidence_score最高的匹配项。 - 使用一次
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,
}));
- 将这些共同特征作为筛选条件 → 从步骤 2 开始运行配方 1。使用
nin_("crustdata_company_id", excludeIds)排除种子客户和现有客户。
3. 排名我的客户账户(客户名册、区域或粘贴的 CSV — 一项子技能)
输入:任意来源的客户账户名称/域名/CSV。
- 使用
company_identify解析所有行(免费;通过chunk(domains, 25)+parallelMap分批;每次调用只能使用一种标识符类型)。如实标记无法解析的行 — 绝不静默丢弃。模糊匹配可能返回多个结果;每行选取confidence_score最高的匹配项。 - 使用一次
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"],
})),
};
- 可选:针对热门客户账户深入查询,使用
job_search并设置aggregations+limit: 0,获取开放职位数量(低成本的招聘信号 — 代码片段见扩张雷达)。 - 评分:按 TIMING 加权。融资 <3 个月 = 🔥;3-9 个月 = 🟡;>12 个月 = ⚪;员工人数增长或招聘激增可提升一个等级。输出:排名表 + 每行的“原因” + 本周前 5 名。
4. 活动线索挖掘
- 务必从真实来源获取参会名单 — 绝不编造参会者。 使用
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 };
- 使用
company_identify解析名单(免费,使用chunk(25)+parallelMap)→ 使用一次范围限定的company_search筛选符合 ICP 的公司 → 按配方 1 步骤 3 查找人员。优先选择已发布活动相关内容的人员:使用活动名称调用social_post_search_live— 每篇帖子消耗 1 个额度(使用exact_keyword_match时为 3 个),因此请谨慎设置limit(10-20)。 - 交付内容:按 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_live | 1 cr/次查询 |
web_enrich_live | 1 cr/页 |
social_post_search_live | 1 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 密钥并明确同意后运行