# MCP Data Enrichment

> Orchestrates data preparation and enrichment for contacts in Leadspicker projects through the Leadspicker MCP server. Runs built-in enrichment columns (email finding, email validation, LinkedIn data, company website summaries, department headcounts) and AI-powered magic columns in the right sequence via MCP tools. Use this skill whenever the user wants to enrich, prepare, or augment contact data in Leadspicker — for example "obohat kontakty o emaily", "enrichni projekt o LinkedIn data", "prepare data for outreach", "add company info to my leads", "find emails for my contacts", "run full enrichment pipeline", or any request to add data columns to a Leadspicker project. Triggers on Leadspicker enrichment, data preparation, contact augmentation, or running multiple enrichment steps in sequence — even when the user just says "prepare my data" or "enrich my leads" in the context of Leadspicker.

- Skill: `tomasblatak/mcp-data-enrichment` (Agent Skill)
- Install (CLI): `npx skillmds@latest add tomasblatak/mcp-data-enrichment`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomasblatak/mcp-data-enrichment/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: tomasblatak (https://skillmd.com/u/tomasblatak)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/tomasblatak/mcp-data-enrichment

---


# Leadspicker Data Enrichment (MCP)

Prepares and enriches contact data in Leadspicker projects through the Leadspicker MCP server.
Each enrichment creates a magic column that Leadspicker populates asynchronously for every
contact in the project.

This skill works in two modes:

1. **Selective mode** — user names specific columns (e.g., "enrich LinkedIn company description
   and website summary"). Run only those, plus any prerequisites they depend on.
2. **Pipeline mode** — user describes a goal (e.g., "prepare data for outreach"). Pick a
   recommended pipeline.

---

## MCP tools used

| MCP tool                                | Purpose                                                                                                                                                          |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `mcp__leadspicker__list_projects`       | Look up project by name (`search_query`) or list recent (`order_by="last_active"`, `limit=20`)                                                                   |
| `mcp__leadspicker__get_project`         | Fetch project detail by `project_id`                                                                                                                             |
| `mcp__leadspicker__enrich_contacts`     | Create an enrichment / AI magic column. Parameters: `project_id`, `magic_column_type`, `column_name`, optional `prompt`, optional `is_boolean`, optional `model` |
| `mcp__leadspicker__list_magic_columns`  | List existing magic columns in a project                                                                                                                         |
| `mcp__leadspicker__update_magic_column` | Rename an existing magic column                                                                                                                                  |
| `mcp__leadspicker__list_contacts`       | Fetch a page of contacts (used to size the project: `page=1, page_size=1` returns `count`)                                                                       |

If you need an endpoint not covered above, use `mcp__leadspicker__leadspicker_api_call` and
introspect via `mcp__leadspicker__leadspicker_api_spec`. For everything in this skill the
curated tools are enough.

---

## User input

Always confirm these before running anything:

| Parameter          | Description                                   | Example                                                                          |
| ------------------ | --------------------------------------------- | -------------------------------------------------------------------------------- |
| `project_id`       | Target Leadspicker project (resolved by name) | `26256`                                                                          |
| Enrichment request | Specific columns OR a goal                    | `"LinkedIn Company Description and Website Summary"` or `"prepare for outreach"` |

### Project resolution

**Display format:** always render projects as **`{name} (#{id})`** — name first, ID in parentheses.

1. **User named a project** → call `mcp__leadspicker__list_projects(search_query="{name}", limit=5)`. If multiple match, ask which one.
2. **User did not name a project** → call `mcp__leadspicker__list_projects(order_by="last_active", limit=20)` and ask the user to pick.

Use the resolved project's `id` for subsequent calls.

---

## ⚠️ Credit discipline

Every enrichment column costs credits. Default to a **lean minimum**, never auto-enrich
"just in case". Add optional columns only when the user's persona / criteria explicitly
require them.

**Lean default for outreach prep:**

| Always                                                                                                                      | Only if user explicitly mentions                                                                                                                    |
| --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `company_name`, `company_website`, `company_linkedin`, `person_linkedin`, `li_full_name`, `person_position` (Core Identity) | `person_country` — person geography                                                                                                                 |
| `li_company_description`                                                                                                    | `li_company_country` — company geography                                                                                                            |
| `website_text_summary`                                                                                                      | `li_company_size` (**range, never the exact count**) — size band                                                                                    |
| `enrich_emails` + `validate_emails` (for email outreach)                                                                    | `li_company_people_*` — specific department headcount                                                                                               |
|                                                                                                                             | `company_founded_year` — company age / stage                                                                                                        |
|                                                                                                                             | `li_company_employee_count` — only if user **explicitly** asks for exact count (very rare; prefer the range)                                        |
|                                                                                                                             | `li_about_me`, `present_experience`, `past_experience`, `li_city`, `education_summary`, `linkedin_skills` — person-level personalization needs them |
|                                                                                                                             | `li_latest_posts` — icebreaker from LinkedIn activity (**expensive — confirm with user first**)                                                     |

**Hard rules:**

- **NEVER default to `li_company_employee_count`.** Always prefer `li_company_size` (range like `51-200`).
- **NEVER default to `li_latest_posts`.** It is the most expensive enrichment.
- Before launching, parse the user's request for triggers (geography, size, department, age) and include the matching optional column only if triggered.

---

## Dependency map

Some columns need other columns to exist first. When the user requests a column,
auto-include its prerequisites.

```
No prerequisites:
  company_name, company_website, company_linkedin,
  person_linkedin, li_full_name, person_position, person_country,
  li_location, li_city, li_company_size, li_company_country,
  company_founded_year, li_company_employee_count,
  enrich_emails, linkedin_premium, is_first_degree_connection,
  followers_count, linkedin_skills

Needs person_linkedin:
  li_about_me, li_latest_posts, present_experience, past_experience,
  education_summary

Needs company_linkedin:
  li_company_description, all li_company_people_* department headcounts

Needs company_website:
  website_text_summary

Needs enrich_emails:
  validate_emails, email_mx

Needs data from earlier enrichments (for AI context):
  any ai_custom_column (classification, icebreakers, cleaning, …)
```

**Selective resolution example.** User: "I want LinkedIn Company Description and Company Website Summary":

1. `li_company_description` needs `company_linkedin`
2. `website_text_summary` needs `company_website`
3. Neither prerequisite has its own prerequisite

Result — run in this order:

- Batch 1 (prerequisites): `company_linkedin`, `company_website`
- Batch 2 (requested): `li_company_description`, `website_text_summary`

Always show this resolved plan to the user before executing.

---

## Available enrichment columns

Each enrichment is created with `mcp__leadspicker__enrich_contacts(project_id, magic_column_type, column_name)`. AI columns also pass `prompt` and `is_boolean`. Built-in columns don't need a prompt.

### Person data (from LinkedIn)

| Column name                | `magic_column_type`          | Variable                         | What it does                  |
| -------------------------- | ---------------------------- | -------------------------------- | ----------------------------- |
| Full Name                  | `li_full_name`               | `{{full_name}}`                  | Clean full name from LinkedIn |
| Position                   | `person_position`            | `{{position}}`                   | Current job title             |
| Person Country             | `person_country`             | `{{person_country}}`             | Country from LinkedIn profile |
| LinkedIn Location          | `li_location`                | `{{linkedin_location}}`          | Location string from LinkedIn |
| LinkedIn City              | `li_city`                    | `{{linkedin_city}}`              | City extracted from LinkedIn  |
| LinkedIn About Me          | `li_about_me`                | `{{linkedin_about_me}}`          | LinkedIn bio / summary        |
| LinkedIn Latest Posts      | `li_latest_posts`            | `{{linkedin_latest_posts}}`      | Recent LinkedIn post content  |
| Present Positions Summary  | `present_experience`         | `{{present_experiences}}`        | Current roles summary         |
| Past Positions Summary     | `past_experience`            | `{{past_experiences}}`           | Previous roles summary        |
| Education Summary          | `education_summary`          | `{{education_summary}}`          | Education background          |
| LinkedIn Skills            | `linkedin_skills`            | `{{linkedin_skills}}`            | Listed skills                 |
| LinkedIn Followers         | `followers_count`            | `{{followers_count}}`            | Follower count                |
| Is LinkedIn Premium        | `linkedin_premium`           | `{{linkedin_premium}}`           | Premium account flag          |
| Is First Degree Connection | `is_first_degree_connection` | `{{is_first_degree_connection}}` | Connection degree check       |
| Person LinkedIn Profile    | `person_linkedin`            | `{{linkedin}}`                   | LinkedIn profile URL          |

### Company data

| Column name                  | `magic_column_type`         | Variable                           | What it does                      |
| ---------------------------- | --------------------------- | ---------------------------------- | --------------------------------- |
| Company Name                 | `company_name`              | `{{company_name}}`                 | Resolved company name             |
| Company Website              | `company_website`           | `{{company_website}}`              | Company website URL               |
| Company LinkedIn Profile     | `company_linkedin`          | `{{company_linkedin}}`             | Company LinkedIn page URL         |
| LinkedIn Company Description | `li_company_description`    | `{{linkedin_company_description}}` | Company description from LinkedIn |
| LinkedIn Company Size        | `li_company_size`           | `{{linkedin_company_size}}`        | Size range (e.g. 51-200)          |
| LinkedIn Company Country     | `li_company_country`        | `{{linkedin_company_country}}`     | HQ country                        |
| Company Founded Year         | `company_founded_year`      | `{{company_founded_year}}`         | Year founded                      |
| Company Employee Count       | `li_company_employee_count` | `{{company_employee_count}}`       | Exact employee count              |
| Company Website Summary      | `website_text_summary`      | `{{website_text_summary}}`         | AI summary of company website     |

### Department headcounts

| Column name                    | `magic_column_type`                      | Variable                                            |
| ------------------------------ | ---------------------------------------- | --------------------------------------------------- |
| Sales Headcount                | `li_company_people_sales`                | `{{linkedin_people_category_sales}}`                |
| Engineering Headcount          | `li_company_people_engineering`          | `{{linkedin_people_category_engineering}}`          |
| Marketing Headcount            | `li_company_people_marketing`            | `{{linkedin_people_category_marketing}}`            |
| Research Headcount             | `li_company_people_research`             | `{{linkedin_people_category_research}}`             |
| Operations Headcount           | `li_company_people_operations`           | `{{linkedin_people_category_operations}}`           |
| Human Resources Headcount      | `li_company_people_human_resources`      | `{{linkedin_people_category_human_resources}}`      |
| Business Development Headcount | `li_company_people_business_development` | `{{linkedin_people_category_business_development}}` |

### Email

| Column name                | `magic_column_type` | Variable                                     | What it does                             |
| -------------------------- | ------------------- | -------------------------------------------- | ---------------------------------------- |
| Enrich Emails              | `enrich_emails`     | `{{email}}`                                  | Finds email addresses for contacts       |
| Validate Emails            | `validate_emails`   | `{{email}}`                                  | Verifies deliverability                  |
| Email MX (host + provider) | `email_mx`          | `{{email_mx_host}}`, `{{email_mx_provider}}` | Resolves MX host and classifies provider |

### AI-powered columns (custom)

`magic_column_type: "ai_custom_column"` with a `prompt`. They reference any variable from
the columns above. For prompt-writing details, use the **mcp-classification** skill.

Common AI enrichments: `Clean First Name`, `Clean Company Name`, `Job Title Cleaning`,
`Company Industry`, `B2B/B2C`, `Icebreaker — Latest LI Posts`, `LinkedIn Post Summarization`,
`Targeted Job Titles`, `First Name Vocative — CZ`, `Last Name Vocative — CZ`.

### Other built-in types

| Column name  | `magic_column_type` | What it does                                                                   |
| ------------ | ------------------- | ------------------------------------------------------------------------------ |
| HTTP Request | `http_request`      | Calls an HTTP endpoint per contact and extracts a value from the JSON response |

---

## Recommended pipelines

Order matters — later steps often depend on earlier ones. Show the picked pipeline to the
user, confirm, then execute.

### Lean Outreach Prep — DEFAULT for "prepare for outreach"

Minimum column set for classification + personalization + email outreach. Start here; add
optional columns from the credit-discipline table only when triggered.

```
Batch 1 — Core Identity (ALWAYS):
  company_name, company_website, company_linkedin,
  person_linkedin, li_full_name, person_position

Batch 2 — Classification context (ALWAYS):
  li_company_description, website_text_summary

Batch 2b — Conditional company-level (only if triggered):
  li_company_country     — user cares where the company is based
  li_company_size (RANGE) — user cares about employee category / size band
  li_company_people_*    — user mentioned that department
  company_founded_year   — user mentioned company age / stage
  li_company_employee_count — only if user explicitly asked for exact count

Batch 3 — Conditional person-level (only if triggered):
  person_country         — user cares where the person is based
  li_about_me            — personalization depends on bio
  present_experience     — personalization uses role tenure
  li_latest_posts        — icebreaker uses post activity (EXPENSIVE — confirm first)

Batch 4 — Email (ALWAYS for email outreach):
  enrich_emails, then validate_emails

Batch 5 — AI columns:
  any classification / scoring / personalization (ai_custom_column).
  Hand off to mcp-classification or mcp-personalizer skills.
```

Show the plan with three sections: **Always**, **Added because you mentioned X**, **NOT enriching (saves credits)**. Only proceed after explicit confirmation.

### Quick email enrichment

```
Batch 1: enrich_emails
Batch 2: validate_emails (after batch 1 completes)
```

### Company research

```
Batch 1: company_name, company_website, company_linkedin
Batch 2: li_company_description, website_text_summary,
         li_company_size, company_founded_year (li_company_employee_count only if asked)
Batch 3: li_company_people_* as needed
```

### LinkedIn person enrichment

```
Batch 1: person_linkedin, li_full_name, person_position
Batch 2: li_about_me, li_latest_posts, present_experience,
         past_experience, education_summary, linkedin_skills
```

### Outreach prep (CZ market)

```
Batch 1–4: Lean Outreach Prep (with credit discipline)
Batch 5:   AI custom columns:
  Clean First Name, First Name Vocative — CZ, Clean Company Name,
  any classification columns,
  Icebreaker — Latest LI Posts (only if li_latest_posts was enriched)
```

For prompt details on AI columns, use **mcp-personalizer** (vocatives, hooks, salutations)
or **mcp-classification** (boolean / string / scored classifications).

### Full historical enrichment (legacy)

Use only when the user explicitly says "run full enrichment" and reconfirms after the cost
warning. Otherwise prefer Lean Outreach Prep.

```
All of Lean Outreach Prep, plus:
  li_company_size, li_company_country, company_founded_year,
  li_company_employee_count, li_about_me, li_latest_posts,
  present_experience, li_city, person_country
```

---

## Workflow

### Step 1 — collect input

Resolve the project (see **Project resolution**) and gather the enrichment request.

### Step 2 — determine mode and build the plan

**Selective mode** (user named specific columns):

1. Match the user's words to columns in the tables above
2. Look up the `magic_column_type` (this is what `mcp__leadspicker__enrich_contacts` needs)
3. Check the dependency map — add missing prerequisites
4. Group into batches: prerequisites first, then requested
5. Present the plan separating prerequisites from requested columns

Example to show user:

```
I'll enrich these columns for Marketing Q4 (#26256):

Prerequisites (needed first):
  • Company LinkedIn Profile (company_linkedin)
  • Company Website (company_website)

Your requested columns:
  • LinkedIn Company Description (li_company_description)
  • Company Website Summary (website_text_summary)

Total: 4 enrichments in 2 batches. OK to proceed?
```

**Pipeline mode** (user described a goal):

1. Pick the best matching recommended pipeline
2. Apply credit-discipline triggers (geography, size, department, age, posts)
3. Present the full pipeline with all batches
4. Show what's NOT enriched and why (credit-saving)

### Step 3 — confirm with user

Before any enrichment call, show the plan and get explicit approval. For AI columns, show
the prompt text or hand off to **mcp-classification** / **mcp-personalizer**.

### Step 4 — execute

For each batch, call `mcp__leadspicker__enrich_contacts` once per column. Wait briefly
between calls (≈1 s) to avoid rate-limits.

```
mcp__leadspicker__enrich_contacts(
    project_id=26256,
    magic_column_type="company_website",
    column_name="Company Website",
)
```

For an AI custom column:

```
mcp__leadspicker__enrich_contacts(
    project_id=26256,
    magic_column_type="ai_custom_column",
    column_name="Company Industry",
    prompt="Determine the primary industry of this company.\n\n…\n\nInput:\n- Company Name: {{company_name}}\n- Company Website: {{company_website}}\n- LinkedIn Company Description: {{linkedin_company_description}}\n- Company Website Summary: {{website_text_summary}}",
    is_boolean=False,
)
```

> Escape newlines in `prompt` as `\n` in the JSON payload that the MCP tool builds.
> Template variables like `{{company_name}}` are filled by Leadspicker server-side.

For pipelines where later batches genuinely need earlier data (e.g. `validate_emails` after
`enrich_emails`, AI columns after enrichment), ask the user to confirm the previous batch
completed in the Leadspicker UI before launching the next one.

### Step 5 — report summary

After the batch finishes, report:

- Columns created (mark prerequisites vs requested)
- Any failures with reason
- Suggested next steps:
  - After company data → "You can now run AI classification (mcp-classification)."
  - After email enrichment → "Validate emails next."
  - After LinkedIn person data → "Good base for icebreaker / personalization (mcp-personalizer)."

---

## Natural language → column matching

Users won't always use exact column names. Map common phrases:

| User says...                                       | Column(s)                              | `magic_column_type`                                                      |
| -------------------------------------------------- | -------------------------------------- | ------------------------------------------------------------------------ |
| "company description", "popis firmy"               | LinkedIn Company Description           | `li_company_description`                                                 |
| "website summary", "shrnutí webu", "co dělá firma" | Company Website Summary                | `website_text_summary`                                                   |
| "find emails", "najdi emaily"                      | Enrich Emails                          | `enrich_emails`                                                          |
| "verify emails", "validuj emaily"                  | Validate Emails                        | `validate_emails`                                                        |
| "LinkedIn data"                                    | All LinkedIn person columns            | (multiple)                                                               |
| "company info", "firemní data"                     | All company data columns               | (multiple)                                                               |
| "job title", "pozice"                              | Position                               | `person_position`                                                        |
| "headcount", "team size", "kolik lidí"             | Department headcounts                  | `li_company_people_*`                                                    |
| "everything", "full enrichment"                    | Full pipeline (warn about cost)        | (multiple)                                                               |
| "prepare for outreach", "připrav na outreach"      | Lean Outreach Prep                     | (multiple)                                                               |
| "company size", "velikost firmy"                   | LinkedIn Company Size + Employee Count | `li_company_size` (+ `li_company_employee_count` if user asks for exact) |
| "posts", "příspěvky"                               | LinkedIn Latest Posts                  | `li_latest_posts`                                                        |
| "bio", "about", "o sobě"                           | LinkedIn About Me                      | `li_about_me`                                                            |
| "skills", "dovednosti"                             | LinkedIn Skills                        | `linkedin_skills`                                                        |
| "industry", "odvětví"                              | Company Industry (AI)                  | `ai_custom_column`                                                       |
| "icebreaker", "opener"                             | Icebreaker — Latest LI Posts (AI)      | `ai_custom_column`                                                       |
| "email host", "MX"                                 | Email MX                               | `email_mx`                                                               |

When in doubt, show the column list and ask the user to pick.

---

## Common errors

| Symptom            | Likely cause                                            | Fix                                                                  |
| ------------------ | ------------------------------------------------------- | -------------------------------------------------------------------- |
| Tool returns `404` | Wrong project                                           | Re-list projects via `mcp__leadspicker__list_projects` and reconfirm |
| Tool returns `400` | Invalid `magic_column_type`                             | Check the tables above for the exact value                           |
| Tool returns `422` | Column with that name already exists, or invalid prompt | Pick a unique name or fix the prompt                                 |
| Tool returns `429` | Rate limit                                              | Increase delay between calls to 2-3 s                                |

---

## Safety

- **Always show the plan to the user** for approval before launching a batch.
- For AI columns, **always show the prompt** before launching.
- Default to lean enrichment; only add optional columns when explicitly triggered by user input.

