
Bluesky MCP
- 1 repo stars
- Updated July 31, 2026
- cyanheads/bluesky-mcp-server
Search posts, profiles, feeds, threads, and trending topics on Bluesky.
About
Search posts, profiles, feeds, threads, and trending topics on Bluesky. Exposes 7 MCP tools including io.github.cyanheads/bluesky-mcp-server, MCP_LOG_LEVEL, | Tool | Description |, |. Search posts, profiles, feeds, threads, and trending topics on Bluesky. Search posts, profiles, feeds, threads, and trending topics on Bluesky. "name": "io.github.cyanheads/bluesky-mcp-server", Install via Claude Desktop, Cursor, or any MCP-compatible client using the server manifest from the upstream repository.
- Search posts, profiles, feeds, threads, and trending topics on Bluesky.
- 7 registered MCP tools for structured agent access.
- Category: Communication with launch/distribution journey placement.
- Compatible with Claude Desktop, Cursor, and MCP clients.
- Upstream manifest: bluesky-mcp-server.
Bluesky MCP by the numbers
- Exposes 7 verified tools (MCP introspection)
- Data as of Aug 10, 2026 (Skillselion catalog sync)
claude mcp add --env MCP_LOG_LEVEL=YOUR_MCP_LOG_LEVEL bluesky-mcp-server -- npx -y @cyanheads/bluesky-mcp-server runAdd your badge
Show developers this MCP server is listed on Skillselion. Paste this into your README.
| repo stars | ★ 1 |
|---|---|
| Package | @cyanheads/bluesky-mcp-server |
| Transport | STDIO, HTTP |
| Auth | None |
| Tools | 7 |
| Last updated | July 31, 2026 |
| Repository | cyanheads/bluesky-mcp-server ↗ |
How do I connect Bluesky Mcp Server to my MCP client?
Search posts, profiles, feeds, threads, and trending topics on Bluesky.
Who is it for?
Teams wiring Bluesky Mcp Server into Claude, Cursor, or custom agents for communication.
Skip if: Skip when you need a non-MCP SDK or hosted API without stdio/SSE transport.
What you get
Working Bluesky Mcp Server MCP server with verified tool registration and client config.
- Search results for Bluesky posts, profiles, feeds, and threads in agent sessions
- Trending topic snapshots to inform launch copy and engagement lists
By the numbers
- [object Object]
Bluesky Mcp Server capabilities & compatibility
- Capabilities
- bluesky mcp server mcp tool registration · bluesky mcp server client configuration · bluesky mcp server agent workflow integration
- Use cases
- Runs
- Runs locally
What Bluesky Mcp Server says it does
Search posts, profiles, feeds, threads, and trending topics on Bluesky.
Tools 7
Public tool metadata - what this server can do for an agent.
bsky_get_profile1 paramFetch a Bluesky actor's public profile by handle (e.g. "bsky.app") or DID (e.g. "did:plc:z72i7hdynmk6r22z27h6tvur"). Returns displayName, handle, DID, bio, follower/following/post counts, avatar URL, moderation labels, and pinned post AT-URI. Use this as the first step to resolve a handle to a DID before calling tools that require a DID or AT-URI. Handles and DIDs are interchangeable as input.
actorstringrequiredHandle (e.g. "bsky.app", "alice.bsky.social") or DID (e.g. "did:plc:z72i7hdynmk6r22z27h6tvur") of the actor to look up.
bsky_search_actors3 paramsFind Bluesky accounts by name or handle fragment. Returns ranked profiles with handle, DID, displayName, bio, and follower count. Use before bsky_get_profile or bsky_get_author_feed when you have a name but not a confirmed handle. Supports cursor-based pagination for browsing beyond the first page of results.
querystringrequiredName or handle fragment to search for, e.g. "alice" or "nytimes.com".limitintegerMaximum number of actors to return (1–100). Default 25.cursorstringOpaque pagination cursor from a previous response. Note: the public Bluesky AppView restricts cursor-based search pagination for unauthenticated requests — passing a cursor may return a 403 error. Cursor pagination is reliable only for bsky_get_author_feed and bsky_get_follows.
bsky_get_trending1 paramFetch the current real-time trending topics on Bluesky. Returns topics with display name, post count, category (politics, sports, pop-culture, etc.), status (hot/rising), and start time. Entry point for "what is Bluesky talking about right now". Pair with bsky_search_posts to drill into any trending topic. Note: uses the app.bsky.unspecced.getTrends endpoint, which is not part of Bluesky's stable lexicon and may change without notice.
limitintegerMaximum number of trending topics to return (1–25). Default 10.
bsky_get_author_feed4 paramsGet a Bluesky user's recent posts ordered newest-first. Filter by post type: "posts_with_replies" (everything), "posts_no_replies" (original posts only), "posts_with_media" (posts with images or links), or "posts_and_author_threads" (posts the author started). Returns posts with full text, engagement counts, embeds, and AT-URIs for drilling into threads via bsky_get_post_thread. Supports cursor pagination.
actorstringrequiredHandle (e.g. "alice.bsky.social") or DID of the author whose feed to fetch.filterstringFilter for post types: "posts_no_replies" for original posts only, "posts_with_replies" for everything, "posts_with_media" for posts with images/links, "posts_and_author_threads" for threads the author started.limitintegerMaximum number of posts to return (1–100). Default 25.cursorstringOpaque pagination cursor from a previous response. Omit for the first page.
bsky_search_posts9 paramsFull-text search across public Bluesky posts. Filters by author (handle or DID), language (BCP-47 code, e.g. "en"), hashtag (without the # prefix), date range (ISO 8601), and sort order. Returns posts with text, author info, engagement counts (likes/reposts/replies), normalized embeds, AT-URIs for thread drilling, and hitsTotal when the API reports the total number of matching posts. This is the primary entry point for social listening — pass any AT-URI from results to bsky_get_post_thread to read the full conversation.
querystringrequiredFull-text search query, e.g. "climate change" or "#ai announcement".author_handlestringFilter to posts by this author. Accepts handle (e.g. "bsky.app") or DID. Use bsky_get_profile to resolve a name to a handle first.languagestringBCP-47 language code to restrict results to, e.g. "en", "ja", "es".tagstringHashtag to filter by — provide without the # prefix, e.g. "ai" not "#ai".sincestringReturn posts after this ISO 8601 datetime (inclusive), e.g. "2025-01-01T00:00:00Z".untilstringReturn posts before this ISO 8601 datetime (inclusive), e.g. "2025-12-31T23:59:59Z".sortstring"latest" returns posts in reverse-chronological order (default). "top" returns by engagement score.limitintegerMaximum posts to return (1–100). Default 25.cursorstringOpaque pagination cursor from a previous response. Note: the public Bluesky AppView restricts cursor-based search pagination for unauthenticated requests — passing a cursor may return a 403 error. Cursor pagination is reliable only for bsky_get_author_feed and bsky_get_follows.
bsky_get_post_thread3 paramsFetch the full 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 full discussion. AT-URIs have the format "at://<did>/<collection>/<rkey>" and are returned by bsky_search_posts and bsky_get_author_feed in the "uri" field of each post. Returns the root post, parent chain, and nested replies with per-post author and engagement data. "truncated: true" on a reply node means there are more replies below — increase depth to load them.
uristringrequiredAT-URI of the post to fetch, e.g. "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/abc123". Obtain from bsky_search_posts or bsky_get_author_feed.depthintegerHow many levels of replies to include in the reply tree. Default 6.parent_heightintegerHow many parent posts to include in the parent chain above the target post. Default 80.
bsky_get_follows4 paramsFetch the social graph edges for a Bluesky account — who follows them, or who they follow. Returns paginated actor profiles (handle, DID, displayName, bio, follower count) plus a summary of the subject account. Accounts with large social graphs return only the first page; use cursor pagination to walk through the full list.
actorstringrequiredHandle (e.g. "alice.bsky.social") or DID of the account to query.directionstringrequired"followers" returns accounts that follow this actor. "following" returns accounts this actor follows.limitintegerMaximum number of actors to return per page (1–100). Default 25.cursorstringOpaque pagination cursor from a previous response. Omit for the first page.
README.md
@cyanheads/bluesky-mcp-server
Search posts, profiles, feeds, threads, and trending topics on Bluesky via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://bluesky.caseyjhand.com/mcp
Tools
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, domain, 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 full conversation for a post by AT-URI — parent chain upward and reply tree downward |
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, and status |
bsky_search_posts
Full-text search across public Bluesky posts.
- Filters: author handle, language (BCP-47), hashtag, domain, date range (
since/until), and sort order (toporlatest) - Returns posts with text, author, engagement counts (likes/reposts/replies/quotes), embeds, AT-URIs, and timestamps
hitsTotalwhen available — total matching posts, not just the current page- Pagination via opaque cursor; up to 100 results per call
- Embeds normalized into a flat union:
images,external(link cards),record(quoted posts),video,unknown - Moderation labels surfaced as-is — not filtered
bsky_get_profile
Fetch a Bluesky actor's public profile by handle or DID.
- Returns displayName, handle, DID, description, follower/following/post counts, avatar URL, moderation labels, and pinned post AT-URI
- The resolution step for handle↔DID — use before tools that require a DID or AT-URI when you only have a handle
bsky_get_author_feed
A user's recent posts ordered newest-first.
- Filter by post type:
posts_with_replies,posts_no_replies,posts_with_media, orposts_and_author_threads - Returns posts with full text, engagement counts, embeds, and AT-URIs for thread drilling
- Pagination via cursor
bsky_get_post_thread
Fetch the full conversation for a post by AT-URI.
- Returns the root post, parent chain (upward), and nested reply tree (downward)
- Configurable
depth(reply tree depth, default 6) andparent_height(parent chain height, default 80) - Truncated subtrees surface
truncated: true; deleted posts surface asnot_found - AT-URIs come from
bsky_search_postsorbsky_get_author_feed
bsky_get_follows
Fetch social graph edges for an account.
direction:followers(who follows the actor) orfollowing(who the actor follows)- Returns paginated profiles with handle, DID, displayName, description, and follower count
- Includes the subject's profile summary at the top level
bsky_get_trending
Fetch real-time trending topics on Bluesky.
- Returns topics with display name, post count, category (politics, sports, pop-culture, etc.), status (hot/rising), and start time
- No cursor — returns the current snapshot up to
limit - Uses
app.bsky.unspecced.getTrends— Bluesky may change this endpoint without notice
Resource
| Type | Name | Description |
|---|---|---|
| Resource | bsky://profile/{actor} |
A Bluesky actor's public profile, addressable by handle or DID |
All resource data is also reachable via tools. Use bsky_get_profile for programmatic access or bsky://profile/{actor} to inject profile context directly.
Features
Built on @cyanheads/mcp-ts-core:
- Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
- Unified error handling — handlers throw, framework catches, classifies, and formats
- Pluggable auth:
none,jwt,oauth - Swappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1 - Structured logging with optional OpenTelemetry tracing
- STDIO and Streamable HTTP transports
Bluesky-specific:
- No authentication required — all seven tools operate against
api.bsky.appwithout credentials - Single
BlueskyServicewrapping the AT Protocol public AppView with retry (3 attempts, 500ms base), 15s timeout, and a versionedUser-Agent - Embed normalization — raw nested AT Protocol embed objects flattened to a clean
type-discriminated union - Moderation labels surfaced verbatim — the agent and its human decide what to do
- AT Protocol identifier types (handle, DID, AT-URI) explained at first encounter in every tool description
Agent-friendly output:
- AT-URIs on every post and resource — chain
bsky_search_posts→bsky_get_post_threadwithout extra steps - Discriminated embed union (
type: "images" | "external" | "record" | "video" | "unknown") — branch on data, not$typestrings hitsTotalon search results — communicate result scale to users without extra round trips- Truncation signals (
truncated: true) on thread nodes — agents know where the tree ends and why
Getting started
Public Hosted Instance
Connect directly — no installation required:
{
"mcpServers": {
"bluesky-mcp-server": {
"type": "streamable-http",
"url": "https://bluesky.caseyjhand.com/mcp"
}
}
}
Self-hosted
Add the following to your MCP client configuration file. No API key required.
{
"mcpServers": {
"bluesky-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/bluesky-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"bluesky-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/bluesky-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"bluesky-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/bluesky-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.3.0 or higher (or Node.js v24+).
- No API key or account required — all tools call
api.bsky.appwithout credentials.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/bluesky-mcp-server.git
- Navigate into the directory:
cd bluesky-mcp-server
- Install dependencies:
bun install
- Configure environment (optional):
cp .env.example .env
# edit .env to override any framework defaults
Configuration
This server requires no API keys. All framework configuration is optional.
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE |
Transport: stdio or http |
stdio |
MCP_HTTP_PORT |
Port for HTTP server | 3010 |
MCP_AUTH_MODE |
Auth mode: none, jwt, or oauth |
none |
MCP_LOG_LEVEL |
Log level (RFC 5424) | info |
LOGS_DIR |
Directory for log files (Node.js only) | <project-root>/logs |
STORAGE_PROVIDER_TYPE |
Storage backend | in-memory |
OTEL_ENABLED |
Enable OpenTelemetry instrumentation | false |
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t bluesky-mcp-server .
docker run --rm -p 3010:3010 bluesky-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/bluesky-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
| Directory | Purpose |
|---|---|
src/index.ts |
createApp() entry point — registers tools, resource, and inits service. |
src/services/bluesky |
AT Protocol AppView HTTP client with retry, timeout, and User-Agent. |
src/mcp-server/tools |
Tool definitions (*.tool.ts) — seven read-only Bluesky tools. |
src/mcp-server/resources |
Resource definitions (*.resource.ts) — bsky://profile/{actor}. |
tests/ |
Unit and integration tests mirroring src/. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools and resources via the arrays in
src/index.ts - Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Recommended MCP Servers
How it compares
Bluesky read/search MCP connector, not a multi-network social media management skill.
FAQ
What does bluesky mcp server MCP do?
Search posts, profiles, feeds, threads, and trending topics on Bluesky.
When should I use bluesky mcp server?
User asks about Bluesky MCP mcp, search posts, profiles, feeds, threads, and trending topics on bluesky.
Is this MCP server safe to install?
Review the Security Audits panel and upstream source before connecting in production.