MCP (streamable HTTP) · Bluesky

Post to Bluesky from Gemini CLI, with approval

Gemini CLI lives in the terminal, next to git, your build scripts, and your release tooling. Add SocialHandoff as an MCP server in settings.json and it can read a git log or a notes file and draft a Bluesky post, all without leaving the shell. You can also run it non-interactively from a script, and the result is still only a draft. You approve, edit, or reject every post before it goes out.

Prompt

Read git log --oneline v0.8.0..HEAD and draft a Bluesky post announcing v0.9.0 of our terminal markdown previewer. Pick the two most user-visible changes. Include the install command brew install mdpeek and the link github.com/acme/mdpeek.

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. Edit settings.json In ~/.gemini/settings.json, add an mcpServers entry with httpUrl set to https://app.socialhandoff.com/mcp and a headers object carrying the Bluesky key as a bearer token.
  3. Check the connection Start gemini and run /mcp. The server should be listed as connected with its tools.
  4. Draft from the terminal Ask Gemini CLI to read the release notes or git log and draft a Bluesky post. It calls draft_post and the post appears in your approval inbox.

Example draft

mdpeek v0.9.0: tables now render with aligned columns, and --watch reloads the preview when you save.

brew install mdpeek
github.com/acme/mdpeek

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.
  • Gemini CLI reads settings.json at startup. If /mcp shows the server as disconnected, check the httpUrl and that the bearer header uses the Bluesky key.
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 Gemini CLI run this non-interactively?
Yes. Pass a prompt to gemini in non-interactive mode from a script. The result is still only a draft, so an unattended run cannot publish.
Will Gemini CLI 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.
Does it support custom domain handles on Bluesky?
Yes. Connect with whatever handle you sign in with, including a domain handle. Mentions of other handles become clickable facets on publish.

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