Skip to main content
Glama
IzikStar

linkedin-agent-mcp

by IzikStar

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
LOG_LEVELNoLog level: `debug`…`silent`; always written to stderrinfo
DATABASE_PATHNoSQLite database file path<home>/agent.db
BROWSER_CHANNELNoBrowser channel to use: `chrome` | `msedge` | `chromium`chrome
DEBUG_SNAPSHOTSNoSave HTML on `LINKEDIN_CHANGED` for selector repairfalse
BROWSER_HEADLESSNoRun the browser headless. `npm run login` is always visible regardless of this setting.true
DEFAULT_MAX_RESULTSNoDefault max results; hard cap is 2510
LINKEDIN_AGENT_HOMENoRoot for all local state~/.linkedin-agent-mcp
LINKEDIN_PROFILE_DIRNoBrowser profile directory<home>/browser-profile
BROWSER_IDLE_CLOSE_MSNoIdle timeout in milliseconds after which the browser is closed (default 5 min)300000
CONFIRMATION_TTL_MINUTESNoConfirmation validity in minutes10
EXECUTIONS_PER_HOUR_LIMITNoCap on executed external actions per hour10
MIN_NAVIGATION_INTERVAL_MSNoSpacing between page loads in milliseconds3000

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
}

Tools

Functions exposed to the LLM to take actions

NameDescription
linkedin_auth_statusA

[READ - no LinkedIn state is changed] Checks whether the persistent browser profile is signed in to LinkedIn. Use it to diagnose NOT_AUTHENTICATED / LOGIN_REQUIRED errors. Never returns cookies or tokens. If not signed in, the USER must run npm run login; the agent cannot log in.

linkedin_search_jobsA

[READ - no LinkedIn state is changed] Searches LinkedIn jobs and returns at most 25 results (one page). Every result is recorded in local tracking and annotated with isNew / localStatus, so you can tell jobs the user has never seen from ones already seen, saved, rejected or applied to. Set onlyNew=true to return only never-before-seen jobs. Use LinkedIn job IDs (the id field) to refer to jobs. Do not call repeatedly in a loop.

linkedin_get_jobA

[READ - no LinkedIn state is changed] Opens one LinkedIn job posting and returns its full description and metadata, plus local tracking info. Fields LinkedIn does not show are omitted (never guessed). Marks the job as "viewed" locally. Use it before analysing a job against the user's CV.

linkedin_get_saved_jobsA

[READ - no LinkedIn state is changed] Reads LinkedIn's own Saved-jobs list (My items -> Job tracker -> Saved), i.e. jobs actually saved on the real account right now, not just local tracking. Each result is recorded in local tracking (localStatus becomes "saved" unless it was already further along, e.g. submitted). hasMore=true means there are more saved jobs than maxResults returned; call again with a larger maxResults to see them.

linkedin_get_profileA

[READ - no LinkedIn state is changed] Reads the signed-in user's OWN profile (headline, about, experience, education, skills). incompleteSections lists anything that could not be read completely; treat those parts as unknown, not empty.

linkedin_get_companyA

[READ - no LinkedIn state is changed] Reads a company's public LinkedIn 'About' page (description, industry, size, headquarters, website).

linkedin_list_tracked_jobsA

[READ - no LinkedIn state is changed] Lists jobs from LOCAL tracking only (no LinkedIn access), optionally by local status (discovered, viewed, considering, saved, rejected, ...). Use it to avoid re-presenting jobs the user already handled.

linkedin_get_applicationA

[READ - no LinkedIn state is changed] Returns the local state of an in-progress application: status, CV, fields and every question with its answer/source (profile, config, user, or proposed) and whether it still needsInput. Local state only, never touches LinkedIn.

linkedin_preview_applicationA

[READ - no LinkedIn state is changed] Renders the exact human-readable payload for an application (job, CV, fields, every question and its answer) so the user can review it before any confirmation. readyToSubmit is false while any question is unanswered; use linkedin_provide_application_answer for those first. Local state only, never touches LinkedIn.

linkedin_get_actionA

