Skip to main content
Glama
Huzaifa-ali

mcp-server-linkedin

by Huzaifa-ali

Use Cases

  • Content Publishing: Draft and publish LinkedIn posts from your AI assistant without switching context.

  • Media Sharing: Upload images and videos alongside your posts in a single command.

  • Link Previews: Share articles with auto-generated link preview cards.

  • Multi-Format Workflow: Compose text-only updates, visual content, or article shares through one unified interface.

  • Account Management: Authenticate, check your profile, and manage your session without leaving your editor.

Built for developers and content creators who want their AI tools to publish directly to LinkedIn.


Quick Start

Prerequisites

  1. Python 3.10+

  2. LinkedIn App — Follow the step-by-step setup guide or the quick version below:

    • Create an app at LinkedIn Developer Portal

    • Products: "Share on LinkedIn" + "Sign In with LinkedIn using OpenID Connect"

    • OAuth 2.0 scopes: openid, profile, email, w_member_social

    • Redirect URL: http://localhost:3000/callback

Install

uvx mcp-server-linkedin

Or with pip:

pip install mcp-server-linkedin

Related MCP server: LinkedIn MCP Server

Configuration

Set these environment variables:

LINKEDIN_CLIENT_ID=your_client_id        # From LinkedIn Developer Portal
LINKEDIN_CLIENT_SECRET=your_secret_here  # From LinkedIn Developer Portal
LINKEDIN_REDIRECT_URI=http://localhost:3000/callback  # Optional, this is the default

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_secret_here"
      }
    }
  }
}
{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_secret_here"
      }
    }
  }
}

VS Code + Copilot

Add to .vscode/mcp.json in your workspace:

{
  "servers": {
    "linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_secret_here"
      }
    }
  }
}

Cursor

Add to .cursor/mcp.json in your project root:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_secret_here"
      }
    }
  }
}

Kiro

Add to .kiro/settings/mcp.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_secret_here"
      }
    }
  }
}

Claude Code

claude mcp add linkedin -- uvx mcp-server-linkedin

Then set LINKEDIN_CLIENT_ID and LINKEDIN_CLIENT_SECRET in your environment.

Windsurf

Add to your Windsurf MCP configuration:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_secret_here"
      }
    }
  }
}

Running from Source

Replace "command": "uvx", "args": ["mcp-server-linkedin"] with:

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

Authentication

  1. Start your MCP client (Claude Desktop, Kiro, etc.)

  2. Ask: "Authenticate with LinkedIn"

  3. Browser opens → authorize the app → callback captured automatically

  4. Token saved to ~/.mcp-server-linkedin/token.json

  5. Token lasts 2 months. Re-run linkedin_auth when it expires.


Tools

Tool

Description

linkedin_auth

OAuth 2.0 browser-based authentication

linkedin_get_profile

Get your name, email, and person URN

linkedin_logout

Remove stored token

linkedin_post_text

Publish a text-only post

linkedin_post_image

Publish a post with an image

linkedin_post_video

Publish a post with a video (up to 200 MB)

linkedin_post_article

Publish a post with a link preview

linkedin_delete_post

Delete a post by ID

linkedin_get_post_stats

Get post analytics (requires Community Management API)

linkedin_get_all_stats

Get aggregated analytics (requires Community Management API)

Tool Details

Parameter

Type

Default

Description

text

string

required

Post content (up to ~3000 chars)

visibility

string

"PUBLIC"

"PUBLIC" or "CONNECTIONS"

Parameter

Type

Default

Description

text

string

required

Post caption

image_path

string

required

Absolute path to image (JPEG, PNG, GIF)

visibility

string

"PUBLIC"

"PUBLIC" or "CONNECTIONS"

Parameter

Type

Default

Description

text

string

required

Post caption

video_path

string

required

Absolute path to video (MP4, max 200 MB)

visibility

string

"PUBLIC"

"PUBLIC" or "CONNECTIONS"

Parameter

Type

Default

Description

text

string

required

Post commentary

url

string

required

Article URL (generates link preview)

title

string

""

Optional link preview title

description

string

""

Optional link preview description

visibility

string

"PUBLIC"

"PUBLIC" or "CONNECTIONS"

Parameter

Type

Default

