Skip to main content

🐻 bearcli

The missing open-source CLI for Bear notes. Read, search, export, and manage your notes from the terminal.

CI License: MIT Python 3.13+ macOS

Website · Commands · How it works


  • Agent-ready - bundled Claude skill and MCP server (bearcli mcp install)
  • Search & browse - fuzzy or exact, filters for tags, dates, and status
  • Write - create, append, tag, archive, straight from the terminal
  • Terminal UI - a full Bear client in your shell
  • Export & git mirror - self-contained markdown folders, never-stuck --push
  • Secret protection - offline credential scanning and redaction
  • Scriptable - JSON/TSV output everywhere; Python API via bearkit

Install

brew install michel-tricot/tap/bearcli   # or: uv tool install bearcli, pipx install bearcli

Or from a clone: uv sync, then uv run bearcli --help.

Troubleshooting

The bearcli command can conflict with Bear's official CLI if both are installed — which -a bearcli shows which one your shell picks. To make this CLI take precedence, put its install directory first in your PATH:

# in your ~/.zshrc or ~/.bashrc
export PATH="$(brew --prefix)/bin:$PATH"   # brew install
export PATH="$HOME/.local/bin:$PATH"       # uv tool or pipx install

MCP configs are immune to the conflict: bearcli mcp install writes the absolute path of the very binary it is run from. If bearcli itself reaches the wrong tool, call ours by its full path once:

"$(brew --prefix)/bin/bearcli" mcp install   # or: ~/.local/bin/bearcli

Quick start

bearcli list                       # 20 most recently modified notes
bearcli search "quarterly report"  # search titles, tags, and content
bearcli get <note-id>              # print a note's markdown
bearcli create "Idea" --tag inbox  # create a note
bearcli export ~/bear-backup       # export everything as markdown folders
bearcli ui                         # full Bear client in the terminal

Commands

Commands are grouped under note and tag.

Shortcuts

The most common commands are also top-level aliases:

bearcli list        # alias for `note list`
bearcli search      # alias for `note search`
bearcli get         # alias for `note get`
bearcli open        # alias for `note open`
bearcli create      # alias for `note create`

Browse & read

bearcli note list                            # 20 most recently modified
bearcli note list --limit 5 --tag work       # filters: tag (incl. nested), dates...
bearcli note list --modified-after 2026-07-01
bearcli note list --only pinned              # or: encrypted, trashed, archived
bearcli note list --all --trashed --archived
bearcli note list --ids                      # only identifiers, one per line

bearcli note get C44D09DC                    # a unique id prefix (4+ chars) works everywhere
bearcli note get C44D09DC-... --meta         # with YAML-style frontmatter
bearcli note get C44D09DC-... -r             # rewrite attachment refs to absolute paths
bearcli note get C44D09DC-... --redact-secrets   # secrets replaced by placeholders
bearcli note open C44D09DC-...               # open in the Bear app

Search

bearcli note search "invoice" --tag work -n 5   # case-insensitive substring
bearcli note search "quarterly planing" --fuzzy  # typo-tolerant, ranked by score

Write

Writes go through the Bear app and are verified before the command reports success.

bearcli note create "Meeting notes" --text "agenda..." --tag work
echo "follow-up item" | bearcli note append C44D09DC-...
bearcli note rename C44D09DC-... "New title"
bearcli note get C44D09DC-... | sed 's/foo/bar/' | bearcli note replace C44D09DC-...
bearcli note attach C44D09DC-... screenshot.png   # ≤500 KB
bearcli note archive C44D09DC-...
bearcli note trash C44D09DC-...

Tags

bearcli tag list                             # all tags with note counts
bearcli note tag C44D09DC-... "work/ideas"   # add a tag to a note
bearcli note untag C44D09DC-... "work/ideas" # remove a tag from a note
bearcli tag rename old-name new-name         # across all notes
bearcli tag delete old-name                  # across all notes (asks first)

Export

Every note becomes a directory: <slug>/README.md plus attachments. A generated index makes the export browsable on GitHub.

Notes are scanned for secrets before anything is written. Findings block the export. Use --redact-secrets to export with [redacted: <rule>] placeholders or --allow-secrets to export as-is. Notes in Bear are never modified.

