linkedin-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@linkedin-mcpcheck my draft post about the new CLI release and fix what's wrong"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
What it does
Point any MCP-capable agent at it and it can read a LinkedIn profile, check a draft post and publish it, through the official LinkedIn API.
{
"mcpServers": {
"linkedin": {
"command": "linkedin-mcp",
"env": {
"LINKEDIN_ENGINE_HOME": "/home/you/.config/linkedin-engine"
}
}
}
}Related MCP server: LinkedIn MCP Server
The part that makes it different
A server that any agent can connect to, that publishes to a public feed on request, is a footgun. Every automated posting tool has the same failure mode: it produces something that technically publishes and reads as though nobody wrote it.
So the quality gate lives inside the server. An agent cannot publish a post that reads like a generated one, because the gate runs on the way out and refuses it. The agent gets told what is wrong and fixes it.
Rule | What it catches |
| "thrilled to announce", "game-changer", "in today's fast-paced world", and thirty more |
| A first line that is a greeting rather than a claim |
|
|
| More than three emoji in a post |
| Emphasis in punctuation |
| A post about something you built that does not let anyone reach it |
| Under 200 characters, which says nothing |
| Past the point where LinkedIn cuts it off mid-sentence |
| "it's worth noting", "at the end of the day" |
Errors block the post. Warnings do not, but they are reported.
The tools
Tool | What it does |
| Reads the live profile: name, headline, about, location |
| Updates the headline, about or location, and diffs against the live one |
| Runs the quality gate over a draft and returns what is wrong with it |
| Publishes — after the gate has passed |
| Reports what the stored token is allowed to do |
Two resources, linkedin://profile and linkedin://profile/written, and a
prompt, linkedin_draft_post, that walks an agent through drafting a post
about a real artefact and checking it.
Safety
Three rules, and they are not optional:
The token is never a tool argument. It is read from the credential store
that linkedin-engine
uses, and it never appears in a tool result, a log line or an error message.
An agent cannot ask this server for it — which means a prompt injection in a
web page cannot ask it for it either.
Publishing is off by default. Reads always work. Writes need
LINKEDIN_ENGINE_ALLOW_PUBLISH=1 in the server's environment. A server
that publishes on request from any agent that connects to it is a bad idea
at best.
A dry run needs no token. linkedin_publish_post answers the only
question that matters — would this post go out — without needing the
application to be authorised first, so you can test the gate before the
LinkedIn app is even created.
Setup
You need a LinkedIn application with the Sign In With LinkedIn product
(self-serve) and the Share on LinkedIn product (review, and the one
that grants w_member_social, without which you can read but not publish).
The setup, including the Company Page step that stops most people, is
documented in
linkedin-engine/docs/SETUP.md.
Authorise it once:
pip install linkedin-engine
linkedin-engine auth setup --client-id ... --client-secret ... --redirect-uri ...
linkedin-engine auth loginThen start the server:
linkedin-mcp # stdio, for a local agent
linkedin-mcp --http # streamable HTTP, for a shared serverConfiguration
Variable | Default | What it does |
| off | Set to |
|
| Where the credentials live |
|
| The written profile to diff against |
|
| The default visibility for a post |
See also
linkedin-engine— the command line tool this server is built on. Same credential store, same quality gate, plus draft generation from your GitHub activity.shipfree— the Agent Skill for deploying AI services on free tiers.
Development
pip install -e ".[dev]"
pytest
ruff check . && ruff format --check .
mypyLicense
MIT — see LICENSE.
Built by Aryan Raj Maurya.
Available Tools
5 toolslinkedin_check_postCheck a post before publishing itA
Run the quality gate over a draft post and return what is wrong with it. Errors block publishing: the announcement formulas, emoji used as punctuation, a first line that is a greeting rather than a claim, a post with no link in it, and a length that says nothing. Warnings do not block. Use this before every post.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it explains that errors block publishing, warnings do not, and it lists the main error categories. It still does not state whether the tool has side effects or auth requirements, but the core behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and then enumerates error conditions concisely. The list is useful, though slightly longer than strictly necessary and repeats the pre-publish framing from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values. It adequately covers the checking behavior and error/warning distinction, though it leaves some gaps around side effects and explicit parameter definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required string parameter and schema description coverage is 0%. The description implies the parameter is the draft post text, but it does not explicitly define the parameter or its format, so it only partially compensates for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it runs a quality gate over a draft post and reports problems. It is clearly a pre-publish validation tool, though it never names the sibling publish tool explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct usage guidance: 'Use this before every post.' That tells the agent when to call it, but it does not explicitly describe when not to use it or name alternatives like linkedin_publish_post.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_profileRead the LinkedIn profileA
Read the authenticated member's LinkedIn profile: name, headline, about and location. Use this before editing the profile, so you know what is live rather than guessing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does signal a read-only operation scoped to the authenticated member. It discloses that the data is live and mentions the key returned fields, but it does not cover failure modes such as an expired token or missing authentication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first defines the operation and its outputs, the second gives the practical usage rule. Nothing is wasted and the key guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema, the description is complete enough. It establishes what is read, whose profile is read, and the reason to call it before an edit, leaving return-value structure to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies no input is needed and simply lists the profile attributes that are read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: read the authenticated member's LinkedIn profile. It also enumerates the returned fields (name, headline, about, location), making the tool's scope immediately clear and distinct from linkedin_update_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: use this before editing the profile so you know what is live. That is useful routing guidance, though it does not explicitly name linkedin_update_profile as the alternative or describe when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_publish_postPublish a postA
Publish a text post to the member's feed. The quality gate runs first and refuses to publish a draft that fails it. This is a dry run unless publishing has been enabled on the server. Prefer linkedin_check_post first, so you can fix the problems it finds.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| dry_run | No | ||
| visibility | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses a pre-publish quality gate that can refuse the draft, that execution is a dry run unless server-side publishing is enabled, and that the tool is a mutation. It leaves the interplay between the dry_run parameter and the server setting, plus auth requirements, unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then the gate behavior, then the routing advice. Nothing is filler, though the dry-run sentence is worded loosely enough to read as ambiguous rather than crisp.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. But for a three-parameter mutation with zero schema description coverage and no annotations, the definition omits the visibility semantics and text limits and does not clarify dry_run precedence, leaving real gaps before an agent can call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and largely does not. It never explains the text parameter's constraints, how the dry_run parameter relates to the server toggle described in prose, or what values the visibility parameter (default empty string) accepts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Publish a text post to the member's feed." The quality-gate sentence hints at how it differs from linkedin_check_post, but the differentiation is carried mainly by the guidance sentence rather than the purpose statement itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Prefer linkedin_check_post first, so you can fix the problems it finds" explicitly names the sibling and the ordering to follow. It stops short of saying when not to use it (e.g. if the token is invalid, returning to linkedin_token_status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_token_statusCheck what the LinkedIn token can doA
Report what the stored LinkedIn token is allowed to do: whether it has expired, whether it can be refreshed, and which scopes were granted. Use this when publishing fails, to find out whether the application is missing the Share on LinkedIn product.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it discloses that this is a read-only inspection of stored token state, names the three facts returned, and frames it as a diagnostic rather than a mutation. It does not mention whether it triggers a network call to LinkedIn or refresh side effects, but it does not overstate behavior either.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what is reported, then the diagnostic trigger. Every clause adds information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-value detail need not be repeated, and the description still previews the key fields. For a zero-param diagnostic tool this is nearly sufficient; the only gap is not clarifying whether the check is purely local or performs a live token introspection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so baseline 4 applies. The description correctly implies no input is needed by referring to 'the stored LinkedIn token'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (report LinkedIn token status) and enumerates exactly what is reported: expiry, refreshability, and granted scopes. Clearly distinct from siblings like linkedin_check_post and linkedin_publish_post.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use this when publishing fails') and a diagnostic goal (detect missing Share on LinkedIn product), which routes the agent away from linkedin_check_post when the symptom is publish failure. No exclusion of other alternatives, but the trigger is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_update_profileUpdate the LinkedIn profileA
Update the headline, the about section or the location on the profile. This is a dry run unless publishing has been enabled on the server, so it reports what would change before it changes anything. Returns the diff against the live profile.
| Name | Required | Description | Default |
|---|---|---|---|
| about | No | ||
| headline | No | ||
| location | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the whole load and does well: it discloses that the call is a dry run unless publishing is enabled server-side, and that it returns a diff against the live profile. This is exactly the safety context an agent needs before mutating a profile; only the per-field failure/partial-update behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the scope, then execution mode, then return value. Nothing repeats what the schema already says and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema covers the return value and the dry-run note covers the main risk, but for a mutation tool with zero annotation coverage and all-optional string params defaulting to empty, the description leaves open whether omitted/empty fields mean 'no change' or 'clear the field'. That ambiguity matters for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names all three fields, mapping them one-to-one to the parameters, but adds no semantics beyond the names — no length limits, formatting rules, or whether an empty string clears a field, which is critical given every param defaults to "".
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the exact fields it touches (headline, about, location), which lets an agent distinguish it from linkedin_get_profile. It stops short of naming a sibling explicitly, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The dry-run/publishing note implies a preview-then-publish workflow, but the description never states when to choose this over linkedin_get_profile or linkedin_publish_post, nor what to do with the returned diff. Usage is inferable rather than stated.
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.
5 tool updates
v0.1.0- First observed
linkedin_check_post - First observed
linkedin_get_profile - First observed
linkedin_publish_post - First observed
linkedin_token_status - First observed
linkedin_update_profile
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: reading the profile, updating it, checking a draft post, publishing a post, and inspecting token status. The get/update and check/publish pairs are naturally separated by read-vs-write and validate-vs-execute semantics. There is no meaningful overlap that would cause misselection.
All tools use the linkedin_ prefix and mostly follow a verb_noun pattern: update_profile, check_post, publish_post, get_profile. linkedin_token_status is a noun-style status tool rather than a verb-led action, which is a minor but sensible deviation.
Five tools is well-scoped for a LinkedIn profile-and-posting server. Each tool earns its place across the read, validate, publish, update, and auth-diagnostic workflow.
The surface covers the core lifecycle: read profile, update profile, validate a draft, publish it, and diagnose token scopes. Minor gaps remain around managing already-published posts, such as listing, editing, or deleting them, but the main workflows are covered.
Maintenance
Related MCP Connectors
LinkedIn API as MCP tools to retrieve profile data and publish content. Powered by HAPI MCP.
- mcpOAuthcom.curviate
LinkedIn actions for AI agents: search, messaging, posts and invites, as hosted MCP tools.
Schedule and publish LinkedIn posts to profiles and company pages from AI agents.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI agents with read/write access to LinkedIn API, including profile, posts, media, organizations, comments, reactions, and analytics.204 npmMIT
- AlicenseBqualityDmaintenanceEnables drafting, formatting, analyzing, and publishing LinkedIn posts directly from MCP-compatible clients like Claude.549 npmMIT
- AlicenseAqualityDmaintenanceEnables LinkedIn API integration for managing profiles, posts, feed, connections, and sending messages through MCP-compatible clients.104 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to audit professional profiles, check policy compliance, preview posts, and publish explicitly confirmed text posts through LinkedIn's official API.MIT