MCP Server

Stashr

me.stashr/stashr

What this MCP does

Searches, reads, organizes, tags, archives, and visually reviews saved bookmarks from multiple social platforms.

archive_bookmarks
Archive or restore bookmarks
Archive or restore up to 200 bookmarks in one call. Archiving is reversible; returns the ids whose state actually changed.
Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['archived', 'ids'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'maxItems': 200, 'minItems': 1}, 'archived': {'type': 'boolean', 'description': 'true archives the bookmarks, false restores them'}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ids'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Bookmark ids whose archive state actually changed'}}, 'additionalProperties': False}
fetch
Fetch bookmark
Fetch the complete content and metadata for one Stashr bookmark id returned by search or list_bookmarks. The text field is the full body rendered as Markdown (headings, lists, links, code, and inlined media preserved).
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id', 'metadata', 'text', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string', 'description': 'Full bookmark body rendered as Markdown'}, 'title': {'type': 'string'}, 'metadata': {'type': 'object', 'required': ['archived', 'author', 'capturedAt', 'contentCreatedAt', 'contentType', 'favorite', 'media', 'note', 'platform', 'tags'], 'properties': {'note': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'type': 'object', 'required': ['altText', 'duration', 'height', 'ref', 'storedUrl', 'type', 'url', 'width'], 'properties': {'ref': {'type': 'string'}, 'url': {'type': 'string'}, 'type': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'duration': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'storedUrl': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'author': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'archived': {'type': 'boolean'}, 'favorite': {'type': 'boolean'}, 'platform': {'type': 'string'}, 'capturedAt': {'type': 'string'}, 'contentType': {'type': 'string'}, 'contentCreatedAt': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'additionalProperties': False}
fetch_many
Fetch several bookmarks
Fetch the complete content for up to 20 bookmark ids in one call — the same document shape as fetch. Use it when comparing or summarizing several saves from search or list results; missing lists ids that were not found. For a single id, prefer fetch.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ids'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'maxItems': 20, 'minItems': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['documents', 'missing'], 'properties': {'missing': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Requested ids that were not found or are not visible'}, 'documents': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'metadata', 'text', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string', 'description': 'Full bookmark body rendered as Markdown'}, 'title': {'type': 'string'}, 'metadata': {'type': 'object', 'required': ['archived', 'author', 'capturedAt', 'contentCreatedAt', 'contentType', 'favorite', 'media', 'note', 'platform', 'tags'], 'properties': {'note': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'type': 'object', 'required': ['altText', 'duration', 'height', 'ref', 'storedUrl', 'type', 'url', 'width'], 'properties': {'ref': {'type': 'string'}, 'url': {'type': 'string'}, 'type': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'duration': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'storedUrl': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'author': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'archived': {'type': 'boolean'}, 'favorite': {'type': 'boolean'}, 'platform': {'type': 'string'}, 'capturedAt': {'type': 'string'}, 'contentType': {'type': 'string'}, 'contentCreatedAt': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'description': 'Full documents in the order the ids were requested'}}, 'additionalProperties': False}
get_account
Get account
Get the authenticated Stashr account: plan, trial status, and remaining AI-tag quota. Use this to explain payment_required errors or report account state.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['access', 'email', 'id', 'image', 'name'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'email': {'type': 'string'}, 'image': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'access': {'type': 'object', 'required': ['hasAppAccess', 'hasPaidPlan', 'hasProAccess', 'trial'], 'properties': {'trial': {'anyOf': [{'type': 'object', 'required': ['tagsRemaining', 'trialEndsAt'], 'properties': {'trialEndsAt': {'type': 'string'}, 'tagsRemaining': {'type': 'number'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'hasPaidPlan': {'type': 'boolean'}, 'hasAppAccess': {'type': 'boolean'}, 'hasProAccess': {'type': 'boolean'}}, 'additionalProperties': False}}, 'additionalProperties': False}
library_stats
Library stats
Aggregate counts over the user's library in one call: total plus breakdowns by platform, content type, and capture month, and favorite/untagged/note counts. Accepts the same filters as list_bookmarks. Use this for "how many" and overview questions instead of paging bookmarks.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'state': {'enum': ['active', 'archived', 'all'], 'type': 'string', 'default': 'active', 'description': 'Which bookmarks to count'}, 'filters': {'type': 'object', 'properties': {'note': {'type': 'array', 'items': {'enum': ['has-note', 'no-note'], 'type': 'string'}, 'description': '["has-note"] = only bookmarks with a user note'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'enum': ['image', 'video', 'any-media', 'text-only'], 'type': 'string'}, 'description': 'Media presence: "image"/"video" = has that type, "any-media" = has any, "text-only" = has none (not combinable with the others)'}, 'authors': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'An author username ("naval"), optionally platform-scoped ("twitter:naval")'}}, 'tagMode': {'enum': ['include_any', 'include_all', 'exclude_any', 'exclude_all'], 'type': 'string', 'description': 'include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them'}, 'favorite': {'type': 'array', 'items': {'enum': ['favorite', 'not-favorite'], 'type': 'string'}, 'description': '["favorite"] = only favorites; ["not-favorite"] = only non-favorites'}, 'untagged': {'type': 'boolean', 'description': 'true = only bookmarks with no tags at all'}, 'mediaMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'platforms': {'type': 'array', 'items': {'enum': ['github', 'instagram', 'reddit', 'tiktok', 'twitter', 'web', 'youtube'], 'type': 'string', 'description': 'Platform id — X/Twitter is "twitter"'}}, 'authorMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'contentTypes': {'type': 'array', 'items': {'type': 'string', 'description': 'A content type ("article"), optionally platform-scoped ("twitter:article"). Valid types: repo, image, post, video, comment, article, page, snippet'}}, 'platformMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'capturedAfter': {'type': 'string', 'description': 'Only bookmarks saved on/after this ISO date (inclusive)'}, 'capturedBefore': {'type': 'string', 'description': 'Only bookmarks saved before this ISO date (exclusive)'}, 'contentTypeMode': {'enum': ['include', 'exclude'], 'type': 'string'}}}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['archived', 'byContentType', 'byMonth', 'byPlatform', 'favorites', 'total', 'untagged', 'withNote'], 'properties': {'total': {'type': 'number'}, 'byMonth': {'type': 'object', 'description': 'Capture counts keyed by "YYYY-MM", newest first', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'number'}}, 'archived': {'type': 'number'}, 'untagged': {'type': 'number'}, 'withNote': {'type': 'number'}, 'favorites': {'type': 'number'}, 'byPlatform': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'number'}}, 'byContentType': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'number'}}}, 'additionalProperties': False}
list_bookmarks
List bookmarks
Browse bookmarks in reverse capture order with structured filters, or the contents of a saved collection via collectionId. Prefer search for free-text or semantic discovery. Results include a nextCursor when more pages exist; a cursor only works with the exact same filters, collection, and state.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1}, 'state': {'enum': ['active', 'archived', 'all'], 'type': 'string', 'default': 'active'}, 'cursor': {'type': 'string', 'description': 'Pass the nextCursor value from the previous page to continue paging'}, 'filters': {'type': 'object', 'properties': {'note': {'type': 'array', 'items': {'enum': ['has-note', 'no-note'], 'type': 'string'}, 'description': '["has-note"] = only bookmarks with a user note'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'enum': ['image', 'video', 'any-media', 'text-only'], 'type': 'string'}, 'description': 'Media presence: "image"/"video" = has that type, "any-media" = has any, "text-only" = has none (not combinable with the others)'}, 'authors': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'An author username ("naval"), optionally platform-scoped ("twitter:naval")'}}, 'tagMode': {'enum': ['include_any', 'include_all', 'exclude_any', 'exclude_all'], 'type': 'string', 'description': 'include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them'}, 'favorite': {'type': 'array', 'items': {'enum': ['favorite', 'not-favorite'], 'type': 'string'}, 'description': '["favorite"] = only favorites; ["not-favorite"] = only non-favorites'}, 'untagged': {'type': 'boolean', 'description': 'true = only bookmarks with no tags at all'}, 'mediaMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'platforms': {'type': 'array', 'items': {'enum': ['github', 'instagram', 'reddit', 'tiktok', 'twitter', 'web', 'youtube'], 'type': 'string', 'description': 'Platform id — X/Twitter is "twitter"'}}, 'authorMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'contentTypes': {'type': 'array', 'items': {'type': 'string', 'description': 'A content type ("article"), optionally platform-scoped ("twitter:article"). Valid types: repo, image, post, video, comment, article, page, snippet'}}, 'platformMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'capturedAfter': {'type': 'string', 'description': 'Only bookmarks saved on/after this ISO date (inclusive)'}, 'capturedBefore': {'type': 'string', 'description': 'Only bookmarks saved before this ISO date (exclusive)'}, 'contentTypeMode': {'enum': ['include', 'exclude'], 'type': 'string'}}}, 'collectionId': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': "List a saved collection's bookmarks: its stored filters are applied, with any explicit filters here overriding same-name ones"}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['items', 'nextCursor', 'rankMode'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object', 'required': ['archived', 'author', 'capturedAt', 'contentCreatedAt', 'contentType', 'favorite', 'id', 'media', 'mediaCount', 'platform', 'tags', 'text', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'text': {'type': 'string', 'description': 'Bounded plain-text snippet'}, 'media': {'type': 'array', 'items': {'type': 'object', 'required': ['altText', 'ref', 'type'], 'properties': {'ref': {'type': 'string'}, 'type': {'type': 'string'}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'description': 'Lightweight refs usable with view_media'}, 'title': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'description': 'Real title only; null when the source has none'}, 'author': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'archived': {'type': 'boolean'}, 'favorite': {'type': 'boolean'}, 'platform': {'type': 'string'}, 'capturedAt': {'type': 'string'}, 'mediaCount': {'type': 'number'}, 'contentType': {'type': 'string'}, 'matchedMedia': {'type': 'object', 'required': ['altText', 'caption', 'height', 'ref', 'type', 'url', 'width'], 'properties': {'ref': {'type': 'string'}, 'url': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'type': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'caption': {'type': 'string'}}, 'additionalProperties': False}, 'contentCreatedAt': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'degraded': {'type': 'array', 'items': {'enum': ['semantic_unavailable', 'image_rank_unavailable'], 'type': 'string'}, 'description': 'Present when retrieval quality was reduced: semantic_unavailable = embedding failed (lexical-only results); image_rank_unavailable = no image captions, fell back to post ranking'}, 'rankMode': {'enum': ['post', 'image'], 'type': 'string'}, 'nextCursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'requestedRankMode': {'enum': ['post', 'image'], 'type': 'string', 'description': 'Present only when rankMode differs from what was requested'}}, 'additionalProperties': False}
list_collections
List collections
List saved filter collections. Pass a collection id to list_bookmarks to read its contents.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['collections'], 'properties': {'collections': {'type': 'array', 'items': {'type': 'object', 'required': ['color', 'filters', 'icon', 'id', 'name', 'pinned', 'position'], 'properties': {'id': {'type': 'string'}, 'icon': {'type': 'string'}, 'name': {'type': 'string'}, 'color': {'type': 'string'}, 'pinned': {'type': 'boolean'}, 'filters': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'position': {'type': 'number'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
list_tags
List tags
List the user's Stashr tags with usage counts. Use the returned tag names in bookmark filters and tag updates.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['tags'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'object', 'required': ['color', 'count', 'id', 'name'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'color': {'type': 'string'}, 'count': {'type': 'number', 'description': 'Active bookmarks currently carrying this tag'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
manage_collection
Manage collections
Create, update, or deliberately delete saved Stashr filter collections (use list_collections to read them). Create requires name; update and delete require id; delete also requires confirm=true.
Destructive
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['action'], 'properties': {'id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': 'Collection id, required for update and delete'}, 'icon': {'type': 'string', 'description': 'A Stashr collection icon id'}, 'name': {'type': 'string', 'maxLength': 50, 'minLength': 1, 'description': 'Collection name, required for create'}, 'color': {'type': 'string', 'description': 'A Stashr collection color id'}, 'action': {'enum': ['create', 'update', 'delete'], 'type': 'string'}, 'pinned': {'type': 'boolean', 'description': 'Pin or unpin the collection in the sidebar (update only)'}, 'confirm': {'type': 'boolean', 'description': 'Must be true to delete a collection'}, 'filters': {'type': 'object', 'properties': {'note': {'type': 'array', 'items': {'enum': ['has-note', 'no-note'], 'type': 'string'}, 'description': '["has-note"] = only bookmarks with a user note'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'enum': ['image', 'video', 'any-media', 'text-only'], 'type': 'string'}, 'description': 'Media presence: "image"/"video" = has that type, "any-media" = has any, "text-only" = has none (not combinable with the others)'}, 'authors': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'An author username ("naval"), optionally platform-scoped ("twitter:naval")'}}, 'tagMode': {'enum': ['include_any', 'include_all', 'exclude_any', 'exclude_all'], 'type': 'string', 'description': 'include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them'}, 'favorite': {'type': 'array', 'items': {'enum': ['favorite', 'not-favorite'], 'type': 'string'}, 'description': '["favorite"] = only favorites; ["not-favorite"] = only non-favorites'}, 'untagged': {'type': 'boolean', 'description': 'true = only bookmarks with no tags at all'}, 'mediaMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'platforms': {'type': 'array', 'items': {'enum': ['github', 'instagram', 'reddit', 'tiktok', 'twitter', 'web', 'youtube'], 'type': 'string', 'description': 'Platform id — X/Twitter is "twitter"'}}, 'authorMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'contentTypes': {'type': 'array', 'items': {'type': 'string', 'description': 'A content type ("article"), optionally platform-scoped ("twitter:article"). Valid types: repo, image, post, video, comment, article, page, snippet'}}, 'platformMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'capturedAfter': {'type': 'string', 'description': 'Only bookmarks saved on/after this ISO date (inclusive)'}, 'capturedBefore': {'type': 'string', 'description': 'Only bookmarks saved before this ISO date (exclusive)'}, 'contentTypeMode': {'enum': ['include', 'exclude'], 'type': 'string'}}}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'deleted': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}}, 'additionalProperties': False}, 'collection': {'type': 'object', 'required': ['color', 'filters', 'icon', 'id', 'name', 'pinned', 'position'], 'properties': {'id': {'type': 'string'}, 'icon': {'type': 'string'}, 'name': {'type': 'string'}, 'color': {'type': 'string'}, 'pinned': {'type': 'boolean'}, 'filters': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'position': {'type': 'number'}}, 'additionalProperties': False}}, 'additionalProperties': False}
save_bookmark
Save bookmark
Save a public URL to Stashr. Repeated calls for the same URL are idempotent and return the existing bookmark.
Open world Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bookmark', 'created'], 'properties': {'created': {'type': 'boolean'}, 'bookmark': {'type': 'object', 'required': ['id', 'metadata', 'text', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string', 'description': 'Full bookmark body rendered as Markdown'}, 'title': {'type': 'string'}, 'metadata': {'type': 'object', 'required': ['archived', 'author', 'capturedAt', 'contentCreatedAt', 'contentType', 'favorite', 'media', 'note', 'platform', 'tags'], 'properties': {'note': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'type': 'object', 'required': ['altText', 'duration', 'height', 'ref', 'storedUrl', 'type', 'url', 'width'], 'properties': {'ref': {'type': 'string'}, 'url': {'type': 'string'}, 'type': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'duration': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'storedUrl': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'author': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'archived': {'type': 'boolean'}, 'favorite': {'type': 'boolean'}, 'platform': {'type': 'string'}, 'capturedAt': {'type': 'string'}, 'contentType': {'type': 'string'}, 'contentCreatedAt': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'additionalProperties': False}}, 'additionalProperties': False}
search
Search bookmarks
Search the user's Stashr bookmarks semantically. Use this before fetch when finding saved knowledge by meaning, wording, tag, author, platform, or content type. For visual queries (objects, colors, screenshots, layouts) set rankMode "image" to rank individual images by their captions; matched refs can be passed to view_media. Results include a nextCursor when more pages exist; a cursor only works with the exact same query, filters, and state. Ranking covers the top 200 candidates — narrow with filters rather than paging deep.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'state': {'enum': ['active', 'archived', 'all'], 'type': 'string', 'description': 'Which bookmarks to search; defaults to active only'}, 'cursor': {'type': 'string', 'description': 'Pass the nextCursor value from the previous page to continue paging'}, 'filters': {'type': 'object', 'properties': {'note': {'type': 'array', 'items': {'enum': ['has-note', 'no-note'], 'type': 'string'}, 'description': '["has-note"] = only bookmarks with a user note'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'enum': ['image', 'video', 'any-media', 'text-only'], 'type': 'string'}, 'description': 'Media presence: "image"/"video" = has that type, "any-media" = has any, "text-only" = has none (not combinable with the others)'}, 'authors': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'An author username ("naval"), optionally platform-scoped ("twitter:naval")'}}, 'tagMode': {'enum': ['include_any', 'include_all', 'exclude_any', 'exclude_all'], 'type': 'string', 'description': 'include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them'}, 'favorite': {'type': 'array', 'items': {'enum': ['favorite', 'not-favorite'], 'type': 'string'}, 'description': '["favorite"] = only favorites; ["not-favorite"] = only non-favorites'}, 'untagged': {'type': 'boolean', 'description': 'true = only bookmarks with no tags at all'}, 'mediaMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'platforms': {'type': 'array', 'items': {'enum': ['github', 'instagram', 'reddit', 'tiktok', 'twitter', 'web', 'youtube'], 'type': 'string', 'description': 'Platform id — X/Twitter is "twitter"'}}, 'authorMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'contentTypes': {'type': 'array', 'items': {'type': 'string', 'description': 'A content type ("article"), optionally platform-scoped ("twitter:article"). Valid types: repo, image, post, video, comment, article, page, snippet'}}, 'platformMode': {'enum': ['include', 'exclude'], 'type': 'string'}, 'capturedAfter': {'type': 'string', 'description': 'Only bookmarks saved on/after this ISO date (inclusive)'}, 'capturedBefore': {'type': 'string', 'description': 'Only bookmarks saved before this ISO date (exclusive)'}, 'contentTypeMode': {'enum': ['include', 'exclude'], 'type': 'string'}}}, 'rankMode': {'enum': ['post', 'image'], 'type': 'string', 'default': 'post', 'description': '"post" ranks whole bookmarks; "image" ranks individual stored images by caption for visual queries'}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['nextCursor', 'rankMode', 'results'], 'properties': {'results': {'type': 'array', 'items': {'type': 'object', 'required': ['archived', 'author', 'capturedAt', 'contentCreatedAt', 'contentType', 'favorite', 'id', 'media', 'mediaCount', 'platform', 'tags', 'text', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'text': {'type': 'string', 'description': 'Bounded plain-text snippet'}, 'media': {'type': 'array', 'items': {'type': 'object', 'required': ['altText', 'ref', 'type'], 'properties': {'ref': {'type': 'string'}, 'type': {'type': 'string'}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'description': 'Lightweight refs usable with view_media'}, 'title': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'description': 'Real title only; null when the source has none'}, 'author': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'archived': {'type': 'boolean'}, 'favorite': {'type': 'boolean'}, 'platform': {'type': 'string'}, 'capturedAt': {'type': 'string'}, 'mediaCount': {'type': 'number'}, 'contentType': {'type': 'string'}, 'matchedMedia': {'type': 'object', 'required': ['altText', 'caption', 'height', 'ref', 'type', 'url', 'width'], 'properties': {'ref': {'type': 'string'}, 'url': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'type': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'caption': {'type': 'string'}}, 'additionalProperties': False}, 'contentCreatedAt': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'degraded': {'type': 'array', 'items': {'enum': ['semantic_unavailable', 'image_rank_unavailable'], 'type': 'string'}, 'description': 'Present when retrieval quality was reduced: semantic_unavailable = embedding failed (lexical-only results); image_rank_unavailable = no image captions, fell back to post ranking'}, 'rankMode': {'enum': ['post', 'image'], 'type': 'string', 'description': 'The ranking that actually ran'}, 'nextCursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'requestedRankMode': {'enum': ['post', 'image'], 'type': 'string', 'description': 'Present only when rankMode differs from what was requested'}}, 'additionalProperties': False}
update_bookmark
Update bookmark
Update a bookmark's note, favorite state, tags, or reversible archive state. Tag values are tag names; reuse the user's existing names (list_tags) rather than inventing near-duplicates.
Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'note': {'anyOf': [{'type': 'string', 'maxLength': 2000}, {'type': 'null'}]}, 'tags': {'type': 'object', 'properties': {'add': {'type': 'array', 'items': {'type': 'string'}}, 'set': {'type': 'array', 'items': {'type': 'string'}}, 'remove': {'type': 'array', 'items': {'type': 'string'}}}}, 'archived': {'type': 'boolean'}, 'isFavorite': {'type': 'boolean'}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id', 'metadata', 'text', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string', 'description': 'Full bookmark body rendered as Markdown'}, 'title': {'type': 'string'}, 'metadata': {'type': 'object', 'required': ['archived', 'author', 'capturedAt', 'contentCreatedAt', 'contentType', 'favorite', 'media', 'note', 'platform', 'tags'], 'properties': {'note': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'media': {'type': 'array', 'items': {'type': 'object', 'required': ['altText', 'duration', 'height', 'ref', 'storedUrl', 'type', 'url', 'width'], 'properties': {'ref': {'type': 'string'}, 'url': {'type': 'string'}, 'type': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'altText': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'duration': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'storedUrl': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'author': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'archived': {'type': 'boolean'}, 'favorite': {'type': 'boolean'}, 'platform': {'type': 'string'}, 'capturedAt': {'type': 'string'}, 'contentType': {'type': 'string'}, 'contentCreatedAt': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'additionalProperties': False}
view_media
View bookmark images
View up to four selected stored images from a bookmark. Use refs returned by image-ranked search or fetch. Images are bounded previews; call only when visual inspection is useful.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id', 'refs'], 'properties': {'id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'refs': {'type': 'array', 'items': {'type': 'string', 'maxLength': 500, 'minLength': 1}, 'maxItems': 4, 'minItems': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bookmarkId', 'failures', 'images'], 'properties': {'images': {'type': 'array', 'items': {'type': 'object', 'required': ['byteLength', 'height', 'mimeType', 'ref', 'width'], 'properties': {'ref': {'type': 'string'}, 'width': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'height': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'mimeType': {'type': 'string'}, 'byteLength': {'type': 'number'}}, 'additionalProperties': False}}, 'failures': {'type': 'array', 'items': {'type': 'object', 'required': ['message', 'ref'], 'properties': {'ref': {'type': 'string'}, 'message': {'type': 'string'}}, 'additionalProperties': False}}, 'bookmarkId': {'type': 'string'}}, 'additionalProperties': False}
Added
manage_collection
Sept. 24, 2026, 2:40 a.m.
Added
list_collections
Sept. 24, 2026, 2:40 a.m.
Added
get_account
Sept. 24, 2026, 2:40 a.m.
Added
list_tags
Sept. 24, 2026, 2:40 a.m.
Added
library_stats
Sept. 24, 2026, 2:40 a.m.
Added
archive_bookmarks
Sept. 24, 2026, 2:40 a.m.
Added
update_bookmark
Sept. 24, 2026, 2:40 a.m.
Added
save_bookmark
Sept. 24, 2026, 2:40 a.m.
Added
list_bookmarks
Sept. 24, 2026, 2:40 a.m.
Added
view_media
Sept. 24, 2026, 2:40 a.m.
Added
fetch_many
Sept. 24, 2026, 2:40 a.m.
Added
fetch
Sept. 24, 2026, 2:40 a.m.
Added
search
Sept. 24, 2026, 2:40 a.m.