How to post to Bluesky from Claude Code

To post to Bluesky from Claude Code, run claude mcp add --transport http postwire https://postwire.io/api/mcp, sign in with your email, connect Bluesky once with your handle and an app password, and ask "write a Bluesky thread about what shipped in CHANGELOG.md and post it". Claude Code writes it with generate_posts, shows it to you, and publishes it with post_to_social or queues it with schedule_post: a post of up to 300 characters, a thread of up to 10 posts with the link in a reply under it, and up to 4 images with alt text. A whole thread counts as one post of your plan. Bluesky is on the free plan: 1 business, 10 posts a month, 5 AI drafts a day, 2 networks per post, no card.

Links, @mentions and #hashtags arrive clickable, because PostWire marks each one in the post record. The same request can carry the LinkedIn, Mastodon and X versions of the same news, each written for its own network.

Updated . Written from PostWire's own code; vendor prices read on Oct 26, 2026. Live networks: TikTok, Instagram, YouTube, LinkedIn (personal profiles), Facebook Pages, Bluesky, Mastodon, Telegram, Discord, and X on paid plans.

Set it up and post, step by step

Prompt to copy once Bluesky is connected: Read CHANGELOG.md, write a Bluesky thread of 4 posts about v2.4 with the release link in a reply under the last one, show it to me, and schedule it for Thursday at 10am.

  1. Add PostWire to Claude Code

    In your terminal run claude mcp add --transport http postwire https://postwire.io/api/mcp (add --scope user to have it in every project), then type /mcp in Claude Code and pick postwire to sign in. The sign-in asks for your email and a 6-digit code, which also creates a free PostWire account if you have none: no password and no card.

  2. Or install the skill instead

    npx skills add https://postwire.io --skill schedule-posts adds PostWire's scheduling skill to Claude Code instead. It uses your key from the environment: copy it in the dashboard under API & MCP and set POSTWIRE_API_KEY. The skill is a plain file you can read first: schedule-posts/SKILL.md.

  3. Create a Bluesky app password

    In Bluesky, open the app passwords page (bsky.app/settings/app-passwords), add one and copy it. It is not your account password, and deleting it in Bluesky disconnects PostWire.

  4. Connect Bluesky

    Ask "connect my Bluesky". Claude Code calls create_connect_link and prints a one-hour link; choose Bluesky there and paste your full handle (name.bsky.social or your own domain) and the app password. PostWire signs in to Bluesky with them before it saves anything, so a wrong handle or password is refused on that page, with what to do about it.

  5. Ask for the post or the thread

    "Write a Bluesky post about the new CSV import." generate_posts returns a draft and publishes nothing: within 300 characters, conversational, with one or two specific hashtags at most. Ask for a thread, or give it an idea too long for one post, and it returns text (the hook) plus thread (the posts after it, in order); when the idea has a link, the link comes back in first_comment, to go in a reply under the last post.

  6. Post now, or schedule it

    Say "post it" and Claude Code calls post_to_social; say "schedule it for Thursday at 10am" and it calls schedule_post, up to 365 days ahead, or with run_at: "next_slot". thread holds up to 9 posts after the first, each a reply to the one before, and first_comment is one more reply under the last one. This is the call:

    {
      "name": "schedule_post",
      "arguments": {
        "platforms": ["bluesky"],
        "per_platform": { "bluesky": {
          "text": "v2.4 took 6 weeks and cut our sync time in half. here is what changed 🧵",
          "thread": [
            "we stopped syncing on every keystroke. saves now batch every 2 seconds.",
            "conflicts get a side-by-side view instead of a silent overwrite.",
            "and dark mode, because you asked 41 times. #buildinpublic"
          ],
          "first_comment": "release notes: https://example.com/changelog/2-4"
        } },
        "run_at": "2026-10-29T10:00:00-05:00"
      }
    }
  7. Open the post

    The result carries the post's link (https://bsky.app/profile/…/post/…) and, for a thread, every post's id. If Bluesky refuses a later post of a thread, the earlier ones stay up and the result says which went out and which did not; nothing is posted twice.

"What's scheduled on Bluesky?" calls list_scheduled_posts, and "cancel Thursday's thread" calls cancel_scheduled_post; the same queue is on the dashboard's Queue page. Without Claude Code, the same post is POST /api/post with {"platforms": ["bluesky"], "text": "…"} and your key. Prefer to set it up by hand first? Open the dashboard, connect Bluesky under Accounts and copy your key under API & MCP.

Ways to post to Bluesky from Claude Code, side by side

How each service plugs into Claude Code and what it starts at, read on its own Claude Code and pricing pages on Oct 26, 2026.

ServiceHow it plugs into Claude CodeFree to startCheapest paid plan
PostWireclaude mcp add with https://postwire.io/api/mcp (OAuth sign-in), or the schedule-posts skillYes — free plan: 10 posts a month, Bluesky included, no card$9/mo — 3 businesses
Upload-Postnpx skills add Upload-Post/upload-post-skill with an API keyFree plan: 10 uploads a month, 2 profiles, no card$24/mo — 5 profiles
Postizclaude mcp add with mcp.postiz.com/mcp-oauth-dynamic, or the Postiz skill7-day free trial$29/mo — 5 channels

Checked on Oct 26, 2026 (2026-10-26) on each vendor's own pricing or docs page, linked in the first column and below. Monthly billing in USD unless noted. "Not listed" means we could not find it on their page, not that it is missing.

