• Projects
  • Service
  • About
  • branding.bz
  • Podcast
  • Tips
  • FAQ
  • Recruit
  • Download
  • Contact
  • branding.bz(ブランド構築SaaS)
  • DESIGN NOW(デザインメディア)
  • X
  • LinkedIn
  • Spotify
  • Facebook

213-0011 神奈川県川崎市高津区久本3-6-7-303

© 2026 ID INC. All rights reserved

claude-skills/スキル
SKILLOfficialproductivity

import-contacts

プラグイン
HubSpot Sales
ソース
GitHub で見る ↗
説明

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.

ユースケース
  • CSVファイルをHubSpotにアップロードするとき
  • 複数のコンタクトをまとめて取り込むとき
  • 外部アプリからコンタクトを同期するとき
  • コンタクト情報を移行するとき
  • 重複するコンタクト情報を自動処理するとき
本文(日本語訳)

連絡先のインポート

以下のツール名はHubSpot MCP コネクタの標準的な名前です。ツールが見当たらない場合は、スキルの更新や利用可能な別のHubSpotツールをご確認ください。


ステップ1 — データソースを確認する

以下の優先順位で進めてください:

  1. 文脈から判断 — ファイルが添付されている、「CSVから」「Salesforceから」といった指示がある場合は、そのソースでステップ2に進みます。
  2. 連携済みサービスを確認 — 静かにコネクタの利用可否をテストし(各ツールについて軽い試行呼び出しを試みます)、提示できるソースの動的なリストを作成します。
  3. 不明な場合は質問 してください。

平文で質問を作成します(ウィジェット不使用)。利用可能なコネクタに応じて質問を構成してください:

連携済みサービスが検出された場合、見出しの下にリストアップし、手動オプションを提示します:

連絡先はどこから取得しますか?

連携済みサービスから:
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で内部同僚をフィルタリングするため)を保存します。


ステップ2 — 解析、重複排除、確認

フィールドマッピング

検出されたカラムヘッダ(または推測される位置)をHubSpotのコンタクトプロパティにマッピングします:

検出されたカラム HubSpotプロパティ
名前、フルネーム firstnameとlastnameに分割
名 / 名前 firstname
姓 / 苗字 lastname
メール、メールアドレス email
電話、携帯、携帯電話 phone
企業、組織 company
職務、職務経歴書、職種 jobtitle
ウェブサイト、URL website
LinkedIn hs_linkedin_url

get_propertiesをobjectType: contactsで実行して、対象プロパティが存在することを確認します。非標準または独自のカラム名についてはsearch_propertiesを使用してください。

内部連絡先を除外

ステップ1でのユーザーのドメインと一致するメールドメインを持つ連絡先をすべて削除します。メールアドレスがない連絡先はドメイン判定ができないので残しておき、警告をウィジェットに表示します。削除した件数をメモして、ウィジェットのヘッダーに表示します。

重複チェック

有効なメールアドレスを持つ連絡先を50件ずつのグループに分割し、search_crm_objectsを呼び出します:

  • objectType: contacts
  • filter: email IN [...バッチ内のメール...]
  • properties: email, firstname, lastname, hs_object_id

各連絡先を新規(HubSpotにない)または既存(HubSpotに既にある)に分類します。

データ品質フラグ

ウィジェット表示前に、以下を確認します:

  • メールアドレスのない行
  • 形式が不正なメールアドレス
  • ソースファイル内の重複メールアドレス
  • マッピング対象外のカラム

連絡先選択ウィジェット

show_widgetを使用してインタラクティブなウィジェットを表示します。テキスト要約を先に表示せず、ウィジェットを確認ステップとして機能させてください。

ウィジェットには以下を含める必要があります:

  1. ヘッダー:ソースラベル(例:「CSVで見つかった」)、ソースのメタデータを含むサブタイトル、連絡先がスキップされた場合の注記(内部ドメイン、無効なメール)
  2. スクロール可能なテーブル チェックボックス、名前、メール、企業、最後の接触日(メール/CRMソースの場合;CSV/貼り付けの場合は省略)、ステータスバッジ(既存連絡先は「HubSpotに既に登録」)を含むカラム
  3. ヘッダー行の全選択チェックボックス — すべてを切り替え、部分選択時は不確定状態を表示
  4. フッター:「キャンセル」テキストボタンと、一次的な「N件の連絡先をインポート」ボタン(N値はチェックボックスの切り替えにより動的に更新;0件選択時は無効)

「N件の連絡先をインポート」をクリック時:

sendPrompt('IMPORT_CONFIRMED:' + JSON.stringify(selectedEmails))

「キャンセル」時:

sendPrompt('IMPORT_CANCELLED')

重複ステータスに関わらず、すべての連絡先をウィジェットに含めます。メールアドレスがない、または無効なメールアドレスの連絡先:デフォルトでチェックを外した状態で「メールなし」ラベルで表示します。既存連絡先:チェック済み状態で含め、ステータスバッジを表示します。

