Skip to main content
Glama
aarnav-hariramani

LinkedIn MCP Server

LinkedIn MCP Server

A local Model Context Protocol server that exposes structured LinkedIn profile, company, and job data to MCP-compatible clients. It uses a persistent Patchright browser session, so you authenticate interactively instead of storing a LinkedIn password in an environment variable.

WARNING

LinkedIn may restrict automated access, and use of this project may be subject to LinkedIn's terms and account limitations. Use it responsibly with your own account. This project is not affiliated with or endorsed by LinkedIn.

Features

Area

MCP tools

People

get_person_profile, search_people, send_connection_request

Companies

get_company_profile, get_company_posts

Jobs

get_job_details, search_jobs

Session

close_browser

Profile reads can include experience, education, interests, honors, languages, contact information, and posts. Company reads can include about information, posts, and jobs. Job search supports date, type, experience, workplace, Easy Apply, and sorting filters.

Connection requests are deliberately constrained: the tool accepts an exact profile slug, previews the current state by default, requires confirm=true to write, and never includes a note.

Related MCP server: linkedin-mcp-server

Requirements

  • Python 3.12+

  • uv

  • A LinkedIn account

The project uses pyproject.toml and uv.lock; a requirements.txt file is intentionally not needed.

Setup

git clone https://github.com/aarnav-hariramani/linkedin-mcp.git
cd linkedin-mcp
uv sync --locked
uv run patchright install chromium

Authenticate once in a visible browser:

uv run linkedin-mcp-server --login

The default profile is stored at ~/.linkedin-mcp-server/browser-data. It contains sensitive session cookies and must never be committed or shared.

Check or clear the saved session:

uv run linkedin-mcp-server --status
uv run linkedin-mcp-server --logout

MCP client configuration

Use the absolute path to your clone. For Codex:

codex mcp add linkedin -- uv --directory /absolute/path/to/linkedin-mcp-server run linkedin-mcp-server

Equivalent JSON configuration for clients such as Claude Desktop or Cursor:

{
  "mcpServers": {
    "linkedin": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/linkedin-mcp-server",
        "run",
        "linkedin-mcp-server"
      ]
    }
  }
}

Restart the MCP client after changing its configuration.

Running directly

The recommended local transport is stdio:

uv run linkedin-mcp-server

For local development, loopback-only HTTP is also available:

uv run linkedin-mcp-server \
  --transport streamable-http \
  --host 127.0.0.1 \
  --port 8000

Connect to http://127.0.0.1:8000/mcp. The server rejects non-loopback HTTP bindings.

Configuration

Copy the documented template only when you need to override defaults:

cp .env.example .env

Configuration precedence is CLI arguments, existing environment variables, .env.local, .env, then defaults.

Variable

Default

Purpose

LINKEDIN_TRANSPORT

stdio

stdio or streamable-http

LINKEDIN_HOST

127.0.0.1

Loopback HTTP bind address

LINKEDIN_PORT

8000

HTTP port

LINKEDIN_PATH

/mcp

HTTP endpoint path

LINKEDIN_LOG_LEVEL

WARNING

DEBUG, INFO, WARNING, or ERROR

LINKEDIN_HEADLESS

true

Run without a visible browser

LINKEDIN_SLOW_MO

0

Browser action delay in milliseconds

LINKEDIN_TIMEOUT

10000

Browser timeout in milliseconds

LINKEDIN_VIEWPORT_WIDTH

1280

Browser viewport width

LINKEDIN_VIEWPORT_HEIGHT

720

Browser viewport height

LINKEDIN_CHROME_PATH

unset

Optional Chromium executable

LINKEDIN_USER_AGENT

unset

Optional browser user agent

LINKEDIN_USER_DATA_DIR

~/.linkedin-mcp-server/browser-data

Persistent browser profile

No username, password, cookie, API key, or token belongs in .env.

Safety model

  • Browser navigation is limited to HTTPS LinkedIn hosts.

  • Raw page HTML is not returned through MCP tools.

  • Persistent profiles are created with restrictive permissions and a marker used for safe logout.

  • HTTP transport is local-only; stdio is preferred.

  • All profile slugs, job IDs, and search input are validated.

  • Writes require explicit confirmation.

See SECURITY.md for handling local session data and reporting vulnerabilities.

Architecture

