Amazing Marvin (complete)
PYPI · AMAZING-MARVIN-COMPLETE-MCP
Amazing Marvin task manager: complete public-API coverage (50 tools) with built-in rate limiting
Available components
Last scanned (4 hours ago)
Scores higher than 0% of PyPI servers
Category Productivity and Notes
Recent critical change
Known CVEs (13 Oct 2026). See the changelog before you install this server.
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security75
- No malware found by supply-chain analysis.Pass
- CVE check failed: an unpatched critical CVE affects this package; the score is capped at 0. See how to fix → View diagnostics → Fail
- Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 8 of 74 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 23 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability61
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 13215 tokens (~264/item across 50 items; 50 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 51 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 1 Nov 26 0
- Stability: 0.97 → pass security
- 31 Oct 26 0
- Stability: pass → 0.97 functional
- 27 Oct 26 0
- Provenance: unverified → fail ▼ security
- 26 Oct 26 0
- Provenance: fail → unverified ▼ security
- 25 Oct 26 0
- Stability: 0.97 → pass security
- 24 Oct 26 0
- Stability: pass → 0.97 functional
- 17 Oct 26 0
- Stability: 0.93 → pass security
- 14 Oct 26 0
- Injection markers: unverified → pass ▲ security
- Schema quality: 9204 → 13215 ▼ functional
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Stability: unverified → 0.87 ▲ functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed pypi/amazing-marvin-complete-mcp@1.8.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Vulnerabilities 6 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-m8x7-r2rg-vh5g | CVE-2025-64340 | medium | CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H | yes |
| GHSA-rww4-4w9c-7733 | CVE-2026-27124 | high | yes | |
| GHSA-vv7q-7jx5-f767 | CVE-2026-32871 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H | yes |
| PYSEC-2026-2475 | CVE-2025-64340 | medium | CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H | yes |
| PYSEC-2026-2476 | CVE-2026-27124 | none | yes | |
| PYSEC-2026-338 | CVE-2026-32871 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 74 packages
| Packages resolved | 74 |
|---|---|
| Stale | 5 |
| No linked repository | 3 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
claim_reward_points ~174
Award reward points for a completed task or manually. Note: mark_done does not award a task's rewardPoints automatically through the API (cf. issue #6 about kudos) — call this tool separately afterwards. WARNING: a MANUAL award CANNOT be undone through the API (verified live 2026-08-19: unclaim returns 404, negative points are rejected with 400). The only compensation is spend_reward_points for the same amount (which however inflates the spent statistics) — award MANUAL points thoughtfully.
| Name | Type | Req | Description |
|---|---|---|---|
| date | – | – | Date YYYY-MM-DD; omit for today (server timezone) |
| item_id | string | yes | Task ID, or 'MANUAL' for a manual point award |
| points | number | yes | Number of points to award |
Structured output declared, but exposes no named fields.
No examples provided.
convert_category_or_project ~498
Convert a project to a category or back, in place and losslessly. EXPERIMENTAL: Convert project→category or category→project IN PLACE via /doc/update (Full Access Token; there is no official conversion endpoint, and this relies on undocumented server behavior that Marvin could change). Same _id, createdAt and children remain — conversion is a pure type change (verified against the live API 2026-08-29: the server accepts and persists the change in both directions, and the app renders correctly after an API-set change). LOSSLESS BY DEFAULT (since 1.5.0): only type is changed — the same semantics as the app's correct conversion path (the right-click/hover menu, verified as a lossless round trip 2026-08-30: all project fields incl. firstScheduled preserved through project→category→project). Project fields remaining on the category are then intentional round-trip data; the type guard in update_category_or_project only prevents NEW project fields from being written to it. If you want a clean category for a permanent conversion: set clear_project_fields=True (mimics the app's Edit Settings path — a bug in their tracker; also clears firstScheduled, which that path otherwise leaves behind) and receive the values in removed_project_fields. Note: the app's correct path (right-click/hover) is not in the menu by default — it is added via the gear icon directly in the right-click menu → Add action (app-verified 2026-08-31), so unmodified apps only show the buggy path. Do NOT convert a category that contains subcategories into a project — projects cannot contain categories (risk of orphans/cycles; check get_children first).
| Name | Type | Req | Description |
|---|---|---|---|
| clear_project_fields | boolean | – | Only for to='category': True = clear day / dueDate / priority / isFrogged / firstScheduled (like the app's buggy Edit Settings path — yields a CLEAN category without e.g. a deadline badge, for a perm… |
| item_id | string | yes | ID of the project/category to convert (from get_categories) |
| to | string | yes | Target type to convert to |
Structured output declared, but exposes no named fields.
No examples provided.
create_category_or_project ~859
Create a category or project with color, icon, labels and note. Create a category (via /doc/create, Full Access Token) or a project (via /addProject). Categories can contain categories; projects cannot. day/due_date/priority/frog are rejected for kind='category' for a structural reason, not a technical one: a category can never be completed or checked off, and deadline, scheduling, priority and frog belong to things that can be finished — projects and tasks. The API accepts the fields on categories (live-tested 2026-09-11) but they are not meaningful there (rule 2026-09-11). label_ids applies to both categories and projects. startDate/endDate cannot be set at creation (/addProject ignores them, verified live 2026-08-29) — use update_category_or_project afterwards. Note: project titles must not contain '#word' — /addProject has the same corruption bug as /addTask (the string is stored unresolved as parentId and the project becomes invisible) but ignores the X-Auto-Complete header (verified against the live API 2026-08-20), so the client blocks it locally before any API call. Category titles are unaffected (/doc/create parses nothing).
| Name | Type | Req | Description |
|---|---|---|---|
| color | – | – | Color '#rrggbb'. Categories ONLY at creation — /addProject ignores the field (verified live 2026-08-29); set project color with update_category_or_project afterwards |
| day | – | – | Projects ONLY: schedule on YYYY-MM-DD or 'today' (blocked for categories — a category is never completed) |
| due_date | – | – | Projects ONLY: deadline YYYY-MM-DD (blocked for categories — a category is never completed) |
| frog | – | – | Projects ONLY: Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxi… |
| icon | – | – | Icon name with a library prefix, e.g. 'lucide-Rocket' (Lucide, PascalCase) or 'huge-happy' (verified in the app 2026-08-29); the app's picker also allows emoji. Rendered directly on categories; on pr… |
| kind | string | yes | Kind |
| label_ids | – | – | Label IDs (from get_labels) — categories AND projects: categories have labels, stored in the same field as projects' and rendered in the app (live-tested + verified in the app 2026-09-11) |
| note | – | – | Note |
| parent_id | string | – | ID of the parent category, or 'root' for the top level |
| planned_month | – | – | Plan into a month: YYYY-MM (Planning Ahead strategy; mainly projects) |
| planned_week | – | – | Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy; mainly projects) |
| priority | – | – | Projects ONLY: priority as a string — high=Most important (red), mid=Very important (orange), low=Important (yellow, the one-star level — NOT the app's 'Low priority', which projects do not have). Pr… |
| review_date | – | – | Review date YYYY-MM-DD (Review Date strategy) |
| time_estimate_minutes | – | – | Time estimate in minutes. The project's own estimate takes precedence; without one the project shows the sum of its children's (per Marvin support) |
| title | string | yes | Name |
Structured output declared, but exposes no named fields.
No examples provided.
create_event ~125
Create a calendar event (experimental), synced by the app. EXPERIMENTAL: Create a calendar event. Calendar sync happens in the client — the Marvin app must be running on some device for the event to sync onwards to an external calendar.
| Name | Type | Req | Description |
|---|---|---|---|
| length_minutes | integer | yes | Length in minutes |
| note | – | – | Note (markdown) |
| start_iso | string | yes | Start time, ISO 8601 with timezone, e.g. 2026-08-20T14:30:00+02:00 |
| title | string | yes | Event title |
Structured output declared, but exposes no named fields.
No examples provided.
create_notebook ~114
Create a standalone notebook, optionally with sections. A notebook for a project or category is not created here: it comes into being when a page is moved there (update_notebook_page move_to_parent_id) or when a second page is added in the app. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.
| Name | Type | Req | Description |
|---|---|---|---|
| sections | – | – | Sections to create (titles) |
| title | string | yes | The notebook's name |
Structured output declared, but exposes no named fields.
No examples provided.
create_notebook_page ~146
Create a page at the end of a notebook, optionally in a section. Own pg_ id, rank after the existing pages. '- ' at the start of a line is written as '* ' (code protection against the app deleting lists). Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.
| Name | Type | Req | Description |
|---|---|---|---|
| notebook_id | string | yes | The notebook's id (nb_...) |
| section_id | – | – | Section id to put the page in |
| text | – | – | The page's text (markdown, see list_capabilities.note_format) |
| title | string | yes | The page's title |
Structured output declared, but exposes no named fields.
No examples provided.
create_recurring_task ~670
Create a recurring task of any of the repeat dialog's eleven types. Written via /doc/create in the app's own shape, so every type shows correctly in the app's repeat dialog. Occurrences are created the first time a Marvin client opens after midnight, in the window today to today + Create occurrences — not immediately. Without create_occurrences the account's default applies. After completion: the tool writes the first occurrence on the start day, also when the start day is in the future. Custom accepts only an RRULE string (e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR'). New occurrences inherit label, priority, size, note, subtasks, sections and hard deadline (verified against the live API). Only on weekdays: a month day on a weekend is moved to Friday (documented for monthly, verified); every_x_days then counts in weekdays (inferred from a series; the documentation does not mention the type).
| Name | Type | Req | Description |
|---|---|---|---|
| after_days | – | – | after_completion: days after completion |
| bonus_section | – | – | 'Essential' or 'Bonus' |
| create_occurrences | – | – | Create occurrences: default (the account's default) or 0/1/3/7/14/30 days ahead |
| custom | – | – | custom: an RRULE string, e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR' |
| daily_section | – | – | Day section 'Morning'/'Afternoon'/'Evening' |
| ends_on | – | – | Stop repeating on YYYY-MM-DD |
| hard_deadline_days | – | – | Hard deadline: days after the occurrence's day |
| if_you_miss_one | – | – | If you miss one; default = the account's setting |
| interval | – | – | every_x_*: interval |
| label_ids | – | – | Label IDs |
| month_day | – | – | monthly: day of the month |
| note | – | – | Note (markdown) |
| off_days | – | – | on_off: days off |
| on_days | – | – | on_off: days on |
| only_weekdays | – | – | Only on weekdays (Mon-Fri), only for the types the dialog offers it on. A month day on a weekend is moved to Friday (verified); every_x_days then counts in weekdays (inferred) |
| parent_id | – | – | Category/project ID; omit for the Inbox |
| priority | – | – | isStarred 3/2/1/-1 |
| repeat | string | yes | The dialog's eleven types: daily, weekly (weekday), monthly (month_day), x_times_per_week (weekdays), every_x_days / every_x_weeks / every_x_months / every_x_years (interval), after_completion (after… |
| size | – | – | Size XS-XL |
| starts_on | – | – | Starts on YYYY-MM-DD; defaults to today |
| subtasks | – | – | Subtasks (titles) |
| title | string | yes | Title |
| weekday | – | – | weekly: weekday |
| weekdays | – | – | x_times_per_week: weekdays |
Structured output declared, but exposes no named fields.
No examples provided.
create_task ~1,287
Create a task with category, day, priority, size, time and reminders. The title is stored verbatim: the server's shortcut parsing is disabled (X-Auto-Complete: false), so '#Category', '~15', '*m' and '*p2' are NOT parsed — '#' in titles is safe. Use the parameters instead. startDate/endDate are set with update_task afterwards (/addTask ignores them). Size, subtasks, clock time and reminders are written in a second step with /doc/update and /reminder/set in the app's form; if a step fails the response says which ones were done (the task then already exists). A clock time requires day. Strategy-dependent fields (planned_week/month, review_date, backburner, reward_points, the sections) are stored even when the strategy is off in the app.
| Name | Type | Req | Description |
|---|---|---|---|
| backburner | – | – | True = put in the backburner (dormant). NOTE: only effective on an UNSCHEDULED task — scheduling (day) trumps the flag in the UI (verified in the app 2026-08-29), so do not combine with day |
| bonus_section | – | – | 'Essential' or 'Bonus' (bonusStructure strategy) |
| custom_section | – | – | ID of a custom section from strategySettings.customStructure (customStructure strategy) |
| daily_section | – | – | Day section: 'Morning', 'Afternoon' or 'Evening' (dailyStructure strategy) |
| day | – | – | Schedule on date YYYY-MM-DD, 'today', or 'unassigned' (= unscheduled, same as omitting). Same rules as update_task. |
| due_date | – | – | Deadline YYYY-MM-DD (use sparingly) |
| frog | – | – | Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' i… |
| is_reward | – | – | Documented Task field with no observed function — normally do NOT use. The app's purchasable rewards are separate Rewards documents that the public API cannot reach at all (live-tested 2026-08-29: no… |
| label_ids | – | – | Label IDs (from get_labels) |
| note | – | – | Note (markdown; '- ' at line start is written as '* ', see list_capabilities.note_format) |
| parent_id | – | – | ID of the category/project the task belongs in (from get_categories). Omit for the Inbox. NOTE: the server does not validate the ID — a wrong parentId yields an orphan reachable only via date reads (… |
| planned_month | – | – | Plan into a month: YYYY-MM (Planning Ahead strategy) |
| planned_week | – | – | Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy) |
| priority | – | – | Priority (isStarred): 3=Most important/red, 2=Very important/orange, 1=Important/yellow, -1=Low priority (down arrow; shown in the app only with 'Enable low priority' on in the Priorities strategy —… |
| reminders | – | – | Own reminders: 'HH:MM' on the task's day, or 'before:N' = N minutes before the clock time. Stored as the reminders list + one server entry of type M per reminder; before values are saved as an absolu… |
| review_date | – | – | Review date YYYY-MM-DD (Review Date strategy) |
| reward_points | – | – | Reward points the task AWARDS on completion (coin + points in the list row when the Rewards strategy is on, verified in the app 2026-08-29; points are claimed via claim_reward_points). Do not set tog… |
| size | – | – | Size XS/S/M/L/XL (taskSize 1-5). XS and XL can be disabled in the account. Written with /doc/update after creation (/addTask drops the field) |
| subtasks | – | – | Subtasks (titles), written after creation |
| time | – | – | Clock time HH:MM (requires a day). Writes the app's form: taskTime, title prefix 'HH:MM ', reminderTime and a server entry of type T — the app reminds at that time. '' removes the time (update_task) |
| time_block_section | – | – | Time block ID (from get_today_time_blocks, or time_block_id from create_time_block). Points the task at a time block; the task then appears under that block's section in Today. Three conditions (veri… |
| time_estimate_minutes | – | – | Time estimate in minutes |
| title | string | yes | Task title |
Structured output declared, but exposes no named fields.
No examples provided.
create_time_block ~233
Create a time block (experimental) and get its id back. EXPERIMENTAL: Create a time block via /doc/create (db='PlannerItems', Full Access Token). No official endpoint exists. Verify in the app that the block looks right. The response carries `time_block_id` (the id is set client-side because /doc/create does not echo the server-generated id) and can be used directly as time_block_section in create_task/update_task — no extra get_today_time_blocks call needed. Client-set id live-tested 2026-09-13: accepted, listed in /todayTimeBlocks with the same id, and the block renders in the app like one created there (verified in the app 2026-09-13, app 1.70.0.0, PWA + desktop).
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | Date YYYY-MM-DD |
| duration_minutes | integer | yes | Length in minutes |
| start_time | string | yes | Start time HH:mm (local time) |
| title | string | yes | Block name, e.g. 'Morning' |
Structured output declared, but exposes no named fields.
No examples provided.
delete_notebook ~198
Delete a notebook and its pages permanently, in two steps if text. No trash via the API. The pages are deleted first and then the notebook, as the app does. Two steps: a notebook with a parent and more than one page, and a standalone notebook where any page has text, are only deleted with confirm=true — the first call shows the pages (title, size, first line). Notebook with a parent: page 1's text is written back as the project's/category's note after the deletion; the text is always included in the response, so it is not lost if a step fails. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | True = delete after the pages have been shown |
| notebook_id | string | yes | The notebook's id (nb_...) |
Structured output declared, but exposes no named fields.
No examples provided.
delete_notebook_page ~156
Delete a notebook page permanently, with confirmation if it has text. No trash via the API. A page with text is only deleted with confirm=true; the first call shows title, size and first line. The last page of a notebook with a parent is not deleted here — use delete_notebook. If the parent's first page is deleted, the note then points to whichever page is first. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | True = delete a page with text after it has been shown |
| page_id | string | yes | The page's id (pg_...) |
Structured output declared, but exposes no named fields.
No examples provided.
delete_reminder ~144
Delete reminders, also from the task's list when task_id is given. With task_id the entries are removed from the task's reminders list and from the server (both are needed; an entry left in the list makes an open client notify). Without task_id only the server entries are removed — use it for standalone reminders or orphaned entries from get_reminders. The clock time's reminder (type T) is removed with update_task(time='').
| Name | Type | Req | Description |
|---|---|---|---|
| reminder_ids | array | yes | IDs of reminders to delete |
| task_id | – | – | The task's id when the reminders belong to a task: they are then also removed from the reminders list |
Structured output declared, but exposes no named fields.
No examples provided.
delete_task ~415
Delete a task permanently, with no trash and no undo. Deletion via the API bypasses the app's trash and cannot be undone — use only when the user explicitly wants a deletion. If the task has reminders they are cleared and the server entries removed before the deletion, so that no notification arrives. An occurrence of a recurring task follows the app's two choices: 'this' adds the occurrence's day to the recurring task's deletedDates and deletes the occurrence; 'all' deletes all open occurrences and then the recurring task, completed occurrences are kept. If a step fails the response says which were done. THE APP'S VIEW: an open client does not render the deletion — reload the client (F5, restart of the desktop app) before the row is touched; a write from the app on the stale row recreates the document. A recurring task (db RecurringTasks) is deleted with scope 'all', on an occurrence or on the recurring task's own id — also before it has any occurrences (they are created only when a client opens after the day rolls over). Habit recurrences are not deleted here. Projects and categories: deleted only without open children — the tool reads /children first (one more call) and otherwise refuses, with the list, so that no children are left with a parent that does not exist. Completed children do not show in /children and are left behind with the parent gone. The project's notebook is not deleted (as in the app); the response gives its id for delete_notebook.
| Name | Type | Req | Description |
|---|---|---|---|
| item_id | string | yes | ID of the task (or of a project/category without open children) to delete |
| scope | string | – | Occurrence of a recurring task: 'this' = only this one (default), 'all' = the whole recurring task with all open occurrences (completed ones are kept). The recurring task's own id is accepted only wi… |
Structured output declared, but exposes no named fields.
No examples provided.
get_account_info ~23
Get account info (/me): email, tracking status and points balance.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_categories ~54
Get all categories and projects as a hierarchy with id and parentId. Get all categories and projects (the whole hierarchy; parentId='root' is the top level). Use to find the right parent_id when creating/moving.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_children ~139
Get open tasks and subprojects in a category or project. Returns direct children only — call again for deeper levels. Note: orphans (tasks whose parentId points to a deleted/non-existent document) do NOT show up under 'unassigned' — only in get_today_items/get_due_items if they have a day/dueDate (live-tested 2026-08-29). Orphans are repaired by running FIX_CYCLES() in the app's console (a documented troubleshooting path).
| Name | Type | Req | Description |
|---|---|---|---|
| parent_id | string | yes | Category/project ID, 'unassigned' for the Inbox, or 'root' for the top level |
Structured output declared, but exposes no named fields.
No examples provided.
get_done_items ~420
Get tasks completed on a given date. Tasks completed on a given date (doneAt within that day, configured timezone) — regardless of priority and deadline. Built on the UNDOCUMENTED endpoint GET /doneItems?date= (missing from the OpenAPI spec and the wiki; live-tested 2026-08-30, may disappear): it filters on the task's `day`, not on doneAt. A past `day` is kept on completion both in the app and via the API (the app sets day = today only on unscheduled and future-dated tasks) — hence the date plus lookback_days earlier are fetched and everything is filtered on doneAt. The response always states its coverage: covers_from (= date − lookback) and days_fetched. On a 429/error the fetch stops: incomplete=true, days_missing lists the days not fetched and warning explains; the date's own completions are always included because it is fetched first. Complete results are cached for 30 minutes (cached=true) — repeated calls then cost no API calls; mark_done inserts its task into the cache, delete_task and unmark_done remove theirs. Completions or deletions made in the app show up only once the cache expires. Not covered: a task with a FUTURE day completed via the API (it sits under its day). Tasks only — completed projects are not listed. Items without doneAt (older data) are excluded and counted in skipped_without_done_at. Sorted by doneAt. Cost: one read call per day (~3.1 s each in the queue).
| Name | Type | Req | Description |
|---|---|---|---|
| date | – | – | Date YYYY-MM-DD on which tasks were completed (configured timezone); omit for today |
| lookback_days | integer | – | Days before the date for which /doneItems is also fetched, to catch tasks scheduled earlier but completed on the date. Each day = one read call (~3.1 s in the queue). Default 7 |
Structured output declared, but exposes no named fields.
No examples provided.
get_due_items ~146
Get open tasks and projects with a deadline today or earlier. Filters Keep just one (carry) as the app does: only the oldest open occurrence per recurring task is shown. Only the current one (skip) is not filtered here. The mode is read only for recurring tasks with an open occurrence before today and cached until local midnight; changes made in the app take effect by the next day at the latest. The response gives hidden_count; include_hidden=true includes all.
| Name | Type | Req | Description |
|---|---|---|---|
| by | – | – | Deadline up to and including YYYY-MM-DD; omit for today |
| include_hidden | boolean | – | True = include occurrences the app hides (Keep just one) |
Structured output declared, but exposes no named fields.
No examples provided.
get_goals ~19
Get all goals with status and check-in data.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_habit ~80
Get a habit's server tracking record with its full history. Get the server's tracking record for a single habit (habitId + full history — the source of truth for recordings). Note: the response lacks title and settings; those are in list_habits.
| Name | Type | Req | Description |
|---|---|---|---|
| habit_id | string | yes | Habit ID (from list_habits) |
Structured output declared, but exposes no named fields.
No examples provided.
get_kudos ~71
Get kudos, level and kudosRemaining from Marvin's XP system. Note: kudos is separate from reward points (the reward currency) — the point balance is in get_account_info. nextMultiplier only exists in /me, not here (known limitation, MarvinAPI issue #5).
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_labels ~20
Get all labels with ids, for label_ids and filtering.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_notebook ~154
Read a notebook including the text of its pages, or a single page. Give exactly one of notebook_id, parent_id (project/category) and page_id. Pages come in rank order; the first page of a notebook with a parent is the one the parent shows as its note. If the text exceeds max_chars the rest is omitted and the response says which pages.
| Name | Type | Req | Description |
|---|---|---|---|
| max_chars | integer | – | Cap on page text in the response; pages beyond it are omitted |
| notebook_id | – | – | The notebook's id (nb_...) |
| page_id | – | – | A single page (pg_...), instead of the others |
| parent_id | – | – | The project's or category's id, instead of notebook_id |
Structured output declared, but exposes no named fields.
No examples provided.
get_notebooks ~121
List all notebooks with page titles, order and sections, without text. Standalone notebooks have parent_id null; a notebook that belongs to a project or category has parent_id and parent_type. A page's updated_at changes when the page is edited in the app. For text: get_notebook. A notebook whose parent has been deleted gets parent_missing, one on a done project gets parent_done. Costs 2 calls (1 when no notebook has a parent) plus one per distinct parent missing from /categories (deleted or done projects).
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_rate_limit_status ~91
Show today's Marvin calls against the budget and the last call time. Show how many Marvin API calls have been made today (budget 1440/day, shared by all tools) and when the latest one went out. The counter is shared by every client that goes through this server. If a call went out within the last minute, another client is active. This tool costs no Marvin call.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_reminders ~27
Get all server-side reminders, push notifications to the phone. Requires the Full Access Token.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_time_tracks ~56
Get time-tracking history for up to 100 tasks. Get time-tracking history for the given tasks (the source of truth, max 100 per call).
| Name | Type | Req | Description |
|---|---|---|---|
| task_ids | array | yes | Up to 100 task IDs |
Structured output declared, but exposes no named fields.
No examples provided.
get_today_items ~301
Get open tasks and projects scheduled today or earlier. Open tasks/projects with day <= the date (default today in the configured timezone, MARVIN_TIMEZONE), not only exactly on the date. Deadline-only items: get_due_items. Filters as the app does: for a recurring task with If you miss one = Keep just one (carry) only the oldest open occurrence is shown, for Only the current one (skip) only the date's own; Keep them all and the account default ('', assumed to be Keep them all) show all. The mode is read (/doc) only for recurring tasks with an open occurrence before today, cached until local midnight; a mode changed in the app takes effect by the next day at the latest. If the mode cannot be read the occurrences are shown. The response gives hidden_count and which were hidden; include_hidden=true includes all. Habit tasks (field habitId) are listed in habit_task_ids. Recurring occurrences are created the first time a Marvin client opens after the day rolls over; read before that, today's occurrences are missing, and a recurring task created during the day may lack them.
| Name | Type | Req | Description |
|---|---|---|---|
| date | – | – | Date YYYY-MM-DD; returns everything open with day <= the date; omit for today (MARVIN_TIMEZONE, else the system timezone) |
| include_hidden | boolean | – | True = include occurrences the app hides (If you miss one) |
Structured output declared, but exposes no named fields.
No examples provided.
get_today_time_blocks ~110
Get today's time blocks with their category or smart-list mapping. The API response lacks the category link (known limitation, MarvinAPI issue #65); the mapping is therefore fetched separately from the profile setting plannerSmartLists (key = normalized block title).
| Name | Type | Req | Description |
|---|---|---|---|
| date | – | – | Date YYYY-MM-DD; omit for today (server timezone) |
| include_category_mapping | boolean | – | Also look up the block→category/smartlist mapping (1 extra API call, requires Full Access Token) |
Structured output declared, but exposes no named fields.
No examples provided.
get_tracked_item ~21
Show which task is being time-tracked right now.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
list_capabilities ~63
List every Marvin tool by area, with what it can and cannot do. Costs no Marvin API call. Call it before assuming something is impossible via MCP or requires manual work in the app; field conditions and live-tested details live in each tool's own description.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
list_habits ~126
Get all habits with title, settings and history. Get all habits as full documents incl. title, settings and history ([time1, value1, time2, value2, ...], unix ms). Requires the Full Access Token (the raw variant of /habits). Important (verified live 2026-08-19): non-raw /habits would be wrong here — it reads the server's tracking registry, which is created lazily on the first recording, so never-recorded habits are missing entirely, and the responses lack titles.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
mark_done ~324
Mark a task as done and clean up its reminders as the app does. Reads the task, runs /markDone (configured timezone) and then does what the app does: the server entries T and M are removed and reminderTime is cleared; the reminders list remains. Projects: /markDone responds 400 (tasks only); projects are closed with mark_project_done. 404 = does not exist, 400 = already done or a project. Habit task (field habitId): the habit is also recorded with /updateHabit at 12:00 on the task's day, and habitRepAt is set. Habit with a count (recordType number): value is recorded with the current time; the task is checked off only once the day's total reaches the target — otherwise it stays open and the response shows the total. Recurring occurrence: safe (deterministic id). After completion: the next occurrence is created +N days later. With a future day the tool does what the app does: the occurrence is moved to today before it is checked off, and the next one is counted from today. If a step fails the response says which steps were done. Running time tracking is stopped and written to task.times. /markDone does not set workedOnAt and does not stamp fieldUpdates, which the app does.
| Name | Type | Req | Description |
|---|---|---|---|
| item_id | string | yes | Task ID (NOT a project — mark_project_done closes those) |
| value | – | – | Habit task with a count only: the value to record (default 1) |
Structured output declared, but exposes no named fields.
No examples provided.
mark_project_done ~395
Close a project and its open tasks, in two steps. Step 1 (without confirm_code): reads the project and its open children, lists them with the warning that they too will be marked done, and returns a code. Nothing is written. Step 2 (confirm_code from step 1): reads the children again; if the code no longer matches, nothing is closed and the response gives the new list and code. Otherwise each open task is checked off like mark_done (/markDone and reminder cleanup) and the project is closed last with a /doc/update of the app's five fields: done, doneAt and workedOnAt (now), day (the project's day, or today if it has none) and doneDate (same as day) — as the app does. The deadline (dueDate) is not touched. The app itself refuses to close a project with open children; this tool closes them on purpose. The children are checked off with /markDone, which does not set workedOnAt and does not stamp fieldUpdates — the app sets workedOnAt on the children. Stops in step 1 without a code if an open child is a sub-project, a habit task or an occurrence of a recurring task — close those first (the app's behavior there is untested). Completed projects do not show in get_categories. Undo in the app; unmark_done refuses projects. If a step fails the response says which were done; the project then stays open. Cost: step 1 two calls; step 2 three, plus one per task and two more per task with reminders.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm_code | – | – | The code from step 1. Without a code only the open children and the code are shown; nothing is closed |
| project_id | string | yes | ID of the project to close |
Structured output declared, but exposes no named fields.
No examples provided.
record_habit ~80
Record or undo a habit check-in, synced to the app. Also updates the sync database (updateDB=true) so the Marvin app shows the change immediately.
| Name | Type | Req | Description |
|---|---|---|---|
| habit_id | string | yes | Habit ID |
| undo | boolean | – | True to undo the latest recording instead |
| value | number | – | Value to record (1 for boolean habits) |
Structured output declared, but exposes no named fields.
No examples provided.
reset_reward_points ~62
Reset reward points permanently, balance and history. Reset reward points PERMANENTLY: deletes the whole earn/spend history and sets the balance to 0 (Full Access Token). CANNOT be undone — only use when the user explicitly asks for it.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
search_notebooks ~124
Search notebooks: notebook names, page titles and page text. The list is fetched with one call; page text is cached in memory and fetched only for notebooks with pages changed since the previous search (updated_at), at most 20 notebooks per call. Notebooks whose text has not been fetched yet are listed in not_searched — search again to continue. Hits in a notebook whose parent has been deleted get parent_missing, on a done project parent_done (as in get_notebooks).
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | Search text, case-insensitive |
Structured output declared, but exposes no named fields.
No examples provided.
set_priority ~308
Set priority (P1-P3 or low) or the dread level on a task. Set or change priority (isStarred) and/or the frog/dread level (isFrogged 1-4, read in the app 2026-10) on an existing TASK. Requires the Full Access Token. The app's four priority levels are stored as isStarred 3/2/1/-1; Low priority is shown only with 'Enable low priority' on. Does not apply to projects: they use the string field priority ('high'/'mid'/'low'); set it via update_category_or_project. A permanent 500 = the task does not exist (deleted or wrong ID).
| Name | Type | Req | Description |
|---|---|---|---|
| frog | – | – | Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' i… |
| item_id | string | yes | Task ID |
| priority | – | – | Priority (isStarred): 3=Most important/red, 2=Very important/orange, 1=Important/yellow, -1=Low priority (down arrow), 0=remove |
Structured output declared, but exposes no named fields.
No examples provided.
set_reminder ~205
Set an own reminder on a task, or a standalone reminder. With task_id the reminder is written in the app's form: an entry in the task's reminders list (reminderId of 13 characters, time in seconds) and a server entry of type M with taskId — the app shows it under Reminders and the notification arrives, and mark_done/delete_task clean it up. A clock time on a task is set with update_task(time=...). Without task_id a standalone server entry of type M is written (requires Marvin's mobile app for the notification).
| Name | Type | Req | Description |
|---|---|---|---|
| task_id | – | – | The task's id: the reminder is added to the task in the app's form. Omit for a standalone reminder |
| time_unix_seconds | integer | yes | Unix time (seconds) for the reminder |
| title | – | – | Notification text (max 200 chars). Standalone: required. On a task: the task's title is used |
Structured output declared, but exposes no named fields.
No examples provided.
spend_reward_points ~78
Spend reward points on a reward. Note (verified live): the API responds 500 Internal Server Error if the balance would go negative — check the balance (get_account_info) before large purchases.
| Name | Type | Req | Description |
|---|---|---|---|
| date | – | – | Date YYYY-MM-DD; omit for today (server timezone) |
| points | number | yes | Number of points to spend |
Structured output declared, but exposes no named fields.
No examples provided.
start_tracking ~25
Start time tracking on a task.
| Name | Type | Req | Description |
|---|---|---|---|
| task_id | string | yes | Task ID |
Structured output declared, but exposes no named fields.
No examples provided.
stop_tracking ~103
Stop time tracking on a task; the time lands in get_time_tracks. Stop time tracking for a task. Note (documented API limitation, confirmed live 2026-09-02): the task's own times/duration fields are not updated by /track STOP — the tracking only lands in /tracks (get_time_tracks). Exception: mark_done during active tracking now writes task.times (see mark_done).
| Name | Type | Req | Description |
|---|---|---|---|
| task_id | string | yes | Task ID |
Structured output declared, but exposes no named fields.
No examples provided.
test_connection ~28
Check that the API token works against Marvin's API. Returns OK if the apiToken works.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
unclaim_reward_points ~160
Undo a reward-point award tied to a task. Undo a point award (e.g. after a misclick, or when the task was un-completed with unmark_done). Only works for awards tied to a real task ID: Marvin's server stores no entry for MANUAL awards (verified live 2026-08-19, /unclaimRewardPoints responds 404 'No such entry'). Compensate a MANUAL award with spend_reward_points for the same amount instead.
| Name | Type | Req | Description |
|---|---|---|---|
| date | – | – | Date YYYY-MM-DD; omit for today (server timezone) |
| item_id | string | yes | Task ID whose award should be undone (determines the point amount). 'MANUAL' is NOT supported — see description. |
Structured output declared, but exposes no named fields.
No examples provided.
unmark_done ~323
Undo a task's completion, and the habit's record. Projects and categories: refuses without writing — a closed project is reopened in the app. Sets done=false and clears doneAt via /doc/update (Full Access Token); the app's own undo leaves doneAt in place. A task that never had a day (firstScheduled 'unassigned' and no fieldUpdates.day stamp) got its day from /markDone: the day that mark_done set is removed (stored as 'unassigned'; the app's own undo writes null — both mean no day). Otherwise the day stays. As in the app: the clock time's reminder (T) is not restored — the time does not remind until it is set again — but own reminders in the reminders list still apply. Habit task: the habit's latest record is undone with /updateHabit undo and habitRepAt is cleared, but only if the history's last entry is the task's habitRepAt; otherwise the response says so and the habit is left untouched (undo always takes the latest entry). Open habit task (a partial record on a habit with a count): nothing is written — undo the record with record_habit undo=true, as the app's undo does. Kudos are not adjusted; reward points are undone with unclaim_reward_points. A permanent 500 = the document does not exist.
| Name | Type | Req | Description |
|---|---|---|---|
| item_id | string | yes | Task ID (not a project — those are reopened in the app) |
Structured output declared, but exposes no named fields.
No examples provided.
update_category_or_project ~1,176
Update a category or project: labels, color, icon, note, project fields. Update fields on an existing CATEGORY or PROJECT via /doc/update (Full Access Token). For tasks, use update_task. Fields marked 'Projects ONLY' (day/due_date/priority/frog/size) are blocked for categories: if any of them is given, the tool first reads the document (1 extra API call) and refuses if it is a category. The reason is structural, not technical: a category can never be completed or checked off, and deadline, scheduling, priority and frog belong to things that can be finished — projects and tasks. The API accepts the fields on categories (live-tested 2026-09-11) but they are not meaningful there (rule 2026-09-11). label_ids applies to both categories and projects. Strategy-dependent fields (start/end date, planned_week/month, review_date, orbit) can be set even when the strategy is disabled in the app. Do not complete projects here (done via /doc/update skips the app's side effects) — that is done in the Marvin app. Note: Marvin's server can sporadically respond 500 on /doc/update (transient and atomic); just retry. But a PERMANENT 500 (persists across retries) means the document does not exist — deleted, or a wrong/never-existing ID (the server responds 500 instead of 404 for missing IDs, verified live 2026-08-29). Fetch a fresh ID via get_categories/get_children.
| Name | Type | Req | Description |
|---|---|---|---|
| backburner | – | – | True = put in the backburner, False = take out. NOTE (verified in the app 2026-08-29 on tasks): only effective on unscheduled items — scheduling trumps the flag |
| color | – | – | Color '#rrggbb', '' removes |
| day | – | – | Projects ONLY: schedule YYYY-MM-DD, 'today', or 'unassigned' to unschedule |
| due_date | – | – | Projects ONLY: deadline YYYY-MM-DD, '' removes |
| end_date | – | – | Soft deadline YYYY-MM-DD (Start & End Dates strategy), '' removes |
| first_scheduled | – | – | The app's bookkeeping field firstScheduled YYYY-MM-DD, '' removes — mainly for restoring the value from the convert tool's removed_project_fields after a conversion round trip (nothing backfills it,… |
| frog | – | – | Projects ONLY: Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxi… |
| icon | – | – | Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only when Master List → Configure View → 'Show Custom Icon On' includes proje… |
| item_id | string | yes | ID of the category/project (from get_categories) |
| label_ids | – | – | New labels (replaces existing ones, [] removes all) — categories AND projects: categories have labels in the same field as projects, stored and rendered (live-tested + verified in the app 2026-09-11) |
| no_auto_orbit | – | – | Orbit strategy: True = exempt from automatic orbiting. UNDOCUMENTED field (bool type verified in live data 2026-08-29) |
| note | – | – | New note (replaces the existing one) |
| orbit | – | – | Orbit strategy: True = put in orbit (verified in the app 2026-08-29 on tasks: Orbit view + icon in Today). UNDOCUMENTED field |
| parent_id | – | – | Move to parent category ID, or 'root' |
| planned_month | – | – | Plan into a month: YYYY-MM (Planning Ahead strategy), '' removes (the app's view may keep showing it until the client is reloaded — see update_task.planned_week) |
| planned_week | – | – | Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy), '' removes (the app's view may keep showing it until the client is reloaded — see update_task.planned_week) |
| priority | – | – | Projects ONLY: 'high'=Most important (red), 'mid'=Very important (orange), 'low'=Important (yellow, the one-star level — NOT the app's 'Low priority', which projects do not have), '' removes. Project… |
| review_date | – | – | Review date YYYY-MM-DD (Review Date strategy), '' removes |
| size | – | – | Projects ONLY: size XS/S/M/L/XL (taskSize 1-5), '' removes |
| start_date | – | – | Start date YYYY-MM-DD (Start & End Dates strategy), '' removes |
| time_estimate_minutes | – | – | Time estimate in minutes, 0 removes it. On projects the own estimate takes precedence; without one the project shows the sum of its children's (per Marvin support) |
| title | – | – | New title |
Structured output declared, but exposes no named fields.
No examples provided.
update_notebook ~192
Rename a standalone notebook or change its sections. Renaming is refused on a notebook that belongs to a project or category (the app would otherwise show the notebook's name instead of the project's). The section list is read just before the write and is rewritten in full. On removal, sectionId is first set to null on the pages in that section, so that no page points to a missing section. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.
| Name | Type | Req | Description |
|---|---|---|---|
| notebook_id | string | yes | The notebook's id (nb_...) |
| sections_add | – | – | New sections (titles), added last |
| sections_delete | – | – | Section ids to remove; their pages become unsectioned |
| sections_rename | – | – | Section id -> new title |
| title | – | – | New name — standalone notebooks only |
Structured output declared, but exposes no named fields.
No examples provided.
update_notebook_page ~270
Change a page's text, title, order or section, or move it. text replaces, append adds at the end; '- ' at the start of a line is written as '* '. New text shows up immediately in an open client. Move: the section does not follow (sectionId null). The first page of a notebook with a parent is not moved out — it is the parent's note. Moving to a project or category without a notebook creates one in the app's shape. The response says when an order change switches which page the parent's note points to. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.
| Name | Type | Req | Description |
|---|---|---|---|
| append | – | – | Text to add at the end (after a blank line) |
| move_to_notebook_id | – | – | Move the page to this notebook |
| move_to_parent_id | – | – | Move the page to a project's or category's notebook (created if needed) |
| page_id | string | yes | The page's id (pg_...) |
| rank | – | – | New order (lowest rank = page 1) |
| section_id | – | – | Section id, '' = no section |
| text | – | – | New text (replaces) |
| title | – | – | New title |
Structured output declared, but exposes no named fields.
No examples provided.
update_recurring_task ~706
Change a recurring task: rule, window, place, end date, properties. Existing occurrences are not corrected when the rule changes via the API, and a later save in the app does not correct them either; they keep their old shape. When the rule is changed in the app's dialog, the app itself removes those that no longer match. When type, interval or Create occurrences change, the tool then works out which open, untouched occurrences from today on do not match the new rule or window. Mode 'list' (default): they are listed and removed only with confirm=true (without deletedDates: they do not come back if they do not match the rule, and outside the window they should come back). Changed occurrences, occurrences before today, custom rules that are not RRULEs and Only on weekdays are listed only. Deleted occurrences can remain visible in an open client until it reloads. New occurrences follow a rule and properties changed via the API, counted from the start day. Custom accepts only an RRULE string. Lowering Create occurrences via the API removes nothing, not even at the next generation; the app's dialog removes untouched upcoming occurrences when the lowering is saved there. confirm=true does what the dialog does.
| Name | Type | Req | Description |
|---|---|---|---|
| bonus_section | – | – | Essential/Bonus, '' removes it |
| confirm | boolean | – | True = remove the occurrences the cleanup listed |
| create_occurrences | – | – | default/0/1/3/7/14/30 |
| custom | – | – | custom: an RRULE string, e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR' |
| daily_section | – | – | Day section, '' removes it |
| ends_on | – | – | End date YYYY-MM-DD, '' removes it |
| hard_deadline_days | – | – | Hard deadline, 0 = off |
| if_you_miss_one | – | – | If you miss one |
| interval | – | – | every_x_* |
| label_ids | – | – | Labels (replaces) |
| month_day | – | – | monthly |
| note | – | – | Note (replaces) |
| off_days | – | – | on_off |
| on_days | – | – | on_off |
| only_weekdays | – | – | Only on weekdays: a month day on a weekend is moved to Friday (verified); every_x_days counts in weekdays (inferred) |
| parent_id | – | – | Move the recurring task (the next occurrences land there) |
| priority | – | – | isStarred 3/2/1/-1, 0 removes it |
| recurring_task_id | string | yes | The recurring task's ID (recurringTaskId on an occurrence) |
| repeat | – | – | New type (not to/from after_completion). The dialog's eleven types: daily, weekly (weekday), monthly (month_day), x_times_per_week (weekdays), every_x_days / every_x_weeks / every_x_months / every_x_… |
| size | – | – | Size XS-XL, '' removes it |
| subtasks_add | – | – | New subtasks on the recurring task |
| title | – | – | New title |
| weekday | – | – | weekly |
| weekdays | – | – | x_times_per_week |
Structured output declared, but exposes no named fields.
No examples provided.
update_task ~1,332
Update a task: title, day, time, reminders, size, subtasks. /doc/update (Full Access Token). Categories/projects: update_category_or_project; priority and frog: set_priority; completion: mark_done. Changing the day does what the app does: reminderTime and the server entry T move to the new day, own reminders (M) stay and are listed in the response. New clock time: new T, own reminders (including 'X min before') keep their time. time='' removes the clock time in the app's form. If the day is removed (day='unassigned') the clock time and T are removed as in the app; own reminders stay. Subtasks are written with dotted keys. parent_id or subtasks on a recurring occurrence give a warning: the recurring task stays as it is, so future occurrences follow it — change it with update_recurring_task. Strategy-dependent fields are stored even when the strategy is off in the app. A sporadic 500 on /doc/update is transient (retried once); a permanent 500 = the document does not exist.
| Name | Type | Req | Description |
|---|---|---|---|
| backburner | – | – | True = put in the backburner, False = take out. NOTE: only effective on an UNSCHEDULED task — set day='unassigned' at the same time; scheduling trumps the flag in the UI (verified in the app 2026-08-… |
| bonus_section | – | – | 'Essential' or 'Bonus' (bonusStructure strategy), '' removes |
| custom_section | – | – | ID of a custom section from strategySettings.customStructure, '' removes |
| daily_section | – | – | Day section 'Morning'/'Afternoon'/'Evening' (dailyStructure strategy), '' removes |
| day | – | – | Schedule on YYYY-MM-DD, 'today', or 'unassigned' to unschedule |
| due_date | – | – | Deadline YYYY-MM-DD, or '' to remove |
| end_date | – | – | Soft deadline YYYY-MM-DD (Start & End Dates strategy), '' removes |
| item_id | string | yes | Task ID |
| label_ids | – | – | New labels (IDs from get_labels; replaces existing ones, [] removes all) |
| no_auto_orbit | – | – | Orbit strategy: True = exempt the task from automatic orbiting (auto-orbit otherwise pulls in scheduled tasks). UNDOCUMENTED field (bool type verified in live data 2026-08-29) |
| note | – | – | New note (replaces the existing one) |
| orbit | – | – | Orbit strategy: True = put in orbit (verified in the app 2026-08-29: shows in the Orbit view + orbit icon in Today). UNDOCUMENTED field (missing from the official data types) |
| parent_id | – | – | Move to category/project ID (not validated by the server — a wrong ID yields an orphan, live-tested 2026-08-29; repaired by running FIX_CYCLES() in the app's console) |
| perma_snooze_time | – | – | Hide the task every day until HH:mm (permaSnoozeTime), '' removes. Verified in the app 2026-08-29 |
| planned_month | – | – | Plan into a month: YYYY-MM (Planning Ahead strategy, verified in the app 2026-08-29), '' removes |
| planned_week | – | – | Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy; verified in the app 2026-08-29 — also shows in the month view), '' removes. The app's view: clearing propagates server-side, b… |
| reminders | – | – | Own reminders: 'HH:MM' on the task's day, or 'before:N' = N minutes before the clock time. Stored as the reminders list + one server entry of type M per reminder; before values are saved as an absolu… |
| review_date | – | – | Review date YYYY-MM-DD, '' removes. Verified in the app 2026-08-29: shows in the Review view on the date; the day-view banner additionally requires the Review Alert workflow snippet |
| reward_points | – | – | Reward points the task AWARDS on completion (coin + points in the list row when the Rewards strategy is on, verified in the app 2026-08-29), 0 removes. Do not set together with isReward |
| size | – | – | Size XS/S/M/L/XL (taskSize 1-5), '' removes (false) |
| snooze_until_unix_ms | – | – | Snooze the task until unix time in milliseconds (itemSnoozeTime), 0 removes. Verified in the app 2026-08-29: hides from Today AND the category view (the wiki's 'everywhere except the master list' doe… |
| start_date | – | – | Start date YYYY-MM-DD, '' removes. Mechanics (verified in the app 2026-08-29): the Start Dates strategy hides BACKBURNER items until their start date — combine with backburner=true and day='unassigne… |
| subtasks_add | – | – | New subtasks (titles), added last |
| subtasks_done | – | – | Subtask ids to check off (ids from the task's subtasks) |
| subtasks_rename | – | – | Subtask id → new title |
| time | – | – | Clock time HH:MM (requires a day). Writes the app's form: taskTime, title prefix 'HH:MM ', reminderTime and a server entry of type T — the app reminds at that time. '' removes the time (update_task) |
| time_block_section | – | – | Time block ID (from get_today_time_blocks, or time_block_id from create_time_block), '' removes. Shows under the block's section in Today when Time Block Sections is on, the day view is grouped by ti… |
| time_estimate_minutes | – | – | Time estimate in minutes, 0 removes it |
| title | – | – | New title |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the Amazing Marvin (complete) MCP server?
Amazing Marvin (complete) runs locally as a PyPI package, launched with uvx amazing-marvin-complete-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · amazing-marvin-complete-mcp
claude mcp add andreasd083-amazing-marvin-complete-mcp -- uvx amazing-marvin-complete-mcp
What is the Amazing Marvin (complete) MCP server?
Amazing Marvin (complete) is an MCP server listed in the public MCP registry as io.github.andreasd083/amazing-marvin-complete-mcp. Amazing Marvin task manager: complete public-API coverage (50 tools) with built-in rate limiting. This page covers its PyPI package (amazing-marvin-complete-mcp).
What tools does the Amazing Marvin (complete) MCP server expose?
Amazing Marvin (complete) exposes 50 tools: test_connection, create_task, mark_done, unmark_done, mark_project_done, and 45 more. Their descriptions and schemas cost roughly 12,952 tokens of context every time the server is loaded.
Is the Amazing Marvin (complete) MCP server still maintained?
Amazing Marvin (complete) is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Amazing Marvin (complete) MCP server under?
Amazing Marvin (complete) declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.