Skip to main content
Glama
584,205 tools. Updated 2026-09-17 17:05

"A method to find people on LinkedIn by their name" matching MCP tools:

  • Enrich existing contacts with their full LinkedIn profile data via the connected LinkedIn account (Unipile) — headline, location, current company & position, full experience, education and skills are scraped from each contact's profile URL and saved onto the contact (and merged into profile_data). Use after search_google_xray to flesh out lightly-saved leads. Each contact is a real LinkedIn profile view, so keep batches small; max 8 per call. Returns per-contact enrichment status.
    ConnectorNo auth
  • List the account's Google Ads / Microsoft Ads library extensions (sitelinks, callouts, snippets, etc.) with their internal ids. ALSO KNOWN AS: list extensions, show extensions, find sitelink, which extensions do we have, extension library, browse extensions KEYWORDS: list, show, find, browse, extensions, sitelink, callout, library, google ads, microsoft ads, bing, id WHEN TO USE: - "What sitelinks do we have?" / "Show our Google Ads extensions" - ALWAYS before add_extensions_to_native_campaign or remove_extensions_from_native_campaign — those need internal ids, and this is the only tool that returns them. The create_*_extension tools return an empty body and cannot tell you the new id. WHEN NOT TO USE: - Creating a new extension → use the relevant create_*_extension tool - Non-search channels (Facebook / LinkedIn / Reddit) — extensions do not exist there INPUTS: - channel (required): GOOGLE_ADS or MICROSOFT_ADS - types (optional): filter, e.g. ["SITELINK"] - name (optional): name filter. Extension names are AUTO-DERIVED, not user-chosen — a sitelink's name is its link text and both description lines joined by newlines, truncated to 50 chars. Filter by `types` and match on the returned fields instead of guessing a name. - page / size (optional): pagination, defaults 0 / 50 Returns {totalElements, totalPages, data:[{id, name, type, createdDate, ...}]}. Only campaign-attachable extensions are listed (account-level ones are excluded by the platform).
    ConnectorAPI key
  • 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
  • List every ranked list the directory publishes — "Overall", "3D Art in Poland", "Unreal Engine" and so on — with each list's size, URL and slug, plus the "method" string describing exactly what the order measures. Use to find the right list before calling get_ranking. Always pass the method on: these lists are ordered by size, years in business and how completely a listing is filled in, not by studio quality, and are not an endorsement.
    ConnectorNo auth
  • Create a contact from a known LinkedIn profile URL, or return the existing contact when the profile was already imported. Use this when you already know the exact profile URL and do not need to run a search. The contact is saved to a dedicated CRM Imports list and can then be passed to add_contacts_to_campaign. Pass `web_research` (what you found about their company/person online) and `personalization_note` (a hook for the outreach message) — both are stored on the contact and fed to the LinkedIn message generator as facts to personalize on. On an existing contact these are MERGED in (they enrich, never blank out existing data).
    ConnectorNo auth
  • 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. 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

Matching MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    An MCP server for searching and downloading books from Library Genesis, supporting EPUB, MOBI, PDF, and more through natural language queries.
    3
    14 npm
    6
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Multilingual name romanization lookup across Chinese, Japanese, Korean, Arabic, Vietnamese, and more. Resolves whether two name spellings refer to the same person — Chan/Chen/陳/陈, Hsu/Xu, Chou/Zhou — across Pinyin, Wade-Giles, Cantonese, Hokkien, and other romanization systems.
    MIT

