{"name":"LeadAdapter","description":"Run LinkedIn engagement and lead capture from your AI agent, inside hard safety caps. Every LinkedIn action is executed by your own browser through the LeadAdapter Chrome extension; LeadAdapter never holds your LinkedIn credentials.","endpoint":"https:\/\/www.leadadapter.com\/mcp","transport":"streamable-http","protocol_versions":["2026-07-28","2025-11-25","2025-06-18","2025-03-26"],"authentication":{"oauth2":{"authorization_server":"https:\/\/www.leadadapter.com\/.well-known\/oauth-authorization-server","protected_resource":"https:\/\/www.leadadapter.com\/.well-known\/oauth-protected-resource","dynamic_client_registration":"https:\/\/www.leadadapter.com\/oauth\/register","scope":"mcp:use","pkce":"S256"},"api_key":{"header":"Authorization: Bearer la_live_\u2026","issued_at":"https:\/\/www.leadadapter.com\/app\/settings\/api-keys","note":"For clients that cannot open a browser, such as Cursor and stdio shims."}},"tiers":[{"tier":"pro","name":"Pro","price_eur_per_month":"59","price_cents":5900,"tools":26},{"tier":"operator","name":"Operator","price_eur_per_month":"119","price_cents":11900,"tools":29}],"workspace":null,"tool_count":29,"tools":[{"name":"get_extension_status","title":"Extension status","description":"Whether the LeadAdapter Chrome extension is currently connected for each LinkedIn profile on this workspace, plus the depth of its job queue. NOTHING in LeadAdapter executes on LinkedIn while the extension is offline \u2014 check this before promising the user that anything has been sent.","tier":"starter","tier_name":"Starter","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"get_job","title":"Get job","description":"Poll a queued extension job by its job_id. Returns queued, leased (a browser is running it now), done with the result, failed with the error, or cancelled. Extension work runs in the user's own Chrome, so a job stays queued for as long as that browser is closed.","tier":"starter","tier_name":"Starter","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"list_approvals","title":"List approvals","description":"List the actions waiting for a human decision on this workspace. Under the default autonomy mode, outbound messages and connection requests are held here rather than sent \u2014 check this before telling the user something went out.","tier":"operator","tier_name":"Operator","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"decide_approval","title":"Decide approval","description":"Approve or reject one held action. Requires confirm: true. Approving releases the action to be queued for the browser extension; it does not send anything by itself, and the send still passes through the daily caps.","tier":"operator","tier_name":"Operator","execution":"server","read_only":false,"destructive":true,"available":null},{"name":"add_do_not_engage","title":"Add to do-not-engage","description":"Suppress a person, an email address or a whole domain so nothing in LeadAdapter contacts them again. Use this the moment someone asks to be left alone. Suppression cannot be undone from here \u2014 that is deliberate.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"export_leads","title":"Export leads","description":"Page through the leads captured by this workspace, newest first. Returns rows the model can read directly, with a next_cursor to continue. Filter by source, tag, or captured-since.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"sync_lead_to_crm","title":"Sync lead to CRM","description":"Push one captured lead into a connected integration (CRM, ESP). Names the provider or uses the workspace's only connected one. Re-syncing an existing contact is a success, not an error.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"create_automation","title":"Create automation","description":"Create a comment-to-DM automation on a LinkedIn post that is ALREADY PUBLISHED: whoever comments with one of the keywords gets the direct message. Use schedule_post_with_automation instead when the post does not exist yet \u2014 an automation needs a post URN before it can be armed. Created as a draft; arm it with edit_automation status: \"active\" once the blockers listed in the response are clear. Spends no daily budget by itself; every DM it later sends spends one dm slot from the same shared budget as everything else. Refuses when the plan's automation limit is reached (tier_limit_reached) or when a regex keyword is unsafe (invalid_keyword_pattern).","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"list_automations","title":"List automations","description":"List this workspace's comment-to-DM automations, newest first, with their status, keywords and counters. Start here before creating one: an automation on the post you are about to target may already exist, and two automations on the same post send two DMs to the same commenter. Read-only \u2014 no LinkedIn call, no budget spent. Use get_automation for the message templates.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"get_automation","title":"Get automation","description":"Read one automation in full: the DM template, the follow-up, the public comment reply, the keyword sets, the counters, and activation_blockers \u2014 the list of what is stopping it going live. Call this before edit_automation so the edit is a change and not a guess. Read-only, no budget spent.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"edit_automation","title":"Edit automation","description":"Change an existing automation and\/or its state. status: \"active\" arms it (refused, with reasons, if it is not ready), \"paused\" stops the polling but keeps queued DMs, \"archived\" ends it and cancels the DMs already queued for this morning's commenters \u2014 archived is destructive and requires confirm: true. Every other field is a plain edit and needs no confirmation. Only the fields you pass are changed; passing keywords replaces the whole keyword set. Spends no budget.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"suggest_automation_settings","title":"Suggest automation settings","description":"Given the TEXT of a LinkedIn post, propose the keyword, the negative keywords and the DM copy for a comment-to-DM automation, in the post's own language and using this product's placeholder spellings. Pass the result straight to create_automation. Saves nothing and sends nothing. Spends no LinkedIn budget \u2014 the server never reads the post, so paste the text in; there is no post_url form of this call. Returns llm_unavailable when the model gateway is down, in which case write the settings yourself.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"list_recent_posts","title":"List recent posts","description":"Ask the user's browser extension for the LinkedIn posts they have published recently, so you can pick one to attach a comment-to-DM automation to. This is a browser job: it returns a job_id and nothing runs while that browser is closed \u2014 poll with get_job. The response also carries known_posts, the posts LeadAdapter already recorded, which you can act on immediately. Spends no daily budget. For someone ELSE's posts use list_person_posts, not this.","tier":"pro","tier_name":"Pro","execution":"extension","read_only":true,"destructive":false,"available":null},{"name":"schedule_post_with_automation","title":"Schedule post with automation","description":"Write a LinkedIn post, put it in the calendar, and optionally pre-attach the comment-to-DM automation that will arm itself the moment the post publishes and its URN is known. This is the right tool when the post DOES NOT EXIST YET; use create_automation for a post that is already up. The slot must be in the future. Publishing happens through the user's browser at the slot and spends one post slot from the daily budget then, not now \u2014 if no browser is online it retries for two hours and then fails with a notification. Refuses on plans without scheduling (tier_required) and when the plan's automation limit is reached.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"list_scheduled_posts","title":"List scheduled posts","description":"List this workspace's scheduled LinkedIn posts in slot order, soonest first. With no status filter it returns only posts that have not gone out yet. Each row says whether it is still editable, whether an automation is attached, and \u2014 for a post that is late or failed \u2014 why. Read-only, no budget spent. Use get_scheduled_post for the full body and media.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"get_scheduled_post","title":"Get scheduled post","description":"Read one scheduled post in full: body, media and their upload state, the attached automation, and the browser job that will publish it (or already tried). Use this to answer \"why has my post not gone out\" \u2014 the publish_job and error fields carry the reason, which is usually that the extension was offline at the slot. Read-only, no budget spent.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"edit_scheduled_post","title":"Edit scheduled post","description":"Change a post that has not gone out yet: its body, its images, its slot, or which automation it arms. Only the fields you pass change, but passing media REPLACES the whole image list. Refused with not_editable once publishing has started \u2014 at that point the text may already be inside the browser, so an edit that appeared to save would be a lie. Moving the slot into the past is refused; this is not a publish button. Spends no budget.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"cancel_scheduled_post","title":"Cancel scheduled post","description":"Call off a scheduled post so it never publishes, and cancel the browser jobs queued for it. DESTRUCTIVE: requires confirm: true, and there is no undo \u2014 the post cannot be un-cancelled, only scheduled again. A job already handed to the browser cannot be recalled, so the response says how many were actually stopped; do not tell the user it definitely did not go out unless that count covers it. A pre-attached automation is left alone as a draft. Refused with not_editable if the post already published. Spends no budget.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":true,"available":null},{"name":"discover_lead_magnets","title":"Discover lead magnets","description":"Find posts in a niche that look like working lead magnets: high comment velocity plus \"comment GUIDE below\"-style copy. Runs a LinkedIn post search through the user's own browser (spends one of the daily search budget) and returns a heuristic 0-100 score per post with the signals behind it \u2014 this is a ranking to look at, not a classification. Results come back minutes later: either pass wait: true, or call again with the job_id from the first response to rank the finished search for free. Feed the winners to list_post_engagers to turn a magnet into a lead list.","tier":"pro","tier_name":"Pro","execution":"extension","read_only":false,"destructive":false,"available":null},{"name":"enrich","title":"Enrich a person","description":"Look up a person's full LinkedIn profile through the user's own browser and merge it onto their lead record. Identify them with linkedin_urn, public_id, or lead_id for someone already captured. Spends one of the workspace's monthly enrichment allowance AND one profile_view against the daily LinkedIn cap; both remaining figures come back on every response, including refusals. Nothing is returned immediately \u2014 the browser fetches it minutes later, so poll get_job or re-read the lead. Refuses with enrichment_cap_reached (upgrade), cap_reached (wait until tomorrow), duplicate (we already enriched them within 30 days \u2014 read the stored record instead) or do_not_engage. include_email requires the Operator plan.","tier":"pro","tier_name":"Pro","execution":"extension","read_only":false,"destructive":false,"available":null},{"name":"enrich_company","title":"Enrich a company","description":"Look up a LinkedIn company page through the user's own browser and store its firmographics \u2014 industry, headcount, HQ, website, follower count. Takes a company URN (urn:li:organization:1234). Spends one of the workspace's monthly enrichment allowance AND one profile_view against the daily LinkedIn cap; both remaining figures come back on every response including refusals. The answer arrives minutes later via the browser, so poll get_job or re-read the company. Refuses with enrichment_cap_reached (upgrade), cap_reached (wait), or duplicate if we already enriched this account within 30 days \u2014 the response then names the record to read instead.","tier":"pro","tier_name":"Pro","execution":"extension","read_only":false,"destructive":false,"available":null},{"name":"manage_lead_pages","title":"Manage lead pages","description":"Create, edit, publish, unpublish or delete a hosted lead-magnet page. Pages are created as drafts; publish is a second call and is refused if the page promises a file it does not have. action=delete requires confirm: true (G12) and soft-deletes \u2014 captured leads, consent records and tracked links survive, and the URL stays reserved. Costs no LinkedIn budget; Starter is limited to a few pages, Pro and above unlimited.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"list_lead_pages","title":"List lead pages","description":"List this workspace's lead-magnet pages with their public URLs, draft\/published state and funnel numbers (views, unique views, submits, conversion rate, traffic sources) over a chosen window, 30 days by default. Use it to find the page id other lead-page tools need, or to decide which magnet to promote. conversion_rate is submits divided by total views. Reads our own database only; costs no LinkedIn budget.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"get_page_leads","title":"Get page leads","description":"List the people who submitted one lead page, newest first, with their email, the lead record they were matched to, the UTM\/referrer they arrived on and whether they ticked marketing consent. consent_marketing=false means they agreed to receive the magnet and nothing else \u2014 do not add them to a sequence. Paged with next_cursor. Reads our own database; costs no LinkedIn budget.","tier":"pro","tier_name":"Pro","execution":"server","read_only":true,"destructive":false,"available":null},{"name":"manage_lead_magnet_links","title":"Manage tracked links","description":"Create, list, edit or delete tracked short links (\/l\/{slug}) for lead magnets. Pass lead_page_id to point one at a hosted page, or target_url for anywhere else \u2014 non-http(s) targets are refused. Listing returns click counts, and with lead_id it also returns per-lead attributed URLs so a click can be traced back to the person who received the message. action=delete requires confirm: true and is permanent: links already sent start 404ing. Costs no LinkedIn budget.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"manage_invitations","title":"Manage invitations","description":"Triage inbound LinkedIn connection requests: action=list queues a fetch of the pending invitations, action=accept or action=ignore decides one by invitation_urn. Everything runs in the user's own browser, so calls return a job_id and nothing happens while that browser is closed. Accepting or ignoring SPENDS ONE connect from the daily cap \u2014 LinkedIn meters invitation replies with outbound connects \u2014 so a large backlog takes several days and will be refused with cap_reached rather than queued past the cap. Rank the inviters yourself with enrich before deciding.","tier":"pro","tier_name":"Pro","execution":"extension","read_only":false,"destructive":false,"available":null},{"name":"list_companies","title":"List company pages","description":"List the LinkedIn Company Pages this workspace knows about, including the ones the connected profile administers \u2014 the page URNs that company-voice tools and page scheduling need. Returns the stored records immediately (with firmographics if they have been enriched) and, unless you pass refresh: false, also queues a browser job to refresh the list, which spends one of the daily search budget. Nothing refreshes while the user's browser is closed.","tier":"pro","tier_name":"Pro","execution":"extension","read_only":false,"destructive":false,"available":null},{"name":"set_daily_dm_limit","title":"Set daily send limit","description":"Change the daily cap for one channel on a LinkedIn profile \u2014 by default direct messages. Lowering a cap always works. Raising one above the ceiling for this workspace's plan is refused with cap_ceiling_exceeded and the ceiling, so the answer is an upgrade and not a retry. Spends no LinkedIn budget itself; it edits the budget every other tool spends.","tier":"pro","tier_name":"Pro","execution":"server","read_only":false,"destructive":false,"available":null},{"name":"list_actions","title":"List actions","description":"Read this workspace's audit log: every tool call, automation action and approval decision, including the refusals. Filter by result (ok, queued, blocked, failed, approved, rejected), action type, tool, actor, target or date. Use result=blocked to find out why something did not send \u2014 the reason column carries the governance code. Reads only our own database; costs no LinkedIn budget and is safe to call repeatedly.","tier":"operator","tier_name":"Operator","execution":"server","read_only":true,"destructive":false,"available":null}],"governance":{"note":"Every write passes daily per-channel caps, a do-not-engage list, 30-day de-duplication, quiet hours and an approval queue. Each tool result carries a governance block with the verdict and the remaining budget.","dry_run":"Every write tool accepts dry_run: true and returns the verdict without acting.","confirm":"Destructive tools refuse without confirm: true."},"documentation":"https:\/\/www.leadadapter.com\/docs","mcp_documentation":"https:\/\/www.leadadapter.com\/docs\/mcp","pricing":"https:\/\/www.leadadapter.com\/pricing"}