MCP Tools: Research
Research companies, qualify against your ICP, find leads.
Technical reference, generated automatically from the live tool registry.
Research
Research companies, qualify against ICP, find leads
research_company
action
Research a company to get industry, size, location, products, LinkedIn URL, competitors, and recent news.
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
company_name | string | yes | Company name |
domain | string | no | |
instructions | string | no |
find_companies
read-only
Find companies matching ICP criteria (industries, size, regions, tech stack, buying signals).
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
industries | string[] | no | |
company_size_min | number | no | |
company_size_max | number | no | |
regions | string[] | no | |
tech_stack | string[] | no | |
buying_signals | string[] | no | |
description | string | no | |
max_results | number | no |
qualify_company
action
Qualify a company against a playbook ICP. Requires research data. Returns qualified (bool), score (0-100), reasoning.
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
company_name | string | yes | Company name |
domain | string | no | |
playbook_id | string | yes | Playbook ID to qualify against |
research_data | object | no |
find_leads_at_company
read-only
Find decision-makers at a company by role/title. Returns name, title, LinkedIn URL.
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
company_name | string | yes | Company name |
domain | string | no | |
location | string | no | |
industry | string | no | |
roles | string[] | yes | Job roles to search for (e.g. [“CEO”, “Head of Sales”]) |
instructions | string | no |
research_web
action
Research any topic on the web. Uses AI-powered deep web research to answer questions, gather information, or investigate topics. Returns a detailed text response.
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | The research query or question. Be specific for best results. |
search_web
read-only
Search the web for a query and return a list of results with titles, URLs, and snippets. Good for finding specific pages, articles, or resources.
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | Search query |
max_results | number | no |
scrape_page
action
Scrape a web page and return its text content. Useful for reading articles, documentation, product pages, or any public URL.
Required integration: research-api
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | The URL to scrape |
Sourcing
Source companies from Google Maps, LinkedIn, post engagement, custom data sources
source_companies
action
Source companies matching a playbook ICP. By default runs all enabled data sources, then falls back to Google Maps for any shortfall. Pass source_slug to restrict sourcing to a SINGLE data source (e.g. “leads-finder” for B2B decision-maker discovery, “google-maps-scraper” for local business scraping) — this suppresses the Google Maps fallback. Apify runs are async — when status=“running” the actor is still working; results arrive via cron in 3–15 min. Use check_sourcing_progress to follow up.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | yes | Playbook ID to source companies for |
max_results | number | no | |
source_slug | string | no |
source_from_linkedin
action
Source companies from any LinkedIn URL. Accepts both Sales Navigator search URLs and LinkedIn post URLs. Auto-detects the type: post URLs extract engagers (likes/comments), search URLs import companies from SN results. Apify runs are async — status=“running” means results land later via cron.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Any LinkedIn URL — Sales Navigator search URL or LinkedIn post URL |
playbook_id | string | yes | Playbook ID |
max_companies | number | no | |
auto_pipeline | boolean | no |
check_sourcing_progress
read-only
Check progress of asynchronous sourcing runs started by source_companies / source_from_linkedin. Returns the latest sourcing_runs rows (status, source, companies_created, error, timestamps) so the agent can decide whether to wait, re-run, or report results.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | yes | Playbook ID to check sourcing progress for |
limit | number | no |
list_pending_companies
read-only
List companies pending qualification for a playbook.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | no | |
limit | number | no |
get_pool_contacts_by_domain
read-only
Retrieve known contacts from the global company pool for a given domain.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | yes | Bare domain, no protocol, no path |
limit | number | no |
search_pool
read-only
Browse/filter the global company pool like a human would in the pool UI — read-only, nothing is imported. Filter by industry, location, country, employee/revenue range, sources, has-email/phone/linkedin and last-seen dates, or pass query for semantic free-text search (“Logistikunternehmen mit eigener Flotte”). Returns compact company rows with a contactCount. To then pull results into a playbook, call source_from_pool with the same filters or with the exact domains you picked.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | no | |
search | string | no | |
name | string | no | |
domain | string | no | |
industry | string | no | |
location | string | no | |
country | string | no | |
min_employees | number | no | |
max_employees | number | no | |
min_revenue | number | no | |
max_revenue | number | no | |
has_email | boolean | no | |
has_phone | boolean | no | |
has_linkedin | boolean | no | |
sources | string[] | no | |
seen_after | string | no | |
seen_before | string | no | |
sort | enum(name \ | industry \ | employee_count \ |
order | enum(asc \ | desc) | no |
limit | number | no |
source_from_pool
action
Source companies + leads directly from the global pool into a playbook. Three modes: (1) pass domains to import an exact selection (e.g. picked via search_pool); (2) pass filters (industry, location, country, employee/revenue range, …) to import the most recently seen matching companies; (3) pass neither and the most-recent N pool companies are taken. All modes only create leads with a usable email (valid/catch_all), dedup by domain, and run the pipeline so imports get qualified against this playbook’s ICP.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | yes | Target playbook to import into |
limit | number | no | |
domains | string[] | no | |
search | string | no | |
name | string | no | |
domain | string | no | |
industry | string | no | |
location | string | no | |
country | string | no | |
min_employees | number | no | |
max_employees | number | no | |
min_revenue | number | no | |
max_revenue | number | no | |
has_email | boolean | no | |
has_phone | boolean | no | |
has_linkedin | boolean | no | |
sources | string[] | no | |
seen_after | string | no | |
seen_before | string | no |
get_pool_benchmarks
read-only
Aggregated performance benchmarks over the global pool, optionally scoped to a playbook.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | no |
find_similar_to_converted
read-only
Use Research Agent to find companies similar to leads on this playbook that already replied / booked a meeting / converted. Inserts them as new companies with source=lookalike. Best for squeezing the long tail after Google Maps sourcing saturates.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | yes | Playbook to seed from + insert into |
count | number | no |
list_data_sources
read-only
List all data source adapters configured for this workspace. Shows built-in (Google Maps, WLW, etc.) and custom adapters with their enabled/disabled status.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | enum(scraper \ | enrichment \ | research \ |
enabled_only | boolean | no |
create_data_source
action
Create a new data source adapter for this workspace. The adapter config describes how to call an external API and map its response to normalized company data. Use this after researching the target API’s documentation.
The adapter_config shape:
- base_url: API base URL
- auth: { type: “header”|“query”|“bearer”, key?: string, value_template?: “Bearer {{api_key}}” }
- request: { method: “GET”|“POST”, path: “/endpoint”, body_template?: { … }, headers?: { … } }
- polling (optional, for async APIs): { status_path, status_field, done_value, failed_values, result_id_field, interval_ms, timeout_ms }
- results (optional): { path?: “/results/{{id}}/items”, results_field?: “data.items” }
- field_mapping: { name: “response_field”, domain: “website_field”, phone: “phone_field”, … }
Use {{variable}} placeholders in templates — they get replaced with credentials + input params at runtime.
For an MCP-backed source (e.g. an Apify actor via mcp.apify.com), set connection_type=“mcp” and shape adapter_config as:
- mcp: { url: “https://mcp.apify.com”, auth: { type: “bearer”, credential_key: “api_key” } }
- call: { tool: “call-actor”, args: { actor: "
", input: { … } } } - result.async (Apify actors are async — call-actor returns RUNNING, so poll then fetch): { async: { dataset_id_path: “storages.datasets.default.id”, // NOT “defaultDatasetId” run_id_path: “runId”, status_path: “status”, poll_tool: “get-actor-run”, poll_args: { runId: “{{run_id}}” }, fetch_tool: “get-dataset-items”, fetch_args: { datasetId: “{{dataset_id}}”, limit: 500 }, items_path: “items” } }
- field_mapping: { level: “company”|“contact”, name: ”…”, domain: ”…”, … } (job-listing actors: map the hiring company name; a job title is a buying signal, not a company)
- credential_adapter: “apify-mcp” (resolves the platform Apify token) Set target_playbook_id so the feed lands in ONE playbook. Set credential_keys to [“api_key”] (the platform token satisfies it) or [] for none. NOTE: many actors (Indeed/StepStone) return job listings without a real company domain — that’s fine, companies import by name and the research step resolves the domain later.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Display name (e.g. “Clay Enrichment”, “Indeed Sales Roles”) |
slug | string | yes | URL-safe identifier (e.g. “indeed-sales-roles”) |
description | string | yes | What this data source does |
category | enum(scraper \ | enrichment \ | research \ |
connection_type | enum(http \ | mcp) | no |
adapter_config | object | yes | Full adapter configuration. For http: base_url/auth/request/polling/results/field_mapping. For mcp: mcp/call/result/field_mapping/credential_adapter (see description). |
credential_keys | string[] | yes | Which credential keys the source needs (e.g. [“api_key”]). Use [] for a platform-token MCP source with nothing to collect. |
priority | number | no | |
target_playbook_id | string | no |
toggle_data_source
action
Enable or disable a data source adapter. Disabled adapters are skipped in the sourcing waterfall.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Data source slug |
enabled | boolean | yes | Whether to enable or disable |
update_data_source
destructive
Update a data source adapter config, priority, or metadata.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Data source slug |
name | string | no | |
description | string | no | |
adapter_config | object | no | |
credential_keys | string[] | no | |
priority | number | no |
test_data_source
action
Test a data source adapter connection by making a lightweight auth check request.
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Data source slug |
delete_data_source
destructive
Delete a custom data source adapter. Built-in adapters cannot be deleted (disable them instead).
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | yes | Data source slug |
create_webhook_source
action
Create an INBOUND webhook data source: a per-workspace ingest URL that external tools (RB2B, Snitcher via Zapier/Make, Clay, custom scripts) POST to. Each POST is mapped to a company and inserted as ‘pending’ in the target playbook, so the normal pipeline (lead discovery → enrichment → outreach) runs on it. Push-based counterpart to scraper data sources — use this for real-time triggers like “website visitor → outreach”. Returns the ingest URL + secret to paste into the external tool.
field_mapping maps each company field to a dot-path in the webhook body, e.g. { “name”: “company.name”, “domain”: “company.website”, “industry”: “company.industry”, “employee_count”: “company.size” }. Supported company fields: name, domain, industry, country, city, linkedin_url, phone, employee_count. At least name or domain must be mappable.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Display name (e.g. “RB2B visitors”, “Snitcher via Zapier”) |
target_playbook_id | string | yes | Playbook that ingested companies enter (they start as pending) |
field_mapping | object | yes | company field → dot-path in the webhook JSON body |
source_from_mcp
action
EXPERIMENTAL. Source B2B companies/leads from a remote MCP server (e.g. Apify MCP at https://mcp.apify.com) into a playbook as pending records. Generic: point it at any MCP url + tool + field mapping. Handles Apify-style async (call-actor → get-dataset-items) via the result.async config. level=“company” inserts companies; level=“contact” inserts companies then leads attached by domain. Runs synchronously and may take up to ~150s while the remote tool works (long Apify actors can exceed this — prefer fast actors for the experiment). Additive: does not touch the normal sourcing pipeline.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | yes | Playbook to source into |
mcp_url | string | yes | MCP server URL, e.g. https://mcp.apify.com |
tool | string | yes | MCP tool to call, e.g. “call-actor” |
args | object | no | |
level | enum(company \ | contact) | no |
field_mapping | object | yes | Dot-path mapping from row fields to normalized fields. Company-level keys: name, domain, phone, email, location, country, industry, employee_count, linkedin_url. Contact-level keys: company_name, company_domain, first_name, last_name, email, linkedin, job_title, phone |
result | object | no | |
credential_adapter | string | no | |
auth | object | no | |
max_results | number | no | |
source | string | no |
introspect_mcp_source
action
EXPERIMENTAL. Point at any MCP server and figure out how to import its data into the pipeline. Three modes: (1) neither actor nor tool → lists the server’s tools so you can pick one; (2) actor set (Apify) → reads the actor’s input+output schema (free, no run) and returns a ready async config; (3) tool set → samples the tool once (small), detects sync vs Apify-async + where rows live, and proposes a field_mapping. Returns a ready-to-save config for source_from_mcp (test) / create_data_source (save daily). Never auto-saves.
| Parameter | Type | Required | Description |
|---|---|---|---|
mcp_url | string | yes | MCP server URL, e.g. https://mcp.apify.com |
credential_adapter | string | no | |
auth | object | no | |
actor | string | no | |
tool | string | no | |
sample_args | object | no |
Website Scraper
Scrape company websites to find leads (cheap, Firecrawl + LLM-based)
scrape_leads_from_domain
action
Scrape a company website for leads matching specified roles. Uses self-hosted Firecrawl + LLM extraction + pattern-based email derivation. Cached 30 days per org+domain. Pass the real company name so the LLM can disambiguate employees from partners/testimonials.
Required integration: scraper
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | yes | |
company_name | string | no | |
roles | string[] | no | |
force_refresh | boolean | no | |
validate_emails | boolean | no |
Research Agent Setup
Connect Research Agent via MCP URL to discover and use all research tools in chat
connect_research_mcp
action
Connect your Research Agent via MCP URL. Discovers available tools and makes them usable in the Command Center.
| Parameter | Type | Required | Description |
|---|---|---|---|
mcp_url | string | yes | Your Research Agent MCP URL (e.g. https://research-agent.net/mcp/ra1_…) |
Social Listening
Monitor LinkedIn for posts by topic/keyword, scrape engagers, resolve companies, and run pipeline
list_social_topics
read-only
List configured social listening topics for the workspace. Optionally filter by playbook.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | no |
create_social_topic
action
Create a new social listening topic for a playbook. Topics run on their own schedule defined by frequency_per_day (1–6 scans/day).
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | yes | Playbook this topic belongs to |
name | string | yes | Short label, e.g. “Competitor Mentions” |
keywords | string[] | yes | LinkedIn search keywords for this topic |
min_engagement | number | no | |
frequency_per_day | number | no | |
enabled | boolean | no |
update_social_topic
destructive
Update an existing social listening topic — change name, keywords, threshold, frequency, target playbook, or enable/disable it.
| Parameter | Type | Required | Description |
|---|---|---|---|
topic_id | string | yes | Topic ID |
playbook_id | string | no | |
name | string | no | |
keywords | string[] | no | |
min_engagement | number | no | |
frequency_per_day | number | no | |
enabled | boolean | no |
delete_social_topic
destructive
Delete a social listening topic. Past scans are kept; the topic_id on those rows becomes NULL.
| Parameter | Type | Required | Description |
|---|---|---|---|
topic_id | string | yes | Topic ID |
run_social_scan
action
Run a social listening scan immediately. Pass either topic_id (preferred) or playbook_id (uses the playbook’s first enabled topic).
Each scan: searches LinkedIn for posts matching the topic keywords, scrapes engagers (post author + reactors + commenters), resolves their companies (with domain via search→profile lookup), creates leads, and runs the playbook pipeline.
Required integration: unipile:linkedin
| Parameter | Type | Required | Description |
|---|---|---|---|
topic_id | string | no | |
playbook_id | string | no |
scan_linkedin_post
action
Scan a specific LinkedIn post URL — scrapes engagers, resolves companies, creates leads, runs the pipeline. Uses the playbook for pipeline settings.
Required integration: apify, unipile:linkedin
| Parameter | Type | Required | Description |
|---|---|---|---|
post_url | string | yes | LinkedIn post URL |
playbook_id | string | yes | Playbook ID to add discovered companies and leads to |
get_scan_history
read-only
View past social listening scan results. Optionally filter by playbook or topic.
| Parameter | Type | Required | Description |
|---|---|---|---|
playbook_id | string | no | |
topic_id | string | no | |
limit | number | no |
LinkedIn Engagers
Extract engagers (reactors + commenters) from any LinkedIn post and resolve their current employer — composable primitives for agent chains
parse_linkedin_post_id
action
Parse a LinkedIn post URL or URN into its components — kind (activity / ugcPost / share), numeric ID, and the LinkedIn/WhatsApp path param. Use to validate a user-provided link before calling extract_post_engagers. No credentials required.
| Parameter | Type | Required | Description |
|---|---|---|---|
input | string | yes | LinkedIn post URL, urn:li:activity/ugcPost/share:X, or bare numeric id |
extract_post_engagers
action
Extract people who engaged with a LinkedIn post — reactors and commenters. Use when the user says “who liked/commented on this post?” or “get engagers from this LinkedIn post”. Accepts any LinkedIn post URL, URN, or numeric id. Returns each engager with name, headline, public_identifier, and engagement types. Does NOT resolve companies — chain with resolve_engagers_companies for that, or use extract_and_resolve_engagers for a one-shot flow.
Required integration: unipile:linkedin
| Parameter | Type | Required | Description |
|---|---|---|---|
post | string | yes | LinkedIn post URL, URN, or numeric id |
max_engagers | number | no | |
include_reactions | boolean | no | |
include_comments | boolean | no | |
include_company_engagers | boolean | no |
resolve_engager_company
action
Resolve a single engager’s current employer via LinkedIn profile lookup. Tries the rich LinkedIn profile endpoint, then /users fallback, then headline parsing. Use inside agent chains when you need to resolve one person at a time. For batch resolution, use resolve_engagers_companies instead.
Required integration: unipile:linkedin
| Parameter | Type | Required | Description |
|---|---|---|---|
engager | object | yes | Engager object — minimally { id, name }; public_identifier and headline improve resolution quality |
skip_users_fallback | boolean | no |
resolve_engagers_companies
action
Batch-resolve companies for a list of engagers — typically the output of extract_post_engagers. Runs with configurable concurrency (default 5, max 20), respects LinkedIn/WhatsApp rate limits. Returns resolved engagers with company data and stats (ok / no_positions / lookup_error / headline_fallback / unresolved). Use right after extract_post_engagers.
Required integration: unipile:linkedin
| Parameter | Type | Required | Description |
|---|---|---|---|
engagers | object[] | yes | Array of engagers (minimal shape); typically from extract_post_engagers |
concurrency | number | no |
extract_and_resolve_engagers
action
One-shot: extract engagers from a LinkedIn post AND resolve their companies. Use when the user asks “who engaged with this post and where do they work?” Returns post metadata, resolved engagers with company data, and resolution stats. For more control (filtering, concurrency), use extract_post_engagers + resolve_engagers_companies separately.
Required integration: unipile:linkedin
| Parameter | Type | Required | Description |
|---|---|---|---|
post | string | yes | LinkedIn post URL, URN, or numeric id |
max_engagers | number | no |
Website Visitors
Identify companies visiting your website via Snitcher
get_website_visitors
read-only
Get recent website visitors identified by company. Returns company name, domain, industry, pages visited, time on site, and visit count. Use this to find companies showing buying intent by visiting the customer website.
Required integration: snitcher
| Parameter | Type | Required | Description |
|---|---|---|---|
hours | number | no | |
limit | number | no |
get_visitor_details
read-only
Get detailed website visit data for a specific company domain. Shows all sessions, pages visited with time spent, referrers, and devices over the last 7 days.
Required integration: snitcher
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | yes | Company domain to look up (e.g. “acme.de”) |