src/linkedin_mcp_server/
├── domain/       # Models, parsers, validation, and domain errors
├── ports/        # Browser, authentication, and configuration interfaces
├── application/  # Scrape, search, session, and connection use cases
├── adapters/
│   ├── driven/   # Patchright browser, profile auth, environment config
│   └── driving/  # CLI, FastMCP server, tools, serialization
└── container.py  # Dependency composition root

Development

uv sync --locked --group dev
uv run pre-commit install
uv run ruff check .
uv run ruff format --check .
uv run pytest
uv build

Browser-backed integration testing requires a separately authenticated local session. Unit tests and CI must not depend on real credentials.

See CONTRIBUTING.md for the contribution workflow.

Acknowledgments

This project is built on top of eliasbiondo/linkedin-mcp-server by Elias Biondo, which provided the original hexagonal architecture, Patchright-based browser automation, and read-only profile, company, and job scraping tools. This fork adds the send_connection_request write tool, additional navigation and session-safety hardening, and test coverage on top of that foundation.

License

MIT. See LICENSE. Original copyright retained; see the LICENSE file for details.

Available Tools

8 tools
close_browserA

Close the browser instance and release resources. Credentials are preserved.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It notes that credentials are preserved, but omits other side effects like session invalidation or resource cleanup scope. This is insufficient for safety-critical browser management.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundancy. The first sentence states the primary action, the second adds a key behavioral detail (credential preservation). Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an existing output schema, the description covers the essential purpose and a behavioral note. It does not explain return values, but the output schema covers that. Slightly limited for a cleanup tool, but adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters (schema coverage 100% trivially). Description adds no parameter information, but none is needed. Baseline 4 for zero-parameter tools applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Close the browser instance and release resources,' with a clear verb and resource. It distinguishes from sibling tools like check_session_status and logout_and_cleanup by focusing on the browser instance itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like logout_and_cleanup. The description does not indicate prerequisites, context, or exclusions, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_company_postsB

Get recent posts from a company's LinkedIn feed.

Args: company_name: LinkedIn company name (e.g., 'google', 'stripe', 'openai')

