Amazing Marvin Integration

by Cloud Atlas
5
4
3
2
1
Score: 62/100

Description

Category: 3rd Party Integrations

The Amazing Marvin Integration plugin connects Obsidian with Amazing Marvin, enabling seamless synchronization of tasks and projects between the two platforms. The plugin imports Amazing Marvin categories and projects into Obsidian, creating a matching folder and note structure. Tasks are transformed into Markdown checklist items with support for nested subtasks, wiki links, and parent-child relationships. Users can create Marvin tasks directly from Obsidian, using shorthand notations for properties like due dates and labels. Additionally, the plugin offers deep linking to Amazing Marvin for quick navigation. It supports auto-marking tasks as done in Marvin when completed in Obsidian, streamlining task management workflows. The integration is unidirectional, importing data from Amazing Marvin to Obsidian while preserving the original hierarchy.

Reviews

No reviews yet.

Stats

22
stars
2,761
downloads
2
forks
856
days
19
days
19
days
59
total PRs
0
open PRs
1
closed PRs
58
merged PRs
39
total issues
0
open issues
39
closed issues
14
commits

Latest Version

19 days ago

Changelog

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-beta1 through beta10 shipped, which burns 0.11.0 as 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.

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 ShowTasks 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

README file from

Github

Amazing Marvin Integration for Obsidian

This plugin brings Amazing Marvin tasks, categories, and projects into Obsidian without treating the vault as disposable. It also includes an MCP server for agents that need Marvin access without mutating an Obsidian vault. That server runs independently of the plugin and is expected to be spun out into its own repository.

Use Marvin, Obsidian, and an agent together

Amazing Marvin remains the task system of record. The Obsidian plugin projects that work into notes you can use for context and execution. The MCP server lets an agent work directly with Marvin: discover a project by stable ID, read its work, create a task, or complete it.

Use the plugin for vault-coupled work such as imports, managed daily-note regions, and source-note associations. Use the MCP for Marvin-only work. The two surfaces share the same client, local-first read behavior, cache rules, and error model. Run the relevant plugin refresh or import to project a task an agent creates through MCP into the vault.

The two are independent: the MCP server works without the plugin and without Obsidian, and the plugin works without the MCP server. They're in one repository today because they share a Marvin client; the server is expected to be spun out on its own once it settles.

Plugin overview

The Amazing Marvin Plugin provides a way to bring your tasks and project structures from Amazing Marvin directly into your Obsidian vault. It respects the Amazing Marvin hierarchy of categories and projects, creating a matching folder and note structure within Obsidian.

Key Features

  • Non-destructive imports: Category, project, and Inbox notes refresh only their managed region; adjacent prose and non-plugin frontmatter survive.
  • Hierarchy and selective roots: Import everything or selected category/project roots with their descendants while keeping ancestor notes as navigation-only structure.
  • Task projection: Render nested Marvin tasks as checklists, with deep links, parent navigation, optional labels-as-tags, and Dataview or Obsidian Tasks-compatible metadata.
  • Task creation and completion: Create a task at the cursor, defaulting to the current imported category/project when applicable; optionally mark linked tasks complete in Marvin when checked in Obsidian.
  • Refreshable daily notes: A bounded Today region keeps due and scheduled tasks current without rerunning a template or overwriting the rest of a note.
  • Agent-ready API: Templater and other in-Obsidian automation can use a typed API with idempotent source/action task creation. The MCP server shares the Marvin client for Marvin-only workflows, and runs with or without the plugin.

Usage Instructions

Sync Direction

Amazing Marvin remains the source of truth for imported data. The plugin does not sync arbitrary Obsidian edits back to Marvin. The deliberate exceptions are creating a Marvin task from Obsidian and, when enabled, marking a linked Marvin task done after its checklist item is checked.

Sync Behavior

Each import updates only the Amazing Marvin-managed region in an existing note. Custom frontmatter properties and prose before or after that region are preserved. The first import of an older note adopts its recognizable generated category/project or Inbox task section; future imports use explicit markers. The importer also repairs the known malformed legacy list syntax before writing native YAML arrays such as labelIds.

