L

MCP Agent Skill — linkedin

LinkedIn Outreach Platform Skill for MCP Agent

Messaging, outreach, and candidate management for LinkedIn

Available free v1.1.0 Browser LLM
$ sidebutton install linkedin
Download ZIP
README 9.0 KB

LinkedIn Outreach Platform

Professional networking, messaging, candidate outreach, and recruiting. Agents drive the linkedin.com web app. Sales Navigator (linkedin.com/sales) and Recruiter (linkedin.com/talent) are separate paid surfaces with their own selectors and workflows; this pack focuses on the standard LinkedIn surface plus the hiring-applicants flows.

Browser Access

Browser-only platform — LinkedIn does not publish a public messaging or feed API. Requires the user to be signed in in the connected browser. Sessions persist as long as cookies are kept.

ToolUsage
navigateGo to profile, inbox, feed, or job page
snapshotRead page content, message threads, applicant lists
clickButtons, links, message actions, applicant rows
typeMessage compose, search, connection notes

Surface map

URLSurface
/feed/Home feed
/in/<vanity>/Public profile
/messaging/Inbox
/messaging/thread/<id>/Single conversation
/jobs/Job search and saved jobs
/jobs/view/<id>/Job posting
/hiring/jobs/<id>/applicants/Applicants for a job (Recruiter Lite or job poster access required)
/notifications/Notifications
/sales/Sales Navigator (separate product)
/talent/Recruiter (separate product)

Profiles

A profile at /in/<vanity>/ is structured into stable sections:

SectionPurpose
Top cardName, headline, location, current company
AboutFree-form bio
ExperienceRoles with dates, companies, descriptions
EducationSchools with dates, degrees
Licenses & certificationsValidated credentials
SkillsEndorsed skill list
RecommendationsFree-form testimonials
ActivityRecent posts and reposts

Sections lazy-load on scroll. To extract a complete profile, scroll the main pane to the bottom in increments and re-snapshot. Some sections show a "Show all " link that opens a dedicated subpage with the full list.

Messaging

Inbox lives at /messaging/. Conversations are grouped by participant; the right pane shows the active conversation thread.

ElementSelector
Message list.msg-s-message-list-content
Message itemsli.msg-s-message-list__event
Compose container.msg-form__msg-content-container
Compose input.msg-form__contenteditable
Participant name.msg-entity-lockup__entity-title
Conversation items.msg-conversation-listitem

The compose input is a contenteditable div, not a <textarea>browser.type works, browser.fill does not. Standard messaging is free; InMail is reserved for premium / Sales Navigator / Recruiter and is rate-limited per month.

Messaging tone

  • Keep replies 2–3 sentences max.
  • Professional but warm; no aggressive sales pitch.
  • Open with something specific to the person — not generic.
  • End with a clear next step or question.
  • Drafted replies append "Sent from sidebutton.com" footer (editable before send).

Connection requests

Connection requests are sent from a person's profile via the Connect button. LinkedIn enforces ~100 sent requests per week before throttling. A personalized note (max 300 chars) significantly improves accept rate. Requests can be withdrawn from /mynetwork/invitation-manager/sent/.

Feed

The feed at /feed/ is algorithmic. Posts can be Liked, Commented on, Shared, Saved, or Reported. Hashtags are clickable and route to /feed/hashtag/<tag>/. The composer at the top supports text, images, video, document, poll, event, celebrate, and "Find an expert."

Posting conventions:

  • No hashtag spam — three max.
  • Don't pitch products unless asked.
  • Engage with replies — silent posts under-perform.

Hiring / Recruiting

When the user has Recruiter Lite or is the job poster, the applicants list at /hiring/jobs/<id>/applicants/ shows candidates for that job.

ElementSelector
Applicant list items.hiring-applicants__list-item
Applicant header.hiring-applicant-header
Manage job buttonbutton[aria-label^='Manage job']

Applicant detail pages trigger LinkedIn's security/rate-limit scan on first load. Batch validators must run a "warm-up" pass — clicking each applicant to seed the cache — before they can extract data without intermittent 429s.

