Taplio for LinkedIn
Server Details
Write, schedule and analyze LinkedIn posts, find inspiration, comment, like and connect via Taplio.
- Status
- Healthy
- Uptime
- 25.6% over 77 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- TaplioOfficial/taplio-linkedin-mcp
- GitHub Stars
- 3
- Server Listing
- Taplio LinkedIn MCP Server
- ChatGPT
- –
- Claude
- Taplio
TDQS
Scored across 35 tools
Most tools map cleanly to one resource+action, and the descriptions actively disambiguate the tricky pairs (draft vs post, like_post vs get_post_like, commit vs publish). The weak spot is media: attach_media_from_url, create_media_upload_url, upload_media, pick_media and list_media all end in 'get media onto a draft', and an agent must read carefully to pick the right one for the bytes it holds.
The set is consistently snake_case with a shared verb vocabulary (get_/list_/create_/update_/cancel_/delete_) applied uniformly across posts, drafts, comments, likes and connection requests. Minor deviations exist: the bare 'unschedule' and 'get_me', the odd verb 'pick_media', and the long phrase-names 'find_posts_to_comment' and 'attach_media_from_url', but nothing breaks the pattern.
35 tools is heavy, but the server spans genuinely separate sub-domains (post drafts, published posts, comments, likes, connection requests, media, analytics, inspiration search), each of which needs its own lifecycle verbs. It still feels inflated: five media tools and parallel get/list pairs per entity push well past the comfortable 3-15 range, so the surface is bigger than a typical agent workflow needs.
Coverage is strong: drafts have full create/update/delete/get/list plus schedule/publish/unschedule, comments and connection requests get draft/commit/cancel/read-back, and analytics and discovery round out the pre-draft workflow. Remaining gaps are minor but real — no way to delete or edit an already-published post, no media deletion, and no follow/unfollow tools despite likes being described as paced alongside follows.
Available Tools
35 toolsattach_media_from_urlAttach media from urlAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the draft to attach media to (from list_drafts). | |
| url | Yes | Public https url of the image or video to attach (jpeg, png, webp, gif, mp4, mov, webm, pdf). | |
| document_title | No | Optional title LinkedIn shows when the url is a PDF. Defaults to the PDF file name. Up to 100 characters; letters, digits, spaces and hyphens are kept. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| media | No | |
| status | Yes | |
| content | Yes | |
| created_at | Yes | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/idempotency profile; the description adds substantive behavior: the server downloads and stores the file, and on an unreachable or non-public url the draft is silently left text-only rather than erroring. That failure-mode disclosure is exactly the kind of context annotations cannot carry. It omits whether attaching replaces or adds alongside existing draft media, and does not address idempotencyHint=false.
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?
Front-loaded with purpose, then mechanism, then usage and fallback. The em-dash clarification about the url is long but earns its place; the final clause about the composer is slightly padded but still informative. No filler sentences.
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 3-parameter mutation with an output schema and full annotation coverage, the description supplies the missing pieces: what the server does with the url, and what happens on failure. Only the interaction with pre-existing draft media is left unaddressed.
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 already 100%, so the baseline is 3, but the description adds a genuinely non-obvious clarification: 'url is the location of a media file the server downloads and stores, not an API endpoint the caller constructs.' That preempts a plausible misuse given the existence of create_media_upload_url. It also implies the public-https constraint that the schema only states flatly.
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 ('Attach an image or video to a LinkedIn post draft') plus the mechanism ('by giving a public https url'), which separates it from upload_media or pick_media in substance. It never names those siblings directly, so an agent must infer the distinction rather than being told.
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 a situational cue ('before scheduling or publishing', 'to illustrate a draft you created or edited') and a fallback (use the Taplio composer). It does not state when to prefer this over upload_media, create_media_upload_url, or pick_media, which are the real choice points given the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_comment_draftCancel queued commentADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the committed comment draft to cancel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | |
| content | Yes | |
| post_urn | Yes | |
| comment_id | No | |
| created_at | Yes | |
| updated_at | Yes | |
| comment_urn | No | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/idempotent/not-read-only, yet the description adds real behavioral context: the exact effect ('never reaches LinkedIn'), the refusal condition, the error code comment_not_cancellable, and explicit guidance not to retry. That is disclosure well beyond the annotation set.
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 front-loaded sentences: purpose, then return shape, then error semantics. No filler; each sentence carries distinct, load-bearing information.
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 one-parameter mutation with annotations and an output schema, this covers purpose, side effects, return shape, and terminal error handling with user-facing guidance. Nothing needed to invoke or interpret it correctly is missing.
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 100% and the single parameter is fully described there ('The id of the committed comment draft to cancel'). The description reinforces the 'committed' state requirement but adds no syntax or format detail beyond the schema, so baseline 3 applies.
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+resource with scope: 'Cancel a committed comment before it is sent, so it never reaches LinkedIn.' The state qualifier ('committed') implicitly separates it from draft-creation/delete siblings, but no sibling is named, so it stops short of a clean 5.
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?
Clearly conveys when to use it (a committed comment not yet sent) and what happens in every failure state ('never committed, is posted, failed or cancelled, or is being sent is refused'). It even tells the agent to stop retrying, but it never names an alternative tool (e.g., delete_draft) for the non-committed case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_connection_requestCancel queued connection requestADestructiveIdempotentInspect
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, skipped, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | The recipient's LinkedIn public username, the same one send_connection_request was called with. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| message | No | |
| username | Yes | |
| created_at | Yes | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No | |
| skipped_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the return shape (status cancelled plus failure_reason) and the exact error codes connection_not_cancellable and connection_not_found, including what each means and how the agent should respond. The annotations already cover mutation/destructive/idempotent traits, and the description adds rich behavioral context on top.
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 tight sentences, front-loaded with the action and scope, followed by return behavior and failure modes. Every sentence adds actionable information with no repetition.
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?
Complete for a one-parameter mutation tool with an output schema: the description covers scope, return status, error semantics, and retry guidance, while annotations and schema handle safety and input details.
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 100%, and the single username parameter is already documented as the recipient's LinkedIn public username matching send_connection_request. The description references username only indirectly through error cases, so it adds little parameter meaning beyond the schema; baseline 3 is appropriate.
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 precise verb and resource ('Cancel a connection request') and adds the critical scope ('before it is sent, so the invitation never reaches LinkedIn'). This clearly distinguishes it from send_connection_request and get_connection_request without needing the schema.
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?
Explicitly defines the valid window (before sending) and enumerates the states where cancellation is refused, with a clear instruction not to retry. It does not, however, name an alternative tool for inspecting or handling already-sent requests, so it stops short of full when-to-use-vs-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_likeCancel queued likeADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_urn | Yes | The post_urn like_post returned for this like. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| status | Yes | |
| post_urn | Yes | |
| created_at | Yes | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and idempotency, but the description adds the state machine it operates over (sent, failed, cancelled, in-flight), the refusal code like_not_cancellable with a reason, and the not-found case like_not_found. That is real behavioral context beyond structured fields.
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 tight sentences with no filler; the primary action and its guarantee are front-loaded, followed by the two failure modes in a logical order.
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 one-parameter cancellation tool with annotations present and an output schema covering return shape, the description supplies everything an agent needs: success semantics, refusal semantics, and the recommended user-facing response on failure.
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 100% and the single post_urn parameter is documented there as the value returned by like_post. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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 ('Cancel a like before it is sent') with an explicit scope constraint ('so it never reaches LinkedIn'), which cleanly separates it from the sibling like_post that creates likes. Nothing about the intent is ambiguous.
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 clear conditions under which the call succeeds versus fails, and prescribes the right agent behavior on failure ('tell the user it can no longer be cancelled rather than retrying'). It stops short of naming a sibling alternative for creating/cancelling other like states, so it is strong context without explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commit_comment_draftCommit comment draftADestructiveInspect
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. The same one-comment rule applies: a commit on a post this account already commented on (or a comment it already replied to) is refused with comment_commit_blocked and code COMMENT_ALREADY_POSTED, and a queued comment that turns out to be a duplicate when it is due is cancelled with that code instead of posted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the comment draft to schedule for posting (from list_comment_drafts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | |
| content | Yes | |
| post_urn | Yes | |
| comment_id | No | |
| created_at | Yes | |
| updated_at | Yes | |
| scheduled_for | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructive, non-idempotent, open-world) by explaining that the call only queues the comment, that it returns status pending with scheduled_for, that posting can be delayed by posting windows or hourly limits, and that delivery is irreversible once live. It also documents the comment_commit_blocked / COMMENT_ALREADY_POSTED failure paths, which no annotation could convey. Nothing here contradicts destructiveHint=true or idempotentHint=false; it reinforces both.
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?
Front-loaded with the crucial 'this only schedules, it is NOT live' correction, then layered with follow-up, cancellation, retry, and error semantics. It is dense and long, but each sentence carries distinct operational information; the error-code sentences in the tail could be tightened.
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?
Covers everything an agent needs despite an output schema being present: the queued semantics, the fields to quote back (scheduled_for), the follow-up verification path, the irreversibility boundary, retry safety, and the duplicate-comment rejection codes. Complete for a non-idempotent, destructive, open-world mutation.
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 100% and the single parameter is already documented, so the baseline is 3. The description adds only mild value by framing the id as a draft to be scheduled rather than an already-posted comment, but the bulk of parameter meaning is still carried by the schema.
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 (commit a comment draft) and immediately clarifies the actual effect: it schedules a comment to be posted on LinkedIn under the user's name on someone else's post. That distinguishes it from the neighboring draft/schedule/publish siblings without the agent needing to open any schema.
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?
Explicitly names the follow-up and alternative tools and the conditions that select them: get_comment_draft to confirm the outcome, cancel_comment_draft to stop it before sending, and the fact that it is unsafe to retry because a re-commit is rejected. When-to-use and when-not-to-act guidance is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_comment_draftCreate comment draftAInspect
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. One comment per account per post, and one reply per comment: if this account already commented on the post (or already replied to that comment), queued or posted, the draft is refused with comment_commit_blocked and code COMMENT_ALREADY_POSTED. Do not retry: tell the user they already commented.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The comment text. 1 to 1250 characters. | |
| post_urn | Yes | The urn of the LinkedIn post to comment on, from find_posts_to_comment or find_comments_to_reply. | |
| comment_id | No | Pass this to draft a REPLY to an existing comment, using the comment_urn from find_comments_to_reply. Omit to comment on the post itself. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | |
| content | Yes | |
| post_urn | Yes | |
| comment_id | No | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false / destructiveHint=false, which is ambiguous for a tool that talks to an external network. The description resolves that by stating nothing reaches LinkedIn until commit, and it discloses the uniqueness constraint, the refusal error (comment_commit_blocked / COMMENT_ALREADY_POSTED), and the required non-retry behavior — none of which appear in annotations or schema.
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 sentences, each doing distinct work: what it drafts, that it is unpublished, where the URNs come from, and the refusal/do-not-retry rule. The unpublished-and-review instruction is front-loaded ahead of the edge cases.
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?
With an output schema present, return values need no explanation; the description instead covers the workflow, the source of each parameter value, the uniqueness rule, and the error path. Nothing an agent needs to invoke this correctly or handle failure is missing.
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 100% and the schema already explains content length, post_urn provenance, and that comment_id turns the draft into a reply. The description restates that post_urn and the reply target come from the finder tools, adding provenance context but no syntax or format detail beyond the schema, so the baseline of 3 applies.
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 ('Draft a LinkedIn comment ... or a reply to a comment on it') and immediately frames the artifact as unpublished, which separates it from commit_comment_draft and update_comment_draft. An agent can identify the tool and its output without opening the schema.
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 the full workflow: write the text here, show the user, then call commit_comment_draft only on agreement. It also names the prerequisite lookup tools (find_posts_to_comment, find_comments_to_reply), the one-comment/one-reply constraint, the exact failure code, and an explicit 'Do not retry' instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draftCreate draftAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | The text body of the LinkedIn post draft. 1 to 3000 characters. | |
| media_ids | No | Optional ids of media to attach — from list_media (already uploaded) or from create_media_upload_url after you PUT the bytes. Referenced by id only. | |
| document_title | No | Optional title LinkedIn shows for a PDF attached via media_ids in this same call. Defaults to the PDF file name. Ignored if no PDF is attached in this call. Up to 100 characters; letters, digits, spaces and hyphens are kept. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| media | No | |
| status | Yes | |
| content | Yes | |
| created_at | Yes | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent write, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: the record is created in an unpublished state, media must already be uploaded before its id is usable, and the draft requires a separate publish/schedule step to become live.
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 with the core create action front-loaded, followed by the media attachment mechanics and the follow-up path. Nothing is padded and no sentence repeats another.
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 and annotations cover the safety profile, so the description does not need to explain return values. The one gap is that no parameters are marked required in the schema and the description never clarifies whether content is effectively mandatory, which matters for an agent assembling the call.
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 100%, including the maxLength on content and the document_title semantics, so the schema already carries the parameter burden. The description's media guidance ('from list_media, or a media_id from create_media_upload_url whose bytes you have uploaded') largely restates what the media_ids schema description already says, so it adds little beyond baseline.
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 gives a specific verb+resource ('Create a new LinkedIn post draft') and immediately qualifies the resulting state as '(unpublished)', which cleanly separates it from publish_draft and schedule_draft in the sibling list.
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 names the downstream alternatives explicitly ('Publish it later with schedule_draft or publish_draft') and lays out the media prerequisite chain via list_media or create_media_upload_url. It stops short of stating when to use update_draft versus creating a new draft, so it is clear context rather than a full when/when-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_media_upload_urlCreate media upload urlAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | Optional original filename, shown in the media library. | |
| content_type | Yes | MIME type of the file to upload (e.g. image/png, image/jpeg, image/gif, video/mp4, application/pdf). |
Output Schema
| Name | Required | Description |
|---|---|---|
| headers | Yes | |
| media_id | Yes | |
| expires_in | Yes | |
| public_url | Yes | |
| upload_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description adds genuine beyond-annotation context: the URL is one-time, the PUT must happen 'in this same runtime', and returned headers must be sent exactly. This is valuable operational disclosure, though it doesn't discuss auth/permissions or failure modes for the upload PUT itself.
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?
Well front-loaded (core purpose stated first) and structured with a numbered three-step flow plus a fallback clause. Each sentence carries operational value, though the description is on the longer side for a two-parameter tool and the final fallback sentence could be tightened.
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 multi-step tool with an output schema already defining return fields, the description supplies everything else an agent needs: the ordered flow, the same-runtime constraint, exact-header requirement, and a graceful degradation path. Nothing critical for correct invocation is missing.
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 100%, so both parameters are already documented, including examples of content_type MIME values. The description clarifies why content_type is passed (the file's MIME type) and how the returned media_id is consumed, but adds no syntax or constraints beyond the schema, so baseline 3 applies.
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+resource ('Get a one-time presigned S3 URL to upload an image, video, GIF, or PDF') and ties it to a concrete downstream use. It effectively distinguishes itself from siblings like attach_media_from_url and upload_media by clarifying that the agent holds the bytes locally and receives a URL rather than uploading directly.
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 explicit when-to-use ('Use when the agent holds the bytes locally') and an explicit when-not/alternative ('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'). The alternative path is named concretely, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_draftDelete draftBDestructiveIdempotentInspect
Permanently delete a LinkedIn post draft.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the draft to permanently delete (from list_drafts). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=false, so the safety profile is covered. The description's 'permanently' adds only mild reinforcement of destruction and says nothing extra about permissions, whether the draft is recoverable, or error behavior on a bad/unowned id.
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?
One front-loaded sentence that carries the verb, resource, and permanence qualifier with zero filler. Nothing to trim.
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 single-parameter, fully-documented, annotated mutation with no output schema, the description is nearly sufficient. A short note on irreversibility/undo would close the remaining gap, but the annotations and schema carry most of the burden.
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 100% and the single id parameter is already documented, including its provenance from list_drafts. The description adds no format, ownership, or side-effect detail beyond what the schema states, so baseline 3 applies.
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 (delete) and resource (LinkedIn post draft), with the qualifier 'permanently' that signals irreversibility. It distinguishes itself reasonably from get_draft/create_draft/update_draft, though it never names the closest alternative siblings (unschedule, cancel_comment_draft) to sharpen the boundary.
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?
No when-to-use guidance and no alternatives named. An agent cannot tell from the description whether to use this versus unschedule, cancel_comment_draft, or publish_draft-style workflows; usage must be inferred from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_comments_to_replyFind comments to reply toARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A single LinkedIn post url to read the comments of. Exactly one of post_ids or url must be provided, and url requires the Enterprise plan. | |
| limit | No | Max comments to return. Defaults to 25, capped at 100. | |
| cursor | No | Pagination token from a previous response; paginates url mode only. | |
| post_ids | No | Comma-separated post ids or urns (from find_posts_to_comment or list_posts), 1 to 10 of them. Answers in one page, so no cursor comes back. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-open-world, so safety is covered. The description adds real value beyond that: the filtering rules, the fact that each post costs one upstream call, and the returned identifiers (comment_urn, post_urn). It stops short of detailing pagination or error behavior, so not a 5.
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 front-loaded sentences with zero waste: what it returns, why comments are filtered, and the call-cost constraint plus the alternative input source. Each sentence earns its place.
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 exists, so return values need not be explained, and annotations carry the safety profile. The description covers the remaining agent-relevant concerns: filtering semantics, batching guidance, and the upstream tool to source post_urns. Nothing needed to call it correctly is missing.
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 100%, so all four parameters are already documented, including the url/Enterprise constraint and the 1-10 post_ids limit. The description reinforces the post_urns semantics and batching but adds no syntax or format detail beyond the schema; baseline 3 is appropriate.
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 (find comments on LinkedIn posts) plus a precise scope: only comments still worth a reply. The filtering criteria (already answered, wrote themselves, or hid) sharply distinguish this from siblings like find_posts_to_comment and list_comment_feeds.
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?
Explicitly routes the agent: use post_urns from find_posts_to_comment, and ask for a handful of posts at a time rather than a whole page. It names the source of inputs and the operational constraint that drives batching, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_posts_to_commentFind posts to comment onARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| feed | No | Names a curated feed to read, and is only valid with source=curated_feed. Get the names from list_comment_feeds; a name that does not exist fails with the valid feed names listed in the error details. | |
| limit | No | Max posts to return. Defaults to 25, capped at 100. | |
| cursor | No | Pagination token from a previous response; omit for the first page. | |
| source | No | Where to look: my_posts for the user's own posts, curated_feed for a hand-picked list of profiles, for_you for a selection personalized to the user. Defaults to my_posts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description adds real value beyond that by disclosing that every returned post carries a post_urn that downstream draft calls target, which is the key behavioral contract for chaining. It does not mention result volume or freshness, but that is minor given annotation coverage.
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 tight sentences, front-loaded with the purpose and sources, then the post_urn contract, then the sibling routing rule. Every sentence earns its place with no 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?
Output schema exists, so return shape need not be explained, and the description covers the source selection, the urn handoff, and the alternative tool. Nothing an agent needs to call this correctly or chain it is missing.
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 100%, so feed, source, limit and cursor are already fully documented in the schema (including the enum and the pointer to list_comment_feeds). The description only restates the three source values already listed in the schema and adds no new syntax or constraint detail, so baseline 3 applies.
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 (find) and resource (LinkedIn posts to comment on) plus the three sources it draws from, and implicitly separates itself from list_posts and search_inspiration. An agent can distinguish it from find_comments_to_reply without opening either schema.
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?
Explicit workflow guidance: 'pick a post here first and draft the comment against that urn,' and an explicit alternative with its trigger condition — pass post_urn to find_comments_to_reply to reply to the discussion instead. When-to-use and when-to-use-something-else are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_overviewAnalytics overviewARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD, UTC). Defaults to today; range capped at 90 days. | |
| from | No | Start date (YYYY-MM-DD, UTC). Defaults to today; range capped at 90 days. | |
| metrics | No | Comma-separated metrics subset: followers, connections, profile_views, impressions, likes, comments, shares. Omit for all. | |
| granularity | No | Time-bucket size; only "day" is supported (default). |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| from | Yes | |
| series | Yes | |
| granularity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds that it defaults to today's overview with no date range, but that default is already documented in the from/to schema descriptions, so the marginal behavioral value is modest.
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 the core purpose and default behavior. The second sentence is a bit long but earns its place by broadening the use case beyond reporting; nothing is redundant fluff.
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, and the schema fully documents the four optional parameters. The description covers scope, defaults, and the dual reporting/pre-drafting use case, leaving only pagination or rate-limit details unstated, which are minor here.
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 100%; every parameter (to, from, metrics, granularity) is documented, including the 90-day cap and the day-only enum. The description adds no further parameter meaning, so the baseline 3 applies.
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 (get the user's LinkedIn analytics overview) and enumerates the metric families returned (followers, impressions, engagement). Account-level scope is clear enough to separate it from the per-post sibling get_post_analytics without opening either schema.
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 explicit conditions for use: reporting on performance, and consulting it before drafting to see what is driving followers and engagement. It does not name a concrete alternative tool or state exclusions, so it falls short of a 5, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_comment_draftGet comment draftARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the comment draft to fetch (from list_comment_drafts or create_comment_draft). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | |
| content | Yes | |
| post_urn | Yes | |
| comment_id | No | |
| created_at | Yes | |
| updated_at | Yes | |
| comment_urn | No | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish that this is a safe, idempotent read; the description adds the full state machine (draft/pending/posted/failed/cancelled) with the operational meaning of each, plus what failure_reason and failure_code represent. This is behavior beyond the annotations and beyond a bare fetch description.
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?
Front-loaded with the action and resource, and every clause carries information. The middle status-enumeration sentence is long but each state's implication earns its place; minor tightening possible but no dead weight.
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?
With an output schema present and annotations covering safety, the description supplies the remaining interpretive context an agent needs: the state lifecycle and what to check before reporting success. Nothing essential for correct invocation or interpretation is missing.
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 100% and the single id parameter is already fully documented in the schema, including its provenance (from list_comment_drafts or create_comment_draft). The description adds no additional parameter meaning, so the baseline 3 applies.
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: 'Fetch a single LinkedIn comment draft by id.' An agent can immediately separate this from siblings like get_draft, list_comment_drafts, or update_comment_draft without opening any schema.
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 a clear workflow trigger: use this to 'confirm what a commit actually did' and read it 'before telling the user a committed comment is live.' That is strong when-to-use guidance, though it never names the alternative (e.g., list_comment_drafts for enumeration) or states when-not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_connection_requestGet connection requestARead-onlyIdempotentInspect
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 skipped, with skipped_reason saying which of the two it was — nothing was sent to LinkedIn and it cost the account no capacity. Use it to follow up on a send_connection_request. A username this account never asked to connect with answers connection_not_found.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | The recipient's LinkedIn public username, the same one send_connection_request was called with. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| message | No | |
| username | Yes | |
| created_at | Yes | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No | |
| skipped_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, yet the description still adds substantial context: the full status vocabulary (pending/sent/failed/cancelled/skipped), what skipped_reason distinguishes, that nothing was sent to LinkedIn and no capacity was consumed, and the connection_not_found outcome.
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?
Front-loaded with the core read semantics, then statuses, then the follow-up guidance. Dense but every clause carries information; the skipped/account-capacity sentence is slightly long but earns its place.
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 no explanation, and the description covers the non-obvious states an agent would otherwise misread (skipped vs failed, connection_not_found). Nothing needed to call it correctly is missing.
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 100% and the schema already explains that username is 'the same one send_connection_request was called with'. The description only adds the not-found behavior, so it is a marginal increment over the structured field – baseline 3 applies.
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 ('Read back the latest connection request ... for a username') and implicitly scopes it to a single-request lookup, which separates it from list_connection_requests. The named lifecycle states make the resource identity unambiguous.
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?
Explicitly says 'Use it to follow up on a send_connection_request', giving the primary trigger. It stops short of naming list_connection_requests or cancel_connection_request as the alternatives an agent should prefer in other situations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draftGet draftARead-onlyIdempotentInspect
Fetch a single LinkedIn post draft by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the draft to fetch (from list_drafts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| media | No | |
| status | Yes | |
| content | Yes | |
| created_at | Yes | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is known. The description adds only the scope word "single" — it says nothing about not-found behavior, visibility/permission constraints, or whether draft content includes unpublished media references. Adequate but thin for a tool whose annotations do most of the disclosure.
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?
One front-loaded sentence with zero waste; nothing is buried. It is arguably too terse to earn a 5, since brevity here comes at the cost of any usage or error guidance.
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?
The tool is a one-parameter read with an output schema and full annotation coverage, so the description does not need to explain return values or safety. What remains missing is minor: not-found behavior and how the id is obtained (the schema covers the latter).
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 100% and the single parameter's schema entry even points at list_drafts as the source of the id. The description only restates "by id" and adds no format, validity, or sourcing semantics beyond the schema, so baseline 3 applies.
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 ("Fetch") and resource ("LinkedIn post draft") with the singular scope ("a single ... by id"), which distinguishes it from list_drafts and create_draft without ambiguity. It does not explicitly contrast with get_post or get_comment_draft, so no credit for named sibling differentiation.
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?
Usage is only implied: an agent infers it should call this when it already has a draft id and needs the full record rather than a listing. There is no explicit statement of when to prefer it over list_drafts, nor any note about what happens for an invalid or deleted id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meMy profileARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| today | Yes | |
| username | Yes | |
| ai_settings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the ai_settings shape and the caveat that a user may have several aliases, so both handle and name should be checked. It does not discuss caching or failure behavior, keeping it out of 5 territory.
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 call-order instruction is front-loaded and the rest is a dense enumeration of returned fields with little waste. The single long sentence with an embedded em-dash aside is slightly hard to parse but never padded.
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 spelled out; the description nonetheless summarizes the key payload groups an agent must act on. Combined with annotations covering the safety profile, an agent has everything needed to call it correctly.
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, which sets the baseline at 4. There is nothing for the description to disambiguate, and it correctly spends no space on parameter guidance.
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 ('returns the user's identity and content preferences') and enumerates the actual payload: display name, @handle, ai_settings fields, and today's LinkedIn stats. No sibling tool overlaps this retrieval, so the purpose is unambiguous.
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?
'Read this first to orient' gives an explicit call-order instruction, and the description explains the downstream purpose (tailor output, recognize the user's own posts). For a no-argument orientation tool with no competing sibling, this fully covers when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postGet postARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the post to fetch (from list_posts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| media | No | Media attached to this post, for posts published through Taplio and directly on LinkedIn. `url` is a durable copy hosted by Taplio. Can be empty while `media_type` reports an image, video or document, when Taplio does not hold a copy of that media yet or can no longer recover it. Text and article posts return an empty array. |
| status | Yes | |
| content | Yes | |
| metrics | No | |
| sent_at | No | |
| created_at | Yes | |
| media_type | No | Format of the post. Absent when the format cannot be determined. |
| scheduled_for | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so the description doesn't need to restate safety. It adds genuinely new behavioral facts: LinkedIn urn ids only resolve within the last 90 days, and a post's status is limited to scheduled/sending/sent.
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 the core action, and each clause carries information (id formats, time limit, status set, sibling exclusion). The trailing status enumeration is slightly tangential to fetching but aids interpretation.
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?
With an output schema present and full parameter documentation, the description only needed to cover input formats, the recency constraint, and the boundary against drafts — all of which it does.
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 100%, so the baseline is 3, but the description goes further by defining that `id` accepts either a Taplio post id or a LinkedIn urn and constrains the urn case to a 90-day window — semantics the schema does not convey.
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 (fetch a single LinkedIn post by id) and immediately distinguishes the two id flavors it accepts. It also separates itself from the nearest lookalike, get_draft, in the same breath.
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?
Explicitly routes draft fetching to get_draft and tells the agent where the id comes from (list_posts). It doesn't say when to prefer get_post over list_posts when listing would suffice, but the primary alternative is named and excluded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_analyticsPer-post analyticsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD, UTC). Defaults to today; range capped at 90 days. | |
| from | No | Start date (YYYY-MM-DD, UTC). Defaults to 7 days ago; range capped at 90 days. | |
| limit | No | Max posts to return. Defaults to 25, capped at 100. | |
| cursor | No | Pagination token from a previous response; omit for the first page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and closed-world, so safety is covered. The description adds genuinely useful behavioral detail the annotations lack — the 7-day default window and the semantics of media_type being absent when the format cannot be determined.
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 the resource and returned fields; the second sentence adds the creative-reuse purpose without padding. Slightly loose in the trailing clause but no wasted sentences.
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 shape need not be explained. For a read-only analytics tool the description covers scope, metrics, default window, and purpose adequately; only the sibling-overview distinction is missing.
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 100%, so defaults, 90-day cap, and pagination are already documented in the schema. The description only restates the 7-day default and adds no date-format or cursor semantics beyond what the schema gives, so baseline 3 applies.
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?
Names a specific verb (list) and resource (per-post LinkedIn analytics) and enumerates the returned metrics plus media_type, so the scope is unambiguous. It does not explicitly contrast itself with the sibling get_analytics_overview, though 'per-post' vs an overview is reasonably inferable.
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?
Provides clear context for use: default 7-day window when no range is given, and a concrete job to be done ('find top-performing posts and reuse the topics, formats, and hooks'). It never states when not to use it or points at get_analytics_overview as the account-level alternative, so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_likeGet likeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_urn | Yes | The canonical urn of the post or comment, as like_post returned it — an activity or comment urn. A post url does not work here: it is refused with validation_failed, so pass back the urn like_post returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| status | Yes | |
| post_urn | Yes | |
| created_at | Yes | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly and idempotent behavior, but the description adds substantial context beyond them: exact status semantics (pending while queued, liked once sent, failed/cancelled with reason) and the like_not_found response for untracked likes. This is precisely the behavioral detail an agent needs to interpret results.
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, front-loaded with the core read operation, then the follow-up guidance and the key exclusion. Every sentence adds useful information with no repetition or 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 values need not be re-explained. Combined with the status semantics, error case, and clear pointer back to like_post, the description is complete for an agent to invoke and interpret this tool correctly.
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 100%, so the single post_urn parameter is already fully documented in the schema, including the warning that a post URL will be refused. The description does not add parameter syntax or format details beyond what the schema provides, so the baseline of 3 is appropriate.
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 back the latest like this account queued for a post or a comment' — and immediately enumerates the possible statuses (pending, liked, failed, cancelled). It is easy to distinguish from like_post because it explicitly frames itself as a follow-up read.
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 an explicit when-to-use: 'Use it to follow up on a like_post.' It also defines an important when-not / edge case: likes created via the Taplio app's own like button are not tracked and return like_not_found. That removes ambiguity about what this tool covers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
like_postLike a post or commentAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_urn | Yes | The post's urn or url, or a comment urn — e.g. 'urn:li:activity:7361375991576829952'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| status | Yes | |
| post_urn | Yes | |
| created_at | Yes | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover idempotency, non-destructiveness, and open-world scope, but the description adds substantial context beyond them: the like is queued rather than sent, scheduled_for reports dispatch time, Growth plan is required with insufficient_plan as the failure signal, retries return the existing pending like, and post vs comment vs activity/ugcPost ids are distinct like targets. This is exactly the behavioral disclosure the structured fields cannot carry.
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?
Dense but front-loaded: purpose first, then input forms, then queueing/plan semantics, then cancel. The second sentence is a long comma-chained list that could be split, but nearly every clause conveys operational information rather than 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?
With one parameter at 100% coverage and an output schema present, the description covers the remaining gaps an agent needs: deferred/queued execution, retry idempotency, plan gating, and the distinctness of post vs comment likes. Nothing material to a correct invocation is left unstated.
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 100%, so the baseline is 3, but the description goes well beyond the schema by enumerating the accepted urn/url forms (activity urn, ugcPost urn, comment urn, post url, lnkd.in short link) and stating which sibling tool results supply each. That meaningfully reduces the risk of passing the wrong identifier.
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 (like) and resource (a LinkedIn post or a comment on one), immediately distinguishing the two object types it operates on. It also names the sibling cancel_like as the inverse operation, so an agent can tell what this tool does versus what undoes it without opening any schema.
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 strong sourcing context: post_urn can come from find_posts_to_comment, list_posts, find_comments_to_reply, or raw user input, and it points to cancel_like for stopping a pending like. It stops short of an explicit when-not-to-use statement (e.g., preferring get_post_like for reads), which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_comment_draftsList comment draftsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max comment drafts to return. Defaults to 25, capped at 100. | |
| cursor | No | Pagination token from a previous response; omit for the first page. | |
| status | No | Filter by status: draft (written, not committed), pending (committed and queued to post), posted (live on LinkedIn), failed (posting was attempted and did not go through), cancelled (blocked before posting). Omit for all five. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, closed-world safety profile. The description adds non-obvious context: that a draft keeps one record for its whole life, making this both the queue and the history, and which statuses are mutable vs. final. That lifecycle model is genuine value beyond the annotations and schema.
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?
Front-loaded with the verb and resource, then the lifecycle model, then usage. Three tight sentences with little waste, though the middle lifecycle sentence runs long and partly overlaps the schema's status descriptions.
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?
With an output schema handling return values and full schema coverage of the three params, the description only needs to add the conceptual model and usage — which it does. An agent has everything required to invoke and interpret results correctly.
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 100%, and the status enum with its five meanings is already fully documented in the schema, so the description largely restates it. The only parameter-adjacent addition is the "newest first" ordering, so the baseline of 3 is appropriate.
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 ("List the user's LinkedIn comment drafts") plus the ordering ("newest first"). The "comment drafts" resource is naturally distinguishable from the general list_drafts sibling, though no sibling is named 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?
"Use it to find a draft to edit or commit, or to review what earlier commits did" gives clear when-to-use contexts. It stops short of naming the alternative tools (get_comment_draft, list_drafts) or stating when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_comment_feedsList comment feedsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and closed-world, covering the safety and idempotency profile. The description adds useful shape information (each feed bundles a hand-picked profile set and a count) but says nothing about pagination, ordering, or auth, so it adds moderate rather than rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the core purpose is front-loaded ahead of the cross-tool linkage detail. Every clause earns its place.
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 documentation is not required, and the description correctly focuses on the one thing the schema can't convey — that the returned name flows directly into find_posts_to_comment. Coverage is essentially complete for a no-arg, read-only list tool, with only a minor gap around ordering/pagination.
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 are zero input parameters, which is the baseline-4 case. The description sensibly spends no words on parameter syntax and instead explains the relationship between this tool's output and another tool's input.
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 (List) plus resource (curated comment feeds available for engagement) and clarifies what each feed actually is — a hand-picked set of profiles with a tracked-profile count. It also names the sibling tool it feeds into, so the agent can distinguish it from generic listing tools like list_posts.
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 closing sentence establishes the workflow linkage explicitly: the returned name is exactly what find_posts_to_comment's feed parameter takes, which tells the agent when this tool is the right first step. It stops short of stating exclusions or prerequisite conditions, so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connection_requestsList connection requestsARead-onlyIdempotentInspect
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, sent or skipped 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max connection requests to return, newest first. Defaults to 25, capped at 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and closed-world behavior, but the description adds meaningful lifecycle states, reason reporting for failed or cancelled requests, cross-Taplio scope, ordering, and the 100-item cap. The only small ambiguity is that 'skipped' appears in the duplicate-avoidance sentence without being included in the earlier status list.
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 and every sentence serves a purpose: lifecycle states, duplicate avoidance, cross-Taplio scope, and the alternative tool. It is slightly verbose but not padded.
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?
With an output schema present, the description does not need to explain return fields. It provides enough context about ordering, statuses, scope, cap, and when to use the sibling tool to call this correctly.
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 100%, and the limit parameter is already fully described in the input schema. The description restates the newest-first ordering and 100-item cap but does not add parameter semantics beyond what the schema provides.
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 gives a specific verb and resource: list connection requests for the account, newest first, with status context. It also distinguishes the tool from get_connection_request by scoping this one to recent bulk listing versus checking one specific person.
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 explicitly says to read this before sending a batch of connection requests so already pending, sent, or skipped people are not re-requested. It also names get_connection_request as the correct alternative for checking one specific person regardless of age.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draftsList draftsARead-onlyIdempotentInspect
List the user's unpublished LinkedIn post drafts. Use it to review the content pipeline or find a draft to edit, schedule, or publish.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max drafts to return. Defaults to 25, capped at 100. | |
| cursor | No | Pagination token from a previous response; omit for the first page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish a read-only, idempotent, closed-world operation. The description adds useful result-scope context—only the user's unpublished drafts—but does not disclose further behavioral traits such as ordering or empty-result behavior.
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 short sentences front-load the exact operation and scope, then provide practical usage contexts. There is no redundant or unnecessary wording.
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 simple two-parameter paginated read with an output schema and safety annotations, the description supplies the essential scope and selection context needed for correct invocation. Explicit sibling routing would be a refinement rather than a material omission.
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?
Both parameters are fully documented in the schema, including limit's default and cap and cursor's pagination usage. The description adds no parameter meaning beyond that coverage, so the high-coverage baseline of 3 applies.
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 specifies the verb, resource, and scope: listing the user's unpublished LinkedIn post drafts. That scope distinguishes it from siblings such as list_posts, list_comment_drafts, and get_draft without requiring schema inspection.
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 concrete selection contexts: reviewing the content pipeline or finding a draft to edit, schedule, or publish. It does not explicitly route agents to get_draft for a known draft or to sibling list tools for other resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mediaList mediaARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return (default 25). | |
| query | No | Filter to media whose filename contains this substring (case-insensitive). Omit to list all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the sort order (most recent first), the fields returned, and the optional filtering behavior.
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, zero padding. What the tool returns and its ordering come first, then the actionable usage guidance. Every clause earns its place.
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 read-only, zero-required-param list tool with full schema coverage, an output schema, and annotations covering safety, nothing is missing. The description supplies the ordering and workflow routing that structured fields cannot.
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 100%, so the baseline is 3. The description restates the query semantics ('filter by a filename substring') and omits limit entirely, adding no syntax or behavior beyond what the schema already documents.
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?
Specific verb (List) plus resource (media you've already uploaded to Taplio), and it enumerates the returned shape (id, type, public url, filename) and ordering (most recent first). It implicitly separates itself from upload_media/create_media_upload_url by stressing 'already uploaded', though it never explicitly distinguishes itself from pick_media.
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?
Clear workflow context: 'Use it before drafting so you can attach existing media via create_draft or update_draft media_ids — no re-upload needed.' That routes the agent to this tool instead of re-uploading. No explicit when-not or named alternative tool, but the intent is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsList postsARead-onlyIdempotentInspect
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. With status scheduled and from or to set, the window applies to the scheduled date and posts come back soonest first. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only posts on or before this date (YYYY-MM-DD or ISO 8601 datetime, UTC). With status scheduled the date is when the post is scheduled to go out; otherwise it is when a Taplio post was created, or when a post published directly on LinkedIn went live. | |
| from | No | Only posts on or after this date (YYYY-MM-DD or ISO 8601 datetime, UTC). With status scheduled the date is when the post is scheduled to go out; otherwise it is when a Taplio post was created, or when a post published directly on LinkedIn went live. | |
| limit | No | Max posts to return. Defaults to 25, capped at 100. | |
| cursor | No | Pagination token from a previous response; omit for the first page. | |
| status | No | Filter by status: scheduled (queued), sending (publishing now), or sent (live, including posts published directly on LinkedIn). scheduled and sending only ever match posts created in Taplio. Omit for all three. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: ordering rules, date-window semantics under status=scheduled, LinkedIn-native 90-day coverage with daily-sync lag, and a clear warning not to retry for empty media. These details materially affect how an agent interprets results.
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?
Front-loads the core listing behavior and scope, and most sentences carry operational value. It is somewhat long and spends multiple sentences on output caveats, but the structure remains purposeful rather than padded.
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?
Complete for a complex listing tool: annotations cover safety and idempotence, the output schema covers returns, and the description fills key operational gaps around ordering, sync lag, draft exclusion, and media interpretation.
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 100%, so the schema already documents all parameters. The description still adds value by explaining the interaction between status=scheduled and from/to, including that the date window shifts to scheduled date and results come back soonest first.
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 scope: the user's LinkedIn posts, newest first, including Taplio-created and LinkedIn-native posts. It also distinguishes posts from drafts and from engagement analytics, so an agent can identify the tool without opening the schema.
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?
Explicitly routes metrics requests to get_post_analytics and gives a proactive use case before drafting. It implies drafts are handled by list_drafts but does not name get_post or list_drafts as alternatives, leaving some sibling routing implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pick_mediaPick existing mediaAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | Draft id, exactly as returned by create_draft or list_drafts — a full 36-character uuid. Never abbreviate it or reconstruct it from memory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior the annotations cannot express: the panel is interactive and requires the user to click a tile, and the click attaches the selection to the given draft (consistent with readOnlyHint=false, destructiveHint=false). It also preempts a likely misconception by stating 'Nothing is uploaded.' It stops short of describing failure modes, whether the draft is modified immediately, or what happens if the user cancels the panel.
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 the action and mechanism, then the use/avoid clause. Every clause earns its place; no restatement of the name or 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?
For a single-parameter, no-output-schema tool, the description covers the action, the interaction model, the side effect (attach to draft), and the sibling boundary. The only gap is what an agent observes after the user picks or dismisses the panel, which is minor.
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?
Only one parameter, and the schema description coverage is 100% with a detailed draft_id entry (full UUID, never abbreviate). The description's 'the given draft' adds no syntax beyond the schema, so baseline 3 is appropriate.
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 concrete action (open an interactive thumbnail-grid panel of library media) and the resource (images, videos, GIFs, PDFs already in the library). It also distinguishes itself from attach_media_from_url and upload_media by contrast, so an agent can route correctly without opening sibling schemas.
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?
Explicit when-to-use ('reuse an asset they added earlier') and explicit when-not ('NOT for a file sitting on their machine'), naming the correct alternative tool (upload_media). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_draftPublish nowADestructiveInspect
Publish a LinkedIn post draft to LinkedIn immediately. This goes live now and cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the draft to publish immediately (from list_drafts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| media | No | Media attached to this post, for posts published through Taplio and directly on LinkedIn. `url` is a durable copy hosted by Taplio. Can be empty while `media_type` reports an image, video or document, when Taplio does not hold a copy of that media yet or can no longer recover it. Text and article posts return an empty array. |
| status | Yes | |
| content | Yes | |
| metrics | No | |
| sent_at | No | |
| created_at | Yes | |
| media_type | No | Format of the post. Absent when the format cannot be determined. |
| scheduled_for | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is known. The description adds real context beyond that: the post goes live publicly right now and the action cannot be undone, which is the key consequence an agent must weigh before calling.
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 short sentences, purpose first, irreversible consequence second. No filler and nothing buried.
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 and the single parameter is fully documented, so the description only needed to convey purpose and risk, which it does. Naming the scheduled alternative would have made it complete for a mutation tool with several sibling paths.
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?
Only one parameter, and the schema documents it fully (100% coverage) including its provenance from list_drafts. The description adds nothing about the id, so baseline 3 applies.
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 LinkedIn post draft to LinkedIn immediately'), so the agent knows exactly what operation occurs. It implicitly separates itself from schedule_draft via 'immediately', but never names that sibling, so it falls short of a 5.
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 word 'immediately' implies this is the non-scheduled path, and the irreversibility warning implies caution, but no alternative is named and no when-to-use/when-not-to-use rule is stated. The agent must infer the schedule_draft distinction on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_draftSchedule draftAIdempotentInspect
Schedule a LinkedIn post draft to be published automatically at a future time.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the draft to schedule (from list_drafts). | |
| scheduled_for | Yes | When to auto-publish, as an ISO 8601 datetime (e.g. 2026-06-10T14:30:00Z). Must be at least 2 minutes in the future. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| media | No | Media attached to this post, for posts published through Taplio and directly on LinkedIn. `url` is a durable copy hosted by Taplio. Can be empty while `media_type` reports an image, video or document, when Taplio does not hold a copy of that media yet or can no longer recover it. Text and article posts return an empty array. |
| status | Yes | |
| content | Yes | |
| metrics | No | |
| sent_at | No | |
| created_at | Yes | |
| media_type | No | Format of the post. Absent when the format cannot be determined. |
| scheduled_for | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=true, and openWorld=true, so the safety profile is covered. The description adds the meaningful behavioral fact that publishing happens automatically at a future time, but says nothing about what happens if a schedule already exists, failure behavior, or whether this replaces prior scheduling.
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?
A single sentence, front-loaded with the action and resource, with no filler. Every clause (LinkedIn, draft, auto-publish, future time) carries information.
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 two-param scheduling tool with full schema descriptions, an output schema, and annotations covering safety and idempotency, the description covers the essential behavior. Minor gap: no mention of interaction with existing schedules or of the unschedule/cancel counterpart.
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 100% and the schema itself is strong — id sourced from list_drafts, ISO 8601 format, and the 2-minute-future constraint. The description adds no parameter detail beyond the schema, so the baseline 3 applies.
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 (schedule) and resource (LinkedIn post draft) plus the effect (auto-publish at a future time). This implicitly distinguishes it from publish_draft (immediate) and unschedule, but the description never names those siblings 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?
Implied usage is clear from the verb — use this when you want deferred publishing rather than immediate publish_draft. But there is no explicit when/when-not guidance and no named alternative, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_inspirationSearch inspirationARead-onlyIdempotentInspect
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. Each successful call, including each further page, counts toward a daily search allowance that resets at 00:00 UTC: 50 on Starter and the free trial, 150 on Growth, 300 on Pro.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only posts on or before this date (YYYY-MM-DD or ISO 8601, UTC). Ignored if min/max_days_old is set. | |
| from | No | Only posts on or after this date (YYYY-MM-DD or ISO 8601, UTC). Ignored if min/max_days_old is set. | |
| lang | No | Filter by ISO 639-1 language code (e.g. "en", "fr"). | |
| limit | No | Max posts to return. Minimum 1; defaults to 30. | |
| query | No | Free-text search over post content. Omit to browse top posts. | |
| author | No | Only posts written by this creator: their linkedin.com/in/ profile url or the handle after /in/. A name in query finds posts that mention them, not posts they wrote. With it, min_likes and min_char_count default to 0 and max_followers to no cap. | |
| cursor | No | Pagination token from a previous response; omit for the first page. | |
| min_likes | No | Only posts with at least this many likes. 0-1000; defaults to 50. | |
| max_days_old | No | Only posts from the last N days (0-365). When set, from/to are ignored. | |
| min_comments | No | Only posts with at least this many comments. 0-1000; defaults to 0. | |
| min_days_old | No | Only posts at least N days old (0-365); defaults to 1. When set, from/to are ignored. | |
| max_followers | No | Only posts whose author has at most this many followers. Defaults to 100000. | |
| min_char_count | No | Only posts with at least this many characters. 0-10000; defaults to 500. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing a hard cost model: each successful call and each further page consumes a daily search allowance that resets at 00:00 UTC, with tier-specific quotas (50/150/300). For an agent that may page results or retry, this is exactly the kind of budget information the readOnly/idempotent hints cannot convey.
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?
Purpose and the drafting use case are front-loaded, then the author shortcut, then the quota constraint last. The quota sentence is long but each clause (per-page counting, reset time, tier numbers) carries distinct information, so nothing is padding.
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?
With 13 optional parameters, full schema coverage, and an output schema to describe returns, the remaining gaps an agent would care about are cost and filtering semantics — both covered. No contradiction with openWorldHint=false or idempotentHint=true is implied by the cursor-based paging.
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 100% and the schema descriptions already explain the query, author, date, and default behaviors in more detail than the description does. The description's one parameter statement ("Set author to read the posts one creator wrote") largely repeats the schema, so it adds value only by highlighting the most decision-relevant parameter; baseline 3 applies.
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 ("Search LinkedIn posts from other creators") plus the intent ("use as inspiration"), which is far more than a restatement of the name. It doesn't explicitly contrast itself with lookalike siblings such as find_posts_to_comment or find_comments_to_reply, so an agent must infer the boundary from the word "inspiration".
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?
"Use it before drafting to ground new posts in proven formats and angles" gives a concrete usage context rather than leaving timing implicit, and the author sentence tells the agent when to use that filter versus free-text query. No competing sibling is named and no when-not-to-use condition is given, which keeps it out of 5 territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_connection_requestSend connection requestAIdempotentInspect
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. If it turns out they are already connected, or already hold an invitation from this account, nothing is sent and a later get_connection_request comes back as skipped with the reason. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | The recipient's LinkedIn public username, e.g. 'jane-doe' from linkedin.com/in/jane-doe. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| message | No | |
| username | Yes | |
| created_at | Yes | |
| failure_code | No | |
| scheduled_for | No | |
| failure_reason | No | |
| skipped_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: the invitation is queued and paced rather than sent immediately, scheduled_for reports the due time, repeat calls are deduplicated, already-connected or already-invited targets silently skip, and no note is attached by design. This is consistent with idempotentHint=true, destructiveHint=false, and readOnlyHint=false, and it discloses the async queue semantics an agent could not otherwise infer.
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?
Purpose and identifier are front-loaded, and every sentence carries real information (queue pacing, dedup, skip behavior, no-note policy, plan gate). It is dense for five sentences, and the Enterprise plan requirement buried near the end would be more useful up front.
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 an asynchronous, plan-gated, deduplicating mutation, the description covers the prerequisites, the side effects, the skip cases, and how to observe the outcome; the output schema already documents return fields like scheduled_for. Nothing material is missing 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 100% and the single parameter is well documented in the schema with the same 'jane-doe' example. The description's parenthetical restates that guidance rather than adding new syntax or format rules, so the baseline 3 applies.
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 ('Ask to connect with someone on LinkedIn') and disambiguates the single parameter's meaning ('public username, the last part of their profile url'). The naming of cancel_connection_request and get_connection_request makes clear this is the initiation step, not the cancel or status step.
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 strong operational context: safe to retry (duplicates return the same pending request), plan prerequisite (Enterprise, else insufficient_plan), and the alternative to use for stopping it (cancel_connection_request). It does not state when NOT to use it (e.g., for people already connected handled implicitly), so it falls just short of fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unscheduleUnscheduleAIdempotentInspect
Unschedule a scheduled LinkedIn post, returning it to drafts so you can edit, reschedule, or delete it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the scheduled post to unschedule (from list_posts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| media | No | |
| status | Yes | |
| content | Yes | |
| created_at | Yes | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description still adds real behavioral value by disclosing the state transition to drafts and the non-destructive, recoverable nature of the outcome; it does not cover auth requirements or error cases such as unscheduling a post that isn't scheduled.
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?
One sentence with zero filler, front-loading the action and ending with the practical outcome. Every clause earns its place.
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?
The tool is simple (one required param, output schema present), and the description covers action, outcome, and follow-up options. Only edge-case behavior — what happens if the post is not currently scheduled, or idempotent repeat behavior — is left unstated.
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 100% and the single `id` parameter is already documented, including its origin ('from list_posts'). The description adds no further meaning about the identifier, so the baseline 3 for schema-covered parameters applies.
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 names a specific verb and resource ('Unschedule a scheduled LinkedIn post') and states the resulting state ('returning it to drafts'), which distinguishes it from schedule_draft, publish_draft, and delete_draft without opening any schema.
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 clear context for use: a post that is currently scheduled. The consequence sentence ('so you can edit, reschedule, or delete it') implicitly routes the agent away from delete_draft and toward this tool when the goal is reversible, but no sibling is named explicitly and no when-not-to-use condition is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_comment_draftUpdate comment draftAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the comment draft to update (from list_comment_drafts). | |
| content | Yes | The new comment text, replacing the draft's current text. 1 to 1250 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | |
| content | Yes | |
| post_urn | Yes | |
| comment_id | No | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, idempotent, non-destructive), and the description adds genuinely new behavioral context: the state gate that causes rejection after commit. It does not cover permissions or rate limits, but the added constraint is substantive.
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, zero filler: the action comes first and the editing constraint second. Every clause earns its place.
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. Purpose, the required parameters, and the key failure condition are all covered; only the recovery path after a rejected edit is left implicit.
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 100%, so both parameters (id and content, including length bounds and the list_comment_drafts origin) are already fully documented. The description's 'rewrite the text' only loosely maps to the content parameter and adds nothing over the schema, so the baseline 3 applies.
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: rewriting the text of a LinkedIn comment draft, which cleanly separates it from update_draft (generic drafts) and create_comment_draft. It stops short of naming the sibling tool an agent might confuse it with, so it is clear but not fully 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?
Gives a concrete precondition: only a draft still in status 'draft' can be edited, and edits are rejected once it is queued or posted. That is an explicit when-not condition, though it does not point to an alternative tool for the rejected case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draftUpdate draftAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of the draft to update (from list_drafts). | |
| content | No | The new full text body (replaces existing content). 1 to 3000 characters. | |
| media_ids | No | Optional ids of media to attach — from list_media (already uploaded) or from create_media_upload_url after you PUT the bytes. Referenced by id only. | |
| document_title | No | Optional title LinkedIn shows for a PDF attached via media_ids in this same call. Defaults to the PDF file name. Ignored if no PDF is attached in this call. Up to 100 characters; letters, digits, spaces and hyphens are kept. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| media | No | |
| status | Yes | |
| content | Yes | |
| created_at | Yes | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive behavior, so the bar is lower. The description still adds genuinely non-obvious semantics: content fully replaces the existing text, previously attached media is preserved automatically, and media_ids are additive only. It does not discuss permissions or rate limits, but for a draft-edit tool the important mutation semantics are disclosed.
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 sentences, front-loaded with the core action and scoped by the eligibility constraint at the end. Every sentence carries information, though the middle clause ('but media already attached is preserved automatically — you only pass media_ids to ADD media') is slightly tangled and could read more cleanly.
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?
With an output schema present, return values need no explanation, and the description covers the draft-only constraint, replacement semantics, and additive media behavior. For a four-parameter tool whose schema is fully documented, this is complete enough to call correctly; only document_title interactions are left to the 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?
Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning beyond the schema: it clarifies that media_ids are ADD-only and that existing media survives, and it names the source tools for obtaining ids. The only gap is document_title, whose behavior is left entirely to the schema.
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 ('Update the content of an existing LinkedIn post draft') and immediately names the secondary capability (attaching media). The closing sentence restricts scope to drafts versus published/scheduled posts, which cleanly separates it from siblings like publish_draft, schedule_draft, and update_comment_draft.
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 a clear when-to-use condition ('Only drafts can be edited — published or scheduled posts cannot') and explains that media_ids should come from list_media or create_media_upload_url, effectively routing the agent to prerequisite tools. It stops short of naming explicit alternatives for the non-draft case (e.g. pointing to publish_draft or unschedule), so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaUpload and attach mediaAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | Draft id, exactly as returned by create_draft or list_drafts — a full 36-character uuid. Never abbreviate it or reconstruct it from memory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, not idempotent, not destructive, closed-world), so the description need not repeat that. It adds genuinely new behavior: the tool opens an interactive panel requiring user interaction with a drop zone/chooser, which is critical to know before invoking. It does not cover failure modes or what happens if the upload is cancelled.
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, no filler. The interactive-panel mechanic and the file-type scope come first, and the routing rule to pick_media is placed last as a natural contrast. Every clause carries information.
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 single-parameter, no-output-schema tool, the description covers the interaction model, supported file types, and sibling routing. The remaining gap is that it says nothing about what happens after upload (return value, failure/cancel behavior), which matters since no output schema exists.
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?
Only one parameter, and the schema already documents it fully at 100% coverage, including the uuid format and the warning not to abbreviate or reconstruct it. The description adds only 'the given draft,' which is redundant. Baseline 3 applies when the schema does the heavy lifting.
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 ('uploaded to Taplio and attached to the given draft in one step'), names the accepted file types (image, video, PDF), and explicitly distinguishes itself from the sibling pick_media. An agent can tell this apart from attach_media_from_url and pick_media without opening any schema.
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 selection rule — 'Use whenever the file is not in the library yet' — and names the alternative ('to reuse an existing asset instead, call pick_media'). The when-to-use and when-not-to-use conditions are both 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.
6 tool updates
- Changed
attach_media_from_url1 field changed- added
Output schema / properties / updated_atAdded value: +{ + "$ref": "#/properties/created_at" +}
- Changed
create_draft1 field changed- added
Output schema / properties / updated_atAdded value: +{ + "$ref": "#/properties/created_at" +}
- Changed
get_draft1 field changed- added
Output schema / properties / updated_atAdded value: +{ + "$ref": "#/properties/created_at" +}
- Changed
list_drafts1 field changed- added
Output schema / properties / items / items / properties / updated_atAdded value: +{ + "$ref": "#/properties/items/items/properties/created_at" +}
- Changed
unschedule1 field changed- added
Output schema / properties / updated_atAdded value: +{ + "$ref": "#/properties/created_at" +}
- Changed
update_draft1 field changed- added
Output schema / properties / updated_atAdded value: +{ + "$ref": "#/properties/created_at" +}
5 tool updates
- Changed
cancel_connection_request2 fields changed- added
Output schema / properties / skipped_reasonAdded value: +{ + "type": "string" +} - changed
Output schema / properties / status / enumPrevious value: -[ - "pending", - "sent", - "failed", - "cancelled" -]New value: +[ + "pending", + "sent", + "skipped", + "failed", + "cancelled" +]
- Changed
get_connection_request2 fields changed- added
Output schema / properties / skipped_reasonAdded value: +{ + "type": "string" +} - changed
Output schema / properties / status / enumPrevious value: -[ - "pending", - "sent", - "failed", - "cancelled" -]New value: +[ + "pending", + "sent", + "skipped", + "failed", + "cancelled" +]
- Changed
get_post_like1 field changed- changed
Input schema / properties / post_urn / descriptionPrevious value: -"The canonical urn of the post or comment, as like_post returned it — an activity or comment urn. A post url does not work here: its slashes split the path and the call answers 404."New value: +"The canonical urn of the post or comment, as like_post returned it — an activity or comment urn. A post url does not work here: it is refused with validation_failed, so pass back the urn like_post returned."
- Changed
list_connection_requests2 fields changed- added
Output schema / properties / items / items / properties / skipped_reasonAdded value: +{ + "type": "string" +} - changed
Output schema / properties / items / items / properties / status / enumPrevious value: -[ - "pending", - "sent", - "failed", - "cancelled" -]New value: +[ + "pending", + "sent", + "skipped", + "failed", + "cancelled" +]
- Changed
send_connection_request2 fields changed- added
Output schema / properties / skipped_reasonAdded value: +{ + "type": "string" +} - changed
Output schema / properties / status / enumPrevious value: -[ - "pending", - "sent", - "failed", - "cancelled" -]New value: +[ + "pending", + "sent", + "skipped", + "failed", + "cancelled" +]
1 tool update
- Changed
list_posts2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Only posts on or after this date (YYYY-MM-DD or ISO 8601 datetime, UTC)."New value: +"Only posts on or after this date (YYYY-MM-DD or ISO 8601 datetime, UTC). With status scheduled the date is when the post is scheduled to go out; otherwise it is when a Taplio post was created, or when a post published directly on LinkedIn went live." - changed
Input schema / properties / to / descriptionPrevious value: -"Only posts on or before this date (YYYY-MM-DD or ISO 8601 datetime, UTC)."New value: +"Only posts on or before this date (YYYY-MM-DD or ISO 8601 datetime, UTC). With status scheduled the date is when the post is scheduled to go out; otherwise it is when a Taplio post was created, or when a post published directly on LinkedIn went live."
10 tool updates
- Changed
attach_media_from_url2 fields changed- added
Input schema / properties / document_titleAdded value: +{ + "description": "Optional title LinkedIn shows when the url is a PDF. Defaults to the PDF file name. Up to 100 characters; letters, digits, spaces and hyphens are kept.", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
create_draft2 fields changed- added
Input schema / properties / document_titleAdded value: +{ + "description": "Optional title LinkedIn shows for a PDF attached via media_ids in this same call. Defaults to the PDF file name. Ignored if no PDF is attached in this call. Up to 100 characters; letters, digits, spaces and hyphens are kept.", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
get_draft1 field changed- added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
get_post1 field changed- added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
list_drafts1 field changed- added
Output schema / properties / items / items / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
list_posts1 field changed- added
Output schema / properties / items / items / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
publish_draft1 field changed- added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
schedule_draft1 field changed- added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
unschedule1 field changed- added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
- Changed
update_draft2 fields changed- added
Input schema / properties / document_titleAdded value: +{ + "description": "Optional title LinkedIn shows for a PDF attached via media_ids in this same call. Defaults to the PDF file name. Ignored if no PDF is attached in this call. Up to 100 characters; letters, digits, spaces and hyphens are kept.", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - added
Output schema / properties / media / items / properties / titleAdded value: +{ + "description": "Document title shown on LinkedIn. Only set for documents.", + "type": "string" +}
35 tool updates
- First observed
attach_media_from_url - First observed
cancel_comment_draft - First observed
cancel_connection_request - First observed
cancel_like - First observed
commit_comment_draft - First observed
create_comment_draft - First observed
create_draft - First observed
create_media_upload_url - First observed
delete_draft - First observed
find_comments_to_reply - First observed
find_posts_to_comment - First observed
get_analytics_overview - First observed
get_comment_draft - First observed
get_connection_request - First observed
get_draft - First observed
get_me - First observed
get_post - First observed
get_post_analytics - First observed
get_post_like - First observed
like_post - First observed
list_comment_drafts - First observed
list_comment_feeds - First observed
list_connection_requests - First observed
list_drafts - First observed
list_media - First observed
list_posts - First observed
pick_media - First observed
publish_draft - First observed
schedule_draft - First observed
search_inspiration - First observed
send_connection_request - First observed
unschedule - First observed
update_comment_draft - First observed
update_draft - First observed
upload_media
Publisher details
- Operator
- Taplio · Publisher source
- Operator website
- https://taplio.com
- Vendor relationship
- First-party
- Documentation
- Unknown
- Trust center
- Unknown
- Restrictions
- Not available
Related MCP Connectors
Write LinkedIn posts in your voice: ideas, drafts, scheduling, analytics from your personal AI.
Draft, schedule and publish X (Twitter) and LinkedIn posts in your own voice.
Write, schedule, and publish social media posts on X, LinkedIn, Threads, and more via Typefully
Draft LinkedIn posts in your voice, then schedule or publish them through LinkedIn's official API.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceLinkedIn-native AI content creation, scheduling & analytics. Write and post on LinkedIn, create drafts, generate hooks & hashtags, schedule posts, and track engagement — all through natural language.25 npmMIT
- AlicenseNot gradedqualityCmaintenanceManage your entire LinkedIn presence - write posts, schedule publishing, track contacts, and access saved content.117 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage LinkedIn workflows through a comprehensive set of tools for content generation, profile optimization, lead management, message outreach, engagement, analytics, scheduling, and industry research.MIT
- AlicenseAqualityCmaintenanceEnables publishing and scheduling LinkedIn posts through the official API, with content calendar and post brief tools for consistent growth.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.