レスポンス処理:

  • IMPORT_CONFIRMED:[...] — JSON配列を解析してステップ3に進む
  • IMPORT_CANCELLED — 確認して停止
  • 自由形式のメッセージ(例:「Acmeからのものをスキップ」) — 意図を解釈して選択を調整し、ウィジェットを再表示

確認された選択を受け取るまでステップ3に進みません。


ステップ3 — インポート

レコードの準備

確認された各連絡先について:

  1. 確認されたフィールドマッピングからHubSpotプロパティオブジェクトを構築します
  2. フルネームを分割:最初のスペースまでをfirstname、その後をlastnameにします。単一の名前→firstnameのみでlastnameは空白。firstname/lastnameカラムが別途存在する場合は、分割の代わりに直接使用します
  3. ステップ1から取得した現在のユーザーIDをhubspot_owner_idに割り当てます
  4. 会社名をメモして関連付けに備えます

バッチインポート

50件ずつのバッチに分割します。各バッチについてmanage_crm_objectsを呼び出します:

  • 新規連絡先:createRequest、objectType: contacts
  • 更新:updateRequest、objectType: contacts、ステップ2で取得したhs_object_idを使用

単一の更新進行行を表示します:

55件のコンタクトをインポート中… (バッチ3 / 6 完了)

レコードごとのエラーをキャプチャしてステップ4のサマリー用に保存します。

会社の関連付け

会社名を持つ連絡先について:

  1. search_crm_objectsで会社を検索、filter: name = [会社名]
  2. 見つかった場合、manage_crm_objectsで関連付けタイプcontact_to_companyを使用して関連付けます
  3. 見つからない場合、manage_crm_objects createRequest(objectType: companies)で作成して関連付けます

APIコール削減のため、会社の検索をバッチ化します。


ステップ4 — サマリー

インポート完了。

  ✓ [N] 件のコンタクトを作成
  ✓ [N] 件のコンタクトを更新
  — [N] 件をスキップ(メールなし) — [最大3つの名前、その他 +N 件]
  ✗ [N] 件のエラー(下記参照)

エラー:
  行 [N]:「[値]」 — [理由]

会社:
  · [N] 件の新しい会社を作成
  · [N] 件のコンタクトを既存の会社に関連付け

コンタクトを表示:https://[uiDomain]/contacts/[portalId]/contacts/list/view/all/

スキップまたはエラーになった個別連絡先を最大5件リストアップします。その後は「[最初の5つの名前] + N件詳細」とします。エラー行がある場合、ユーザーが修正して再インポートできるようにリスト エクスポートを提示します。


ステップ5 — インポート後:履歴ログと取引シグナルの検出

ステップ4後に実行します。インポートソースに関連するステップのみを適用してください。

5a — 既存コミュニケーション履歴をログ記録(メール/CRMソースのみ)

連携済みメールプロバイダまたはCRMから連絡先を取得した場合:

  1. 新しくインポートされた各連絡先について、ソースコネクタでその メールアドレスを含む最近のスレッドや対話を検索します(過去90日間、連絡先あたり最大5件)。
  2. 見つかった各スレッドについて、HubSpotにノートを作成します:
    • manage_crm_objectsノート、createRequest: hs_note_body: 「[日付] — [件名/トピック]([ソース]経由)」、hs_timestamp: スレッド日付、関連付け: コンタクト
  3. スレッドが見つからなかった連絡先はスキップしてください。ノートは不要です。
  4. 記録するノートの総数を100件に制限します(制限を超える場合は最新のスレッドを優先)。

5b — 取引シグナルを検出

5aのスレッドまたはレコード(CSV/貼り付けの場合はソースデータ自体)を確認して、購入シグナルを探します:価格に関する議論、デモリクエスト、提案言及、評価タイムライン、決定言語。

明確なシグナルを持つ連絡先について:

  • 取引作成を提案します:「[名前]さんが[シグナル]について言及しているようです。取引を作成しますか?」
  • ユーザーが確認した場合、manage_crm_objects取引(createRequest)で作成します:dealname: 「[連絡先名] — [会社]」、dealstage: appointmentscheduled、関連付け: contact → contactId。
  • 複数のシグナル連絡先がある場合、簡潔なテーブル(名前、シグナル、企業)を表示し、どれを変換するか尋ねます。

シグナルのない連絡先はスキップしてください。投機的な取引は作成しません。

5c — 継続的なアクティビティログを推奨

インポート成功後、ユーザーに以下を促します:

「[N] 件の新しいコンタクトを最新の状態に保つため、メールをHubSpotに連携してください。そうすれば、今後のメールは手動対応なく自動的にアクティビティとして記録されます。 設定の準備ができたら『メールをHubSpotに連携する』と言ってください。」

メールコネクタが既にHubSpotへのログを行っている場合(5aがアクティビティデータを返したかどうかで推測)はこのプロンプトをスキップします。


