Skip to main content
Glama

Approve Posts

approve_posts
Destructive

Approves the exact revisions given ([{postId, rev}], where rev comes from get_post/search_posts). There is no separate publish step. For website channels the result names the next CMS step (queued at a time, or a CMS draft that does not go live). An approved social post reads approved for a few seconds while Mark hands it to the publisher, then scheduled, and publishes at its scheduled time; confirm with get_post. An approved LinkedIn Article stays approved with handoff publish_by_hand (publish_now once its slot time passes) until someone records its live URL with record_post_published. Each approved outcome carries handoff: handing_off, or stuck with the reason and fix when the post can't go (no scheduled time, no connected account for the channel, or Mark couldn't start the handoff), so you don't have to wait to learn it. A post whose handoff couldn't start can still read handing_off on get_post for up to 5 minutes after approval; trust this result. A stale rev is refused. On a channel set to admins only, only workspace admins can approve; anyone else gets those posts back skipped. Only use it when the user has explicitly asked to approve. Related: get_post, search_posts, review_post.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "posts": "<posts>"
    },
    "name": "approve_posts"
  }
}

Input Schema

NameRequiredDescriptionDefault
postsYesPairs of postId and rev to approve.

Output Schema

NameRequiredDescriptionDefault
outcomesYes
submittedYes
lifecycleWarningsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / outcomes / items / properties / handoff / description
      Previous value: -"An approved social post's handoff to the publisher: handing_off (it moves to scheduled within seconds), stuck with the reason and fix (no scheduled time, no connected account for the channel, or no progress 5 minutes after approval), or null for every other status and every website post. An approved LinkedIn Article has no publisher: publish_by_hand before its scheduled time and publish_now from it on, until someone records its URL with record_post_published."New value: +"An approved social post's handoff to the publisher: handing_off (it moves to scheduled within seconds), stuck with the reason and fix (no scheduled time, no connected account for the channel, or no progress 5 minutes after approval), or null for every other status. An approved LinkedIn Article has no publisher: publish_by_hand before its scheduled time and publish_now from it on, until someone records its URL with record_post_published. An approved website post whose post type no CMS maps reads publish_by_hand (get_post and the review page only); every other website post is null."
  2. Changed1 schema field changed
    • addedOutput schema / properties / outcomes / items / properties / planLimit
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Set when the plan's published-posts limit skipped it.",
      +  "properties": {
      +    "error": {
      +      "const": "plan_limit_reached",
      +      "type": "string"
      +    },
      +    "key": {
      +      "type": "string"
      +    },
      +    "limit": {
      +      "type": "number"
      +    },
      +    "operation": {
      +      "type": "string"
      +    },
      +    "reason": {
      +      "enum": [
      +        "inactive",
      +        "cap",
      +        "fair_use",
      +        "burst"
      +      ],
      +      "type": "string"
      +    },
      +    "resetsAt": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "upgradeUrl": {
      +      "type": "string"
      +    },
      +    "used": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "error",
      +    "key",
      +    "limit",
      +    "operation",
      +    "reason",
      +    "resetsAt",
      +    "upgradeUrl",
      +    "used"
      +  ],
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedOutput schema / properties / outcomes / items / properties / handoff / anyOf
      Previous value: -[
      -  {
      -    "oneOf": [
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "state": {
      -            "const": "handing_off",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "state"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "reason": {
      -            "type": "string"
      -          },
      -          "state": {
      -            "const": "stuck",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "reason",
      -          "state"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "oneOf": [
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "state": {
      +            "const": "handing_off",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "state"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "reason": {
      +            "type": "string"
      +          },
      +          "state": {
      +            "const": "stuck",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "reason",
      +          "state"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "reason": {
      +            "type": "string"
      +          },
      +          "state": {
      +            "const": "publish_by_hand",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "reason",
      +          "state"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "reason": {
      +            "type": "string"
      +          },
      +          "state": {
      +            "const": "publish_now",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "reason",
      +          "state"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / outcomes / items / properties / handoff / description
      Previous value: -"An approved social post's handoff to the publisher: handing_off (it moves to scheduled within seconds), stuck with the reason and fix (no scheduled time, no connected account for the channel, or no progress 5 minutes after approval), or null for every other status and every website post."New value: +"An approved social post's handoff to the publisher: handing_off (it moves to scheduled within seconds), stuck with the reason and fix (no scheduled time, no connected account for the channel, or no progress 5 minutes after approval), or null for every other status and every website post. An approved LinkedIn Article has no publisher: publish_by_hand before its scheduled time and publish_now from it on, until someone records its URL with record_post_published."
  4. Changed1 schema field changed
    • addedOutput schema / properties / outcomes / items / properties / handoff
      Added value: +{
      +  "anyOf": [
      +    {
      +      "oneOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "state": {
      +              "const": "handing_off",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "state"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "reason": {
      +              "type": "string"
      +            },
      +            "state": {
      +              "const": "stuck",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "reason",
      +            "state"
      +          ],
      +          "type": "object"
      +        }
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "An approved social post's handoff to the publisher: handing_off (it moves to scheduled within seconds), stuck with the reason and fix (no scheduled time, no connected account for the channel, or no progress 5 minutes after approval), or null for every other status and every website post."
      +}
  5. First observed

TDQS

A4.4/5.0
Behavior5/5

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

The description adds extensive behavioral context beyond the annotations: it explains stale-rev refusal, admin-only channel behavior, skipped posts, social-post status transitions, LinkedIn Article handoff, CMS next steps, and stuck-handoff reasons and fixes. This gives an agent unusually rich operational detail for a destructive approval action.

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?

The description is front-loaded with the core action and then expands into necessary edge cases. It is long and dense, but most sentences carry specific operational value for a complex approval workflow.

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?

Given the mutation, output schema, and annotations, the description is complete: it covers authorization, revision freshness, downstream handoff behavior, timing caveats, and when to use the tool. Nothing essential for correct invocation appears missing.

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 documents posts, postId, and rev. The description reinforces that rev must be exact and comes from get_post/search_posts and adds that stale revs are refused, but most parameter meaning is already in the schema.

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 description states a specific verb and resource: it approves the exact revisions given, with the required postId/rev pairs. It also distinguishes approval from publishing by noting there is no separate publish step and by naming where rev comes from (get_post/search_posts).

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 a clear usage gate: only use it when the user has explicitly asked to approve. It also names related tools for obtaining revs and reviewing posts, but it does not explicitly contrast this tool with the sibling approve_post_from_preview alternative.

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