# MCP Robots

> Creates and launches Leadspicker robots (automations) that scrape LinkedIn data and deposit leads into projects, through the Leadspicker MCP server. Supports 4 robot types: scraping likers and commenters from specific LinkedIn posts, monitoring new posts by LinkedIn profiles or companies, searching LinkedIn posts by keywords, and LinkedIn people search via Sales Navigator URLs, normal LinkedIn people search, or event attendees. Use whenever the user wants to create, launch, or start a robot or automation in Leadspicker — in any language. Triggers on scraping LinkedIn posts, extracting post likers or commenters, monitoring posts from profiles or companies, searching LinkedIn content by keywords or topics, LinkedIn people search, Sales Navigator search, event attendees scraping, or pasting LinkedIn URLs with a request to scrape, monitor, or search. Triggers on direct robot type references: li_posts_extract, li_posts_monitor, li_posts_feed, salesnav_monitor.

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

---


# Leadspicker Robots (MCP)

Creates and launches robots (LinkedIn scraping automations) in Leadspicker through the
Leadspicker MCP server via `mcp__leadspicker__create_robot`. Each robot scrapes LinkedIn
data and deposits the results as leads into a target Leadspicker project.

**4 supported robot types:**

| Robot type       | `robot_type`       | What it does                                                       |
| ---------------- | ------------------ | ------------------------------------------------------------------ |
| Post Scrape      | `li_posts_extract` | Scrape likers / commenters from specific LinkedIn posts            |
| Post Monitor     | `li_posts_monitor` | Track new posts by specific LinkedIn profiles or companies         |
| Post Feed Search | `li_posts_feed`    | Search LinkedIn posts by keywords                                  |
| People Search    | `salesnav_monitor` | LinkedIn people search (Sales Nav, normal search, event attendees) |

---

## MCP tools used

| MCP tool                                   | Purpose                                                                                                                           |
| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| `mcp__leadspicker__list_projects`          | Look up project by name (`search_query`) or list recent (`order_by="last_active"`)                                                |
| `mcp__leadspicker__get_project`            | Fetch project detail                                                                                                              |
| `mcp__leadspicker__create_project`         | Create a new target project (`name`, `timezone`)                                                                                  |
| `mcp__leadspicker__list_linkedin_accounts` | List connected LinkedIn accounts (filter by `is_revoked: false`, `sales_nav_session_connected`, `linkedin_session_connected`)     |
| `mcp__leadspicker__create_robot`           | Create and launch the robot. Parameters: `target_project_id`, `robot_type`, `robot_urls`, `frequency`, plus type-specific fields. |
| `mcp__leadspicker__list_robots`            | List robots (optionally scoped by `project`)                                                                                      |
| `mcp__leadspicker__get_robot`              | Get robot detail / logs / export (`info_type`)                                                                                    |
| `mcp__leadspicker__control_robot`          | Pause / unpause / restart / delete robot                                                                                          |
| `mcp__leadspicker__get_current_time`       | Use to generate a robot name with the current timestamp                                                                           |

---

## User input

| Parameter           | Required | Description                                       | Example                 |
| ------------------- | -------- | ------------------------------------------------- | ----------------------- |
| `target_project_id` | Yes      | Target Leadspicker project (resolved by name)     | `30877`                 |
| URL(s)              | Yes      | One or more LinkedIn URLs — determines robot type | see URL detection below |

If anything is missing, ask for ALL missing parameters in a single follow-up — not one by one.

### Project resolution

**Display format:** always render as **`{name} (#{id})`**.

1. **User named a project** → `mcp__leadspicker__list_projects(search_query="{name}", limit=5)`. Confirm; if multiple, ask which one.
2. **No named project** → `mcp__leadspicker__list_projects(order_by="last_active", limit=20)` and ask:
   ```
   Which project should receive the scraped leads?
   1. CEOs Czechia (#30877) — last active 2026-03-23
   2. SaaS Founders (#30512) — last active 2026-03-21
   …
   New: create a new project
   ```