エッジケース

  • メールカラムなし:強く警告してください。HubSpotはメールで重複排除を行います。警告付きで続行するか、ユーザーに先にメールを追加するよう促すかを提示します。
  • 大規模ファイル(500行超):インポートに時
原文(English)を表示

Import Contacts

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


Phase 1 — Identify the data source

Use this priority order:

  1. Infer from context — if the user attached a file, said "from my CSV", "from Salesforce", or similar, proceed directly to Phase 2 with that source.
  2. Check connected services — silently test which connectors are available (attempt a lightweight tool call for each). Build a dynamic list of sources to offer.
  3. Ask if the source isn't clear.

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).


Phase 2 — Parse, deduplicate, and confirm

Field mapping

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
linkedin hs_linkedin_url

Use get_properties with objectType: contacts to confirm target properties exist. Use search_properties for non-standard or custom column names.

Filter internal contacts

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.

Duplicate check

For contacts with a valid email, batch into groups of 50 and call search_crm_objects:

  • objectType: contacts
  • filter: email IN [...batch of emails...]
  • properties: email, firstname, lastname, hs_object_id

Classify each contact as New (not in HubSpot) or Existing (already in HubSpot).

Data quality flags

Before showing the widget, flag:

  • Rows with no email address
  • Malformed email addresses
  • Duplicate emails within the source file itself
  • Unmapped columns

Contact selection widget

Render an interactive widget using show_widget. Do not show a text summary first — the widget is the confirmation step.

The widget must include:

  1. Header: source label (e.g. "Found in your CSV"), subtitle with source metadata, and a note if contacts were skipped (internal domain, invalid emails)
  2. Scrollable table with columns: checkbox, NAME, EMAIL, COMPANY, LAST CONTACT (for email/CRM source; omit for CSV/paste), STATUS badge ("Already in HubSpot" for existing contacts)
  3. Select-all checkbox in the header row — toggles all, shows indeterminate state if partial
  4. Footer: "Cancel" text button and a primary "Import N contacts" button (N updates live as checkboxes are toggled; disabled if 0 selected)

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 3
  • IMPORT_CANCELLED — acknowledge and stop
  • Free-text message (e.g. "skip the ones from Acme") — interpret, adjust selection, re-render widget

Do not proceed to Phase 3 until a confirmed selection is received.


Phase 3 — Import

Prepare records

For each confirmed contact:

  1. Build HubSpot properties object from the confirmed field mapping
  2. Split full names: everything before the first space = firstname, everything after = lastname. Single-word names → firstname only, lastname blank. If firstname/lastname columns exist separately, use them directly instead of splitting.
  3. Assign hubspot_owner_id to the current user's ID from Phase 1
  4. Note any company name for association

Batch import

Split into batches of 50. For each batch, call manage_crm_objects:

  • New contacts: createRequest, objectType: contacts
  • Updates: updateRequest, objectType: contacts, using hs_object_id from Phase 2

Show 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.

Company association

For contacts with a company name:

  1. search_crm_objects companies, filter: name = [company name]
  2. If found, associate via manage_crm_objects with association type contact_to_company
  3. If not found, create via manage_crm_objects createRequest, objectType: companies, then associate

Batch company lookups where possible to reduce API calls.


Phase 4 — Summary

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.


Phase 5 — Post-import: log history and surface deal signals

Run after Phase 4. Only apply the steps relevant to the import source.

5a — Log existing communication history (email/CRM sources only)

If contacts were sourced from a connected email provider or CRM:

  1. For each newly imported contact, search the source connector for recent threads or interactions involving their email address (last 90 days, up to 5 per contact).
  2. For each thread found, create a note in HubSpot:
    • manage_crm_objects notes, createRequest: hs_note_body: "[Date] — [Subject/topic] via [source]", hs_timestamp: thread date, association: contact
  3. Skip contacts where no threads are found — no note needed.
  4. Cap total notes written to 100 (prioritise most recent threads first if over the limit).

5b — Detect deal signals

Review 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:

  • Suggest creating a deal: "I noticed [Name] mentioned [signal]. Want me to create a deal for them?"
  • If the user confirms, create via manage_crm_objects deals, createRequest: dealname: "[Contact Name] — [company]", dealstage: appointmentscheduled, associations: contact → contactId.
  • If there are multiple signal contacts, show a brief table (Name, Signal, Company) and ask which to convert.

Skip contacts with no signals — don't create speculative deals.

5c — Recommend ongoing activity logging

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).


Edge cases

  • No email column: warn strongly — HubSpot deduplicates by email. Offer to continue with a caveat or ask the user to add emails first.
  • Large files (>500 rows): warn that import may take a moment. Continue without extra confirmation.
  • All contacts are duplicates: confirm with the user before exiting — they may have intended to update records.
  • Source returns no contacts: let the user know and suggest they try a different source or add contacts manually.
  • Company association fails: log the failure in the summary but do not block the contact import.

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。