Where PostWire is ahead

  • A thread counts as one post: up to 10 posts and a reply with the link use one of the plan's 10 free posts a month. Upload-Post's free plan counts 10 uploads a month.
  • The cheapest paid plan here: $9 a month for 3 businesses. Upload-Post $24, Postiz $29.
  • No key to paste to start: claude mcp add and a sign-in with your email and a 6-digit code, which creates the free account too.
  • The post is written for Bluesky: generate_posts writes a conversational post or thread and, from the same news, the LinkedIn and Mastodon versions in one call.
  • The thread is checked first: every post is measured as Bluesky counts it before the first one goes out, and a refused later post never leaves a duplicate.
  • The app password is tested before it is saved, and again by the connection check, so a dead login shows up in the dashboard.
Sources, all read on Oct 26, 2026:
  • Upload-Post — Claude Code + Bluesky skill (npx skills add Upload-Post/upload-post-skill; free API key, "no card"; text up to 300 characters, photos, videos, link card previews; longer text split into a threaded chain): www.upload-post.com/skills/claude-code/bluesky/
  • Upload-Post plans (llms-full.txt: Free 10 uploads a month, 2 profiles; Basic $24 a month, 5 profiles): www.upload-post.com/llms-full.txt
  • Postiz — Claude Code (claude mcp add --transport http postiz https://mcp.postiz.com/mcp-oauth-dynamic, or npx skills add gitroomhq/postiz-agent with POSTIZ_API_KEY): postiz.com/claude-code
  • Postiz pricing ("Start with a 7-day free trial"; Standard $29 a month, 5 channels): postiz.com/pricing

Bluesky threads from Claude Code

  • Up to 10 posts in one chain: the first post plus up to 9 more in thread, each a reply to the one before, so Bluesky shows them as one thread. Images stay on the first post.
  • Let PostWire split it: "thread": true instead of a list cuts the text into posts of up to 300 characters at a paragraph, then a sentence, then a word, and never inside a link.
  • The link goes under the thread: first_comment is posted by you as a reply under the last post, where people look for it.
  • Checked before anything goes out: every post of a thread is measured as Bluesky counts it (300 graphemes, so an emoji counts once). A post over the limit is refused before the first one is sent, never cut halfway.
  • One thread, one post of your plan: a thread counts as one post however many replies it has, and the first comment is free too.

Source: PostWire's Bluesky publisher and thread code, read Oct 26, 2026.

Bluesky's rules Claude Code works within

  • 300 characters per post. generate_posts writes within that, for Bluesky's tone: a person taking part in the conversation, not a brand announcement.
  • Clickable links, mentions and hashtags: on Bluesky a link is only clickable when the post marks where it starts and ends. PostWire marks every link, @mention and #hashtag.
  • Up to 4 images, each with its own alt text, of up to 1 MB each (Bluesky's own limit is 1,000,000 bytes). A larger image is refused with its size and the fix, and no post is created. A file on your computer goes through create_upload_link, a page where you pick it.
  • A deleted app password is noticed: PostWire's connection check signs in with it, and the dashboard asks you to reconnect.

More on Bluesky itself: Bluesky MCP server and does Bluesky have an API?

Why post to Bluesky from Claude Code

  • The facts are already in your repo: Claude Code reads the changelog, the commit log or the release notes and writes the thread from what actually shipped.
  • One release, every network: "announce v2.4 on Bluesky, Mastodon and LinkedIn" sends one request with a version written for each network; on the free plan, a post goes to 2 networks at a time.
  • From a script or CI: claude -p "post a Bluesky thread about today's release from CHANGELOG.md" --allowedTools "mcp__postwire__*" runs it without a chat.
  • A person can have the last word: on paid plans, a brand's approval rules hold what Claude Code queues until you approve it from an emailed link.

What it does not do

Claude Code with PostWire writes, publishes and schedules your own posts and threads on Bluesky. It posts text and images, not video, and it does not attach a link card preview: a link stays a clickable link in the text. It does not read your timeline or notifications, and it does not like, repost, follow or send direct messages.

Questions people ask

Can Claude Code post to Bluesky?

Yes, with an MCP server or a skill. Claude Code has no Bluesky access of its own; with PostWire added (claude mcp add --transport http postwire https://postwire.io/api/mcp) and Bluesky connected once with your handle and an app password, it writes posts and threads and publishes or schedules them when you ask.

Do I give Claude Code my Bluesky password?

No. You create an app password in Bluesky's settings and paste it, with your handle, on PostWire's connect page, not in the chat. It is separate from your account password, and deleting it in Bluesky disconnects PostWire.

Can Claude Code post a thread to Bluesky?

Yes. The posts after the first go in thread (up to 9 more), each within 300 characters, and first_comment adds a reply under the last one for the link. Or send "thread": true and PostWire splits the text itself at paragraph, sentence or word boundaries.

Does a Bluesky thread use more of my plan?

No. A thread counts as one post of the plan, however many replies it has, and the first comment does not count either. The free plan includes 10 posts a month.

Can Claude Code schedule Bluesky posts?

Yes. It calls schedule_post with a time up to 365 days ahead, or "next_slot" for your next free posting hour, and PostWire publishes it at that time with Claude Code closed.

Can it post images to Bluesky?

Yes, up to 4 per post, each with its own alt text and up to 1 MB. A file on your computer gets a link through create_upload_link, a page where you pick the file; a file already online goes as its public https link. Video is not posted to Bluesky.

How much does it cost?

Bluesky is on the free plan: 1 business, 10 posts a month, 5 AI drafts a day, 2 networks per post, no card. Starter is $9 a month with 3 businesses and every network in each post, Pro $29 with 10 businesses; paid plans have a 14-day refund.