rainkeeper

rainkeeper

Exposes the Raindrop.io API as Claude tools for managing bookmarks, collections, tags, and bulk operations, with proper collection move support.

Category
访问服务器

README

  ·  ·    ·  ·    ·  ·    ·    ·  ·    ·  ·    ·   ·  ·    ·  ·
    ·    ·    ·  ·     ·    · ·     ·    ·    ·  ·     ·  ·    ·

 ____      _    ___ _   _ _  _______ _____ _____ ____  _____ ____
|  _ \    / \  |_ _| \ | | |/ / ____| ____|  ___|  _ \| ____| __ \
| |_) |  / _ \  | ||  \| | ' /|  _| |  _| | |_  | |_) |  _| |    /
|  _ <  / ___ \ | || |\  | . \| |___| |___|  _| |  __/| |___|  _ \
|_| \_\/_/   \_\___|_| \_|_|\_\_____|_____|_|   |_|   |_____|_| \_\

    ·    ·    ·  ·     ·    · ·     ·    ·    ·  ·     ·  ·    ·
  ·  ·    ·  ·    ·  ·    ·    ·  ·    ·  ·    ·   ·  ·    ·  ·

<div align="center">

The Raindrop.io MCP Server that works on free accounts — and actually moves bookmarks.

Python 3.11+ FastMCP License: MIT Raindrop.io API v1

</div>


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.


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_here

4. Register with Claude

<details> <summary><strong>Claude Desktop (macOS / Windows)</strong></summary>

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. </details>

<details> <summary><strong>Claude CLI</strong></summary>

claude mcp add rainkeeper -- python -m rainkeeper.server

Make sure your .env is in the rainkeeper directory and contains your token. </details>

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
list_collections All collections and sub-collections — id, title, parent_id, count
get_collection Single collection detail
create_collection New collection; pass parent_id to nest inside an existing one
update_collection Rename, recolour, or toggle public visibility
delete_collection Delete a collection — contents move to Unsorted

Bookmarks

Tool Key parameters Notes
list_raindrops collection_id, page, per_page, sort 0 = All, -1 = Unsorted
get_raindrop raindrop_id Full detail: tags, note, type, domain
create_raindrop link, collection_id, title, tags, note Saves to Unsorted by default
update_raindrop raindrop_id + any field Pass collection_id to move
move_raindrop raindrop_id, target_collection_id Explicit move — better tool selection than update
delete_raindrop raindrop_id Permanent

Bulk Operations

Tool What it does
bulk_move_raindrops Move a list of bookmark IDs to a target collection
bulk_tag_raindrops Apply tags to a list of bookmarks (merges with existing)
bulk_mark_important Star or unstar a list of bookmarks
bulk_delete_raindrops Permanently delete a list of bookmarks

Search

Tool Notes
search_raindrops Searches all bookmarks by default (collection_id=0). Full Raindrop search syntax supported.

Search syntax:

Syntax Example Finds
Word python Bookmarks containing "python"
Phrase "machine learning" Exact phrase match
Tag #ai Bookmarks tagged "ai"
Type type:article Articles only (article, video, image, document, audio)
Exclude -draft Excludes the word "draft"
Domain site:github.com From a specific domain
Untagged # Bookmarks with no tags
Unsorted collection:unsorted Items in Unsorted
Starred important:true Starred / important bookmarks

Tags

Tool What it does
list_tags All tags across your library; pass collection_id to scope
rename_tag Rename a tag everywhere it appears
delete_tags 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.md

Design 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 profileGET /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.


<div align="center"> <sub>Built with <a href="https://github.com/jlowin/fastmcp">FastMCP</a> · <a href="https://developer.raindrop.io">Raindrop.io REST API v1</a></sub> </div>

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选