Skip to main content
Glama

Save draft

save_draft
Destructive

Saves a post as a draft for LinkedIn, X, Facebook, Instagram, Threads and YouTube, or updates an existing unpublished post. Without id it creates a draft; without destinations or destination it goes to the personal LinkedIn profile. destinations sets every place it goes (ids from list_destinations, any mix, LinkedIn optional), and network_text gives a network its own version of the text, for example a shorter one for X. youtube sets a YouTube video’s title, privacy (public, unlisted or private), tags, category, made_for_kids, custom thumbnail and playlist, and youtube_format chooses a normal video or a Short; the YouTube text is the video description. With id it updates a draft or a scheduled post that has not been sent; the schedule time stays as it is and nothing is published. content is required to create; an update takes any of content, network_text, youtube, youtube_format, media, destinations, destination, mentions, first_comment, or auto_react. The result lists post.networks (each network with the text it publishes) and network_problems when a network cannot take the post yet (for example Instagram without an image); schedule_post and publish_now refuse the post until they are fixed. Network limits: LinkedIn 3,000 characters, up to 9 images, one video, or one PDF. X 280 characters, or 25,000 on an account with an X subscription (each destination’s max_chars says which; a link counts as 23, an emoji as 2), up to 4 images (a post with more sends X its first 4 and the rest to the other networks) or one video, and a GIF among X’s images must be alone. A longer X text goes out as a thread: up to 25 numbered posts ("1/3"), cut at paragraphs, sentences or words, each a reply to the one before, with the media on the first and the first comment under the last. Facebook (Pages only) 63,206 characters, up to 10 images or one video. Instagram needs an image or a video: up to 10 JPEG images or one video, 2,200 characters, at most 30 hashtags. Threads 500 characters with images or a video (up to 20 images or one video); a Threads post without media takes up to 10,000, and what does not fit in the first 500 goes out as a text attachment under the post, at most 5 links. YouTube takes exactly one video and nothing else: a title up to 100 characters (from the youtube settings, or the text’s first line), the text as its description up to 5,000 bytes, neither with < or >, and tags up to 500 characters. youtube_format chooses a normal video ("video", the default) or a Short ("short": vertical or square, up to 3 minutes; a landscape or longer clip is refused rather than posted as a normal video). Only LinkedIn takes PDFs. mentions and auto_react apply to LinkedIn only. Alt text goes with the images to every network (X, Facebook, Instagram and Threads take the first 1,000 characters). first_comment goes under the post on LinkedIn and X (a reply), and on Facebook, Instagram and Threads (a reply) once the account has been connected with permission to comment; not on YouTube. 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. Tags from the user’s tag list (list_tags) are written @[Name] in content or network_text: each network then gets its own form (@handle on X, Instagram and Threads, the company tagged on LinkedIn, the plain name elsewhere), and a name not in the list comes back in unknown_tags and goes out as the plain name. 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 image’s alternative text for screen readers on every network (up to 4,086 characters on LinkedIn and 1,000 elsewhere, 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 network tokens are not accepted.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "save_draft"
  }
}

