Skip to content

bluesky mcp server changelog

io.github.cyanheads/bluesky-mcp-server

11 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.

  • Tools +1
    • + bsky_get_list

  • server.json 1 field changed
    version
    0.7.0 0.8.0

  • AGENTS.md +7 −4

    https://raw.githubusercontent.com/cyanheads/bluesky-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.6.0− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`− **MCP SDK:** `@modelcontextprotocol/server` ^2.3.1− Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. The directory is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, so a server that ships `.claude-plugin/` or `.codex-plugin/` would hand these development skills to every agent that installs it. Keep `skills/` free for skills meant f+ **Version:** 0.7.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.18`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.4.0+ - **Metadata projection.** Actor lists retain optional account `createdAt` and labels with `val`, `src?`, and `cts?`; the graph subject retains `createdAt` too. Detailed profiles alone retain selected `associated` counts and labeler status, preserving zero, false, empty, and absent shapes. Video alt uses the shared literal-text quotation at every supported embed depth.+         bsky-get-post-interactions.tool.ts # Accounts behind likes/reposts; account creation and like timestamps kept distinct+ Development skills live in `framework-skills/`; root `skills/` is an optional, author-managed tree for agents using the server. Maintenance never creates or modifies that published tree. Read development skills directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. Published skills ship through npm, Docker, and plugin installs and are served over MCP only when `createApp({ skills: 'skills' })` opts in. `lint:p+ | `add-skill` | Author a published skill in root `skills/` for agents that use the server |

  • Resources +1
    • + bluesky-guide
  • Tools +2
    • + bsky_search_feeds
    • + bsky_get_post_interactions
  • server.json 1 field changed
    version
    0.6.0 0.7.0

  • AGENTS.md +8 −5

    https://raw.githubusercontent.com/cyanheads/bluesky-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.5.2− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.14`− **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0− **Zod:** ^4.6.5−     server-config.ts                    # Optional BLUESKY_IDENTIFIER / BLUESKY_APP_PASSWORD pair that enables post search+ **Version:** 0.6.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.3.1+ **Zod:** ^4.6.7+     server-config.ts                    # Read-limit policy and optional BLUESKY_IDENTIFIER / BLUESKY_APP_PASSWORD pair+       post-facets.ts                    # Open rich-text feature schema and typed known variants+       read-limits.ts                    # Conditional input maxima, per-call clamping, and composed disclosure+         bsky-search-feeds.tool.ts       # Keyless provider catalog metadata search; feedUri chains to bsky-get-feed
  • server.json 3 fields changed
    description
    Search posts, profiles, feeds, threads, and trending topics on Bluesky. Search Bluesky posts and feeds; read profiles, threads, and trends. STDIO or Streamable HTTP.
    env_vars
    BLUESKY_IDENTIFIER, BLUESKY_APP_PASSWORD, MCP_LOG_LEVEL BLUESKY_CLAMP_READ_LIMITS, BLUESKY_IDENTIFIER, BLUESKY_APP_PASSWORD, MCP_LOG_LEVEL
    version
    0.5.2 0.6.0

  • AGENTS.md +11 −10

    https://raw.githubusercontent.com/cyanheads/bluesky-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.5.1− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.6`− **MCP SDK:** `@modelcontextprotocol/server` ^2.0.0− | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any serializable value. |− | `ctx.inputs` | Reader over a retried request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped`. Empty on the first round. |− | `ctx.requestId` | Unique request ID. |− **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reaso−   if (!item) throw ctx.fail('no_match', `No item ${input.id}`, ctx.recoveryFor('no_match'));− throw new McpError(JsonRpcErrorCode.DatabaseError, 'Connection failed', { pool: 'primary' });− **Every release goes through a release PR, straight-through** — `git-wrapup`'s "Release PR mode", mode `straight-through`. One run: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the changelog entry plus a gates section); `release-and-publish` then fast-forwards `main` locally with `git merge --ff-only`, creates the tag on `main`'s tip, pushes `main` and the tag, deletes the branch, and publishes. A caller's bri+ **Version:** 0.5.2+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.14`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0+ | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any JSON-serializable value; reads return its JSON form (a `Date` comes back as an ISO string). |+ | `ctx.inputs` | The request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped` — limited to what the client declared (`elicitation` and its form/url modes, `sampling`, `roots`). Client-supplied: a consent gate trusts only a `ctx.state` record it stored when it asked, bound to the operation, caller, and target (see the `api-context` skill). |+ | `ctx.clientCapabilities` | What the client declared for this request, `undefined` when no view exists. Decides whether to ask for optional context (e.g. roots); never a reason to skip a consent prompt. |+ | `ctx.requestId` | Request ID — the one every log record of the call carries and its error envelope returns as `data.requestId`. |+ **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. The framework puts it on the+   if (!item) throw ctx.fail('no_match', `No item ${input.id}`);+ throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });+ **Every release goes through a release PR, straight-through** — `git-wrapup`'s "Release PR mode", mode `straight-through`. One run: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the release digest: theme line, `## Changes`, `## Gates`, changelog link last); `release-and-publish` then fast-forwards `main` locally with `git merge --ff-only`, creates the tag on `main`'s tip, pushes `main` and the tag, deletes the 

  • server.json 1 field changed
    version
    0.5.1 0.5.2

  • Tools +2 −1
    • + bsky_get_feed
    • + bsky_get_post_quotes
    • − bsky_search_posts