MCP-LinkedIn
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP-LinkedInget my recommended jobs I can apply to"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LinkedIn MCP Server
Through this LinkedIn MCP server, AI assistants like Claude can connect to your LinkedIn. Give access to profiles and companies, get your recommended jobs, or search for keywords. All from a Docker container on your machine.
Installation Methods
https://github.com/user-attachments/assets/eb84419a-6eaf-47bd-ac52-37bc59c83680
Related MCP server: LinkedIn MCP Server
Usage Examples
What are my recommended jobs I can apply to?Research the background of this candidate https://www.linkedin.com/in/stickerdaniel/Get this company profile for partnership discussions https://www.linkedin.com/company/inframs/Suggest improvements for my CV to target this job posting https://www.linkedin.com/jobs/view/4252026496Features & Tool Status
Profile Scraping (
get_person_profile): Get detailed information from a LinkedIn profile including work history, education, skills, and connectionsCompany Analysis (
get_company_profile): Extract comprehensive company information from a LinkedIn company profile nameJob Details (
get_job_details): Retrieve specific job posting details using LinkedIn job IDsJob Search (
search_jobs): Search for jobs with filters like keywords and locationRecommended Jobs (
get_recommended_jobs): Get personalized job recommendations based on your profileSession Management (
close_session): Properly close browser session and clean up resources
July 2025: All tools are currently functional and actively maintained. If you encounter any issues, please report them in theGitHub issues.
🐳 Docker Setup (Recommended - Universal)
Prerequisites: Make sure you have Docker installed and running.
Installation
Client Configuration:
{
"mcpServers": {
"linkedin": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "LINKEDIN_COOKIE",
"stickerdaniel/linkedin-mcp-server:latest"
],
"env": {
"LINKEDIN_COOKIE": "li_at=YOUR_COOKIE_VALUE"
}
}
}
}Getting the LinkedIn Cookie
Open LinkedIn and login
Open Chrome DevTools (F12 or right-click → Inspect)
Go to Application > Storage > Cookies > https://www.linkedin.com
Find the cookie named
li_atCopy the Value field (this is your LinkedIn session cookie)
Use this value as your
LINKEDIN_COOKIEin the configuration
Run the server with the --get-cookie flag:
docker run -it --rm \
stickerdaniel/linkedin-mcp-server:latest \
--get-cookieCopy the cookie from the output and set it as LINKEDIN_COOKIE in your client configuration. If this fails with a captcha challenge, use the method above.
The cookie will expire during the next 30 days. Just get the new cookie and update your client config. There are also many cookie manager extensions that you can use to quickly copy the cookie.
Docker Setup Help
Transport Modes:
Default (stdio): Standard communication for local MCP servers
Streamable HTTP: For a web-based MCP server
CLI Options:
--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--no-lazy-init- Login to LinkedIn immediately instead of waiting for the first tool call--transport {stdio,streamable-http}- Set transport mode--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--get-cookie- Attempt to login with email and password and extract the LinkedIn cookie--cookie {cookie}- Pass a specific LinkedIn cookie for login--user-agent {user_agent}- Specify custom user agent string to prevent anti-scraping detection
HTTP Mode Example (for web-based MCP clients):
docker run -it --rm \
-e LINKEDIN_COOKIE="li_at=YOUR_COOKIE_VALUE" \
-p 8080:8080 \
stickerdaniel/linkedin-mcp-server:latest \
--transport streamable-http --host 0.0.0.0 --port 8080 --path /mcpTest with mcp inspector:
Install and run mcp inspector
bunx @modelcontextprotocol/inspectorClick pre-filled token url to open the inspector in your browser
Select
Streamable HTTPasTransport TypeSet
URLtohttp://localhost:8080/mcpConnect
Test tools
Docker issues:
Make sure Docker is installed
Check if Docker is running:
docker ps
Login issues:
Ensure your LinkedIn cookie is set and correct
Make sure you have only one active LinkedIn session per cookie at a time. Trying to open multiple sessions with the same cookie will result in a cookie invalid error.
LinkedIn may require a login confirmation in the LinkedIn mobile app for --get-cookie
You might get a captcha challenge if you logged in a lot of times in a short period of time, then try again later or follow the local setup instructions to run the server manually in --no-headless mode where you can debug the login process (solve captcha manually)
📦 Claude Desktop (DXT Extension)
Prerequisites: Claude Desktop and Docker installed
One-click installation for Claude Desktop users:
Download the DXT extension
Double-click to install into Claude Desktop
Set your LinkedIn cookie in the extension settings
Getting the LinkedIn Cookie
Open LinkedIn and login
Open Chrome DevTools (F12 or right-click → Inspect)
Go to Application > Storage > Cookies > https://www.linkedin.com
Find the cookie named
li_atCopy the Value field (this is your LinkedIn session cookie)
Use this value as your
LINKEDIN_COOKIEin the configuration
Run the server with the --get-cookie flag:
docker run -it --rm \
stickerdaniel/linkedin-mcp-server:latest \
--get-cookieCopy the cookie from the output and set it as LINKEDIN_COOKIE in your client configuration. If this fails with a captcha challenge, use the method above.
The cookie will expire during the next 30 days. Just get the new cookie and update your client config. There are also many cookie manager extensions that you can use to quickly copy the cookie.
DXT Extension Setup Help
Docker issues:
Make sure Docker is installed
Check if Docker is running:
docker ps
Login issues:
Ensure your LinkedIn cookie is set and correct
Make sure you have only one active LinkedIn session per cookie at a time. Trying to open multiple sessions with the same cookie will result in a cookie invalid error.
LinkedIn may require a login confirmation in the LinkedIn mobile app for --get-cookie
You might get a captcha challenge if you logged in a lot of times in a short period of time, then try again later or follow the local setup instructions to run the server manually in --no-headless mode where you can debug the login process (solve captcha manually)
🚀 uvx Setup (Quick Install - Universal)
Prerequisites: Make sure you have uv installed.
Installation
Run directly from GitHub without cloning:
# Run directly from GitHub (latest version)
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server --help
# Run with your LinkedIn cookie
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server --cookie "li_at=YOUR_COOKIE_VALUE"Getting the LinkedIn Cookie
Open LinkedIn and login
Open Chrome DevTools (F12 or right-click → Inspect)
Go to Application > Storage > Cookies > https://www.linkedin.com
Find the cookie named
li_atCopy the Value field (this is your LinkedIn session cookie)
Use this value as your
LINKEDIN_COOKIEin the configuration
Run the server with the --get-cookie flag:
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server \
linkedin-mcp-server --get-cookieCopy the cookie from the output and set it as LINKEDIN_COOKIE in your client configuration. If this fails with a captcha challenge, use the method above.
The cookie will expire during the next 30 days. Just get the new cookie and update your client config. There are also many cookie manager extensions that you can use to quickly copy the cookie.
uvx Setup Help
Client Configuration:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/stickerdaniel/linkedin-mcp-server",
"linkedin-mcp-server"
],
"env": {
"LINKEDIN_COOKIE": "li_at=YOUR_COOKIE_VALUE"
}
}
}
}Transport Modes:
Default (stdio): Standard communication for local MCP servers
Streamable HTTP: For web-based MCP server
CLI Options:
--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--no-lazy-init- Login to LinkedIn immediately instead of waiting for the first tool call--transport {stdio,streamable-http}- Set transport mode--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--get-cookie- Attempt to login with email and password and extract the LinkedIn cookie--cookie {cookie}- Pass a specific LinkedIn cookie for login--user-agent {user_agent}- Specify custom user agent string to prevent anti-scraping detection
Basic Usage Examples:
# Run with cookie from environment variable
LINKEDIN_COOKIE="YOUR_COOKIE_VALUE" uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server
# Run with cookie via flag
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server --cookie "YOUR_COOKIE_VALUE"
# Run with debug logging
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server --log-level DEBUG
# Extract cookie with credentials
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server --get-cookieHTTP Mode Example (for web-based MCP clients):
uvx --from git+https://github.com/stickerdaniel/linkedin-mcp-server linkedin-mcp-server \
--transport streamable-http --host 127.0.0.1 --port 8080 --path /mcpTest with mcp inspector:
Install and run mcp inspector
bunx @modelcontextprotocol/inspectorClick pre-filled token url to open the inspector in your browser
Select
Streamable HTTPasTransport TypeSet
URLtohttp://localhost:8080/mcpConnect
Test tools
Installation issues:
Ensure you have uv installed:
curl -LsSf https://astral.sh/uv/install.sh | shCheck uv version:
uv --version(should be 0.4.0 or higher)
Cookie issues:
Ensure your LinkedIn cookie is set and correct
Cookie can be passed via
--cookieflag orLINKEDIN_COOKIEenvironment variableMake sure you have only one active LinkedIn session per cookie at a time
Login issues:
LinkedIn may require a login confirmation in the LinkedIn mobile app for --get-cookie
You might get a captcha challenge if you logged in a lot of times in a short period
🐍 Local Setup (Develop & Contribute)
Prerequisites: Chrome browser and Git installed
ChromeDriver Setup:
Check Chrome version: Chrome → menu (⋮) → Help → About Google Chrome
Download matching ChromeDriver: Chrome for Testing
Make it accessible:
Place ChromeDriver in PATH (
/usr/local/binon macOS/Linux)Or set:
export CHROMEDRIVER_PATH=/path/to/chromedriverif no CHROMEDRIVER_PATH is set, the server will try to find it automatically by checking common locations
Installation
# 1. Clone repository
git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server
# 2. Install UV package manager
curl -LsSf https://astral.sh/uv/install.sh | sh
uv python # install python if you don't have it
# 3. Install dependencies and dev dependencies
uv sync
uv sync --group dev
# 4. Install pre-commit hooks
uv run pre-commit install
# 5. Start the server once manually
# You will be prompted to enter your LinkedIn credentials, and they will be securely stored in your OS keychain
# Once logged in, your cookie will be stored in your OS keychain and used for subsequent runs until it expires
uv run -m linkedin_mcp_server --no-headless --no-lazy-initLocal Setup Help
CLI Options:
--no-headless- Show browser window (debugging)--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--no-lazy-init- Login to LinkedIn immediately instead of waiting for the first tool call--get-cookie- Login with email and password and extract the LinkedIn cookie--clear-keychain- Clear all stored LinkedIn credentials and cookies from system keychain--cookie {cookie}- Pass a specific LinkedIn cookie for login--user-agent {user_agent}- Specify custom user agent string to prevent anti-scraping detection--transport {stdio,streamable-http}- Set transport mode--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--help- Show help
HTTP Mode Example (for web-based MCP clients):
uv run -m linkedin_mcp_server --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcpClaude Desktop:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-mcp-server", "run", "-m", "linkedin_mcp_server"]
}
}
}Login/Scraping issues:
Use
--no-headlessto see browser actions (captcha challenge, LinkedIn mobile app 2fa, ...)Add
--no-lazy-initto attempt to login to LinkedIn immediately instead of waiting for the first tool callAdd
--log-level DEBUGto see more detailed loggingMake sure you have only one active LinkedIn session per cookie at a time. Trying to open multiple sessions with the same cookie will result in a cookie invalid error. E.g. if you have a logged in browser session with a docker container, you can't use the same cookie to login with the local setup while the docker container is running / session is not closed.
ChromeDriver issues:
Ensure Chrome and ChromeDriver versions match
Check ChromeDriver is in PATH or set
CHROMEDRIVER_PATHin your env
Python issues:
Check Python version:
uv python --version(should be 3.12+)Reinstall dependencies:
uv sync --reinstall
Feel free to open an issue or PR!
Acknowledgements
Built with LinkedIn Scraper by @joeyism and FastMCP.
⚠️ Use in accordance with LinkedIn's Terms of Service. Web scraping may violate LinkedIn's terms. This tool is for personal use only.
Star History
License
This project is licensed under the Apache 2.0 license.
Available Tools
6 toolsclose_sessionA
Close the current browser session and clean up resources.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses the tool's destructive nature ('close' and 'clean up') which is helpful, but lacks details about what exactly gets destroyed, whether this action is reversible, authentication requirements, or error conditions. The description doesn't contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that states the core action first ('close the current browser session') followed by the secondary effect ('clean up resources'). Every word serves a purpose with zero redundancy or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a destructive operation with no annotations but an output schema exists, the description provides adequate context about what the tool does. It covers the main action and cleanup effect, though more behavioral details would be helpful. The existence of an output schema means return values are documented elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema description coverage, the baseline is 4. The description appropriately doesn't discuss parameters since none exist, and the schema already fully documents this. No additional parameter information is needed or provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('close') and target ('current browser session'), and mentions the additional effect of 'clean up resources'. It distinguishes from sibling tools which are all data retrieval operations. However, it doesn't specify what type of browser session or what resources are being cleaned up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context through 'current browser session', suggesting this should be used when a session is active and needs termination. However, it provides no explicit guidance about when to use this tool versus alternatives (none exist among siblings) or prerequisites for successful execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_profileA
Get a specific company's LinkedIn profile.
Args: company_name (str): LinkedIn company name (e.g., "docker", "anthropic", "microsoft") get_employees (bool): Whether to scrape the company's employees (slower)
Returns: Dict[str, Any]: Structured data from the company's profile
| Name | Required | Description | Default |
|---|---|---|---|
| company_name | Yes | ||
| get_employees | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions that 'get_employees' is slower, which is useful behavioral context. However, it lacks details on rate limits, authentication requirements, error handling, or whether this is a read-only operation (implied by 'Get' but not explicit). The description doesn't contradict any annotations, but it's incomplete for a tool that likely involves web scraping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: the first sentence states the purpose clearly. The 'Args' and 'Returns' sections are organized efficiently, with no wasted words. Every sentence adds value, such as the note on speed for 'get_employees', making it concise yet informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (2 parameters, 0% schema coverage, no annotations, but has an output schema), the description is reasonably complete. It explains the parameters and return type ('Structured data from the company's profile'), and the output schema handles return values. However, it could improve by addressing authentication, error cases, or sibling tool differentiation to be fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics: 'company_name' is explained as 'LinkedIn company name' with examples, and 'get_employees' is clarified with its effect on speed. This goes beyond the bare schema, though it doesn't cover all potential nuances like format constraints or default behavior details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get a specific company's LinkedIn profile.' It specifies the verb ('Get') and resource ('company's LinkedIn profile'), making it easy to understand. However, it doesn't explicitly differentiate from siblings like 'get_person_profile' or 'get_job_details', though the resource type (company vs. person/job) is implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_person_profile' for individual profiles or 'search_jobs' for job-related queries. There's no context about prerequisites, such as needing a LinkedIn session or authentication, which could be relevant given the sibling 'close_session'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_detailsA
Get job details for a specific job posting on LinkedIn
Args: job_id (str): LinkedIn job ID (e.g., "4252026496", "3856789012")
Returns: Dict[str, Any]: Structured job data including title, company, location, posting date, application count, and job description (may be empty if content is protected)
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that job descriptions 'may be empty if content is protected', which is valuable behavioral context. However, it doesn't mention authentication requirements, rate limits, error conditions, or data freshness - leaving gaps for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Perfectly structured with clear sections: purpose statement, Args with detailed parameter explanation, and Returns with comprehensive output description. Every sentence adds value with zero redundancy. The information is front-loaded and efficiently organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 1 parameter with 0% schema coverage and an output schema exists, the description does excellent work explaining both input and output semantics. However, for a LinkedIn API tool with no annotations, it could better address authentication, rate limits, or common error scenarios to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate fully. It provides excellent parameter semantics: defines job_id as 'LinkedIn job ID' with concrete examples ('4252026496', '3856789012'), clarifying format and purpose beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get job details'), target resource ('for a specific job posting on LinkedIn'), and distinguishes it from siblings like get_recommended_jobs (list) and search_jobs (search). The verb+resource combination is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'for a specific job posting' and listing sibling tools, but doesn't explicitly state when to use this vs. alternatives like search_jobs. It provides clear scope but lacks explicit comparison or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_person_profileA
Get a specific person's LinkedIn profile.
Args: linkedin_username (str): LinkedIn username (e.g., "stickerdaniel", "anistji")
Returns: Dict[str, Any]: Structured data from the person's profile
| Name | Required | Description | Default |
|---|---|---|---|
| linkedin_username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool does (retrieves profile data) and mentions the return format, but doesn't disclose authentication needs, rate limits, privacy considerations, or what happens with invalid usernames. The description adds basic context but lacks important operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly structured with a clear purpose statement followed by organized Args and Returns sections. Every sentence earns its place by providing essential information without redundancy. The formatting with clear sections makes it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (which handles return value documentation) and only one parameter, the description provides adequate context. It explains what the tool does and provides parameter examples, though it could benefit from more behavioral context about authentication or error handling for a profile lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It provides a clear example of the single parameter ('stickerdaniel', 'anistji') that helps understand the expected format, though it doesn't explain username validation rules or where to find usernames. This adds meaningful value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'specific person's LinkedIn profile', making the purpose explicit. It distinguishes from siblings like get_company_profile and get_job_details by specifying it's for a person's profile rather than company or job data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying it's for retrieving a specific person's profile, but doesn't explicitly state when to use this versus alternatives like search_jobs or get_recommended_jobs. It's clear this is for looking up individual profiles rather than broader searches or job listings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommended_jobsB
Get your personalized recommended jobs from LinkedIn
Returns: List[Dict[str, Any]]: List of recommended jobs
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns a list of recommended jobs but lacks details on authentication needs, rate limits, personalization criteria, or potential side effects. This is inadequate for a tool that likely requires user context and API constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with the core purpose in the first sentence and return format in the second. However, the second sentence 'Returns: List[Dict[str, Any]]: List of recommended jobs' is somewhat redundant given the output schema, slightly reducing efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (which covers return values) and no parameters, the description is minimally complete. However, it lacks context on personalization mechanics and doesn't compensate for the absence of annotations, making it adequate but with clear gaps for a tool that likely depends on user-specific data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, earning a baseline score of 4 for not adding unnecessary information beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get your personalized recommended jobs from LinkedIn' specifies the verb (get), resource (recommended jobs), and source (LinkedIn). However, it doesn't differentiate from sibling tools like 'search_jobs' or 'get_job_details', which would require explicit comparison to achieve a score of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'search_jobs' or 'get_job_details'. It mentions 'personalized recommended jobs' but doesn't clarify the context (e.g., based on user profile, recent activity) or exclusions, leaving the agent without explicit usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsC
Search for jobs on LinkedIn using a search term.
Args: search_term (str): Search term to use for the job search.
Returns: List[Dict[str, Any]]: List of job search results
| Name | Required | Description | Default |
|---|---|---|---|
| search_term | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the basic action ('search') but lacks details on permissions, rate limits, pagination, or what happens if no jobs are found. For a search tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and appropriately sized, with a clear purpose statement followed by separate 'Args' and 'Returns' sections. It's front-loaded and avoids unnecessary fluff, though the 'Returns' section could be more concise given the output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (search operation), lack of annotations, and presence of an output schema, the description is minimally adequate. It covers the basic purpose and parameters but misses behavioral details and usage guidelines, leaving room for improvement in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description includes an 'Args' section that documents the single parameter 'search_term' as a string, adding meaning beyond the input schema (which has 0% description coverage). However, it doesn't provide examples, constraints, or formatting details, so it only partially compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search for jobs on LinkedIn using a search term.' It specifies the verb ('search'), resource ('jobs'), and platform ('LinkedIn'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'get_recommended_jobs' or 'get_job_details', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to prefer this over 'get_recommended_jobs' or 'get_job_details', nor does it specify any prerequisites or exclusions. This leaves the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose with no overlap: close_session handles session management, get_company_profile and get_person_profile target different entity types, while get_job_details, get_recommended_jobs, and search_jobs cover different job-related operations. The descriptions clearly differentiate between retrieving specific entities versus searching/recommending.
All tools follow a consistent verb_noun naming pattern: close_session, get_company_profile, get_job_details, get_person_profile, get_recommended_jobs, and search_jobs. The pattern is uniform throughout with 'get_' or action verbs followed by descriptive nouns, making the set predictable and readable.
Six tools is a reasonable count for a LinkedIn-focused server, covering core operations like profile retrieval, job search, and session management. It's slightly lean but well-scoped; minor additions like update operations or more entity types could enhance it without being necessary.
The toolset covers key read operations for profiles and jobs, but lacks update, create, or delete capabilities typical in social media contexts (e.g., posting updates, sending messages). While agents can retrieve data, they cannot interact or modify content, which limits workflow completeness for a full LinkedIn integration.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
Hosted MCP server for LinkedIn: 31 tools for profiles, search, messaging, posts, enrichment.
Live LinkedIn data for AI agents: profiles, companies, jobs, posts, email finding. No account risk.
Full LinkedIn access for AI agents: leads, messaging, and campaigns with safe limits built in.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with LinkedIn by scraping profiles, companies, job postings, and getting personalized job recommendations using authenticated browser automation.173,316Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables users to search for jobs, retrieve profiles, and fetch feed posts through the LinkedIn API. It also provides tools for analyzing and extracting data from PDF resumes.
- AlicenseAqualityFmaintenanceEnables AI assistants to search leads, view profiles, manage lists, send InMails, and export data from LinkedIn Sales Navigator through browser automation.76MIT
- FlicenseAqualityCmaintenanceAutomates LinkedIn B2B marketing tasks such as profile search, company analysis, and connection request drafting, with optional AI-powered features via DeepSeek.5
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Logos-Parthenos-AI/linkedin-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server