Stashr
Search, read, and organize your saves from X, Reddit, TikTok, Instagram, and more.
Should I use this
Quality & Safety
Findings (2)
- LOWin fetch
- LOWin fetch_many
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"stashr": {
"url": "https://stashr.me/mcp"
}
}
}Remote endpoints
https://stashr.me/mcpstreamable-httpWhat it can do
Tool inventory
Tools (13)
🟢search(cursor, filters, limit, query, rankMode, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"cursor": {
"description": "Pass the nextCursor value from the previous page to continue paging",
"type": "string"
},
"filters": {
"type": "object",
"properties": {
"authorMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"authors": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "An author username (\"naval\"), optionally platform-scoped (\"twitter:naval\")"
}
},
"capturedAfter": {
"description": "Only bookmarks saved on/after this ISO date (inclusive)",
"type": "string"
},
"capturedBefore": {
"description": "Only bookmarks saved before this ISO date (exclusive)",
"type": "string"
},
"contentTypeMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"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"
}
},
"favorite": {
"description": "[\"favorite\"] = only favorites; [\"not-favorite\"] = only non-favorites",
"type": "array",
"items": {
"type": "string",
"enum": [
"favorite",
"not-favorite"
]
}
},
"media": {
"description": "Media presence: \"image\"/\"video\" = has that type, \"any-media\" = has any, \"text-only\" = has none (not combinable with the others)",
"type": "array",
"items": {
"type": "string",
"enum": [
"image",
"video",
"any-media",
"text-only"
]
}
},
"mediaMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"note": {
"description": "[\"has-note\"] = only bookmarks with a user note",
"type": "array",
"items": {
"type": "string",
"enum": [
"has-note",
"no-note"
]
}
},
"platformMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"github",
"instagram",
"reddit",
"tiktok",
"twitter",
"web",
"youtube"
],
"description": "Platform id — X/Twitter is \"twitter\""
}
},
"tagMode": {
"description": "include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them",
"type": "string",
"enum": [
"include_any",
"include_all",
"exclude_any",
"exclude_all"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"untagged": {
"description": "true = only bookmarks with no tags at all",
"type": "boolean"
}
}
},
"limit": {
"default": 10,
"type": "integer",
"minimum": 1,
"maximum": 25
},
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"rankMode": {
"default": "post",
"description": "\"post\" ranks whole bookmarks; \"image\" ranks individual stored images by caption for visual queries",
"type": "string",
"enum": [
"post",
"image"
]
},
"state": {
"description": "Which bookmarks to search; defaults to active only",
"type": "string",
"enum": [
"active",
"archived",
"all"
]
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"degraded": {
"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",
"type": "array",
"items": {
"type": "string",
"enum": [
"semantic_unavailable",
"image_rank_unavailable"
]
}
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"rankMode": {
"type": "string",
"enum": [
"post",
"image"
],
"description": "The ranking that actually ran"
},
"requestedRankMode": {
"description": "Present only when rankMode differs from what was requested",
"type": "string",
"enum": [
"post",
"image"
]
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"capturedAt": {
"type": "string"
},
"contentCreatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"contentType": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"id": {
"type": "string"
},
"matchedMedia": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"caption": {
"type": "string"
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"type": {
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"altText",
"caption",
"height",
"ref",
"type",
"url",
"width"
],
"additionalProperties": false
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"type": {
"type": "string"
}
},
"required": [
"altText",
"ref",
"type"
],
"additionalProperties": false
},
"description": "Lightweight refs usable with view_media"
},
"mediaCount": {
"type": "number"
},
"platform": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"text": {
"type": "string",
"description": "Bounded plain-text snippet"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Real title only; null when the source has none"
},
"url": {
"type": "string"
}
},
"required": [
"archived",
"author",
"capturedAt",
"contentCreatedAt",
"contentType",
"favorite",
"id",
"media",
"mediaCount",
"platform",
"tags",
"text",
"title",
"url"
],
"additionalProperties": false
}
}
},
"required": [
"nextCursor",
"rankMode",
"results"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢fetch(id)
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).
Input Schema
{
"type": "object",
"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)$"
}
},
"required": [
"id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"capturedAt": {
"type": "string"
},
"contentCreatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"contentType": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"duration": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"storedUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"type": "string"
},
"url": {
"type": "string"
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"altText",
"duration",
"height",
"ref",
"storedUrl",
"type",
"url",
"width"
],
"additionalProperties": false
}
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"platform": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"archived",
"author",
"capturedAt",
"contentCreatedAt",
"contentType",
"favorite",
"media",
"note",
"platform",
"tags"
],
"additionalProperties": false
},
"text": {
"type": "string",
"description": "Full bookmark body rendered as Markdown"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"metadata",
"text",
"title",
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢fetch_many(ids)
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.
Input Schema
{
"type": "object",
"properties": {
"ids": {
"minItems": 1,
"maxItems": 20,
"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)$"
}
}
},
"required": [
"ids"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"capturedAt": {
"type": "string"
},
"contentCreatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"contentType": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"duration": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"storedUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"type": "string"
},
"url": {
"type": "string"
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"altText",
"duration",
"height",
"ref",
"storedUrl",
"type",
"url",
"width"
],
"additionalProperties": false
}
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"platform": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"archived",
"author",
"capturedAt",
"contentCreatedAt",
"contentType",
"favorite",
"media",
"note",
"platform",
"tags"
],
"additionalProperties": false
},
"text": {
"type": "string",
"description": "Full bookmark body rendered as Markdown"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"metadata",
"text",
"title",
"url"
],
"additionalProperties": false
},
"description": "Full documents in the order the ids were requested"
},
"missing": {
"type": "array",
"items": {
"type": "string"
},
"description": "Requested ids that were not found or are not visible"
}
},
"required": [
"documents",
"missing"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢view_media(id, refs)
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.
Input Schema
{
"type": "object",
"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": {
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 500
}
}
},
"required": [
"id",
"refs"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"bookmarkId": {
"type": "string"
},
"failures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"ref": {
"type": "string"
}
},
"required": [
"message",
"ref"
],
"additionalProperties": false
}
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"byteLength": {
"type": "number"
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"mimeType": {
"type": "string"
},
"ref": {
"type": "string"
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"byteLength",
"height",
"mimeType",
"ref",
"width"
],
"additionalProperties": false
}
}
},
"required": [
"bookmarkId",
"failures",
"images"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢list_bookmarks(collectionId, cursor, filters, limit, state)
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.
Input Schema
{
"type": "object",
"properties": {
"collectionId": {
"description": "List a saved collection's bookmarks: its stored filters are applied, with any explicit filters here overriding same-name ones",
"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)$"
},
"cursor": {
"description": "Pass the nextCursor value from the previous page to continue paging",
"type": "string"
},
"filters": {
"type": "object",
"properties": {
"authorMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"authors": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "An author username (\"naval\"), optionally platform-scoped (\"twitter:naval\")"
}
},
"capturedAfter": {
"description": "Only bookmarks saved on/after this ISO date (inclusive)",
"type": "string"
},
"capturedBefore": {
"description": "Only bookmarks saved before this ISO date (exclusive)",
"type": "string"
},
"contentTypeMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"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"
}
},
"favorite": {
"description": "[\"favorite\"] = only favorites; [\"not-favorite\"] = only non-favorites",
"type": "array",
"items": {
"type": "string",
"enum": [
"favorite",
"not-favorite"
]
}
},
"media": {
"description": "Media presence: \"image\"/\"video\" = has that type, \"any-media\" = has any, \"text-only\" = has none (not combinable with the others)",
"type": "array",
"items": {
"type": "string",
"enum": [
"image",
"video",
"any-media",
"text-only"
]
}
},
"mediaMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"note": {
"description": "[\"has-note\"] = only bookmarks with a user note",
"type": "array",
"items": {
"type": "string",
"enum": [
"has-note",
"no-note"
]
}
},
"platformMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"github",
"instagram",
"reddit",
"tiktok",
"twitter",
"web",
"youtube"
],
"description": "Platform id — X/Twitter is \"twitter\""
}
},
"tagMode": {
"description": "include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them",
"type": "string",
"enum": [
"include_any",
"include_all",
"exclude_any",
"exclude_all"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"untagged": {
"description": "true = only bookmarks with no tags at all",
"type": "boolean"
}
}
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
},
"state": {
"default": "active",
"type": "string",
"enum": [
"active",
"archived",
"all"
]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"degraded": {
"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",
"type": "array",
"items": {
"type": "string",
"enum": [
"semantic_unavailable",
"image_rank_unavailable"
]
}
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"capturedAt": {
"type": "string"
},
"contentCreatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"contentType": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"id": {
"type": "string"
},
"matchedMedia": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"caption": {
"type": "string"
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"type": {
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"altText",
"caption",
"height",
"ref",
"type",
"url",
"width"
],
"additionalProperties": false
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"type": {
"type": "string"
}
},
"required": [
"altText",
"ref",
"type"
],
"additionalProperties": false
},
"description": "Lightweight refs usable with view_media"
},
"mediaCount": {
"type": "number"
},
"platform": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"text": {
"type": "string",
"description": "Bounded plain-text snippet"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Real title only; null when the source has none"
},
"url": {
"type": "string"
}
},
"required": [
"archived",
"author",
"capturedAt",
"contentCreatedAt",
"contentType",
"favorite",
"id",
"media",
"mediaCount",
"platform",
"tags",
"text",
"title",
"url"
],
"additionalProperties": false
}
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"rankMode": {
"type": "string",
"enum": [
"post",
"image"
]
},
"requestedRankMode": {
"description": "Present only when rankMode differs from what was requested",
"type": "string",
"enum": [
"post",
"image"
]
}
},
"required": [
"items",
"nextCursor",
"rankMode"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡save_bookmark(url)
Save a public URL to Stashr. Repeated calls for the same URL are idempotent and return the existing bookmark.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"format": "uri"
}
},
"required": [
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"bookmark": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"capturedAt": {
"type": "string"
},
"contentCreatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"contentType": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"duration": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"storedUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"type": "string"
},
"url": {
"type": "string"
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"altText",
"duration",
"height",
"ref",
"storedUrl",
"type",
"url",
"width"
],
"additionalProperties": false
}
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"platform": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"archived",
"author",
"capturedAt",
"contentCreatedAt",
"contentType",
"favorite",
"media",
"note",
"platform",
"tags"
],
"additionalProperties": false
},
"text": {
"type": "string",
"description": "Full bookmark body rendered as Markdown"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"metadata",
"text",
"title",
"url"
],
"additionalProperties": false
},
"created": {
"type": "boolean"
}
},
"required": [
"bookmark",
"created"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡update_bookmark(archived, id, isFavorite, note, tags)
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.
Input Schema
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"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)$"
},
"isFavorite": {
"type": "boolean"
},
"note": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"tags": {
"type": "object",
"properties": {
"add": {
"type": "array",
"items": {
"type": "string"
}
},
"remove": {
"type": "array",
"items": {
"type": "string"
}
},
"set": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"required": [
"id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"capturedAt": {
"type": "string"
},
"contentCreatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"contentType": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"altText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"duration": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"height": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ref": {
"type": "string"
},
"storedUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"type": "string"
},
"url": {
"type": "string"
},
"width": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"altText",
"duration",
"height",
"ref",
"storedUrl",
"type",
"url",
"width"
],
"additionalProperties": false
}
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"platform": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"archived",
"author",
"capturedAt",
"contentCreatedAt",
"contentType",
"favorite",
"media",
"note",
"platform",
"tags"
],
"additionalProperties": false
},
"text": {
"type": "string",
"description": "Full bookmark body rendered as Markdown"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"metadata",
"text",
"title",
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}⚪archive_bookmarks(archived, ids)
Archive or restore up to 200 bookmarks in one call. Archiving is reversible; returns the ids whose state actually changed.
Input Schema
{
"type": "object",
"properties": {
"archived": {
"type": "boolean",
"description": "true archives the bookmarks, false restores them"
},
"ids": {
"minItems": 1,
"maxItems": 200,
"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)$"
}
}
},
"required": [
"archived",
"ids"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Bookmark ids whose archive state actually changed"
}
},
"required": [
"ids"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢library_stats(filters, state)
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.
Input Schema
{
"type": "object",
"properties": {
"filters": {
"type": "object",
"properties": {
"authorMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"authors": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "An author username (\"naval\"), optionally platform-scoped (\"twitter:naval\")"
}
},
"capturedAfter": {
"description": "Only bookmarks saved on/after this ISO date (inclusive)",
"type": "string"
},
"capturedBefore": {
"description": "Only bookmarks saved before this ISO date (exclusive)",
"type": "string"
},
"contentTypeMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"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"
}
},
"favorite": {
"description": "[\"favorite\"] = only favorites; [\"not-favorite\"] = only non-favorites",
"type": "array",
"items": {
"type": "string",
"enum": [
"favorite",
"not-favorite"
]
}
},
"media": {
"description": "Media presence: \"image\"/\"video\" = has that type, \"any-media\" = has any, \"text-only\" = has none (not combinable with the others)",
"type": "array",
"items": {
"type": "string",
"enum": [
"image",
"video",
"any-media",
"text-only"
]
}
},
"mediaMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"note": {
"description": "[\"has-note\"] = only bookmarks with a user note",
"type": "array",
"items": {
"type": "string",
"enum": [
"has-note",
"no-note"
]
}
},
"platformMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"github",
"instagram",
"reddit",
"tiktok",
"twitter",
"web",
"youtube"
],
"description": "Platform id — X/Twitter is \"twitter\""
}
},
"tagMode": {
"description": "include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them",
"type": "string",
"enum": [
"include_any",
"include_all",
"exclude_any",
"exclude_all"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"untagged": {
"description": "true = only bookmarks with no tags at all",
"type": "boolean"
}
}
},
"state": {
"default": "active",
"description": "Which bookmarks to count",
"type": "string",
"enum": [
"active",
"archived",
"all"
]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"archived": {
"type": "number"
},
"byContentType": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"byMonth": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
},
"description": "Capture counts keyed by \"YYYY-MM\", newest first"
},
"byPlatform": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"favorites": {
"type": "number"
},
"total": {
"type": "number"
},
"untagged": {
"type": "number"
},
"withNote": {
"type": "number"
}
},
"required": [
"archived",
"byContentType",
"byMonth",
"byPlatform",
"favorites",
"total",
"untagged",
"withNote"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢list_tags
List the user's Stashr tags with usage counts. Use the returned tag names in bookmark filters and tag updates.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"count": {
"type": "number",
"description": "Active bookmarks currently carrying this tag"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"color",
"count",
"id",
"name"
],
"additionalProperties": false
}
}
},
"required": [
"tags"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢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.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"access": {
"type": "object",
"properties": {
"hasAppAccess": {
"type": "boolean"
},
"hasPaidPlan": {
"type": "boolean"
},
"hasProAccess": {
"type": "boolean"
},
"trial": {
"anyOf": [
{
"type": "object",
"properties": {
"tagsRemaining": {
"type": "number"
},
"trialEndsAt": {
"type": "string"
}
},
"required": [
"tagsRemaining",
"trialEndsAt"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"hasAppAccess",
"hasPaidPlan",
"hasProAccess",
"trial"
],
"additionalProperties": false
},
"email": {
"type": "string"
},
"id": {
"type": "string"
},
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"type": "string"
}
},
"required": [
"access",
"email",
"id",
"image",
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢list_collections
List saved filter collections. Pass a collection id to list_bookmarks to read its contents.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"collections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"filters": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"icon": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"pinned": {
"type": "boolean"
},
"position": {
"type": "number"
}
},
"required": [
"color",
"filters",
"icon",
"id",
"name",
"pinned",
"position"
],
"additionalProperties": false
}
}
},
"required": [
"collections"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴manage_collection(action, color, filters, icon, name, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"create",
"update",
"delete"
]
},
"color": {
"description": "A Stashr collection color id",
"type": "string"
},
"filters": {
"type": "object",
"properties": {
"authorMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"authors": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "An author username (\"naval\"), optionally platform-scoped (\"twitter:naval\")"
}
},
"capturedAfter": {
"description": "Only bookmarks saved on/after this ISO date (inclusive)",
"type": "string"
},
"capturedBefore": {
"description": "Only bookmarks saved before this ISO date (exclusive)",
"type": "string"
},
"contentTypeMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"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"
}
},
"favorite": {
"description": "[\"favorite\"] = only favorites; [\"not-favorite\"] = only non-favorites",
"type": "array",
"items": {
"type": "string",
"enum": [
"favorite",
"not-favorite"
]
}
},
"media": {
"description": "Media presence: \"image\"/\"video\" = has that type, \"any-media\" = has any, \"text-only\" = has none (not combinable with the others)",
"type": "array",
"items": {
"type": "string",
"enum": [
"image",
"video",
"any-media",
"text-only"
]
}
},
"mediaMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"note": {
"description": "[\"has-note\"] = only bookmarks with a user note",
"type": "array",
"items": {
"type": "string",
"enum": [
"has-note",
"no-note"
]
}
},
"platformMode": {
"type": "string",
"enum": [
"include",
"exclude"
]
},
"platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"github",
"instagram",
"reddit",
"tiktok",
"twitter",
"web",
"youtube"
],
"description": "Platform id — X/Twitter is \"twitter\""
}
},
"tagMode": {
"description": "include_any = OR (default), include_all = AND, exclude_any = none of these tags, exclude_all = not all of them",
"type": "string",
"enum": [
"include_any",
"include_all",
"exclude_any",
"exclude_all"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"untagged": {
"description": "true = only bookmarks with no tags at all",
"type": "boolean"
}
}
},
"icon": {
"description": "A Stashr collection icon id",
"type": "string"
},
"name": {
"description": "Collection name, required for create",
"type": "string",
"minLength": 1,
"maxLength": 50
},
"pinned": {
"description": "Pin or unpin the collection in the sidebar (update only)",
"type": "boolean"
},
"confirm": {
"description": "Must be true to delete a collection",
"type": "boolean"
},
"id": {
"description": "Collection id, required for update and delete",
"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)$"
}
},
"required": [
"action"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"collection": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"filters": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"icon": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"pinned": {
"type": "boolean"
},
"position": {
"type": "number"
}
},
"required": [
"color",
"filters",
"icon",
"id",
"name",
"pinned",
"position"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Community
Evidence