Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
TIMEOUTNoBrowser page-operation timeout in milliseconds.5000
CHROME_PATHNoPath to a Chrome/Chromium executable to use instead of the bundled Chromium.
PROXY_BYPASSNoComma-separated proxy bypass list, e.g. localhost,127.0.0.1,::1 to reach local targets directly.
PROXY_SERVERNoRoute browser traffic through a proxy as scheme://host:port. Supported schemes are http, https, socks4, and socks5.
TOOL_TIMEOUTNoTimeout in seconds for a whole tool call. Raise it for calls that read many pages, slow networks, or a cold-start browser.180
PROXY_PASSWORDNoPassword for proxy authentication.
PROXY_USERNAMENoUsername for proxy authentication.
UV_HTTP_TIMEOUTNouv's HTTP timeout in seconds. The recommended config sets this to 300 to avoid slow first-run dependency downloads.
LOGIN_INLINE_WAITNoSeconds a tool call waits for a login to finish before telling the model to retry. Max 45; 0 returns at once.25
INSTALLER_TEMP_DIRNoExisting directory to use for browser installation temporary files.
LINKEDIN_MCP_CONTAINERNoOverride runtime container detection. Set to false to force non-container behavior, or true to force container behavior.
AUTO_IMPORT_FROM_BROWSERNoImport a session from a signed-in local browser on the first tool call that needs one. Skipped in Docker, behind a proxy, and on non-loopback HTTP binds.true
FASTMCP_HTTP_ALLOWED_HOSTSNoJSON array of additional allowed HTTP Host header values for the streamable HTTP server, e.g. ["mcp.example"].
EXPERIMENTAL_PERSIST_DERIVED_RUNTIMENoIn Docker, keep the derived runtime profile instead of rebuilding it on every start.

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
}
logging
{}
prompts
{
  "listChanged": true
}
resources
{
  "subscribe": false,
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_person_profileC

Get a specific person's LinkedIn profile.

search_peopleC

Search for people on LinkedIn.

connect_with_personA

Send a LinkedIn connection request or accept an incoming one.

The tool is annotated with destructiveHint so MCP clients will prompt for user confirmation before execution.

get_sidebar_profilesA

Get profile links from sidebar recommendation sections on a LinkedIn profile page.

Extracts profiles from "More profiles for you", "Explore premium profiles", and "People you may know" sidebar sections. Follows "Show all" links to return the full list from each section. Sections that redirect to linkedin.com/premium are skipped.

get_my_profileA

Get the authenticated user's own LinkedIn profile.

Navigates to /in/me/ and resolves the redirect to obtain the real username before reading the profile, so the url field in the result is the actual profile URL (e.g. linkedin.com/in/johndoe/) rather than /in/me/.

get_company_profileC

Get a specific company's LinkedIn profile.

get_company_postsC

Get recent posts from a company's LinkedIn feed.

search_companiesB

Search for companies on LinkedIn.

get_company_employeesA

List employees at a company from the LinkedIn /people/ page, including the demographics aggregate that this view exposes: where employees live, where they studied, and a function breakdown (Engineering, Sales, Operations, etc.). The demographics are unique to this tool.

For filtered search by network degree (1st/2nd/3rd) or location, prefer search_people with current_company set to the company URN id. That path also returns more result pages than the /people/ tab.

The optional keywords filter narrows results by name, title, or skill.

company_name must be the exact LinkedIn URL slug (the path segment after /company/), not the display name. LinkedIn assigns unique slugs and the display name often does not match. For example, the AI lab Anthropic lives at /company/anthropicresearch/, not /company/anthropic/. If you are unsure of the slug, call search_companies first and pick the slug from the returned references.

get_job_detailsA

Get job details for a specific job posting on LinkedIn.

get_job_apply_urlA

Get how a job posting takes applications, and the employer's application link.

Reads the posting without clicking anything.

get_easy_apply_formA

Read the questions of a job posting's Easy Apply form, without answering them.

Opens Easy Apply and reads each step: every field's label, type, whether it is required, its options, character limit and prefilled value. Next is clicked only while LinkedIn accepts a step on its prefilled values, so the first step that needs input ends the read. Nothing is typed, Review and Submit are never clicked, and the dialog is closed with its draft discarded.

search_jobsA

Search for jobs on LinkedIn.

Returns job_ids that can be passed to get_job_details for full info.

LinkedIn is moving accounts to a redesigned job search, which keeps only the keywords, date_posted and paging. It drops the filters marked "Classic search only" and reports them in section_errors as filters_dropped. When it drops the location or work type, search again with them in the keywords ("remote python developer in Lyon") and keep doing so; words such as "senior" or "internship" there narrow the results too. Quotes do not make a phrase exact on that search.

get_saved_jobsA

List the authenticated user's jobs at one stage of LinkedIn's job tracker.

Returns job_ids that can be passed to get_job_details for full info.

dismiss_jobA

Dismiss a job from LinkedIn job search so later searches never show it.

For jobs already applied to or rejected. Reads the job's title and company from its posting, clicks the dismiss button on its card in a worldwide search for them, then reloads that search to confirm the job is gone. Irreversible: LinkedIn offers no undo after a reload. A job that search does not list on its first page is an error, since an already dismissed job and a search that missed it look the same.

get_inboxC

List recent conversations from the LinkedIn messaging inbox.

The returned inbox text and result URL come from the ordinary messaging inbox. Click-derived conversation references are collected separately after requesting the compose page, which avoided inbox auto-opening on the measured variant. A row contributes a click-derived reference only after its click is followed by an observed different thread path. The scan stops at its first unverifiable click. section_errors.inbox reports that stop or unavailable scan rows; captured inbox text and independently extracted anchors retain their normal handling. A known thread_id can bypass row attribution when calling get_conversation.

get_conversationA

Read a specific messaging conversation.

Provide either linkedin_username or thread_id to identify the conversation.

When looked up by linkedin_username, resolution searches the messaging inbox for the participant's display name and click-visits every matching row to capture its thread ID — LinkedIn's sidebar has no anchor hrefs or thread-id attributes, so this is the only available path. Each visit selects the row in the LinkedIn UI and may mark it as read. Pass thread_id directly to skip this enumeration.

Username resolution scans matching rows from a requested compose page first. Its indexable sequence ends before the first unresolved click, missing matching click target, or admitted row that fails the existing exact display-name check. An index outside that verified prefix is refused with its reason. Search is a fallback only when the inbox scan has no observed matching result and no such barrier; it never substitutes a result after a stopped or gapped inbox scan. Pass a known thread_id to bypass username/index resolution.

search_conversationsC

Search messages by keyword.

Click-derived references require an observed different thread path after each row click. The first unverifiable click stops further row clicks and is reported in section_errors.search_results. Already-read text and independently extracted anchors retain their normal handling. A result without that diagnostic does not guarantee that every conversation was enumerated.

archive_conversationA

Archive one LinkedIn messaging thread, InMail included, by thread ID.

Opens the thread, which marks it read, and chooses Archive from its options menu. A thread LinkedIn already files as archived is left alone and reported already_archived, so a repeated call clicks nothing. The change is confirmed by loading the thread again. Reversible on LinkedIn; a new message moves the thread back to the inbox.

send_messageA

Compose and send a new message to a LinkedIn user.

Profile-based targeting opens LinkedIn's compose flow. It is not a safe reply path for an existing recruiter/InMail or messaging thread: it may create a separate DM even after you inspect that thread with get_conversation or search_conversations. To answer an existing thread, including an InMail from someone who is not a connection, use reply_to_conversation with the thread's id instead.

The recipient must be directly messageable from the profile page. If LinkedIn does not expose a normal Message action, use connect_with_person first, then retry send_message only after the connection request is accepted. A status of enter_to_send_enabled means the account has LinkedIn's "Press Enter to Send" preference on, which hides the Send button; relay the returned instructions to the user, who switches it to "Click Send to send" before retrying. The dry run (confirm_send False) reports it too. Recipient authorization comes from validating one recipient-specific Message action carrying the target URN, then following its browser navigation and pinning the exact final route. Visible profile links or recipient URNs in the composer are optional corroboration; any contradiction fails closed. No Voyager or other private API is used. This is a write operation when confirm_send is True.

thread_id is present only on sent: the conversation the confirmed message was observed in, or null when the page stayed on the compose route. retry_safe stays the authority for whether a retry is safe.

reply_to_conversationA

Reply inside an existing LinkedIn messaging thread, InMail included.

Opens /messaging/thread/<thread_id>/ and types into that thread's own reply composer, so the message lands in the same conversation. This is the path for answering a recruiter InMail, whose sender may have no Message action on their profile. Get the thread_id from get_inbox, search_conversations or get_conversation.

The thread is verified before anything is typed: the page must land on exactly the requested thread and stay there, and the composer must be the page's one visible editor, inside the thread's main region, with one submit button in its own form. Any doubt fails closed. Quick-reply buttons an InMail shows ("Yes, interested...", "No thanks...") are never clicked; a thread that offers only those has no composer and returns composer_unavailable. A draft already in the composer is left untouched and returns composer_occupied. A status of enter_to_send_enabled means LinkedIn's "Press Enter to Send" preference hides the Send button; relay the returned instructions as for send_message. The dry run reports it too. No Voyager or other private API is used. This is a write operation when confirm_send is True.

get_feedA

Get posts from the authenticated user's LinkedIn feed.

search_postsA

Search LinkedIn posts/content globally by keyword (the "Posts" tab).

Use this to catch informal hiring posts ("we're hiring", "Buscamos ...", "estamos contratando", "join our team") that often appear before a formal job listing exists. This is global content search, distinct from get_feed (your own home feed) and get_company_posts (one company's page).

close_sessionA

Close the current browser session and clean up resources.

get_session_statusA

Report local saved-session and serving-process state for requested diagnostics.

Reads local observations without opening a browser, starting setup or login, or contacting LinkedIn. Stored files do not prove current authentication. In shared-browser mode these observations belong to the owner, not to a frontend running a login. It answers during browser work without refreshing the browser idle timer. Use ordinary LinkedIn tools directly for their requested work rather than adding a status preflight.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.7/5.0

Scored across 25 tools

Disambiguation4/5

Most tools target a clear resource+action, and the descriptions go out of their way to separate near-neighbors (send_message vs reply_to_conversation, get_feed vs search_posts vs get_company_posts, get_company_employees vs search_people). A few pairs still require reading long prose to distinguish, notably send_message/reply_to_conversation and get_job_apply_url/get_easy_apply_form/get_job_details, and get_sidebar_profiles overlaps conceptually with search_people.

Naming Consistency5/5

Every tool is snake_case with a verb-first pattern (get_*, search_*, send_*, reply_to_*, archive_*, close_*, dismiss_*, connect_with_*). No mixed casing or stylistic drift, and names are readable and predictable.

Tool Count4/5

25 tools is at the upper bound, but the LinkedIn domain is genuinely broad (people, companies, jobs, messaging, feed, session) and each tool maps to a distinct operation rather than being a variant of another. Slightly heavy, but the surface is defensible rather than padded.

Completeness4/5

Strong lifecycle coverage: profile reads, people/company/job/post search, connection requests, full messaging flow (inbox, read, search, reply, send, archive), job details/saved/dismiss, and session management. Gaps exist around writing actions — no save_job (only get_saved_jobs), no post creation/like/comment, no withdraw/remove connection, and Easy Apply is read-only with no submit path.

Maintenance

ActivityMaintained
ResponsivenessNo issues