rainkeeper
Rainkeeper is an MCP server that gives Claude natural-language control over your Raindrop.io bookmark library, covering collections, bookmarks, bulk operations, search, and tags — with full support for free accounts.
Collections
List all collections (root and sub-collections) with IDs, titles, parent IDs, and counts
Get details of a single collection by ID
Create collections, including nested sub-collections via
parent_idUpdate collections — rename, recolor, or toggle public visibility
Delete collections (contents move to Unsorted automatically)
Bookmarks
List bookmarks in any collection (
0= All,-1= Unsorted), with pagination and sortingGet a single bookmark by ID (full detail: tags, note, type, domain)
Create a new bookmark with optional title, tags, note, and target collection
Update a bookmark — change title, tags, note, importance, or collection
Move a bookmark explicitly to a different collection
Delete a bookmark permanently
Bulk Operations
Move multiple bookmarks to a target collection in one call
Apply tags to multiple bookmarks (merges with existing tags)
Mark multiple bookmarks as important (star/unstar)
Permanently delete multiple bookmarks
Search
Search across your entire library or within a specific collection using Raindrop's full search syntax: keywords, phrases (
"machine learning"), tags (#ai), types (type:article), exclusions (-draft), domains (site:github.com), unsorted (collection:unsorted), and starred (important:true)
Tags
List all tags across your library, optionally scoped to a specific collection
Rename a tag everywhere it appears
Delete one or more tags from all bookmarks
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rainkeeperlist my collections"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
· · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · ·
____ _ ___ _ _ _ _______ _____ _____ ____ _____ ____
| _ \ / \ |_ _| \ | | |/ / ____| ____| ___| _ \| ____| __ \
| |_) | / _ \ | || \| | ' /| _| | _| | |_ | |_) | _| | /
| _ < / ___ \ | || |\ | . \| |___| |___| _| | __/| |___| _ \
|_| \_\/_/ \_\___|_| \_|_|\_\_____|_____|_| |_| |_____|_| \_\
· · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · ·The Raindrop.io MCP Server that works on free accounts — and actually moves bookmarks.
What is Raindrop.io?
Raindrop.io is the bookmark manager that makes the web collectible. Save anything — articles, videos, PDFs, images, links — organise it into collections and sub-collections, tag it, annotate it, and surface it exactly when you need it. It runs on every platform, syncs everywhere, and has a free tier that covers everything most people ever need.
If you've ever lost a link, abandoned browser bookmarks, or wished your read-later queue could talk back — Raindrop is the answer.
Rainkeeper connects Raindrop to Claude, giving you natural-language control over your entire library.
Related MCP server: Raindrop.io MCP Server
Why Rainkeeper?
Two problems with the existing MCP options:
The official Raindrop.io MCP server requires a Pro subscription (~$3/month). If you're on the free tier — which covers the vast majority of Raindrop's feature set — you cannot use it.
The community alternative (adeze/raindrop-mcp) has a silent critical bug: collection moves do nothing. Ask Claude to file a bookmark into a collection, and the API call returns 200 OK — while the bookmark sits exactly where it was. The root cause is a malformed request body that the Raindrop API silently ignores. The same bug breaks all bulk move operations.
Rainkeeper fixes both.
Rainkeeper | Official MCP | Community MCP | |
Free account | ✅ | ❌ Pro only | ✅ |
Collection moves work | ✅ | ✅ | ❌ Silent fail |
Sub-collection support | ✅ | — | ❌ |
Bulk operations | ✅ | — | ✅ (broken) |
Self-hostable | ✅ | ✅ | ✅ |
Open source (MIT) | ✅ | — | ✅ |
The Fix
The Raindrop.io REST API uses a nested object for all collection references. Sending a flat integer is accepted without error — and silently ignored.
// ✅ Correct — what Rainkeeper sends
PUT /raindrop/123
{"collection": {"$id": 456}}
// ❌ Silently ignored — what the community MCP sends
PUT /raindrop/123
{"collectionId": 456}The same applies to bulk operations:
// ✅ Correct
PUT /raindrops/0
{"ids": [111, 222], "collection": {"$id": 456}}
// ❌ Returns 404 or silently fails
PUT /raindrops/0
{"ids": [111, 222], "collectionId": 456}RaindropClient enforces the correct format at the HTTP layer. Tools never pass raw integer IDs to the API. One rule, one place, always correct.
Quick Start
1. Get your token
Raindrop.io → Settings → Integrations → For Developers → create an app → copy the Test token. Free accounts included. Takes 30 seconds.
2. Install
git clone https://github.com/simonives/rainkeeper.git
cd rainkeeper
pip install -e . # or: uv pip install -e .3. Configure
cp .env.example .env
# Open .env — set RAINDROP_ACCESS_TOKEN=your_token_here4. Register with Claude
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"rainkeeper": {
"command": "python",
"args": ["-m", "rainkeeper.server"],
"cwd": "/absolute/path/to/rainkeeper",
"env": {
"RAINDROP_ACCESS_TOKEN": "your_token_here"
}
}
}
}Restart Claude Desktop after saving.
claude mcp add rainkeeper -- python -m rainkeeper.serverMake sure your .env is in the rainkeeper directory and contains your token.
5. Verify
Ask Claude: "List my Raindrop collections."
You should see your collections within a few seconds. If you get an auth error, verify the token in your config matches what's in Raindrop Settings → Integrations.
Tools
Rainkeeper exposes 17 tools across five domains. Claude selects the right tool automatically — docstrings are tuned for tool selection accuracy.
Start every session with
list_collections. You need collection IDs to move or file bookmarks, and Raindrop doesn't use predictable names as identifiers.
Collections
Tool | What it does |
| All collections and sub-collections — id, title, parent_id, count |
| Single collection detail |
| New collection; pass |
| Rename, recolour, or toggle public visibility |
| Delete a collection — contents move to Unsorted |
Bookmarks
Tool | Key parameters | Notes |
|
|
|
|
| Full detail: tags, note, type, domain |
|
| Saves to Unsorted by default |
|
| Pass |
|
| Explicit move — better tool selection than update |
|
| Permanent |
Bulk Operations
Tool | What it does |
| Move a list of bookmark IDs to a target collection |
| Apply tags to a list of bookmarks (merges with existing) |
| Star or unstar a list of bookmarks |
| Permanently delete a list of bookmarks |
Search
Tool | Notes |
| Searches all bookmarks by default ( |
Search syntax:
Syntax | Example | Finds |
Word |
| Bookmarks containing "python" |
Phrase |
| Exact phrase match |
Tag |
| Bookmarks tagged "ai" |
Type |
| Articles only ( |
Exclude |
| Excludes the word "draft" |
Domain |
| From a specific domain |
Untagged |
| Bookmarks with no tags |
Unsorted |
| Items in Unsorted |
Starred |
| Starred / important bookmarks |
Tags
Tool | What it does |
| All tags across your library; pass |
| Rename a tag everywhere it appears |
| Remove one or more tags from all bookmarks |
Sweep Workflows
Rainkeeper is built for inbox-zero sweeps: work through Unsorted, tag and file everything, leave nothing behind.
"List everything in my Unsorted collection and suggest a collection for each."
"Move all bookmarks tagged #read-later to my Reading collection."
"Search for everything tagged #ai from the last 30 days and list titles and URLs."
"Rename the tag 'ai-tools' to 'ai' across my whole library."
"File the 20 most recent bookmarks into the right collections based on their titles."
"Delete everything in Unsorted older than 6 months."Architecture
rainkeeper/
├── src/
│ └── rainkeeper/
│ ├── server.py FastMCP app · registers all tools
│ ├── client.py RaindropClient · all HTTP lives here
│ ├── config.py RAINDROP_ACCESS_TOKEN · BASE_URL · headers
│ └── tools/
│ ├── collections.py 5 tools — list · get · create · update · delete
│ ├── raindrops.py 6 tools — list · get · create · update · move · delete
│ ├── bulk.py 4 tools — move · tag · star · delete (batch)
│ ├── search.py 1 tool — full-text + Raindrop syntax
│ └── tags.py 3 tools — list · rename · delete
├── .env.example token template — copy to .env, never commit .env
├── pyproject.toml installable package · rainkeeper CLI entrypoint
└── README.mdDesign rule: RaindropClient owns all HTTP. Tools are thin wrappers — no httpx in tool files. The API mapping (including the collection move fix) is enforced in one place and testable independently of the MCP layer.
Known Limitations
The following Raindrop.io API capabilities are not yet exposed. Open a feature request if any matter to your workflow, or start an idea in Discussions.
Highlights — create and read highlights within a bookmark
User profile —
GET /user(handy for verifying auth is working)Imports / exports — bulk HTML bookmark import, export to file
Sharing — shared collection management
OAuth 2.0 — multi-user auth; currently personal test token only
Contributing
Rainkeeper is maintained by @simonives. See CONTRIBUTING.md for how to raise bugs, propose features, and fork the project.
License
MIT — see LICENSE.
Available Tools
19 toolsbulk_delete_raindropsC
Permanently delete multiple bookmarks. ids must be non-empty.
Inputs: ids (required), collection_id (required). Returns: object
bulk_mark_importantB
Flag multiple bookmarks as important (starred). ids must be non-empty.
Inputs: ids (required), collection_id (required), important. Returns: object
bulk_move_raindropsA
Move multiple bookmarks to a target collection. ids must be non-empty and all from source_collection_id — ids from other collections are silently skipped by the API.
Inputs: ids (required), source_collection_id (required), target_collection_id (required). Returns: object
bulk_tag_raindropsA
Apply tags to multiple bookmarks. Merges with existing tags. WARNING: passing tags=[] will remove all tags from the targeted bookmarks.
Inputs: ids (required), tags (required), collection_id (required). Returns: object
create_collectionC
Create a new collection. Pass parent_id to create a sub-collection.
Inputs: title (required), color, public, parent_id. Returns: object
create_raindropA
Save a new bookmark. collection_id -1 = Unsorted. Tags is a list of strings. Pass title='' to explicitly clear the auto-detected title.
Inputs: link (required), note, tags, title, +2 more. Returns: object
delete_collectionB
Delete a collection. Contents move to Unsorted.
Inputs: collection_id (required). Returns: object
delete_raindropB
Delete a bookmark permanently.
Inputs: raindrop_id (required). Returns: object
delete_tagsB
Delete one or more tags from all bookmarks.
Inputs: tags (required). Returns: object
get_collectionA
Get details of a single collection by id.
Inputs: collection_id (required). Returns: object
get_raindropB
Get a single bookmark by id.
Inputs: raindrop_id (required). Returns: object
list_collectionsA
List all Raindrop.io collections (root and sub-collections), with id, title, and parent_id.
Inputs: no named parameters. Returns: result
list_raindropsA
List bookmarks in a collection. collection_id 0 = All, -1 = Unsorted. sort: -created, title, -title, domain. Maximum per_page is 50.
Inputs: page, sort, per_page, collection_id. Returns: object
list_tagsA
List all tags. Pass collection_id to scope to a specific collection.
Inputs: collection_id. Returns: result
move_raindropB
Move a single bookmark to a different collection. Explicit tool for clarity.
Inputs: raindrop_id (required), target_collection_id (required). Returns: object
rename_tagC
Rename a tag across all bookmarks.
Inputs: new_tag (required), old_tag (required). Returns: object
search_raindropsA
Search bookmarks using Raindrop search syntax. collection_id 0 = search all. Supports #tag, word, "phrase", type:article, etc. Maximum per_page is 50.
Inputs: query (required), page, per_page, collection_id. Returns: object
update_collectionB
Update a collection's title, visibility, or colour. color is a hex string e.g. '#ff0000'.
Inputs: collection_id (required), color, title, public. Returns: object
update_raindropB
Update a bookmark. Pass collection_id to move it — uses the correct nested API format.
Inputs: raindrop_id (required), note, tags, title, +2 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 19 tools
Tools are mostly distinct across resources (collections, raindrops, tags) and actions (create, delete, list, etc.). However, bulk operations and single operations (e.g., bulk_move_raindrops vs move_raindrop) have overlapping purposes, and bulk_mark_important could be considered a subset of update_raindrop.
All tools follow a consistent verb_noun pattern in snake_case, with optional prefixes like bulk_ or create_ indicating scope. There are no violations or mixed conventions.
19 tools cover the essential operations for a bookmark management API: CRUD, bulk operations, search, and tag management. This is neither too few nor too many for the domain.
The tool set covers most core functionalities: CRUD for collections and raindrops, tag management, search, and bulk actions. Missing advanced features like import/export or sharing, but the core workflow is complete.
Maintenance
Related MCP Connectors
Manage Redbooth tasks, task lists, comments, tags and files from Claude and other AI assistants.
Every Canopy public API operation as a tool, run as you after a browser sign-in or on an API key.
All your bookmarks in one library. Share them with your AI agents. Read-only search over your saves.
Save, search, read, tag, and organize your bookmarks from AI assistants with OAuth sign-in.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access and manage Raindrop.io bookmarks, collections, tags, and highlights through the Model Context Protocol. Supports CRUD operations, advanced search, file uploads, and bulk editing of bookmarks.238 npmMIT
- FlicenseAqualityDmaintenanceEnables to manage Raindrop.io bookmarks programmatically—add, search, and organize bookmarks from LLM apps.414-
- AlicenseNot gradedqualityDmaintenanceEnables language models to access and manage Raindrop.io bookmarks, collections, tags, and highlights through the Model Context Protocol.24 npmMIT
- AlicenseAqualityDmaintenanceEnables Claude Code and other MCP clients to manage bookmarks, collections, and tags in Raindrop.io accounts via natural language.152MIT