3. **User wants a new project** → ask for a name, then `mcp__leadspicker__create_project(name="{name}", timezone="Europe/Prague")`. Use the returned `id`.

---

## URL detection — auto-routing to robot type

| URL pattern                                                | Robot type         | Example                                                                                            |
| ---------------------------------------------------------- | ------------------ | -------------------------------------------------------------------------------------------------- |
| Contains `/feed/update/` or `/posts/`                      | `li_posts_extract` | `https://www.linkedin.com/feed/update/urn:li:activity:7441864955731103744/`                        |
| Contains `/in/` or `/company/` (profile, NOT a search URL) | `li_posts_monitor` | `https://www.linkedin.com/in/tblatak/`, `https://www.linkedin.com/company/leadspicker`             |
| Contains `/search/results/content`                         | `li_posts_feed`    | `https://www.linkedin.com/search/results/content/?keywords=…`                                      |
| Contains `/sales/search/people`                            | `salesnav_monitor` | Sales Navigator people search URL                                                                  |
| Contains `/search/results/people` (no `eventAttending`)    | `salesnav_monitor` | `https://www.linkedin.com/search/results/people/?keywords=ceo`                                     |
| Contains `eventAttending`                                  | `salesnav_monitor` | `https://www.linkedin.com/search/results/people/?origin=EVENT_PAGE_CANNED_SEARCH&eventAttending=…` |

**Rules:**

- Profile URLs (`/in/...` or `/company/...`) NOT inside a search URL → `li_posts_monitor`.
- If ambiguous, ask the user which type they intend.
- Multiple URLs of the same type are fine — concatenate them with newlines in `robot_urls`.
- Do NOT mix URL types in a single robot — for mixed input, create separate robots.

### Sales Navigator URL — how to obtain

This MCP skill does not generate Sales Navigator URLs from filter descriptions. If the user
needs a Sales Nav URL:

1. Ask them to build it manually in LinkedIn Sales Navigator (set filters, copy the URL).
2. Or ask them to paste an existing URL.
3. Or, when running outside MCP, generate it programmatically with their preferred tool.

Then use the URL as `robot_urls` input here.

---

## Robot type details

### 1) `li_posts_extract` — scrape specific posts

Scrapes likers and commenters from specific LinkedIn post URLs.

**URL input:** one or more post URLs (`/feed/update/` or `/posts/`).

| Parameter               | Default  | Notes                     |
| ----------------------- | -------- | ------------------------- |
| `frequency`             | `"once"` | Always once — do not ask  |
| `max_likers`            | `250`    | User can override         |
| `max_commenters`        | `250`    | User can override         |
| `max_posts`             | `500`    | Default                   |
| `should_scrape_authors` | `False`  | Always false — do not ask |
| `max_post_age`          | —        | Not applicable            |
| `linkedin_account_id`   | —        | Not needed — omit         |

**Questions to ask the user:** none beyond the URLs. Use defaults and proceed.

### 2) `li_posts_monitor` — track posts by account

Monitors posts published by specific LinkedIn profiles or company pages.

**URL input:** one or more profile URLs (`/in/...`) or company URLs (`/company/...`).

| Parameter               | Default   | Notes                                                    |
| ----------------------- | --------- | -------------------------------------------------------- |
| `max_post_age`          | `"month"` | Options: `"day"`, `"week"`, `"month"`, `"year"`, `"any"` |
| `frequency`             | `"once"`  | Options: `"once"`, `"daily"`, `"3days"`, `"weekly"`      |
| `max_posts`             | `500`     | Default                                                  |
| `max_likers`            | `250`     | Default                                                  |
| `max_commenters`        | `250`     | Default                                                  |
| `should_scrape_authors` | `False`   | Always false — do not ask                                |
| `linkedin_account_id`   | —         | Optional — omit by default                               |

**Ask the user:** how far back to look (`max_post_age`, suggest `"month"`); whether they want recurring runs (`frequency`, suggest `"once"`).

