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詳細
アカウントリサーチ
1つの仕事、企業を徹底的に把握することです。公開情報として正しい内容(Crustdata とウェブ)だけでなく、チームがすでに知っている情報(CRM、通話、チームチャット、メール)も把握します。リサーチの多くは後半を見落としますが、実際に取引が決まるのはそこです。
コードモードの基本ルール(一度読めば、どこでも適用できます)
Crustdata の呼び出しはすべて、Crustdata MCP サーバーの execute ツール(install.crustdata.com/mcp)内で、プレーン JavaScript スクリプトとして実行します。このスキルに含まれるすべてのスニペットは、以下のルールに従います。
- プレーン JavaScript のみを使用します。
get_schemaで取得できる型付きツールサーフェスに基づいて記述しますが、スクリプト本体には型注釈を一切含めません。: Type、as、ジェネリクスがあると構文解析エラーとなり、ツール呼び出し前に実行全体が失敗します。 - すべてのスクリプトは、ソースを示すコメントで始めます:
// user query: ...または// model query: ...。このコメントがないスクリプトは、実行前に拒否されます(クレジット消費はありません)。 - I/O プリミティブは1つだけです:
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経由で再開できます。
コスト早見表: identify / autocomplete / schema は無料です。検索は約 0.03 cr/件、件数クエリ(limit: 1、total_count を読み取る)は約 0.03 cr です。company_enrich は返された一致1件につき 2 cr です。ソーシャル投稿は1件につき 1 cr です。ウェブ検索は1クエリにつき 1 cr、ウェブ取得は1ページにつき 1 cr です。account_credits(無料)で残高を確認できます。すべての execute レスポンスには、使用クレジット数と残りのクレジット数が含まれます。多額のクレジットを消費する前に、ユーザーの確認を取ってください。
ステップ 0 — コンテキストの確認(リサーチ前に必ず実施)
- 設定の基本情報(単独でも実行可能)。 作業ディレクトリに
config/gtm-config.mdまたはconfig/persona-profile.mdがあれば読み込みます(何を販売しているか → 何が関連するか)。なければ、「何を販売していますか?購入者は誰ですか?」など、手短な質問を1~2個その場で尋ねるか、適切に設定するために icp-builder スキルを案内してください。設定がなくても実行を妨げることはありません。 - コンテキストがどこにあるか尋ねます(セッションごとに一度だけ尋ね、その後は記憶します)。「接続しているのはどれですか? CRM、通話録音ツール、チームチャット、メールですか?」実際に接続されているものだけを使用し、利用できないものがあれば適切に対応してください。外部情報だけを使ったリサーチも可能です。不足しているものは明示してください。
- 目標(以下のメニュー)と企業名を尋ねます。
目標メニュー
- アカウントの詳細調査とプラン — 対象企業1社についてのあらゆる情報と、どう攻略するか
- 組織図 — 誰が率いていて、誰が誰に報告しているか(このフォルダーの
orgchart-playbook.mdを参照してください。実戦で検証済みの一連の手順を掲載しています) - 技術スタックと切り口 — 現在の利用技術と、こちらの参入の糸口
- 競合対策資料 — 競合にどう勝つか
モード 1 — アカウントの詳細調査とプラン
A. 外部調査(Crustdata とウェブ)
特定 → 情報拡充(最も安価で確実な手順)。 company_identify は無料ですが、あいまいな結果になることがあります。ドメインまたは社名が複数の企業に一致する場合があります。最も高い confidence_score の候補を選び、exact_match: true を指定して ID で情報を拡充すれば、1件分だけに課金されます(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 を指定した集計で、わずかなコストで採用状況の全体像を把握できます。2回目の呼び出しでは、最新の求人情報を取得します。
// 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 cr。クエリは1~3件に抑えてください)で、資金調達、製品発表、幹部の異動、人員削減を調べます。90日より古い情報は除外するか、背景情報として明記してください。
相手が話題にしていること — social_post_list_live は投稿1件あたり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,
}));
経営幹部のスナップショット — 販売先となる部門の上級職層を確認します。役職レベルは固定の選択肢です。まず person_autocomplete を experience.employment_details.current.seniority_level に対して実行し、正確なラベルを確認してください(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 のエクスポートとアウトリーチツールへの引き継ぎを提案してください。
Mode 2 — 組織図
このスキルフォルダーにある orgchart-playbook.md に厳密に従ってください。これは実戦で検証済みです(規模に応じた分岐、実際の報告ラインを確認するための The Org、タイトルの目視確認、情報の選別、base64 写真、スタンドアロン HTML、スクリーンショットまたはプレビューによるセルフレビュー)。別の形式の組織図を独自に作らないでください。
Mode 3 — 技術スタックと切り口
- 求人情報が実態を示します。 求人情報に記載されたツールは、その会社が実際に使っているものです。
job_searchでcontent.descriptionを検索してください。これは非常に重要です。ブランド名、製品名、技術名には、必ず[.]の完全一致トークン演算子を使用してください(exactToken(...)で構築できます)。(.)演算子は誤字を許容し、似た単語にも一致するため、「dbt」や「Ramp」に対して(.)を使うと無関係な結果が大量に返されます。(.)は、説明的な複数単語の検索(「data quality」、「revenue operations」)にのみ使用してください。
// 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;
- 全体像を補完します。カテゴリや競合他社の文脈を把握するため、
fields: ["basic_info", "competitors", "software_reviews", "taxonomy"]を指定してcompany_enrichを実行します。また、技術スタックに関する記述を調べるため、同社のエンジニアリングブログ、ドキュメント、インテグレーションのページを対象にweb_enrich_liveを実行します。 - 各項目を自社製品との関係で分類します。既存の競合製品(置き換えを狙う — 切り替えコストを明示)、補完製品(連携する/並行して導入する)、未開拓領域(新規開拓)。
- 出力:各項目に確度タグを付けたスタックマップを作成します。
job-post-confirmed(公開中の求人情報に記載。出典を示す)またはinferred(カテゴリ、競合他社、ブログからのシグナル)。さらに THE WEDGE として、営業担当者が実際に口にできる切り口を、具体的に1つ提示します。
Mode 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/レコーダー/チームチャット/メールは読み取り専用です。調査で書き込みを行ってはいけません。
- すべての成果物に適用する、雑な仕事をしないルール:emダッシュ、「掘り下げる」/「活用する」/「合理化する」という表現、内容のないセクションは使わないでください。実質的な内容がなければ、セクションを削除してください。必要な調査を済ませた同僚のように書いてください。
- コンテンツに合わせてレイアウトを調整し、何も隠さないでください。 ブランドシステムは固定ですが、レイアウトは固定ではありません。実際のコンテンツが収まらない場合、たとえば会社名や人名が長い、タイトルが12語ある、行数が200行あるときは、コンテンツではなくレイアウトを変更してください。カードを大きくする、切り詰めずに折り返す、1列にする、列幅を広げる、上限を引き上げる、横長の要素専用にスクロール領域を設けるなどの方法があります。カードを切り抜く、名前を省略記号で短縮する、行をひそかに削除するといった方法で、収まりの問題を解決してはいけません。本当に上限が避けられない場合は、読者が表示されていない内容を把握できるよう、UI に「214件中、上位50件を表示」のように明記してください。提出前にレンダリング結果を確認し、切れている部分を修正してください。
- レンダリング結果では、ロゴと写真を自由に使えます。
basic_info.logo_permalink(会社)は、無料のcompany_identifyとcompany_enrichのbasic_infoから取得できます。basic_profile.profile_picture_permalink(人物)は、person_searchが返すbasic_profileグループにすでに含まれています。どちらも追加クレジットはかかりません。メディア CDN はbinary/octet-streamとして配信するため、リモートの<img src>は空白で表示されます。両方をdata:image/jpeg;base64,...URI として Base64 インライン化してください。画像がない場合は、イニシャル表示に切り替えてください。 - レンダリング結果のアイコン:ダッシュボードのアイコンセットである Lucide を、
currentColorのストロークを使ったインライン SVG として使用してください。アーティファクトの UI で絵文字を使ってはいけません。 - アーティファクトのブランディング:成果物はデフォルトでチャットまたはプレーンファイルとして提供してください。アーティファクトを作ること自体を目的にレンダリングしてはいけません。ただし、ページまたはドキュメントとしてレンダリングする成果物(org chart HTML、アカウントプランのドキュメント、バトルカードのページなど)には、ヘッダーまたはフッターに Crustdata のブランドロックアップを含めてください。小さな大文字の「Powered by」という説明と、crustdata.com へのリンク付きの公式 Crustdata ワードマークを配置します。ワードマークの2種類の画像は、このスキルの
assets/に含まれています。crustdata-logo-light.png(明るい背景用の濃い文字)とcrustdata-logo-dark.png(暗い背景用の白い文字)で、どちらも app.crustdata.com のヘッダーと同じファイルです。テーマに適した方を高さ約17pxで Base64 インライン化してください。ホットリンクしてはいけません。レンダリングされたアーティファクトはリモート画像を取得できません。ブランドアクセントカラーは#5547E2(プロダクトのプライマリカラー。暗い背景では#8387FF)です。埋め込み可能な場合は本文フォントに Geist を使い、それ以外はシステムフォントスタックを使ってください。org chart での正確な配置はorgchart-playbook.mdに仕様があります。 - クローズドセット(業種、資金調達ラウンド、役職のレベル)では、オートコンプリートを優先してください。カテゴリ値を推測してはいけません。
- コストは現実のものです。投稿の取得、大規模な人物データの取得、または一括エンリッチメントを行う前に、予想されるクレジット消費量を伝えてください。
- 引き継ぎ:このアカウントに似た企業は sales-prospecting に引き継いでください。ICP がまだ定義されていない場合は icp-builder に引き継いでください。初回の連絡では、シーケンサー向けに CSV をエクスポートし、アウトリーチツールに引き継いでください。
ツールの依存関係
このスキルには次のものが必要です。
- Crustdata MCP サーバー (install.crustdata.com/mcp):
list_tools、get_schema、executeを公開する単一の Code Mode MCP です。Crustdata のすべてのデータツールには、await callTool(name, params)を介して、execute({ code })のプレーンな JavaScript スクリプト内からアクセスします。ここで使用するツール: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に記載されている代替手段を使用します