Skip to main content
Glama
AriOliv
by AriOliv

LinkedIn MCP

Servidor no oficial del Model Context Protocol para LinkedIn — lee tu perfil, red y conexiones, busca personas y empleos, y envía mensajes desde cualquier cliente MCP (Claude, etc.).

Funciona en dos modos:

  • HTTP + OAuth 2.1 (recomendado) — el servidor es un servidor de autorización OAuth 2.1 para clientes MCP y se conecta con la pantalla de consentimiento de OAuth de tres patas real de LinkedIn. Cada usuario inicia sesión en linkedin.com; el servidor nunca ve su contraseña.

  • stdio — un servidor local que lee un LINKEDIN_ACCESS_TOKEN del entorno. Útil para un solo usuario o para pruebas rápidas.

Esto refleja la arquitectura de autenticación de @aol/ifood-mcp y @aol/uber-mcp, intercambiando sus inicios de sesión de ingeniería inversa por el OAuth de primera clase de LinkedIn.


Herramientas

Herramienta

Endpoint de LinkedIn

Notas

linkedin_me

GET /v2/userinfo

Funciona con los ámbitos predeterminados openid profile email.

linkedin_network_stats

GET /v2/networkSizes/{urn}

Requiere r_1st_connections_size.

linkedin_connections

GET /v2/connections

Requiere un producto de conexiones aprobado.

linkedin_get_profile

GET /v2/people/{id}

Requiere un producto de perfil aprobado.

linkedin_search_people

GET /v2/search/people

Requiere un producto de búsqueda aprobado.

linkedin_search_jobs

GET /v2/jobs/search

Requiere un producto de empleos aprobado.

linkedin_send_message

POST /v2/messages

Requiere w_member_social (mensajería).

Acceso a la API de LinkedIn. De forma predeterminada, una aplicación estándar de LinkedIn solo otorga los ámbitos de OpenID Connect (openid profile email), por lo que linkedin_me funciona de inmediato. Las otras herramientas llaman a endpoints que LinkedIn restringe detrás de productos aprobados (Sign In, Marketing, Talent Solutions, etc.). Hasta que tu aplicación sea aprobada para esos, esas herramientas devolverán 403 — esto es una restricción de la plataforma de LinkedIn, no un error. Agrega los ámbitos concedidos a LINKEDIN_SCOPES una vez aprobado.


Related MCP server: Linkd MCP Server

Inicio rápido (HTTP + OAuth)

1. Crea una aplicación de LinkedIn

  1. Ve a https://www.linkedin.com/developers/apps → Crear aplicación.

  2. En Autenticación, copia el Client ID y el Client Secret.

  3. Agrega tu callback en URLs de redirección autorizadas: http://localhost:3000/login/callback (o PUBLIC_URL + /login/callback).

  4. En Productos, agrega Iniciar sesión con LinkedIn usando OpenID Connect (y cualquier otro que necesites).

2. Configura

cp .env.example .env
# then edit .env:
#   MCP_JWT_SECRET=$(openssl rand -hex 32)
#   LINKEDIN_CLIENT_ID=...
#   LINKEDIN_CLIENT_SECRET=...
#   PUBLIC_URL=http://localhost:3000

3. Ejecuta

npm install
npm run build
npm run start:http      # or: npm run dev  (tsx watch)

Apunta tu cliente MCP a http://localhost:3000/mcp. En la primera conexión, ejecuta el flujo OAuth 2.1, te redirige a LinkedIn para iniciar sesión y luego llama a las herramientas en tu nombre.


Inicio rápido (stdio)

cp .env.example .env
# set LINKEDIN_ACCESS_TOKEN=... (e.g. from the LinkedIn developer console token generator)
npm install && npm run build
npm start

Configuración del cliente MCP:

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/linkedin-mcpserver/build/index.js"],
      "env": { "LINKEDIN_ACCESS_TOKEN": "AQV..." }
    }
  }
}

Cómo funciona el puente OAuth

MCP client ──/authorize──▶ this server ──302──▶ /login ──▶ /login/start
                                                              │
                                                    302 ▼ linkedin.com/oauth/v2/authorization
                                              user signs in on LinkedIn
                                                              │
      /login/callback ◀──302 code&state──────────────────────┘
            │  exchange code → LinkedIn access + refresh token
            │  fetch /v2/userinfo → stable member id (sub)
            │  store tokens per‑user, mint an MCP auth code
            ▼