⚠️ Warning: detection is best-effort. A secret that reads like ordinary text will not be caught. Better: keep secrets in a password manager or in Bear's encrypted notes.

bearcli export ~/bear-backup
bearcli export ~/bear-backup --sync          # only rewrite notes that changed
bearcli export ~/bear-backup --redact-secrets  # secrets become [redacted: <rule>]

# Mirror to a private git repo (clone it first). Bear is the source of truth:
# manual edits stay in history but HEAD always matches Bear. Never gets stuck.
git clone git@github.com:you/bear-notes.git ~/bear-notes
bearcli export ~/bear-notes --sync --push

Terminal UI

bearcli ui is a full Bear client in the terminal. Press ? for the key map.

bearcli ui

Scripting

Every listing takes --format / -f: table (default), json, or tab-separated text built for pipes.

bearcli list -f json | jq -r '.[].title'
bearcli list -f text | cut -f1               # text is: id, modified, tags, status, title
bearcli stats -f json                        # library totals: counts, words, top tags

Dates are ISO (2026-07-01 or 2026-07-01T14:30). Override the database path with --db or BEAR_DB_PATH. Encrypted notes are listed but unreadable. bearcli --version prints the version.

Agent skill

An Agent Skill for Claude Code and other agents ships inside the package (source):

bearcli skills install               # into ~/.claude/skills/
bearcli skills install --dir .claude/skills   # into a project
bearcli skills list                  # bundled skills
bearcli skills show bear-notes       # print the skill

Reinstall after upgrading so agents always match the installed CLI.

MCP server

bearcli mcp run serves your notes to AI apps over MCP (stdio): list, read, search, create, edit, tag, archive, open in Bear. Note content is secret-redacted by default.

bearcli mcp install configures your client:

bearcli mcp install                  # choose from a list
bearcli mcp install claude-desktop   # or: claude-code, cursor, vscode,
                                     #     windsurf, gemini-cli, zed, codex

JSON configs are updated in place with a .bak. Other clients get exact instructions. Restart the client afterwards.

Use as a library

The engine ships separately on PyPI as bearkit: reading, search, writes, and secret detection. No CLI or TUI dependencies.

from bearkit import Bear, BearWriteError

with Bear() as bear:
    for note in bear.list_notes(tag="work", limit=10):
        print(note.title, note.tags)

    try:
        bear.add_tag(bear.get_note("C44D09DC"), "from-python")
    except BearWriteError:
        print("Bear did not apply the change")

Full reference: docs/BEARKIT.md. The package ships typed (py.typed).

Development

uv sync
uv run ruff format src/ && uv run ruff check src/
uv run ty check src/
uv run python scripts/check_docs.py          # docs must cover every command

Design notes and internals: docs/IMPLEMENTATION.md. Contributor/agent guidelines: AGENTS.md.

License

MIT · not affiliated with Shiny Frog

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bearcli-1.7.3.tar.gz (31.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bearcli-1.7.3-py3-none-any.whl (39.7 kB view details)

Uploaded Python 3

File details

Details for the file bearcli-1.7.3.tar.gz.

File metadata

  • Download URL: bearcli-1.7.3.tar.gz
  • Upload date:
  • Size: 31.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bearcli-1.7.3.tar.gz
Algorithm Hash digest
SHA256 c5089328c83796e0c5106732b2535213a95c4133487cd37d713ac95eb14c0fc1
MD5 fe433f39c1f31eb9cacbb511c7fb6d91
BLAKE2b-256 3743a1387f665d87b9564623c56431ed7290e978a76f4564a676c70d9d64cd4c

See more details on using hashes here.

File details

Details for the file bearcli-1.7.3-py3-none-any.whl.

File metadata

  • Download URL: bearcli-1.7.3-py3-none-any.whl
  • Upload date:
  • Size: 39.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bearcli-1.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 384e3e310038059e884e048dd22ef18a07887c22cb18e2871bbcc03f4d0d8c50
MD5 37d9edf1e7545ab66ee36c016c182d3d
BLAKE2b-256 1c8c080ebe2cfc3759e8d9cd213a68ae0865a6ff2cfb1d606d0067064e6984d0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page