cyanheads avatar

Bluesky Mcp Server

cyanheads/bluesky-mcp-server

A read-only window into Bluesky's AT Protocol AppView that needs no authentication. You get seven tools covering full-text post search with filters for author, language, hashtags, and date range, plus profile lookups, author feeds, complete thread trees with parent chains and reply depth control, actor search, social graph traversal for followers and following lists, and real-time trending topics. Built on the developer's mcp-ts-core framework, so it includes retry logic, structured logging, and runs over both stdio and streamable HTTP transports. The public instance at bluesky.caseyjhand.com/mcp is ready to use, or run it locally via npx. Useful when you need to pull Bluesky data into Claude without managing OAuth flows or API credentials.

GitHub stars
2
tools
10
auth
Secret needed
transport
STDIO, HTTP
env vars
9
last updated
Nov 11, 2026

Install

From registry metadata
$ npx add-mcp https://bluesky.caseyjhand.com/mcp --name bluesky

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http bluesky https://bluesky.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 10 tools

Verified live against the running server on Nov 6, 2026.

bsky_get_profileFetch a Bluesky actor's public profile by handle (e.g. "bsky.app") or DID (e.g. "did:plc:z72i7hdynmk6r22z27h6tvur"). Returns displayName, handle, DID, bio, pronouns, website, ordered profile links, follower/following/post counts, associated list/feed/starter-pack counts and la...1 params

Fetch a Bluesky actor's public profile by handle (e.g. "bsky.app") or DID (e.g. "did:plc:z72i7hdynmk6r22z27h6tvur"). Returns displayName, handle, DID, bio, pronouns, website, ordered profile links, follower/following/post counts, associated list/feed/starter-pack counts and la...

Parameters* required
actor*string
Handle (e.g. "bsky.app", "alice.bsky.social") or DID (e.g. "did:plc:z72i7hdynmk6r22z27h6tvur") of the actor to look up. A leading "@" ("@bsky.app") and the account's bsky.app page ("https://bsky.ap...
bsky_search_actorsFind Bluesky accounts by name or handle fragment. Returns ranked profiles with handle, DID, displayName, bio, account creation timestamp, moderation labels with provenance, pronouns when the account set them, and Bluesky verification status — which tells a verified account fro...3 params

Find Bluesky accounts by name or handle fragment. Returns ranked profiles with handle, DID, displayName, bio, account creation timestamp, moderation labels with provenance, pronouns when the account set them, and Bluesky verification status — which tells a verified account fro...

Parameters* required
cursorstring
Opaque pagination cursor from a previous response to the same query. Omit for the first page.
limitinteger
Maximum number of actors to return. Default 25; values above 100 are clamped with a notice unless read-limit clamping is disabled.default: 25
query*string
Name or handle fragment to search for, e.g. "alice" or "nytimes.com". Must not be blank.
bsky_get_trendingFetch the current real-time trending topics on Bluesky. Returns topics with display name, Bluesky's one-sentence summary of the story, post count, category (politics, sports, pop-culture, etc.), status, start time, and the representative accounts driving each topic — so "who i...1 params

Fetch the current real-time trending topics on Bluesky. Returns topics with display name, Bluesky's one-sentence summary of the story, post count, category (politics, sports, pop-culture, etc.), status, start time, and the representative accounts driving each topic — so "who i...

Parameters* required
limitinteger
Maximum number of trending topics to return. Default 10. Values above Bluesky's maximum of 25 are clamped with notice unless strict limits are configured.default: 10
bsky_search_feedsSearch metadata in the provider’s public feed catalog, without credentials. This searches feed names and descriptions, not post text, and does not enumerate every feed. Returns feeds in provider order with generator AT-URIs and creator identities; pass a feedUri to bsky_get_fe...3 params

Search metadata in the provider’s public feed catalog, without credentials. This searches feed names and descriptions, not post text, and does not enumerate every feed. Returns feeds in provider order with generator AT-URIs and creator identities; pass a feedUri to bsky_get_fe...

Parameters* required
cursorstring
Opaque cursor from a previous response to this same query. Omit for the first page.
limitinteger
Maximum feeds to return. Default 25; values above 100 are clamped with a notice unless read-limit clamping is disabled.default: 25
query*string
Feed catalog metadata to search, e.g. "science". Must not be blank.
bsky_get_feedRead the posts a Bluesky feed generator serves, in the order the feed ranks them. Accepts the feed's AT-URI (at://<handle-or-did>/app.bsky.feed.generator/<rkey>) or its bsky.app page (https://bsky.app/profile/<handle-or-did>/feed/<rkey>). Feeds come from the "feedUri" of each...3 params

