Skip to main content
Glama
meskhetian

linkedin-applicants-mcp

by meskhetian

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
LINKEDIN_MCP_SPEEDNoSpeed preset: slow, normal or brisknormal
LINKEDIN_MCP_CDP_URLNoDevTools endpoint for cdp modehttp://127.0.0.1:9222
LINKEDIN_MCP_DATA_DIRNoData directory (database, Chrome profile, files, exports, logs)~/.linkedin-applicants-mcp
LINKEDIN_MCP_TIMEZONENoIANA timezone, e.g. Europe/Berlinsystem
LINKEDIN_MCP_LOG_LEVELNoLog level: debug, info, warn or errorinfo
LINKEDIN_MCP_WORK_DAYSNoWork days: 0 = Sunday … 6 = Saturday1,2,3,4,5
LINKEDIN_MCP_RAMP_STARTNoWarm-up ramp start; 0 disables it25
LINKEDIN_MCP_WORK_HOURSNoLocal working window09:00-19:00
LINKEDIN_MCP_CAPTURE_RAWNoPersist every captured LinkedIn payload under <data>/debug/raw (heavy)false
LINKEDIN_MCP_BROWSER_MODENoBrowser mode: persistent or cdppersistent
LINKEDIN_MCP_RAMP_PER_DAYNoWarm-up ramp per day; 0 disables it10
LINKEDIN_MCP_CHROME_CHANNELNoChrome channel: chrome, msedge or chromium (must be installed)chrome
LINKEDIN_MCP_DASHBOARD_PORTNoPort for npm run dashboard4173
LINKEDIN_MCP_AUTOSTART_WORKERNoStart the worker inside the MCP server processtrue
LINKEDIN_MCP_PROFILE_STRATEGYNoProfile strategy: auto, voyager or domauto
LINKEDIN_MCP_DAILY_PROFILE_CAPNoFull profile views per day80
LINKEDIN_MCP_HOURLY_ACTION_CAPNoLinkedIn page actions per rolling hour40
LINKEDIN_MCP_DAILY_APPLICANT_CAPNoApplication pages per day120
LINKEDIN_MCP_SAVE_PDF_MONTHLY_CAPNoCap for LinkedIn Save to PDF150

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
browser_statusA

Report whether the Chrome session is connected, whether LinkedIn is logged in, the current URL and any checkpoint (verification / login wall). Never launches a browser. Call this first, and whenever the queue reports needsHuman.

browser_open_loginA

Launches (or connects to) your own Google Chrome with the dedicated profile and opens LinkedIn so YOU can sign in manually in the visible window. Nothing is typed on your behalf. Waits up to timeoutSeconds for the login to complete, then returns the status. Use before the first sync and whenever browser_status shows loggedIn=false or a checkpoint. After solving a checkpoint call queue_resume.

browser_closeA

Stops the background worker and closes the Chrome window this server launched (in cdp mode it only disconnects; your Chrome keeps running). Queued tasks stay in the database; queue_start relaunches when needed.

jobs_syncA

Queue a crawl of your posted jobs (/my-items/posted-jobs/, open and optionally closed) and store them locally. Runs in the background paced like a person (roughly 1–3 minutes). With wait=true the call blocks up to 2 minutes and returns the jobs found. Afterwards use jobs_list.

jobs_listA

List the posted jobs stored locally (from jobs_sync) with per-job progress counters: applicants stored, details fetched, resumes stored, profiles fetched, and applicant-list sync progress.

applicants_syncA

Queue a crawl of the applicant LIST for one job (or every known job): names, headlines, locations, applied dates, application ids and profile links, 25 per page. Thousands of applicants mean many pages, so the crawl runs in chunks of pagesPerRun pages per worker turn, persists progress after every page, and resumes automatically across restarts and working-hours windows. Hidden "Not a fit" applicants are included by default. This does NOT open individual applications (use applicants_fetch_details for contact info, resumes and profiles). Progress: queue_status or jobs_list.

applicants_fetch_detailsA

Queue the deep fetch for applicants: open each application page (contact email/phone when shared, screening answers, rating, applied date), download the resume, and (includeProfile) then visit the LinkedIn profile for the full structured profile. One applicant at a time, paced like a recruiter, within working hours and daily caps, so thousands of applicants take days to weeks by design. Defaults to only applicants not fetched yet. Returns how many were queued and a time estimate. Track with queue_status; read results with applicants_list / applicant_get / applicants_export.

applicants_fetch_profilesA

Queue full-profile fetches for applicants whose profile URL is known (from the list or application page) without re-opening their application. Use when details were fetched with includeProfile=false. Paced like a person; profile views are the most rate-sensitive action.

queue_statusA

Everything about the background work: worker state (running / paused / needsHuman), task counts by type and status, today's counters vs effective daily caps, whether we are inside the working-hours window and when the next window starts, per-job applicant-list sync progress, browser status and recent events. Poll this to follow long exports.

queue_startA

Start (or resume) the background worker in this process. It only acts when tasks are pending and the scheduler allows it. No-op if another process (npm run worker) owns the queue.

queue_pauseA

Pause processing after the current task finishes. Tasks stay queued. Resume with queue_resume.

queue_resumeA

Clear the paused flag and, by default, the needsHuman flag set after a LinkedIn checkpoint or login wall (call after you solved it in the Chrome window), then start the worker.

queue_cancelA

Cancel PENDING tasks matching the filters (type / jobId / applicationId). Without filters cancels every pending task. Running tasks finish; done work is untouched.

queue_retry_failedA

Put failed tasks back into the queue with a fresh attempt budget (optionally filtered by type / jobId). Useful after fixing a login problem or when LinkedIn had a bad day.

queue_tasksA

Recent tasks with status, attempts and last error (filter by type / status / jobId). Use to see why something failed.

pacing_getA

Current human-pacing settings: speed, working hours/days, daily caps (with warm-up ramp), hourly cap, break pattern, delay table.

pacing_setA

Adjust how fast/when the worker acts. Persisted. Slower is safer: the defaults mimic a recruiter reviewing applicants during office hours. Raising dailyProfileCap above ~100 or hourlyActionCap above ~60 materially increases the chance LinkedIn restricts the account.

applicants_listA

Page through applicants stored locally, with filters and full-text search over name, headline, resume text and profile text (prefix matching, e.g. "kubern django"). Rows omit resume/profile bodies; use applicant_get for one applicant. Reads the local database only (no LinkedIn traffic).

applicant_getA

Full local record for one applicant: list fields, application details (email/phone when shared, screening answers, rating), resume text (clipped to maxChars) and the structured LinkedIn profile. Local database only.

resume_textA

Plain text extracted from the downloaded resume (PDF/DOCX) of one applicant, clipped to maxChars. Empty when the resume was a scanned image or was not downloaded.

applicants_exportA

Write all stored applicants (optionally one job) to a CSV, JSON or JSONL file on disk and return the path. Streams, so thousands of rows are fine. CSV is Excel-friendly (UTF-8 BOM) and guards against formula injection.

debug_snapshotA

Save a full-page screenshot, the HTML, the visible text and all captured network payloads of the current tab into the debug directory. Use when a task fails with "Could not find …" so selectors can be updated.

debug_navigateA

Navigate the working tab to a linkedin.com URL the human way (paced), then report the final URL, title and checkpoint state. Pause the queue first so you do not fight the worker for the tab.

debug_page_textB

Return the innerText of (or body) of the current tab, clipped. Cheap way to see what LinkedIn is showing.

debug_findA

Count and describe elements matching a selector on the current tab: text, href, aria-label, data-view-name, componentkey, class. Use to repair src/linkedin/selectors.ts when LinkedIn changes markup.

debug_clickA

Click the first visible element matching a selector on the current tab, with the same paced mouse movement the worker uses, then report the resulting URL, title, checkpoint state and the number of matches. For exploring pagination / menus while adapting selectors. Read-only actions only: never use it to rate, shortlist, move or message applicants.

debug_capturesA

List the JSON / RSC responses LinkedIn's own web app fetched while we browsed (Voyager REST, GraphQL, flagship-web). This is how you discover the endpoints and shapes behind the hiring dashboard. Bodies clipped to 2000 chars.

Prompts

Interactive templates invoked by user choice

NameDescription
review_applicantsScore every stored applicant of a job against hiring criteria using the local data (resume text, profile, screening answers) and produce a ranked table.

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.7/5.0

Scored across 27 tools

Disambiguation4/5

Tools are grouped by clear resource prefixes (browser_, debug_, jobs_, applicants_, queue_, pacing_) and the descriptions sharply separate crawling stages—list sync vs detail fetch vs profile fetch. A couple of controls could be confused (queue_start vs queue_resume, debug_click vs debug_navigate), but the descriptions resolve those boundaries.

Naming Consistency4/5

Most names follow a domain_prefix + verb pattern (queue_pause, pacing_set, applicants_export), so the set is predictable. Deviations include 'browser_open_login' (resource+verb+object), noun-only names like 'resume_text' and 'queue_tasks', and mixed applicant/applicants singular/plural, but these are minor.

Tool Count2/5

At 27 tools, this exceeds a comfortable agent surface and falls in the 'too many' band, especially since 6 debug_* and 9 queue_* tools are operational rather than core applicant functions. The browser-automation domain justifies some of them, but an agent will still face a large selection problem.

Completeness4/5

The core read/extract lifecycle is well covered: jobs sync/list, applicant list/detail/profile/resume fetch, local search/get, and export. Gaps are mostly write-side (no shortlist, rate, or status changes) and there is no one-shot 'sync everything', but those appear to be out of scope or handled via manual browser work.

Maintenance

ActivityMaintained
ResponsivenessResponsive