HubSpotへのコンタクト(顧客情報)をあらゆるソースから取り込みます。CSVファイル、貼り付けたリスト、Gmailなどのつながったアプリからのデータに対応しており、項目の対応付け、重複検出、一括取り込み、企業との紐付けを自動で処理します。 **次のような場合に使用:** - 「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ツールをご確認ください。
以下の優先順位で進めてください:
平文で質問を作成します(ウィジェット不使用)。利用可能なコネクタに応じて質問を構成してください:
連携済みサービスが検出された場合、見出しの下にリストアップし、手動オプションを提示します:
連絡先はどこから取得しますか?
連携済みサービスから:
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プロパティ |
|---|---|
| 名前、フルネーム | firstnameとlastnameに分割 |
| 名 / 名前 | firstname |
| 姓 / 苗字 | lastname |
| メール、メールアドレス | email |
| 電話、携帯、携帯電話 | phone |
| 企業、組織 | company |
| 職務、職務経歴書、職種 | jobtitle |
| ウェブサイト、URL | website |
hs_linkedin_url |
get_propertiesをobjectType: contactsで実行して、対象プロパティが存在することを確認します。非標準または独自のカラム名についてはsearch_propertiesを使用してください。
ステップ1でのユーザーのドメインと一致するメールドメインを持つ連絡先をすべて削除します。メールアドレスがない連絡先はドメイン判定ができないので残しておき、警告をウィジェットに表示します。削除した件数をメモして、ウィジェットのヘッダーに表示します。
有効なメールアドレスを持つ連絡先を50件ずつのグループに分割し、search_crm_objectsを呼び出します:
各連絡先を新規(HubSpotにない)または既存(HubSpotに既にある)に分類します。
ウィジェット表示前に、以下を確認します:
show_widgetを使用してインタラクティブなウィジェットを表示します。テキスト要約を先に表示せず、ウィジェットを確認ステップとして機能させてください。
ウィジェットには以下を含める必要があります:
「N件の連絡先をインポート」をクリック時:
sendPrompt('IMPORT_CONFIRMED:' + JSON.stringify(selectedEmails))
「キャンセル」時:
sendPrompt('IMPORT_CANCELLED')
重複ステータスに関わらず、すべての連絡先をウィジェットに含めます。メールアドレスがない、または無効なメールアドレスの連絡先:デフォルトでチェックを外した状態で「メールなし」ラベルで表示します。既存連絡先:チェック済み状態で含め、ステータスバッジを表示します。
レスポンス処理:
IMPORT_CONFIRMED:[...] — JSON配列を解析してステップ3に進むIMPORT_CANCELLED — 確認して停止確認された選択を受け取るまでステップ3に進みません。
確認された各連絡先について:
firstname、その後をlastnameにします。単一の名前→firstnameのみでlastnameは空白。firstname/lastnameカラムが別途存在する場合は、分割の代わりに直接使用しますhubspot_owner_idに割り当てます50件ずつのバッチに分割します。各バッチについてmanage_crm_objectsを呼び出します:
createRequest、objectType: contactsupdateRequest、objectType: contacts、ステップ2で取得したhs_object_idを使用単一の更新進行行を表示します:
55件のコンタクトをインポート中… (バッチ3 / 6 完了)
レコードごとのエラーをキャプチャしてステップ4のサマリー用に保存します。
会社名を持つ連絡先について:
search_crm_objectsで会社を検索、filter: name = [会社名]manage_crm_objectsで関連付けタイプ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ノート、createRequest: hs_note_body: 「[日付] — [件名/トピック]([ソース]経由)」、hs_timestamp: スレッド日付、関連付け: コンタクト5aのスレッドまたはレコード(CSV/貼り付けの場合はソースデータ自体)を確認して、購入シグナルを探します:価格に関する議論、デモリクエスト、提案言及、評価タイムライン、決定言語。
明確なシグナルを持つ連絡先について:
manage_crm_objects取引(createRequest)で作成します:dealname: 「[連絡先名] — [会社]」、dealstage: appointmentscheduled、関連付け: 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 による自動翻訳です。