用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/gbencke/dotfiles --skill raindrop命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Generates a detailed C4-model architecture document for the current repository: System Context, Container, Component, and Code (function/method) levels, plus a full call graph. Outputs Markdown, self-contained interactive HTML (force-directed SVG call graph, anchor links), and PDF. Use when user says "C4", "generate C4 docs", "document this repo", "architecture document", "call graph of this repo", or invokes /c4.
Query a pre-indexed CodeGraph knowledge graph of the current repo — symbol search, callers/callees, change impact, affected tests, and one-shot area exploration — so you read only the files that matter instead of grepping the tree. Use when asked to "explore this codebase", "who calls X", "what does X call", "what breaks if I change X", "which tests cover these changes", "index this repo with codegraph", or "codegraph <anything>". Pi has no MCP client, so ignore the project's MCP-tool docs and use the CLI below.
Adversarial review of a change: a PR, a branch diff, or a patch file. Runs inline in a single process — blast radius, then per-lens propose → kill → judge — and writes a PR-comment-ready report plus findings.json under .gbencke/adversarial-review/reports/. Spawns no subagents. Trigger: /review-change <pr-url|pr-number|branch|patch-file> [base], "adversarial review of this PR/branch/patch".
基于 SOC 职业分类
正在显示 SKILL.md
| name | raindrop |
| description | Manage bookmarks, collections, tags, and highlights in Raindrop.io using the REST API. |
This skill provides direct access to the Raindrop.io bookmark manager via its REST API. Use it to save, search, organize, and manage bookmarks (called "raindrops"), collections, tags, and highlights.
Requires RAINDROP_TOKEN to be set in your environment.
All requests use a Bearer token:
Authorization: Bearer $RAINDROP_TOKEN
Base URL: https://api.raindrop.io/rest/v1
Rate limit: 120 requests per minute per authenticated user. HTTP 429 is returned when exceeded.
Collections are folders/groups for bookmarks. System collections use special IDs:
| ID | Name |
|---|---|
0 | All (except Trash) |
-1 | Unsorted |
-99 | Trash |
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/collections
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/collections/childrens
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/collection/{id}
curl -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "My Collection", "public": false}' \
https://api.raindrop.io/rest/v1/collection
Body fields:
| Field | Type | Description |
|---|---|---|
title | string | Collection name |
public | boolean | Accessible without authentication? |
view | string | list, simple, grid, masonry |
sort | number | Sort order (descending) |
parent.$id | integer | Parent collection ID (omit for root collections) |
cover | array | Cover image URLs |
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Renamed Collection"}' \
https://api.raindrop.io/rest/v1/collection/{id}
Moves the collection and its descendants to Trash. Raindrops move to Trash.
curl -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/collection/{id}
curl -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/collection/-99
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/user/stats
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/raindrop/{id}
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/{collectionId}?perpage=25&page=0"
Query parameters:
| Parameter | Type | Description |
|---|---|---|
sort | string | -created (default), created, score, -sort, title, -title, domain, -domain |
perpage | integer | Results per page (max 50) |
page | integer | Page number starting at 0 |
search | string | Search query (see Search Operators below) |
nested | boolean | Include bookmarks from nested collections |
curl -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"link": "https://example.com",
"title": "Example",
"excerpt": "A description",
"tags": ["tag1", "tag2"],
"collection": {"$id": 12345},
"important": false,
"pleaseParse": {}
}' \
https://api.raindrop.io/rest/v1/raindrop
Set "pleaseParse": {} to auto-fetch title, cover, and description from the URL.
Body fields:
| Field | Type | Description |
|---|---|---|
link* | string | URL (required) |
title | string | Title (max 1000 chars) |
excerpt | string | Description (max 10000 chars) |
note | string | Personal note (max 10000 chars) |
tags | array | List of tag strings |
important | boolean | Mark as favourite |
collection | object | {"$id": collectionId} |
pleaseParse | object | {} to auto-parse metadata from URL |
order | number | Sort position (0 = first) |
cover | string | Cover image URL |
highlights | array | Initial highlights |
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["newtag"], "important": true}' \
https://api.raindrop.io/rest/v1/raindrop/{id}
Moves to Trash. Remove from Trash to permanently delete.
curl -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/raindrop/{id}
curl -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{"link": "https://example.com", "title": "Example 1"},
{"link": "https://another.com", "title": "Example 2"}
]
}' \
https://api.raindrop.io/rest/v1/raindrops
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": [111, 222], "tags": ["bulk-tag"]}' \
https://api.raindrop.io/rest/v1/raindrops/{collectionId}
Moves to Trash. When collectionId is -99, permanently deletes.
curl -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": [111, 222]}' \
https://api.raindrop.io/rest/v1/raindrops/{collectionId}
curl -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"link": "https://github.com/some/repo"}' \
https://api.raindrop.io/rest/v1/raindrop/suggest
Use these in the search query parameter:
| Operator | Example | Description |
|---|---|---|
| Plain text | javascript tutorial | Full-text search |
#tag | #python | Filter by tag |
site:domain | site:github.com | Filter by hostname |
type:value | type:article | Type: link, article, image, video, document, audio |
important:true | important:true | Favourited only |
created:>DATE | created:>2024-01-01 | Created after date (ISO 8601) |
created:<DATE | created:<2024-12-31 | Created before date |
Combine operators: #python site:github.com type:article
# All tags
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/tags
# Tags in a specific collection
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/tags/{collectionId}
Response: {"result": true, "items": [{"_id": "tagname", "count": 42}]}
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["oldname"], "replace": "newname"}' \
https://api.raindrop.io/rest/v1/tags
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["js", "javascript", "ecmascript"], "replace": "javascript"}' \
https://api.raindrop.io/rest/v1/tags
curl -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["obsolete-tag"]}' \
https://api.raindrop.io/rest/v1/tags
A highlight is a text excerpt saved from within a bookmark. Colors: blue, brown, cyan, gray, green, indigo, orange, pink, purple, red, teal, yellow (default: yellow).
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/highlights?perpage=25&page=0"
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/highlights/{collectionId}
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
https://api.raindrop.io/rest/v1/raindrop/{id}
# highlights[] array is inside the item object
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"highlights": [
{"text": "Some quoted text", "color": "yellow", "note": "My note"}
]
}' \
https://api.raindrop.io/rest/v1/raindrop/{id}
Include the highlight _id and only the fields to change:
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"highlights": [{"_id": "62388e9e48b63606f41e44a6", "note": "Updated note"}]}' \
https://api.raindrop.io/rest/v1/raindrop/{id}
Set text to an empty string:
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"highlights": [{"_id": "62388e9e48b63606f41e44a6", "text": ""}]}' \
https://api.raindrop.io/rest/v1/raindrop/{id}
| Field | Type | Description |
|---|---|---|
_id | integer | Unique identifier |
link | string | URL |
title | string | Title (max 1000 chars) |
excerpt | string | Description (max 10000 chars) |
note | string | Personal note (max 10000 chars) |
type | string | link, article, image, video, document, audio |
tags | array | List of tag strings |
important | boolean | Marked as favourite |
collection.$id | integer | Collection ID |
cover | string | Cover image URL |
domain | string | Hostname (files always show raindrop.io) |
created | string | ISO 8601 creation date |
lastUpdate | string | ISO 8601 last updated date |
highlights | array | List of highlight objects |
broken | boolean | Original URL is unreachable |
curl -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"link": "https://example.com/article",
"collection": {"$id": -1},
"tags": ["reading"],
"pleaseParse": {}
}' \
https://api.raindrop.io/rest/v1/raindrop
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=typescript&perpage=20"
curl -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/52644516?perpage=50&page=0&sort=-created"
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": [111, 222], "collection": {"$id": 99999}}' \
https://api.raindrop.io/rest/v1/raindrops/0
curl -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": [111, 222], "tags": ["new-tag"]}' \
https://api.raindrop.io/rest/v1/raindrops/0
result: true → successresult: false → failure; check error and errorMessage fieldsX-RateLimit-Reset timestamppleaseParse: {} when saving new bookmarks to auto-fetch metadata.search with operators like #tag site:domain to filter precisely.perpage=50 (max) with page for efficient pagination.POST /raindrops) for importing multiple links at once (max 100 per request).0 reads all bookmarks but cannot be used for bulk update/delete — use the specific collection ID instead.-99) permanently deletes when you remove from it; use regular remove for soft-delete.