Dokumentation / Referenz

MCP Tools: Research

Firmen recherchieren, gegen das ICP qualifizieren, Leads finden — technische Referenz auf Englisch.

Technische Referenz auf Englisch.

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

ParameterTypeRequiredDescription
company_namestringyesCompany name
domainstringno
instructionsstringno

find_companies

read-only

Find companies matching ICP criteria (industries, size, regions, tech stack, buying signals).

Required integration: research-api

ParameterTypeRequiredDescription
industriesstring[]no
company_size_minnumberno
company_size_maxnumberno
regionsstring[]no
tech_stackstring[]no
buying_signalsstring[]no
descriptionstringno
max_resultsnumberno

qualify_company

action

Qualify a company against a playbook ICP. Requires research data. Returns qualified (bool), score (0-100), reasoning.

Required integration: research-api

ParameterTypeRequiredDescription
company_namestringyesCompany name
domainstringno
playbook_idstringyesPlaybook ID to qualify against
research_dataobjectno

find_leads_at_company

read-only

Find decision-makers at a company by role/title. Returns name, title, LinkedIn URL.

Required integration: research-api

ParameterTypeRequiredDescription
company_namestringyesCompany name
domainstringno
locationstringno
industrystringno
rolesstring[]yesJob roles to search for (e.g. [“CEO”, “Head of Sales”])
instructionsstringno

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

ParameterTypeRequiredDescription
querystringyesThe 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

ParameterTypeRequiredDescription
querystringyesSearch query
max_resultsnumberno

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

ParameterTypeRequiredDescription
urlstringyesThe 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.

ParameterTypeRequiredDescription
playbook_idstringyesPlaybook ID to source companies for
max_resultsnumberno
source_slugstringno

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.

ParameterTypeRequiredDescription
urlstringyesAny LinkedIn URL — Sales Navigator search URL or LinkedIn post URL
playbook_idstringyesPlaybook ID
max_companiesnumberno
auto_pipelinebooleanno

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.

ParameterTypeRequiredDescription
playbook_idstringyesPlaybook ID to check sourcing progress for
limitnumberno

list_pending_companies

read-only

List companies pending qualification for a playbook.

ParameterTypeRequiredDescription
playbook_idstringno
limitnumberno

get_pool_contacts_by_domain

read-only

Retrieve known contacts from the global company pool for a given domain.

ParameterTypeRequiredDescription
domainstringyesBare domain, no protocol, no path
limitnumberno

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.

