[{"data":1,"prerenderedAt":39},["ShallowReactive",2],{"$f38xyhibxzqo4k":3},{"href":4,"title":5,"description":6,"kind":7,"mark":8,"planned":9,"contributors":10,"provenance":8,"express":9,"html":11,"headings":12},"\u002Fdocs\u002Ftools\u002Flinkedin","LinkedIn","Posts on LinkedIn as a member, or a page they run, through a Zero Human bridge, signed in with your own LinkedIn account.","integrates",null,false,[],"\u003Cp>LinkedIn is a Zero Human bridge: an MCP server Zero Human hosts in front of LinkedIn's own API, because LinkedIn\noffers no MCP server a connection can use. You connect it on \u003Cstrong>Tools\u003C\u002Fstrong> in the portal by signing in with LinkedIn,\nthrough a LinkedIn app your company registers. Each post is made as your account, with your own sign-in.\u003C\u002Fp>\n\u003Ch2 id=\"what-a-member-can-do\">What a member can do\u003C\u002Fh2>\n\u003Cp>With LinkedIn connected, a member can see which accounts the sign-in can post as, publish a post as one of them, and\ndelete a post it made. A post can carry a link card for a page: its address, title, one line about it, and an image.\nLinkedIn does not fetch a page's preview for posts made this way, so the bridge uploads the image itself, from a\npublic \u003Ccode>https\u003C\u002Fcode> address such as the page's social image.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003Cth>Reads or writes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>accounts_list\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The accounts this sign-in can post as: the member, and each company page where the member is an administrator or content admin\u003C\u002Ftd>\n\u003Ctd>Reads\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>post_create\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Publishes a post as the author: up to 3,000 characters, and optionally a link card for one page\u003C\u002Ftd>\n\u003Ctd>Writes: a public post\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>post_delete\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Deletes one post the author made\u003C\u002Ftd>\n\u003Ctd>Writes: removes a post\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>What it writes is public: a post appears on the author's feed as soon as \u003Ccode>post_create\u003C\u002Fcode> returns. Hashtags written as\n\u003Ccode>#word\u003C\u002Fcode> stay hashtags; brackets, underscores and other characters LinkedIn reads as markup show as typed.\u003C\u002Fp>\n\u003Cp>It reads no feed, comment, reaction or analytics: LinkedIn keeps those for apps it has approved for them.\u003C\u002Fp>\n\u003Cp>Name each LinkedIn tool a task needs, such as \u003Ccode>linkedin.post_create\u003C\u002Fcode>, or \u003Ccode>linkedin\u003C\u002Fcode> for all three. A tool the task\ndoes not name is refused, whatever the connection allows. A task that names a social slot's post action, rather\nthan the tool, works with LinkedIn or with any other tool that fills that slot.\u003C\u002Fp>\n\u003Ch2 id=\"who-connects-it\">Who connects it\u003C\u002Fh2>\n\u003Cp>A LinkedIn connection acts as \u003Cstrong>the LinkedIn member who signed in\u003C\u002Fstrong> when it was connected. It posts as that member,\nor as a company page that member runs, and reaches nothing else. Who a post is written as is the \u003Ccode>author\u003C\u002Fcode> setting:\nfix it on the connection, from what \u003Ccode>accounts_list\u003C\u002Fcode> returns, so every post is written as the same account.\u003C\u002Fp>\n\u003Cp>You connect it by signing in with LinkedIn, through your company's own LinkedIn app. The sign-in asks for three\npermissions: \u003Ccode>openid\u003C\u002Fcode> and \u003Ccode>profile\u003C\u002Fcode>, to know who signed in, and \u003Ccode>w_member_social\u003C\u002Fcode>, to post as that member.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Company pages.\u003C\u002Fstrong> Posting as a page needs LinkedIn's company page permission (\u003Ccode>w_organization_social\u003C\u002Fcode>), which\nLinkedIn grants only to apps it has approved for its Community Management API, and a member who is an administrator\nor content admin of the page. Until your app has it, \u003Ccode>accounts_list\u003C\u002Fcode> names only the member and says why pages are\nmissing, and posting as the member works.\u003C\u002Fp>\n\u003Cp>A connection can sit on the enterprise, a team, a member, a role or a task, and the one further down replaces the\none above. A connection on anything but a task also reaches the \u003Ca href=\"\u002Fdocs\u002Fwork\u002Fchat\">chat\u003C\u002Fa> of every member it covers.\nConnect LinkedIn \u003Cstrong>on the task that posts\u003C\u002Fstrong> unless you want members to post from chat too.\u003C\u002Fp>\n\u003Ch2 id=\"what-waits-for-you\">What waits for you\u003C\u002Fh2>\n\u003Cp>In a run, a post waits for you only when the task gates it, and a Marketing task that posts gates every post. To\napprove each post before it goes out, gate \u003Ccode>post_create\u003C\u002Fcode> (and \u003Ccode>post_delete\u003C\u002Fcode>); see\n\u003Ca href=\"\u002Fdocs\u002Fcontrol\u002Fgates\">Gates and tool scopes\u003C\u002Fa>. In a chat, both ask you before they run, unless you chose\n\u003Cstrong>Always allow\u003C\u002Fstrong> for that member and tool. \u003Ccode>accounts_list\u003C\u002Fcode> only reads, and never waits.\u003C\u002Fp>\n\u003Ch2 id=\"setup\">Setup\u003C\u002Fh2>\n\u003Ch3 id=\"register-a-linkedin-app\">Register a LinkedIn app\u003C\u002Fh3>\n\u003Cp>One app serves your whole company: it only identifies Zero Human OS as the thing asking, and the person who signs\nin decides which account it posts as.\u003C\u002Fp>\n\u003Col>\n\u003Cli>Create an app at \u003Ca href=\"https:\u002F\u002Fwww.linkedin.com\u002Fdevelopers\u002Fapps\">linkedin.com\u002Fdevelopers\u002Fapps\u003C\u002Fa>. LinkedIn asks for a\ncompany page to own it: use your company's.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Products:\u003C\u002Fstrong> add \u003Cstrong>Share on LinkedIn\u003C\u002Fstrong> and \u003Cstrong>Sign In with LinkedIn using OpenID Connect\u003C\u002Fstrong>. Both are granted\nstraight away.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Auth → Authorized redirect URLs:\u003C\u002Fstrong> add \u003Ccode>https:\u002F\u002Fportal.zerohuman.com\u002Fv1\u002Ftools\u002Foauth\u002Fcallback\u003C\u002Fcode> exactly, with no\ntrailing slash. The \u003Cstrong>Add tool\u003C\u002Fstrong> form in the portal shows the right value.\u003C\u002Fli>\n\u003Cli>Copy the \u003Cstrong>Client ID\u003C\u002Fstrong> and \u003Cstrong>Primary Client Secret\u003C\u002Fstrong> from \u003Cstrong>Auth\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"connect-it\">Connect it\u003C\u002Fh3>\n\u003Cp>Work in one browser window throughout: LinkedIn returns to the portal in the window you started from.\u003C\u002Fp>\n\u003Col>\n\u003Cli>In the portal, on \u003Cstrong>Tools\u003C\u002Fstrong>, choose \u003Cstrong>Add tool\u003C\u002Fstrong>. \u003Cstrong>Layer:\u003C\u002Fstrong> Task, and \u003Cstrong>Bind on:\u003C\u002Fstrong> the task that posts.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kind:\u003C\u002Fstrong> MCP. \u003Cstrong>Tool type:\u003C\u002Fstrong> \u003Ccode>linkedin\u003C\u002Fcode>. \u003Cstrong>MCP server URL:\u003C\u002Fstrong> \u003Ccode>https:\u002F\u002Fbridges.zerohuman.com\u002Flinkedin\u002Fmcp\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Auth:\u003C\u002Fstrong> OAuth, with your app's Client ID and Client Secret. Keep the three permissions the form offers.\u003C\u002Fli>\n\u003Cli>Choose \u003Cstrong>Connect with OAuth\u003C\u002Fstrong>, check that the account on LinkedIn's screen is the one that should post, and\nchoose \u003Cstrong>Allow\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Check it.\u003C\u002Fstrong> Run a task that calls \u003Ccode>accounts_list\u003C\u002Fcode>. The run page shows the member, and any pages.\u003C\u002Fli>\n\u003Cli>Fix \u003Ccode>author\u003C\u002Fcode> on the connection to the account the task should post as.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>To disconnect LinkedIn, delete the connection on \u003Cstrong>Tools\u003C\u002Fstrong>, or remove the app under \u003Cstrong>Settings → Data privacy →\nPermitted services\u003C\u002Fstrong> on LinkedIn. \u003Cstrong>Reconnect\u003C\u002Fstrong> keeps the connection and has you sign in again.\u003C\u002Fp>\n\u003Ch2 id=\"limits-and-cost\">Limits and cost\u003C\u002Fh2>\n\u003Cp>LinkedIn's own limits apply: it caps how many posts an account and an app make in a day, and refuses a post that\nduplicates one the author just made. A post's text is at most 3,000 characters, and a link card's image is a PNG,\nJPEG or GIF of at most 8 MB.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>The sign-in lasts 60 days.\u003C\u002Fstrong> LinkedIn gives apps outside its approved programmes no way to renew a sign-in, so a\nconnection stops working 60 days after it was made, and the run that next posts asks you to reconnect.\u003C\u002Fp>\n\u003Cp>The bridge has no Zero Human charge of its own. Its calls happen inside runs, and your plan counts those runs as it\ncounts any other. LinkedIn makes no charge for posting.\u003C\u002Fp>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C\u002Fh2>\n\u003Cp>What a call returns shows on the run page. The quoted words are taken from each message, so you can search this page\nfor the words on your screen.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>What you see\u003C\u002Fth>\n\u003Cth>Why\u003C\u002Fth>\n\u003Cth>What to do\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>The run stops and asks you to sign in again\u003C\u002Ftd>\n\u003Ctd>The 60-day sign-in ran out, or the access was removed on LinkedIn\u003C\u002Ftd>\n\u003Ctd>Choose \u003Cstrong>Reconnect\u003C\u002Fstrong> and sign in again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says LinkedIn &quot;says this sign-in may not do that&quot;\u003C\u002Ftd>\n\u003Ctd>The app lacks \u003Cstrong>Share on LinkedIn\u003C\u002Fstrong>, or the post names a page the member does not run, or the app lacks company page access\u003C\u002Ftd>\n\u003Ctd>Add the product to the app, fix \u003Ccode>author\u003C\u002Fcode> to an account \u003Ccode>accounts_list\u003C\u002Fcode> names, or post as the member\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>accounts_list\u003C\u002Fcode> says &quot;Company pages are not listed&quot;\u003C\u002Ftd>\n\u003Ctd>The app does not have LinkedIn's company page permission\u003C\u002Ftd>\n\u003Ctd>Post as the member, or apply for LinkedIn's Community Management API\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says the post &quot;duplicates one the author already made&quot;\u003C\u002Ftd>\n\u003Ctd>LinkedIn refuses the same text twice in a row\u003C\u002Ftd>\n\u003Ctd>Change the words\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The result says \u003Ccode>thumbnailUrl\u003C\u002Fcode> &quot;must be a public https address&quot;, or is &quot;not a PNG, JPEG or GIF image&quot;\u003C\u002Ftd>\n\u003Ctd>The image address is not a public \u003Ccode>https\u003C\u002Fcode> address of an image\u003C\u002Ftd>\n\u003Ctd>Use the page's public social image, such as its \u003Ccode>og:image\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The run stops and says no LinkedIn connection reaches it (\u003Ccode>tool_not_bound:linkedin\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd>LinkedIn is not connected anywhere this run reaches\u003C\u002Ftd>\n\u003Ctd>Connect it on the task, or at a layer the run reaches\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LinkedIn's screen says the redirect URL does not match\u003C\u002Ftd>\n\u003Ctd>The app's \u003Cstrong>Authorized redirect URLs\u003C\u002Fstrong> lacks the portal's address\u003C\u002Ftd>\n\u003Ctd>Add it exactly as \u003Cstrong>Register a LinkedIn app\u003C\u002Fstrong> shows\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n",[13,17,20,23,26,30,33,36],{"id":14,"text":15,"level":16,"planned":9},"what-a-member-can-do","What a member can do",2,{"id":18,"text":19,"level":16,"planned":9},"who-connects-it","Who connects it",{"id":21,"text":22,"level":16,"planned":9},"what-waits-for-you","What waits for you",{"id":24,"text":25,"level":16,"planned":9},"setup","Setup",{"id":27,"text":28,"level":29,"planned":9},"register-a-linkedin-app","Register a LinkedIn app",3,{"id":31,"text":32,"level":29,"planned":9},"connect-it","Connect it",{"id":34,"text":35,"level":16,"planned":9},"limits-and-cost","Limits and cost",{"id":37,"text":38,"level":16,"planned":9},"troubleshooting","Troubleshooting",1793444080165]