### 3) `li_posts_feed` — search posts by keywords

Searches LinkedIn for posts matching specific keywords.

**URL input:** content search URL (`/search/results/content`).

| Parameter               | Default  | Notes                                                    |
| ----------------------- | -------- | -------------------------------------------------------- |
| `should_scrape_authors` | `True`   | Always true for keyword search                           |
| `max_post_age`          | `"week"` | Options: `"day"`, `"week"`, `"month"`, `"year"`, `"any"` |
| `frequency`             | `"once"` | Options: `"once"`, `"daily"`, `"3days"`, `"weekly"`      |
| `max_posts`             | `500`    | Default                                                  |
| `max_likers`            | `250`    | Default                                                  |
| `max_commenters`        | `250`    | Default                                                  |
| `linkedin_account_id`   | —        | Optional — omit by default                               |

**Ask the user:** same as `li_posts_monitor` — `max_post_age` and `frequency`.

### 4) `salesnav_monitor` — LinkedIn people search

Searches for people via Sales Navigator, normal LinkedIn search, or event attendees.

**URL input:** one of:

- **Sales Navigator** — `/sales/search/people`
- **Normal LinkedIn people search** — `/search/results/people` (no `eventAttending`)
- **Event attendees** — contains `eventAttending`

| Parameter               | Default       | Notes                                                                                                                |
| ----------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------- |
| `max_posts`             | `500`         | **IMPORTANT: despite the field name, this controls max number of PEOPLE to scrape, not posts.** API field is reused. |
| `max_likers`            | `0`           | Not relevant for people search                                                                                       |
| `max_commenters`        | `0`           | Not relevant for people search                                                                                       |
| `should_scrape_authors` | `True`        | Always true                                                                                                          |
| `max_post_age`          | `"all"`       | Default for people search                                                                                            |
| `frequency`             | `"once"`      | Supports recurring                                                                                                   |
| `linkedin_account_id`   | **see below** | Required for Sales Nav and event URLs                                                                                |

#### LinkedIn account selection

| URL type             | `linkedin_account_id` | Why                                                  |
| -------------------- | --------------------- | ---------------------------------------------------- |
| Sales Navigator      | **Required**          | Needs a LinkedIn account with Sales Navigator access |
| Event attendees      | **Required**          | Needs a LinkedIn account that has attended the event |
| Normal people search | Optional              | Omit by default                                      |

When required:

1. `mcp__leadspicker__list_linkedin_accounts()`.
2. Filter:
   - Always exclude `is_revoked: True`.
   - Sales Nav URLs → keep only `sales_nav_session_connected: True`.
   - Event URLs → keep only `linkedin_session_connected: True`.
3. Show a table of valid accounts and ask the user to pick.
4. Use the selected `id` as `linkedin_account_id`.
5. If no valid accounts exist, stop and tell the user:
   - Sales Nav: "No LinkedIn accounts with Sales Navigator connected. Please connect one in Leadspicker first."
   - Events: "No connected LinkedIn accounts found. Please connect one in Leadspicker first."

---

## Robot name

Auto-generate the robot's `name` with a timestamp:

```
{Type Label} ({DD. M. YYYY HH:MM:SS})
```

| Robot type         | Type label        |
| ------------------ | ----------------- |
| `li_posts_extract` | `Post Tracker`    |
| `li_posts_monitor` | `Post Tracker`    |
| `li_posts_feed`    | `Post Tracker`    |
| `salesnav_monitor` | `LinkedIn people` |

Use `mcp__leadspicker__get_current_time(timezone="Europe/Prague")` for the timestamp.

Examples: `Post Tracker (23. 3. 2026 17:45:28)`, `LinkedIn people (23. 3. 2026 18:10:02)`.

---

## Workflow

### Step 1 — collect input

Resolve `target_project_id` and the URL(s).

### Step 2 — detect robot type

Apply URL detection. Tell the user:

