Command-line interface for Joplin workflows using the real joplin terminal backend
Scanned 9/4/2026
Install to Claude Code
npx -y skills add gabrielmoreira/agent-skills-mirror --skill cli-anything-joplin --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Cli Anything Joplin?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/gabrielmoreira-cli-anything-joplin-agent-skills-mirror)More formats (shields.io, HTML) on the badges page.
---
name: "cli-anything-joplin"
description: "Command-line interface for Joplin workflows using the real joplin terminal backend"
---
# cli-anything-joplin
Use this skill to automate Joplin notebook, note, to-do, tag, attachment,
search, sync, and import/export workflows through a stateful harness backed by
the real `joplin` terminal binary.
## Requirements
- Python 3.10+
- Joplin terminal binary available as `joplin`
- Optional: pass `--profile` to target a specific Joplin profile
## Install
```bash
cd joplin/agent-harness
pip install -e .
```
## Usage
```bash
# REPL mode (default)
cli-anything-joplin
# Machine-readable one-shot command
cli-anything-joplin --json notebooks list
# Stateful project
cli-anything-joplin project new --name demo -o ./demo.joplin-harness.json
cli-anything-joplin --project ./demo.joplin-harness.json notes create "Meeting note"
# Dry-run (no auto-save)
cli-anything-joplin --json --dry-run --project ./demo.joplin-harness.json notes create temp
```
## JSON output contract
When `--json` is enabled, commands return:
- `ok`: boolean
- `command`: stable command identifier such as `notes.list`, `todos.toggle`
- `data`: command payload
- `error`: null on success, or `{ type, message }` on failure
## Command groups
- `project`: `new`, `open`, `save`, `info`, `json`, `status`
- `notebooks`: `list`, `create`, `use`, `remove`
- `notes`: `list`, `create`, `set`, `get`, `remove`, `copy`, `move`, `rename`
- `todos`: `list`, `create`, `toggle`, `clear`, `done`, `undone`
- `tags`: `list`, `add`, `remove`, `notetags`, `tagnotes`
- `search`: `run`
- `sync`: `run` (`--target`, `--upgrade`, `--use-lock`)
- `interop`: `import`, `export`
- `config`: `get`, `set`, `list`, `export`, `import-file`
- `attach`: `add`
- `status`: `show`, `restore`
- `backend`: `version`, `dump`, `keymap`, `geoloc`, `export-sync-status`
- `server`: `status`, `start`, `stop`
- `e2ee`: `status`, `target-status`, `decrypt`, `decrypt-file`
- `session`: `status`, `undo`, `redo`, `history`
## Agent guidance
- Prefer `--json` for parseable output.
- Use `--project` when running multi-step workflows so history is persisted.
- One-shot mutating commands auto-save the project unless `--dry-run` is set.
- REPL mode does not auto-save; run `project save` explicitly.
- Some Joplin CLI builds gate `search` behind GUI mode; if you see
`"only available in GUI mode"`, treat search as best-effort.
- Joplin 3.6.x can have a broken `version` command in npm global layouts; the
harness falls back to installed package metadata for `backend version`,
probing the symlink-resolved binary directory, the Windows-style sibling
`node_modules/joplin`, the Unix-style parent `lib/node_modules/joplin`, and
finally `npm root -g`.
- Backend `stdout`/`stderr` in command results are verbatim; do not assume
warnings were stripped from note bodies or exports.
- On failure, parse `error` using the same `command` field as success
(`config.import_file`, `e2ee.decrypt_file`). Multi-word subcommands use
a single dot between group and subcommand.
## Test workflow
```bash
# Quick feedback loop
python -m pytest -q cli_anything/joplin/tests/test_core.py
python -m pytest -q cli_anything/joplin/tests/test_full_e2e.py::TestCLISubprocess
# Real backend (joplin must be in PATH)
python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendCommands
python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendWorkflows
python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendIntegration
# Full suite
python -m pytest -v --tb=no cli_anything/joplin/tests
# Verify the installed console script entry point
CLI_ANYTHING_FORCE_INSTALLED=1 python -m pytest -v -s cli_anything/joplin/tests/test_full_e2e.py
```
Current validation baseline (Windows + Joplin CLI 3.6.2):
- `python -m pytest -q cli_anything/joplin/tests/test_core.py` -> `107 passed`
- `python -m pytest -q cli_anything/joplin/tests` -> `134 passed, 1 skipped`
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!