Matching MCP Connectors

  • LinkedIn: The LinkedIn Data API offers access to detailed information on individuals, companies.

  • LinkedIn data for AI agents: search, profiles, companies, posts. Free key, self-minted, no signup.

  • The list-building tool. Re-runs a plain-English people search and unlocks up to `count` full profiles in ONE atomic charge: 1 credit per newly unlocked person, and anyone you already own is free. Returns each person's real name, title, company, location, LinkedIn URL and an `id`. Emails are NOT fetched here (that is a separate credit): after unlocking, call fetch_email with each person's `id` to get their verified work email. WARNING for autonomous use: this can spend up to `count` credits in a single call, so choose `count` deliberately and confirm with the user before large batches. Returns an out-of-credits error instead of overspending.
    ConnectorNo auth
  • <summary>Fetch the people who reacted to or commented on a LinkedIn post — the user's own post or anyone else's — and store them as queryable engagement rows. Use when the user wants to turn a post's engagers into leads ("everyone who liked this post", "who commented on her launch post"). Visibility follows the user's LinkedIn account: any post it can view works, and private or deleted posts return a plain error. The list is capped at 500 reactions + 500 comments per post; on a bigger post the return flags the cut-off. Data fetched within the last 6 hours is served from the database at no cost; a real fetch counts one action against the shared daily engagement-fetch budget and paces its LinkedIn requests, so a post with hundreds of engagers takes around half a minute — set that expectation with the user before calling this on a big post. To also materialize the engagers as a reviewable list on a task, pass both `task_id` and `list_name`: each person becomes one `agent_search_results` row (entity_type='person', data carries headline, reaction_value, comment_text, provider_id, source_post_url), rendered in the task's Output tab and queryable via `query_search_results`. Re-running updates existing rows rather than duplicating them. Materialization includes every engager — when the user wants only people fitting their ICP, omit these params, qualify the stored rows first (headline triage via query_linkedin_post_engagements), and persist the keepers with record_search_results instead. After this returns, filter and slice the full list with `query_linkedin_post_engagements` using `post_id = <post_analytics_id>`, then queue outreach with one batched `setup_linkedin_sequence` call passing each person's `provider_id`. Send-time resolution skips anyone already connected, so they don't need pre-filtering here.</summary> <returns> <description>On success, a dict {'success': True, 'post_analytics_id': int, 'author_name': str, 'is_own_post': bool, 'post_text_snippet': str, 'from_cache': bool, 'reactions_stored': int, 'comments_stored': int, 'unique_engagers': int, 'truncated': bool, 'budget': {'used_today': int, 'limit': int}, 'engagers_preview': [first 10 people], 'next_step': str, 'list'?: {'list_name', 'created', 'updated', 'total'}}. On failure, {'success': False, 'error': str} when the post isn't visible to the user's account, the daily budget is exhausted, or LinkedIn actions are paused after a rate limit.</description> </returns>
    ConnectorOAuth
  • <summary>Search LinkedIn for people — by name, by a specific person's connections, or by profile filters — and return the matching profiles. Provide `keywords` (a name or search term) or a scope filter (`connections_of` / `advanced_keywords`). One call runs one query, returning ~10 matches by default (one page). To go deeper on a single query — "find people in my network matching my ICP" — pass `max_results` (up to 100): the tool pages through the matches for you, each ~10-profile page counting as one search against the daily budget. To search *different* people — a list of names, or one filter per company — loop this tool inside a `run_code` block, one call per name or company (that's breadth; `max_results` is depth on one query). Searches are paced a few seconds apart and serialized across this user's LinkedIn work, so a deep search or a long loop can take a couple of minutes; tell the user to expect a short wait before a large run. If a search comes back paused or rate-limited, stop and tell the user which searches remain — the account is paused and further calls won't run until it lifts. Scope filters combine with `keywords` and can be used alone for a single filtered search: - `connections_of` — restrict to the first-degree connections of specific people, passed as their `provider_id`s (as returned by an earlier search or profile lookup). To work up to a buyer through someone the user just connected with, pass that person in `connections_of` and the target company in `advanced_keywords={'company': 'Acme Corp'}` to surface who they know there. `network_distance` is a separate filter on the user's *own* degree and combines with this — add [2] to keep just the connections the user isn't already directly linked to. - `advanced_keywords` — native LinkedIn keyword sub-filters: a dict with any of `first_name`, `last_name`, `title`, `company`, `school` (each a string). - `profile_language` — ISO 639-1 codes (e.g. ['en']) that narrow any of the above to profiles written in those languages. A refinement, not a search on its own — pair it with keywords or another filter. When the results are a set the user will act on — a discovery search, the people connected to someone, prospects to work through — pass `list_name` (a short slug) to save them to the workspace Output tab as that named list. Reuse the same slug across a loop or follow-up searches to gather everything into one list (saves are deduped by profile). Omit it only for a throwaway lookup, like resolving one prospect's profile from a name. Saving needs an active task. Returns up to `max_results` matching profiles with provider_id, name, headline, network_distance, location, and profile_url — each match's `headline` shows their current role and company (e.g. to see which companies 2nd-degree matches work at). `total_count` is LinkedIn's full match count for the query when it returns one, but LinkedIn now omits it on most Classic searches (so it's often null): only say "showing N of ~M" when it's a number exceeding the profiles returned, and never invent a total. Use `has_more` — True when more results exist beyond those returned — to decide whether to offer to pull more. Present the results to the user so they can pick the right person. An `error` about being "heavily queued" is transient pacing back-pressure — retry shortly rather than reporting it as not found. That field list is the whole of it — a search result carries no connection count, follower count, or employment history. Present what comes back as it is; a search the user wanted to look at is finished at that point. When the ask genuinely needs one of the missing fields — a connection-count threshold, employment history to personalize from — pass the matches' profile URLs to `enrich_linkedin_profiles`, which returns them for the whole list in one paid call (`connections_count` is the field a connection-count filter reads) and spends no LinkedIn account budget. When the decision also turns on whether the user is already connected to them, use `setup_linkedin_sequence(action_type='resolve')` instead; connection status is the one thing enrichment cannot answer. Rate-limited — shares one daily LinkedIn search budget with all other LinkedIn people searches.</summary> <returns> <description>On success, a dict `{'success': True, 'profiles': [...], 'total_count': int | None, 'has_more': bool, 'searches_remaining_today': int}`. `profiles` holds up to `max_results` matches; `total_count` is the query's full match count when LinkedIn returns one (often null since its Aug-2026 Classic Search change), so lean on `has_more` for whether more results exist; and `searches_remaining_today` is the post-search budget, so you can size a follow-up loop without re-checking. When `list_name` is set, also `saved_to_list` and `saved_count`; if no task was active, `saved_to_list` is null with a `persist_note`. If the account tripped its pause partway through paging, the (still valid) partial results come back with `paused: True` and a `note` — surface it: further searches won't run until the pause lifts. On a failed search: `{'success': False, 'profiles': [], 'error': ..., 'searches_remaining_today': int}`. On a pre-flight refusal (daily limit reached or account paused), `searches_remaining_today` is omitted: `{'success': False, 'error': ...}`.</description> </returns>
    ConnectorOAuth
  • <summary>Find people on LinkedIn for one or more company searches. Use AFTER companies have been identified (company-find step in the same task, user named a target, CRM lookup, etc.) to surface specific decision-makers. Results are always LinkedIn URLs. Before composing a search, call `get_skill_guide('exa_find_people')` — it owns the `query` vs `system_prompt` split that decides whether results come back useful or noisy (exclusions in `query` backfire; they belong in `system_prompt`). `results` holds only people who matched your query + system_prompt; non-matches come back in `rejected` as {name, reason} with no URL. Put exclusions and preferences in `system_prompt` and act on what returns — don't re-filter the results yourself. Pass `company_domain` or `company_linkedin_url` whenever you have one. A search carrying either is answered by a people database that filters on that identifier, so it cannot return someone at a same-named company. Without one, the search falls to a name-matched provider and everything below applies. On that name-matched path, a search naming a `company` drops anyone whose indexed record places them at a differently-named employer — a check the match verdict does not perform, since it weighs the whole search intent at once and passes near-namesakes, returning a founder of 'Acmely' for an 'Acme' search. The check reads the indexed employer, not `summary.current_company`, which is a model's reading of profile prose and routinely echoes the company you searched for back at you; it also ignores roles known to have ended, so a job someone left is not current. That path judges against a profile snapshot (refreshed ~weekly), not live reality, so someone who changed jobs since the last crawl can still pass. Two shapes slip through: a longer name that starts with the one you searched ("Acme" admits "Acme Robotics"), and a profile resolved to no indexed record, which falls back to the extracted name. Nothing downstream re-checks — which is why an identifier is worth passing. Accepts a list of `ExaPeopleSearch` — pass one for a single-company lookup, or N for a batch, fanned out in parallel (max 5 concurrent, since the name-matched provider has shown 5xx instability under bursty load). Each search routes on its own, so one batch can be served by both providers. Each call retries once on 5xx inside the HTTP client. An identifier-pinned search matching more people than can be returned at once comes back in its own slot as `{error, query}` asking you to narrow by `titles`; the rest of the batch is unaffected. Re-send that one search with `titles` set. Costs 0.5 Sliq credits per search that returns without error, whichever provider served it, so an empty result set still charges (the call was made). Free on BYO Exa (a connected Exa key). Soft-fails on insufficient credits: the data is returned and the charge is capped at the remaining balance.</summary> <returns> <description>List of per-search result dicts in input order. Each is either `{results: [...], rejected: [...]}` on success, or `{error: '...', query: '...'}` on failure (after the in-client retry). `results` entries are `{name, url, score, summary}` with `url` always linkedin.com and `summary` holding name, current_title, current_company. `rejected` entries are `{name, reason}` only. A search pinned by `company_domain` / `company_linkedin_url` is filtered on the employer and on `titles`, so it returns no `score`, no ordering, and no `seniority_level` / `match_reasoning` — those come from the per-profile read that only the unpinned path runs, and are absent rather than guessed. Don't infer seniority from position in the list; read the titles. On insufficient Sliq credits the batch is refused before running: it raises `InsufficientCreditsError` rather than returning per-search slots.</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 new or update an existing LinkedIn Document Ad on the Metadata platform. A LinkedIn Document Ad promotes a multi-page document (a PDF — e.g. a whitepaper, ebook, report, or guide) natively in the LinkedIn feed. Members preview the first few pages inline, then unlock the full document (typically gated behind a lead form). It is LinkedIn-only. IMPORTANT: This tool is ONLY for LinkedIn Document Ads (channelType=LINKEDIN, adType=DOCUMENT). For IMAGE/GIF ads use create_update_image_ad; for VIDEO ads use create_update_video_ad; for CONVO use create_update_convo_ad; for Sponsored Messaging use create_update_linkedin_message_ad. BEHAVIOR: - If `id` is NOT provided -> creates a new Document Ad. - If `id` IS provided -> updates the existing Document Ad with that ID. CREATIVE WORKFLOW (MUST DO BEFORE CALLING): 1. The document must already exist in the creative library as a DOCUMENT asset. Find it with `search_library_creatives_by_name(contentTypes="DOCUMENT")`, or confirm a specific id with `fetch_creative_details`. 2. Pass that asset's integer id as `libraryId`. It MUST be a DOCUMENT-type creative — an image or video id will be rejected by LinkedIn. Unlike IMAGE/VIDEO ads there is NO display URL: the gated document is the destination, so no link field is accepted. CHARACTER LIMITS (mirror the LinkedIn ad limits the platform UI enforces): - name <= 50 chars (ad name in the library) - headline <= 200 chars (the headline shown with the document) - text <= 3000 chars (the introductory text) INPUT PARAMETERS: - id (optional): Existing Document Ad ID. Provide to UPDATE; omit to CREATE. - name (required, <= 50): Ad name in the library. - libraryId (required): Integer id of the DOCUMENT creative in the library (contentType=DOCUMENT). NOT an image/video id. - headline (required, <= 200): Headline shown with the document. - text (required, <= 3000): Introductory text shown with the document. - ctaType (optional, default UNLOCK_FULL_DOCUMENT): the call-to-action. UNLOCK_FULL_DOCUMENT is the document-gate CTA. - maxPreviewPages (optional, default 1): how many pages of the document are previewable before the unlock gate. Positive integer. - completionStatus (optional, default DRAFT): "DRAFT" or "COMPLETED". Use COMPLETED only when every required field is final. WHEN TO USE: - User asks to "create a LinkedIn Document Ad" / "whitepaper ad" / "promote a PDF / ebook / report on LinkedIn". - User wants to update an existing Document Ad. WHEN NOT TO USE: - Feed image / GIF ad -> create_update_image_ad - Feed video ad -> create_update_video_ad - Branching conversation flow -> create_update_convo_ad - One-shot Sponsored Message -> create_update_linkedin_message_ad EXAMPLE USAGE (Create): create_update_document_ad( name="Q3_Whitepaper_LI_Document", libraryId=15791, headline="The 2026 State of B2B Marketing", text="Download our latest research on pipeline attribution.", maxPreviewPages=2, ) EXAMPLE USAGE (Update): create_update_document_ad( id=29144, name="Q3_Whitepaper_LI_Document_v2", libraryId=15791, headline="The 2026 State of B2B Marketing (Updated)", text="Now with fresh benchmarks.", ) COMMON MISTAKES: - Passing an IMAGE/VIDEO libraryId — the asset must be a DOCUMENT (use search_library_creatives_by_name(contentTypes="DOCUMENT")). - Passing a display / landing URL — Document Ads have no link field. - Using this tool for a non-LinkedIn channel — Document Ads are LinkedIn-only.
    Connector
    Destructive
    API key
  • Job/opportunity search with the full filter set. Location filtering works: pass `locations` a LinkedIn geo id (e.g. 101570771 for Tel Aviv-Yafo) — see that parameter for how to find one, and note it is an EXACT match, so use a city id rather than a country id. Still id-typed and not yet usable: titles, industries, functions, benefits, commitments. Offset-paginated. data.jobs[].id is the opportunityEntityId consumed by /jobs/details-v2, /jobs/similar, /jobs/people-also-viewed, /jobs/hiring-team. (Costs 10 Zooq credits.)
    ConnectorNo auth
  • Job/opportunity search with the full filter set. Location filtering works: pass `locations` a LinkedIn geo id (e.g. 101570771 for Tel Aviv-Yafo) — see that parameter for how to find one, and note it is an EXACT match, so use a city id rather than a country id. Still id-typed and not yet usable: titles, industries, functions, benefits, commitments. Offset-paginated. data.jobs[].id is the opportunityEntityId consumed by /jobs/details-v2, /jobs/similar, /jobs/people-also-viewed, /jobs/hiring-team. (Costs 10 Zooq credits.)
    ConnectorNo auth
  • 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
  • <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 task 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
  • Map LinkedIn Ad Library links (linkedin.com/ad-library/detail/<id>), sponsoredCreative URNs or bare LinkedIn creative ids to the ads in this account's Metadata library, so an ad the user points at by its LinkedIn link can be REUSED in a new campaign instead of rebuilt. WHAT IT CAN AND CANNOT RESOLVE (repeat this to the user when a link is not found): - It resolves ONLY ads that were launched THROUGH METADATA. Every ad Metadata publishes to LinkedIn is recorded with the LinkedIn creative id LinkedIn gave it, and that id is exactly what the Ad Library link carries. Those come back with the library ad (id, name, type) plus the experiment and campaign that ran them, ready to attach by name. - An ad launched natively in LinkedIn Campaign Manager (a sponsored personal post, a Thought Leader ad, anything built outside Metadata) is NOT in the library and CANNOT be imported from the link, by this tool or any other. The only way to run it here is to rebuild it from its source files (image, video, PDF) with the ad tools. - LinkedIn only. Meta or Google ad library links are refused per item. HOW IT SEARCHES: the platform has no lookup by LinkedIn creative id, so this scans the account's LinkedIn ads newest first (100 per page, `max_pages` pages, default 20, so the newest 2,000 ads) and stops as soon as every id is found. A miss with `reached_end: false` means the ad may simply be older than the scan: pass `campaign_ids` to narrow the scan to the campaigns that ran it, or raise `max_pages`. A miss with `reached_end: true` means the account never launched that ad through Metadata. PARAMETERS: - links: Ad Library URLs, `urn:li:sponsoredCreative:<id>` URNs or numeric LinkedIn creative ids (1 to 20 per call). - campaign_ids: optional wizard campaign ids that restrict the scan. - max_pages: optional, 1 to 50, default 20. RETURNS: {success, found, not_found, scanned_ads, scanned_pages, reached_end, results: [{input, linkedin_creative_id, found: true, library_ad: {id, name, type, channel, status, image_url}, experiment: {id, name, goal}, campaign: {id, name, status}, stats: {spend, impressions, clicks, leads}, destination_url, reuse} | {input, linkedin_creative_id, found: false, reason}]} NEXT STEPS: attach a found ad by its library NAME through create_campaign / add_and_edit_campaign_elements (`ads.list`), or read it with get_ad_details(ids=<library_ad.id>). Never re-upload a found ad's creative: that creates a duplicate library entry.
    ConnectorAPI key
  • List the LinkedIn conversion actions (Insight Tag conversions) available on the connected LinkedIn ad account, with id, name, type and whether each is enabled. Use it to pick the ids for update_linkedin_channel_settings.conversion_action_ids (which conversions a campaign optimizes toward and reports on), and to answer "which LinkedIn conversions do we track?" or "is the /pricing page conversion set up?". KEYWORDS: linkedin, conversions, conversion actions, conversion tracking, insight tag, website visit conversion, lead gen form conversion, url conversion, page visit, pixel Requires a connected LinkedIn channel (check get_integrations_status). Conversion actions are created in LinkedIn Campaign Manager, not here: when the one the user needs (for example a URL rule for /pricing) is missing, say so and point them at Campaign Manager instead of inventing an id. RESPONSE: {success, count, conversions:[{id, name, type, enabled, last_received_at}]} `enabled: false` conversions cannot be attached to a campaign (launch validation rejects them). `last_received_at` is when LinkedIn last recorded a hit; null means the conversion has never fired.
    ConnectorAPI key
  • List the LinkedIn engagement source types and their triggers. STEP 1 of building a LinkedIn Engagement Retargeting audience. WHAT THIS AUDIENCE TYPE IS: An audience of people who ALREADY interacted with this advertiser on LinkedIn or on their website: watched a video ad, opened a lead form, clicked a document ad, visited the company page, or hit specific URLs. It is warm-traffic retargeting, built from first-party engagement, and it needs no contact list and no CSV. NOT THE SAME AS create_retargeting_audience. That tool IMPORTS an audience that already exists inside the native ad account. This flow BUILDS a new LinkedIn DMP segment from an engagement rule you define. If the user says "import my existing LinkedIn audience", use the other tool. If they describe PEOPLE WHO DID SOMETHING ("watched", "clicked", "visited", "opened", "engaged with"), use this flow. **THE THREE-STEP FLOW:** 1. get_linkedin_engagement_source_types (this tool) — choose a source type + trigger 2. search_linkedin_engagement_sources — choose which campaigns / pages to retarget (SKIP THIS STEP for the WEBSITE source type, which uses URL rules instead) 3. create_linkedin_engagement_retargeting_audience — build it SOURCE TYPES AND WHAT EACH RETARGETS (verified live; the response is authoritative and may differ per account, so never assume a value that is not in it): - VIDEO_ADS ........... viewers of the account's video ads - SINGLE_IMAGE_ADS .... people who engaged with single-image ads - DOCUMENT_ADS ........ people who engaged with or downloaded document ads - CONVERSATION_ADS .... people who opened or clicked a conversation ad - LEAD_GEN_FORMS ...... people who opened or submitted a lead gen form - ORGANIZATION_PAGES .. visitors to the LinkedIn company page - WEBSITE ............. visitors to specific URLs on the advertiser's own site TRIGGERS DEFINE INTENT DEPTH, and each source type has its own set: - VIDEO_ADS: FIRST_QUARTILE (>=25% viewed, the default) · MIDPOINT (>=50%) · THIRD_QUARTILE (>=75%) · FULL_COMPLETE (>=97%). Deeper means smaller and warmer. - SINGLE_IMAGE_ADS / DOCUMENT_ADS: ENGAGEMENT (any interaction, default) · CLICK (chargeable clicks only). DOCUMENT_ADS adds DOWNLOAD_CLICK (downloaded it). - CONVERSATION_ADS: OPEN (default) · ANY_CTA_CLICK (clicked a call-to-action). - LEAD_GEN_FORMS: VIEW_FORM (opened it, includes submitters, default) · LEAD_FORM_SUBMIT (submitted only — the hottest signal available). - ORGANIZATION_PAGES: VIEW (visited the page, default) · CTA_CLICK (clicked the page header CTA). - WEBSITE: VISIT. CHOOSING FOR THE USER'S INTENT: - "warm up a broad audience" / top of funnel → a shallow trigger (ENGAGEMENT, VIEW, FIRST_QUARTILE, VIEW_FORM) and a long lookback. - "high intent" / "ready to buy" / bottom of funnel → a deep trigger (LEAD_FORM_SUBMIT, FULL_COMPLETE, DOWNLOAD_CLICK, ANY_CTA_CLICK) and a short one. - When the user does not say, prefer the trigger marked `default` — it is LinkedIn's own recommended choice for that source type. - **Only ever use a trigger from the source type you picked.** The pairing is not validated anywhere downstream, so a trigger borrowed from another source type builds a permanently empty audience with no error to warn you. LOOKBACK WINDOW is both how far back engagement counts AND how long someone stays in the audience. Longer means bigger and colder; shorter means smaller and warmer. 30 / 60 / 90 / 180 / 365 days, except WEBSITE which LinkedIn caps at 180. 90 is a reasonable default when the user does not say. WHEN TO USE: - "Create an engagement retargeting audience" - "Retarget people who watched my LinkedIn video ads" - "Build an audience of people who opened / submitted my lead gen form" - "Retarget visitors to our pricing page" (WEBSITE) - "Who visited our LinkedIn company page?" (ORGANIZATION_PAGES) - "Retarget everyone who engaged with our ads last quarter" - Any request to retarget people by something they DID, on LinkedIn or the site PARAMETERS: none. It always reports the whole catalog for the caller's account. RETURNS: - sourceTypes[]: `engagementSourceType`, a human `description`, and the `triggers` valid for it (`engagementTrigger`, `description`, `default`). Only entries LinkedIn reports as ACTIVE are returned; inactive ones are filtered out. - lookbackWindowDays: the windows the platform accepts, with WEBSITE listed separately because of its 180-day cap. - next_step: which tool to call next. IMPORTANT NOTES: - Requires a connected LinkedIn channel. With none connected this returns nothing useful, and the fix is to connect LinkedIn (connect_channel), not to retry. - The catalog is LinkedIn's own and is read live, so it can change. Treat the response as the only source of truth and never pass a value absent from it. - EVENT_PAGES is deliberately not offered. LinkedIn advertises it but returns no sources for it, so an audience cannot be built from it. - A source type may come back with `triggersError` instead of `triggers` if its trigger list could not be read. The other source types are still usable; either retry or choose one of them.
    ConnectorAPI key
  • Create a **G2 Intent - LinkedIn Native (Dynamic)** audience (platform `customAudienceType=DYNAMIC_G2`). AUDIENCE TYPE (mirrors the UI's "Audience Type" dropdown): • UI label: "G2 Intent - LinkedIn Native (Dynamic)" • Platform enum: DYNAMIC_G2 • Refreshes daily as G2 intent signals update; targets LinkedIn natively. PREREQUISITE: • Both G2 and LinkedIn integrations MUST be connected. If either is missing, do NOT call this tool — recommend `create_firmographic_audience` instead. WHEN TO USE (exact user phrasing this tool should match): • "G2 Intent - LinkedIn Native (Dynamic)" • "G2 LinkedIn Native Dynamic" • "LinkedIn native G2 intent audience" • The user explicitly mentions BOTH G2 intent AND LinkedIn native targeting. WHEN NOT TO USE: • If the user asked for "G2 Intent (Dynamic)" without "LinkedIn Native" → use `create_g2_intent_dynamic_audience`. • If the user asked for "G2 Intent (Static)" → use `create_g2_intent_static_audience`. BUYING STAGES — REQUIRED BY THE PLATFORM: The platform UI marks Buying Stages as required. If the user did not name any stages, STOP and ask the user which of AWARENESS / CONSIDERATION / DECISION to target. DO NOT silently default — that produced wrong audiences in PRD-29702 / PRD-29703. CRITERIA (LinkedIn-native shapes; free-text fields are resolved server-side via the LinkedIn references API): • employees — LinkedIn-native employee ranges. Valid labels: see the schema (e.g. "201-500", "501-1000", "1001-5000"). • revenues — LinkedIn-native revenue ranges (e.g. "$1M-$10M", "$10M-$100M"). • company_names — free-text company names (resolved to LinkedIn company IDs). • location_country_ids — country IDs (e.g. 229=US, 228=UK). • job_titles — free-text titles (resolved to LinkedIn job-title IDs). • skills — free-text professional skills (resolved to LinkedIn skill IDs). PARAMETERS: • name (required, ≤ 50 chars) • intent_days (required, 1-365) • buying_stages (REQUIRED by platform — ask the user if missing; do NOT default) • employees, revenues, company_names, location_country_ids, job_titles, skills (all optional) RETURNS: id, audience_id, audience_name, audience_type (DYNAMIC_G2), status, buying_stages, intent_days, expectedNumberOfCompanies, expectedNumberOfContacts.
    ConnectorAPI key
  • Find which documentation SETS exist whose NAME matches a substring (e.g. "python" → Python 3.x, "react" → React). Returns doc SETS, NOT their content — this does NOT look up a function/method/API name. To search inside a doc for an entry like "Array.map" or "fetch", use search_index (slug + query).
    ConnectorNo auth