ParameterTypeRequiredDescription
querystringno
searchstringno
namestringno
domainstringno
industrystringno
locationstringno
countrystringno
min_employeesnumberno
max_employeesnumberno
min_revenuenumberno
max_revenuenumberno
has_emailbooleanno
has_phonebooleanno
has_linkedinbooleanno
sourcesstring[]no
seen_afterstringno
seen_beforestringno
sortenum(name \industry \employee_count \
orderenum(asc \desc)no
limitnumberno

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.

ParameterTypeRequiredDescription
playbook_idstringyesTarget playbook to import into
limitnumberno
domainsstring[]no
searchstringno
namestringno
domainstringno
industrystringno
locationstringno
countrystringno
min_employeesnumberno
max_employeesnumberno
min_revenuenumberno
max_revenuenumberno
has_emailbooleanno
has_phonebooleanno
has_linkedinbooleanno
sourcesstring[]no
seen_afterstringno
seen_beforestringno

get_pool_benchmarks

read-only

Aggregated performance benchmarks over the global pool, optionally scoped to a playbook.

ParameterTypeRequiredDescription
playbook_idstringno

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.

ParameterTypeRequiredDescription
playbook_idstringyesPlaybook to seed from + insert into
countnumberno

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.

ParameterTypeRequiredDescription
categoryenum(scraper \enrichment \research \
enabled_onlybooleanno

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.
ParameterTypeRequiredDescription
namestringyesDisplay name (e.g. “Clay Enrichment”, “Indeed Sales Roles”)
slugstringyesURL-safe identifier (e.g. “indeed-sales-roles”)
descriptionstringyesWhat this data source does
categoryenum(scraper \enrichment \research \
connection_typeenum(http \mcp)no
adapter_configobjectyesFull adapter configuration. For http: base_url/auth/request/polling/results/field_mapping. For mcp: mcp/call/result/field_mapping/credential_adapter (see description).
credential_keysstring[]yesWhich credential keys the source needs (e.g. [“api_key”]). Use [] for a platform-token MCP source with nothing to collect.
prioritynumberno
target_playbook_idstringno

toggle_data_source

action

Enable or disable a data source adapter. Disabled adapters are skipped in the sourcing waterfall.

ParameterTypeRequiredDescription
slugstringyesData source slug
enabledbooleanyesWhether to enable or disable

update_data_source

destructive

Update a data source adapter config, priority, or metadata.

ParameterTypeRequiredDescription
slugstringyesData source slug
namestringno
descriptionstringno
adapter_configobjectno
credential_keysstring[]no
prioritynumberno

test_data_source

action

Test a data source adapter connection by making a lightweight auth check request.

ParameterTypeRequiredDescription
slugstringyesData source slug

delete_data_source

destructive

Delete a custom data source adapter. Built-in adapters cannot be deleted (disable them instead).

ParameterTypeRequiredDescription
slugstringyesData 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.

ParameterTypeRequiredDescription
namestringyesDisplay name (e.g. “RB2B visitors”, “Snitcher via Zapier”)
target_playbook_idstringyesPlaybook that ingested companies enter (they start as pending)
field_mappingobjectyescompany 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.

ParameterTypeRequiredDescription
playbook_idstringyesPlaybook to source into
mcp_urlstringyesMCP server URL, e.g. https://mcp.apify.com
toolstringyesMCP tool to call, e.g. “call-actor”
argsobjectno
levelenum(company \contact)no
field_mappingobjectyesDot-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
resultobjectno
credential_adapterstringno
authobjectno
max_resultsnumberno
sourcestringno

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.

ParameterTypeRequiredDescription
mcp_urlstringyesMCP server URL, e.g. https://mcp.apify.com
credential_adapterstringno
authobjectno
actorstringno
toolstringno
sample_argsobjectno

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

ParameterTypeRequiredDescription
domainstringyes
company_namestringno
rolesstring[]no
force_refreshbooleanno
validate_emailsbooleanno

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.

ParameterTypeRequiredDescription
mcp_urlstringyesYour 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.

ParameterTypeRequiredDescription
playbook_idstringno

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).

ParameterTypeRequiredDescription
playbook_idstringyesPlaybook this topic belongs to
namestringyesShort label, e.g. “Competitor Mentions”
keywordsstring[]yesLinkedIn search keywords for this topic
min_engagementnumberno
frequency_per_daynumberno
enabledbooleanno

update_social_topic

destructive

Update an existing social listening topic — change name, keywords, threshold, frequency, target playbook, or enable/disable it.

ParameterTypeRequiredDescription
topic_idstringyesTopic ID
playbook_idstringno
namestringno
keywordsstring[]no
min_engagementnumberno
frequency_per_daynumberno
enabledbooleanno

delete_social_topic

destructive

Delete a social listening topic. Past scans are kept; the topic_id on those rows becomes NULL.

ParameterTypeRequiredDescription
topic_idstringyesTopic 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

ParameterTypeRequiredDescription
topic_idstringno
playbook_idstringno

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

ParameterTypeRequiredDescription
post_urlstringyesLinkedIn post URL
playbook_idstringyesPlaybook 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.

ParameterTypeRequiredDescription
playbook_idstringno
topic_idstringno
limitnumberno

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.

ParameterTypeRequiredDescription
inputstringyesLinkedIn 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

ParameterTypeRequiredDescription
poststringyesLinkedIn post URL, URN, or numeric id
max_engagersnumberno
include_reactionsbooleanno
include_commentsbooleanno
include_company_engagersbooleanno

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

ParameterTypeRequiredDescription
engagerobjectyesEngager object — minimally { id, name }; public_identifier and headline improve resolution quality
skip_users_fallbackbooleanno

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

ParameterTypeRequiredDescription
engagersobject[]yesArray of engagers (minimal shape); typically from extract_post_engagers
concurrencynumberno

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

ParameterTypeRequiredDescription
poststringyesLinkedIn post URL, URN, or numeric id
max_engagersnumberno

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

ParameterTypeRequiredDescription
hoursnumberno
limitnumberno

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

ParameterTypeRequiredDescription
domainstringyesCompany domain to look up (e.g. “acme.de”)