• 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/スキル
SKILLKnowledge Workproductivity

import-contacts

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

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.

ユースケース
  • 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属性
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
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。単語1つの名前 → firstname のみ、lastname は空白。firstname/lastname カラムが別々に存在する場合は、分割せず直接使用
  3. hubspot_owner_id に現在のユーザーIDを割り当て(フェーズ1から取得)
  4. 会社名がある場合はメモ

バッチインポート

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

  • 新規コンタクト:createRequest、objectType: contacts
  • 更新:updateRequest、objectType: contacts、フェーズ2の hs_object_id を使用

進行状況を1行で表示します。

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

レコード単位のエラーをキャプチャしてフェーズ4のサマリー用に保存します。

会社との関連付け

会社名があるコンタクトについて:

  1. search_crm_objects で companies を検索、filter: name = [会社名]
  2. 見つかった場合、manage_crm_objects で association type 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 notes、createRequest:hs_note_body: 「【日付】 — 【件名/トピック】via【ソース】」、hs_timestamp: スレッド日時、association: contact
  3. スレッドが見つからないコンタクトはスキップ — ノートは不要
  4. 書き込むノートの総数を100件にキャップ(上限超過時は最新スレッドを優先)

5b — 営業シグナルを検出

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

明確なシグナルがあるコンタクトについて:

  • ディール作成を提案:「【名前】が【シグナル】に言及していることに気づきました。この方のためにディール(営業案件)を作成しますか?」
  • ユーザーが確認した場合、manage_crm_objects deals(createRequest)で作成:dealname: 「【コンタクト名】 — 【会社】」、dealstage: appointmentscheduled、associations: contact → contactId
  • シグナルコンタクトが複数ある場合は、簡潔なテーブル(名前、シグナル、会社)を表示してどれを変換するか確認

シグナルのないコンタクトはスキップ — 根拠のないディール作成は避けます。

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

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

「【N】件の新規コンタクトを最新状態に保つには、メールをHubSpotに接続してください。そうすれば、以後のメールは手動操作なく自動的にアクティビティとして記録されます。 セットアップの準備ができたら『メールをHubSpotに接続』と言ってください。」

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


エッジケース

原文(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 による自動翻訳です。