Taplio helps LinkedIn creators plan and grow their presence by generating posts, scheduling content, managing drafts, discovering viral post ideas, and tracking engagement analytics to improve audience reach.
Encrypted at rest, isolated from the model
Resolved from an AES-256-GCM vault at the moment of the call and attached to the request — the model never sees the secrets.
Try asking
List the user's LinkedIn posts, newest first: posts created in Taplio (status scheduled, sending, or sent) plus posts published directly on LinkedIn, which always come back as sent. A draft becomes a post once it is scheduled or published. Taplio posts are ordered by when they were created in Taplio, posts published directly on LinkedIn by when they went live. LinkedIn-native coverage is the last 90 days and relies on a daily sync, so a post published in the last few hours may not be listed yet. Engagement metrics are not included: use get_post_analytics for impressions, likes, comments and shares. Also useful before drafting, to avoid repeating recent topics and match the user's established voice. media_type reports each post's format (text, image, video, document or article; absent when the format cannot be determined). media lists the post's images, video or document as durable urls, for posts created in Taplio and posts published directly on LinkedIn. It can be empty even when media_type reports an image, video or document, when Taplio does not hold a copy of that media yet: do not call again to wait for it, describe the post from its text and media_type.
Fetch a single LinkedIn post by id — either a Taplio post id or the LinkedIn urn list_posts returns for a post published directly on LinkedIn, which resolves within the last 90 days only. A post has status scheduled, sending, or sent; drafts are separate (use get_draft).
List the user's unpublished LinkedIn post drafts. Use it to review the content pipeline or find a draft to edit, schedule, or publish.
Fetch a single LinkedIn post draft by id.
Create a new LinkedIn post draft (unpublished). Attach media by passing media_ids (from list_media, or a media_id from create_media_upload_url whose bytes you have uploaded). Publish it later with schedule_draft or publish_draft.
Update the content of an existing LinkedIn post draft, optionally attaching media by media_ids (from list_media, or a media_id from create_media_upload_url whose bytes you have uploaded). content replaces the draft text, but media already attached is preserved automatically — you only pass media_ids to ADD media. Only drafts can be edited — published or scheduled posts cannot.
Attach an image or video to a LinkedIn post draft before scheduling or publishing, by giving a public https url. Calls the Taplio API (see https://api.taplio.com) — url is the location of a media file the server downloads and stores, not an API endpoint the caller constructs. The file is then added to the draft. Use it to illustrate a draft you created or edited. If the url is unreachable or not public, the draft is left text-only and the media can be attached in the Taplio composer instead.
Get a one-time presigned S3 URL to upload an image, video, GIF, or PDF, then attach it with update_draft's media_ids. Two-step flow: (1) call this with the file's content_type to get back a media_id and an upload_url; (2) in this same runtime, PUT the raw file bytes to upload_url, sending the returned headers exactly; (3) call update_draft (or create_draft) with the media_id in media_ids to embed it. Use when the agent holds the bytes locally. If this runtime cannot PUT raw bytes to a URL, skip it: create a text-only draft and tell the user to attach the media in the Taplio composer.
List media you've already uploaded to Taplio (id, type, public url, filename), most recent first. Optionally filter by a filename substring with query. Use it before drafting so you can attach existing media via create_draft or update_draft media_ids — no re-upload needed.
Schedule a LinkedIn post draft to be published automatically at a future time.
Unschedule a scheduled LinkedIn post, returning it to drafts so you can edit, reschedule, or delete it.
Publish a LinkedIn post draft to LinkedIn immediately. This goes live now and cannot be undone.
Permanently delete a LinkedIn post draft.
Search LinkedIn posts from other creators to use as inspiration. Use it before drafting to ground new posts in proven formats and angles from other creators. Set author to read the posts one creator wrote.
Get the user's LinkedIn analytics overview (followers, impressions, engagement). Defaults to today's overview when no date range is given. Also a post-creation helper: consult it before drafting to see what's currently driving followers and engagement, not just when reporting on performance.
List the user's per-post LinkedIn analytics (impressions, likes, comments, shares) and each post's media_type (text, image, video, document or article; absent when the format cannot be determined), defaulting to the last 7 days when no date range is given. Also a post-creation helper: use it to find the user's top-performing posts and reuse the topics, formats, and hooks that work when writing new content.
Read this first to orient. Returns the user's identity and content preferences so you can tailor output to them and recognize their own posts: their display name and LinkedIn @handle (username) — check both because a user may go by several aliases — plus ai_settings (industry, role, language, target audience, topics, keywords, description) and today's LinkedIn stats (followers, connections, profile views).
Find LinkedIn posts worth commenting on, from one of three sources: the user's own recent posts, a curated feed of hand-picked profiles, or a personalized selection. Every post comes back with the post_urn a comment draft targets, so pick a post here first and draft the comment against that urn. To reply to the discussion under a post instead of commenting on the post itself, pass its post_urn to find_comments_to_reply.
List the curated feeds available for engagement, each a hand-picked set of profiles with the number of profiles it tracks. The name returned here is exactly what find_posts_to_comment's feed parameter takes.
Find comments on LinkedIn posts that are still worth a reply: comments the user already answered, wrote themselves, or hid are filtered out. Every comment comes back with the comment_urn and post_urn a reply draft needs. Each post costs one upstream call, so ask for a handful of posts at a time rather than a whole page of them, using post_urns from find_posts_to_comment.
List the user's LinkedIn comment drafts, newest first. A draft keeps the same record for its whole life, so this is also the queue and the history: status draft means still editable, pending means committed and waiting for its send slot, and posted, failed or cancelled are final. Use it to find a draft to edit or commit, or to review what earlier commits did.
Fetch a single LinkedIn comment draft by id. This is how you confirm what a commit actually did: status is draft (still editable, nothing queued), pending (committed and waiting for its send slot, nothing on LinkedIn yet), posted (live on LinkedIn, with comment_urn set), failed (posting was attempted and did not go through) or cancelled (blocked before posting). failure_reason and failure_code say why a failed or cancelled comment never went out. Read this before telling the user a committed comment is live.
Draft a LinkedIn comment on someone else's post, or a reply to a comment on it. The draft is unpublished: nothing reaches LinkedIn until commit_comment_draft, so write the text here, show it to the user, and only commit once they agree. Get the post_urn (and the comment to reply to) from find_posts_to_comment or find_comments_to_reply.
Rewrite the text of a LinkedIn comment draft. Only a draft still in status draft can be edited: once it is committed it is queued or already posted, and the edit is rejected.
Commit a comment draft, which SCHEDULES the comment to be posted on LinkedIn under the user's name, on someone else's post. The comment is NOT live when this call returns: Taplio queues it and posts it from the user's account, typically within minutes, but hours later when the user is outside their posting window or has hit their hourly comment limit. The response comes back with status pending and scheduled_for, the time it is due to go out: quote that time to the user, and never tell them the comment is already posted. Confirm the outcome afterwards with get_comment_draft: its status turns to posted with a comment_urn once the comment is live, or to failed or cancelled with a failure_reason. cancel_comment_draft can stop it before it is sent; once posted it is irreversible. Unsafe to retry: committing a draft that was already committed is rejected.
Cancel a committed comment before it is sent, so it never reaches LinkedIn. Returns the draft with status cancelled and a failure_reason. A draft that was never committed, is posted, failed or cancelled, or is being sent is refused with comment_not_cancellable, whose reason says which: tell the user it can no longer be cancelled rather than retrying.
Ask to connect with someone on LinkedIn, by their public username (the last part of their profile url). The invitation is not sent during this call: it joins the account's send queue, which paces invitations to keep the account safe, so `scheduled_for` in the response says when it is due to go out, minutes away or much later. Asking again for someone already queued returns that same pending request instead of sending a second invitation, so it is safe to retry. The invitation carries no note: LinkedIn caps noted invitations far lower than plain ones, so a plain one is far likelier to land. Requires the Enterprise plan; a lower plan answers insufficient_plan. cancel_connection_request can stop it before it is sent.
List every connection request this account has queued, newest first, whatever became of each one: pending while it waits in the send queue, sent once it left, failed or cancelled with the reason otherwise. Read this before asking to connect with a batch of people — anyone already listed as pending or sent does not need a second request. Covers requests queued from anywhere in Taplio, not just the ones sent through this tool. Returns the most recent requests only, up to 100; to check one specific person whatever their age, use get_connection_request.
Read back the latest connection request this account queued for a username: pending while it waits in the send queue, sent once it left, failed or cancelled with the reason otherwise. Someone who is already a connection, or who already has an invitation pending, reads as sent. Use it to follow up on a send_connection_request. A username this account never asked to connect with answers connection_not_found.
Cancel a connection request before it is sent, so the invitation never reaches LinkedIn. Returns the request with status cancelled and a failure_reason. A request that was already sent, failed or cancelled, or is being sent is refused with connection_not_cancellable, whose reason says which: tell the user it can no longer be cancelled rather than retrying. A username this account never asked to connect with answers connection_not_found.
Like a LinkedIn post or a comment on one. `post_urn` takes the `post_urn` of a find_posts_to_comment result, the urn inside a list_posts `url`, the `comment_urn` of a find_comments_to_reply result, or anything the user pastes: a post url, a `lnkd.in` short link, a `urn:li:share:` / `urn:li:ugcPost:` urn, or a comment urn. Liking a post and liking one of its comments are two separate likes, and so is the same post named by its `urn:li:activity:` and its `urn:li:ugcPost:` id, so pass back the urn a response gave you. The like is not sent during this call: it joins the account's send queue, which paces likes and follows office hours, so `scheduled_for` in the response says when it is due to go out, minutes away or the next morning. Asking again for a post already queued returns that same pending like instead of liking twice, so it is safe to retry. Requires the Growth plan or above; a lower plan answers insufficient_plan. cancel_like can stop it before it is sent.
Read back the latest like this account queued for a post or a comment: pending while it waits in the send queue, liked once it went out, failed or cancelled with the reason otherwise. Use it to follow up on a like_post. A post this account never asked to like answers like_not_found — and so does a like made from the Taplio app's own like button, which is not tracked here.
Cancel a like before it is sent, so it never reaches LinkedIn. Returns the like with status cancelled and a failure_reason. A like that was already sent, failed or cancelled, or is being sent is refused with like_not_cancellable, whose reason says which: tell the user it can no longer be cancelled rather than retrying. A post this account never asked to like answers like_not_found.
Open an interactive panel listing the media ALREADY in the user library (images, videos, GIFs, PDFs) as a thumbnail grid; clicking a tile attaches it to the given draft. Nothing is uploaded. Use when the user wants to reuse an asset they added earlier — NOT for a file sitting on their machine, which is upload_media.
Open an interactive panel with a drop zone plus a file chooser, for a NEW file from the user device: the dropped or chosen image, video or PDF is uploaded to Taplio and attached to the given draft in one step. Use whenever the file is not in the library yet — to reuse an existing asset instead, call pick_media.
One endpoint, the same key, whichever client you use.
~/Library/Application Support/Claude/claude_desktop_config.json (Mac) · %APPDATA%\Claude\claude_desktop_config.json (Windows)
Replace API_KEY with your own key.
Already have an "mcpServers" section in your config? Just add the server entry inside it.
Discovery, routing, credentials, tool scoping and execution logs all happen at the gateway→connections stay ACTIVE with no work from you
Taplio MCP runs through a gateway that holds the credentials, scopes the access and records every call.
Managed auth, hosted MCP servers, and every Taplio MCP tool your agent needs.
Free to start.