ParametersJSON Schema
NameRequiredDescriptionDefault
company_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It fails to disclose behavioral traits such as authentication requirements, result limits, pagination, or rate limits. The description is too minimal 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the purpose. However, it could include more detail without becoming verbose, given the simplicity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to explain return values. However, it lacks context about prerequisites (e.g., logged-in session) and usage scope, which are relevant given sibling tools like start_login.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning beyond the schema by providing example values (e.g., 'google', 'stripe', 'openai') for the company_name parameter, which has 0% schema description coverage. However, it does not explain the exact format or validity rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 'recent posts from a company's LinkedIn feed'. It provides examples of company names, distinguishing it from sibling tools like get_company_profile or get_job_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives, no prerequisites or exclusions. Sibling tools are listed but not compared, leaving the agent to infer usage context.

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: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionsNo
company_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It mentions that the about page is always included and sections are extra, but does not discuss side effects, authorization needs, rate limits, or data mutability. The behavioral disclosure is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the purpose. The Args section is structured but could be slightly more compact. Overall, it efficiently conveys the key information without unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 (not shown but present), the description need not explain return values. However, it lacks usage guidelines and behavioral transparency. For a two-parameter tool, it covers input adequately but leaves gaps in completeness regarding when to use and behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description adds clear meaning: company_name is illustrated with examples ('google', 'stripe'), and sections are explained with its possible values ('posts, jobs') and default behavior. This adds significant value beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 uses a specific verb ('Get') and resource ('company's LinkedIn profile'), which distinguishes it from siblings like get_job_details or get_person_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides parameter details but lacks explicit guidance on when to use this tool versus alternatives like get_company_posts. No context on prerequisites, limitations, or when-not-to-use is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_detailsB

Get job details for a specific job posting on LinkedIn.

Args: job_id: LinkedIn job ID (e.g., '3912045678', '4108763210')

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so description bears full burden. It only states 'get job details' without disclosing behavioral traits like auth needs, rate limits, or whether it's a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise with the main purpose front-loaded. Only two sentences plus parameter description. No wasted words, though some users may prefer slightly more structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with an output schema, the description is adequate but lacks detail about what fields are returned in the job details. Context signals show an output schema exists, reducing the need for return value explanation, but completeness is still middling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaningful information for the job_id parameter with examples of valid IDs (e.g., '3912045678'), which adds value beyond the schema's type string.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'get' and resource 'job details for a specific job posting on LinkedIn'. It is specific and distinguishes from sibling tools like search_jobs and apply_for_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., search_jobs or get_person_profile). No mention of prerequisites or context.

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: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionsNo
linkedin_usernameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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 describes that the main profile is always included and sections are optional, but does not disclose potential behaviors like error handling, rate limits, or data volatility. This is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is clear and front-loaded with the purpose, but the Args section is slightly verbose. Each sentence adds value, but could be slightly more concise without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers parameters well and the tool has an output schema, so return values are not needed. It lacks behavioral or error context, but for a simple data retrieval tool, it is reasonably complete. Minor gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning the schema itself provides no descriptions. The description adds significant meaning: examples for linkedin_username, a list of available sections with their behavior, and default behavior. This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool retrieves a specific person's LinkedIn profile, using a clear verb+resource structure. It distinguishes itself from siblings like 'search_people' and 'get_company_profile' by focusing on an individual profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides parameter usage details (linkedin_username format, sections options) but does not explicitly state when to use or avoid this tool relative to alternatives. It implies use for a specific person, which is clear, but lacks direct guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
sort_byNo
job_typeNo
keywordsYes
locationNo
max_pagesNo
work_typeNo
easy_applyNo
date_postedNo
experience_levelNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must cover behavioral aspects. It explains that the tool returns job IDs but does not disclose rate limits, authentication needs, or whether it reads existing data without modification. This is a basic but acceptable level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief summary, return value note, and then a param list. It is slightly lengthy but each line adds value. Could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high parameter count (9) and many filter options, the description covers purpose, return value, and all parameters thoroughly. It lacks information about pagination or search scope but is otherwise complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description provides detailed guidance for each parameter, including example values for keywords and enumerated options for filters like job_type, experience_level, etc. This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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.' It also mentions that the return value (job_ids) can be passed to get_job_details, which differentiates it from other search tools like search_people.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (for job searching) and how to follow up with get_job_details. However, it does not explicitly state when not to use it or compare with alternatives like search_people.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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')

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsYes
locationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It fails to mention authentication needs, rate limits, or any behavioral traits beyond the search action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loaded, with no wasted words. It follows a docstring format, making it easy to parse, though slightly more structure could improve readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema, the description doesn't need to explain return values. However, it omits details like pagination, sorting, or result limits, leaving gaps for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by providing concrete examples for both keywords and location, adding meaningful usage context beyond the bare schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search for people on LinkedIn' with a specific verb and resource. It provides example keywords, distinguishing it from sibling tools like get_person_profile which targets a specific person.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through examples but does not explicitly state when to use or avoid this tool, nor does it mention alternatives among siblings. Basic context is present but no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
linkedin_usernameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It clearly states that the default mode performs no write, reports readiness/connected/pending statuses, never adds a note, and that confirm=true is required to actually send the invitation. This gives an agent an accurate mental model of side effects and safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the purpose, then the safety-critical confirm=false behavior, then the confirmation rule. The Args section is minimal and directly maps to each parameter without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with an output schema, the description covers everything an agent needs: what the tool does, its no-write default, the conditions for actually sending, the statuses it reports, and the one constraint about notes. No critical behavioral context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must define the parameters, and it does. 'linkedin_username: Exact LinkedIn profile username/slug' adds precision beyond the bare schema, and 'confirm: Must be true to actually send the invitation' explains the distinguishing semantics of the boolean rather than relying on its default value alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Preview or send a LinkedIn connection request without a note.' It clearly distinguishes this tool from sibling search/profile tools by focusing on the connection-request action, and the 'never adds a note' qualifier removes ambiguity about the operation's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: default confirm=false performs no write and is a preview, while confirm=true should only be set 'after verifying the exact profile.' It implies the right workflow but stops short of naming a specific sibling like get_person_profile for verification, so it does not fully spell out when to use alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedclose_browser
    • First observedget_company_posts
    • First observedget_company_profile
    • First observedget_job_details
    • First observedget_person_profile
    • First observedsearch_jobs
    • First observedsearch_people
    • First observedsend_connection_request

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables LinkedIn API integration for managing profiles, posts, feed, connections, and sending messages through MCP-compatible clients.
    10
    10 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server for LinkedIn API integration. Enables authentication, profile access, connections, search, messaging, and feed management via OAuth2.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server providing LinkedIn profile and page access via a stateless OAuth proxy, enabling Claude or MCP clients to interact with LinkedIn data.
    -