MCP client ──/token──▶ this server ──▶ HS256 JWT (audience‑bound to /mcp)
MCP client ──/mcp (Bearer JWT)──▶ tools call LinkedIn with the member's token
  • Los tokens de acceso MCP son JWTs HS256 de corta duración firmados con MCP_JWT_SECRET, vinculados a la audiencia del recurso /mcp (RFC 8707), con tokens de actualización rotativos.

  • Los tokens de LinkedIn posteriores se actualizan de forma transparente cuando la aplicación está aprobada para tokens de actualización; de lo contrario, el usuario se vuelve a autenticar.

  • Todo el estado está en memoria (proceso único). Cambia los almacenes en src/http/store.ts por Redis/DB para escalar horizontalmente.


Entorno

Variable

Requerido

Predeterminado

Propósito

PORT

–

3000

Puerto HTTP.

PUBLIC_URL

HTTP

http://localhost:PORT

URL que ven el cliente y LinkedIn.

MCP_JWT_SECRET

HTTP

–

Clave HS256 (≥32 caracteres). openssl rand -hex 32.

LINKEDIN_CLIENT_ID

HTTP

–

ID de cliente de la aplicación de LinkedIn.

LINKEDIN_CLIENT_SECRET

HTTP

–

Secreto de cliente de la aplicación de LinkedIn.

LINKEDIN_SCOPES

–

openid profile email

Ámbitos OAuth a solicitar.

LINKEDIN_REDIRECT_URI

–

PUBLIC_URL/login/callback

Anulación del callback OAuth.

LINKEDIN_ACCESS_TOKEN

stdio

–

Token para el modo stdio.

LINKEDIN_API_BASE

–

https://api.linkedin.com

Anulación del host de la API.

LINKEDIN_VERSION

–

–

Encabezado LinkedIn-Version (YYYYMM) para /rest.


Estructura

src/
  index.ts                 stdio server + tool catalog + executeTool + TokenProvider
  http-server.ts           remote MCP server (Streamable HTTP + OAuth 2.1)
  http/
    provider.ts            LinkedInOAuthProvider (OAuthServerProvider, HS256 JWTs)
    login-router.ts        /login → LinkedIn consent → /login/callback
    linkedin-auth.ts       LinkedIn OAuth client (authorize / token / userinfo)
    session-provider.ts    per-user token lookup + transparent refresh
    store.ts               in-memory OAuth + downstream token stores

Scripts

Script

Acción

npm run build

Compila a build/.

npm run start:http

Ejecuta el servidor HTTP/OAuth.

npm start

Ejecuta el servidor stdio.

npm run dev

tsx watch del servidor HTTP.

npm run dev:stdio

tsx watch del servidor stdio.

npm run typecheck

tsc --noEmit.

Licencia

MIT. Consulta LICENSE.

Available Tools

7 tools
linkedin_connectionsC

List the member's 1st-degree connections (paginated). Requires an approved connections product/scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoPage size (default 100, max 500).
startNoPagination offset (default 0).

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry behavioral disclosure. It explicitly notes the scope requirement, which is useful, but does not mention authentication, rate limits, or what happens when scope is missing. The read-only nature is implied but not stated. Minimal disclosure beyond the obvious.

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 a single sentence that leads with the action and resource, immediately followed by the key requirement. No wasted words, and the essential information is front-loaded.

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 paginated list tool, the description conveys the core function and a critical prerequisite. However, without an output schema or annotations, it does not disclose return format, whether the response includes profiles, or potential errors. Acceptable but with gaps an agent might need to infer.

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

Parameters3/5

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

