MCP (streamable HTTP) · Bluesky

Post to Bluesky from Cursor, with approval

Developer relations work often starts in the editor: you finish a feature and want to show it before the context fades. Cursor can do that without a tab switch. Its agent reads the code you just wrote and, through SocialHandoff's MCP server, drafts a Bluesky post or short thread with a code-sized tip that fits the 300-grapheme limit. The post waits in your approval inbox; it never publishes on its own.

Prompt

I just added a --dry-run flag to our deploy CLI in src/commands/deploy.ts. Draft a Bluesky post for developers showing the flag in one line of usage, what it prints, and a link to docs.example.dev/cli/deploy. Keep it under 260 graphemes.

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. Add the server to mcp.json In .cursor/mcp.json, add a server with url https://app.socialhandoff.com/mcp and a headers block carrying Authorization: Bearer and the Bluesky key. Keep the key in an environment variable, not in git.
  3. Confirm it in settings Open Cursor settings, then MCP, and check the server shows a green status with draft_post and schedule_post listed.
  4. Draft from the editor In agent chat, ask Cursor to turn the feature you just finished into a Bluesky post. It drafts, you approve in the inbox.

Example draft

New in the deploy CLI: --dry-run. It prints every resource it would create, change, or delete, then exits without touching anything.

deploy --dry-run --env staging

Docs: docs.example.dev/cli/deploy

Gotchas

  • The 300 limit counts graphemes, so an emoji or accented letter counts as one. Anything longer should become a reply-chain thread, not a clipped post.
  • 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.
  • Cursor reads .cursor/mcp.json from the project. If you commit that file, reference the key through an environment variable so it never lands in git.
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 Cursor post to Bluesky without me leaving the editor?
It can draft and schedule without you leaving. Approval happens in the inbox, which you can keep open in a browser tab or on your phone.
Will Cursor link to my repo correctly on Bluesky?
Yes. Write the plain URL and it becomes a clickable link facet when the post publishes. The same happens for @handles and #tags.
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