LinkedIn MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LINKEDIN_HOST | No | Loopback HTTP bind address | 127.0.0.1 |
| LINKEDIN_PATH | No | HTTP endpoint path | /mcp |
| LINKEDIN_PORT | No | HTTP port | 8000 |
| LINKEDIN_SLOW_MO | No | Browser action delay in milliseconds | 0 |
| LINKEDIN_TIMEOUT | No | Browser timeout in milliseconds | 10000 |
| LINKEDIN_HEADLESS | No | Run without a visible browser | true |
| LINKEDIN_LOG_LEVEL | No | Log level: DEBUG, INFO, WARNING, or ERROR | WARNING |
| LINKEDIN_TRANSPORT | No | Transport mode: stdio or streamable-http | stdio |
| LINKEDIN_USER_AGENT | No | Optional browser user agent | |
| LINKEDIN_CHROME_PATH | No | Optional Chromium executable | |
| LINKEDIN_USER_DATA_DIR | No | Persistent browser profile directory | ~/.linkedin-mcp-server/browser-data |
| LINKEDIN_VIEWPORT_WIDTH | No | Browser viewport width | 1280 |
| LINKEDIN_VIEWPORT_HEIGHT | No | Browser viewport height | 720 |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_person_profileA | Get a specific person's LinkedIn profile. Args: linkedin_username: LinkedIn username (e.g., 'satyanadella', 'jeffweiner08') sections: Comma-separated list of extra sections to scrape. The main profile page is always included. Available sections: experience, education, interests, honors, languages, contact_info, posts Default (None) scrapes only the main profile page. |
| search_peopleB | Search for people on LinkedIn. Args: keywords: Search keywords (e.g., 'product manager', 'ML engineer at Meta') location: Optional location filter (e.g., 'London', 'Berlin') |
| send_connection_requestA | Preview or send a LinkedIn connection request without a note. The default confirm=false performs no write and reports whether the profile is ready, already connected, or already pending. Set confirm=true only after verifying the exact profile. This tool never adds a note. Args: linkedin_username: Exact LinkedIn profile username/slug. confirm: Must be true to actually send the invitation. |
| get_company_profileA | Get a specific company's LinkedIn profile. Args: company_name: LinkedIn company name (e.g., 'google', 'stripe', 'openai') sections: Comma-separated list of extra sections to scrape. The about page is always included. Available sections: posts, jobs Default (None) scrapes only the about page. |
| get_company_postsB | Get recent posts from a company's LinkedIn feed. Args: company_name: LinkedIn company name (e.g., 'google', 'stripe', 'openai') |
| get_job_detailsB | Get job details for a specific job posting on LinkedIn. Args: job_id: LinkedIn job ID (e.g., '3912045678', '4108763210') |
| search_jobsA | Search for jobs on LinkedIn. Returns job_ids that can be passed to get_job_details for full info. Args: keywords: Search keywords (e.g., 'backend developer', 'devops engineer') location: Optional location filter (e.g., 'Austin', 'Singapore') max_pages: Maximum number of result pages to load (1-10, default 3) date_posted: Filter by posting date (past_hour, past_24_hours, past_week, past_month) job_type: Filter by job type, comma-separated (full_time, part_time, contract, temporary, volunteer, internship, other) experience_level: Filter by experience level, comma-separated (internship, entry, associate, mid_senior, director, executive) work_type: Filter by work type, comma-separated (on_site, remote, hybrid) easy_apply: Only show Easy Apply jobs (default false) sort_by: Sort results (date, relevance) |
| close_browserA | Close the browser instance and release resources. Credentials are preserved. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
Each tool targets a distinct resource (people, companies, jobs, browser lifecycle), and search vs. detail operations are clearly separated. Minor overlap exists where get_company_profile can fetch posts via sections, duplicating get_company_posts.
All tools follow a consistent snake_case verb_noun pattern: search_*, get_*, send_*, close_*. The naming is predictable and makes the resource and action immediately clear.
Eight tools is a well-scoped set for a LinkedIn API covering people, companies, jobs, and connection actions. Each tool serves a distinct purpose without bloat.
The main workflows are covered: search people, view profiles, send connection requests, search jobs, get job details, and view company info/posts. Minor gaps exist, such as no company search, no connection request with a note, and no direct 'view my profile' tool.