Read the posts a Bluesky feed generator serves, in the order the feed ranks them. Accepts the feed's AT-URI (at://<handle-or-did>/app.bsky.feed.generator/<rkey>) or its bsky.app page (https://bsky.app/profile/<handle-or-did>/feed/<rkey>). Feeds come from the "feedUri" of each...

Parameters* required
cursorstring
Opaque pagination cursor from a previous response of the same feed. Omit for the first page.
feed*string
The feed to read — its AT-URI, e.g. "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot", or its bsky.app URL, e.g. "https://bsky.app/profile/bsky.app/feed/whats-hot"; a traili...
limitinteger
Maximum number of posts to return. Default 25; values above 100 are clamped with a notice unless read-limit clamping is disabled. A feed may return fewer than the limit on a page that still has mor...default: 25
bsky_get_author_feedGet a Bluesky user's recent feed ordered newest-first. Filter by post type: "posts_with_replies" (everything), "posts_no_replies" (excludes replies), "posts_and_author_threads" (posts the author started), "posts_with_media" (the actor's own posts with images or video — no link...5 params

Get a Bluesky user's recent feed ordered newest-first. Filter by post type: "posts_with_replies" (everything), "posts_no_replies" (excludes replies), "posts_and_author_threads" (posts the author started), "posts_with_media" (the actor's own posts with images or video — no link...

Parameters* required
actor*string
Handle (e.g. "alice.bsky.social") or DID of the author whose feed to fetch. A leading "@" and the account's bsky.app page ("https://bsky.app/profile/alice.bsky.social") are accepted and read as the...
cursorstring
Opaque pagination cursor from a previous response for the same actor, passed back unchanged. Omit for the first page.
filterstring
Filter for post types: "posts_no_replies" excludes replies, "posts_with_replies" for everything, "posts_and_author_threads" for threads the author started — all three include reposts, so check "rep...one of posts_with_replies · posts_no_replies · posts_with_media · posts_and_author_threads · posts_with_videodefault: posts_no_replies
include_pinsboolean
Also return the post pinned to the actor's profile, marked "pinned: true", first on the first page. It arrives in addition to "limit", whether or not it matches "filter", and is not repeated on lat...default: false
limitinteger
Maximum number of posts to return. Default 25; values above 100 are clamped with a notice unless read-limit clamping is disabled. A page that would pass the 48,000-byte response budget comes back w...default: 25
bsky_get_post_threadFetch the conversation for a post by AT-URI — the parent chain upward and the reply tree downward. Enter the thread at any point and traverse the discussion. AT-URIs have the format "at://<handle-or-did>/<collection>/<rkey>" and are returned in the "uri" field of every post th...3 params

Fetch the conversation for a post by AT-URI — the parent chain upward and the reply tree downward. Enter the thread at any point and traverse the discussion. AT-URIs have the format "at://<handle-or-did>/<collection>/<rkey>" and are returned in the "uri" field of every post th...

Parameters* required
depthinteger
How many levels of replies to include below the target post. Default 6; values above 10 are clamped with notice unless strict limits are configured — Bluesky itself returns no more than 10 levels h...default: 6
parent_heightinteger
How many parent posts to include in the parent chain above the target post. Default 80; values above 100 are clamped with notice unless strict limits are configured. The chain is returned level for...default: 80
uri*string
AT-URI of the post to fetch, e.g. "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/abc123". All three segments are required — authority (handle or DID), collection, and record key. Obtain...
bsky_get_post_quotesRead the quote posts behind a Bluesky post's "quoteCount" — the posts that embed it with commentary of their own. Sort latest (default) is newest first; top is descending like count as ordered by Bluesky. On Bluesky this is where much of the reaction to a post lives; bsky_get_...4 params

Read the quote posts behind a Bluesky post's "quoteCount" — the posts that embed it with commentary of their own. Sort latest (default) is newest first; top is descending like count as ordered by Bluesky. On Bluesky this is where much of the reaction to a post lives; bsky_get_...

Parameters* required
cursorstring
Opaque pagination cursor from a previous response for the same post and sort, passed back unchanged. Omit for the first page.
limitinteger
Maximum number of quote posts to return; values above 100 are clamped with notice unless strict limits are configured. Default 25. Pages often hold fewer than the limit and still continue — follow...default: 25
sortstring
Provider ordering: latest is newest first (default); top is descending like count. Reuse cursors with the same post and sort.one of latest · topdefault: latest
uri*string
The post whose quotes to read — its AT-URI, e.g. "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3l6oveex3ii2l", or its bsky.app URL, e.g. "https://bsky.app/profile/bsky.app/post/3l6oveex...
bsky_get_post_interactionsList the accounts behind a post’s likes or reposts without credentials, in provider order. Accepts a post AT-URI or bsky.app post URL; a handle authority costs one extra resolution request. Returns actor summaries with account creation and label provenance when supplied, and a...4 params

