Bluesky MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BLUESKY_ACCOUNTS | No | JSON array, for several accounts | |
| BLUESKY_AUDIT_LOG | No | Append-only log of every attempted write | |
| BLUESKY_HTTP_HOST | No | For `--http` | 127.0.0.1 |
| BLUESKY_HTTP_PORT | No | For `--http` | 8787 |
| BLUESKY_READ_ONLY | No | Hide every write from the tool list | 0 |
| BLUESKY_HTTP_TOKEN | No | Bearer token required by `--http` | |
| BLUESKY_IDENTIFIER | No | Your full handle | |
| BLUESKY_PUBLIC_API | No | Public appview | https://public.api.bsky.app |
| BLUESKY_MAX_RETRIES | No | Retries on 429 and 5xx | 3 |
| BLUESKY_SERVICE_URL | No | Your PDS | https://bsky.social |
| BLUESKY_APP_PASSWORD | No | An app password, never your account password | |
| BLUESKY_VIDEO_SERVICE | No | Video transcoding service | https://video.bsky.app |
| BLUESKY_DEFAULT_ACCOUNT | No | Which handle acts when a tool names none | first configured |
| BLUESKY_ALLOW_DESTRUCTIVE | No | `0` blocks posting, deleting and blocking | 1 |
| BLUESKY_REQUEST_TIMEOUT_MS | No | Per-request deadline | 30000 |
| BLUESKY_MIN_REQUEST_INTERVAL_MS | No | Spacing between requests | 120 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_accountsA | List every Bluesky account this server can act as. Use the handle from here as the |
| whoamiA | Authenticate and return the live profile for a connected account, including follower counts. Use this to confirm credentials work, or when the user says 'me' or 'my' and you need their handle and DID. |
| get_video_job_statusA | Check a Bluesky video transcoding job by id. Only needed when create_post reported that a video was still processing when it gave up waiting. The job usually finishes on its own, and the id is in that message. |
| create_postA | Publish a post. Handles plain text, up to four images with alt text, a video, a link card, a quote, and replies. URLs, #hashtags and @mentions in the text are turned into real links automatically. You do not need to format them. The limit is 300 characters; for anything longer use create_thread. Public the moment it runs, so it needs confirm: true. |
| create_threadA | Publish several posts as one thread, each replying to the last. Every part is checked against the 300-character limit before anything is posted, so a thread never half-publishes because part four was too long. Media, quotes and reply controls apply to the first post. Public the moment it runs, so it needs confirm: true. |
| delete_postA | Delete one of your own posts. This cannot be undone, and it does not remove the post from feeds and caches that already have it. Needs confirm: true. |
| get_post_threadA | Read a post together with the conversation around it: everything above it and the replies below. Accepts an at:// URI or a bsky.app link. Use this before replying, so the reply lands with context. |
| like_postA | Like a post. Accepts an at:// URI or a bsky.app link. Liking twice is harmless: the existing like is returned rather than a second one created. |
| unlike_postA | Remove your like from a post. Finds your own like record from the post's viewer state, so you only need the post, not the like. |
| repostA | Repost a post to your followers. Reposting twice is harmless. To add your own comment instead, use create_post with |
| unrepostA | Remove your repost of a post. |
| followA | Follow an account by handle or DID. Following twice is harmless. |
| unfollowA | Stop following an account. Finds your own follow record from the profile's viewer state, so you only need the handle. |
| mute_accountA | Hide an account's posts from your feeds without them knowing. Private and reversible. Unlike a block, they can still see and reply to you. |
| unmute_accountA | Stop hiding an account's posts. |
| block_accountA | Block an account. This is visible to them and severs the relationship in both directions: it removes any follow either way, and hides your posts from them. Reversible with unblock_account, but the follows do not come back. Needs confirm: true. |
| unblock_accountA | Remove a block. Any follows the block severed do not come back. Both sides have to follow again. |
| set_reply_permissionsA | Change who is allowed to reply to one of your existing posts, after it is already published. Also lets you hide specific replies from the thread. This is the main tool for a post that is going badly. |
| get_timelineA | Your following feed, newest first. Pass since_hours to read a time window rather than a fixed number of posts. Requires a connected account. |
| get_author_feedA | Posts by one account, newest first. Works for anyone, with or without credentials. Use filter to separate original posts from replies and reposts: 'posts_no_replies' is what you want when studying how someone writes. |
| get_liked_postsA | Posts a connected account has liked, newest first. Only works for your own accounts, because Bluesky does not expose anyone else's likes as a feed. |
| get_post_likesA | The accounts that liked a specific post, newest first. |
| get_reposted_byB | The accounts that reposted a specific post. |
| get_quotesA | Posts that quote a specific post. This is where the argument about a post usually lives: quotes carry commentary, reposts do not. |
| search_postsA | Full-text search across public posts. Supports Bluesky's search operators: from:handle, to:handle, mentions:handle, domain:example.com, since:YYYY-MM-DD, until:YYYY-MM-DD, lang:en, and "quoted phrases". Requires a connected account. Bluesky's public API refuses this endpoint. |
| search_actorsA | Find Bluesky accounts by name, handle or bio text. Works without credentials. Returns each account's bio and follower counts, so you can tell the real one from the impersonators. |
| search_feedsA | Find custom feeds, meaning the algorithmic feeds anyone on Bluesky can publish. Pass a feed's URI to get_feed to read it. Works without credentials. |
| get_feedA | Read posts from a custom feed by its at:// URI or bsky.app link. Find one with search_feeds, or your own with get_pinned_feeds. |
| get_pinned_feedsA | The feeds and lists pinned to a connected account's home screen, in order. Pass any of the returned URIs to get_feed or get_list_posts. |
| get_list_postsA | Posts from the accounts on a curated list, newest first. Take the list URI from get_pinned_feeds or a bsky.app /lists/ link. |
| get_trendsA | Current trending topics on Bluesky, each with the feed link that shows the posts behind it. Works without credentials. |
| get_suggested_followsA | Accounts Bluesky suggests following. With an |
| get_profileA | Full profile for one or more accounts: bio, follower counts, labels, and, when a connected account is available, whether you follow them and whether they follow you. Works without credentials. |
| get_followersA | Accounts that follow a given account, newest first. Pages automatically past Bluesky's 100 ceiling. |
| get_followsB | Accounts a given account follows. Pages automatically. |
| get_relationshipsA | For each account named, whether a connected account follows them and whether they follow back. One call for a whole list. Use this before a bulk follow or unfollow rather than reading a profile each time. |
| get_listsA | Curated lists an account has created. Pass a returned URI to get_list_posts to read the feed, or get_list_members to see who is on it. |
| get_list_membersC | The accounts on a curated list. |
| get_notificationsA | Your likes, reposts, follows, mentions, replies and quotes, newest first. Filter by reason to get just the ones that need an answer: 'mention' and 'reply' are the ones a person actually has to deal with. |
| get_unread_countA | How many notifications have arrived since you last marked them seen. One cheap call, worth making before you pull the full list. |
| mark_notifications_seenA | Mark every notification up to now as seen, so the unread count resets. Affects only your own view, and nobody else can tell. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| catch-up | Summarise what happened on Bluesky while you were away |
| draft-thread | Turn an idea into a Bluesky thread, without posting it |
| study-account | Work out how an account gets engagement |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| bluesky-accounts | |
| bluesky-concepts | |
| bluesky-output-format |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/navidmoazzez/bluesky-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server