bluesky-mcp-server
Provides tools for searching posts, profiles, feeds, threads, and trending topics on Bluesky via the AT Protocol public AppView, enabling read-only access to Bluesky social data without authentication.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bluesky-mcp-serversearch for posts about AI"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Full-text search across public Bluesky posts, with author, language, tag, domain, date, and sort filters |
| Fetch a Bluesky actor's public profile by handle or DID — the handle↔DID resolver |
| A user's recent posts ordered newest-first, filterable by post type |
| Fetch the full conversation for a post by AT-URI — parent chain upward and reply tree downward |
| Find Bluesky accounts by name or handle fragment |
| Paginated social graph edges — who a user follows or who follows them |
| 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 pagePagination via opaque cursor; up to 100 results per call
Embeds normalized into a flat union:
images,external(link cards),record(quoted posts),video,unknownModeration 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_threadsReturns 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_foundAT-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
limitUses
app.bsky.unspecced.getTrends— Bluesky may change this endpoint without notice
Related MCP server: Bluesky MCP
Resource
Type | Name | Description |
Resource |
| 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,oauthSwappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1Structured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
Bluesky-specific:
No authentication required — all seven tools operate against
api.bsky.appwithout credentialsSingle
BlueskyServicewrapping the AT Protocol public AppView with retry (3 attempts, 500ms base), 15s timeout, and a versionedUser-AgentEmbed normalization — raw nested AT Protocol embed objects flattened to a clean
type-discriminated unionModeration 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 stepsDiscriminated embed union (
type: "images" | "external" | "record" | "video" | "unknown") — branch on data, not$typestringshitsTotalon search results — communicate result scale to users without extra round tripsTruncation 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/mcpPrerequisites
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.gitNavigate into the directory:
cd bluesky-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env to override any framework defaultsConfiguration
This server requires no API keys. All framework configuration is optional.
Variable | Description | Default |
| Transport: |
|
| Port for HTTP server |
|
| Auth mode: |
|
| Log level (RFC 5424) |
|
| Directory for log files (Node.js only) |
|
| Storage backend |
|
|
|
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-serverThe 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 |
|
|
| AT Protocol AppView HTTP client with retry, timeout, and |
| Tool definitions ( |
| Resource definitions ( |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources via the arrays in
src/index.tsWrap 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 testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityDmaintenanceMCP server for Bluesky/AT Protocol enabling LLM clients and agents to authenticate, search, post, like, follow, and manage chat on Bluesky.Last updated311MIT
- Alicense-qualityDmaintenanceMCP server for Bluesky/AT Protocol that enables AI agents to search, post, reply, like, and follow.Last updated81MIT
- AlicenseAqualityBmaintenanceMCP server for live X/Twitter and web search, driven by your locally logged-in Grok CLI and leveraging your X Premium or SuperGrok subscription quota.Last updated31MIT
- Flicense-qualityCmaintenanceMCP server providing web search, news search, and X/Twitter search capabilities via HTTP or stdio.Last updated
Related MCP Connectors
Search Hacker News, Bluesky, and Substack from a single MCP interface
Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.
Mastodon MCP — public Mastodon data via mastodon.social (no auth required)
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/cyanheads/bluesky-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server