create_post
Create a public post on Bluesky with text, images, video, link cards, or quotes. Control who can reply and whether quoting is allowed.
Instructions
Create a new post on AT Protocol (Bluesky). The single rich post-creation tool: supports plain text with auto-detected mentions/links/#hashtags, explicit richtext facets, replies, image embeds, a video embed (from upload_video), an external link card, a quote (record) embed, language tags, reply controls (who can reply, via a threadgate record), and quote controls (quote policy, via a postgate record). Requires authentication (app password). SIDE EFFECT: publishes a public post visible to everyone. Subject to per-tool rate limiting. Use create_thread to publish a multi-post chain in one call, and reply_to_post to reply to an existing post; use this tool for a single standalone post (it can also reply via the reply field).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The post body. Max 300 graphemes / 3000 bytes (emoji count as one grapheme). Mentions, links and #hashtags are auto-detected into richtext facets unless you supply `facets` explicitly. | |
| reply | No | Set to make this post a reply in an existing thread. | |
| embed | No | Optional media embed: images OR an external link card OR a video (at most one). | |
| facets | No | Optional explicit richtext facets (byte-range annotations). For mentions, `value` is a handle or DID; for links, a URL; for hashtags, the tag without #. Omit to let the server auto-detect facets from the text. | |
| quote | No | Quote another post (record embed). Mutually exclusive with the `embed.images`, `embed.external`, and `embed.video` embeds. | |
| langs | No | Optional BCP-47 language tags (e.g. en, en-US, pt-BR) declaring the languages of the post text. | |
| replyControls | No | Who can reply to this post. Writes an app.bsky.feed.threadgate record (same rkey as the post) AFTER the post is created. Enabled options combine, up to 5 rules. Provide the object with NO rules enabled to let nobody reply; omit it entirely to leave replies open to everyone. If the gate write fails after the post succeeded, the call still succeeds with gateApplied:false and a warning instead of failing. | |
| quoteControls | No | Quote (embed) policy for this post. Only allowQuotes:false writes an app.bsky.feed.postgate record, AFTER the post is created. If that write fails after the post succeeded, the call still succeeds with gateApplied:false and a warning instead of failing. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | AT-URI of the newly created post. | |
| cid | Yes | CID (content hash) of the newly created post. | |
| success | Yes | Whether the post was created successfully. | |
| message | Yes | Human-readable status message. | |
| gateApplied | No | Present only when replyControls and/or quoteControls were requested. True when every requested gate record (threadgate/postgate) is in effect. False when the post was created but a gate write failed — the post is LIVE without the requested controls (success stays true; see `warning` for which gate failed and how to retry). | |
| warning | No | Present only when gateApplied is false: explains which gate record (threadgate and/or postgate) could not be written and how to retry. The post itself was created successfully. |