Input 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 each, up to 20 per post; each network takes its own number (LinkedIn 9, X 4, Facebook and Instagram 10, Threads 20, as the save_draft description lists), and network_problems lists a network that has too many. Video: mp4, 75KB–200MB, one per post. Document: pdf, max 100MB, one per post, LinkedIn only (LinkedIn shows it as a swipeable carousel). Types cannot be mixed in one post.
contentNoThe post text, used on every network without its own version in network_text. On LinkedIn it can be up to 3,000 characters (longer text is refused); the other networks’ limits are checked when the post is scheduled or published. Required to create a draft; optional when id is set and only something else changes.
youtubeNoSettings for the YouTube video, only when destinations include a YouTube channel: { title, privacy, tags, category, made_for_kids, thumbnail_url, playlist_id }. The YouTube text (network_text.youtube, or content) is the video description, up to 5,000 bytes, without < or >. A field left out keeps what is saved.
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 the post goes on LinkedIn: a LinkedIn id from list_destinations. "personal" (the default on a new 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. To post to X, Facebook, Instagram, Threads or YouTube, use destinations on save_draft.
destinationsNoEvery place the post goes: ids from list_destinations, any mix of networks, for example ["personal", "x:<id>", "instagram:<id>"]. At most one LinkedIn id (the profile or one company page); leave LinkedIn out to post only to the other networks. Replaces what is saved; leaving it out keeps the saved destinations. Cannot be sent together with destination.
network_textNoOptional version of the text for one network, used there instead of content, for example { "x": "A version under 280 characters" }. null or "" goes back to content. Only for networks in the post’s destinations; leaving it out keeps the saved versions.
first_commentNoOptional comment PostPen adds to the post right after it is published on each network, for example a link (a reply on X and Threads). Up to 1,250 characters, and within each network’s own limit (X 280 unless the account has an X subscription, Threads 500). 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.
youtube_formatNoOptional, for a post that goes to a YouTube channel: "video" (the default) posts a normal video; "short" posts a YouTube Short, which has to be vertical or square (9:16 looks best) and up to 3 minutes. For a Short PostPen adds #Shorts to the title (or the description when the title has no room) and links to youtube.com/shorts/. A clip that is landscape or longer than 3 minutes is refused when it is published, with an error saying so, instead of going out as a normal video. Leaving it out keeps what is saved; posts saved before this option are videos.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / youtube / description
      Previous value: -"Settings for the YouTube video, only when destinations include a YouTube channel: { title, privacy, tags }. The YouTube text (network_text.youtube, or content) is the video description, up to 5,000 bytes, without < or >. A field left out keeps what is saved."New value: +"Settings for the YouTube video, only when destinations include a YouTube channel: { title, privacy, tags, category, made_for_kids, thumbnail_url, playlist_id }. The YouTube text (network_text.youtube, or content) is the video description, up to 5,000 bytes, without < or >. A field left out keeps what is saved."
    • addedInput schema / properties / youtube / properties / category
      Added value: +{
      +  "description": "The video category, by YouTube id: 1 Film & Animation, 2 Autos & Vehicles, 10 Music, 15 Pets & Animals, 17 Sports, 19 Travel & Events, 20 Gaming, 22 People & Blogs, 23 Comedy, 24 Entertainment, 25 News & Politics, 26 Howto & Style, 27 Education, 28 Science & Technology, 29 Nonprofits & Activism. 22 (People & Blogs) is the default.",
      +  "enum": [
      +    "1",
      +    "2",
      +    "10",
      +    "15",
      +    "17",
      +    "19",
      +    "20",
      +    "22",
      +    "23",
      +    "24",
      +    "25",
      +    "26",
      +    "27",
      +    "28",
      +    "29"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / youtube / properties / made_for_kids
      Added value: +{
      +  "description": "Whether the video is made for children, as YouTube asks of every upload. false is the default. Videos made for kids lose comments and personalised ads on YouTube.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / youtube / properties / playlist_id
      Added value: +{
      +  "description": "Optional id of one of the channel’s playlists (the list= part of its YouTube link) to add the video to after the upload. Needs the channel to have been connected with permission to manage playlists; otherwise the video is published and the note says to connect it again. null or \"\" removes it.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / youtube / properties / thumbnail_url
      Added value: +{
      +  "description": "Optional custom thumbnail: an https link to a JPEG or PNG image up to 2 MB, set right after the upload. Normal videos only (YouTube does not let apps set a Short’s thumbnail), and only on channels verified at youtube.com/verify; when YouTube refuses it, the video is still published and the post’s networks show why. null or \"\" removes it.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / first_comment / description
      Previous value: -"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."New value: +"Optional comment PostPen adds to the post right after it is published on each network, for example a link (a reply on X and Threads). Up to 1,250 characters, and within each network’s own limit (X 280 unless the account has an X subscription, Threads 500). null or \"\" removes a saved one; leaving it out keeps what is saved."
    • changedInput schema / properties / media / items / properties / alt_text / description
      Previous value: -"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."New value: +"Optional alternative text for this image, for people using screen readers, on every network the post goes to. Up to 4,086 characters (X, Facebook, Instagram and Threads take the first 1,000); about 120 is recommended. Images only: refused on a video or PDF item."
  3. Changed1 schema field changed
    • addedInput schema / properties / youtube_format
      Added value: +{
      +  "description": "Optional, for a post that goes to a YouTube channel: \"video\" (the default) posts a normal video; \"short\" posts a YouTube Short, which has to be vertical or square (9:16 looks best) and up to 3 minutes. For a Short PostPen adds #Shorts to the title (or the description when the title has no room) and links to youtube.com/shorts/. A clip that is landscape or longer than 3 minutes is refused when it is published, with an error saying so, instead of going out as a normal video. Leaving it out keeps what is saved; posts saved before this option are videos.",
      +  "enum": [
      +    "video",
      +    "short"
      +  ],
      +  "type": "string"
      +}
  4. Changed8 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"The 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."New value: +"The post text, used on every network without its own version in network_text. On LinkedIn it can be up to 3,000 characters (longer text is refused); the other networks’ limits are checked when the post is scheduled or published. Required to create a draft; optional when id is set and only something else changes."
    • removedInput schema / properties / content / maxLength
      Removed value: -3000
    • changedInput schema / properties / destination / description
      Previous value: -"Where 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."New value: +"Where the post goes on LinkedIn: a LinkedIn id from list_destinations. \"personal\" (the default on a new 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. To post to X, Facebook, Instagram, Threads or YouTube, use destinations on save_draft."
    • addedInput schema / properties / destinations
      Added value: +{
      +  "description": "Every place the post goes: ids from list_destinations, any mix of networks, for example [\"personal\", \"x:<id>\", \"instagram:<id>\"]. At most one LinkedIn id (the profile or one company page); leave LinkedIn out to post only to the other networks. Replaces what is saved; leaving it out keeps the saved destinations. Cannot be sent together with destination.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / media / description
      Previous value: -"Optional 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."New value: +"Optional attachments, one source per item: { url }, { upload_id }, or { data, content_type }. Images: jpeg, png, webp, gif, max 5MB each, up to 20 per post; each network takes its own number (LinkedIn 9, X 4, Facebook and Instagram 10, Threads 20, as the save_draft description lists), and network_problems lists a network that has too many. Video: mp4, 75KB–200MB, one per post. Document: pdf, max 100MB, one per post, LinkedIn only (LinkedIn shows it as a swipeable carousel). Types cannot be mixed in one post."
    • changedInput schema / properties / media / maxItems
      Previous value: -9New value: +20
    • addedInput schema / properties / network_text
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional version of the text for one network, used there instead of content, for example { \"x\": \"A version under 280 characters\" }. null or \"\" goes back to content. Only for networks in the post’s destinations; leaving it out keeps the saved versions.",
      +  "properties": {
      +    "facebook": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "instagram": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "linkedin": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "threads": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "x": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "youtube": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / youtube
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Settings for the YouTube video, only when destinations include a YouTube channel: { title, privacy, tags }. The YouTube text (network_text.youtube, or content) is the video description, up to 5,000 bytes, without < or >. A field left out keeps what is saved.",
      +  "properties": {
      +    "privacy": {
      +      "description": "Who can watch it. public is the default.",
      +      "enum": [
      +        "public",
      +        "unlisted",
      +        "private"
      +      ],
      +      "type": "string"
      +    },
      +    "tags": {
      +      "description": "Optional tags, up to 500 characters together (a tag with a space counts 2 more). [] removes them.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "title": {
      +      "description": "The video title, up to 100 characters, without < or >. null or \"\" uses the first line of the text.",
      +      "maxLength": 100,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  5. Changed7 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"The post text, used on every network without its own version in network_text. On LinkedIn it can be up to 3,000 characters (longer text is refused); the other networks’ limits are checked when the post is scheduled or published. Required to create a draft; optional when id is set and only something else changes."New value: +"The 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."
    • addedInput schema / properties / content / maxLength
      Added value: +3000
    • changedInput schema / properties / destination / description
      Previous value: -"Where the post goes on LinkedIn: a LinkedIn id from list_destinations. \"personal\" (the default on a new 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. To post to X, Facebook, Instagram or Threads, use destinations on save_draft."New value: +"Where 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."
    • removedInput schema / properties / destinations
      Removed value: -{
      -  "description": "Every place the post goes: ids from list_destinations, any mix of networks, for example [\"personal\", \"x:<id>\", \"instagram:<id>\"]. At most one LinkedIn id (the profile or one company page); leave LinkedIn out to post only to the other networks. Replaces what is saved; leaving it out keeps the saved destinations. Cannot be sent together with destination.",
      -  "items": {
      -    "type": "string"
      -  },
      -  "minItems": 1,
      -  "type": "array"
      -}
    • changedInput schema / properties / media / description
      Previous value: -"Optional attachments, one source per item: { url }, { upload_id }, or { data, content_type }. Images: jpeg, png, webp, gif, max 5MB each, up to 20 per post; each network takes its own number (LinkedIn 9, X 4, Facebook and Instagram 10, Threads 20, as the save_draft description lists), and network_problems lists a network that has too many. Video: mp4, 75KB–200MB, one per post. Document: pdf, max 100MB, one per post, LinkedIn only (LinkedIn shows it as a swipeable carousel). Types cannot be mixed in one post."New value: +"Optional 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."
    • changedInput schema / properties / media / maxItems
      Previous value: -20New value: +9
    • removedInput schema / properties / network_text
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "Optional version of the text for one network, used there instead of content, for example { \"x\": \"A version under 280 characters\" }. null or \"\" goes back to content. Only for networks in the post’s destinations; leaving it out keeps the saved versions.",
      -  "properties": {
      -    "facebook": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "instagram": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "linkedin": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "threads": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "x": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    }
      -  },
      -  "type": "object"
      -}
  6. Changed2 schema fields changed
    • changedInput schema / properties / media / description
      Previous value: -"Optional 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."New value: +"Optional attachments, one source per item: { url }, { upload_id }, or { data, content_type }. Images: jpeg, png, webp, gif, max 5MB each, up to 20 per post; each network takes its own number (LinkedIn 9, X 4, Facebook and Instagram 10, Threads 20, as the save_draft description lists), and network_problems lists a network that has too many. Video: mp4, 75KB–200MB, one per post. Document: pdf, max 100MB, one per post, LinkedIn only (LinkedIn shows it as a swipeable carousel). Types cannot be mixed in one post."
    • changedInput schema / properties / media / maxItems
      Previous value: -9New value: +20
  7. Changed5 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"The 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."New value: +"The post text, used on every network without its own version in network_text. On LinkedIn it can be up to 3,000 characters (longer text is refused); the other networks’ limits are checked when the post is scheduled or published. Required to create a draft; optional when id is set and only something else changes."
    • removedInput schema / properties / content / maxLength
      Removed value: -3000
    • changedInput schema / properties / destination / description
      Previous value: -"Where 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."New value: +"Where the post goes on LinkedIn: a LinkedIn id from list_destinations. \"personal\" (the default on a new 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. To post to X, Facebook, Instagram or Threads, use destinations on save_draft."
    • addedInput schema / properties / destinations
      Added value: +{
      +  "description": "Every place the post goes: ids from list_destinations, any mix of networks, for example [\"personal\", \"x:<id>\", \"instagram:<id>\"]. At most one LinkedIn id (the profile or one company page); leave LinkedIn out to post only to the other networks. Replaces what is saved; leaving it out keeps the saved destinations. Cannot be sent together with destination.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / network_text
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional version of the text for one network, used there instead of content, for example { \"x\": \"A version under 280 characters\" }. null or \"\" goes back to content. Only for networks in the post’s destinations; leaving it out keeps the saved versions.",
      +  "properties": {
      +    "facebook": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "instagram": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "linkedin": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "threads": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "x": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  8. 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"
      +}
  9. 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"
      +}
  10. 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"
      +  ]
      +}
  11. First observed

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare mutation, destructiveness and open-world reach, so the description is not the sole source of the safety profile. It does add real behavior beyond them: nothing is published on update, network_problems blocking, preview_url for showing the user, X threads, and the destructive case where media: [] removes attachments. But it never frames these as destructive/irreversible consequences in a coherent behavioral summary.

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

Conciseness2/5

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

A single very long block that runs network character limits, YouTube settings, media, tags and alt text together with no paragraph breaks or ordering after the first two sentences. Useful content is buried, and many clauses restate parameter descriptions already in the schema (alt-text lengths, X 280/25,000 characters, PDF-on-LinkedIn-only).

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 12-parameter, deeply nested mutation tool with no output schema, the description covers creation vs update semantics, per-network constraints, media/alt-text lifecycle, validation failures and the return-shape summary (post.networks, network_problems, preview_url). Nothing an agent needs 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.

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; the description still gives extra semantics the schema does not, such as @[Name] tag resolution with an unknown_tags fallback, the fact that omitting media keeps attachments versus media: [] clearing them, and that media_alt_text cannot be sent with media. Most of the remaining per-field detail duplicates schema text.

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?

Opens with a specific verb+resource pair and immediately separates the two modes: 'Saves a post as a draft ... or updates an existing unpublished post. Without id it creates a draft.' That distinguishes it from schedule_post, publish_now and delete_draft without needing their schemas.

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

Usage Guidelines5/5

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

States explicitly when to create (no id, content required) versus update (id set, any subset of fields, schedule time unchanged, nothing published), names the helpers it depends on (list_destinations, create_upload, list_tags) and warns that schedule_post and publish_now refuse a post while network_problems exist.

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