Description

post_id

string

required

Post URN (e.g., urn:li:ugcPost:123456)


Architecture

src/mcp_server_linkedin/
├── config.py            # Constants, API URLs, settings dataclass
├── exceptions.py        # Typed exception hierarchy
├── server.py            # FastMCP entrypoint + tool registration
├── models/              # Frozen dataclass API response models
├── services/            # Async API client with connection pooling
├── tools/               # MCP tool implementations (validate → delegate → format)
│   ├── auth.py          # OAuth flow, profile, logout
│   ├── posting.py       # Text, image, video, article, delete
│   └── analytics.py     # Stubbed (pending API access)
└── utils/               # Token persistence

Rate Limits

Limit

Value

API requests per member per day

150

Token duration

2 months

Max video file size

200 MB

The server relays LinkedIn's rate limit errors clearly but does not enforce limits internally.


Security

  • Tokens stored locally at ~/.mcp-server-linkedin/token.json

  • No credentials in code — all secrets via environment variables

  • Official API only — uses w_member_social scope

  • Local OAuth callback — authorization code never leaves your machine

  • No data collection — this server sends nothing except LinkedIn API calls


Development

git clone https://github.com/Huzaifa-ali/mcp-server-linkedin.git
cd mcp-server-linkedin
uv sync --all-extras
pre-commit install
uv run mcp-server-linkedin                    # Run the server
uv run ruff check src/                        # Lint
uv run ruff format src/                       # Format
uv run mypy src/                              # Type check
uv run pytest                                 # Test

Test with MCP Inspector:

npx @modelcontextprotocol/inspector uv run mcp-server-linkedin

Contributing

See CONTRIBUTING.md for guidelines. In short:

  1. Fork the repo and create a feature branch

  2. Make your changes with type hints and docstrings

  3. Run pre-commit run --all-files (must pass)

  4. Open a pull request


License

MIT — see LICENSE.

Available Tools

10 tools
linkedin_authA

Authenticate with LinkedIn using OAuth 2.0. Opens a browser window for the user to log in and authorize. Must be called BEFORE any other LinkedIn tool if the user is not yet authenticated. Only needs to be run once — the token is saved and lasts 2 months.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, description fully discloses opening a browser window, saving the token, and its 2-month lifespan, giving complete behavioral context.

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?

Three concise sentences, each essential: authentication method, prerequisite, and token lifetime. No unnecessary words.

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?

Given zero parameters and presence of output schema, description covers all essential aspects: OAuth mechanism, ordering constraint, persistence, and expiration. Complete for an auth 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?

No parameters exist, so no additional meaning needed beyond schema. Baseline 4 for 0-param tools; description adds value by explaining behavior instead.

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?

Description clearly states the tool authenticates with LinkedIn via OAuth 2.0, a specific verb-resource pair. It distinguishes from sibling tools (profile, posts, stats) that require prior authentication.

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

Usage Guidelines5/5

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

Explicitly says 'Must be called BEFORE any other LinkedIn tool if the user is not yet authenticated' and notes it only needs to be run once, providing clear when-to-use and persistence guidance.

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

linkedin_delete_postA

Delete an existing LinkedIn post. Use when the user wants to remove a post they previously published. Requires: the post URN/ID (e.g., urn:li:ugcPost:123456 or urn:li:share:123456). This action is irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosing behavior. It explicitly states that the action is 'irreversible', which is critical for a delete operation. It also specifies the required ID format. This adds value beyond the schema.

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 three sentences, front-loaded with the action, then usage, then requirement. Every sentence provides essential information with no redundancy or fluff. Highly efficient.

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 delete operation with one required parameter and an output schema present, the description covers purpose, usage, parameter format, and irreversibility. It is sufficiently complete for correct tool invocation.

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%, but the description fully compensates by explaining that 'post_id' expects a LinkedIn post URN/ID and provides concrete examples (e.g., urn:li:ugcPost:123456). This makes the parameter usage very clear.

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 'Delete' and the resource 'existing LinkedIn post', with explicit usage context ('remove a post they previously published'). The purpose is unambiguous and distinguishes it from sibling tools like posting or stats, which are clearly different operations.

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 explicitly says 'Use when the user wants to remove a post they previously published', providing clear guidance on when to invoke this tool. It does not mention when not to use or alternatives, but the use case is specific enough.

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

linkedin_get_all_statsA

Get aggregated analytics across ALL LinkedIn posts (total impressions, clicks, likes, comments, shares). NOTE: Currently requires Community Management API access (r_member_postAnalytics scope) which must be applied for separately. Returns instructions on how to gain access if not available.

ParametersJSON Schema
NameRequiredDescriptionDefault
metricNoimpressions
end_dateNo
start_dateNo
aggregationNodaily

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description adds value by disclosing the access requirement and the tool's behavior when access is missing (returns instructions). It does not cover other traits like rate limits or data freshness, but the access context is critical.

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: first states purpose, second covers prerequisite and fallback behavior. No unnecessary words, front-loaded with key information.

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?

Despite having an output schema, the description omits parameter details entirely. For a tool with 0% parameter documentation, the description is incomplete for an agent to invoke correctly without additional lookup.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain any of the four parameters (metric, start_date, end_date, aggregation). The purpose mentions metrics but not how to use the parameters. The description adds no semantic value beyond the schema's basic titles.

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 aggregates analytics across ALL LinkedIn posts, listing specific metrics (impressions, clicks, likes, comments, shares). This distinguishes it from linkedin_get_post_stats, which is for individual posts.

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

Usage Guidelines5/5

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

Explicitly notes the required Community Management API access and scope, and describes behavior when access is unavailable (returns instructions). This guides the agent on prerequisites and fallback.

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

linkedin_get_post_statsB

Get analytics (impressions, clicks, likes, comments, shares) for a specific LinkedIn post. NOTE: Currently requires Community Management API access (r_member_postAnalytics scope) which must be applied for separately at developer.linkedin.com. Returns instructions on how to gain access if not available.

ParametersJSON Schema
NameRequiredDescriptionDefault
metricNoimpressions
post_idYes
end_dateNo
start_dateNo
aggregationNodaily

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. Discloses access requirements and fallback returns, but lacks mention of read-only nature, rate limits, or side effects. Some useful context but incomplete.

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 sentences plus a parenthetical note, front-loaded with purpose. No wasted words; appropriate length for the tool's simplicity.

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 5 parameters, 1 required, and existing output schema, the description covers the tool's core purpose and access constraints but omits details on date range or aggregation semantics, leaving some context gaps.

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

Parameters1/5

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

Schema description coverage is 0%, yet the description does not explain any of the parameters (metric, start_date, end_date, aggregation) beyond implicitly indicating post_id identifies a post. Fails to add meaning to the input 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?

Clearly states the verb 'Get' and the resource 'analytics (impressions, clicks, likes, comments, shares) for a specific LinkedIn post'. Distinguishes from sibling 'linkedin_get_all_stats' by focusing on a single post.

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?

Provides prerequisite access scope and fallback behavior (returns instructions if not available), but does not explicitly guide when to use this tool vs. alternatives like linkedin_get_all_stats.

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

linkedin_get_profileA

Get the currently authenticated LinkedIn user's profile: name, email, person URN, and profile picture URL. Use this to confirm who is logged in or to retrieve the user's identity. Requires prior authentication.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/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 correctly identifies the tool as read-only (get profile) and states the authentication requirement. It does not detail failure modes or side effects, but given the simple nature of the tool, this is sufficient.

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 sentences, front-loaded with the core purpose, no wasted words. The description is efficient and easy to parse.

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 zero-parameter tool with an output schema, the description covers purpose, usage guidelines, and behavioral context (authentication requirement). No important gaps remain, making it fully 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 0 parameters, so the description does not need to add param-level detail. It mentions the returned fields (name, email, person URN, profile picture URL), which adds value beyond the empty schema. Baseline 4 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 tool retrieves the authenticated user's profile with specific fields (name, email, person URN, profile picture URL). This verb-resource pairing is distinct from sibling tools like posting or auth, making the purpose unambiguous.

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

Usage Guidelines5/5

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

Explicitly advises using this tool to confirm who is logged in or retrieve identity, and notes the prerequisite of prior authentication. This provides clear context for when to use it and distinguishes it from other tools.

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

linkedin_logoutA