List the accounts behind a post’s likes or reposts without credentials, in provider order. Accepts a post AT-URI or bsky.app post URL; a handle authority costs one extra resolution request. Returns actor summaries with account creation and label provenance when supplied, and a...

Parameters* required
cursorstring
Opaque cursor from the previous response for the same post and kind. Pass unchanged; omit for the first page.
kind*string
Interaction to list: likes includes likedAt; reposts has no interaction timestamp.one of likes · reposts
limitinteger
Maximum accounts per page, default 25. Values above 100 are clamped with a notice unless read-limit clamping is disabled.default: 25
uri*string
Post AT-URI or https://bsky.app/profile/<handle-or-did>/post/<rkey> URL. URL trailing slash, query, and fragment are accepted. Feed, profile, and list references are rejected.
bsky_get_followsFetch the social graph edges for a Bluesky account — who follows them, or who they follow. Returns paginated actor profiles (handle, DID, displayName, bio, account creation timestamp, moderation labels with provenance, pronouns when set, and Bluesky verification status) plus a...5 params

Fetch the social graph edges for a Bluesky account — who follows them, or who they follow. Returns paginated actor profiles (handle, DID, displayName, bio, account creation timestamp, moderation labels with provenance, pronouns when set, and Bluesky verification status) plus a...

Parameters* required
actor*string
Handle (e.g. "alice.bsky.social") or DID of the account to query. A leading "@" and the account's bsky.app page ("https://bsky.app/profile/alice.bsky.social") are accepted and read as the handle or...
cursorstring
Opaque pagination cursor from a previous response. Omit for the first page.
direction*string
"followers" returns accounts that follow this actor. "following" returns accounts this actor follows.one of followers · following
limitinteger
Maximum number of actors to return per page. Default 25; values above 100 are clamped with a notice unless read-limit clamping is disabled.default: 25
sortstring
Order of the list. "latest" (Bluesky's default, and what omitting this gives) puts the most recent follows first; "top" is Bluesky's own ranking, which surfaces prominent accounts but is not a foll...one of latest · top

Sponsors

Configuration

BLUESKY_CLAMP_READ_LIMITSdefault: true

Clamp oversized read limits with a notice; false restores rejection.

BLUESKY_IDENTIFIER

Handle, DID, or email of the Bluesky account post search runs as. Optional: without it and BLUESKY_APP_PASSWORD, bsky_search_posts is not offered, since Bluesky refuses search without a signed-in account. Use a dedicated account — search leaves out posts from accounts in a block

BLUESKY_APP_PASSWORDsecret

App password for BLUESKY_IDENTIFIER (a standard, non-privileged one — Settings → Privacy and security → App passwords). Optional; required together with BLUESKY_IDENTIFIER to enable bsky_search_posts.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/bluesky-mcp-server

Search Bluesky posts and feeds; read profiles, threads, and trends. STDIO or Streamable HTTP.

12 Tools • 1 Profile Resource • 1 Guide

Version License Docker MCP SDK npm TypeScript Bun


View the full README on GitHub

Details

Repository
github.com/cyanheads/bluesky-mcp-server
Category
Search & Web Crawling
Package
@cyanheads/bluesky-mcp-server
Transport
STDIO, HTTP
Auth
Required
Registry
MCP registry, active
Resources
2
Tools verified
Nov 6, 2026

More from cyanheads

Related Search & Web Crawling MCP servers

View all
1cyanheads avatarEpa Mcp Servercyanheads/epa-mcp-serverSearch EPA compliance, TRI, Superfund, drinking-water, EJScreen, and AirNow data.2stars
2cyanheads avatarFbi Crime Mcp Servercyanheads/fbi-crime-mcp-serverFBI Crime Data Explorer — offense rates, hate crime, arrests, NIBRS, LEOKA stats, agency search.2stars
3cyanheads avatarFederal Regulations Mcp Servercyanheads/federal-regulations-mcp-serverSearch and trace US federal rules across the Federal Register, eCFR, and Regulations.gov.2stars
4cyanheads avatarOpenfoodfacts Mcp Servercyanheads/openfoodfacts-mcp-serverBarcode lookup, nutrition search, and product comparison for 3M+ crowd-sourced food products.2stars
5cyanheads avatarReliefweb Mcp Servercyanheads/reliefweb-mcp-serverSearch ReliefWeb humanitarian reports, disasters, jobs, training, and country profiles via MCP.2stars
6cyanheads avatarSmithsonian Mcp Servercyanheads/smithsonian-mcp-serverSearch 14.5M Smithsonian Open Access objects, get CC0 images, find cross-collection connections.2stars