HubSpotへのコンタクト(顧客情報)インポート機能です。CSVファイル、貼り付けたリスト、Gmailなどのつながったアプリのデータなど、あらゆるソースからコンタクトをHubSpotに取り込めます。フィールドマッピング(データ項目の対応付け)、重複検出、一括インポート、企業との関連付けに対応しています。 **次のような場合に使用:** - ユーザーがコンタクトをHubSpotに取り込みたいとき - 「コンタクトをインポートしたい」 - 「CSVをアップロードしたい」 - 「このメンバーをHubSpotに追加したい」 - 「リストをインポートしたい」 - 「〇〇からコンタクトを持ってきたい」 - 「コンタクトのスプレッドシートがある」 - 「メールからコンタクトを追加したい」 - 「コンタクトを移行させたい」 - 「〇〇アプリからコンタクトを同期したい」 - 「ネットワークを取り込みたい」 ソースの種類を問わず、ユーザーが複数の人員データをCRM(顧客管理システム)に一括追加したいときは、このスキルを使用してください。
Imports contacts into HubSpot from any source — a CSV file, a pasted list, or data from connected apps like Gmail. Handles field mapping, duplicate detection, batch import, and company association. ALWAYS use this skill when the user wants to bring contacts into HubSpot — "import contacts", "upload a CSV", "add these people to HubSpot", "import my list", "bring in contacts from [source]", "I have a spreadsheet of contacts", "add contacts from my email", "migrate contacts", "sync contacts from [app]", "load my network". Trigger whenever the user wants to bulk-add people to the CRM, regardless of source.
以下のツール名は、HubSpot MCPコネクタ(接続ツール)の標準的な名称です。ツールが利用できない場合は、スキルのアップデートを確認するか、HubSpotのツールセット内で他の選択肢がないか確認してください。利用可能なツールは変更される可能性があります。
以下の優先順位で進めてください。
ユーザーがファイルを添付した、「CSVから」「Salesforceから」などと明言した場合、そのソースを確定してフェーズ2に進みます。
軽量なツール呼び出しを試行して、どのコネクタが利用可能かを確認し、提供できるソースの一覧を作成します。
ソースが明確でなければユーザーに尋ねます。
**質問は通常のテキストで — ウィジェットは不要です。**利用可能なコネクタに応じて構成してください。
連携済みのサービスが検出された場合:
コンタクトはどこから取得しますか?
連携済みのサービスから:
1. 【メールプロバイダー名】 — 最近のメールスレッドからコンタクトを抽出
2. 【他社CRM、例:Salesforce】 — 既存レコードからコンタクトを取得
または手動で追加:
3. ファイルをアップロード — パスを指定またはCSV/スプレッドシートを添付
4. リストを貼り付け — 名前、メールアドレス、会社名
コネクタが検出されない場合:
コンタクトはどこから取得しますか?
1. ファイルをアップロード — パスを指定またはCSV/スプレッドシートを添付
2. リストを貼り付け — 名前、メールアドレス、会社名
連携済みメールプロバイダーの場合: 検索・スレッド機能を使い最近のコンタクトを見つけます。最近のスレッドから固有の送信者・受信者を抽出し、コンタクトごとに「最終接触日」として最新スレッドのタイムスタンプを記録します。
連携済みCRMの場合: CRMのエクスポート機能や検索機能でコンタクトレコードを取得します。ソースCRMのフィールドをHubSpotの属性にマッピング(対応づけ)します。
get_organization_details と get_user_details を早期に実行してポータル情報を取得します。portalId、userId(hubspot_owner_id に使用)、ユーザーのメールドメイン(フェーズ2で内部同僚をフィルタリングするため)を保存します。
検出されたカラムヘッダー(または推測された位置)をHubSpotのコンタクト属性にマッピングします。
| 検出されたカラム | HubSpot属性 |
|---|---|
| name, full name | firstname と lastname に分割 |
| first / first name | firstname |
| last / last name / surname | lastname |
| email, email address | email |
| phone, mobile, cell | phone |
| company, organization | company |
| title, job title, role | jobtitle |
| website, url | website |
hs_linkedin_url |
get_properties を実行(objectType: contacts)して対象属性が存在することを確認します。非標準またはカスタムカラム名については search_properties を使用してください。
フェーズ1で記録したユーザーのメールドメインと一致するメールアドレスを持つコンタクトはすべて除外します。メールアドレスがないコンタクトはドメインでフィルタリングできません — そのまま残し、警告をウィジェットに表示します。除外されたコンタクト数をメモし、ウィジェットのヘッダーに反映させます。
有効なメールアドレスを持つコンタクトを50個ずつのグループに分け、search_crm_objects を呼び出します。
各コンタクトを以下のいずれかに分類します。
ウィジェット表示前に以下の項目をフラグ付けします。
show_widget を使用してインタラクティブなウィジェットを表示します。テキストの概要を先に表示しないこと — ウィジェットそのものが確認ステップです。
ウィジェットには以下を含める必要があります。
ヘッダー:ソースラベル(例:「CSVから検出」)、ソースメタデータを含む副見出し、スキップされたコンタクト(内部ドメイン、無効なメール)がある場合はその旨を記載
スクロール可能なテーブル(カラム:チェックボックス、名前、メールアドレス、会社、最終接触(メール/CRMソースのみ;CSV/貼り付けの場合は非表示)、ステータスバッジ「既にHubSpotに登録済み」など)
すべて選択チェックボックス(ヘッダー行に配置)— すべての選択を切り替え、部分選択時は中間状態を表示
フッター:「キャンセル」テキストボタンと「N件のコンタクトをインポート」プライマリボタン(Nはチェックボックストグルに応じてリアルタイム更新;選択が0の場合は無効化)
「N件のコンタクトをインポート」クリック時:
sendPrompt('IMPORT_CONFIRMED:' + JSON.stringify(selectedEmails))
「キャンセル」時:
sendPrompt('IMPORT_CANCELLED')
重複ステータスにかかわらずすべてのコンタクトをウィジェットに含めます。メールアドレスがないまたは不正なメールアドレスのコンタクト:含めますが、デフォルトでチェック外、薄い「メールなし」ラベル付け。既存のコンタクト:含める、チェック済みがデフォルト、ステータスバッジ付き。
レスポンスの処理:
IMPORT_CONFIRMED:[...] — JSON配列をパースしてフェーズ3に進むIMPORT_CANCELLED — 確認して停止確認された選択を受け取るまでフェーズ3に進まないでください。
確認されたコンタクトごとに:
firstname、以降 = lastname。単語1つの名前 → firstname のみ、lastname は空白。firstname/lastname カラムが別々に存在する場合は、分割せず直接使用hubspot_owner_id に現在のユーザーIDを割り当て(フェーズ1から取得)50個ずつのバッチに分割します。各バッチについて manage_crm_objects を呼び出します。
createRequest、objectType: contactsupdateRequest、objectType: contacts、フェーズ2の hs_object_id を使用進行状況を1行で表示します。
55件のコンタクトをインポート中…(バッチ 3/6 完了)
レコード単位のエラーをキャプチャしてフェーズ4のサマリー用に保存します。
会社名があるコンタクトについて:
search_crm_objects で companies を検索、filter: name = [会社名]manage_crm_objects で association type contact_to_company を使い関連付けmanage_crm_objects createRequest(objectType: companies)で作成してから関連付けAPIコール数を削減するため、会社検索はできるだけバッチ処理してください。
インポート完了。
✓ 【N】件のコンタクトを作成
✓ 【N】件のコンタクトを更新
— 【N】件のコンタクトをスキップ(メールなし) — 【最大3件の名前、+N件以上】
✗ 【N】件のエラー(以下を参照)
エラー:
行【N】:「【値】」 — 【理由】
会社:
· 【N】件の新規会社を作成
· 【N】件のコンタクトを既存会社と関連付け
コンタクトを表示: https://【uiDomain】/contacts/【portalId】/contacts/list/view/all/
スキップまたはエラーのあるコンタクトは最大5件まで個別に記載し、それ以降は「【最初の5件の名前】+N件以上」とします。行にエラーがある場合は、ユーザーが修正して再インポートできるようリストをエクスポートするオプションを提供します。
フェーズ4の後に実行します。インポートソースに関連するステップのみ適用してください。
コンタクトが連携済みメールプロバイダーまたはCRMから取得された場合:
manage_crm_objects notes、createRequest:hs_note_body: 「【日付】 — 【件名/トピック】via【ソース】」、hs_timestamp: スレッド日時、association: contact5aのスレッドまたはレコード(CSV/貼り付けの場合はソースデータ自体)を確認し、購買シグナル(価格討議、デモリクエスト、提案言及、評価タイムライン、意思決定言語など)を探します。
明確なシグナルがあるコンタクトについて:
manage_crm_objects deals(createRequest)で作成:dealname: 「【コンタクト名】 — 【会社】」、dealstage: appointmentscheduled、associations: contact → contactIdシグナルのないコンタクトはスキップ — 根拠のないディール作成は避けます。
成功したインポート後、ユーザーに以下を提示します:
「【N】件の新規コンタクトを最新状態に保つには、メールをHubSpotに接続してください。そうすれば、以後のメールは手動操作なく自動的にアクティビティとして記録されます。 セットアップの準備ができたら『メールをHubSpotに接続』と言ってください。」
メールコネクタが既にHubSpotにログを記録している場合はこのプロンプトをスキップします(フェーズ5aがアクティビティデータを返したかどうかで推測)。
Tool names below are expected names for the HubSpot MCP connector. If a named tool isn't available, check for updates to the skill and/or alternates in the HubSpot toolset as available tools may change
Use this priority order:
Ask as plain text — no widget. Build the question based on what connectors are available:
If connected services are detected, list them under a heading, then offer the manual options:
Where are your contacts coming from?
From a connected service:
1. [Email provider] — extract contacts from recent threads
2. [Other CRM, e.g. Salesforce] — pull contacts from existing records
Or add them manually:
3. Upload a file — share a path or attach a CSV/spreadsheet
4. Paste a list — names, emails, and companies
If no connectors are detected:
Where are your contacts coming from?
1. Upload a file — share a path or attach a CSV/spreadsheet
2. Paste a list — names, emails, and companies
For connected email provider: Use the connector's search/thread tools to find recent contacts. Extract unique senders and recipients from recent threads. Record the timestamp of the most recent thread per contact as the "last contact" date.
For connected CRM: Use the CRM's export or search tools to pull contact records. Map the source CRM's fields to HubSpot properties.
Fetch portal context early using get_organization_details and get_user_details. Store portalId, userId (for hubspot_owner_id), and the user's email domain (for filtering internal colleagues in Phase 2).
Map detected column headers (or inferred positions) to HubSpot contact properties:
| Detected column | HubSpot property |
|---|---|
| name, full name | Split into firstname + lastname |
| first / first name | firstname |
| last / last name / surname | lastname |
| email, email address | email |
| phone, mobile, cell | phone |
| company, organization | company |
| title, job title, role | jobtitle |
| website, url | website |
hs_linkedin_url |
Use get_properties with objectType: contacts to confirm target properties exist. Use search_properties for non-standard or custom column names.
Remove any contact whose email domain matches the user's own domain from Phase 1. Contacts with no email cannot be filtered on domain — leave them in; a warning will surface in the widget. Note how many were removed — surface this in the widget header.
For contacts with a valid email, batch into groups of 50 and call search_crm_objects:
Classify each contact as New (not in HubSpot) or Existing (already in HubSpot).
Before showing the widget, flag:
Render an interactive widget using show_widget. Do not show a text summary first — the widget is the confirmation step.
The widget must include:
On "Import N contacts" click:
sendPrompt('IMPORT_CONFIRMED:' + JSON.stringify(selectedEmails))
On "Cancel":
sendPrompt('IMPORT_CANCELLED')
Include all contacts in the widget regardless of duplicate status. Contacts with no email or invalid email: include but unchecked by default with a muted "No email" label. Existing contacts: include, checked by default, with the status badge.
Handling responses:
IMPORT_CONFIRMED:[...] — parse the JSON array and proceed to Phase 3IMPORT_CANCELLED — acknowledge and stopDo not proceed to Phase 3 until a confirmed selection is received.
For each confirmed contact:
firstname, everything after = lastname. Single-word names → firstname only, lastname blank. If firstname/lastname columns exist separately, use them directly instead of splitting.hubspot_owner_id to the current user's ID from Phase 1Split into batches of 50. For each batch, call manage_crm_objects:
createRequest, objectType: contactsupdateRequest, objectType: contacts, using hs_object_id from Phase 2Show a single updating progress line:
Importing 55 contacts… (batch 3 of 6 complete)
Capture any per-record errors and store for the Phase 4 summary.
For contacts with a company name:
search_crm_objects companies, filter: name = [company name]manage_crm_objects with association type contact_to_companymanage_crm_objects createRequest, objectType: companies, then associateBatch company lookups where possible to reduce API calls.
Import complete.
✓ [N] contacts created
✓ [N] contacts updated
— [N] contacts skipped (no email) — [names up to 3, +N more]
✗ [N] errors (see below)
Errors:
Row [N]: "[value]" — [reason]
Companies:
· [N] new companies created
· [N] contacts associated with existing companies
View contacts: https://[uiDomain]/contacts/[portalId]/contacts/list/view/all/
Name individual skipped/errored contacts up to 5; after that "[first 5 names] + N more." If any rows errored, offer to export a list so the user can fix and re-import.
Run after Phase 4. Only apply the steps relevant to the import source.
If contacts were sourced from a connected email provider or CRM:
manage_crm_objects notes, createRequest: hs_note_body: "[Date] — [Subject/topic] via [source]", hs_timestamp: thread date, association: contactReview the threads or records from 5a (or the source data itself if CSV/paste) for buying signals: pricing discussions, demo requests, proposal mentions, evaluation timelines, or decision language.
For contacts with a clear signal:
manage_crm_objects deals, createRequest: dealname: "[Contact Name] — [company]", dealstage: appointmentscheduled, associations: contact → contactId.Skip contacts with no signals — don't create speculative deals.
After a successful import, prompt:
"To keep [N] new contacts up to date automatically, connect your email to HubSpot. That way future emails are logged as activity without any manual steps. Say 'connect my email to HubSpot' when you're ready to set it up."
Skip this prompt if an email connector is already logging to HubSpot (infer from whether 5a returned activity data).
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。