The split is deliberate and worth knowing before you wire it up: reading is a read-only query against the local database, so summarising works on the words you actually wrote, while creating a note goes through the URL scheme so this server never writes to the database. One gap follows from that — UpNote's `note/new` URL has no tag parameter and hashtags in the body stay plain text, so tags go on in the app afterwards.
A Python server with two halves. Reads query the local UpNote SQLite database read-only and return the actual note text, so an assistant can summarise and answer from it. Writes go through UpNote's `upnote://` URL scheme and never touch the database.
- Substring search across note titles and bodies, returning id, title, update time and a snippet — `search_notes`
- The full title and body of a note, optionally as raw HTML — `get_note`
- The most recently updated notes — `list_recent`
- Notebooks with their note counts and parent, and the notes inside one — `list_notebooks`, `list_notes_in_notebook`
- Tags with note counts, and the notes carrying a tag — `list_tags`, `list_notes_by_tag`
- A new note created from the chat, Markdown by default, filed into a notebook matched by name — `create_note`
- An existing note or notebook opened in the app — `open_note`, `open_notebook`
UpNote desktop installed, plus Python 3.10+ or uv. macOS is fully supported and verified; Windows is best-effort and its default database path under `%APPDATA%\UpNote\` is unverified — point `UPNOTE_LENS_DB` at the SQLite file if reads fail. Install with `uvx upnote-lens-mcp`, `pip install upnote-lens-mcp`, or straight from the repository with uv. The package is `upnote-lens-mcp` 0.1.2.
One command — pip install upnote-lens-mcp
