MCP (streamable HTTP) via MCPServerAdapter · Bluesky

Post to Bluesky from CrewAI, with approval

CrewAI splits work between roles, which maps well onto social publishing: a researcher gathers facts, a writer drafts, an editor tightens. Give only the writer SocialHandoff's tools through the MCP adapter, and the crew ends by saving a Bluesky thread as a draft. The final editor is still a person in the approval inbox. You approve, edit, or reject every post before it goes out.

Prompt

Crew task: researcher reads our last 5 blog posts, writer turns the best insight into a 2-post Bluesky thread for developers, editor checks each post is under 300 graphemes and removes filler. Writer calls draft_post for bluesky.

How to do it

  1. Mint a Bluesky agent key In https://app.socialhandoff.com, open Connections, connect your Bluesky account, then create an agent key scoped to Bluesky with draft permission only. Copy the key when it is shown; only its hash is stored.
  2. Wrap the server Use MCPServerAdapter from crewai-tools with a streamable-http transport at https://app.socialhandoff.com/mcp and the bearer key in the headers.
  3. Give tools to one agent Assign the adapter's tools to the crew member that writes Bluesky copy. Researcher and editor agents do not need them.
  4. Kick off the crew Run the crew. The writer calls draft_post as its last task and returns the post id, which a person then approves in the inbox.

Example draft

1/2 Most flaky tests we have fixed this year were not flaky. They depended on test order, and the shared fixture was the cause every time.

2/2 What helped: run the suite in random order in CI once a day. You find the order bugs on your schedule, not during a release. Full write-up: example.com/blog/flaky

Gotchas

  • Bluesky refuses images over 1 MB and allows at most 4 per post. Resize screenshots before the agent attaches them, and add alt text to each.
  • Links, @handles, and #tags become clickable facets when the post publishes. Have the agent write the plain URL and handle, not markdown links.
  • Connect Bluesky with an app password from Settings, never your account password. Revoking that app password cuts off only this connection.
  • A reviewer agent inside the crew is not a substitute for the approval inbox. Agent keys cannot approve, so a person still signs off on every Bluesky post.
Bluesky
  • Character limit: 300 graphemes per post. An emoji or an accented letter counts as 1 grapheme even if it uses several bytes.
  • Media per post: Up to 4 images, or 1 video. Images and video cannot be mixed in one post.
  • Image size: The AT Protocol image embed accepts blobs of about 1 MB each; the official app compresses larger photos. SocialHandoff checks for 1 MB per image.
  • Video: Up to 3 minutes and 100 MB, MP4. SocialHandoff does not publish video to Bluesky.
Bluesky scheduler for agent-drafted posts and threads

Frequently asked questions

Can the crew schedule a Bluesky post for a set time?
Yes, if the key has schedule permission. The writer calls schedule_post with a time and timezone, and the post still waits for approval unless the agent has been promoted.
How does a CrewAI pipeline attach images to a Bluesky post?
Upload each image to /v1/media with its alt text, then pass the returned ids as mediaIds. Keep each file under 1 MB and use at most 4.
Do I need a Bluesky app password?
Yes. Create one in Bluesky under Settings, then App passwords, and paste it when you connect the account. It can be revoked without changing your main password.

Let your agents post. Keep the final say.

Connect your first agent in minutes. Every draft waits in your inbox until you approve it.

14 days free. No card required.

The hosted version is opening soon

Leave your email and we will send one message when hosted accounts open, with your 14-day trial ready. Want it today? Self-host it free from the repo.

Start free trial