list-campaigns#List all campaigns in your workspace. Filter by status (draft, active, paused, completed) and paginate results.
{
"tool": "list-campaigns",
"arguments": {
"status": "draft",
"page": 0,
"limit": 0
}
}All 84 MCP tools, grouped by surface area. Generated directly from the live tool catalog — new tools appear here the moment we ship them.
Every tool runs as your workspace API key. Pass it once when you install the MCP server — the same key works across MCP, CLI, and REST.
npx -y pipeline-mcp --api-key YOUR_API_KEYCreate, run, pause, resume, and clone outreach campaigns.
list-campaigns#List all campaigns in your workspace. Filter by status (draft, active, paused, completed) and paginate results.
{
"tool": "list-campaigns",
"arguments": {
"status": "draft",
"page": 0,
"limit": 0
}
}get-campaign#Get detailed information about a specific campaign including settings, prospect count, and current status.
{
"tool": "get-campaign",
"arguments": {
"campaignId": "..."
}
}create-campaign#Create a new campaign in your workspace. The campaign will be created in draft status.
{
"tool": "create-campaign",
"arguments": {
"name": "...",
"workspaceId": "..."
}
}start-campaign#Start a campaign to begin executing its workflow.
{
"tool": "start-campaign",
"arguments": {
"campaignId": "..."
}
}pause-campaign#Pause an active campaign.
{
"tool": "pause-campaign",
"arguments": {
"campaignId": "..."
}
}resume-campaign#Resume a paused campaign.
{
"tool": "resume-campaign",
"arguments": {
"campaignId": "..."
}
}clone-campaign#Clone an existing campaign with a new name.
{
"tool": "clone-campaign",
"arguments": {
"campaignId": "..."
}
}Add, fetch, list, and manage prospects across campaigns and lists.
list-prospects#List prospects with optional filtering by campaign, status, or ICP score.
{
"tool": "list-prospects",
"arguments": {
"campaignId": "...",
"status": "pending",
"icpScoreMin": 0,
"page": 0,
"limit": 0
}
}get-prospect#Get the full prospect record: profile, company, ICP score + analysis, enrichments, agentExecutions (research/scoring/messaging history), conversion stage, conversation activity, and prospect_lists membership. Use this when you need everything about one prospect — for partial views (just profile or just stage), use the more specific tools.
{
"tool": "get-prospect",
"arguments": {
"prospectId": "..."
}
}add-prospect#Add a single prospect to a campaign. Thin wrapper over the bulk endpoint — for >1 prospect prefer add-prospects-bulk (same backend, one round-trip). Requires a valid LinkedIn profile URL (https://linkedin.com/in/...).
{
"tool": "add-prospect",
"arguments": {
"campaignId": "...",
"linkedinUrl": "..."
}
}add-prospects-bulk#Add multiple prospects to a campaign at once. Maximum 1000 per request. Each prospect must include a valid linkedinUrl (https://linkedin.com/in/<slug>); firstName/lastName/email/company/position are optional. Custom fields beyond those are stored as customFields. Returns { added, failed, errors, prospectListId }.
{
"tool": "add-prospects-bulk",
"arguments": {
"campaignId": "...",
"prospects": []
}
}remove-prospect#Remove a prospect from a campaign.
{
"tool": "remove-prospect",
"arguments": {
"prospectId": "...",
"campaignId": "..."
}
}get-prospect-stats#Get prospect statistics for a campaign including counts by status.
{
"tool": "get-prospect-stats",
"arguments": {
"campaignId": "..."
}
}list-prospect-lists#List all prospect lists in a workspace.
{
"tool": "list-prospect-lists",
"arguments": {
"workspaceId": "..."
}
}Campaign, account, ICP, and reply analytics for your workspace.
get-campaign-analytics#Get detailed analytics for a campaign including connection rates, reply rates, and message performance.
{
"tool": "get-campaign-analytics",
"arguments": {
"campaignId": "..."
}
}get-account-analytics#Get analytics for a connected LinkedIn account: connection accept rate, message reply rate, daily usage, and per-period totals. Pass linkedin_account_id (UUID of the linkedin_accounts row).
{
"tool": "get-account-analytics",
"arguments": {
"linkedin_account_id": "..."
}
}get-reply-analytics#Get reply rate analytics for a campaign.
{
"tool": "get-reply-analytics",
"arguments": {
"campaignId": "..."
}
}get-icp-distribution#Get ICP score distribution for prospects in a campaign.
{
"tool": "get-icp-distribution",
"arguments": {
"campaignId": "..."
}
}top-performers#Rank workspace campaigns by a metric (replies, completions, or connections). Returns the top N campaigns ordered by the chosen metric.
{
"tool": "top-performers",
"arguments": {
"metric": "replies"
}
}recent-replies#Cross-campaign feed of recent prospect replies in this workspace. Returns prospect, campaign, current conversation stage, and last message timestamp.
{
"tool": "recent-replies",
"arguments": {
"limit": 0,
"since": "..."
}
}compare-campaigns#Compare execution stats (total/completed/failed/completionRate) across 2-10 campaigns side-by-side.
{
"tool": "compare-campaigns",
"arguments": {
"campaignIds": []
}
}execution-progress#Detailed campaign progress with ETA — total prospects, completed, failed, completed today, % progress, and estimated days remaining based on current throughput.
{
"tool": "execution-progress",
"arguments": {
"campaignId": "..."
}
}pending-actions#Inspect the workflow queue for a campaign — list executions in pending or waiting status with their next action timestamp and current node.
{
"tool": "pending-actions",
"arguments": {
"campaignId": "..."
}
}failed-actions#Inspect failed executions for a campaign — list each failed prospect with the last error message and retry count for diagnosing campaign issues.
{
"tool": "failed-actions",
"arguments": {
"campaignId": "..."
}
}Connected accounts, daily usage, InMail balance, profile lookups.
list-linkedin-accounts#List all LinkedIn accounts connected to a workspace.
{
"tool": "list-linkedin-accounts",
"arguments": {
"workspaceId": "..."
}
}get-linkedin-account#Get details of a specific LinkedIn account.
{
"tool": "get-linkedin-account",
"arguments": {
"accountId": "..."
}
}get-daily-usage#Get daily usage statistics for a LinkedIn account.
{
"tool": "get-daily-usage",
"arguments": {
"accountId": "..."
}
}get-inmail-balance#Get InMail credit balance for a LinkedIn account.
{
"tool": "get-inmail-balance",
"arguments": {
"accountId": "..."
}
}send-connection-request#Send a LinkedIn connection request to a profile.
{
"tool": "send-connection-request",
"arguments": {
"accountId": "...",
"profileUrl": "..."
}
}get-linkedin-profile#Look up a LinkedIn profile by URL.
{
"tool": "get-linkedin-profile",
"arguments": {
"profileUrl": "...",
"accountId": "..."
}
}Status of workflow runs powering each campaign.
get-workflow-status#Get the execution status of a campaign workflow, including progress %, ETA, pending actions, and failed actions. Use detail=summary (default) for high-level status, detail=full for pending + failed action lists.
{
"tool": "get-workflow-status",
"arguments": {
"campaignId": "..."
}
}Read and search conversation threads from connected inboxes.
list-conversations#List LinkedIn conversations with filtering options.
{
"tool": "list-conversations",
"arguments": {
"campaignId": "...",
"status": "...",
"page": 0,
"limit": 0
}
}get-conversation#Get a specific conversation and its messages.
{
"tool": "get-conversation",
"arguments": {
"conversationId": "..."
}
}search-conversations#Search conversations by text.
{
"tool": "search-conversations",
"arguments": {
"query": "..."
}
}Build, enrich, and ship spreadsheet-style prospect tables.
list-tables#List all enrichment tables in a workspace.
{
"tool": "list-tables",
"arguments": {
"workspaceId": "..."
}
}get-table#Get details of a specific enrichment table.
{
"tool": "get-table",
"arguments": {
"tableId": "..."
}
}create-table#Create a new enrichment table in a workspace. The minimum is { name, workspaceId } — everything else is optional. You can pre-seed columns, point at a sourceType (webhook/rss/crm/job-scraper/etc), attach to a workbook, opt in to AI messages, or pre-configure enrichmentOptions (companyEnrichment / icpScoring / messaging) so the table is ready to enrich on first row.
{
"tool": "create-table",
"arguments": {
"name": "...",
"workspaceId": "..."
}
}add-table-rows#Add rows to an enrichment table.
{
"tool": "add-table-rows",
"arguments": {
"tableId": "...",
"rows": []
}
}get-table-rows#Get rows from an enrichment table with pagination.
{
"tool": "get-table-rows",
"arguments": {
"tableId": "..."
}
}add-table-column#Add a column to an enrichment table. The column id auto-generates if omitted. Type must be one of the supported column kinds (text/number/currency/date/url/email/image/checkbox/select/formula/enrichment/action/source/signal-type).
{
"tool": "add-table-column",
"arguments": {
"tableId": "...",
"name": "...",
"type": "text"
}
}get-enrichment-job-status#Check the status of an enrichment job.
{
"tool": "get-enrichment-job-status",
"arguments": {
"jobId": "..."
}
}export-table-csv#Export an enrichment table as a CSV download URL.
{
"tool": "export-table-csv",
"arguments": {
"tableId": "..."
}
}send-table-to-campaign#Send all rows from an enrichment table to a campaign as prospects.
{
"tool": "send-table-to-campaign",
"arguments": {
"tableId": "...",
"campaignId": "..."
}
}list-enrichment-providers#List available enrichment providers for a workspace.
{
"tool": "list-enrichment-providers",
"arguments": {
"workspaceId": "..."
}
}create-table-from-search#Run a LinkedIn search (people or companies) and materialize the results into a new enrichment table. Requires connected LinkedIn account via Unipile.
{
"tool": "create-table-from-search",
"arguments": {
"accountId": "...",
"searchType": "people",
"searchParams": {}
}
}Track competitor posts, hiring, funding, and other buying signals.
list-signals#List buying signals detected in your workspace.
{
"tool": "list-signals",
"arguments": {
"workspaceId": "..."
}
}list-signal-trackers#List all signal trackers in a workspace.
{
"tool": "list-signal-trackers",
"arguments": {
"workspaceId": "..."
}
}create-signal-tracker#Create a signal tracker. Auto-provisions a backing enrichment table (or companies+people tables for web-scout types) that you can then enrich and push to a campaign. Response includes trackerId plus enrichment_table_id (or companies_table_id + people_table_id for hiring/funding/ai_discovery) for downstream use with send-table-to-campaign. Supported types and required fields: - keyword: keywords (string[]) - own_post_engagers / competitor_post_engagers: monitored_post_url - hiring / funding / ai_discovery: no keywords required; set search_provider + credential_id Requires workspace-configured search provider key (Tavily/Exa/Firecrawl/Serper) for hiring/funding/ai_discovery types.
{
"tool": "create-signal-tracker",
"arguments": {
"name": "...",
"type": "keyword"
}
}pause-signal-tracker#Pause a signal tracker.
{
"tool": "pause-signal-tracker",
"arguments": {
"trackerId": "..."
}
}resume-signal-tracker#Resume a paused signal tracker.
{
"tool": "resume-signal-tracker",
"arguments": {
"trackerId": "..."
}
}add-signal-to-campaign#Add a signal to a campaign to auto-enroll matching prospects.
{
"tool": "add-signal-to-campaign",
"arguments": {
"signalId": "...",
"campaignId": "..."
}
}Read-only scrape feeds. Chain with add-prospects-bulk to push curated rows.
list-post-engagers#Return the raw list of people who commented on or reacted to a LinkedIn post. READ-ONLY: no campaign, table, or prospect records are created. Use this when you want to enrich, filter, or qualify the list yourself (e.g. with WebSearch/WebFetch) before pushing a curated subset to a campaign via add-prospects-bulk. For the automated pipeline (scrape → auto-enrich → campaign on a cron), use create-signal-tracker with type=competitor_post_engagers instead.
{
"tool": "list-post-engagers",
"arguments": {
"postUrl": "...",
"linkedinAccountId": "..."
}
}list-profile-followers#Return the raw follower list for the LinkedIn account attached to the given linkedinAccountId (the user's own profile). READ-ONLY: no campaign, table, or prospect records are created. Pair with add-prospects-bulk after you filter/enrich externally.
{
"tool": "list-profile-followers",
"arguments": {
"linkedinAccountId": "..."
}
}list-company-followers#Return the raw follower list for a LinkedIn company page. READ-ONLY: no campaign, table, or prospect records are created. Pair with add-prospects-bulk after you filter/enrich externally.
{
"tool": "list-company-followers",
"arguments": {
"companyUrl": "...",
"linkedinAccountId": "..."
}
}Generate, publish, schedule, and strategise LinkedIn content.
generate-content#Generate a LinkedIn / Twitter / YouTube post using the workspace voice config + inspiration corpus + intelligence context. The route requires workspace_id as a query param (auto-injected from the API key when present). Returns hook + body + cta + alternatives + reasoning.
{
"tool": "generate-content",
"arguments": {
"topic": "..."
}
}list-posts#List content posts in a workspace.
{
"tool": "list-posts",
"arguments": {
"workspaceId": "..."
}
}get-post#Get a specific content post.
{
"tool": "get-post",
"arguments": {
"postId": "..."
}
}publish-post#Publish a content post to LinkedIn IMMEDIATELY via Unipile. The post must already have a LinkedIn account associated (set when generated). Returns the live LinkedIn post URL on success. Use schedule-post if you want a delay/safety window before it goes live.
{
"tool": "publish-post",
"arguments": {
"postId": "..."
}
}schedule-post#Schedule a content post to publish at a future time. The cron worker will pick it up and publish via Unipile when scheduled_at is reached. Use this instead of publish-post when you want a confirmation window (e.g. schedule for 10 minutes from now so a human can sanity-check). To cancel a scheduled post before it publishes, the user does that in the UI.
{
"tool": "schedule-post",
"arguments": {
"postId": "...",
"scheduled_at": "..."
}
}get-content-strategy#Get the content strategy for a workspace.
{
"tool": "get-content-strategy",
"arguments": {
"workspaceId": "..."
}
}generate-content-strategy#Generate a content strategy using AI.
{
"tool": "generate-content-strategy",
"arguments": {
"workspaceSlug": "..."
}
}AI-driven sentiment classification on incoming replies.
analyze-sentiment#Run the SentimentAgent on a conversation: classifies the prospect across 7 stages (cold → engaged → meeting_request → objection → not_interested → unsubscribed → spam) and updates the conversation_contexts row. Pass the full conversation object plus its messages — the agent uses the message thread, not the chat_id alone.
{
"tool": "analyze-sentiment",
"arguments": {
"conversation": {}
}
}People and company search across the prospect database.
search-people-database#LinkedIn people search via Unipile (the same search the UI uses). Goes through a connected LinkedIn account — Classic search by default, Sales Navigator/Recruiter if the account has them. Supports keywords, title, location, industry, current/past company, network distance, seniority, function, school, etc. Pass cursor for pagination. Returns { results, totalCount, cursor, planType }.
{
"tool": "search-people-database",
"arguments": {
"accountId": "...",
"params": {}
}
}search-companies-database#LinkedIn company search via Unipile (the same search the UI uses). Goes through a connected LinkedIn account. Pass params with category="companies" plus filters like keywords, industry[], location[], company_headcount[]. Returns { results, totalCount, cursor, planType }.
{
"tool": "search-companies-database",
"arguments": {
"accountId": "...",
"params": {}
}
}Workspace metadata and credit balance.
get-workspace#Get workspace information.
{
"tool": "get-workspace",
"arguments": {
"workspaceId": "..."
}
}get-workspace-credits#Get the workspace owner's subscription state in one call: planType (starter/pro/etc), status, isAdmin, trialEnd, trialDaysRemaining, isTrialActive, totalSeats, usedSeats, currentPeriodEnd, and creditsBalance. Resolves to the workspace owner so all members see the same plan.
{
"tool": "get-workspace-credits",
"arguments": {
"workspaceId": "..."
}
}Move prospects between pipeline stages and add notes.
get-crm-pipeline#Get the workspace CRM kanban: prospects grouped by conversionStage (connected, replied, interested, meeting_request, qualified, meeting_scheduled, meeting_completed, won, lost, not_interested, unqualified). Excludes prospects still in the initial "prospect" stage. Each card includes ICP score, last activity timestamp, and any active conversation chat_id/account_id.
{
"tool": "get-crm-pipeline",
"arguments": {
"workspaceId": "..."
}
}move-prospect-stage#Move a prospect along the CRM funnel by setting their conversionStage. Stage must be one of the canonical ConversionStage values. This updates conversionStageUpdatedAt so the kanban reorders correctly.
{
"tool": "move-prospect-stage",
"arguments": {
"prospectId": "...",
"stage": "prospect"
}
}add-prospect-note#Add a note to a prospect.
{
"tool": "add-prospect-note",
"arguments": {
"prospectId": "...",
"note": "..."
}
}ICP profile, GTM context, and live ICP scoring.
get-icp-profile#Get the ICP profile for a workspace.
{
"tool": "get-icp-profile",
"arguments": {
"workspaceId": "..."
}
}get-gtm-context#Read the workspace's full GTM context: personas (who you sell to + their pain points), offerings (what you sell + positioning), demand gen offers (what you pitch in outreach), case studies, ICP criteria, and company/service descriptions. Use this BEFORE generating messages, evaluating "does this prospect fit," or recommending campaigns — it gives you the ground truth the UI workflow assistant and internal pipeline already rely on. Returns { configured: boolean, hint?: string } so you can detect incomplete setup and nudge the user to finish onboarding.
{
"tool": "get-gtm-context",
"arguments": {
"workspaceId": "..."
}
}score-prospect#Score a prospect against the workspace ICP.
{
"tool": "score-prospect",
"arguments": {
"prospectId": "...",
"workspaceId": "..."
}
}Domain and prospect blocklist management.
list-blocklist#List blocked domains and profiles.
{
"tool": "list-blocklist",
"arguments": {}
}add-to-blocklist#Add a domain or profile to the blocklist.
{
"tool": "add-to-blocklist",
"arguments": {
"value": "...",
"type": "domain"
}
}check-blocklist#Check if a domain or profile is blocklisted.
{
"tool": "check-blocklist",
"arguments": {
"value": "..."
}
}Composite tools that chain multiple steps into a single call.
zero-to-outreach#ONE-TIME list import pipeline. Import a static Sales Navigator list URL or a CSV of prospect rows, enrich each row, build a campaign, optionally auto-start. Returns a jobId — poll get-job to track progress. For ONGOING LinkedIn signal monitoring (competitor post engagers, own post engagers, hiring signals, funding signals, AI mentions), use create-signal-tracker instead — that tool sets up a cron that keeps scraping new prospects on a schedule, this one does not.
{
"tool": "zero-to-outreach",
"arguments": {
"workspaceId": "...",
"mode": "sales_nav"
}
}build-campaign-from-table#Create a campaign from an enrichment table. Optionally filter rows by ICP score or required fields before adding as prospects.
{
"tool": "build-campaign-from-table",
"arguments": {
"tableId": "...",
"workspaceId": "...",
"campaignConfig": {}
}
}Poll and cancel long-running async jobs (e.g. zero-to-outreach).
get-job#Poll the status of an async MCP job (e.g. zero-to-outreach). Returns progress, status, and result when complete.
{
"tool": "get-job",
"arguments": {
"jobId": "..."
}
}cancel-job#Cancel a running async MCP job.
{
"tool": "cancel-job",
"arguments": {
"jobId": "..."
}
}Send LinkedIn messages programmatically.
send-message#Send a LinkedIn message in a conversation.
{
"tool": "send-message",
"arguments": {
"conversationId": "...",
"linkedinAccountId": "...",
"message": "..."
}
}Approve, edit, or reject AI-generated reply drafts.
list-drafts#List pending AI message drafts awaiting approval.
{
"tool": "list-drafts",
"arguments": {}
}approve-draft#Approve an AI message draft so it gets sent.
{
"tool": "approve-draft",
"arguments": {
"draftId": "..."
}
}edit-draft#Edit an AI message draft before approving.
{
"tool": "edit-draft",
"arguments": {
"draftId": "...",
"message": "..."
}
}reject-draft#Reject an AI message draft.
{
"tool": "reject-draft",
"arguments": {
"draftId": "..."
}
}