The managed folder defaults to AmazingMarvin and can be changed in plugin settings. Existing imported categories, projects, and Inbox notes are moved by their Marvin ID when possible; empty folders from an earlier location are left in place. Notes for Marvin items no longer returned by the API are also left in place rather than deleted automatically.

Imports can include all categories/projects or selected roots. A selected root includes all descendants; its ancestors remain as navigation-only notes so the Marvin hierarchy and backlinks stay intact, while sibling branches and ancestor tasks are excluded. Inbox import is controlled independently. An empty selected-root list intentionally imports no category/project notes, and changing the selection never deletes notes from an earlier import.

Running a Sync

To initiate a sync:

  1. Open Obsidian's Command Palette with Ctrl/Cmd + P.
  2. Search for and select the command Amazing Marvin Integration: Import categories and tasks.
  3. The plugin updates its managed regions from the current Marvin structure and task data.

Once imported, your Obsidian vault will contain the configured managed folder. Inside, you'll find the structured notes corresponding to your categories and projects from Amazing Marvin.

Before importing, use Settings → Amazing Marvin Integration → Category and project import to choose the managed folder, all items or selected roots, and whether Inbox is included. A selected root includes all descendants; changing the selection deliberately leaves older notes in place for review.

Creating a Marvin Task

The task creation dialog is designed to mirror the task input experience in Amazing Marvin closely. It includes the following features:

  • Autocomplete for Categories and Projects using # syntax or a search sub-dialog.
  • Recognizes shorthand notations for properties like start date (~), due date (@), and labels (+).
  • Places a link to the Marvin task as a deep link in Obsidian at the cursor location upon task creation.
  • The created Marvin task links back to the Obsidian note that instigated the task.
  • The source note records the Marvin task ID and deep link in its amazing-marvin-actions frontmatter property.
  • The link can use either Advanced URI (the default, for the Advanced URI community plugin) or Obsidian's standard URI format.

When invoked from an imported category or project note, the modal and the selected-text shortcut default to that Marvin item. You can still choose Inbox or another parent in the modal.

To create a task:

  1. Open Obsidian's Command Palette with Ctrl/Cmd + P.
  2. Search for and select the command Amazing Marvin Integration: Create task.
  3. Input the task details and select the appropriate category from the dropdown, which shows suggestions as you type.
  4. Upon task creation, a markdown checklist item with a link to the Marvin task is inserted at your cursor location in Obsidian.

Keeping Today's Tasks Current

Run Amazing Marvin Integration: Refresh today's tasks from a daily note. On the first run, the plugin adopts existing Marvin checklist entries under ## Today's tasks as the morning set and surrounds the recognized generated task content with managed HTML-comment markers. Content outside the recognized legacy checklist and later managed region is preserved.

Once the managed region exists, completed tasks stay in it: a checked Marvin line is kept even after Marvin's reads stop returning it, so the note records what the day contained rather than only what is still outstanding. The exception is that one-time adoption of an older note, which builds the region from Marvin's current reads and so cannot recover already-completed history — copy that out before the first refresh.

Later scheduled and due tasks appear under ### Added since morning. Results are deduplicated by Marvin task ID, completion state is rerendered from Marvin, and a successful empty response remains visibly distinct from a fetch failure. A failed fetch leaves the existing note untouched.

Once a note has a managed region, the plugin can refresh it on startup, when Obsidian regains focus, and at the configured interval. Automatic refresh does not initialize or adopt an unmarked note; run the command once (or use the API below) to establish the boundary.

Templater and In-Obsidian Automation

The plugin exposes a stable object API at app.plugins.plugins["cloudatlas-o-am"].api. For example:

const marvin = app.plugins.plugins["cloudatlas-o-am"].api;
const sourcePath = tp.file.path(true);

await marvin.ensureTaskForSource({
  sourcePath,
  actionKey: "decide-whether-to-pursue",
  title: "Decide whether to pursue Titan AI",
  day: tp.date.now("YYYY-MM-DD"),
});

await marvin.refreshTodayTasks({
  date: tp.date.now("YYYY-MM-DD"),
  filePath: tp.file.path(true),
});

