Skip to main content
Glama

Save draft

save_draft
Destructive

Saves LinkedIn post text (up to 3,000 characters) as a draft, or updates an existing unpublished post. Without id it creates a draft. With id it updates a draft or a scheduled post that has not been sent; the schedule time and destination stay as they are and nothing is sent to LinkedIn. content is required to create; an update takes content and/or media, and optionally destination, mentions, first_comment, or auto_react. first_comment and auto_react are stored on the post and applied when it is published by schedule_post or publish_now. mentions tags LinkedIn company pages named in the text; people cannot be tagged. The result includes preview_url, a link that opens the post in PostPen for the signed-in account owner; it is meant to be shown to the user whenever a draft is saved or a post is scheduled. destination selects the personal profile or a company page from list_destinations. media attaches images, a video, or a PDF. Each media item has exactly one source: { url } for a public HTTPS file, { upload_id } for a file sent through create_upload, or { data } for a small base64 file up to 4MB. PostPen checks each file and copies it into its own storage. An image item can carry alt_text, the alternative text LinkedIn gives the image for screen readers (up to 4,086 characters, about 120 recommended; images only). On an update, omitting media keeps existing attachments and their alt text, and media: [] removes them. media_alt_text changes the alt text of images already on the post, one entry per image in the order of media_urls; it cannot be sent together with media. schedule_post and publish_now use the stored alt text. media_urls and LinkedIn tokens are not accepted.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoDraft or scheduled post id to update in place. Omit to create a new draft.
mediaNoOptional attachments, one source per item: { url }, { upload_id }, or { data, content_type }. Images: jpeg, png, webp, gif, max 5MB, up to 9. Video: mp4, 75KB–200MB, one per post. Document: pdf, max 100MB, one per post (LinkedIn shows it as a swipeable carousel). Types cannot be mixed in one post.
contentNoThe post text, up to 3,000 characters (LinkedIn’s limit; longer text is refused). Required to create a draft; optional when id is set and only media or destination changes.
mentionsNoOptional LinkedIn company pages to tag, each as a page link such as https://www.linkedin.com/company/acme. The company’s name must appear in content exactly as LinkedIn spells it; that text becomes the clickable tag when the post is published, and if it is missing the error gives the exact spelling. [] removes the tags; leaving it out keeps what is saved. Only company pages can be tagged, not people, and tags are not applied to PDF posts.
auto_reactNoOptional. true makes PostPen like the post from the same account right after it is published; false turns that off.
destinationNoWhere to post: an id from list_destinations. Each destination has a network (linkedin today). "personal" (the default on a personal draft) is the personal LinkedIn profile; a company page is identified by its id from list_destinations (usually the organization URN). On schedule_post and publish_now, leaving it out keeps a company destination already saved on the draft, and "personal" switches to the profile.
first_commentNoOptional comment PostPen adds to the post right after it is published, for example a link. Up to 1,250 characters. null or "" removes a saved one; leaving it out keeps what is saved.
media_alt_textNoOptional alt text for the images already on the post, one entry per image in the order of media_urls from list_posts. A string (up to 4,086 characters; about 120 recommended) sets that image’s alt text, null or "" removes it, and images past the end of a shorter array keep theirs. Refused when the post has no images or the array is longer than its images.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / media / items / properties / alt_text
      Added value: +{
      +  "description": "Optional alternative text for this image, shown by LinkedIn to people using screen readers. Up to 4,086 characters; about 120 is recommended. Images only: refused on a video or PDF item.",
      +  "maxLength": 4086,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / media_alt_text
      Added value: +{
      +  "description": "Optional alt text for the images already on the post, one entry per image in the order of media_urls from list_posts. A string (up to 4,086 characters; about 120 recommended) sets that image’s alt text, null or \"\" removes it, and images past the end of a shorter array keep theirs. Refused when the post has no images or the array is longer than its images.",
      +  "items": {
      +    "maxLength": 4086,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "maxItems": 9,
      +  "type": "array"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / mentions
      Added value: +{
      +  "description": "Optional LinkedIn company pages to tag, each as a page link such as https://www.linkedin.com/company/acme. The company’s name must appear in content exactly as LinkedIn spells it; that text becomes the clickable tag when the post is published, and if it is missing the error gives the exact spelling. [] removes the tags; leaving it out keeps what is saved. Only company pages can be tagged, not people, and tags are not applied to PDF posts.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
  3. Changed2 schema fields changed
    • addedInput schema / properties / auto_react
      Added value: +{
      +  "description": "Optional. true makes PostPen like the post from the same account right after it is published; false turns that off.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / first_comment
      Added value: +{
      +  "description": "Optional comment PostPen adds to the post right after it is published, for example a link. Up to 1,250 characters. null or \"\" removes a saved one; leaving it out keeps what is saved.",
      +  "maxLength": 1250,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With destructiveHint=true already declared, the description goes well beyond the annotation: it discloses that on update 'omitting media keeps existing attachments and their alt text, and media: [] removes them,' that schedule time and destination are preserved, that media_alt_text cannot be combined with media, that people (only company pages) can be tagged, and that the result carries a preview_url meant to be shown to the user. These are exactly the destructive/stateful behaviors an agent needs and are not derivable from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the create/update distinction, and every sentence carries real semantics about a behavior or constraint. The cost is structure: it is delivered as one dense block rather than being broken into purpose/update/media/alt-text sections, which makes an 8-parameter tool harder to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers create vs update, media sourcing and removal semantics, mentions constraints, alt-text lifecycle, destination selection, and even names the result field (preview_url). Nothing an agent needs to invoke it correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds cross-parameter meaning the schema does not carry: 'content is required to create; an update takes content and/or media,' the create-vs-update requirement shape, the mutual exclusion of media and media_alt_text, and the image-only constraint on alt_text. It mostly restates per-field rules already in the schema, hence 4 rather than 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb and resource ('Saves LinkedIn post text ... as a draft, or updates an existing unpublished post') and immediately disambiguates the two modes: 'Without id it creates a draft. With id it updates a draft or a scheduled post that has not been sent.' It also implicitly separates itself from publishing siblings by stressing 'nothing is sent to LinkedIn,' so an agent can distinguish it from schedule_post/publish_now without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear selection context (omit id to create, supply id to update; content required to create, content and/or media on update) and points at the related tools create_upload (large files), list_destinations (destination ids) and list_posts (media_urls order). It doesn't state an explicit when-not versus schedule_post/publish_now beyond the note that first_comment and auto_react are applied at publish time by those tools, so the routing is strong but inferred rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources