Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
{
"name": "raindrop",
"source": "./integrations/agent-plugin",
"description": "Find and organize your Raindrop library with reviewed plans.",
"version": "0.2.0"
"description": "rdrop for Raindrop.io: find links and organize your library with reviewed plans.",
"version": "0.2.1"
}
],
"description": "Raindrop library tools and reviewed organizing workflows from Machineyearn."
"description": "rdrop for Raindrop.io and reviewed bookmark organizing workflows from Machineyearn."
}
53 changes: 53 additions & 0 deletions .github/workflows/publish-mcp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Publish MCP Registry

on:
workflow_dispatch:
inputs:
version:
description: Published release version, without v
required: true
type: string

permissions:
contents: read

concurrency:
group: mcp-registry-${{ inputs.version }}
cancel-in-progress: false

jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- name: Validate requested version
env:
RELEASE_VERSION: ${{ inputs.version }}
run: |
[[ "$RELEASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]
- uses: actions/checkout@v6
with:
ref: refs/tags/v${{ inputs.version }}
- uses: actions/setup-node@v6
with:
node-version: '24'
- name: Verify published npm packages against the release
env:
GH_TOKEN: ${{ github.token }}
RELEASE_VERSION: ${{ inputs.version }}
run: |
gh release download "v$RELEASE_VERSION" --dir dist --pattern '*.tgz' --pattern checksums.txt
node scripts/verify-npm-release.mjs "$RELEASE_VERSION" dist
- name: Install verified registry publisher
run: |
curl --fail --location --retry 2 --output publisher.tar.gz https://github.com/modelcontextprotocol/registry/releases/download/v1.8.1/mcp-publisher_linux_amd64.tar.gz
echo 'a06c9096dcb9727c13555b6be26c7effa707b01f06a4c561ba7a3635443cf2cc publisher.tar.gz' | sha256sum --check
tar -xzf publisher.tar.gz mcp-publisher
- name: Authenticate with short-lived GitHub identity
run: ./mcp-publisher login github-oidc
- name: Validate registry metadata
run: ./mcp-publisher validate server.json
- name: Publish registry metadata
run: ./mcp-publisher publish server.json
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,5 @@ jobs:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "${GITHUB_REF_NAME}" dist/*.tar.gz dist/*.zip dist/*.tgz dist/checksums.txt \
--title "raindrop-cli ${GITHUB_REF_NAME}" \
--title "rdrop for Raindrop.io ${GITHUB_REF_NAME}" \
--generate-notes
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# raindrop-cli
# rdrop for Raindrop.io

**Find, review and organize your saved links. Keep your tags. Bring your own AI.**

Expand All @@ -11,6 +11,8 @@

Turn a growing [Raindrop.io](https://raindrop.io) library into something easier to use. Search saved links, inspect collections, find cleanup opportunities and review suggestions before making changes. Use it from your terminal or let your favorite agent do the reading and planning.

A Raindrop.io CLI, MCP server and reviewed bookmark organizer from **Machineyearn**, built as an independent integration.

- **Your organization stays yours.** Start with the tags and collections you already created; preserve existing tags when applying a plan.
- **Changes you can inspect.** See exact bookmarks, proposed tags and destinations, then dry-run the plan before applying it.
- **AI that fits your workflow.** Connect Codex or Claude, use a hosted tool-capable model, or run local Qwen and Laya.
Expand All @@ -25,11 +27,11 @@ Turn a growing [Raindrop.io](https://raindrop.io) library into something easier
```sh
brew install KingPsychopath/tap/rdrop
# Or Node 22+, with optional dependencies enabled:
npm install --global @machineyearn/raindrop-cli@0.2.0
npm install --global @machineyearn/raindrop-cli@0.2.1
rdrop version
```

Prefer no global install? Use `npx --yes @machineyearn/raindrop-cli@0.2.0 COMMAND`. [Native downloads](https://github.com/KingPsychopath/raindrop-cli/releases/latest) cover macOS, Linux and Windows on Intel/AMD and ARM. [Builds and checksums](docs/PACKAGING.md).
Prefer no global install? Use `npx --yes @machineyearn/raindrop-cli@0.2.1 COMMAND`. [Native downloads](https://github.com/KingPsychopath/raindrop-cli/releases/latest) cover macOS, Linux and Windows on Intel/AMD and ARM. [Builds and checksums](docs/PACKAGING.md).

### 2. Connect Raindrop

Expand Down Expand Up @@ -127,6 +129,8 @@ The product focuses on Raindrop. Model providers and proposal formats are agnost

## For developers

The public name is **rdrop for Raindrop.io**. Stable technical identifiers are the `raindrop-cli` repository, `@machineyearn/raindrop-cli` npm package, `rdrop` command and `raindrop@machineyearn` plugin. Storage support currently focuses on Raindrop.io; model and agent connections are provider-neutral.

A native Go CLI, local MCP server and direct model loop share the command implementation. The REST client, model clients and planning code use the standard library; MCP uses the official Go SDK. ACP configuration supplies this server to an existing ACP agent. Executor offers a smaller portable REST adapter. Docker is available as a packaging option.

- [Command reference](docs/COMMANDS.md) · [API coverage](docs/API_COVERAGE.md) · [Integrations](docs/INTEGRATIONS.md)
Expand Down
12 changes: 8 additions & 4 deletions docs/CLIENTS.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
# Connect your agent

Use the native `rdrop` executable or the pinned npm launcher from a local MCP client. The server starts read-only, reads the normal private CLI configuration, and keeps stdout reserved for MCP messages. New here? Follow [three-step setup and the copyable agent prompt](START_HERE.md) first.
Connect **rdrop for Raindrop.io** using the native `rdrop` executable or the pinned npm launcher from a local MCP client. The server starts read-only, reads the normal private CLI configuration, and keeps stdout reserved for MCP messages. New here? Follow [three-step setup and the copyable agent prompt](START_HERE.md) first.

## Codex and Claude plugins

The plugin displays as **rdrop for Raindrop.io** and keeps the stable installation identifier `raindrop@machineyearn` and skill command `/raindrop:organize`. This independent integration is maintained by Machineyearn.

The shared package in [integrations/agent-plugin](../integrations/agent-plugin) includes a portable Agent Plugins manifest, Codex/Claude compatibility manifests, a read-only MCP connection and one organizing skill. The skill teaches tool discovery, existing-tag preservation, bounded context, uncertainty review and exact-plan apply. It does not enable mutation tools or configure credentials.

For Codex:

```sh
codex plugin marketplace add KingPsychopath/raindrop-cli --ref v0.2.0
codex plugin marketplace add KingPsychopath/raindrop-cli --ref v0.2.1
codex plugin add raindrop@machineyearn
```

Expand All @@ -24,18 +26,20 @@ For Claude Code, run these inside Claude:

Invoke `/raindrop:organize` or ask it to organize your Raindrop library. For local development, use `claude --plugin-dir ./integrations/agent-plugin`. The manifests and marketplace were checked with `claude plugin validate`; this is package validation, not proof of every client's UI workflow. See [Claude's plugin reference](https://code.claude.com/docs/en/plugins-reference).

The MCP command is pinned to `@machineyearn/raindrop-cli@0.2.0`. Updating the plugin does not automatically authorize writes. Keep Node 22+ and optional npm dependencies enabled. Configure the token through the private CLI env/token file and run `rdrop doctor` before starting the client.
The MCP command is pinned to `@machineyearn/raindrop-cli@0.2.1`. Updating the plugin does not automatically authorize writes. Keep Node 22+ and optional npm dependencies enabled. Configure the token through the private CLI env/token file and run `rdrop doctor` before starting the client.

## Direct stdio configuration

The MCP Registry entry is [`io.github.KingPsychopath/raindrop-cli`](https://registry.modelcontextprotocol.io/?q=io.github.KingPsychopath%2Fraindrop-cli), displayed as **rdrop for Raindrop.io**. It describes the pinned npm command, `mcp serve` arguments and private token setup. Registry discovery is separate from a client's plugin directory and does not provision an account or enable writes. [Registry metadata and publishing](PACKAGING.md#mcp-registry).

For clients using `mcpServers`, including Claude Desktop and Cursor, add:

```json
{
"mcpServers": {
"raindrop": {
"command": "npx",
"args": ["--yes", "@machineyearn/raindrop-cli@0.2.0", "mcp", "serve"]
"args": ["--yes", "@machineyearn/raindrop-cli@0.2.1", "mcp", "serve"]
}
}
}
Expand Down
33 changes: 25 additions & 8 deletions docs/PACKAGING.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ The Go version is declared in `go.mod`; CI uses that file. The release workflow

For a released archive, download it and the matching `checksums.txt` from the same [GitHub release](https://github.com/KingPsychopath/raindrop-cli/releases). On Linux run `sha256sum --check checksums.txt --ignore-missing`; on macOS compare `shasum -a 256 YOUR_ARCHIVE` to that archive's entry before extracting it. Do not reuse another release's checksums.

The [Homebrew formula](../packaging/homebrew/rdrop.rb) and `KingPsychopath/tap` use the v0.2.0 source archive and its verified SHA-256 checksum. The `head` option tracks main. Update the source URL and checksum together after each release tag exists.
The [Homebrew formula](../packaging/homebrew/rdrop.rb) and `KingPsychopath/tap` use a tagged source archive and its verified SHA-256 checksum. The `head` option tracks main. Update the source URL and checksum together after each release tag exists; source archive checksums differ from native release archive checksums.

## npm packages

v0.2.0 is published as [@machineyearn/raindrop-cli](https://www.npmjs.com/package/@machineyearn/raindrop-cli) and six native platform packages. Every registry version's SHA-512 matches its exact [GitHub release](https://github.com/KingPsychopath/raindrop-cli/releases/tag/v0.2.0) tarball. Fresh registry installation passed version and read-only MCP catalog checks on macOS arm64; Homebrew and native archives are also available.
v0.2.1 is distributed as [@machineyearn/raindrop-cli](https://www.npmjs.com/package/@machineyearn/raindrop-cli) and six native platform packages. Publish the exact [GitHub release](https://github.com/KingPsychopath/raindrop-cli/releases/tag/v0.2.1) tarballs and verify every registry SHA-512 against those bytes with `scripts/verify-npm-release.mjs`. Homebrew and native archives provide alternative install routes.

```sh
node --test packaging/npm/launcher.test.cjs
node scripts/build-npm.mjs 0.2.0-development.1
node scripts/build-npm.mjs 0.2.1-development.1
node scripts/pack-npm.mjs
```

Expand All @@ -38,22 +38,39 @@ The launcher requires Node 22+, selects the installed native package, verifies i
Authenticate with `npm login`. Publish the exact tarballs downloaded from the matching GitHub release, so npm and the release checksums refer to the same bytes:

```sh
gh release download v0.2.0 --dir dist --pattern '*.tgz' --pattern checksums.txt
gh release download v0.2.1 --dir dist --pattern '*.tgz' --pattern checksums.txt
# Verify every downloaded tarball against checksums.txt first.
node scripts/publish-npm.mjs 0.2.0
node scripts/publish-npm.mjs 0.2.1
```

The script checks all seven package manifests, publishes each native package before the launcher, and skips an existing version only when its registry SHA-512 equals the local tarball. It stops on authentication, policy, network or integrity errors; it never overwrites a published version. npm requires account 2FA or an eligible granular publishing token and may prompt for browser approval. `npm login` alone does not satisfy this publishing requirement; see [npm's publishing policy](https://docs.npmjs.com/requiring-2fa-for-package-publishing-and-settings-modification/). `RDROP_RELEASE_DIR` selects another artifact directory and `RDROP_NPM_SCOPE` another owned scope. The release workflow attaches `.tgz` files to GitHub; it does **not** publish npm packages or provision credentials. Install a published release with:

```sh
npx --yes @machineyearn/raindrop-cli@0.2.0 mcp serve
npx --yes @machineyearn/raindrop-cli@0.2.1 mcp serve
```

Use a pinned real release version and treat it as installed executable code. The launcher and all six platform packages share the same release version.

## Agent plugin archive

`node scripts/pack-plugin.mjs 0.2.0` builds `dist/rdrop-agent-plugin_0.2.0.zip`, with portable, Codex and Claude manifests, MCP configuration, the shared organizing skill and MIT license. Before each release, update all three plugin manifest versions and the pinned MCP npm version together; the packer rejects mismatches. Install from the repository marketplace using the [client guide](CLIENTS.md), or inspect the ZIP before local installation. This package has not been submitted to a universal public plugin directory; repository distribution is separate from directory review.
`node scripts/pack-plugin.mjs 0.2.1` builds `dist/rdrop-agent-plugin_0.2.1.zip`, with portable, Codex and Claude manifests, MCP configuration, the shared organizing skill and MIT license. Before each release, update all three plugin manifest versions and the pinned MCP npm version together; the packer rejects mismatches. Install from the repository marketplace using the [client guide](CLIENTS.md), or inspect the ZIP before local installation. This package has not been submitted to a universal public plugin directory; repository distribution is separate from directory review.

The visible product name is **rdrop for Raindrop.io**, maintained independently by Machineyearn. Repository, npm, CLI and plugin identifiers remain stable. The plugin's MCP launcher pin, guide links and manifest versions must change together.

## MCP Registry

[server.json](../server.json) describes `io.github.KingPsychopath/raindrop-cli`, with the public title **rdrop for Raindrop.io**, npm package `@machineyearn/raindrop-cli`, local stdio transport and arguments `mcp serve`. The npm launcher's `mcpName` binds that package to the registry identity. The token environment variable is secret and optional because the CLI also supports private env/token files. Node 22+ and optional native dependencies are required. The listing starts the read-only server and does not provide a hosted endpoint or install a client plugin.

After publishing all seven exact npm release tarballs:

```sh
node scripts/verify-npm-release.mjs 0.2.1 dist
gh workflow run publish-mcp.yml --ref main -f version=0.2.1
gh run list --workflow publish-mcp.yml --limit 1
curl --fail 'https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.KingPsychopath/raindrop-cli'
```

The manually dispatched workflow checks out the requested release tag, verifies GitHub checksums and npm SHA-512 for all seven packages, verifies matching registry identity/version, then publishes with GitHub OIDC. The publisher archive is pinned by version and SHA-256. Authentication is short-lived and needs no registry secret. A missing npm version or integrity mismatch stops publication. See the [official registry publishing guide](https://modelcontextprotocol.io/registry/quickstart) and [GitHub Actions authentication](https://modelcontextprotocol.io/registry/github-actions). The registry is currently in preview; downstream directories control their own indexing and review.

## Docker and digests

Expand All @@ -69,4 +86,4 @@ This project supplies a Dockerfile, without an automatically published registry

## Release procedure

Run `make check` and `make check-integrations`, inspect the diff and release notes, and choose a new semantic version. Only then push its `vX.Y.Z` tag. CI builds six native archives and seven npm tarballs, verifies local npm installation on its host, builds/smokes Docker in CI, and publishes GitHub assets with checksums. It does not deploy Executor, download Laya checkpoints, mutate Raindrop data or publish npm/container packages.
Update install examples, all plugin versions/pins, and both version fields in `server.json` together. Run `make check` and `make check-integrations`, inspect the diff and release notes, and choose a new semantic version. Only then push its `vX.Y.Z` tag. CI builds six native archives and seven npm tarballs, verifies local npm installation on its host, builds/smokes Docker in CI, and publishes GitHub assets with checksums. Publish those exact npm tarballs, verify registry integrity, dispatch the MCP Registry workflow, then update and test the Homebrew source URL/checksum. The release process does not deploy Executor, download Laya checkpoints, mutate Raindrop data or publish container packages.
3 changes: 2 additions & 1 deletion docs/ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Current scope and remaining work

## v0.2.0 scope
## Current scope (v0.2.1)

- Native Go CLI with stable REST commands, tree paths, sanitized TSV and JSON/byte pipelines.
- Local MCP stdio server using the official Go SDK, read-only defaults, validated inputs, organizing prompt/resource and explicit mutation exposure.
Expand All @@ -13,6 +13,7 @@
- Executor portable REST app with real exact-call host approval, checked against an exact framework version.
- Six native release targets, npm platform packages/launcher under `@machineyearn`, checksums and a non-root container.
- Command reference generated from CLI help; source Go version used in CI.
- Public identity **rdrop for Raindrop.io**, stable technical names, shared agent plugins, and npm-backed MCP Registry discovery with verified release bytes and short-lived publishing identity.

## Runtime evidence

Expand Down
8 changes: 4 additions & 4 deletions docs/START_HERE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Start here
# Get started with rdrop for Raindrop.io

Install `rdrop`, connect your Raindrop account, then use your shell or agent. An existing Codex/Claude agent already supplies the model: you do not need another AI account, Laya, Executor or ACP to get started.

Expand All @@ -9,11 +9,11 @@ Choose one:
```sh
brew install KingPsychopath/tap/rdrop
# Or Node 22+, with optional dependencies enabled:
npm install --global @machineyearn/raindrop-cli@0.2.0
npm install --global @machineyearn/raindrop-cli@0.2.1
rdrop version
```

Without a global npm install, replace `rdrop` in the commands below with `npx --yes @machineyearn/raindrop-cli@0.2.0`. [Native downloads, source builds and checksums](PACKAGING.md).
Without a global npm install, replace `rdrop` in the commands below with `npx --yes @machineyearn/raindrop-cli@0.2.1`. [Native downloads, source builds and checksums](PACKAGING.md).

## 2. Connect Raindrop

Expand Down Expand Up @@ -68,6 +68,6 @@ These are optional routes. Keep the first setup small, then choose a provider or

- **Command not found:** restart the terminal, check the npm/Homebrew bin directory is on PATH, or use `npx`. GUI agents may need an absolute executable path.
- **Missing token or HTTP 401:** inspect `rdrop config paths` and `rdrop config show`, then replace the token in the private file. Do not paste it into chat.
- **Missing npm platform package:** reinstall with `npm install --global --include=optional @machineyearn/raindrop-cli@0.2.0`, or use a native archive.
- **Missing npm platform package:** reinstall with `npm install --global --include=optional @machineyearn/raindrop-cli@0.2.1`, or use a native archive.
- **No agent tools:** reload/start a new client session and check its MCP connection. Browser-only clients require a hosted HTTP service; this local server uses stdio.
- **Official/model provider unavailable:** check that provider's configuration and account limits. The shell CLI and normal REST reads do not depend on that provider.
Loading
Loading