Serveur MCP

Stashr

me.stashr/stashr
Connaissance et documentation Recherche et exploration Authentification requise MCP 2025-11-25

Ce que fait ce MCP

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
Schéma d’entrée
{'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'}}}
Schéma de sortie
{'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).
Lecture seule Idempotent
Schéma d’entrée
{'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)$'}}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'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}}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'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'}}}}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'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"}}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Schéma de sortie
{'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.
Destructif
Schéma d’entrée
{'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'}}}}}
Schéma de sortie
{'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.
Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048}}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'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'}}}
Schéma de sortie
{'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
Schéma d’entrée
{'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'}}}
Schéma de sortie
{'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.
Lecture seule Idempotent
Schéma d’entrée
{'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}}}
Schéma de sortie
{'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}
Ajouté
manage_collection
24 September 2026 02:40
Ajouté
list_collections
24 September 2026 02:40
Ajouté
get_account
24 September 2026 02:40
Ajouté
list_tags
24 September 2026 02:40
Ajouté
library_stats
24 September 2026 02:40
Ajouté
archive_bookmarks
24 September 2026 02:40
Ajouté
update_bookmark
24 September 2026 02:40
Ajouté
save_bookmark
24 September 2026 02:40
Ajouté
list_bookmarks
24 September 2026 02:40
Ajouté
view_media
24 September 2026 02:40
Ajouté
fetch_many
24 September 2026 02:40
Ajouté
fetch
24 September 2026 02:40
Ajouté
search
24 September 2026 02:40