Log out of LinkedIn by deleting the stored OAuth token. Use when the user wants to switch accounts or revoke access. After logout, linkedin_auth must be called again before using any other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

No annotations provided, but description fully discloses behavior: it deletes the OAuth token and invalidates the session, requiring re-authentication. No contradictions.

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 sentences, no wasted words. The critical information (action, use case, consequence) is front-loaded and clear.

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 tool with no parameters and an output schema, the description is complete. It addresses usage, effect, and post-requisites.

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?

Tool has zero parameters and schema coverage is 100% (empty schema). The description adds meaning beyond the schema by explaining the tool's effect and usage context, exceeding the baseline of 4.

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 ('Log out of LinkedIn by deleting the stored OAuth token') and the resource ('LinkedIn'). It distinguishes from sibling tools like linkedin_auth (login) and other LinkedIn tools that require authentication.

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

Usage Guidelines5/5

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

Explicitly states when to use ('when the user wants to switch accounts or revoke access') and what happens after logout ('linkedin_auth must be called again'), providing clear guidance.

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

linkedin_post_articleA

Publish a LinkedIn post with a link/article preview card. Use when the user wants to share a URL with an auto-generated preview (title, description, thumbnail). Best for sharing blog posts, news articles, or web pages. Requires: text commentary AND a URL. Optional: custom title, description, visibility (PUBLIC or CONNECTIONS).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
textYes
titleNo
visibilityNoPUBLIC
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 must carry full behavioral disclosure it. It mentions required parameters (text commentary and URL) and optional ones (title, description, visibility), but does not disclose side effects, authentication needs, rate limits, or what happens exactly when the post is published. This leaves gaps in behavioral understanding.

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 three sentences long, front-loaded with the core action, and every sentence adds value. No wasted words or redundant 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?

Given the tool complexity (5 parameters, 2 required, output schema exists), the description covers purpose, usage context, and parameter details adequately. It lacks explanation of errors, rate limits, or prerequisite authentication, but the presence of an output schema reduces the need for return value explanation.

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 schema description coverage at 0%, the description compensates well by explaining the meaning of each parameter (text commentary, URL), marking required vs optional, and specifying allowed values for visibility (PUBLIC or CONNECTIONS). It adds context beyond the field names but could include constraints like character limits.

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 'Publish' and the resource 'LinkedIn post with a link/article preview card'. It distinguishes from siblings like linkedin_post_text by specifying the use case for sharing URLs with auto-generated previews.

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 explicitly says when to use the tool: 'Use when the user wants to share a URL with an auto-generated preview' and 'Best for sharing blog posts, news articles, or web pages'. However, it does not explicitly state when not to use it or name alternatives among siblings.

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

linkedin_post_imageA

Publish a LinkedIn post with an attached image. Use when the user wants to share a photo, infographic, screenshot, or any image file alongside text. Requires: text caption AND absolute file path to an image (JPEG, PNG, or GIF). Optional: visibility (PUBLIC or CONNECTIONS).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
image_pathYes
visibilityNoPUBLIC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 discloses required inputs (text, absolute file path, image formats) and optional visibility, but does not mention side effects, authentication needs, or rate limits. Basic behavioral traits are covered, but not in depth.

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 four sentences, front-loaded with the main purpose, and every sentence adds necessary information. No redundant or filler content.

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 existence of an output schema (not shown), the description need not detail return values. It covers the core use case, required parameters, and optional visibility. It could mention authentication (via linkedin_auth), but overall it is reasonably complete.

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, so the description must compensate. It adds meaning: 'text' is a caption, 'image_path' is an absolute file path with allowed formats, and 'visibility' has default 'PUBLIC' with enum values. This fully clarifies the parameters.

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 'Publish' and the resource 'LinkedIn post with an attached image', and it distinguishes this tool from siblings (post_text, post_video, post_article) by specifying image attachment.

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 explicitly tells when to use: 'Use when the user wants to share a photo, infographic, screenshot, or any image file alongside text.' It does not explicitly list exclusions, but the usage context is clear.

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

linkedin_post_textA

