AT Protocol MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ATPROTO_PASSWORD | No | Your Bluesky app password | |
| ATPROTO_CLIENT_ID | No | OAuth client ID | |
| ATPROTO_IDENTIFIER | No | Your Bluesky handle (e.g., handle.bsky.social) | |
| ATPROTO_CLIENT_SECRET | No | OAuth client secret |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
| resources | {} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_postA | Create a new post on AT Protocol (Bluesky). The single rich post-creation tool: supports plain text with auto-detected mentions/links/#hashtags, explicit richtext facets, replies, image embeds, a video embed (from upload_video), an external link card, a quote (record) embed, language tags, reply controls (who can reply, via a threadgate record), and quote controls (quote policy, via a postgate record). Requires authentication (app password). SIDE EFFECT: publishes a public post visible to everyone. Subject to per-tool rate limiting. Use create_thread to publish a multi-post chain in one call, and reply_to_post to reply to an existing post; use this tool for a single standalone post (it can also reply via the |
| create_threadA | Create a thread of 2–25 posts in a single operation, automatically chaining each post as a reply to the previous one so readers see them as a continuous conversation. Use this instead of repeated create_post calls when content spans multiple posts; use create_post for a single standalone post or reply_to_post to append to an existing thread. Optional replyControls gate who can reply (a threadgate record on the ROOT post, written after the whole thread is published). Requires authentication (app password). If publishing fails mid-thread, already-published posts are returned with a failedAtPosition indicator so you can delete or resume them. Subject to per-tool rate limiting. |
| reply_to_postA | Reply to an existing post on AT Protocol, creating a threaded reply with proper parent and root CID references. Requires authentication (app password). Creates a new post record linked into the thread; the action cannot be undone (use delete_post to remove it afterwards). Use this instead of create_post whenever the new content belongs inside an existing thread; use create_thread to start a multi-post thread from scratch. Subject to per-tool rate limiting. |
| like_postA | Like a post on AT Protocol by creating a like record that references the target post. If the post is already liked the existing like is returned without creating a duplicate. Requires authentication (app password). Use unlike_post to remove a like. Subject to per-tool rate limiting. |
| unlike_postA | Remove a like from a post on AT Protocol by deleting the like record identified by its AT-URI. This action permanently removes the like and cannot be undone. Requires authentication (app password). Use like_post to add a like. Subject to per-tool rate limiting. |
| repostA | Repost content on AT Protocol. Reposts the identified post to the authenticated user's feed; if optional quote text is supplied, creates a quote post (new post embedding the original) instead. Requires authentication (app password). Deduplicates plain reposts so retrying on timeout is safe; use unrepost to remove a plain repost. Subject to per-tool rate limiting. |
| unrepostA | Remove a repost on AT Protocol. Deletes the repost record owned by the authenticated user, undoing a previous plain repost; this action cannot be undone without re-calling repost. Requires authentication (app password). Use repost to create a repost and this tool only to remove one. Subject to per-tool rate limiting. |
| follow_userA | Follow a user on AT Protocol. Creates a follow record for the specified account; if the account is already followed the existing follow URI is returned without creating a duplicate. Requires authentication (app password). Use unfollow_user to reverse this action; for bulk relationship changes consider batch_action instead. Subject to per-tool rate limiting. |
| unfollow_userA | Unfollow a user on AT Protocol. Deletes the follow record identified by its AT-URI, permanently removing the follow relationship; this action cannot be undone (a new follow_user call is required to re-follow). Requires authentication (app password). Use follow_user to obtain the follow URI before calling this tool; for bulk unfollows consider batch_action. Subject to per-tool rate limiting. |
| get_user_profileA | Retrieve a user profile from AT Protocol, returning handle, display name, bio, avatar, banner, follower/following/post counts, and applied labels. Works without authentication; richer with auth — authenticated calls also return viewer-specific fields (following, followedBy, muted, blocking, blockedBy). Use get_user_summary for a condensed overview or get_user_connections for follower/following lists. Subject to per-tool rate limiting. |
| search_postsA | Search for posts on Bluesky using full-text queries with optional filters for author, language, date range, mentions, domain, and URL. Returns a paginated list of matching posts sorted by recency or engagement. Requires authentication (app password). Use search_actors to find users instead of posts. Subject to per-tool rate limiting. |
| search_actorsA | Search for AT Protocol accounts by handle or display name. Works without authentication; richer with auth. Use this when you know a name but not the exact handle/DID; use get_user_profile when you already have the handle/DID. Subject to per-tool rate limiting. |
| get_author_feedA | Retrieve posts by a specific AT Protocol user. Works without authentication; richer with auth. Lists a specific user's posts. Differs from get_timeline (your home feed) and search_posts (query-based search). Subject to per-tool rate limiting. |
| get_timelineA | Retrieve the user's home timeline from AT Protocol, returning posts from followed accounts and algorithmically recommended content. Requires authentication (app password). Use get_author_feed to retrieve posts from a specific user instead of the authenticated user's own feed. Subject to per-tool rate limiting. |
| get_user_connectionsA | Retrieve an account's followers or follows from AT Protocol. Works without authentication; richer with auth. Use direction='followers' to get who follows the actor or direction='follows' to get who the actor follows; use get_user_profile or get_user_summary for aggregate counts instead. Subject to per-tool rate limiting. |
| get_notificationsA | Retrieve notifications from AT Protocol (likes, reposts, follows, mentions, replies). Requires authentication (app password). Use countOnly: true to fetch only the unread badge count cheaply without loading the full list; use mark_notifications_seen to clear the unread state after processing. Subject to per-tool rate limiting. |
| mark_notifications_seenA | Mark notifications as seen up to a timestamp (defaults to now) so they are not reprocessed on subsequent get_notifications calls. Requires authentication (app password). Persists the seen cursor server-side; use get_notifications to retrieve new notifications after calling this. Subject to per-tool rate limiting. |
| list_conversationsA | List the authenticated user's Bluesky direct-message conversations (chat.bsky.convo.listConvos, proxied to the bsky.chat service). Returns each conversation's id, members, unread count, mute state, status (request/accepted) and a last-message preview, plus a pagination cursor. Requires authentication with an app password created with "Allow access to your direct messages" enabled. Use get_conversation_messages to read a conversation and send_direct_message to reply. Subject to per-tool rate limiting. |
| get_conversation_messagesA | Read the messages of a Bluesky direct-message conversation (chat.bsky.convo.getMessages, proxied to the bsky.chat service), newest first with cursor pagination. Read-only by default: the conversation is only marked read (unread count cleared) when markRead is true. Requires authentication with an app password created with "Allow access to your direct messages" enabled. Use list_conversations to find conversation ids and send_direct_message to reply. Subject to per-tool rate limiting. |
| send_direct_messageA | Send a plain-text Bluesky direct message (chat.bsky.convo.sendMessage, proxied to the bsky.chat service). Target either an existing conversation by convoId, or a recipient by handle/DID via member — the conversation is then resolved (or created) automatically with chat.bsky.convo.getConvoForMembers. Message text is limited to 1000 graphemes / 10000 UTF-8 bytes and is sent without facets (mentions/links appear as plain text). Requires authentication with an app password created with "Allow access to your direct messages" enabled; the recipient's settings must also allow DMs from you. Subject to per-tool rate limiting. |
| delete_postA | Delete a post on AT Protocol. Permanently removes the post from the authenticated user's repository; this action cannot be undone. Use this instead of create_post/reply_to_post when you need to remove existing content. Requires authentication (app password). Subject to per-tool rate limiting. |
| update_profileA | Update user profile on AT Protocol. Modifies the display name, description, avatar, and/or banner of the authenticated account; unspecified fields are preserved from the existing profile. Use upload_image to prepare blob values for avatar or banner before calling this tool. Requires authentication (app password). Subject to per-tool rate limiting. |
| add_bookmarkA | Privately bookmark a post on AT Protocol (app.bsky.bookmark.createBookmark). Bookmarks are private to your account and stored server-side — they are not public records, other users cannot see them, and no bookmark-record URI exists (bookmarks are keyed by the post URI). Only posts can be bookmarked; bookmarking an already-bookmarked post is a no-op. Requires authentication (app password). Use remove_bookmark to remove and get_bookmarks to list. Subject to per-tool rate limiting. |
| remove_bookmarkA | Remove a private bookmark from a post on AT Protocol (app.bsky.bookmark.deleteBookmark). Takes the bookmarked post AT-URI — bookmarks are keyed by post URI, there is no separate bookmark-record URI. Removing a bookmark that does not exist succeeds as a no-op. Requires authentication (app password). Use add_bookmark to add and get_bookmarks to list. Subject to per-tool rate limiting. |
| get_bookmarksA | List the authenticated account's private bookmarks (app.bsky.bookmark.getBookmarks) with cursor pagination. Each entry carries the full bookmarked post view when the post is still viewable, or an unavailableReason (blocked / not_found) when it is not. Requires authentication (app password). Use add_bookmark / remove_bookmark to manage bookmarks. Subject to per-tool rate limiting. |
| mute_userA | Mute a user to hide their content from your feeds and notifications without them knowing. The muted account is not notified. Requires authentication (app password). Use mute_user for a soft, private suppression; use block_user when you need to prevent the target from seeing your content or interacting with you. Subject to per-tool rate limiting. |
| unmute_userA | Unmute a previously muted user to restore their content in your feeds. Reverses an earlier mute_user action without notifying the target. Requires authentication (app password). Use this instead of unblock_user when the account was suppressed via mute rather than block. Subject to per-tool rate limiting. |
| block_userA | Block a user to prevent them from seeing your content and interacting with you. Creates a block record in your repo; the action cannot be undone without calling unblock_user. Requires authentication (app password). Use block_user for mutual visibility restriction; use mute_user for a private, one-sided feed suppression that does not affect the target. Subject to per-tool rate limiting. |
| unblock_userA | Unblock a previously blocked user to restore normal interactions. Deletes the block record from your repo; if the user was not blocked, the operation returns success=false without error. Requires authentication (app password). Use this instead of unmute_user when the account was restricted via block rather than mute. Subject to per-tool rate limiting. |
| report_contentA | Report content that violates community guidelines or terms of service. Submits a moderation report to the network; moderators review it asynchronously and the report cannot be withdrawn once submitted. Requires authentication (app password). Use report_content when you have the AT-URI and CID of the specific post or record; use report_user when reporting an entire account rather than a single piece of content. Subject to per-tool rate limiting. |
| report_userA | Report a user account that violates community guidelines or terms of service. Submits a moderation report targeting the entire account; moderators review it asynchronously and the report cannot be withdrawn once submitted. Requires authentication (app password). Use report_user to flag an account; use report_content when the violation is limited to a specific post or record identified by AT-URI and CID. Subject to per-tool rate limiting. |
| analyze_moderation_statusA | Analyze moderation status of a post or user. Returns content labels, moderation decisions, and personal moderation state (blocks, mutes). Subject can be a DID (for users) or AT-URI (for posts). Works without authentication; richer with auth. Use this tool to evaluate safety before rendering content; use block_user or mute_user to act on the results. Subject to per-tool rate limiting. |
| create_listA | Create a new list for organizing users (curate list) or moderation purposes (mod list). Requires authentication (app password). Creates a permanent list record in the authenticated user's repository; use add_to_list / remove_from_list to manage its members and get_list to inspect them. Subject to per-tool rate limiting. |
| add_to_listA | Add a user to an existing list. Requires authentication (app password). Creates a listitem record in the authenticated user's repository; the actor's handle is resolved to a DID before insertion. Use remove_from_list to undo the addition and get_list to verify membership. Subject to per-tool rate limiting. |
| remove_from_listA | Remove a user from an existing list. Requires authentication (app password). Deletes the listitem record from the authenticated user's repository; the actor's handle is resolved to a DID and the full list is paged through to locate the record. Use add_to_list to re-add a member or get_list to inspect current members. Subject to per-tool rate limiting. |
| get_listA | Get the contents of a list, including all users in the list. Works without authentication; richer with auth. Returns list metadata plus a paginated array of member profiles; use the returned cursor to fetch subsequent pages. Use add_to_list / remove_from_list to modify membership. Subject to per-tool rate limiting. |
| get_custom_feedA | Get posts from a custom algorithm feed. Works without authentication; richer with auth. Returns feed generator metadata and a paginated list of posts; use the returned cursor to fetch subsequent pages. Use get_timeline for the authenticated user's home feed instead. Subject to per-tool rate limiting. |
| upload_imageA | Upload an image file to AT Protocol for use in posts and profiles. Reads a local image file (JPEG, PNG, GIF, WebP, or AVIF; max 1 MB) and uploads it as an AT Protocol blob, returning a blob descriptor and alt text. Pass the returned |
| upload_videoA | Upload a video to Bluesky through the app.bsky.video service (video.bsky.app), which transcodes it for playback and stores the processed blob on your PDS. Reads a local video file (MP4, MOV, or WebM; max 100 MB), checks your account video-upload quota, uploads with a service-auth token, polls processing until it completes, and returns the PROCESSED video blob descriptor — pass the returned |
| generate_link_previewA | Generate a link preview with title, description, and thumbnail for a given URL. Fetches the target page, extracts Open Graph / meta tags, optionally downloads and uploads the og:image thumbnail as an AT Protocol blob, and returns a preview object ready to attach as an external embed to a create_post or create_thread call. Requires authentication (app password). Use this tool before create_post when you want a rich URL card; use upload_image or upload_video for local media instead. Subject to per-tool rate limiting. |
| analyze_accountA | Analyze a single account along one dimension. Requires authentication (app password). Read-only: performs no writes. One account-analysis tool: pick a dimension. For topic/search-based influencer discovery use find_influential_users instead. Subject to per-tool rate limiting. |
| find_influential_usersA | Find influential users in a topic or network by searching recent posts and ranking their authors. Works without authentication; richer with auth. Read-only — produces no side effects. Use this instead of find_similar_users when you want topic-driven discovery of high-reach accounts rather than a specific user's social graph. Subject to per-tool rate limiting. |
| discoverA | Surface content from your own home timeline. Requires authentication (app password). Read-only: performs no writes. Two timeline-driven discovery modes. For finding accounts similar to a given user use find_similar_users; for topic-based communities use discover_communities. Subject to per-tool rate limiting. |
| find_similar_usersA | Find users similar to a given user based on shared follow-graph connections (second-degree follows and accounts that follow the base user) and follower/following-ratio similarity. Content-topic similarity is NOT analyzed. Works without authentication; richer with auth. Use this instead of search_actors when you want accounts structurally similar to a known user rather than keyword matches. Subject to per-tool rate limiting. |
| discover_communitiesA | Discover communities and groups of users around specific topics or interests by searching recent posts and clustering authors who interact with each other. Works without authentication; richer with auth. Use this instead of find_similar_users when you want topic-based community clusters rather than accounts structurally similar to a specific user. Subject to per-tool rate limiting. |
| search_starter_packsA | Search for Bluesky starter packs by keyword (app.bsky.graph.searchStarterPacks). Returns a paginated list of matching packs with name, description, creator, member count, and joined counts. Works without authentication. Use get_starter_pack to fetch full details (member sample, feeds, list info) for a specific pack. Subject to per-tool rate limiting. |
| get_starter_packA | Fetch a Bluesky starter pack (app.bsky.graph.getStarterPack) by AT-URI or bsky.app link, returning its name, description, creator, reference-list info, a sample of member profiles, included feeds, and joined counts. Works without authentication. Use search_starter_packs to discover packs by keyword, and get_list to page through the full member list. Subject to per-tool rate limiting. |
| batch_actionA | Batch the same action across up to 25 targets in one call. Supported actions: follow (handles/DIDs), like (AT-URIs), repost (AT-URIs). Requires authentication (app password). Performs real writes (follows/likes/reposts) to the network on the caller's behalf. Subject to per-tool rate limiting. |
| get_user_summaryA | Get comprehensive user information in a single call, combining profile, recent posts, and engagement statistics. Works without authentication; richer with auth. Use get_user_profile for just the profile or get_author_feed for posts alone; use this tool when you need both in one round-trip. Subject to per-tool rate limiting. |
| get_post_contextA | Get comprehensive post information in a single call. Single post reader: use include* flags for thread, author, engagement, and media. Replaces the former get_thread and extract_media_from_post tools. Works without authentication; richer with auth. Subject to per-tool rate limiting. |
| analyze_imageA | Analyze an image blob's metadata (MIME type, file size in bytes/KB/MB, derived format, and whether it is within optimized-size thresholds) and optionally return human-readable optimization and accessibility suggestions. Does not decode the image, so it cannot report pixel dimensions or aspect ratio. No authentication required. Use upload_image to obtain the blob reference first, then pass it here; prefer this tool over upload_image for pre-flight size checks before actually posting. Subject to per-tool rate limiting. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| content_composition | Generate engaging social media post content with proper formatting and hashtags. Pure text template; works without authentication. |
| reply_template | Generate thoughtful reply templates for different types of posts. Pure text template; works without authentication. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| User Timeline | Current user's timeline feed with recent posts. Requires authentication. |
| User Profile | Current user's profile information and statistics. Requires authentication. |
| User Notifications | Current user's recent notifications and mentions. Requires authentication. |
Latest Blog Posts
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/cameronrye/atproto-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server