Skip to main content
Glama
749,480 tools. Updated 2026-11-06 00:35

"A service for finding people on LinkedIn" matching MCP tools:

  • Returns the plain-language meaning and step-by-step fix for one Malinois finding. Use it while helping the user fix an issue reported by scan_app, or when they ask what a finding means. Pass the rule_id exactly as scan_app returned it. Read-only, no network, instant.
    ConnectorNo auth
  • <summary>Attach a file from the user's library to a queued outreach email or LinkedIn message. Only attach when the user explicitly asks to attach a specific file to someone's message — never on your own initiative. attachment_id comes from list_attachments. Name the queued message by exactly one handle: recipient_email for a queued email (pending or awaiting approval); target_provider_id for a queued LinkedIn message, or target_identifier for one whose profile is still resolving — both as shown on the row in manage_linkedin_invite_queue's status read. On LinkedIn only messages carry files, not connection requests or InMails, and LinkedIn takes fewer file types than email; a file the channel can't send is refused with the reason. The same file can be attached to several messages.</summary> <returns> <description>The attached file's name and every file now on that message, shaped `{'attached': True, 'filename', 'attachments': [{'id', 'filename', 'mime_type', 'size'}]}`.</description> </returns>
    ConnectorOAuth
  • Change a play's own knobs — name, goal, voice — its two switches, and the ACCOUNT's pacing (daily action cap, working hours: shared by every play on the LinkedIn account, not per play). `paused: true` is the human's stop button (nothing runs, nothing is sent); `paused: false` resumes. `status: 'active'` LAUNCHES a draft; `status: 'draft'` takes it back off the road. Seat rule, enforced server-side: no live LinkedIn seat ⇒ neither launch nor resume makes it active — it stays/falls back to draft and the note says so. Launching or resuming kicks the play's due lanes at once. Only launch, resume or raise the cap when the human asked for it in this conversation: an active play spends the month's lead quota and acts from the human's own LinkedIn account. Does not touch the autonomy ladder.
    Connector
    Destructive
    No auth
  • List the layers of a Baltimore ArcGIS service (for discovery). Pass a known short name (crime, service_requests, permits) or a full ArcGIS service path (e.g. "311_Customer_Service_Requests_current/FeatureServer"). Omit `service` to list the known Baltimore services. Returns layer id + name to use with baltimore_query.
    ConnectorNo auth
  • Sets up a monitor: a check Manifold repeats on a schedule, keeping each result so it can report what changed. Urgent changes reach the user as an email alert. Show the monthly cost from preview first, then create it once the user agrees. Give it a description saying why the user wants it, so an agent reading its changes later knows what to do with them. Use when: "monitor this every week", "keep an eye on X", "tell me when Y changes", "check Z every hour", or the user ran the same check by hand before and wants it repeated. Not for: a one-off look, call the tool itself (reddit_search_posts, seo_get_page, seo_get_position, ads_get_advertiser_ads). Reading what a monitor found, use monitoring_get_changes. Returns: Record. monitor (monitor_id, name, description, preset, status, cadence, fields, est_credits_check, est_credits_month, next_check_at), created (false on preview). The first check runs within five minutes and records a starting point; changes are reported from the second check on. Fields by preset: mentions {keywords (up to 10), platforms (reddit, linkedin, instagram, tiktok, youtube; default reddit), communities (Reddit, every new post read in full), pages (1 to 3 per community per check)}, where Instagram searches each keyword as one hashtag ("acme crm" reads #acmecrm), so use a keyword people tag; social_accounts {accounts [{platform (twitter, linkedin, instagram, tiktok, youtube, facebook), account (handle, or URL for facebook and linkedin)}] (1 to 10)}; reviews {items [{source app_store or google_play, app_id} or {source google_maps, place_id or cid} or {source google_shopping, product_id, gid}] (1 to 5), stars, location}; website_changes {pages (1 to 10 URLs), mode (new_items: new links under the page and prices; any_change: new text), words}; ads {brands (1 to 5, a website works best), platforms (facebook, google, linkedin, tiktok)}; google_rankings {site, keywords (1 to 50), location}; ai_visibility {brand, aliases (other names for the brand, up to 5), domain (the brand's site, for citation share), questions (1 to 25; ones that name the brand are counted apart), competitors (up to 9), engines, samples (1 to 3), location, language}. cadence is hourly, daily or weekly; checks repeat from the first one. A bad field is InvalidTarget naming it. Cost: 0 credits to create. Each check charges for the calls it makes at their own prices, shown as est_credits_check and est_credits_month. Monitor checks read live data, never the cache. Example: {"preset": "mentions", "fields": {"keywords": ["acme crm"], "platforms": ["reddit", "linkedin"]}, "description": "Threads asking for a CRM, to answer while they are fresh.", "preview": true}
    ConnectorAPI key
  • Check available appointment slots for a specific service at a local business on a given date. This calls the business's configured availability provider live and fails closed when the provider fails. Returns time windows when the business is free and the service bookingStartPolicy permits the start. For services with maxParticipants > 1, provider-returned starts remain available until capacity is full. ONLY call this if the business has 'booking' in its enabledFeatures array. If the business doesn't support booking, share their contact info from get_business_info instead.
    ConnectorNo auth

Matching MCP Servers

Matching MCP Connectors

  • PeopleOAuth

    Pessoas, histórico e anotações dos seus clientes

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

  • Send a one-off LinkedIn message to a specific saved contact outside any campaign. Prefer contact_id; Salesbot resolves the LinkedIn identifier internally. A random delay, daily/hourly limits, allowed hours and human approval are enforced. Refused with code DUPLICATE_RECENT_MESSAGE (and the campaign name + date) when a campaign of this LinkedIn account already messaged the person within the last 30 days; to continue an existing conversation use reply_to_chat.
    ConnectorAPI key
  • Search a single network for posts matching a query, returned as the unified Post[] schema and tagged with its platform. Keyless on TikTok, YouTube, and Pinterest. Instagram, Twitter/X, Reddit, and Facebook need operator-side credentials (returns credentials_required until set). Snapchat and Threads do not support keyless search (returns not_supported); LinkedIn is quarantined. To fan one query across every network at once, use search_all.
    ConnectorNo auth
  • Delete EVERY object of one type from the user's graph, however many there are: what to reach for when they ask to clear out a whole category ('delete all my HubSpot contacts') rather than one record. Pass import_id instead to delete everything one import added (its contacts, companies, notes and files, the uploaded file and the import itself); imports are graph objects of type 'import_run'. Pass source 'linkedin_import' instead to delete every connection a LinkedIn export loaded and the people made from them. Deleting one object is delete_graph_object instead. This delete is permanent, and at this scale it is the only kind that helps: a synced portal can be millions of records. Use only when the user explicitly asked for these to go, never on your own initiative, and name one type, import or source per call. In chat this tool deletes nothing: it counts the records and returns what to tell the user, and their click starts the deletion.
    Connector
    Destructive
    No auth
  • The user's LinkedIn post analytics from LinkedIn's own API (their connected account) — impressions, unique members reached, reactions, comments, and reshares. Use for questions like 'how many impressions did I get last month?' or 'how are my posts performing?'. Omit dates for lifetime totals; pass start_date/end_date for a window; set daily=true (with one specific metric) for a per-day series to describe trends. Numbers are live from LinkedIn, unlike get_my_linkedin_posts whose per-post counts come from a periodic sync.
    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.
    ConnectorAPI key
  • Free. Sends a message to the human operators of this service: a bug report, a problem with these tools or the documentation, or a suggestion. It is read by people, not processed by software, and nothing is returned beyond an acknowledgement. Do NOT use it for status updates, progress notes, task narration, error logs, or as a fallback when another tool is unavailable or a payment cannot be made -- it cannot complete, retry or work around any task. Name is optional (omit for anonymous feedback); message is limited to 1000 characters.
    ConnectorNo auth
  • <summary>Add and/or remove watched people or company pages on an existing `list`-mode LinkedIn monitor, incrementally — you pass only the profiles that are changing, never the whole list. `add` and `remove` are LinkedIn profile URLs or vanity slugs for people, and full `linkedin.com/company/...` URLs for company pages (a bare company name or slug is read as a person's slug). A swap is one call (`add=[new]`, `remove=[old]`). Both forms of one profile (full URL and bare slug) collapse to a single watched member, so re-adding someone already watched is a no-op. The change takes effect on the monitor's next scheduled run. Use this instead of re-running `set_up_linkedin_monitoring` whenever the user just wants to tweak who's watched ("also watch Bob", "drop Alice"): setup would force re-passing every existing member, and since each watched profile is billed per run, one dropped URL on the re-echo silently stops watching that person. To change schedule, voice, or the action flags, use `set_up_linkedin_monitoring` (members are preserved there when omitted); adding the very first members or resetting the whole list is setup too.</summary> <returns> <description>Dict with status ('active'), name, members_count, added, removed, unresolved, and message.</description> </returns>
    ConnectorOAuth
  • <summary>Query the agent's entity row store (`agent_search_results`) — the people and companies recorded for the agent from any source (discovery search, CRM reads, enrichment, user-pasted lists). Columns: id, agent_id, entity_type, list_name, source, identifier, display_name, verdict, verdict_reason, data (JSONB), created_at, person_id, company_profile_id, linkedin_slug, linkedin_provider_id, email. Filter by list with "list_name = 'oil-gas'". `identifier` is the key the row was saved under — a company's domain; for a person, whichever LinkedIn handle or email its source had. A person's LinkedIn profile slug, provider id and email are in `linkedin_slug`, `linkedin_provider_id` and `email`, read from the linked person ('' when the row isn't linked or the person has none). `source` is the discovery tool that surfaced the row ('agent' when no discovery tool did; 'legacy' for rows older than the column). `verdict` is the curation call recorded on the row with `record_search_results`, or by the check a search tool, a post monitor's engager capture or a Websets list runs on the rows it saves — 'qualified', 'rejected', 'unclear' for a row screened but too thin to judge, or NULL for a row not yet screened — with `verdict_reason` saying why. Rejected rows are left out unless you pass `verdict='rejected'`, `include_rejected` or `run_id`, the same as the user's default view, so a `where_clause` on `verdict` alone never reaches them. `person_id` / `company_profile_id` are the canonical person / company FK ids (NULL until the row is linked). A person's profile (title, company) and a company's firmographics (industry, location, employee count, description) — the values the agent's People and Companies tabs show — live on the linked record, not in the row's own `data`: read them with `query_people` / `query_companies` on those ids, and filter on them through the id, e.g. "company_profile_id IN (SELECT id FROM research_app_company_profiles WHERE industry ILIKE '%oil%')". For a person's LinkedIn degree and warm-intro connectors, or the agent's people counted by list, source, degree or connector, use `list_people` instead. For the agent's companies as its Companies tab shows them, one row per company with its lists, verdict and signals rolled up across rows, use `list_companies`. `data` has no single schema — its shape follows whichever source wrote the row (it is the agent-authored blob). Most person rows nest under `person` (data->'person'->>'position', data->'person'->'company'->>'name') and most company rows under `company` (data->'company'->>'name'), but other sources write those fields flat. A path that doesn't exist yields NULL rather than an error, and a NULL comparison drops the row — so a filter aimed at the wrong shape comes back empty or short and reads as a genuine miss. Read a page of rows without a `data` filter first, then filter against the shape you see. Person rows are annotated with the team connection overlay (mirrors the Find UI): a matched row's `data` gains `connection_status: {you: bool, teammates: [{email, name, first_name}]}` naming the viewer/teammates who are 1st-degree to that prospect; unmatched rows and company rows carry no such key. A top-level `connections_coverage: {you: 'none'|'partial'|'csv_uploaded', team_missing: int}` reports the owner's own connection coverage and how many active teammates still lack a CSV upload. The viewer is the agent owner.</summary> <returns> <description>In row mode (group_by omitted) — a dict with count, truncated, and items array (each row {id, agent_id, entity_type, list_name, source, identifier, display_name, verdict, verdict_reason, data, person_id, company_profile_id, linkedin_slug, linkedin_provider_id, email, columns, created_at}), plus connections_coverage {you, team_missing}. `columns` is the normalized [label, value] projection of the row's agent-researched `data.columns`. In aggregate mode (group_by set) — a dict {group_by, groups} where groups is a list of {key, count, qualified, rejected, unclear, unscreened} ordered by count descending. `count` is every row the call counts, and the other four split it by verdict (`unscreened`: no verdict yet); rejected rows are ones the screen ruled out, not matches. With group_by "list", each group also carries `criteria`: the search criteria a Websets list screens its rows against, '' for any other list.</description> </returns>
    ConnectorOAuth
  • SPENDS CREDITS, AND BY DEFAULT METERED EMAIL VERIFICATION. Adds people from the Lead Finder contact database to a campaign as leads, revealing their contact details, in the background. Pass refs (from search_lead_finder results; up to 1,000 different people by default) to add exactly those people, or pass filters and count (1 to 5,000 by default) to add count people matching the filters who are not in the workspace yet. A filters add always walks the matches from the top and skips anyone already a lead, free and not counted, so repeating the same add adds the NEXT count people and charges again. Never repeat an add to retry: after an error or a timeout, call list_lead_finder_imports to see whether it started. A filters add stops early when the audience runs out or once it has looked at five people for every one requested (at least 1,000). People already added count toward that limit even though skipping them is free, so after an add of more than about 1,000 people a small follow-up can stop with nobody added. Every person a filters add looks at, added or skipped, also uses the account's daily allowance for filters adds (25,000 people by default). Each person added costs 1 credit ($0.033 at list), reported as creditsPerProspect; the response reports estimatedCredits, the most the add can cost in credits, and the wallet must hold that much for it to start. People already in the workspace, blocklisted, without a usable address, on a personal mailbox when the campaign only takes business addresses, or marked invalid by verification are skipped and cost no credits. verifyEmails (on by default) checks every screened address with the paid email verification waterfall, including the ones it marks invalid: one or two checks per address, billed as metered usage on the next invoice (price per check: GET /email-verification/rates in the REST API), within the account's monthly verification spend limit. Catch-all and unconfirmed addresses are added and charged, and so is every address once that limit is reached; verification.limitReached and verification.unknown on get_lead_finder_import count them. Leads added to a running or paused campaign get their emails at once (a paused campaign sends them when resumed); adding to a completed campaign resumes it, so it starts sending again; in a draft campaign the emails are created at launch. At most 3 adds run at once in a workspace. A refusal names its reason, and a 429 also says when to retry (reason running_imports, daily_import_limit, daily_budget, monthly_budget or fair_use_floor). Poll get_lead_finder_import with the importId until finishedAt is set. Check get_credit_balance first; buy credits with purchase_credits.
    ConnectorNo auth
  • Merge a duplicate CRM company into another one (e.g. 'Škoda JS' into 'Škoda Group'). All people move to keep_crm_company_id, empty details are filled from the duplicate, account notes are joined, the duplicate's name is remembered as an alias so future leads with that name land in the kept company, and the duplicate is deleted. Cannot be undone — only merge when both records are clearly the same organisation (check with get_crm_company), and confirm with the user when unsure. Prefer keeping the company imported from LinkedIn.
    Connector
    Destructive
    API key
  • Store a value the customer supplies for one person, such as a link to a video they recorded, so a LinkedIn message, email, X DM or Instagram DM step declared with tool customer_input can send. Identify the person by exactly one of leadId, LinkedIn profile URL, email address or X handle. values maps the sequence's token names (for example video_url) to the customer's text; the key comes from the sequence, the customer never types it. One call fills every step of that person's sequence that uses the token and has not sent yet. A LinkedIn message, opted-in email or X DM step may instead ask for a file for each person (tool customer_input attachment, for example a personalised demo video). Limits are the providers': LinkedIn 15 MB per message together with the step's own files; email one document, image or MP4 up to 18 MB (1.5 MB from Microsoft mailboxes); X one image up to 5 MB, GIF up to 15 MB or MP4 video up to 50 MB and 140 seconds. Nothing is compressed: a larger file is refused with the limit and the way forward, which you relay as written (compress it and try again, or send a video link instead). A link to a video (Loom, YouTube, Drive) is a text value such as video_url, not a file. To send a file, call once with upload { key, fileName, size } to get a one-time uploadUrl, PUT the file's bytes there with the returned headers, then call again with files { key: uploadTicket }; if you cannot upload bytes yourself, give the customer the returned appUrl to add the file in the app instead. For several people at once (the customer has already decided which file is whose; do not second-guess their pairing), call with uploads [{ leadId or linkedinUrl or email or xUsername, key, fileName, size }] (up to 25, no top-level person) to get one uploadUrl and uploadTicket per person, PUT each file, then call with confirmUploads [uploadTicket, ...] to attach them all. Each person succeeds or is refused on their own with a reason; tickets last two hours and confirming one again is harmless, so a rerun only adds what is missing. Afterwards list_leads with sequenceId and personalFiles=true shows which file each person has. Nothing is sent in this call: the paced engine sends on its next run if the person is at that step, or when they reach it. A value or file for someone who already replied, finished, or already received that message is refused with nothing changed. The result includes how many people in that sequence are still waiting. Open world: the stored value releases a held message to that person, a third party.
    ConnectorOAuth
  • Store a value the customer supplies for one person, such as a link to a video they recorded, so a LinkedIn message, email, X DM or Instagram DM step declared with tool customer_input can send. Identify the person by exactly one of leadId, LinkedIn profile URL, email address or X handle. values maps the sequence's token names (for example video_url) to the customer's text; the key comes from the sequence, the customer never types it. One call fills every step of that person's sequence that uses the token and has not sent yet. A LinkedIn message, opted-in email or X DM step may instead ask for a file for each person (tool customer_input attachment, for example a personalised demo video). Limits are the providers': LinkedIn 15 MB per message together with the step's own files; email one document, image or MP4 up to 18 MB (1.5 MB from Microsoft mailboxes); X one image up to 5 MB, GIF up to 15 MB or MP4 video up to 50 MB and 140 seconds. Nothing is compressed: a larger file is refused with the limit and the way forward, which you relay as written (compress it and try again, or send a video link instead). A link to a video (Loom, YouTube, Drive) is a text value such as video_url, not a file. To send a file, call once with upload { key, fileName, size } to get a one-time uploadUrl, PUT the file's bytes there with the returned headers, then call again with files { key: uploadTicket }; if you cannot upload bytes yourself, give the customer the returned appUrl to add the file in the app instead. For several people at once (the customer has already decided which file is whose; do not second-guess their pairing), call with uploads [{ leadId or linkedinUrl or email or xUsername, key, fileName, size }] (up to 25, no top-level person) to get one uploadUrl and uploadTicket per person, PUT each file, then call with confirmUploads [uploadTicket, ...] to attach them all. Each person succeeds or is refused on their own with a reason; tickets last two hours and confirming one again is harmless, so a rerun only adds what is missing. Afterwards list_leads with sequenceId and personalFiles=true shows which file each person has. Nothing is sent in this call: the paced engine sends on its next run if the person is at that step, or when they reach it. A value or file for someone who already replied, finished, or already received that message is refused with nothing changed. The result includes how many people in that sequence are still waiting. Open world: the stored value releases a held message to that person, a third party.
    ConnectorOAuth
  • People matching title, seniority and company filters. No email. Use when: "find heads of marketing at fintech startups", building a target list by role, prospecting by ICP. Not for: someone to email at a specific website about a link, use leads_get_domain_emails (keyed by domain). One person's full record, use leads_get_person. An email for a named person, use leads_get_email. Returns: List. rows[]: id (the LinkedIn profile URL; null when the person has no profile, so look them up by name and domain), first_name, last_name, headline, title, title_start (YYYY-MM, so time in the role), company, company_domain, company_id, company_linkedin_url, company_employees, company_industry, location, linkedin_url. rows_available is the provider's total. Give at least one of titles, seniority, company_domains, industries, locations or keywords. A page holds at most 100 rows whatever the limit; page on with meta.cursor. Cost: 12 credits per 100 rows asked for (limit), rounded up. Default 12 credits. Cached 7 days. Example: {"titles": ["head of marketing"], "industries": ["fintech"], "locations": ["London"], "limit": 50}
    ConnectorAPI key
  • Create a new custom column on the current view in the workspace. Use this tool when the user asks to add, create, or set up a new column on the active grid (e.g. "add an Industry column", "create an AI column that scores risk"). REQUIRED: name, type - type: one of text, number, amount, date, boolean, single_select, multi_select, record_reference, ai - a `record_reference` column also REQUIRES the root its values point at: one root in `reference_target`, or two or more in `reference_targets` when a cell may name records of several roots (for example people and companies). Send one of the two, never both. A column of people is how a person is held, so "an owner column" or "who handles it" is type=record_reference with reference_target=people. No other type takes a reference target. OPTIONAL: icon, rules_config, formula_config, format_config, reference_target, reference_targets, is_multiple - is_multiple: for a `record_reference` column only. Pass true when one cell holds a list of records (for example "the people on this deal"); leave it out when a cell holds one record. On a grid, the column is always created on the user's currently mounted view: you do not (and cannot) choose a different one, and you do not ask which view. With no grid (an assistant app, or a creation off-grid), pass `root`: the view the user named, one of companies, people, invoices, transactions, account_balances, projects. If the user named no view, ask which one before calling. If the user named a table that is not in that list (for example products or tasks), do not call this tool and never put the column on another table: say in one line that this table cannot take a custom column yet, and name the tables that can. Naming: `name` must be unique within the current view. If a name conflict is likely, ask the user to disambiguate before calling rather than retrying after a failure response. Position: the new column is auto-placed at the end of the view. You cannot set position via this tool. Side effect: creating a column on a populated view automatically schedules an asynchronous recompute of all rows. You will not receive a tracking handle — values appear in the grid as workers finish. Returns { success: true, custom_column_id, name, root, type } on success, or { success: false, error } on failure.
    Connector
    Destructive
    No auth
  • Create a product in the current workspace: a good, a service, a plan or a collection the workspace sells or buys. A variant, a collection member or a dated price nests under a parent product. Use this tool when the user asks to create or add a product, a service, a plan, a variant or a price, in any language ("Ajoute le produit Audit SEO à 1 200 € HT"). It adds a row to the catalog: it never drafts an invoice or an invoice line, and it asks for no customer. REQUIRED: name, supply_type (good, service, plan or collection), status (draft, active or archived), availability (in_stock, out_of_stock, preorder or discontinued). Read these values from the user's words when the words make them plain. A product the user adds with no status word is status active; a draft or an archived product needs the user's word. Work billed by the job, the day or the hour (an audit, a consulting day, a training) is a service: supply_type service, stock_tracked false, availability in_stock. A service with a name and a price is a complete order: on WhatsApp it saves at once, with no card and no question. For a physical good, the words rarely say whether it is in stock: ask that one value before the create, and ask for nothing else. OPTIONAL: sku, description, unit_price (a decimal string) with its currency, parent_product_id, vendor_company_id, product_type_project_id, stock_tracked (false for a service or a product made to order, whose own availability then stands). A price for one company or one project is a dated row under its parent: parent_product_id, valid_from (YYYY-MM-DD) and scope_company_id or scope_project_id, with valid_to to close it. A collection has no parent, no price and no SKU. Two live products cannot share a SKU: the call then fails, and well_list_products finds the existing one. Returns { success: true, product } on success, or { success: false, error } on failure.
    ConnectorNo auth