First stable release with incremental Marvin sync and the companion MCP
server, both validated end-to-end in a real vault by a beta tester across ten
beta rounds.
Why 0.11.1 and not 0.11.0?
0.11.0-beta1throughbeta10shipped, which
burns0.11.0as a stable version. Obsidian's stock update checker can't
compare pre-release suffixes, so anyone on a beta would never be offered
0.11.0. Documented in CONTRIBUTING.md.
Everything below is opt-in and off by default. If you upgrade and change
nothing, the plugin behaves as it did in 0.10.1 — with one improvement you get
for free (completed tasks, below).
Completed tasks stay in your daily note
No setup required — this applies to everyone.
Previously, checking a task off in the managed Today region deleted the line on
the next refresh. Your daily note ended up recording only what you hadn't
finished, which is backwards for a record of the day.
Completed tasks now stay, checked, in the position they already occupied.
The cause was upstream: Marvin's Today and due reads only return open work.
/dueItems is documented as "open", /todayItems has no parameter for
completed items, and no endpoint lists what you completed on a given day. So a
checked task went missing from the read and the line was removed. Checked
Marvin lines already in your note are now kept when the current read no longer
returns them.
Deliberately narrow, so stale work doesn't get pinned into notes:
- Only checked lines are kept. An unchecked task Marvin stops returning has
genuinely left your Today list — rescheduled, unscheduled, deleted — and still
disappears. - Marvin still wins. Un-complete a task there and it renders open again.
- Nothing accumulates across days. Preservation is scoped to each note's own
dated region.
Experimental: incremental sync
Opt-in, off by default, desktop only. Settings → Advanced: incremental sync.
What it solves
Amazing Marvin's request API throttles heavily — confirmed with their support,
and it still happens when routing through the local desktop API. With enough
categories, a full import can hit the limit partway through and leave a
half-imported tree.
Incremental sync avoids the REST API for ongoing work entirely. It hydrates once
via a bulk database read, then keeps current through CouchDB's changes feed,
updating only the notes that actually changed rather than rebuilding the
tree.
The trade-off, stated plainly
It needs your Amazing Marvin database credentials (server, database, user,
password from Marvin's API settings page) — a materially larger credential than
the limited API token, granting full read access to your Marvin database. They're
stored in this plugin's Obsidian settings.
That's why it's opt-in, why the settings section spells out the reasoning inline,
and why the REST importer remains the default and the fallback on every failure.
Desktop only — the settings section and the sync itself. A phone keyboard
with autocorrect and no reveal toggle is the wrong place to enter a
full-database credential. Mobile keeps using the REST importer.
Safe to abandon
The cache holds only derived data — nothing that can't be rebuilt by
re-reading Marvin. "Reset cache" is a recovery step, not data loss, and a schema
change re-hydrates rather than migrating. That invariant is
documented and enforced in code comments
precisely so a future change doesn't quietly break it.
MCP server
Official support for driving Marvin from an agent. Runs as a Node stdio
process on your desktop; uses the same limited API token as the plugin.
It does not require this plugin, or Obsidian at all. It talks to Amazing
Marvin with the limited API token and nothing else — install it on its own if
that's all you want. Reading the plugin's cache (below) is an optional
optimization for people running both.
It will be spun out into its own repository. It lives here for now because
the plugin and the server share one Marvin client, and building them together
kept that contract honest while it settled. Expect it to move once it can be
versioned independently — configuration and usage shouldn't change, but the
clone path will.
Tools
| Tool | Purpose |
|---|---|
marvin_today / marvin_due |
Read scheduled or due work for a date |
marvin_categories |
Discover stable category/project IDs and hierarchy |
marvin_children |
Read tasks/projects under a parent ID |
marvin_labels |
Discover label IDs before creating tasks |
marvin_create_task |
Create a task, with dates, labels, note, estimate |
marvin_create_project |
Create a project to hold tasks — new in 0.11.1 |
marvin_mark_done |
Complete a task |
Reads carry freshness and origin so a caller can tell live data from cached.
Edit and delete are deliberately absent. Marvin's limited API has no update
or delete endpoint; those require a third credential whose own documentation
warns that a wrong document shape "might cause Marvin to crash on startup" and
that API deletes bypass Marvin's Trash with no recovery. Reasoning is
written down rather than left
implicit. Rename and reschedule in Marvin's own apps.
Optional: let the MCP server read the plugin's cache
If you've enabled incremental sync, the MCP server can read the same cache the
plugin maintains, skipping a REST round trip. It needs no database
credentials — it's a read-only consumer of a file the plugin already writes,
and falls back to REST on any failure.
marvin_categories and marvin_children also accept refresh: true, which
asks the running plugin to sync first and waits briefly. Those responses report
what actually happened:
"refresh": { "requested": true, "outcome": "synced", "waitedMs": 820 }synced, timed_out, or skipped with a reason — so an agent can tell a
newly-synchronized answer from a silent timeout that fell back, and decide
whether to retry.
Setup
Full instructions, including the security guidance on not putting your token in
a host config file: MCP server
and Reading the plugin's incremental cache.
Prompt you can hand to an agent to set this up
Set up the Amazing Marvin MCP server from
https://github.com/open-horizon-labs/obsidian-am, release 0.11.1.
Read the "Companion MCP server" section of that repo's README first — it is
authoritative, and it explains why the API token should come from a launcher
rather than being pasted into an MCP host config file.
Steps:
1. Clone or update the repo, check out tag 0.11.1, then `npm ci` and
`npm run build`. Note: the MCP server builds from this repository, NOT from
the plugin installed in Obsidian — an older checkout silently ignores newer
configuration.
2. Register the built server at packages/marvin-mcp/dist/server.js with my MCP
host, following the README's launcher pattern so the token stays out of
config files. The limited API token comes from Amazing Marvin's API settings
page.
3. Verify by calling marvin_categories and confirming it returns my real
categories.
Optional, only if I've enabled the plugin's Experimental incremental sync:
4. Set AMAZING_MARVIN_INCREMENTAL_CACHE_PATH to
<vault>/.obsidian/plugins/cloudatlas-o-am/marvin-incremental-cache-v1.json
(it exists only after incremental sync has run once), restart the server,
and confirm marvin_categories now reports "freshness": "cached" and
"origin": "local".
5. Confirm marvin_categories with refresh: true reports
"refresh": { "outcome": "synced", ... }.
Do not ask me for my database credentials — the MCP server never needs them.
Report what you configured and anything that didn't work.
Settings tab reorganized
Grouped by what each setting does rather than by loose verbs: Connection,
Category and project import, Today's tasks, Automatic refresh, How
imported tasks are written, Sending changes to Marvin, then two collapsed
Advanced sections.
Some settings were renamed for clarity — notably Tasks to Show → Tasks to
include, which previously collided confusingly with Show Due Date (one picks
which tasks appear, the other which date fields). Your existing
settings are preserved; only labels changed.
Background file rewriting now has its own Automatic refresh heading rather
than sitting under what read like a display preference. Settings that only apply
to one metadata format grey out instead of looking active, and "Reset cache" and
removing an import root now ask for a confirming second click.
Also in this release
- Fixed: the plugin author shown in Obsidian's plugin list. Beta builds credited
the previous org name; a CI check now prevents the stable and beta manifests
from drifting again. - Fixed: toggling settings no longer tears down and rebuilds the whole settings
tab, which lost your scroll position and collapsed sections mid-edit. - Fixed: an invalid refresh interval now tells you it was rejected instead of
being silently ignored.
Known limitations
- Incremental sync is desktop only.
- A task completed in Marvin's app that never appeared in your note won't show
up there — there's no line to preserve. By design: your notes are the durable
record, not plugin state. - Renaming, moving, and deleting are not available over MCP (see above).
Feedback
Issues and questions:
github.com/open-horizon-labs/obsidian-am/issues