actionKey is a caller-owned stable identity for one action in one source note. Do not derive it from the mutable task title. Repeating the same sourcePath and actionKey returns the existing Marvin association.

The API writes a pending source association before creating the Marvin task. If a connection drops at an ambiguous point, a repeat is stopped rather than silently creating a duplicate. After inspecting Marvin, callers can use resolvePendingSourceAction({ sourcePath, actionKey, taskId }) or explicitly clearPendingSourceAction({ sourcePath, actionKey }).

Additional object-returning methods are available for automation:

  • getToday(date)
  • getDue(date)
  • getTodayAndDue(date)
  • getCategories()
  • getChildren(parentId)
  • getLabels()
  • createTask(task)
  • ensureTaskForSource(input)
  • refreshTodayTasks(input)

Task formatting and labels

The default projection remains the existing Dataview format. In settings, tasks can instead use Obsidian Tasks' Dataview fields or emoji date format. Tasks-compatible presets always put the readable title first; the current Dataview preset has a separate title-first option.

Dataview date links use a configurable Moment format. For example, YYYY-[W]WW renders 2026-07-23 as [[2026-W30|2026-07-23]], which lets a daily date alias resolve to a weekly note. An optional task tag supports an Obsidian Tasks global filter.

Marvin labels can be projected as namespaced Obsidian tags such as #marvin/Knowledge-work. Label IDs are resolved through the limited /labels API and cached for an hour; unknown IDs are not exposed as opaque tags. If labels are enabled and cannot be read or recovered from the stale cache, the managed projection is left unchanged rather than silently removing tags.

Auto-Mark as Done Feature

One of the highlights in this version is the ability to auto-mark tasks as done in Amazing Marvin when they are checked off in Obsidian. When this feature is enabled in the plugin settings, checking a task off in your Obsidian note will automatically update the task status in Amazing Marvin.

Here's how to enable this feature:

  1. Go to Settings > Amazing Marvin Integration.
  2. Check the option Attempt to mark tasks as done in Amazing Marvin when checked off in Obsidian.
  3. Save your settings.

Now, when you check off a task with an Amazing Marvin Link in an Obsidian note, a request will be sent to Amazing Marvin to mark the task as done there as well.

Important Considerations

  • Managed regions: Changes inside an Amazing Marvin-managed category, project, or Inbox region are refreshed on the next import. Keep lasting notes outside the marked region.
  • Conflicting moves: If a destination file already exists or multiple notes claim the same Marvin item, import stops rather than overwriting either note.
  • Recoverable stale notes: Notes for removed or hidden Marvin items are not automatically deleted. Review and remove them manually.

By following these guidelines, you can ensure your Amazing Marvin data is accurately reflected in Obsidian while being mindful of the plugin's current limitations.

Installing

Using BRAT

  1. Install the BRAT plugin
    1. Open Settings -> Community Plugins
    2. Disable safe mode, if enabled
    3. Browse, and search for "BRAT"
    4. Install the latest version of Obsidian42 - BRAT
  2. Open BRAT settings (Settings -> BRAT)
    1. Scroll to the Beta Plugin List section
    2. Add Beta Plugin
    3. Specify this repository: open-horizon-labs/obsidian-am
  3. Enable Amazing Marvin Integration (Settings -> Community Plugins)

Manually

  1. If you haven't enabled community plugins in Obsidian, follow these instructions to do so.
  2. From the desired release, download main.js, manifest.json, and styles.css.
  3. Copy those files into <vault>/.obsidian/plugins/cloudatlas-o-am.
  4. Restart Obsidian and enable Amazing Marvin Integration under Community Plugins.
  5. Add your limited Marvin API token in the plugin settings. Find it in the Amazing Marvin API page.

Trust boundaries

The plugin reads and writes only the vault files needed for its configured workflows: imported Marvin notes and their managed regions, initialized Today regions, and task lines or source associations created through its commands or automation API. It does not delete arbitrary vault files; when an imported Marvin item disappears, its existing note is left for you to review.

