Skip to main content
Glama
raindrop-mcp

raindrop-mcp

Raindrop.io MCP server

A small local Python MCP server I built to search and manage my Raindrop.io bookmarks from AI tools without exposing more account functionality than necessary.

I wanted the interface to stay deliberately small and auditable: a handful of explicit read/write tools, credentials kept outside the repository, and tests that never touch a real account.

Tools

Tool

Access

Description

list_collections

Read

List root and nested collections.

list_tags

Read

List tag names and bookmark counts, optionally for one collection.

search_bookmarks

Read

List bookmarks or search with Raindrop.io's native syntax.

get_bookmark

Read

Get one bookmark by ID.

create_bookmark

Write

Create a bookmark.

update_bookmark

Write

Update supplied fields on a bookmark.

Related MCP server: Raindrop.io MCP Server

Design decisions

  • Small, explicit tool surface: each operation has a clear purpose and read/write boundary.

  • Official REST API: the server talks directly to Raindrop.io rather than adding another integration layer.

  • Credentials via environment only: tokens stay outside the repository and tool arguments.

  • No implicit reads after writes: mutations return compact acknowledgements without making a second API request.

  • Fake transports in tests: the test suite never touches a real account.

Requirements

  • Python 3.10 or newer

  • uv

  • A Raindrop.io test token for your own account

Install

uv sync --extra test
cp .env.example .env

Open the Raindrop.io integrations settings, create an application, and select Create test token. Add that token to your local .env file:

RAINDROP_ACCESS_TOKEN=your-test-token

Use the test token, not the Client ID or Client Secret. Never commit or share the populated .env file.

Configure Codex

Add the following to ~/.codex/config.toml, replacing the working directory with the absolute path to your clone:

[mcp_servers.raindrop]
command = "uv"
args = ["run", "--env-file", ".env", "raindrop-mcp"]
cwd = "/absolute/path/to/raindrop-mcp-server"
enabled = true
default_tools_approval_mode = "writes"

[mcp_servers.raindrop.tools.list_collections]
approval_mode = "approve"

[mcp_servers.raindrop.tools.list_tags]
approval_mode = "approve"

[mcp_servers.raindrop.tools.search_bookmarks]
approval_mode = "approve"

[mcp_servers.raindrop.tools.get_bookmark]
approval_mode = "approve"

Restart Codex after saving. The listed read tools are approved automatically; create and update still require write approval.

Security

  • .env and other local environment files are ignored by Git; only the empty .env.example template is tracked.

  • API response bodies are not included in raised error messages.

Tool behavior

  • Omit query to list bookmarks, or provide Raindrop.io's native search syntax.

  • Searches default to relevance; listings default to newest first.

  • Search results are compact summaries; use get_bookmark for full detail.

  • Write tools do not perform implicit follow-up reads and return compact acknowledgements instead of full API responses.

  • MCP tool annotations describe read and mutation behavior, but are hints rather than access controls.

See Tool behavior for pagination, collection semantics, request mappings, and response shapes.

Test

uv run pytest

License

This project is licensed under the MIT License.

API references

Available Tools

6 tools
create_bookmarkA

Create a bookmark; link is required and metadata parsing is enabled.

Inputs: link (required), note, tags, cover, +5 more. Returns: Single normalized bookmark result.

get_bookmarkA
Read-only

Get one bookmark by its positive Raindrop.io ID.

Inputs: bookmark_id (required). Returns: Single normalized bookmark result.

list_collectionsA
Read-only

List Raindrop.io collections, including nested collections by default.

Inputs: include_children. Returns: Collection list returned by the MCP tool.

list_tagsA
Read-only

List tags with bookmark counts; collection_id 0 lists all tags.

A nonzero ID scopes the request to that collection. No child collections are fetched separately. The top-level count is the number of tags, not the number of bookmarks.

Inputs: collection_id. Returns: Tag summaries and the number of tags returned.

search_bookmarksA
Read-only

List bookmarks or search with native Raindrop.io syntax.

collection_id 0 searches all bookmarks; page numbering starts at zero. Results default to relevance for searches and newest first for listings.

Inputs: page, sort, query, nested, +2 more. Returns: Normalized, paginated bookmark summaries.

update_bookmarkA
Destructive

Update only the supplied fields on one bookmark.

Inputs: bookmark_id (required), link, note, tags, +6 more. Returns: Compact confirmation for a successful bookmark update.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 6 tools

    Disambiguation5/5

    Each tool maps to a distinct resource-action pair: tags, collections, and bookmarks are cleanly separated, and get_bookmark is clearly different from search_bookmarks. No two tools appear to do the same thing.

    Naming Consistency5/5

    All tool names follow the same lowercase verb_noun pattern: list, create, get, search, update. This is a predictable and consistent convention across the entire set.

    Tool Count5/5

    Six tools is well-scoped for a Raindrop.io integration covering bookmarks, collections, and tags. Each tool has a clear purpose and the set is not bloated or overly thin.

    Completeness3/5

    Bookmark reading, creation, updating, and searching are covered, but there is no delete_bookmark, which is a notable lifecycle gap. Collections and tags are read-only, so collection/tag management operations are missing, though this may be intentional for a read-focused MCP server.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers