关于 account-research
面向销售团队的账户调研技能,将公开公司信息与已连接的 CRM、通话、聊天和邮件背景结合。支持账户计划、组织架构、技术调研和竞争对手作战卡等任务。
主要功能
- 01公司与网页外部调研
- 02只读汇总内部账户背景
- 03账户计划与组织架构流程
- 04技术栈与切入点分析
- 05竞争对手作战卡准备
适用场景
- 01为目标账户制定有来源依据的计划
- 02外联前回顾过往交易与沟通
- 03查找职位描述中提及的工具
- 04编写面向竞争对手的销售作战卡
MCP 相关
在 `execute` 脚本中运行 Crustdata MCP 服务工具,开展公司、人员、职位、社交内容和网页调研。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ crustdata/ skills --skill account-research安装后在 Claude Code 中输入/account-research确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
orgchart-playbook.mdREADME.mdevals/evals.json详细介绍
账户研究
一项任务:全面了解一家公司——公开信息(Crustdata + 网络)以及你的团队已经掌握的信息(CRM、通话、团队聊天、电子邮件)。大多数研究都会跳过后半部分;而交易真正成败的关键就在这里。
Code Mode 基本规则(读一次,处处适用)
所有 Crustdata 调用都通过 Crustdata MCP 服务的 execute 工具运行(install.crustdata.com/mcp),并使用纯 JavaScript 脚本。本技能中的每个代码片段都遵循以下规则:
- 仅使用纯 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进行分支处理——调用失败不会中止脚本;未检查的失败会静默地继续使用空数据,看起来像是“没有结果”。 - 仅返回最精简的数据投影。 只有脚本
return的内容会传给模型。在脚本中整理结果(project、pick、普通.map),绝不要返回完整个人资料。 - 使用
await parallelMap(items, fn)并行执行互不依赖的调用;先用chunk分批。绝不要并行处理游标分页或有依赖关系的阶段(搜索 → 丰富化必须按顺序执行;在同一阶段内并行处理)。 fields是响应白名单。 结果只包含你列出的分组;后续读取未列出的分组时会得到undefined,看起来像是缺少数据。列出你读取的每个分组。- 受套餐限制的字段投影会使整个调用因 403 失败,并指出字段名称(例如,
person_search中的professional_network.followers)。移除指出的字段并重新运行。需要筛选活动程度下限时,使用professional_network.connections;绝不要投影关注者数量。 - 分类值只能使用封闭集合中的值。 看似合理但实际错误的值会静默返回零行。按行业、融资轮次类型或资历级别进行筛选之前,先用
company_autocomplete/person_autocomplete(免费)确认取值。 - 零结果 ≠ 没有匹配项。 格式正确的查询也可能表达了定义不当的需求。拆解查询、测试每个条件的筛选效果,并在信任较低或为零的结果数量之前,查看
execute响应中的trajectory(每次调用的筛选条件 + 数量)。 - 长时间运行时,在耗费较大的阶段之后调用
checkpoint(acc);超时运行会将其作为partial返回,以便通过inputs恢复。
费用速查: 识别 / 自动补全 / 架构查询 = 免费。搜索约 0.03 cr/条结果;计数查询(limit: 1,读取 total_count)约 0.03 cr。company_enrich 每条返回的匹配结果消耗 2 cr。社交帖子每条 1 cr。网络搜索每次查询 1 cr。网页抓取每页 1 cr。account_credits(免费)可报告余额;每条 execute 响应都会附带已用和剩余额度。大额消耗前请先征得用户同意。
步骤 0 — 上下文收集(始终在研究前执行)
- 配置基础信息(可独立运行)。 如果工作目录中存在
config/gtm-config.md或config/persona-profile.md,请读取它们(我们卖什么 → 哪些内容相关)。如果不存在,请快速提出 1–2 个内联问题(“你们卖什么?目标买家是谁?”),或者指引用户使用 icp-builder 技能来妥善设置。缺少配置不会阻止运行。 - 询问上下文存放在哪里(每个会话询问一次,然后记住):“以下哪些已连接——CRM、通话录音工具、团队聊天、电子邮件?”仅使用实际已连接的内容;灵活降级——仅研究外部信息仍然可行,只需说明缺少哪些内容。
- 询问目标(见下方菜单)+ 公司名称。
目标菜单
- 账户深度分析与计划 — 全面了解一个目标账户,以及如何攻下它
- 组织架构图 — 谁负责什么,谁向谁汇报(参见此文件夹中的
orgchart-playbook.md— 完整且经过实战验证的流程) - 技术栈与切入点 — 他们目前使用什么,以及我们的切入机会
- 竞争战术卡 — 如何击败竞争对手
模式 1 — 账户深度分析与计划
A. 外部调研(Crustdata + 网络)
识别 → 丰富信息(成本最低的准确路径)。 company_identify 免费,但匹配较模糊 — 一个域名或名称可能匹配多家公司。选择 confidence_score 最高的匹配项,然后按 ID 丰富信息并设置 exact_match: true,这样只需为一条匹配支付费用(2 个积分):
// model query: identify and enrich acme.com for an account deep-dive
const idr = await callTool("company_identify", { domains: ["acme.com"] });
if (!idr.ok) return { error: idr.message };
const matches = idr.data[0]?.matches ?? [];
const best = matches.reduce((a, b) => ((b.confidence_score ?? 0) > (a?.confidence_score ?? -1) ? b : a), null);
if (!best) return { error: "no company match for acme.com" };
const companyId = best.company_data?.basic_info?.crustdata_company_id ?? best.company_data?.crustdata_company_id;
const er = await callTool("company_enrich", {
crustdata_company_ids: [companyId],
exact_match: true,
fields: ["basic_info", "headcount", "funding", "news"], // whitelist: list EVERY group you read
});
if (!er.ok) return { error: er.message };
const cd = er.data[0]?.matches?.[0]?.company_data ?? {};
const news = firstArray(cd.news) ?? [];
return {
name: cd.basic_info?.name,
description: cd.basic_info?.description,
headcount: cd.headcount?.total,
growth_12m_percent: cd.headcount?.growth_percent?.["12m"],
last_round: cd.funding?.last_round_type,
last_round_date: cd.funding?.last_fundraise_date,
total_raised_usd: cd.funding?.total_investment_usd,
news: news.slice(0, 10).map(n => ({
title: n.article_title, url: n.article_url, date: n.article_publish_date,
})),
};
查看:规模、融资、过去 12 个月的增长,以及 news 组(文章包含 article_title / article_url / article_publish_date — 这些将成为计划中带来源的引用)。
职位空缺 = 痛点 + 投资方向。 使用 limit: 0 的聚合查询,花很少的费用即可了解招聘情况;再发起第二次调用,读取最新的职位信息:
// model query: hiring shape + newest roles at acme.com
const base = [{ field: "company.basic_info.primary_domain", type: "=", value: "acme.com" }];
const [agg, fresh] = await parallelMap([
{
filters: { op: "and", conditions: base },
aggregations: [{ type: "group_by", field: "job_details.category", agg: "count", size: 10 }],
limit: 0,
},
{
filters: { op: "and", conditions: base },
sorts: [{ field: "metadata.date_added", order: "desc" }],
limit: 15,
},
], async (params) => await callTool("job_search", params));
if (!agg.ok) return { error: agg.message };
return {
total_open_roles: agg.data.total_count,
by_category: agg.data.aggregations,
newest: fresh.ok
? fresh.data.job_listings.map(j => ({ title: j.job_details?.title, added: j.metadata?.date_added }))
: [],
};
一家招聘 20 名数据工程师的公司存在数据问题;一家首次招聘安全负责人公司的下一步可能就是购买安全工具。说明招聘情况意味着什么。
将 job_details.category 视为大致分类,而非证据。 在一个包含 10,524 条职位信息的账户上进行实时验证:共有 30 个不同类别,其中最大的类别是兜底项 Others(29%),标签存在重叠(Engineering、Engineering and Information Technology、Information Technology),并且同时存在 Others 和 Other。用它简要说明“他们在哪些领域招聘”没有问题。对于计划中的任何具体论断 — “19 个工程职位中有 9 个提到了数据管道” — 应改为统计职位名称:对 job_details.title 使用 group_by,或针对每个职位类别,使用 [.] 在 job_details.title / content.description 上发起少量 limit: 0 计数查询。
过去 90 天的新闻 — 使用 web_search_live(每次查询 1 个积分,控制在 1–3 次查询):融资、发布、管理层变动、裁员。丢弃超过 90 天的内容,或将其标注为背景信息。
他们在谈论什么 — social_post_list_live 每条帖子需要 1 个积分,因此请谨慎设置 limit:
// model query: what acme.com is posting about right now
const r = await callTool("social_post_list_live", { company_domain: "acme.com", limit: 10 });
if (!r.ok) return { error: r.message };
return r.data.posts.map(p => ({
date: p.date_posted,
type: p.post_type,
text: (p.text ?? "").slice(0, 280),
reactions: p.engagement?.total_reactions,
}));
领导层概况 — 你所销售职能的高级管理层。职级是固定集合:先对 experience.employment_details.current.seniority_level 使用 person_autocomplete,解析出准确标签(预期值包括 CXO、Vice President、Director、Owner / Partner),然后:
// model query: leadership snapshot at company 12345 in the function we sell to
const seniorities = ["CXO", "Vice President", "Director"]; // verified via person_autocomplete
const r = await callTool("person_search", {
filters: { op: "and", conditions: [
eq("experience.employment_details.current.company_id", 12345),
in_("experience.employment_details.current.seniority_level", seniorities),
]},
fields: ["basic_profile", "experience", "social_handles"],
limit: 25,
});
if (!r.ok) return { error: r.message };
return r.data.profiles.map(p => ({
name: p.basic_profile?.name,
title: p.basic_profile?.current_title,
linkedin: profileUrl(p),
}));
B. 内部调研(差异化优势 — 使用所有已连接的资源)
- CRM:与他们相关的过往 / 进行中交易、我们认识的联系人、备注、过往交易失败的原因
- 通话录音工具:搜索与该账户相关的过往通话 — 他们的原话、异议、承诺
- 团队聊天:搜索账户名称 — 内部讨论、熟人引荐、谁认识他们
- 电子邮件:搜索包含其域名的过往邮件往来 — 现有关系
总结“我们与他们的过往往来”:我们认识谁、谈过什么、进展在哪个环节停滞。始终只读 — 调研绝不向已连接的系统写入内容。如果没有任何系统已连接,请跳过 B,并说明该计划仅基于外部信息。
C. 综合制定账户计划(这是交付成果)
- 一句话概述:他们做什么、发展方向是什么、为何是现在
- 我们为何能胜出:有证据支撑的痛点(引用职位信息、文章或帖子),并与我们的销售内容对应
- 联系对象:内部支持者 / 经济决策者假设(或运行组织架构模式)
- 我们的过往往来:关系 + 过往背景(来自 B)
- 切入方案:第一步行动、可用的熟人引荐路径、开场切入角度
- 风险:现有供应商、时机、以往失败的交易
- 未来 90 天的后续步骤,并注明日期
撰写时务必清晰简洁(参见规则中的“不注水”要求)。可选择交付方式:在聊天中发送、整理成文档、继续绘制组织架构图、使用 sales-prospecting 查找相似对象,或导出 CSV 供序列工具使用并交接给外联工具。
模式 2 — 组织架构图
严格遵循此技能文件夹中的 orgchart-playbook.md — 这套方法经过实战验证(按规模分支、使用 The Org 查找真实汇报关系、人工核实职位名称、精心筛选、使用 base64 照片、独立 HTML、通过截图或预览进行自检)。不要另行设计不同的图表。
模式 3 — 技术栈与切入点
- 招聘信息才是事实依据。 职位描述中列出的工具,就是公司实际使用的工具。使用
job_search搜索content.description— 这点至关重要:搜索品牌、产品或技术名称时,始终使用[.]精确词元运算符(exactToken(...)会构造该运算符)。(.)运算符可容忍拼写错误,也会匹配相似词,因此用(.)搜索“dbt”或“Ramp”会搜出一堆垃圾结果。仅在匹配描述性多词词组(“数据质量”“营收运营”)时使用(.)。
// model query: which of these tools show up in acme.com job posts
const tools = ["Snowflake", "dbt", "Looker", "Datadog", "Terraform"];
const hits = await parallelMap(tools, async (t) => {
const r = await callTool("job_search", {
filters: { op: "and", conditions: [
{ field: "company.basic_info.primary_domain", type: "=", value: "acme.com" },
exactToken("content.description", t), // [.] literal token, never (.) for brand names
]},
limit: 1,
});
return { tool: t, job_posts: r.ok ? r.data.total_count : null, error: r.ok ? undefined : r.message };
});
return hits;
- 补全信息全貌:使用
company_enrich,设置fields: ["basic_info", "competitors", "software_reviews", "taxonomy"],了解类别和竞争对手背景;对其工程博客、文档和集成页面使用web_enrich_live,查找技术栈相关信息。 - 根据你销售的产品对每项进行分类:现有竞争产品(替换切入点 — 指明迁移成本)、互补产品(集成或协同部署)、空白领域(从零开拓)。
- 输出:提供技术栈图,并为每项标注置信度 —
job-post-confirmed(在当前有效的招聘信息中明确提及,并附上引用)或inferred(根据类别、竞争对手或博客信号推断)— 另加核心切入点:指出一个具体的突破口,并将其写成销售代表能实际说出口的开场白。
模式 4 — 竞争对手作战卡
- 分析竞争对手:
company_identify→company_enrich(fields: ["basic_info", "headcount", "funding", "news"])— 规模、增长、融资状况、新闻job_search按类别汇总 — 了解其投入方向(招聘即路线图)web_search_live— 最近 90 天内的发布、新定价、管理层变动、裁员social_post_list_live(明确设置limit,约 10 条)— 了解其当前宣传内容,以其原话为准
- 作战卡:
- 其理想客户画像(ICP)与优势 — 如实评价;假装对方实力弱会害销售代表栽跟头
- 相较于我们的差异化优势,其存在的不足
- 揭示弱点的探查问题 — 潜在客户可向竞争对手提问,以暴露其不足
- 最常见的 3 项异议及应对方式
- 应避免的陷阱(无法正面击败的对方主张)
- 最近 90 天规则:所有关于宣传内容或发展势头的主张,都必须来自最近 90 天内发布的帖子、文章或招聘信息;否则应标注可能已过时。
- 如果用于正在进行的交易:注明哪些差异化优势与该潜在客户明确提出的痛点相关(来自内部排查或用户提供的信息)。
规则
- 内部上下文占一半工作量:始终询问当前连接了什么,并全面检查。不要因为“只是研究”就跳过。
- 事实必须附带来源(Crustdata 结果/URL/调用记录/CRM 备注)。推断必须标注为推断。
- 对 CRM/录音工具/团队聊天/电子邮件只读:研究过程中绝不写入。
- 每份交付内容都必须杜绝水分:不使用破折号,不用“深入探讨”“利用”“简化”等词,不添加填充性章节;如果没有实质内容,就删掉该章节。像做足功课的同事那样写。
- 根据内容调整布局,绝不能让布局掩盖内容。 品牌系统固定,布局不固定。如果真实内容放不下,例如公司名或人名很长、标题有 12 个词、数据有 200 行,就调整布局,而不是改动内容:增大卡片、自动换行而不是截断、改为单列、加宽列、提高上限,或为宽内容设置独立滚动容器。绝不要通过裁切卡片、用省略号截断名称或悄悄删掉行来解决适配问题。如果确实无法避免设置上限,就在界面中说明(“显示前 50 条,共 214 条”),让读者知道还有哪些内容未显示。交付前检查渲染结果,并修复所有被截断的内容。
- 渲染输出中的 Logo 和照片均可免费使用,请使用它们。
basic_info.logo_permalink(公司)来自免费的company_identify,也来自company_enrich的basic_info;basic_profile.profile_picture_permalink(个人)已包含在person_search返回的basic_profile组中。两者都不需要额外积分。将它们内联为data:image/jpeg;base64,...URI,因为媒体 CDN 会以binary/octet-stream提供文件,远程<img src>会显示空白。缺少图片时使用姓名首字母图标作为后备。 - 渲染输出中的图标:使用 Lucide,也就是仪表板的图标集,并以内联 SVG 和
currentColor描边呈现。交付物界面中不要使用表情符号。 - 交付物品牌标识:交付内容默认使用聊天或纯文件形式,绝不为了渲染而渲染。但如果交付内容以页面或文档形式呈现(如组织架构图 HTML、客户计划文档、竞争对战卡页面),则需在页眉或页脚加入 Crustdata 品牌标识:小号全大写的“Powered by”眉题,以及链接到 crustdata.com 的官方 Crustdata 字标。该字标组合文件位于此技能的
assets/中:crustdata-logo-light.png(深色文字,适用于浅色背景)和crustdata-logo-dark.png(白色文字,适用于深色背景),与 app.crustdata.com 页眉使用的文件相同。将适合主题的版本以内联 Base64 形式嵌入,高度约为 17px,绝不使用远程链接;渲染后的交付物无法获取远程图片。品牌强调色:#5547E2(产品主色);深色背景上使用#8387FF。如果可以嵌入,则正文使用 Geist 字体,否则使用系统字体栈。组织架构图的具体放置规范见orgchart-playbook.md。 - 封闭选项集(行业、融资轮次、资历)优先使用自动补全。绝不要猜测分类值。
- 成本是真实存在的:执行帖子抓取、大规模人员抓取或多路扩展式信息补全前,说明预计消耗的积分。
- 交接:与此账户相似的潜在客户 → sales-prospecting;尚未定义 ICP → icp-builder;首次触达 → 导出 CSV 供序列工具使用,并交接给你的外联工具。
工具依赖项
此技能需要:
- Crustdata MCP server(install.crustdata.com/mcp):一个 Code Mode MCP,提供
list_tools、get_schema和execute。所有 Crustdata 数据工具都通过execute({ code })中的纯 JavaScript 脚本调用,使用await callTool(name, params)。此处使用的工具:company_identify、company_enrich、company_autocomplete、person_search、person_autocomplete、job_search、social_post_list_live、web_search_live、web_enrich_live、account_credits - 可选连接器:用户可能使用的任何 CRM、通话录音工具、团队聊天工具或电子邮件工具——在内部检索过程中均以只读方式使用;没有这些连接器时,技能会平稳退化为仅使用外部数据
- Python 和 无头 Chrome(均为可选,仅用于 Claude Code),用于组织架构图 HTML 生成器和自我审核截图;没有这些工具的环境会使用
orgchart-playbook.md中的备用方案