The plugin uses Marvin's limited API token for its public API and can use the local Marvin desktop API for reads when enabled. Marvin links and help links open app.amazingmarvin.com and help.amazingmarvin.com; API requests use serv.amazingmarvin.com or the configured local server. Keep the token in plugin settings or a local secret mechanism, never in a shared note.

The MCP server is a separate local stdio process, usable without the plugin. It can operate on Marvin, but it does not edit the vault; use the plugin's in-Obsidian API when a workflow must both create a task and record its source note.

Development

  1. Ensure NodeJS and npm are installed on your system.
  2. Clone this repository.
  3. Run npm install to install the dependencies.
  4. Make your desired changes.
  5. Use npm run dev to watch for changes and compile the plugin to dist/main.js.
  6. Run npm test for the shared-client, plugin-adapter, and MCP contract tests.
  7. Run npm run build to build the shared client, Obsidian plugin, and MCP server.

For more detailed development instructions, refer to the sample plugin provided by Obsidian.

MCP server

The repository includes a local stdio MCP server for direct agent access to Marvin. It is the right surface for reading Marvin, discovering a parent ID, creating a task, or completing a task. It never edits an Obsidian vault. Use the plugin API above when an operation must also persist a source/action association or update a managed note.

This server does not require the Obsidian plugin, or Obsidian at all. It talks to Amazing Marvin with the limited API token and nothing else. Reading the plugin's incremental cache (below) is an optional optimization for people who happen to run both; without it the server works exactly the same, just with a REST call where a cached read would have served.

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 developing them together kept that contract honest while it settled. Expect it to move once it's stable enough to version independently. Nothing about how you configure or use it should change, but the clone path will.

Build and register it

npm ci
npm run build

The executable is:

<repository>/packages/marvin-mcp/dist/server.js

This is a Node stdio process, so it runs wherever your MCP host runs — a desktop or a server, never a phone. Everything below describes that machine; the Obsidian plugin's own mobile support is a separate matter.

The server requires AMAZING_MARVIN_API_TOKEN, Marvin's limited API token. Do not copy that token into an MCP-host configuration file. Prefer a local launcher that reads your existing secret at startup and then executes the server. For example, configure the host with the launcher rather than the token:

{
  "mcpServers": {
    "amazing-marvin": {
      "command": "/absolute/path/to/run-amazing-marvin-mcp.mjs",
      "args": []
    }
  }
}

That launcher should set AMAZING_MARVIN_API_TOKEN only in the spawned process's environment and execute:

node /absolute/path/to/obsidian-am/packages/marvin-mcp/dist/server.js

For a temporary shell-only run, export the token in that shell instead of persisting it in configuration. AMAZING_MARVIN_USE_LOCAL=true enables local-first reads through the Amazing Marvin desktop API. The optional AMAZING_MARVIN_LOCAL_API_URL and AMAZING_MARVIN_PUBLIC_API_URL override their endpoints.

Reading the plugin's incremental cache (optional)

If the Obsidian plugin's experimental incremental sync (below) is enabled for the same Amazing Marvin account, the MCP server can read the same persisted cache file so marvin_categories/marvin_children skip a REST round trip when it's fresh enough. This is read-only and best-effort: the MCP server never needs the database credentials, and it falls back to REST on any failure. Leave it unset for the existing REST-only behavior.

The MCP server and the Obsidian plugin are separate installs. Installing or updating the plugin (via BRAT or the community store) does not update this repository's checkout, which is what packages/marvin-mcp/dist/server.js is built from. A checkout older than the release that introduced this feature has no code reading the variable at all, so setting it there is silently ignored — no warning, no error, it just keeps using REST. Before setting it:

git -C /path/to/obsidian-am fetch --tags
git -C /path/to/obsidian-am checkout <release-tag>   # e.g. 0.11.0-beta3
npm --prefix /path/to/obsidian-am ci
npm --prefix /path/to/obsidian-am run build

Then set:

  • AMAZING_MARVIN_INCREMENTAL_CACHE_PATH — absolute path to <vault>/.obsidian/plugins/<plugin-id>/marvin-incremental-cache-v1.json. The file only exists after the plugin has run incremental sync at least once; check that it exists before pointing at it.
  • AMAZING_MARVIN_INCREMENTAL_CACHE_MAX_AGE_MS (optional) — how stale the cache may be before REST is preferred instead. Default 10 minutes.