Publish a text-only post to LinkedIn. Use when the user wants to share a written update, thought, or announcement WITHOUT any image, video, or link preview. Requires: text content. Optional: visibility (PUBLIC or CONNECTIONS).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
visibilityNoPUBLIC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. It discloses that the tool publishes a post, but does not mention side effects (e.g., posting immediately, character limits, content policy) or return value. With output schema present, some transparency is expected but not delivered.

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 sentences with zero wasted words. The purpose is front-loaded, and optional details follow. Perfectly concise.

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 tool with 2 parameters and an output schema, the description is mostly complete. However, it does not mention authentication requirements, though sibling tools include linkedin_auth, implying auth is separate.

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 0%, so description must compensate. It explains text as content and visibility options as 'PUBLIC or CONNECTIONS', but adds no further details like max length or formatting. This is minimally adequate.

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 'Publish a text-only post to LinkedIn' and distinguishes from sibling tools by specifying 'WITHOUT any image, video, or link preview'. The verb 'Publish' and resource 'text-only post' are specific.

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

Usage Guidelines5/5

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

Explicitly says 'Use when the user wants to share a written update... WITHOUT any image, video, or link preview', providing clear when-to-use and when-not-to-use. Also mentions required text and optional visibility.

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

linkedin_post_videoA

Publish a LinkedIn post with an attached video. Use when the user wants to share a video file (MP4, max 200 MB) alongside text. Requires: text caption AND absolute file path to a video file. Optional: visibility (PUBLIC or CONNECTIONS).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
video_pathYes
visibilityNoPUBLIC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 discloses requirements (text, absolute path) and optional visibility but omits behavioral traits like return value, error behavior, or authentication needs.

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 three sentences, front-loaded with the purpose, then usage context, then parameter details. No extraneous information; every sentence adds value.

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 (3 parameters, no enums, no annotations, but with output schema), the description covers key aspects: required params, constraints, and optional. It lacks mention of return value or post URL, but output schema may suffice.

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 schema description coverage at 0%, the description adds meaning by explaining that video_path is an 'absolute file path to a video file' and visibility defaults to PUBLIC. This compensates for the schema's lack of informative titles.

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 'Publish a LinkedIn post with an attached video,' providing a specific verb and resource. It distinguishes from siblings like linkedin_post_text and linkedin_post_image by focusing on video attachment.

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 includes 'Use when the user wants to share a video file (MP4, max 200 MB) alongside text,' implying appropriate usage. However, it does not explicitly state when not to use or mention alternatives, though sibling tools provide context.

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. Dates show when Glama detected each change.

  1. 10 tool updatesv0.2.0
    • First observedlinkedin_auth
    • First observedlinkedin_delete_post
    • First observedlinkedin_get_all_stats
    • First observedlinkedin_get_post_stats
    • First observedlinkedin_get_profile
    • First observedlinkedin_logout
    • First observedlinkedin_post_article
    • First observedlinkedin_post_image
    • First observedlinkedin_post_text
    • First observedlinkedin_post_video

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct action: authentication, profile retrieval, logout, various post types (text, image, video, article), deletion, and post stats. No overlapping functionality.

Naming Consistency5/5

All tools follow a consistent 'linkedin_verb_noun' pattern in snake_case (e.g., linkedin_post_text, linkedin_get_profile). Minor exception: linkedin_auth omits a noun but is still clear.

Tool Count5/5

With 10 tools, the set covers authentication, profile, posting (four types), deletion, and two levels of stats. Each tool serves a clear purpose, and no tool seems redundant or out of place.

Completeness3/5

Covers core posting and basic profile/stats, but notable gaps exist: no ability to list or edit posts, no comment operations, and stats tools require special API access not guaranteed. For a content-focused toolset, updates and retrieval would be expected.

Maintenance

ActivitySlowing
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to manage LinkedIn profiles, posts, connections, skills, education, and certifications through the LinkedIn API.
    18
    176
    64
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents with read/write access to LinkedIn API, including profile, posts, media, organizations, comments, reactions, and analytics.
    20
    11
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to publish posts, images, comments, and reactions to LinkedIn as the authenticated user, with built-in safety features like daily budgets and deduplication.
    9
    29
    Apache 2.0

Latest Blog Posts

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/Huzaifa-ali/mcp-server-linkedin'

If you have feedback or need assistance with the MCP directory API, please join our Discord server