```
Detected: Post Scrape (li_posts_extract) — scraping likers and commenters from 2 LinkedIn posts.
```

### Step 3 — collect type-specific parameters

- **`li_posts_extract`:** none — proceed with defaults.
- **`li_posts_monitor`:** ask `max_post_age` (default `"month"`), `frequency` (default `"once"`).
- **`li_posts_feed`:** ask `max_post_age` (default `"week"`), `frequency` (default `"once"`).
- **`salesnav_monitor`:** if Sales Nav or event URL → run **LinkedIn account selection** above; ask about `frequency` if relevant (default `"once"`).

### Step 4 — show payload preview

Assemble the parameters and show them to the user for approval:

```
Robot ready to launch:

Type:           Post Scrape (li_posts_extract)
Name:           Post Tracker (23. 3. 2026 17:45:28)
Target project: CEOs Czechia (#30877)
URLs:           2 LinkedIn posts
Max likers:     250
Max commenters: 250
Frequency:      once

Proceed?
```

For `salesnav_monitor` also show: `linkedin_account_id` (account name) and `max_posts` (= max people).

### Step 5 — launch

```
mcp__leadspicker__create_robot(
    target_project_id=30877,
    robot_type="li_posts_extract",
    robot_urls="https://www.linkedin.com/feed/update/urn:li:activity:7441864955731103744/",
    frequency="once",
    max_posts=500,
    max_likers=250,
    max_commenters=250,
    should_scrape_authors=False,
    deduplicate_results=True,
    status="ready",
)
```

For people search with Sales Nav:

```
mcp__leadspicker__create_robot(
    target_project_id=30877,
    robot_type="salesnav_monitor",
    robot_urls="https://www.linkedin.com/sales/search/people?query=…",
    linkedin_account_id=4773,
    frequency="once",
    max_posts=500,
    max_likers=0,
    max_commenters=0,
    max_post_age="all",
    should_scrape_authors=True,
    deduplicate_results=True,
    status="ready",
)
```

### Step 6 — confirm result

Report:

- Robot ID, name, type, target project.
- If recurring, note the frequency.
- On error, show HTTP status and resolution.

---

## Managing existing robots

| Action                   | MCP tool                                                        |
| ------------------------ | --------------------------------------------------------------- |
| List all robots          | `mcp__leadspicker__list_robots()`                               |
| List robots in a project | `mcp__leadspicker__list_robots(project=X)`                      |
| Get robot detail         | `mcp__leadspicker__get_robot(robot_id=X, info_type="detail")`   |
| Get robot logs           | `mcp__leadspicker__get_robot(robot_id=X, info_type="logs")`     |
| Export robot results     | `mcp__leadspicker__get_robot(robot_id=X, info_type="export")`   |
| Pause                    | `mcp__leadspicker__control_robot(robot_id=X, action="pause")`   |
| Unpause                  | `mcp__leadspicker__control_robot(robot_id=X, action="unpause")` |
| Restart                  | `mcp__leadspicker__control_robot(robot_id=X, action="restart")` |
| Delete                   | `mcp__leadspicker__control_robot(robot_id=X, action="delete")`  |
| Copy to another project  | `mcp__leadspicker__copy_robot(robot_id=X, target_project=Y)`    |

---

## Common errors

| Symptom            | Likely cause                             | Fix                                                                                  |
| ------------------ | ---------------------------------------- | ------------------------------------------------------------------------------------ |
| Tool returns `404` | Wrong project / endpoint                 | Re-list and reconfirm `target_project_id`                                            |
| Tool returns `400` | Invalid URL, missing required field      | Validate the URL pattern and required parameters                                     |
| Tool returns `422` | Invalid `robot_type` or validation error | Robot type must be one of the four; for Sales Nav, `linkedin_account_id` is required |
| Tool returns `429` | Rate limit                               | Wait 2–3 s and retry                                                                 |

---

## Safety

- Always show the full payload to the user before launching.
- Never execute without explicit user confirmation.