To confirm it's actually working, call marvin_categories and check the result envelope: a cache hit reports "freshness": "cached" with "origin": "local", while a REST read reports "freshness": "fresh" with "origin": "public". If you see fresh/public with the variable set, either the path is wrong, the cache is stale, or the build predates this feature.

Asking for a fresh cache on a specific call

By default this reading is passive: the cache is used if the plugin already happened to sync it, and otherwise the read falls through to REST. When a particular question needs current data, marvin_categories and marvin_children accept an optional refresh: true parameter. That asks the running plugin to sync first and waits briefly before answering.

It works by dropping a small request file next to the cache file, which the plugin polls for and services — so the plugin keeps sole custody of the database credentials, and nothing here opens a network listener or needs a shared secret. Set AMAZING_MARVIN_REFRESH_TIMEOUT_MS to change how long a refresh-requesting read waits (default 5 seconds).

The parameter defaults to false, and it is a best-effort nicety rather than a guarantee: if Obsidian isn't running, the plugin is disabled, or the sync fails, the wait ends and the read answers from cache or REST as it otherwise would. Repeated calls don't stack up waiting on a plugin that isn't answering — an unclaimed request file is treated as evidence that nothing is listening, and the next call skips the wait until the plugin picks up again.

Because that means refresh: true can succeed, time out, or decline to try, a read that requested one carries a refresh object saying which happened:

"refresh": { "requested": true, "outcome": "synced", "waitedMs": 820 }

outcome is synced when the plugin's checkpoint advanced, timed_out when the request was written but no sync was observed inside the window, or skipped when nothing was attempted — with a reason explaining why, such as no cache being configured or an earlier request still sitting unclaimed. The surrounding freshness/origin fields still describe where the answer came from; this describes what the refresh did. The object is absent entirely when refresh wasn't requested.

A refresh is serviced by the Obsidian plugin on this same machine, so refresh: true reports timed_out when Obsidian isn't running here, or when it is running but the plugin has incremental sync disabled.

Tool workflow

Tool Use it for
marvin_categories Discover stable category/project IDs and parent hierarchy.
marvin_children Read direct tasks/projects under a discovered parent ID.
marvin_labels Discover stable label IDs before task creation.
marvin_today / marvin_due Read scheduled or due work for an optional YYYY-MM-DD date.
marvin_create_project Create a project to hold tasks, before creating them.
marvin_create_task Create a task, optionally with parentId, dates, labels, note, and estimate.
marvin_mark_done Complete a task or project by stable ID.

An agent should discover the parent with marvin_categories before supplying parentId to marvin_create_task; it should not guess an ID from a title. marvin_children then lets it inspect one branch without loading everything.

Read responses include origin, freshness, fetchedAt, ageMs, and warnings. A second equivalent read may report freshness: "cached". With local-first enabled, an unavailable or unsupported local read falls back to the public API; a valid local empty result does not. Writes use the public API and invalidate relevant cached reads.

Every tool returns JSON text plus structuredContent. Runtime and semantic input errors use isError: true and a structured envelope such as:

{
  "error": {
    "kind": "input",
    "field": "date",
    "message": "Use YYYY-MM-DD"
  }
}

The MCP uses the limited API token only. It does not use Marvin's full-access CouchDB database credentials.

See docs/architecture/marvin-client-and-mcp.md for package boundaries and the #51 extension seam.

Testing

While you're testing, you're going to send a lot of requests to the Amazing Marvin API. To avoid hitting the rate limit, you can use the Desktop local API server. See Desktop Local API Server for more information. Once setup, you can specify the local API server in the plugin settings.

The desktop API implements a subset of the public API. Unsupported local read endpoints, historically including /api/children, fall back to the public API. A valid empty local response does not trigger fallback.

Similar Plugins