Schema description coverage is 100% for both count and start, so the description adds no additional parameter meaning. It does not explain acceptable value ranges beyond what the schema provides, but the baseline of 3 applies because the schema already fully documents the parameters.

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 uses a specific verb ('List') and identifies the exact resource ('member's 1st-degree connections') with pagination noted. It is clear and distinct from sibling tools like 'linkedin_search_people' or 'linkedin_network_stats', though it does not explicitly name an alternative for contrast.

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 siblings. It does not mention scenarios where linkedin_network_stats or linkedin_search_people might be more appropriate. Only a prerequisite (approved connections product/scope) is given, which is not usage selection guidance.

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

linkedin_get_profileA

Retrieve a member profile by person id (publicId or numeric/URN id). Requires an approved profile product/scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdYesPublic id, numeric id, or full urn:li:person URN.

TDQS

A3.8/5.0
Behavior3/5

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 reveals a key requirement (approved profile product/scope), which is useful. However, it does not mention error patterns (e.g., missing permissions, invalid ID), rate limits, or what happens if the ID is not found. The single behavioral note is helpful 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.

Conciseness5/5

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

Two concise sentences with zero filler. The verb and resource are front-loaded, followed immediately by the accepted ID types and the prerequisite. Every word contributes, making it easy to scan and understand quickly.

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?

For a simple one-parameter read tool with no output schema, the description covers the essential invocation details: the parameter purpose and a key prerequisite. It does not explain the return shape, but this is less critical given that 'profile' implies its content. The absence of annotation support is partly mitigated by the scope requirement, so the description is close to complete.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains that personId accepts public, numeric, or URN formats. The description essentially repeats this information without adding new meaning (e.g., syntax examples, required format precedence). Thus it adds minimal value beyond the schema, aligning with the baseline of 3.

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 action ('Retrieve a member profile') and the resource (member profile by person id), with explicit detail on the accepted id formats (publicId, numeric, or URN). It distinguishes from siblings by its specific focus on fetching a profile by ID versus searching (linkedin_search_people) or accessing the caller's own profile (linkedin_me).

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 provides a prerequisite ('Requires an approved profile product/scope') but does not explicitly state when to use this tool versus alternatives like linkedin_me or linkedin_search_people. The context is clear that you need a known person ID, but there is no contrast with sibling tools, leaving the agent to infer the selection logic.

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

linkedin_meA

Get the authenticated member's profile via OpenID Connect (sub, name, email, locale, picture). Works with the openid profile email scopes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It adds valuable context by listing the returned fields and the required OAuth scopes, which informs the agent of prerequisites and output shape. However, it lacks any mention of failure modes, rate limits, or behavior when scopes are unsupported—important for robust invocation but not critical for a simple call.

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 a single, well-constructed sentence that front-loads the core action and resource, then lists the precise return fields and required scopes. Every word contributes to understanding, with zero fluff or repetition—an exemplar of concise, structured writing.

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?

For a parameterless tool with no output schema, the description conveys the essential operational details: what it does, what it returns (field list), and prerequisites (scopes). It could mention authentication or error handling, but the simplicity of the operation makes this largely complete. The explicit field list compensates for the lack of an output schema.

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 zero parameters, and the description appropriately says nothing about them. The baseline for 0 parameters is 4, and since there is no schema to elaborate on, the description does not need to add parameter-level detail. It correctly focuses on the operation and output.

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 action (Get), the resource (authenticated member's profile), and enumerates the specific fields returned (sub, name, email, locale, picture). It implicitly distinguishes from sibling `linkedin_get_profile` by emphasizing 'authenticated member's' (i.e., the caller's own profile), giving the tool a unique, unambiguous purpose.

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 specifies required scopes (`openid profile email`), which is a useful prerequisite, but it does not explicitly contrast with alternatives like `linkedin_get_profile`. An agent might be uncertain when to use this tool vs. a generic profile getter; the context of 'authenticated member' implies it's for the caller, but there is no explicit 'use this instead of X' guidance.

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

linkedin_network_statsA

Get the member's network size (1st-degree connection count). Requires the r_1st_connections_size product/scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
personUrnNoPerson URN, e.g. urn:li:person:xxxx. Defaults to the token owner (~).

TDQS

A3.8/5.0
Behavior3/5

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

No annotations exist, so the description bears full burden. It discloses a key requirement: the r_1st_connections_size product/scope, which is critical for authorization. However, it does not mention other behavioral aspects such as response format, potential errors, or side effects (which are minimal for a read operation). Adds some value 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.

Conciseness5/5

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

A single, front-loaded sentence with the purpose stated first and the scope requirement second. No unnecessary words, and the information is structured efficiently.

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 tool's simplicity (one optional param, no nested objects, no output schema), the description and schema together provide adequate information for correct invocation. It clarifies the purpose and authorization requirement. It does not explicitly state the return value format, but the 'count' phrasing makes it likely a simple number. Missing only minor detail about response shape.

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

Parameters3/5

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

Schema coverage is 100% since personUrn has a description including its default. The description adds no additional meaning beyond the schema; the default behavior is already captured in the parameter description. Baseline of 3 is appropriate.

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 states a specific verb ('Get'), a resource ('member's network size'), and clarifies it as '1st-degree connection count', distinguishing it from sibling tools like linkedin_connections (which likely lists connections) and linkedin_get_profile (which fetches profile details). Clear and unambiguous.

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 does not explicitly discuss when to use this tool versus alternatives. It implies usage for obtaining the network size, but no exclusions or comparisons with siblings like linkedin_connections are provided. Guidance is minimal and left to inference.

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

linkedin_search_jobsA

Search job postings by keywords / location / company / job type. Requires an approved jobs product/scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobTypeNoFilter by job type (Full-Time, Contract, ...).
keywordsNoFree-text search terms.
locationNoLocation filter.
companiesNoFilter by company.

TDQS

A3.9/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. The verb 'Search' implies a read-only operation, and the mention of an approved scope adds authorization context. However, it does not disclose pagination, rate limits, or what happens if the scope is missing, leaving significant behavioral aspects undocumented.

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 short sentences, the first front-loading the action and scope, the second adding the essential prerequisite. No wasted words; every clause earns its place. The structure is efficient and scannable.

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 search tool with no output schema, the description does not explain what the tool returns (e.g., job listings, IDs, metadata) or any result limits. It also omits details like sorting or default behavior. The prerequisite is helpful, but the lack of output context leaves the agent uncertain about the return shape, making it only partially complete.

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

Parameters3/5

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

Schema description coverage is 100%—all four parameters have descriptive text in the schema. The description merely restates the same filter categories without adding format, defaults, or interdependencies. It neither compensates for a gap nor adds value beyond the schema, so baseline 3 is appropriate.

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 names a specific verb ('Search') and a clear resource ('job postings'), and enumerates the primary filters (keywords, location, company, job type). This unambiguously distinguishes it from sibling tools like linkedin_search_people, which targets people rather than jobs.

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 clearly indicates the tool is for job postings and adds a critical prerequisite ('Requires an approved jobs product/scope'), which tells the agent when it is permissible to call. However, it does not explicitly mention when NOT to use it or point to alternative tools (e.g., use search_people for people), so it lacks explicit exclusions.

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

linkedin_search_peopleC

Search member profiles by keywords / location / company / industry. Requires an approved search product/scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsNoFree-text search terms.
locationNoLocation filter.
industriesNoFilter by industry.
currentCompanyNoFilter by current company.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry full behavioral disclosure. It mentions the approval prerequisite, which is a meaningful constraint, but does not disclose what happens without approval, whether the operation is read-only, how results are returned, or any pagination/rate-limit behavior. This is a significant gap for a search tool.

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?

Two sentences with no redundancy. The primary action is front-loaded, and the prerequisite is stated separately. It is efficient and easy to scan, though it omits possibly important details that are not covered elsewhere, making it slightly under-specified rather than overly verbose.

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

Completeness2/5

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

For a search tool with no annotations and no output schema, the description should explain what the tool returns, any error conditions, and the implications of the approval requirement. It only covers the approval prerequisite, leaving the agent without enough information about expected output or failure modes. The simplicity of the tool (4 optional params) lowers the bar, but the missing behavioral details make it incomplete.

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

Parameters3/5

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

Schema coverage is 100%, so each parameter already has a description. The description's listing of 'keywords / location / company / industry' merely echoes the schema without adding new meaning, such as format expectations, wildcard support, or interaction between filters. It meets the baseline for 100% coverage but does not go beyond it.

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 the verb 'Search' and the resource 'member profiles', and lists the search dimensions (keywords, location, company, industry) which map to the parameters. It differentiates from sibling tools like linkedin_search_jobs by explicitly targeting member profiles, though it does not name alternatives. The purpose is unambiguous.

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 no guidance on when to use this tool versus alternatives. It only states a prerequisite ('Requires an approved search product/scope') but does not explain when to choose this over linkedin_get_profile or linkedin_search_jobs. There is no mention of exclusions or contextual triggers.

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

linkedin_send_messageA

Send a message to a connection. Requires the w_member_social (messaging) product/scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
subjectNoMessage subject.
messageBodyYesMessage body text.
recipientUrnYesRecipient person URN (urn:li:person:xxxx).

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, leaving the description to carry the full burden of behavioral disclosure. The description only states the action and required scope, but it does not disclose that this is a write operation with potential side effects (sending a message), nor does it mention irreversibility, rate limits, or what happens on success/failure. The term 'send' implies a mutation, but explicit behavioral context is missing.

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 a single sentence that front-loads the purpose and immediately follows with the scope requirement. It is minimal and every word serves a purpose, with no redundancy or unnecessary detail.

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?

The tool is relatively simple with 3 parameters and no output schema, yet the description omits key behavioral details like what the response resembles, whether it is irreversible, and any message length limits. It also does not mention that messages can only be sent to first-degree connections, although 'connection' hints at this. Given no annotations or output schema, more context would be beneficial, but the core purpose and scope are covered.

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

Parameters3/5

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

The input schema has 100% coverage; all three parameters already have descriptive text. The description adds no extra meaning beyond the schema, such as format constraints or usage patterns. Since the schema clearly documents recipientUrn and messageBody, the baseline of 3 is appropriate.

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 ('send') and resource ('message to a connection'). It also adds a specific requirement (w_member_social scope) which further clarifies the tool's function. No sibling tools overlap with this messaging capability, so there is no ambiguity about what it does.

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 clear context by stating the prerequisite scope, which is a necessary condition for using the tool. While it does not explicitly mention alternatives or when not to use it, the absence of any sibling messaging tools makes those exclusions unnecessary. The scope requirement effectively guides the agent on when this tool is applicable.

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. 7 tool updatesv1.0.0
    • First observedlinkedin_connections
    • First observedlinkedin_get_profile
    • First observedlinkedin_me
    • First observedlinkedin_network_stats
    • First observedlinkedin_search_jobs
    • First observedlinkedin_search_people
    • First observedlinkedin_send_message

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a distinct purpose: self-profile, profile by ID, search people, search jobs, send messages, connections list, and network size. Although 'me' and 'get_profile' both retrieve profiles, one is self and the other is arbitrary, so there is no ambiguity. The two search tools clearly target different resources.

Naming Consistency4/5

All tools share the 'linkedin_' prefix, which is consistent. However, the pattern after the prefix varies: some use bare nouns (me, connections, network_stats) while others use verb_noun (search_people, search_jobs, send_message, get_profile). This is a minor inconsistency but still predictable and readable.

Tool Count5/5

With 7 tools, the server is well-scoped for a LinkedIn integration. Each tool covers a core functionality area without unnecessary bloat, falling well within the typical 3-15 range for a focused server.

Completeness4/5

The tool surface covers the most common LinkedIn actions: viewing profiles, searching people and jobs, messaging, and managing connections. Missing capabilities like posting updates or managing connection requests are noticeable but not critical, as the core workflows are covered.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that enables seamless interaction with LinkedIn for job applications, profile retrieval, feed browsing, and resume analysis through natural language commands.
    36
    -
  • A
    license
    A
    quality
    D
    maintenance
    An unofficial Model Context Protocol server that enables programmatic access to LinkedIn data through tools like user search, company search, profile enrichment, and contact retrieval.
    7
    12 npm
    3
    ISC
  • F
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive Model Context Protocol server that enables AI assistants to interact with LinkedIn APIs for profile management, content creation, networking, messaging, and analytics.
    2
    -
  • A
    license
    A
    quality
    F
    maintenance
    An unofficial Model Context Protocol server that provides LinkedIn tools for searching users, enriching profiles, retrieving contact information, and conducting deep research through natural language interfaces.
    5
    13 npm
    5
    MIT