Bulk Import Contacts
Bulk-import contacts from a JSON array, raw CSV, a public CSV URL, or a storage path, with each record requiring a LinkedIn URL. Choose a merge_strategy of merge (tags union and attributes deep-merge), replace (overwrite), or skip (no-op duplicates), and read per-record skip reasons in skipped[]. Set preview=true to project the import without persisting, then commit it with the returned confirm_token.
Example prompt: Preview importing this CSV of contacts with the merge strategy before committing
{
"would_import": 240,
"would_merge": 58,
"would_skip": 2,
"confirm_token": "imp_7c1a"
}What you can build
Parameters
Inputs accepted by import_contacts.
| Name | Type | Description |
|---|---|---|
| contacts | object[] | Array of contact objects. Each must have a LinkedIn URL. Other fields (first_name, email, company, title, etc.) are auto-mapped from common naming conventions. Max 1000/call. |
| csv_content | string | Raw CSV or TSV text. Server parses headers and rows automatically. No row limit. |
| csv_url | string | HTTPS URL of a CSV/TSV file (public HTTPS only). Server fetches it server-side, no size limit, no context overhead. Works with Supabase Storage signed URLs, Google Sheets export URLs, etc. |
| storage_path | string | Path inside the 'imports' Supabase Storage bucket. Must be under your own user folder (e.g. '<your-user-id>/contacts.csv'); cross-tenant paths are rejected. Upload the file under that prefix first, then call this tool with the path. |
| source | string | Where these contacts came from (e.g. 'lemlist', 'heyreach', 'expandi', 'csv'). Stored for tracking. |
| list_id | string | Optional list ID, imported contacts are automatically added to this list. Returns list_size (total in list after import). |
| merge_strategy | "merge" | "replace" | "skip" | How to handle duplicate linkedin_url: 'merge' (default; tags UNION, attrs deep-merge), 'replace' (overwrite + null unspecified user-facing fields: first_name,last_name,email,company,title,phone,industry,location,country,status,source,source_detail,tags,custom_attrs,external_ids), 'skip' (no-op dupes). |
| preview | boolean | If true, project the import without persisting. Returns {would_import, would_merge, would_replace, would_skip, confirm_token}, Plan 04 wires this. |
| confirm_token | string | Token from a prior preview=true call to commit the projected import. |
Related tools
List And Export Contacts
Query and export LinkedIn contacts with rich filters by connection status, campaign, tags, or custom attributes. Returns JSON or CSV for bulk export.
Add Or Update Lead
Add or update a LinkedIn lead by profile URL. Creates the contact if new, updates status, notes, tags, and custom attributes if it already exists.
Manage Outreach Lists
Create, delete, and list outreach lists for contacts, companies, or do-not-contact rosters. Organize your LinkedIn outreach by segment via MCP.
Create Contact Tag
Create a named tag like vip or warm-lead with an optional hex color to organize LinkedIn contacts. User-scoped and idempotent by name.
The complete LinkedIn API. Ready when you are.
Connect your first LinkedIn profile in under 5 minutes. Every tool, every seat, no feature gates. Safe limits, warm-up, and full permission control built in.