info
• Similar plugins are suggested based on the common tags between the plugins.
Big Calendar
4 years ago by Boninall
Big Calendar in Obsidian, for manage your events in a day/week/month and see agenda too!
Things Link
4 years ago by @gavmn
Obsidian Google Tasks
4 years ago by YukiGasai
Add Google Tasks inside Obsidian
Agile Task Notes
4 years ago by BoxThatBeat
This Obsidian plugin integrates your TFS data from either Jira or Azure Devops
Week Planner
4 years ago by Ralf Wirdemann
Checkbox 3 states
4 years ago by Renaud Héluin @ NovaGaïa
This is a simple plugin for add a third state to checkbox list.
Checklist Reset
4 years ago by Luke Hansford
Add a command to reset the state of any checklists in a document in Obsidian
Order List
4 years ago by Henry Gustafson
Task Marker
4 years ago by wenlzhang
An Obsidian plugin to change task status and append text with hotkeys and right-click context menu.
Pending notes
4 years ago by Ulises Santana
Obsidian plugin for searching links without notes in your vault.
Brainframe
3 years ago by pedersen
Prioritize
3 years ago by EloiMusk
Obsidian Plugin, to prioritize stuff in Obsidian
Dynamic Timetable
3 years ago by L7Cy
Calculate the estimated completion time from the estimated task time and dynamically create a timetable.
Pivotal Tracker Integration
3 years ago by jondeates
Custom State for Task List
3 years ago by Okami Wong
A plugin for Obsidian to define your own states for task items.
TodoTxt
3 years ago by Mark Grimes
Obsidian plugin to manage todotxt files
Due When
3 years ago by Andy Baxter
An Obsidian plugin which gives shortcuts to insert set due dates
GTD No Next Step
3 years ago by Tobias Davis
Obsidian plugin for GTD workflow, badge projects with no next step.
Uncheck All
3 years ago by Shahar Har-Shuv
Obsidian plugin to uncheck all checkboxes in a file with one action
TODO Wrangler
3 years ago by Jeel Shah
An obsidian plugin to wrangle your Todos and put them in their place.
Homework Manager
3 years ago by Kadison McLellan
An Obsidian plugin that keeps track of homework through a to-do list.
iCal
3 years ago by Andrew Brereton
This is a plugin for Obsidian that searches your vault for tasks that contain dates, and generates a calendar in iCal format that can be imported into your preferred calendar application.
Task list
2 years ago by Ted Marozzi
A simple obsidian plugin enabling better task management via lists.
Track-a-Lot
2 years ago by Iulian Onofrei
This is a tracker plugin for Obsidian
Ego Rock
2 years ago by Ashton Eby
An obsidian plugin that implements a basic taskwarrior UI for listing and modifying tasks.
Pomodoro Planner
2 years ago by Onur Nesvat
Things3 Today
2 years ago by wudanyang6
Grind Manager
2 years ago by dromse
Gamify your task management with rewards system, craft your tasks by tags.
Personal OS
2 years ago by A.Buot
Checkbox Sounds
2 years ago by yasd251
Adds a nice completion sound for checkboxes when ticked in Obsidian
Timekeep
2 years ago by Jacobtread
Obsidian task time tracking
Checkbox Time Tracker
2 years ago by UD
Checkbox Time Tracker for Obsidian
Task List Kanban
2 years ago by Chris Kerr
doing
2 years ago by rooyca
What was I doing?
Vikunja Sync
2 years ago by Peter Heiss
Manage your tasks in vikunja.
Morgen Tasks
2 years ago by Morgen AG
Kanban
5 years ago by mgmeyers
Create markdown-backed Kanban boards in Obsidian.
Org Mode
5 years ago by ryanpcmcquen
Add Org Mode support to Obsidian.
Tasks
5 years ago by Clare Macrae and Ilyas Landikov (created by Martin Schenck)
Task management for the Obsidian knowledge base.
Amazing Marvin
5 years ago by Shirayuki Nekomata
Simple plugin for Amazing Marvin
Random To-Do
5 years ago by NatiAris
Pick a random todo item or a file with todo items
Trello
5 years ago by Nathonius
An Obsidian Plugin that connects Trello cards to Obsidian notes.
Carry-Forward
5 years ago by Jacob Levernier
An Obsidian Notes plugin for generating and copying block IDs, and copying lines with a link to the copied line
Archiver
5 years ago by ivan-lednev
Archive completed tasks in your Obsidian vault (plus other org-mode-like features)
Habitica Sync
5 years ago by Leoh and Ran
This is a under-development Obsidian Plugin for Habitica
Flow
2 years ago by Ben Phillips
Implements key processes in David Allen's Getting Things Done (GTD) methodology
Another Simple Todoist Sync
2 years ago by eudennis
Obsidian.md plugin to integrate with Todoist app.
Simple Todo
2 years ago by elliotxx
A minimalist text-based todo manager (Text-Based GTD) for efficient task management in Obsidian.
Goal Tracker
2 years ago by Ben Rotholtz
Kikijiki Habit Tracker
2 years ago by KIKIJIKI
Kikijiki Habit Tracker Plugin for Obsidian
Asana
a year ago by Ryan Bantz
Obsidan plugin that creates tasks in Asana for highlighted text or the current line
ProgressTracker
a year ago by Van Nam
A plugin that helps you track progress and manage tasks in your notes.
Send to Canvas
a year ago by wenlzhang
An Obsidian plugin that allows you to send tasks, blocks, and notes to Canvas files as plain text, links, and embeds.
Kanban Bases View
5 months ago by I. Welch Canavan
A kanban-style drag-and-drop custom view for Bases.
Simplest Todo
3 months ago by kintolayli
This plugin has not been manually reviewed by Obsidian staff. Minimalist task manager with automatic monthly archiving. Bilingual (RU/EN).
Yori Task
3 months ago by yorigo77
This plugin has not been manually reviewed by Obsidian staff. Task manager, week planner, year planner.
Project Manager
3 months ago by stepankropachev
This plugin has not been manually reviewed by Obsidian staff. Full-featured project management: stunning Gantt charts, Kanban boards, Table views, customizable fields, due date notifications.
Task Collector
3 months ago by ebullient
Change task status and collect tasks within a document using hotkeys and context menus.
TaskNotes
2 months ago by callumalpass
Note-based task management with calendar, pomodoro and time-tracking integration.
Apex Dashboard
a month ago by PandoraReads
Your personal command center — memos, todos, and projects in one stunning glassmorphism dashboard. - This plugin has not been manually reviewed by Obsidian staff.
Gantt Calendar
a month ago by Sugar
A powerful visual task management plugin. Visualize and manage tasks created by the Tasks plugin, supporting both emoji and Dataview task formats. Support Feishu Task syncing. - This plugin has not been manually reviewed by Obsidian staff.
Live Life Recording
a month ago by goryugocast
Record task start and finish times directly in Markdown. LLR (Live Life Recording) adds routine insertion and a lightweight daily summary sidebar. - This plugin has not been manually reviewed by Obsidian staff.
GTD Tasks
25 days ago by unpreditable
A dedicated panel to organize tasks across the vault using the Getting Things Done methodology (Today, This Week, Someday…) - This plugin has not been manually reviewed by Obsidian staff.
Day Planner
16 days ago by ivan-lednev
Day planning from a task list in a Markdown note with enhanced time block functionality.
Yuhanbo Task
12 days ago by yuhanbo
一个简单易用的任务管理插件,支持任务创建、编辑、删除和状态管理,帮助您高效管理待办事项。 - This plugin has not been manually reviewed by Obsidian staff.
BeautyTasks
8 days ago by Avni Bilgin
A Todoist-inspired task and project manager built entirely on Markdown — one note per task, no external services, no dependencies. - This plugin has not been manually reviewed by Obsidian staff.
TODOseq
8 days ago by Stephen Cross
Lightweight keyword-based task tracker using Logseq style keywords.
Operon
6 days ago by Hasan Yılmaz
Task and project management system that unifies inline tasks and file-based tasks in the same workflows with Tables, Filters, Calendar planning, Kanban boards, pinned tasks, and time tracking. - This plugin has not been manually reviewed by Obsidian staff.
TaskChute Plus
4 days ago by hiroyaiizuka
Execute TaskChute that slots today's tasks, tracks projects, adds comments, and keeps you focused on now. - This plugin has not been manually reviewed by Obsidian staff.