Skip to main content
Glama
625,078 tools. Updated 2026-09-30 16:40

"A method for finding people on LinkedIn and organizing them in a CSV" matching MCP tools:

  • Schedule multiple posts at once from CSV content. USE THIS WHEN: • User has a spreadsheet or list of posts to schedule • Planning a content calendar for a month • Migrating content from another tool CSV FORMAT (required columns): • platform: linkedin, instagram, x, tiktok, threads • scheduled_time: ISO 8601 format (e.g., 2024-02-15T10:00:00Z) • text: Post content/caption OPTIONAL COLUMNS: • media_url: Image or video URL • first_comment: First comment to add (Instagram/LinkedIn) • hashtags: Additional hashtags to append PROCESS: 1. First call with validate_only: true to check for errors 2. Review validation report with user 3. Call again with validate_only: false to execute import
    ConnectorNo auth
  • <summary>Fetch the user's full LinkedIn message history with one person, live from LinkedIn (via Unipile), when the local store isn't enough. Query the local store with `search_linkedin_message_history` first. Reach for this tool only when that misses, when you need messages older than the roughly two-week local backfill window, or when you must be certain whether a conversation exists — this reads LinkedIn's own synced history, so an empty result here means no such conversation, not merely "outside the local window". Fetched messages are written back to the local store, so a later `search_linkedin_message_history` sees them too. This is not a name-lookup tool: pass the person's LinkedIn provider_id, sourced from a prospect row, `search_linkedin_connections`, or a prior local message — never guessed from a name.</summary> <returns> <description>On success, a dict with `success=True`, `chat_id` (pass to `setup_linkedin_sequence` with action_type='message' to reply), `count`, `truncated` (True when older messages exist beyond the fetch cap), `messages` — newest first, each with `direction` ('sent'/'received', or 'unknown' when LinkedIn omits the sender flag), `message_datetime` (ISO), and `content` (truncated to 1000 chars) — and `connection_request_note`: the note on your accepted connection request, which LinkedIn replays into the chat when they accept, as `message_datetime` + `content` (null when there's none). It's the invite, not a message you sent them, so it's kept out of `messages` and `count`. On failure, `success=False` and `error`; an error that mentions reconnecting means the user must reconnect LinkedIn in Settings.</description> </returns>
    ConnectorOAuth
  • Search LinkedIn people. RECOMMENDED FOR PROSPECTING: set decisionMakers:true, provide company, departments and limit 20-30. Salesbot resolves the company, performs ONE company-scoped provider search (Sales Navigator also applies seniority), then ranks the returned senior employees locally by department. This is broader and safer than retrying exact titles. Use title/titles only when an exact role is required. EXISTING CONNECTIONS reads only the local cache and consumes zero search quota. The workspace setting selects Standard/Classic or Sales Navigator automatically. Respect retry_after; never immediately retry a protected or timed-out request. On LINKEDIN_PROVIDER_TIMEOUT use search_google_xray, then retry LinkedIn only after the stated delay.
    ConnectorNo auth
  • Ask CampaignStack to send one InMail to someone the owner is not connected to, from a connected LinkedIn account. Call this when the user has confirmed subject and body for a named person the owner is not connected to; for a connected lead use campaignstack_send_message instead. platform is required ("linkedin"; InMail is a LinkedIn-only premium product and needs Premium, Sales Navigator or Recruiter on the sending account, so a free account has a budget of zero here). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. subject is capped at 200 characters and messageText at 1900. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. It goes out as soon as this call succeeds: there is no draft state and nothing to recall. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
    Connector
    Destructive
    API key
  • Search a global professional database in plain English (for example 'Heads of Marketing at Series B SaaS in New York') and get a sample of matching people plus the true total match count. Results are masked previews (a masked name, role, industry, company size and location) and each one carries an opaque `token`. Searching is FREE and spends no credits: use it to validate that the right people exist before you pay. If nothing matches exactly, the least essential filters are dropped automatically and `broadenedBy` names them. To get a person's real name, LinkedIn and verified email, pass their token to reveal_profile, or use find_people to unlock a batch in one call.
    ConnectorNo auth
  • Synchronize one provider-safe page (at most 500) of the API-key owner's 1st-degree LinkedIn relations into the local workspace cache. This is a provider read, not a LinkedIn people search, and does not consume the search quota. The server persists continuation state and atomically enforces a 15–20 minute delay, four-page hourly cap, and twelve-page daily cap across UI and MCP. Respect RELATIONS_SYNC_PROTECTED retry_after_seconds before continuing.
    ConnectorNo auth

Matching MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables any MCP-compatible AI assistant to search, filter, and retrieve information from a local document collection using a hybrid search pipeline with vector, BM25, reranking, and LLM enrichment.
    4
    -

Matching MCP Connectors

  • Permit-verified ADU rentals, pre-approved plans and cited ADU rules for LA, San Diego, SF and NYC.

  • AI agents hire a human to observe, log or film on site. Typed results, feasibility before payment.

  • Get unique, self-distributable signing links for a document — one per recipient — so the sender can hand out the links over any channel instead of relying on Formify's email/SMS/WhatsApp invitation. Use this for signees created with disableInvitationMessage: true (Formify did not invite them), or whenever the user wants to distribute a signing link themselves. SECURITY: every returned link is verification-locked. Opening one requires a one-time code that Formify sends to the recipient's contact method on file (the email/phone provided), never to a value the opener types in — so a leaked or forwarded link cannot be opened by anyone else. The lock is enforced automatically in the browser when the recipient opens the link; no extra calls are needed. Simply deliver the signingUrl. The response contains one entry per recipient signing share: signeeId, fullName, emailAddress/phoneNumber (contact on file), verificationChannel ('email' | 'sms' | 'whatsapp'), signingUrl, and requiresVerification (always true). A recipient given BOTH an email and a phone is returned as TWO entries (same signeeId, one per verificationChannel) — present both and let the user choose which to distribute. A recipient with no contact method on file cannot be verified, so they are omitted from the response entirely. This cannot be repaired on a sent document: update_signee can change an existing contact method but never add one. If a link is needed for such a recipient, revoke the document and send a new one with an email or phone number for them. Recipients created through the API always have at least one contact method, so this mainly affects documents created elsewhere. Calling this generates and persists the links on first use (idempotent on later calls). Only works on a sent document, not a draft.
    ConnectorOAuth
  • <summary>Set up recurring LinkedIn post monitoring on an agent. Each discovered post gets one or both of two independent actions: `draft_comments` queues a cheap-drafted comment for the user to approve; `fetch_engagers` captures the people who react/comment on the post over its first week and wakes this agent with a `new_post_engagers` event so you can collect them. Both off is a valid "surface-only" monitor: it still discovers posts into the Monitored Posts feed for the user to react or comment on manually. An agent can host several named monitors. `mode='network'` watches the user's whole 1st-degree feed; `mode='list'` watches an explicit set of people — pass `members` as their LinkedIn profile URLs or vanity slugs; `mode='topic'` searches all of LinkedIn for posts matching `keywords`, beyond the user's network. Watching the user's own profile (their URL in `members`) is how a user gets engager capture on their own posts. `writing_instructions` steer the comment voice. Kicks off the first run immediately, then runs on `run_weekdays` (default Mon/Thu, in the user's timezone). That first run covers only the members present at creation, and `edit_monitor_members` starts no run — so create a `list` monitor with its complete membership in this one call (assemble a large or query-derived list in `run_code` and pass the whole variable), since members added afterward miss the backlog their first scheduled run would have caught. Comments land in the approval queue by default — they post without review only if the user has enabled auto-approve for the `linkedin_comment` subtype. `list` mode works even when the user hasn't connected LinkedIn: discovery is cookieless and drafting never touches their session, so drafted comments hold in the approval queue and post once they connect. `network`/`topic` discover through the user's own LinkedIn session, so those two need it connected first. Schedule and recency are per-monitor. `run_weekdays` is which days the monitor runs — weekday ints Mon=0 … Sun=6 in the user's local timezone (e.g. `[3]` = Thursdays only, `[0,1,2,3,4]` = every weekday). `recency_days` is how fresh a post must be to earn a drafted comment: only posts published within that many days are commented on (default 7, max 7). Set these when the user asks for a cadence ("once a week on Thursdays") or freshness rule ("only comment on posts from the last 3 days") — those are the knobs, not the agent goal text. A `recency_days` shorter than the gap between runs deliberately skips the older posts in that gap: narrow it for a user who wants only the freshest posts, or to trim a `list` monitor's per-post cost (see Cost — a shorter window pulls fewer posts, though the per-profile floor dominates a large list's cost). Leave it at the default week to comment on everything since the last run. Omitting `run_weekdays`, `recency_days`, or (on a list monitor) `members` on a re-setup keeps the monitor's current value; the other fields overwrite on every re-setup, so re-pass `writing_instructions`/`draft_comments`/`fetch_engagers`/`engager_icp`/ `comment_scope`/`engager_instructions` when editing rather than dropping them. For membership tweaks (add or drop a few people) use `edit_monitor_members` — it takes only the changes, so you never re-echo the whole list (dropping a URL on the re-echo silently stops watching that person). Cost: a queued drafted comment costs 1 credit (all modes). `list` mode additionally bills for the paid cookieless scraper's per-event usage (1 credit = $0.10): 0.04 credit per post it returns plus 0.02 credit per watched profile that posted nothing in the window — every watched profile is billed on every scheduled run whether or not it posted, so the per-profile floor (not the per-post charge) dominates a large list. That floor is a hard minimum: a run costs at least `0.02 × number of watched profiles` (a silent profile exactly that, a posting one more), so a 2,000-profile list is ≥ 40 credits every scheduled day. Because that recurs per run, recommend a reduced cadence for a large list: the default is Mon/Thu, and for lists in the high hundreds or more, suggest weekly (`run_weekdays=[0]`). Other levers are trimming the member list; narrowing recency_days only trims the smaller per-post component. Flag this to the user when setting up a `list` monitor, especially a big one; a zero-balance list monitor won't run at all (even for engager capture). `network`/`topic` discovery is free (Unipile session). `fetch_engagers` has two optional companions, both handed to the woken `new_post_engagers` run on the event. `engager_icp` filters WHO is collected (ICP, titles, exclusions); blank collects everyone. `engager_instructions` decides WHAT HAPPENS to them; blank means they are recorded into the agent's Output list and nothing else is done. Capture never sends outreach on its own — if the user wants a sequence or a connection request, it has to be spelled out in `engager_instructions`. `keywords` is a LinkedIn boolean query. Combine topics with OR and quote multi-word phrases: `"creator economy" OR "influencer marketing"`. AND narrows, NOT excludes, and parentheses group: `("seed" OR "series a") AND fundraising`. Operators must be UPPERCASE (lowercase and/or/not are read as literal words). The combined AND+OR count is capped by the user's LinkedIn plan (free/premium 5, Sales Navigator 15, Recruiter unlimited; NOT doesn't count) — past the cap LinkedIn silently returns nothing, so cover many topics with several monitors each within the cap, not one giant OR. A single unquoted topic (`fundraising`) is fine. A malformed query (unbalanced quotes/parens, dangling operators) is rejected. For `network`, leave `keywords` empty in almost all cases — the feed is already ranked and the per-post draft step skips anything not worth commenting on; set a narrow query only when the user wants one specific slice. `list` mode ignores `keywords` — it watches the named people's recent posts directly, and the draft step is the relevance gate. For `mode='topic'`, `keywords` is required and is the only filter. Reusing an existing `name` updates that monitor (and re-activates it if it was stopped) — this is also how you edit one. Prefer `edit_monitor_members` for a list monitor's membership; reserve setup's `members` for the monitor's full initial membership or a deliberate full reset.</summary> <returns> <description>Dict with status ('active' or 'error'), name, message, and additional keys.</description> </returns>
    ConnectorOAuth
  • <summary>Find phone numbers for one or more people from their LinkedIn URLs, via Airscale. Pass a list of LinkedIn profile URLs — one entry for a single person, all of them at once for a batch (they are looked up in parallel, costing one tool call against the loop guard, not N). Returns one result per URL in the same order. Airscale brokers providers like RocketReach. Persists nothing — use the returned numbers however the agent needs them (e.g. tell the user, or stash them on prospects via `update_prospect`). A LinkedIn profile URL is the only accepted input — this tool cannot look a person up by email or name. When a record (a HubSpot/CRM contact, a prospect row, a spreadsheet line) has no LinkedIn URL but does have the person's email, first call `find_linkedin_url(email=...)` to resolve one, then pass that URL here. Apply this resolve-then-lookup step to every record, not just the first; skip the phone lookup for any person you cannot get a URL for. Costs 8 Sliq credits per number found, when run on Sliq's shared Airscale account. Misses (no number on file) and upstream failures are free. A worst-case check runs up front on the Sliq path: the whole batch is refused unless the balance covers 8 credits per URL (any URL *could* be a hit). So no API call is ever spent on a lookup that can't be billed, and a user low on credits is told to top up or connect their own key. If the user has connected their own Airscale key (BYO, via the integrations page), lookups run against that account instead — no Sliq credit gate and no Sliq credit charge.</summary> <returns> <description>A list of result dicts in input order. Per hit: `{status: 'success', found: True, phone_number, phone_numbers, provider, linkedin_url, credits_charged: 8}` (0 on the BYO path) — `phone_number` is the first number, `phone_numbers` the full list. Per miss: `{..., found: False, phone_number: None, phone_numbers: [], credits_charged: 0}`. A malformed (non-LinkedIn) URL or an upstream failure on one URL becomes a per-item `{found: False, error, credits_charged: 0}` in that slot — it never aborts the rest of the batch. If the up-front worst-case credit check fails, it raises `InsufficientCreditsError` (no lookups are attempted).</description> </returns>
    ConnectorOAuth
  • Update the LinkedIn channel settings of an existing DRAFT wizard campaign: native objective, bidding optimization goal (including Reach), bid strategy with manual bid amount, and the LinkedIn conversion actions the campaign optimizes toward. These are the settings the platform UI shows in the LinkedIn channel drawer of the campaign draft page (Native Objective, Bidding Optimization Goal, Bid, Conversion Actions). The campaign MUST already have its LinkedIn channel enabled (via create_campaign / add_and_edit_campaign_elements with a `linkedin` block). WARNING: DRAFT-ONLY: the platform rejects these edits once the campaign is Launching/Launched. KEYWORDS: linkedin, linkedin campaign, linkedin settings, campaign settings, draft campaign, objective, native objective, brand awareness, website visits, engagement, video views, bidding optimization goal, optimization goal, reach, impressions, landing page clicks, engagement clicks, bid, bid strategy, auto bid, manual bid, maximum delivery, conversion, conversions, conversion actions, conversion tracking, insight tag, settings WHEN TO USE: - Set the LinkedIn native objective (e.g. Brand Awareness instead of the default Engagement) - Optimize a Brand Awareness campaign for REACH instead of IMPRESSIONS - Switch between auto bid (LinkedIn maximum delivery) and a manual bid - Pick which LinkedIn conversion actions the campaign optimizes toward and reports on PARAMETERS (campaign_id required; everything else optional, and an unspecified setting keeps its current value on the channel): - campaign_id: the wizard campaign ID - objective: BRAND_AWARENESS | WEBSITE_VISIT | ENGAGEMENT | VIDEO_VIEW, the LinkedIn native objective. Only selectable on Brand Awareness (CTR) campaigns: a Lead Gen (CPL) campaign derives it from its offer at launch (lead-gen form -> LEAD_GENERATION, landing page -> WEBSITE_CONVERSION). The platform default for a new LinkedIn channel is ENGAGEMENT. Every ad already on the channel must be supported by the objective (VIDEO_VIEW is video-only, MESSAGE ads only fit WEBSITE_VISIT, DOCUMENT ads lock the objective, a video-only channel accepts only ENGAGEMENT or VIDEO_VIEW). A channel holding CTV ads is always Brand Awareness / Reach at launch and cannot be changed here. Changing the objective also resets the cost type and the bidding optimization goal to the objective's default (BRAND_AWARENESS -> IMPRESSIONS, WEBSITE_VISIT -> LANDING_PAGE_CLICKS, ENGAGEMENT -> ENGAGEMENT_CLICKS, VIDEO_VIEW -> VIDEO_VIEWS), so pass bidding_optimization_goal in the same call when you want something else. - bidding_optimization_goal: what LinkedIn optimizes delivery for. Allowed per objective: BRAND_AWARENESS -> IMPRESSIONS | REACH; WEBSITE_VISIT -> LANDING_PAGE_CLICKS | IMPRESSIONS; ENGAGEMENT -> ENGAGEMENT_CLICKS | IMPRESSIONS; VIDEO_VIEW -> VIDEO_VIEWS | IMPRESSIONS. Conversation and Message ads are always IMPRESSIONS. CTR campaigns only. - bid_strategy: AUTO_BID (LinkedIn "maximum delivery", what the campaign builder applies by default) or MANUAL_BID (needs bid_amount). CTV ads REQUIRE AUTO_BID; Spotlight and Text ads REQUIRE MANUAL_BID. - bid_amount: manual bid in the account currency, used only with MANUAL_BID. - conversion_action_ids: ids of LinkedIn conversion actions (from list_linkedin_conversions) the campaign should optimize toward and count as conversions: website visits, URL-rule page views, lead form fills. REPLACES the current selection; pass [] to clear it (the campaign then falls back to the account's default Insight Tag URL match). Every id must exist and be enabled on the connected LinkedIn account, or launch validation fails. NOTE: the platform UI only shows this picker for campaigns with landing-page offers and an objective other than Brand Awareness; ids stored outside that case are still sent to LinkedIn at launch, but that path is not exercised by the UI. NOT SETTABLE ANYWHERE IN THE PLATFORM (say so instead of promising them): LinkedIn Audience Network on/off and its category exclusions, audience expansion (campaigns always launch with expansion OFF), frequency caps, Thought Leader ads. LinkedIn geo targeting is not a channel setting either: it lives on the audience / target group. EXAMPLES: Brand Awareness optimized for Reach on auto bid: update_linkedin_channel_settings({"campaign_id": 12345, "objective": "BRAND_AWARENESS", "bidding_optimization_goal": "REACH", "bid_strategy": "AUTO_BID"}) Track two conversion actions on a Website Visits campaign: update_linkedin_channel_settings({"campaign_id": 12345, "conversion_action_ids": ["123456", "234567"]}) RESPONSE: {success, campaign_id, channel_id, campaign_status, campaign_goal, channel_ad_types, applied:{...}, errors?}. `applied` echoes exactly what was pushed to the platform. INTEGRATION WITH OTHER TOOLS: - list_linkedin_conversions lists the conversion actions available on the account - search_campaigns_by_names / get_campaign_by_wizard_id to find the campaign - The LinkedIn channel is enabled by create_campaign or add_and_edit_campaign_elements - check_campaign_launch_readiness validates the result before launch
    Connector
    Destructive
    API key
  • Create a **LinkedIn Engagement Retargeting** audience: people who already engaged with the advertiser's LinkedIn ads, company page, or website. STEP 3 of the flow. This is NOT create_retargeting_audience, which imports an audience the ad account already has. This builds a NEW LinkedIn DMP segment from the engagement rule defined here. Once built it is a normal Metadata audience and can be attached to campaigns. **REQUIRED WORKFLOW — do not call this tool first:** 1. get_linkedin_engagement_source_types → choose `source_platform` + `engagement_trigger` 2. For every source type EXCEPT WEBSITE: search_linkedin_engagement_sources with that trigger and lookback → collect each chosen result's `id` into `engagement_source_urns` 3. Call this tool Source types, triggers and URNs are LinkedIn's own values, and only steps 1 and 2 can supply them. Do not invent, guess or reuse one from another account: a value that did not come from those steps either fails outright or, worse, is accepted and builds an audience that never populates. **TWO SHAPES, MUTUALLY EXCLUSIVE — mixing them is rejected:** A) NON-WEBSITE (VIDEO_ADS, SINGLE_IMAGE_ADS, DOCUMENT_ADS, CONVERSATION_ADS, LEAD_GEN_FORMS, ORGANIZATION_PAGES): pass `engagement_source_urns`. Do NOT pass page_set_name or url_match_groups. B) WEBSITE: pass `page_set_name` and `url_match_groups`. Do NOT pass engagement_source_urns. Metadata creates the LinkedIn page set from those URL rules for you. URL MATCH RULES (WEBSITE only) are a LIST OF GROUPS. Rules inside a group are ANDed; the groups are ORed. Each rule is {matchType, matchValue}, matchType being EXACT ("URL equals"), STARTS_WITH, or CONTAINS. [[A, B], [C]] means (A AND B) OR C Worked example — "anyone who hit pricing or any demo page": [[{"matchType": "STARTS_WITH", "matchValue": "https://example.com/pricing"}], [{"matchType": "CONTAINS", "matchValue": "/demo"}]] Use one rule per group for a simple OR list, which is what most requests mean. Reach for a multi-rule group only for a genuine AND, e.g. a path that also carries a campaign parameter. WHEN TO USE: - "Retarget everyone who watched our video ads in the last 90 days" - "Build an audience from people who submitted the lead form" - "Create an audience of visitors to our pricing and demo pages" - "Retarget people who visited our LinkedIn company page" - "Make a warm audience from last quarter's ad engagement" PARAMETERS: - name: audience name (required). Give it something descriptive of the rule, e.g. "Video 50% viewers 90d", so it is recognisable in the audience list later. - source_platform: the chosen `engagementSourceType` (required) - engagement_trigger: a trigger listed for THAT source type (required). NOTHING VALIDATES THE PAIRING — see the warning below. - lookback_window_days: 30, 60, 90, 180 or 365 — WEBSITE caps at 180 (required) - engagement_source_urns: LinkedIn URNs from search_linkedin_engagement_sources, copied verbatim. Required for every source type except WEBSITE. Several are normal: the audience is everyone who engaged with ANY of them. - page_set_name: internal label for the URL rule set (WEBSITE only, required there). Only ever seen inside LinkedIn, so a plain descriptive label is fine. - url_match_groups: the OR-of-ANDs URL expression (WEBSITE only, required there) RETURNS: Confirmation with the new audience `id` and name, the `criteria` that define it (source, trigger, lookback, how many sources), the channel, and a `note` on when it becomes usable. **WHAT TO TELL THE USER AFTER IT SUCCEEDS:** It is created but not yet populated. LinkedIn takes up to 48 hours to build the audience and a further 24 hours before it delivers, so it will show NO match count and NO contact or company numbers immediately. That is expected and correct, not a failure. Say so plainly rather than reporting the audience as empty or broken. IMPORTANT NOTES: - **THE TRIGGER MUST BELONG TO THE SOURCE TYPE, AND NOTHING CHECKS THAT FOR YOU.** A mismatched pair (e.g. VIDEO_ADS with LEAD_FORM_SUBMIT) is accepted by this tool, by the platform and by LinkedIn, with no error at any layer — it just builds an audience that can never populate, because the engagement it describes cannot happen. Verified on stage. Always take the trigger from the source type's own `triggers` list in step 1; never carry one over from another source type. - Requires a connected LinkedIn channel on the account. - **NEVER re-create the audience because it shows no members.** Zero right after creation is the normal state; creating it again just makes a duplicate. - This audience type NEVER reports contact or company counts the way a firmographic audience does. It lives on LinkedIn, so only LinkedIn's own match count applies. - WEBSITE additionally requires the LinkedIn Insight Tag installed and active on the pages the URL rules match. Without it the audience stays empty indefinitely, no matter how long you wait — mention this whenever you build a WEBSITE audience. - The lookback window doubles as the retention window: it sets both how far back engagement counts and how long someone stays in the audience. - Building from sources with no engagement produces an empty audience. If step 2 showed zeros everywhere, raise that with the user instead of creating anyway. - The rule cannot be edited afterwards. A different trigger or lookback means a new audience, so confirm the choice before creating when the user was vague. COMMON ERRORS AND WHAT THEY MEAN: - "engagement_source_urns is required" — you skipped step 2, or passed a WEBSITE-style payload for a non-website source type. - "must be one of [30, 60, 90, 180]" — WEBSITE was given a 365-day lookback. - "page_set_name / url_match_groups is required" — WEBSITE needs the URL rules, not URNs.
    ConnectorAPI key
  • Run generic ordered enrichment steps independently over a list of rows (the CSV-style, per-column executor). Returns a summary with cost estimate, never raw rows. For one enrichment waterfall over several people, use hyreflow_tools_execute with `tool` plus `rows` instead — that is the stage-major path that batches at the provider. A row whose step reads `still_enriching` ENDS that row's chain and carries `job_id` + `resume` {tool, method, id_arg}; when it also carries `job` {provider, job_id}, fetch it later with hyreflow_enrich_job. It usually settles in 1-2 minutes; poll every 20-30s. A job that settles empty skipped the chain's later providers for that row — run the next one yourself. Never resend the row to finish it; that starts, and pays for, a second job.
    Connector
    Destructive
    OAuth
  • General-purpose Google search — returns organic results for any query. Unlike search_google_xray (LinkedIn-only), this searches the entire web. Useful for finding job postings on portals (jobs.cz, prace.cz, profesia.sk, indeed.com), company info, news, or any other web content. Results are NOT saved to contacts — use this for research and discovery. Capped at 4 calls per minute to protect the Serper/Google budget.
    ConnectorNo auth
  • Register a derived asset (LinkedIn carousel PDF, social post, video, image) produced from an article suggestion. Appends a distribution-ledger row so the suggestion shows everything it produced — the article plus its derivatives — for content-ROI reporting (get_article_suggestion returns them as derivedAssets). Pass `channel` (reels | youtube | x | linkedin) so the app can show per-channel distribution status; register again with a new URL for repeat posts on the same channel — every registration is kept. `scheduledFor` records a future post date from an external scheduler (Buffer etc.) for display only — VarynForge never posts on your behalf. Derivative rows never affect publish status or Search Console attribution; use mark_article_published for the article itself.
    ConnectorNo auth
  • Creates a Zeekeo LinkedIn campaign: sends a connection invite using invite_template_id, and optionally — if followup_template_id is given — waits for the invite to be accepted, then sends a follow-up message using that template. Create templates first with zeekeo_create_template. Provide exactly one of filter_url (a LinkedIn search results URL) or profile_urls (specific profiles) as the target. This starts REAL LinkedIn automation once the campaign has profiles in it — confirm with the user before calling. Requires the user to have connected their own Zeekeo Launchpad account. Direct them to rankparse.com/dashboard/integrations to connect it.
    ConnectorNo auth
  • Ask CampaignStack to send one connection request from a LinkedIn account the workspace owner connected. Call this when the user has named one specific person and confirmed sending the request. platform is required ("linkedin"; connection requests are a LinkedIn-only concept, and on other networks you follow instead with campaignstack_follow_profile). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. An optional note is capped at 300 characters by LinkedIn. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. It goes out as soon as this call succeeds: there is no draft state and nothing to recall. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
    Connector
    Destructive
    API key
  • Ask CampaignStack to follow a profile from a connected LinkedIn account, so their posts reach the owner's feed. Call this when the user asks to follow a specific person. platform is required (currently "linkedin"). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). A follow is visible to that person and notifies them; it does not send a connection request, use campaignstack_send_connection_request for that. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
    Connector
    Destructive
    API key
  • Get the full profile for one of the user's LinkedIn connections: work history, education, skills, and their About summary. Use this after search_connections when you need depth on a specific person. Identify them by name, or by linkedin_url for an exact match. A found:false response carries the user's imported-connection count: if no_imported_data is set, nothing was searched, so report the missing import rather than a missing person.
    ConnectorNo auth
  • List scheduled posts and drafts whose scheduled time falls within a date range. Returns each post with its captions, selected social accounts, and attached design details. Optionally narrow the results to specific social accounts with socialAccountIds — useful for "what's scheduled on my LinkedIn next week". The filter applies to POSTS, not to the accounts within them: a post targeting both LinkedIn and Instagram is returned when you filter by either, and its `accounts` array still lists every account it targets.
    ConnectorAPI key
  • The people in one automation, newest enrolment first: each row has the email, status, current_step, next_due_at and, for a cancelled one, cancel_reason. It answers 'is this person still on the sequence?', 'who is waiting on step 2?' and 'why did this sequence stop for them?', which find_contact and list_emails do not. status narrows to one state: 'active' (still going, including people held while the automation is paused), 'completed', 'failed', or 'canceled' for everyone who left early, where cancel_reason says why (unsubscribed, unsubscribed_from_topic, replied, suppressed, exit_tag, required_tag_missing, manual). For the counts alone, list_automations already carries them per status. Any other status is refused with 422 invalid_request, and an unknown automation_id answers 404 not_found. At most 100 per call; while has_more is true, next_cursor passed back as cursor with the same status returns the next page.
    ConnectorNo auth
  • <summary>Query your canonical people (`person_profiles`) — one deduped row per real person in your account: everyone you've found, enriched, or reached out to, deduped across every campaign and list. Use this for "is <name> someone we know", "people who are VPs at fintech companies", or any question about the person themselves. For a person's outreach progress — which campaigns they're in, what stage — use query_prospects instead: a prospect is a per-owner tracking row, so the same real person can have several prospect rows; query_people collapses those to one canonical entity. Columns: id, display_name, title, headline, company, location, summary, linkedin_url, linkedin_provider_id, email, connections_count, follower_count, is_open_profile, is_premium, work_experience (JSONB), education (JSONB), company_profile_id, owner_email, data (JSONB), created_at, updated_at. `company_profile_id` is the person's canonical employer FK (NULL when unresolved). Sliq's CRM is deals and tasks: to see whether someone has a deal or a task, use query_deals (status='all') / query_crm_tasks with person_id. `connections_count` / `follower_count` are NULL when never fetched (not 0); `is_open_profile` / `is_premium` are NULL likewise. JSONB queries: `data->>'some_key' ILIKE '%...%'`. `work_experience` and `education` are the person's full LinkedIn employment and education history — the same arrays enrich_linkedin_profiles returns, already stored on the person from the last profile lookup, so reading them here costs nothing (answer "where did they go to school", "are they an LSU alum", "how long in seat" from these instead of a fresh enrich). Each is a list; an empty list means it was never captured for that person. They arrive in LinkedIn display order (NOT sorted by date). These arrays are large for senior people — a broad `limit=200` read that returns them can exceed the 50KB direct-return cap and truncate; for a wide pull, either narrow the `where_clause` or call this from `run_code` (nothing truncates there) and print only the fields you need. To list the outreach prospects tracking a person, take an `id` from here and call query_prospects with `where_clause="person_id = <id>"`. Each row also carries `segments`: the person's segment tags across every segment group they're classified into — [{group_id, group_name, tag}], `tag` 'No match' where the classifier couldn't place them (empty when no group has classified them). Segments are the LLM-defined people dimensions from the Explore Segments surface (e.g. Seniority -> VP); manage them with the segment tools (list_segment_groups etc.). Pass `group_by` for per-bucket counts over ALL your people instead of a row list — a whole-set aggregate, never capped at the 200-row `limit`, so it answers "how many people per <dimension>" without paging. `outreach_stage` buckets each person by their most-advanced lead-funnel stage across every campaign; `segment` buckets each person by their tag in one segment group (pass that group's id as `segment_group_id`). Both ignore `where_clause`.</summary> <returns> <description>In row mode (group_by omitted) — a dict with count, truncated, and items array (each row {id, display_name, title, headline, company, location, summary, linkedin_url, linkedin_provider_id, email, connections_count, follower_count, is_open_profile, is_premium, work_experience, education, company_profile_id, owner_email, segments: [{group_id, group_name, tag}], data, created_at, updated_at}). In aggregate mode (group_by set) — a dict {group_by, groups} where groups is a list of {key, count} ordered by count descending; for "segment" the keys are tag names, 'No match' for people the classifier couldn't place, and '' for people the group hasn't classified.</description> </returns>
    ConnectorOAuth