Skip to main content
Glama

Post as what you run (draft or publish)

create_post

"Lägg ut det här i föreningen": a post for something the person runs, as it (as), for whom (audience): words, photos (media: from upload_media), a poll, a challenge or a data story (story_id). In their voice and the channel's language; never invent people, numbers or quotes. A draft they publish with one tap unless their AI runs the place or this app may publish there; never directly where under-18s can see it.

Input Schema

NameRequiredDescriptionDefault
asNoWhich of what they run to act as: its name, e.g. "Löparklubben", or a key from list_identities. Left out when only one fits.
askNoOnly when they want one: one open question for the comments, ≤ 200 characters.
kindNoDefault text.
modeNo"draft" always makes a card. Default: publish where allowed, else a card.
textNoThe words, ≤ 1000 characters (with a poll, a challenge or a story: a line above it).
mediaNo1–10 mediaIds from upload_media.
titleNoA name for the draft card, not part of the post.
correctNochallenge: the right option, 0-based.
optionsNopoll, challenge: 2–4 options.
audienceNoeveryone, followers, members, team or subscribers (list_identities shows what it offers). Left out: the channel's usual.
questionNopoll, challenge: ≤ 120 characters.
story_idNoA data story of theirs, from create_data_story.
publishAtNoWhen it goes out: 5 minutes to 30 days ahead, ISO 8601 with their UTC offset. Left out: now.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed17 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedInput schema / properties / as / description
      Previous value: -"Which of what the person runs to act as — a key from list_personas, e.g. \"forening:a1b2c3d4e5\" or \"channel:Xy12Ab34Cd\", or its name, e.g. \"Löparklubben\". May be left out when only one fits."New value: +"Which of what they run to act as: its name, e.g. \"Löparklubben\", or a key from list_identities. Left out when only one fits."
    • changedInput schema / properties / ask / description
      Previous value: -"Only when the person wants one: ONE open question over the post (≤ 200 characters) that the comments answer — on words, a story or photos, never with a poll or a challenge. Example: \"Vilket år tror ni vänder?\""New value: +"Only when they want one: one open question for the comments, ≤ 200 characters."
    • changedInput schema / properties / audience / description
      Previous value: -"Who should see it: everyone, followers, members (the home's Nyheter — its members only), team, or subscribers. Leave out for the channel's usual. Example: \"members\""New value: +"everyone, followers, members, team or subscribers (list_identities shows what it offers). Left out: the channel's usual."
    • changedInput schema / properties / correct / description
      Previous value: -"challenge: the right option, 0-based, e.g. 0."New value: +"challenge: the right option, 0-based."
    • changedInput schema / properties / kind / description
      Previous value: -"text (default), poll, or challenge (a question with one right answer)."New value: +"Default text."
    • changedInput schema / properties / media / description
      Previous value: -"Photos/clips from upload_media (1–10; 2+ make a carousel), with kind text — the words become the caption. Example: [{\"mediaId\": \"Ab12Cd34Ef56Gh78\", \"alt\": \"Laget efter matchen\"}]"New value: +"1–10 mediaIds from upload_media."
    • changedInput schema / properties / media / items / anyOf
      Previous value: -[
      -  {
      -    "maxLength": 40,
      -    "type": "string"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alt": {
      -        "description": "What's in the photo, for screen readers. Example: \"Tre löpare vid målet\"",
      -        "maxLength": 400,
      -        "type": "string"
      -      },
      -      "mediaId": {
      -        "maxLength": 40,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mediaId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 40,
      +    "type": "string"
      +  },
      +  {
      +    "properties": {
      +      "alt": {
      +        "description": "What's in the photo.",
      +        "maxLength": 400,
      +        "type": "string"
      +      },
      +      "mediaId": {
      +        "maxLength": 40,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mediaId"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / mode / description
      Previous value: -"\"publish\" (default) publishes now only if the person turned on \"May publish directly\" for your app AND no one under 18 can see it — else it's a draft; \"draft\" always makes a draft they publish with one tap."New value: +"\"draft\" always makes a card. Default: publish where allowed, else a card."
    • changedInput schema / properties / options / description
      Previous value: -"poll / challenge: 2–4 different options, e.g. [\"1252\", \"1350\", \"1523\"]."New value: +"poll, challenge: 2–4 options."
    • changedInput schema / properties / publishAt / description
      Previous value: -"When it should go out, 5 minutes to 30 days ahead, ISO 8601 with the person's UTC offset, e.g. 2026-10-09T08:00:00+02:00. Leave out for now."New value: +"When it goes out: 5 minutes to 30 days ahead, ISO 8601 with their UTC offset. Left out: now."
    • changedInput schema / properties / question / description
      Previous value: -"poll / challenge: the question, ≤ 120 characters, e.g. \"Vilket år grundades Stockholm?\""New value: +"poll, challenge: ≤ 120 characters."
    • changedInput schema / properties / story_id / description
      Previous value: -"A data story to post (the story_id create_data_story gave, the person's own) — with kind text; the words are a line above it. Example: \"Kx81ab3QpL0e\""New value: +"A data story of theirs, from create_data_story."
    • changedInput schema / properties / text / description
      Previous value: -"The post's words (≤ 1000 characters; with a poll, a challenge or a story: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""New value: +"The words, ≤ 1000 characters (with a poll, a challenge or a story: a line above it)."
    • changedInput schema / properties / title / description
      Previous value: -"A short name for the draft card (not part of the post), e.g. \"Helgens träning\"."New value: +"A name for the draft card, not part of the post."
    • changedOutput schema / (root)
      Previous value: -{
      -  "$schema": "http://json-schema.org/draft-07/schema#",
      -  "additionalProperties": false,
      -  "properties": {
      -    "as": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "key": {
      -          "type": "string"
      -        },
      -        "name": {
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "key",
      -        "name"
      -      ],
      -      "type": "object"
      -    },
      -    "itemId": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "note": {
      -      "type": "string"
      -    },
      -    "postId": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "status": {
      -      "enum": [
      -        "published",
      -        "scheduled",
      -        "pending_check",
      -        "draft",
      -        "draft_exists",
      -        "held"
      -      ],
      -      "type": "string"
      -    },
      -    "undoUntil": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "url": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "why": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    }
      -  },
      -  "required": [
      -    "status",
      -    "as",
      -    "postId",
      -    "url",
      -    "itemId",
      -    "undoUntil",
      -    "why",
      -    "note"
      -  ],
      -  "type": "object"
      -}New value: +null
  2. Changed4 schema fields changed
    • addedInput schema / properties / ask
      Added value: +{
      +  "description": "Only when the person wants one: ONE open question over the post (≤ 200 characters) that the comments answer — on words, a story or photos, never with a poll or a challenge. Example: \"Vilket år tror ni vänder?\"",
      +  "maxLength": 300,
      +  "type": "string"
      +}
    • addedInput schema / properties / story_id
      Added value: +{
      +  "description": "A data story to post (the story_id create_data_story gave, the person's own) — with kind text; the words are a line above it. Example: \"Kx81ab3QpL0e\"",
      +  "maxLength": 40,
      +  "type": "string"
      +}
    • changedInput schema / properties / text / description
      Previous value: -"The post's words (≤ 1000 characters; with a poll or a challenge: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""New value: +"The post's words (≤ 1000 characters; with a poll, a challenge or a story: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""
    • removedInput schema / required
      Removed value: -[
      -  "text"
      -]
  3. Changed4 schema fields changed
    • removedInput schema / properties / ask
      Removed value: -{
      -  "description": "Only when the person wants one: ONE open question over the post (≤ 200 characters) that the comments answer — on words, a story or photos, never with a poll or a challenge. Example: \"Vilket år tror ni vänder?\"",
      -  "maxLength": 300,
      -  "type": "string"
      -}
    • removedInput schema / properties / story_id
      Removed value: -{
      -  "description": "A data story to post (the story_id create_data_story gave, the person's own) — with kind text; the words are a line above it. Example: \"Kx81ab3QpL0e\"",
      -  "maxLength": 40,
      -  "type": "string"
      -}
    • changedInput schema / properties / text / description
      Previous value: -"The post's words (≤ 1000 characters; with a poll, a challenge or a story: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""New value: +"The post's words (≤ 1000 characters; with a poll or a challenge: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""
    • addedInput schema / required
      Added value: +[
      +  "text"
      +]
  4. Changed4 schema fields changed
    • addedInput schema / properties / ask
      Added value: +{
      +  "description": "Only when the person wants one: ONE open question over the post (≤ 200 characters) that the comments answer — on words, a story or photos, never with a poll or a challenge. Example: \"Vilket år tror ni vänder?\"",
      +  "maxLength": 300,
      +  "type": "string"
      +}
    • addedInput schema / properties / story_id
      Added value: +{
      +  "description": "A data story to post (the story_id create_data_story gave, the person's own) — with kind text; the words are a line above it. Example: \"Kx81ab3QpL0e\"",
      +  "maxLength": 40,
      +  "type": "string"
      +}
    • changedInput schema / properties / text / description
      Previous value: -"The post's words (≤ 1000 characters; with a poll or a challenge: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""New value: +"The post's words (≤ 1000 characters; with a poll, a challenge or a story: an optional line above it), e.g. \"Träningen i helgen flyttas till Ribersborg — samma tid.\""
    • removedInput schema / required
      Removed value: -[
      -  "text"
      -]
  5. Added

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare mutation (readOnlyHint=false), non-destructive and non-idempotent, so the bar is lower. The description adds real behavioral context beyond them: output defaults to a one-tap-publishable draft unless permission conditions are met, direct publishing is forbidden where minors can see, content must be in the channel's language and the owner's voice, and people/numbers/quotes must never be fabricated. It does not describe what the call returns or how publish failures surface, which keeps it off 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.

Conciseness3/5

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

Two long sentences carry a lot of rules, with parameter names inline in backticks, which aids scanning. However, the parenthetical stacking ('(media: from upload_media)', '(story_id)', '(`as`)', '(`audience`)') and the cryptic Swedish opener make it harder to parse than necessary. No sentence is pure filler, but the structure could be flattened for faster reading.

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

Completeness4/5

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

For a 13-parameter mutation with no output schema, the description covers content types, source tools for inputs, mode defaults, permission gates and a hard safety exclusion. What an agent still cannot infer is the return value (e.g., a post or draft identifier) and what happens on partial failure during a scheduled publish. Given the richness of the schema, the definition is close to complete.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains every one of the 13 fields, and the description adds little field-level detail beyond restating that media comes from upload_media and story_id from create_data_story (both already in the schema). The framing of `as`/`audience` as 'as it, for whom' gives conceptual orientation but no syntax or format guidance the schema lacks. 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.

Purpose4/5

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

The description makes clear this creates a post on behalf of something the person runs, and enumerates the content shapes it accepts (words, photos, poll, challenge, data story). It implicitly separates itself from edit_post (this makes new content) and from create_data_story/upload_media, which it references as prerequisite sources. The verb 'create/publish' is only implied by the Swedish opener and the parenthetical '(draft or publish)', so it is not maximally crisp.

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 explicit routing context: name what they run via `as`, pick audience via `audience`, pull media from upload_media and stories from create_data_story, and check list_identities for available identities. It also states the draft-vs-publish decision rule ('unless their AI runs the place or this app may publish there; never directly where under-18s can see it'). It does not explicitly say to use edit_post for changes to an existing post, so the containment against that sibling 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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.