Grabblist
Save and organize web finds in persistent, user-controlled collections for AI assistants.
Should I use this
Quality & Safety
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": {
"grabblist": {
"url": "https://mcp.grabbitapp.com/api/mcp"
}
}
}Remote endpoints
https://mcp.grabbitapp.com/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (22)
π’ping
Test connectivity to Grabblist and return service version.
Input Schema
{
"type": "object",
"properties": {}
}π’get_wishlist(limit, platform)
Get all saved items from the user's Grabblist. Each item is a static snapshot β data reflects the moment it was saved, not current prices.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"description": "Max items to return (default: 50)"
},
"platform": {
"type": "string",
"description": "Filter by platform (domain name, e.g. \"amazon\", \"ebay\", \"trademe\")"
}
}
}π’get_item(id)
Get full details of a saved item by ID. Returns a static snapshot from the user's Grabblist.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The item ID"
}
},
"required": [
"id"
]
}π‘add_item(url, title, price, currency, image, ...)
Save an item to the user's Grabblist. Creates a static snapshot β Grabblist does not monitor prices or auto-update data. Only include fields with values available from the source. Price is optional: omit it for videos and other things without a price. If no image is provided, the server attempts to fetch og:image automatically.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Direct public HTTP(S) page URL."
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Exact title from the page"
},
"price": {
"type": "number",
"minimum": 0,
"maximum": 1000000000000,
"description": "Price as a number (e.g. 99.99), taken from the page. Omit when the item has no price (videos, free content)."
},
"currency": {
"type": "string",
"maxLength": 10,
"description": "Currency code of the price: USD, NZD, AUD, EUR, GBP, etc. Omit when there is no price."
},
"image": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Main image URL. Server auto-fetches og:image if not provided."
},
"images": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 2000
},
"description": "All image URLs found on the page"
},
"platform": {
"type": "string",
"maxLength": 100,
"description": "Site domain name without TLD: amazon.comβ\"amazon\", ebay.co.nzβ\"ebay\", kiwiquads.co.nzβ\"kiwiquads\""
},
"item_type": {
"type": "string",
"enum": [
"product",
"rental",
"service",
"course",
"listing",
"event",
"video",
"other"
],
"description": "What kind of item: product (buy), rental (Airbnb), service (cleaning), course (Udemy), listing (classified), event (ticket), video (YouTube, Twitch, TikTok, Vimeoβ¦). If omitted, the server infers it from the platform (video sites β video, otherwise product)."
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Description from the page (max 2000 chars)"
},
"condition": {
"type": "string",
"maxLength": 100,
"description": "Condition if applicable: New, Used, Refurbished, Used - Like New, Used - Good, Used - Fair"
},
"location": {
"type": "string",
"maxLength": 500,
"description": "Seller location or pickup location"
},
"category": {
"type": "string",
"enum": [
"electronics",
"furniture",
"home",
"clothing",
"vehicles",
"kids",
"sports",
"collectibles",
"tools",
"other"
],
"description": "Category β pick the best match"
},
"seller_name": {
"type": "string",
"maxLength": 200,
"description": "Seller or store name"
},
"seller_rating": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "Seller rating 0-5"
},
"seller_reviews": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000,
"description": "Number of seller reviews"
},
"original_price": {
"type": "number",
"minimum": 0,
"maximum": 1000000000000,
"description": "Original price before discount (if on sale)"
},
"attributes": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"description": "Specs/details as key-value pairs"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"description": "Tags for categorization"
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 1000000,
"description": "How many of this item"
},
"posted_at": {
"type": "string",
"maxLength": 64,
"description": "When the listing was originally posted (ISO 8601)"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"url",
"title",
"platform"
]
}π΄delete_item(id, reason)
Remove one or more items from the user's Grabblist (soft-delete). Pass a single id or an array of ids for batch operations.
Input Schema
{
"type": "object",
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to delete"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"id"
]
}βͺrestore_item(id, reason)
Restore one or more deleted (archived) items back to the Grabblist. Pass a single id or an array of ids for batch restore.
Input Schema
{
"type": "object",
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to restore"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"id"
]
}π’search_saved(query, limit)
Search within the user's saved items by keyword
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"description": "Search query"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 50,
"description": "Max results (default: 20)"
}
},
"required": [
"query"
]
}π΄update_price(id, price, source, reason)
Manually update the price on a saved item. Records old and new price for comparison. This is a manual correction, not automatic price tracking.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The item ID"
},
"price": {
"type": "number",
"minimum": 0,
"maximum": 1000000000000,
"description": "New current price"
},
"source": {
"type": "string",
"enum": [
"ai_check",
"manual"
],
"description": "Price update source"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"id",
"price"
]
}π΄update_item(id, notes, status, item_type, category, ...)
Edit fields on one or more saved items. Pass a single id or an array of ids for batch updates (same fields applied to all). For batch: attributes are REPLACED not merged, og:image fallback is skipped.
Input Schema
{
"type": "object",
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to update"
},
"notes": {
"type": "string",
"maxLength": 2000,
"description": "User or AI notes β personal comments, thoughts, comparisons"
},
"status": {
"type": "string",
"enum": [
"considering",
"shortlisted",
"decided",
"bought",
"rejected"
],
"description": "Decision status: considering, shortlisted, decided, bought, rejected"
},
"item_type": {
"type": "string",
"enum": [
"product",
"rental",
"service",
"course",
"listing",
"event",
"other"
],
"description": "What kind of item this is"
},
"category": {
"type": "string",
"enum": [
"electronics",
"furniture",
"home",
"clothing",
"vehicles",
"kids",
"sports",
"collectibles",
"tools",
"other"
],
"description": "Item category"
},
"target_price": {
"type": "number",
"minimum": 0,
"maximum": 1000000000000,
"description": "What the user wants to pay β not the actual price, but the goal price"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"description": "Replace all tags with this list"
},
"attributes": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"description": "Merge into existing attributes"
},
"image_url": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Main image URL"
},
"images": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 2000
},
"description": "All image URLs β replaces the entire images array"
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Item title"
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Item description (max 2000 chars)"
},
"is_favorite": {
"type": "boolean",
"description": "Set true to favorite, false to unfavorite"
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 1000000,
"description": "How many of this item"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"id"
]
}π’list_collections(id, status, created_by, min_price, max_price, ...)
List all collections OR get a specific collection with its items. Without id: returns all collections with counts/values. With id: returns that collection's metadata and all items inside (with optional filters).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Collection ID β if provided, returns that collection with all its items. If omitted, lists all collections."
},
"status": {
"type": "string",
"enum": [
"considering",
"shortlisted",
"decided",
"bought",
"rejected"
],
"description": "Filter by decision status (only when id is provided)"
},
"created_by": {
"type": "string",
"enum": [
"user",
"ai",
"extension"
],
"description": "Filter by who added: \"ai\" for AI-added items (only when id is provided)"
},
"min_price": {
"type": "number",
"description": "Minimum price filter (only when id is provided)"
},
"max_price": {
"type": "number",
"description": "Maximum price filter (only when id is provided)"
},
"platform": {
"type": "string",
"description": "Filter by platform domain name, e.g. \"amazon\", \"ebay\" (only when id is provided)"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter items that have ALL these tags (only when id is provided)"
},
"sort": {
"type": "string",
"enum": [
"newest",
"oldest",
"price_asc",
"price_desc",
"title"
],
"description": "Sort order (only when id is provided, default: newest)"
}
}
}π‘create_collection(name, icon, color, description, budget, ...)
Create a new collection (folder) in the user's Grabblist to organize saved items.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Collection name, e.g. \"Gaming Setup\" or \"Gift Ideas\""
},
"icon": {
"type": "string",
"description": "Material Symbols icon name (e.g. \"devices\", \"home\", \"shopping_bag\", \"checkroom\", \"directions_car\", \"favorite\"). Default: inventory_2"
},
"color": {
"type": "string",
"description": "Hex color for the collection (e.g. \"#3B82F6\", \"#22C55E\", \"#A855F7\", \"#EC4899\", \"#F59E0B\", \"#EF4444\"). Default: #3B82F6"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Short description of what this collection is for"
},
"budget": {
"type": "number",
"description": "Total spending target for this collection (e.g. 1500 for \"Build PC under $1500\")"
},
"budget_currency": {
"type": "string",
"description": "Currency for the budget (default: NZD)"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"name"
]
}π‘add_to_collection(collection_id, item_id, reason)
Add a saved item to a collection. Both the item and collection must already exist.
Input Schema
{
"type": "object",
"properties": {
"collection_id": {
"type": "string",
"description": "The collection ID"
},
"item_id": {
"type": "string",
"description": "The item ID to add"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"collection_id",
"item_id"
]
}π΄remove_from_collection(collection_id, item_ids, reason)
Remove one or more items from a collection. Pass a single item_id or an array of item_ids for batch removal. Items are NOT deleted β they stay in the Grabblist.
Input Schema
{
"type": "object",
"properties": {
"collection_id": {
"type": "string",
"description": "The collection ID"
},
"item_ids": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to remove"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"collection_id",
"item_ids"
]
}π΄delete_collection(id, reason)
Permanently delete a collection. Items inside are not deleted β they stay in the Grabblist.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The collection ID to delete"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"id"
]
}π΄update_collection(id, name, icon, color, description, ...)
Update a collection's name, icon, description, budget, or sharing status. Only provide the fields you want to change β omitted fields stay unchanged. Set is_public=true to share (returns public URL), is_public=false to unshare.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The collection ID to update"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "New collection name"
},
"icon": {
"type": "string",
"description": "Material Symbols icon name (e.g. \"devices\", \"home\", \"shopping_bag\")"
},
"color": {
"type": "string",
"description": "Hex color (e.g. \"#3B82F6\", \"#22C55E\", \"#EF4444\")"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "New description"
},
"budget": {
"type": "number",
"description": "New budget amount"
},
"budget_currency": {
"type": "string",
"description": "New budget currency"
},
"is_public": {
"type": "boolean",
"description": "Set true to share (generates public URL), false to unshare"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"id"
]
}π‘link_items(from_id, to_id, relation, pairs, reason)
Create typed relations between items: alternative (A or B), complement (A and B together), upgrade (B replaces A), duplicate (same item different site), same_seller. Supports single pair (from_id, to_id, relation) or bulk (pairs array).
Input Schema
{
"type": "object",
"properties": {
"from_id": {
"type": "string",
"description": "First item ID (for single pair mode)"
},
"to_id": {
"type": "string",
"description": "Second item ID (for single pair mode)"
},
"relation": {
"type": "string",
"enum": [
"alternative",
"complement",
"upgrade",
"duplicate",
"same_seller"
],
"description": "Type of relationship (for single pair mode)"
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"from_id": {
"type": "string",
"description": "First item ID"
},
"to_id": {
"type": "string",
"description": "Second item ID"
},
"relation": {
"type": "string",
"enum": [
"alternative",
"complement",
"upgrade",
"duplicate",
"same_seller"
],
"description": "Type of relationship"
}
},
"required": [
"from_id",
"to_id",
"relation"
]
},
"description": "Array of pairs to link (for bulk mode)"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
}
}π’get_item_graph(id)
Get all relations for an item β alternatives, complements, upgrades, duplicates. Returns the item and all connected items with their relation types.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The item ID to get relations for"
}
},
"required": [
"id"
]
}π΄unlink_items(from_id, to_id, relation, reason)
Remove a relation between two items.
Input Schema
{
"type": "object",
"properties": {
"from_id": {
"type": "string",
"description": "First item ID"
},
"to_id": {
"type": "string",
"description": "Second item ID"
},
"relation": {
"type": "string",
"enum": [
"alternative",
"complement",
"upgrade",
"duplicate",
"same_seller"
],
"description": "The relation type to remove"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"from_id",
"to_id",
"relation"
]
}π’get_item_history(item_id, limit)
Get the change history for a saved item β who changed what and when.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"description": "The item ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 50,
"description": "Max events to return (default: 20)"
}
},
"required": [
"item_id"
]
}π’get_collection_activity(collection_id, limit)
Get recent activity on a collection β additions, removals, edits.
Input Schema
{
"type": "object",
"properties": {
"collection_id": {
"type": "string",
"description": "The collection ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 50,
"description": "Max events to return (default: 20)"
}
},
"required": [
"collection_id"
]
}π΄set_pinned_items(collection_id, item_ids, reason)
Set the pinned "Top Picks" items for a collection (max 3). Pinned items are highlighted on the share page.
Input Schema
{
"type": "object",
"properties": {
"collection_id": {
"type": "string",
"description": "The collection ID"
},
"item_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Items to pin, in display order (1st = top)"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
},
"required": [
"collection_id",
"item_ids"
]
}π΄send_feedback(type, message, url, tool, error)
Send feedback, a bug report or a feature request to the Grabblist team. Only call this when the user asks to report something, or agrees after you offer to report a problem (parsing failure, broken URL, missing feature); show them the message first. Be specific about what went wrong and where.
Input Schema
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"bug",
"parsing_failure",
"feature_request",
"feedback"
],
"description": "Type: bug (something broken), parsing_failure (price/title/image not extracted), feature_request (wishlist), feedback (general feedback)"
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "What happened or what you propose. Be specific β the team reads this."
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL where the issue occurred"
},
"tool": {
"type": "string",
"description": "The tool you were using when the issue occurred (e.g. add_item, search_saved)"
},
"error": {
"type": "string",
"description": "Error message you received, if any"
}
},
"required": [
"type",
"message"
]
}Community
Evidence