Skip to content

add_bookmark ​

Privately bookmark a post.

Bookmarks are private to your account and stored server-side (app.bsky.bookmark.createBookmark): they are not public records, other users cannot see them, and no bookmark-record URI exists — bookmarks are keyed by the bookmarked post's URI. Only app.bsky.feed.post records can be bookmarked.

Authentication ​

Required: Yes (Private tool)

Parameters ​

uri (required) ​

  • Type: string
  • Description: AT-URI of the post to bookmark (at://did/app.bsky.feed.post/rkey). URIs for any other collection are rejected, since only posts can be bookmarked.

cid (optional) ​

  • Type: string
  • Description: CID of the post record. When omitted, the CID is resolved automatically from the post view. Pass it explicitly only if you already have it (e.g. from a search or timeline result) or if the post view cannot be fetched.

Idempotency ​

The tool checks the post's viewer.bookmarked state first. If the post is already bookmarked, no create call is issued and alreadyBookmarked is true. The endpoint is also idempotent server-side, so a duplicate create would be a no-op anyway.

Response ​

Tool results are returned as stringified JSON text. The shape below is illustrative.

typescript
{
  success: boolean;
  message: string;
  alreadyBookmarked: boolean; // true when the post was already bookmarked
  bookmarkedPost: {
    uri: string; // AT-URI of the bookmarked post
    cid: string; // CID of the post (resolved automatically when not supplied)
  };
}

There is no bookmark-record URI in the response: bookmarks are private server-side state keyed by the post URI. To remove the bookmark later, pass the same post URI to remove_bookmark.

Examples ​

Bookmark a Post ​

json
{
  "uri": "at://did:plc:abc123/app.bsky.feed.post/3k44dkpmqss2a"
}

Response:

json
{
  "success": true,
  "message": "Post bookmarked successfully",
  "alreadyBookmarked": false,
  "bookmarkedPost": {
    "uri": "at://did:plc:abc123/app.bsky.feed.post/3k44dkpmqss2a",
    "cid": "bafyreib2rxk3rh6kzwq6r4yhdj37yiwzfvxnwxet3rvjxn4xltlvmzqfa4"
  }
}

Bookmark with an Explicit CID ​

json
{
  "uri": "at://did:plc:abc123/app.bsky.feed.post/3k44dkpmqss2a",
  "cid": "bafyreib2rxk3rh6kzwq6r4yhdj37yiwzfvxnwxet3rvjxn4xltlvmzqfa4"
}

Error Handling ​

Common Errors ​

Not a Post URI ​

json
{
  "error": "uri must reference a post record (collection \"app.bsky.feed.like\" is not app.bsky.feed.post); only posts can be bookmarked",
  "code": "VALIDATION_ERROR"
}

CID Could Not Be Resolved ​

Returned when cid is omitted and the post view cannot be fetched (e.g. the post does not exist):

json
{
  "error": "Could not resolve the CID for at://...: the post view could not be fetched. Verify the post exists, or pass cid explicitly.",
  "code": "VALIDATION_ERROR"
}

Authentication Required ​

json
{
  "error": "Authentication required",
  "code": "AUTHENTICATION_FAILED"
}