[READ - no LinkedIn state is changed] Returns the state and exact preview of a prepared action (local state only). Use it to check whether the user has confirmed an action, or after an OUTCOME_UNKNOWN error.

linkedin_list_actionsA

[READ - no LinkedIn state is changed] Lists recent prepared actions and their states (local state only), optionally filtered by status.

linkedin_mark_jobA

[PREPARE - changes local state only; performs NO external action] Sets the LOCAL tracking status of a job the agent already knows (viewed, considering or rejected). Does not touch LinkedIn. Use "rejected" only when the USER said they are not interested, so it is not shown again.

linkedin_prepare_save_jobA

[PREPARE - changes local state only; performs NO external action] Prepares (does NOT perform) saving or un-saving a job on LinkedIn. Returns a PENDING action with a preview. Recommending a job does not require saving it; only prepare this when the user asked to save it. To execute: the user confirms in their terminal, then call linkedin_save_job / linkedin_unsave_job.

linkedin_prepare_profile_updateA

[PREPARE - changes local state only; performs NO external action] Prepares (does NOT apply) a change to the user's own LinkedIn headline (max 220 chars) or about section (max 2600 chars). Reads the current value from LinkedIn and returns current vs proposed as a PENDING action. Never propose changes the user did not ask for. This version cannot apply profile changes: show the preview so the user can apply it manually.

linkedin_draft_messageA

[PREPARE - changes local state only; performs NO external action] Stores a DRAFT LinkedIn message (max 2000 chars) to a recipient for the user to review. Nothing is sent. Draft only when the user asked for a message to a specific person; never because a recruiter was merely found. This version cannot send messages: show the draft so the user can send it manually.

linkedin_prepare_connection_requestA

[PREPARE - changes local state only; performs NO external action] Prepares (does NOT send) a LinkedIn connection request with an optional note (max 300 chars). Only for a specific person the user named. Never bulk-prepare. This version cannot send connection requests: show the preview so the user can do it manually.

linkedin_provide_application_answerA

[PREPARE - changes local state only; performs NO external action] Records the USER's own answer to one application question that could not be established from their profile/CV/config. Local state only, nothing is sent to LinkedIn. Never invent the answer yourself: only call this with an answer the user actually gave. Once every question is answered the application becomes READY_TO_SUBMIT; check with linkedin_preview_application.

linkedin_cancel_actionA

[PREPARE - changes local state only; performs NO external action] Cancels a PENDING or CONFIRMED action so it can never be executed (local state only). Use when the user changes their mind or the draft is superseded.

linkedin_save_jobA

[EXECUTE - external action; REQUIRES the user to have confirmed this exact action] Saves a job on LinkedIn (changes LinkedIn state; reversible with linkedin_unsave_job). Requires an actionId from linkedin_prepare_save_job that the USER has confirmed in their own terminal. Fails with CONFIRMATION_REQUIRED otherwise; do not retry in a loop, ask the user. Never save jobs just because they look good.

linkedin_unsave_jobA

[EXECUTE - external action; REQUIRES the user to have confirmed this exact action] Removes a job from the saved list on LinkedIn (changes LinkedIn state). Requires an actionId from linkedin_prepare_save_job (mode "unsave") that the USER has confirmed in their own terminal.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.1/5.0

Scored across 20 tools

Disambiguation5/5

Each tool targets a distinct resource and action, with clear READ/PREPARE/EXECUTE labels and local-vs-LinkedIn boundaries. Related pairs like get_action/list_actions and get_application/preview_application are differentiated by singular-vs-list and structured-state-vs-rendered-preview purposes.

Naming Consistency5/5

All tools use the same linkedin_ prefix and snake_case convention, mostly following a verb_noun pattern. Minor variations like linkedin_auth_status remain readable and do not break the overall consistency.

Tool Count3/5

At 20 tools, the set is on the heavy side and falls into the borderline 16-25 range. While many tools earn their place through the prepare/execute safety model, some pairs could potentially be consolidated.

Completeness3/5

Core job search, tracking, job detail, and application preparation are covered. However, execute tools are missing for application submission, message sending, connection request sending, and profile update application, creating notable dead ends for end-to-end workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues