Atlas / MCP servers / thenavidm / bluesky-mcp-cli

bluesky-mcp-cliCAUTION

mcp/thenavidm/bluesky-mcp-cli

Bluesky MCP server and CLI for Claude Code, Codex and AI agents. 45 tools for posting, threads, replies, timeline, search, custom feeds, lists, notifications and the social graph.

Verdict
CAUTION
Grade
B
Trust score
89 /100
Exposed tools
44 29r · 11w · 4d
Transport
—
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://www.npmjs.com/package/@thenavidm/bluesky-mcp-cli) [](./LICENSE) [](https://youtube.com/@thenavidm?sub_confirmation=1) [](https://x.com/thenavidm) [](https://linkedin.com/in/thenavidm)

Bluesky MCP server and CLI for Claude Code, Codex and AI agents. 45 tools for posting, threads, replies, timeline, search, custom feeds, lists, notifications and the social graph.

One install gives you both surfaces, the same tools under the same names, covering everything the app does and a few things it cannot.

There is no OAuth app to register: a handle and an app password are all you need, and most reads work with no credentials at all.

Built and maintained by Navid Moazzez. Built on Slipway, which turns one definition of each tool into the MCP server and the CLI.

Two ways to use it

Command line

bluesky-cli in your terminal, for scripting, cron, pipes, or just asking a quick question without opening anything:

bluesky-cli                                     # every command, one line each
bluesky-cli get-timeline --limit 50             # your home timeline
bluesky-cli get-author-feed --actor navid.me    # someone's posts
bluesky-cli search-posts "model context protocol"
bluesky-cli create-p
Read from source at commit 0e60f45e5f30OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add bluesky-mcp-cli --env BLUESKY_APP_PASSWORD=${BLUESKY_APP_PASSWORD} -- npx -y @thenavidm/[email protected]
claude-desktop
{
  "mcpServers": {
    "bluesky-mcp-cli": {
      "command": "npx",
      "args": [
        "-y",
        "@thenavidm/[email protected]"
      ],
      "env": {
        "BLUESKY_APP_PASSWORD": "${BLUESKY_APP_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (44)

29 read · 11 write · 4 destructive. Blast radius: 4 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
block_accountreadBlock an account. This is visible to them and severs the relationship in both directions: it removes any follow either way, and hides your posts from them. Reversible with unblock_account, but the follows do not come back. Needs confirm: true.
catch-upreadSummarise what happened on Bluesky while you were away
delete_postdestructiveDelete one of your own posts. This cannot be undone, and it does not remove the post from feeds and caches that already have it. Needs confirm: true.
draft-threadreadTurn an idea into a Bluesky thread, without posting it
followreadFollow an account by handle or DID. Following twice is harmless.
get_engagement_summaryreadTotals, averages and engagement rate across recent posts, broken down by format so you can see whether images or video actually earn their effort. Bluesky offers no equivalent.
get_feedreadRead posts from a custom feed by its at:// URI or bsky.app link. Find one with search_feeds, or your own with get_pinned_feeds.
get_followersreadAccounts that follow a given account, newest first. Pages automatically past Bluesky
get_followsreadAccounts a given account follows. Pages automatically.
get_liked_postsreadPosts a connected account has liked, newest first. Only works for your own accounts, because Bluesky does not expose anyone else
get_list_membersreadThe accounts on a curated list.
get_list_postsreadPosts from the accounts on a curated list, newest first. Take the list URI from get_pinned_feeds or a bsky.app /lists/ link.
get_notificationsreadYour likes, reposts, follows, mentions, replies and quotes, newest first. Filter by reason to get just the ones that need an answer:
get_pinned_feedsreadThe feeds and lists pinned to a connected account
get_post_likeswriteThe accounts that liked a specific post, newest first.
get_post_statswriteLikes, reposts, replies and quotes for a single post, by URL or at:// URI. The one-post version of rank_posts.
get_post_threadwriteRead a post together with the conversation around it: everything above it and the replies below. Accepts an at:// URI or a bsky.app link. Use this before replying, so the reply lands with context.
get_posting_patternsreadYour posting times crossed with the engagement they earned, by hour and by weekday, so
get_profilereadFull profile for one or more accounts: bio, follower counts, labels, and, when a connected account is available, whether you follow them and whether they follow you. Works without credentials.
get_quoteswritePosts that quote a specific post. This is where the argument about a post usually lives: quotes carry commentary, reposts do not.
get_relationshipsreadFor each account named, whether a connected account follows them and whether they follow back. One call for a whole list. Use this before a bulk follow or unfollow rather than reading a profile each time.
get_reposted_bywriteThe accounts that reposted a specific post.
get_suggested_followsreadAccounts Bluesky suggests following. With an
get_timelinereadYour following feed, newest first. Pass since_hours to read a time window rather than a fixed number of posts. Requires a connected account.
get_trendsreadCurrent trending topics on Bluesky, each with the feed link that shows the posts behind it. Works without credentials.
get_unread_countreadHow many notifications have arrived since you last marked them seen. One cheap call, worth making before you pull the full list.
get_video_job_statusreadCheck a Bluesky video transcoding job by id. Only needed when create_post reported that a video was still processing when it gave up waiting. The job usually finishes on its own, and the id is in that message.
like_postwriteLike a post. Accepts an at:// URI or a bsky.app link. Liking twice is harmless: the existing like is returned rather than a second one created.
list_accountsreadList every Bluesky account this server can act as. Use the handle from here as the
mark_notifications_seenreadMark every notification up to now as seen, so the unread count resets. Affects only your own view, and nobody else can tell.
mute_accountreadHide an account
rank_postsreadYour posts, best first, with likes, reposts, replies and quotes for each. Bluesky shows you none of this. Use days to score a period rather than a fixed count, and format to compare text against images and video.
repostwriteRepost a post to your followers. Reposting twice is harmless. To add your own comment instead, use create_post with
search_actorsreadFind Bluesky accounts by name, handle or bio text. Works without credentials. Returns each account
search_feedswriteFind custom feeds, meaning the algorithmic feeds anyone on Bluesky can publish. Pass a feed
search_postsreadFull-text search across public posts. Supports Bluesky
set_reply_permissionswriteChange who is allowed to reply to one of your existing posts, after it is already published. Also lets you hide specific replies from the thread. This is the main tool for a post that is going badly.
study-accountreadWork out how an account gets engagement
unblock_accountdestructiveRemove a block. Any follows the block severed do not come back. Both sides have to follow again.
unfollowwriteStop following an account. Finds your own follow record from the profile
unlike_postdestructiveRemove your like from a post. Finds your own like record from the post
unmute_accountwriteStop hiding an account
unrepostdestructiveRemove your repost of a post.
whoamireadAuthenticate and return the live profile for a connected account, including follower counts. Use this to confirm credentials work, or when the user says
04

Trust audit

CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (2 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (7)

MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/content/facets.ts:42
/(^|\s)[##]((?!️)[^\s ⃢]*[^\d\s\p{P} ⃢]+[^\s ⃢]*)?/gu;
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_post, unblock_account, unlike_post, unrepost
Why it matters. 4 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mcpbignore
.mcpbignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/text.test.ts:14
const family = "👨👩👧👦";
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/text.test.ts:24
const text = "👨👩👧👦".repeat(300);
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@thenavidm/slipway, zod, @types/node, ajv, typescript, vitest
Why it matters. 6 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:31
Node 22 or newer. Scripts keep working for success, usage errors and missing setup; a script that treated exit 1 as "unknown command" or "read-only" should read 2. Over MCP, expect an approval prompt
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 0e60f45e5f30full audit observations/trust-audit/mcp-server/thenavidm__bluesky-mcp-cli.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-110e60f45e5f30CAUTIONB89first audit
06

Questions

What is the bluesky-mcp-cli MCP server?

Bluesky MCP server and CLI for Claude Code, Codex and AI agents. 45 tools for posting, threads, replies, timeline, search, custom feeds, lists, notifications and the social graph.

What tools does bluesky-mcp-cli expose?

44 in total: 29 read-only, 11 that write, and 4 that can delete or overwrite (delete_post, unblock_account, unlike_post, unrepost). Every one is listed on this page with its risk.

Is bluesky-mcp-cli safe to connect to an agent?

With care. The audit graded it B (89/100) and found 7 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 4 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does bluesky-mcp-cli need?

It reads BLUESKY_APP_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (0e60f45e5f30), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement