Search posts, profiles, feeds, threads, and trending topics on Bluesky.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Search posts, profiles, feeds, threads, and trending topics on Bluesky via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://bluesky.caseyjhand.com/mcp
Seven tools for read-only access to the public Bluesky/AT Protocol AppView β no authentication required:
| Tool | Description |
|---|---|
bsky_search_posts | Full-text search across public Bluesky posts, with author, language, tag, date, and sort filters |
bsky_get_profile | Fetch a Bluesky actor's public profile by handle or DID β the handleβDID resolver |
bsky_get_author_feed | A user's recent posts ordered newest-first, filterable by post type |
bsky_get_post_thread | Fetch the conversation for a post by AT-URI β parent chain upward and reply tree downward, with what Bluesky counted but did not return |
bsky_search_actors | Find Bluesky accounts by name or handle fragment |
bsky_get_follows | Paginated social graph edges β who a user follows or who follows them |
bsky_get_trending | Real-time trending topics on Bluesky with post count, category, status, and the accounts driving each topic |
bsky_search_postsFull-text search across public Bluesky posts.
since/until), and sort order (top or latest)Status: 400hitsTotal when available, reported as the bound it is β Bluesky caps the count at 10,000, so exactly 10,000 means "at least 10,000" and both the field description and the rendered header say sotruncated, shown, cap, and guidance) in both structuredContent and the content[] trailer when more posts match than came back. A returned cursor alone does not trigger it β Bluesky sends one on every non-empty response, exhausted or not, so hitsTotal is what settles whether the page was cut shortimages (also covers app.bsky.embed.gallery), external (link cards), record (quoted posts), video, unknownembeds, so a quote of an image post is not reduced to a line of text, alongside media for anything the quoting post attached beside the quote. The rendered output names which post each block belongs to, since the two belong to different accountsomittedEmbeds and says so in the rendered text, so it never reads as a quote that had nonerecordKind naming the case, instead of arriving as an empty quotebsky_get_profileFetch a Bluesky actor's public profile by handle or DID.
website is the one link a profile carries in a field of its own rather than inside the bio; both it and pronouns are absent for accounts that set neitherbsky_get_author_feedA user's recent feed ordered newest-first β their own posts and their reposts.
posts_with_replies, posts_no_replies (excludes replies), posts_with_media, or posts_and_author_threads. None of them exclude reposts β the AppView has no repost filterrepostedBy and repostedAt; author always names whoever wrote the postlimit counts reposts too, a page from an account that reposts heavily holds far fewer of that account's own posts than the limit suggests β 30 items from one such account came back as 10 originals and 20 reposts. The response reports originalPosts and reposts whenever a repost is present, so the yield is stated rather than reconstructed by countingbsky_get_post_threadFetch the conversation for a post by AT-URI.
depth (reply tree depth, default 6, max 10 β Bluesky returns no more than 10 levels however deep the request) and parent_height (parent chain height, default 80, max 100)replyCount carries truncated: true with unreturnedReplies and a truncationReason: "depth" (the tree ends there β fetch that node's AT-URI as its own thread to continue) or "unavailable" (no request closes the gap). The response totals the difference for the whole threadparent_height and gives no signal that it did, so the topmost post returned would otherwise be indistinguishable from the start of the conversation. When it is not, that node carries parentChainTruncated: true and the response names its AT-URI β unlike the reply shortfall this one is fully recoverable, since parent_height is honored level for level and fetching that node as its own thread walks further up### β³2 Name (@handle) β two levels below the top-level reply it descends from) rather than a left margin, so a nested reply stays readable markdown. Indenting instead would push every line below the second level past four spaces, which renders the whole nested half of a thread as a code block. The number is stated rather than repeated as a glyph, since a reply can sit nine levels down and a run of nine arrows has to be counted to be readnotFound: true and posts hidden by a block as blocked: true; both keep the AT-URI Bluesky reportedbsky_search_posts or bsky_get_author_feedbsky_get_followsFetch social graph edges for an account.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/bluesky-mcp-server)<a href="https://allmcps.com/mcp/bluesky-mcp-server"><img src="https://allmcps.com/api/badge/bluesky-mcp-server?style=directory" alt="Bluesky MCP Server on AllMCPs" /></a>