Workflows

WorkflowEmbedDescription
linkedin_thread_historySearches the inbox by person name (survives the Focused/Other split), opens the first matching thread, returns the search-result previews (one person can have several threads) plus full message history. Read-only; run before any outreach draft.
linkedin_profile_briefLight profile pass for message tailoring: current role and ventures, career arc, posting language/topics, a contact-type guess (buyer/operator/channel/multiplier/organizer/peer), and 2–3 concrete tailoring hooks. Catches stale headlines (the 2019 developer who is an angel now).
linkedin_draft_outreachFinds a person's thread via search, clears the compose box in-page, and types caller-supplied message text. Draft only — never sends; a human presses Enter. Requires an existing thread (profile-overlay compose lives in an unreachable iframe).
linkedin_outreach_prepComposite per-person pass: thread history → profile extract → LLM writes a ~35-word tailored message (builder opener, unlimited-context mechanism, one personalization clause, no call CTA) → types it into the compose box and stops for review.
linkedin_lead_healthFull-profile scrape + ICP scorecard (0–11, tier A–D) against the 2026-08 outreach strategy (non-technical queue-owner buyer), with detected signals and a suggested angle. Heavier than linkedin_profile_brief; meant for batch enrichment.
linkedin_draft_replyMessaging compose boxExtracts the participant name and types a fixed polite decline ("we no longer require freelance support — handled through sidebutton.com") into the message box. No LLM step, no params, no footer.
linkedin_get_contact_infoOpens a profile, clicks Contact info, and returns public fields (URL, websites, phones, email, IM, birthday, address, connected-on) as JSON. Uses dialog[aria-labelledby="dialog-header"] since LinkedIn class names are obfuscated.
linkedin_privacy_modeMessaging sidebarInjects CSS to blur avatars (10px) and names (6px) for safe screen sharing and video recording. Disable by refreshing page.
linkedin_validate_applicationApplicant list itemsAI-validates a single job applicant against requirements. Extracts profile, generates fit score (1–10), strengths, gaps, and recommendation.
linkedin_validate_applicantsApplicants page headerTwo-pass batch validation of 1–25 applicants: warm-up phase (triggers security scans), then AI-validates each. Generates summary with Good Fit / Maybe / Not a Fit counts.

Outreach flow

The intended per-person sequence for first-touch outreach, mirroring the manual loop it replaced: linkedin_thread_history (is there prior contact? did THEY write first?) → linkedin_profile_brief (who are they today, what type of contact) → draft review by a human → linkedin_draft_outreach to place the text. linkedin_outreach_prep chains all of it in one call for the standard case. None of these send — sending is always a human Enter in the compose box.

Sub-workflow dependencies

linkedin_validate_applicants calls three sub-workflows not yet included in this pack:

Sub-workflowPurpose
linkedin_extract_job_requirementsNavigate to job posting, extract requirements summary
linkedin_warmup_candidateClick each candidate to trigger LinkedIn's lazy-load/security scan
linkedin_validate_single_applicantExtract and AI-validate one candidate's profile

Boundaries

  • Decline dev service pitches politely.
  • Don't engage with engagement-bait posts.
  • Respect InMail etiquette — one follow-up max.

Gotchas

  • LinkedIn heavily throttles automation — keep actions ~1s apart and human-paced.
  • Message compose box uses contenteditable div, not <textarea>.
  • Profile pages lazy-load sections on scroll — full extraction requires multiple scroll-and-snapshot passes.
  • Connection request limit is ~100/week before LinkedIn throttles or auto-rejects.
  • Hiring pages require LinkedIn Recruiter or job poster access — non-poster accounts see a 404.
  • Applicant detail pages trigger security scans on first load — batch validators must warm-up first.
  • browser.type into contenteditable works; browser.fill does not (React-compat fill breaks LinkedIn's custom editor).
  • Sales Navigator and Recruiter are separate products with their own selectors — workflows here do not transfer to those surfaces.