Posts on LinkedIn as a member, or a page they run, through a Zero Human bridge, signed in with your own LinkedIn account.
LinkedIn is a Zero Human bridge: an MCP server Zero Human hosts in front of LinkedIn's own API, because LinkedIn offers no MCP server a connection can use. You connect it on Tools in the portal by signing in with LinkedIn, through a LinkedIn app your company registers. Each post is made as your account, with your own sign-in.
What a member can do
With LinkedIn connected, a member can see which accounts the sign-in can post as, publish a post as one of them, and
delete a post it made. A post can carry a link card for a page: its address, title, one line about it, and an image.
LinkedIn does not fetch a page's preview for posts made this way, so the bridge uploads the image itself, from a
public https address such as the page's social image.
| Tool | What it does | Reads or writes |
|---|---|---|
accounts_list |
The accounts this sign-in can post as: the member, and each company page where the member is an administrator or content admin | Reads |
post_create |
Publishes a post as the author: up to 3,000 characters, and optionally a link card for one page | Writes: a public post |
post_delete |
Deletes one post the author made | Writes: removes a post |
What it writes is public: a post appears on the author's feed as soon as post_create returns. Hashtags written as
#word stay hashtags; brackets, underscores and other characters LinkedIn reads as markup show as typed.
It reads no feed, comment, reaction or analytics: LinkedIn keeps those for apps it has approved for them.
Name each LinkedIn tool a task needs, such as linkedin.post_create, or linkedin for all three. A tool the task
does not name is refused, whatever the connection allows. A task that names a social slot's post action, rather
than the tool, works with LinkedIn or with any other tool that fills that slot.
Who connects it
A LinkedIn connection acts as the LinkedIn member who signed in when it was connected. It posts as that member,
or as a company page that member runs, and reaches nothing else. Who a post is written as is the author setting:
fix it on the connection, from what accounts_list returns, so every post is written as the same account.
You connect it by signing in with LinkedIn, through your company's own LinkedIn app. The sign-in asks for three
permissions: openid and profile, to know who signed in, and w_member_social, to post as that member.
Company pages. Posting as a page needs LinkedIn's company page permission (w_organization_social), which
LinkedIn grants only to apps it has approved for its Community Management API, and a member who is an administrator
or content admin of the page. Until your app has it, accounts_list names only the member and says why pages are
missing, and posting as the member works.
A connection can sit on the enterprise, a team, a member, a role or a task, and the one further down replaces the one above. A connection on anything but a task also reaches the chat of every member it covers. Connect LinkedIn on the task that posts unless you want members to post from chat too.
What waits for you
In a run, a post waits for you only when the task gates it, and a Marketing task that posts gates every post. To
approve each post before it goes out, gate post_create (and post_delete); see
Gates and tool scopes. In a chat, both ask you before they run, unless you chose
Always allow for that member and tool. accounts_list only reads, and never waits.
Setup
Register a LinkedIn app
One app serves your whole company: it only identifies Zero Human OS as the thing asking, and the person who signs in decides which account it posts as.
- Create an app at linkedin.com/developers/apps. LinkedIn asks for a company page to own it: use your company's.
- Products: add Share on LinkedIn and Sign In with LinkedIn using OpenID Connect. Both are granted straight away.
- Auth → Authorized redirect URLs: add
https://portal.zerohuman.com/v1/tools/oauth/callbackexactly, with no trailing slash. The Add tool form in the portal shows the right value. - Copy the Client ID and Primary Client Secret from Auth.
Connect it
Work in one browser window throughout: LinkedIn returns to the portal in the window you started from.
- In the portal, on Tools, choose Add tool. Layer: Task, and Bind on: the task that posts.
- Kind: MCP. Tool type:
linkedin. MCP server URL:https://bridges.zerohuman.com/linkedin/mcp. - Auth: OAuth, with your app's Client ID and Client Secret. Keep the three permissions the form offers.
- Choose Connect with OAuth, check that the account on LinkedIn's screen is the one that should post, and choose Allow.
- Check it. Run a task that calls
accounts_list. The run page shows the member, and any pages. - Fix
authoron the connection to the account the task should post as.
To disconnect LinkedIn, delete the connection on Tools, or remove the app under Settings → Data privacy → Permitted services on LinkedIn. Reconnect keeps the connection and has you sign in again.
Limits and cost
LinkedIn's own limits apply: it caps how many posts an account and an app make in a day, and refuses a post that duplicates one the author just made. A post's text is at most 3,000 characters, and a link card's image is a PNG, JPEG or GIF of at most 8 MB.
The sign-in lasts 60 days. LinkedIn gives apps outside its approved programmes no way to renew a sign-in, so a connection stops working 60 days after it was made, and the run that next posts asks you to reconnect.
The bridge has no Zero Human charge of its own. Its calls happen inside runs, and your plan counts those runs as it counts any other. LinkedIn makes no charge for posting.
Troubleshooting
What a call returns shows on the run page. The quoted words are taken from each message, so you can search this page for the words on your screen.
| What you see | Why | What to do |
|---|---|---|
| The run stops and asks you to sign in again | The 60-day sign-in ran out, or the access was removed on LinkedIn | Choose Reconnect and sign in again |
| The result says LinkedIn "says this sign-in may not do that" | The app lacks Share on LinkedIn, or the post names a page the member does not run, or the app lacks company page access | Add the product to the app, fix author to an account accounts_list names, or post as the member |
accounts_list says "Company pages are not listed" |
The app does not have LinkedIn's company page permission | Post as the member, or apply for LinkedIn's Community Management API |
| The result says the post "duplicates one the author already made" | LinkedIn refuses the same text twice in a row | Change the words |
The result says thumbnailUrl "must be a public https address", or is "not a PNG, JPEG or GIF image" |
The image address is not a public https address of an image |
Use the page's public social image, such as its og:image |
The run stops and says no LinkedIn connection reaches it (tool_not_bound:linkedin) |
LinkedIn is not connected anywhere this run reaches | Connect it on the task, or at a layer the run reaches |
| LinkedIn's screen says the redirect URL does not match | The app's Authorized redirect URLs lacks the portal's address | Add it exactly as Register a LinkedIn app shows |