amazing-marvin-complete-mcp
This server gives AI assistants full MCP access to Amazing Marvin's public API — reading and writing tasks, projects/categories, habits, time blocks, tracking, rewards, reminders, and account data.
Tasks: create, update, complete/uncomplete, delete permanently, set priority/frog, schedule, deadlines, labels, notes, estimates, sections, backburner/orbit, snooze, planned week/month, review dates, and read today's/due/done items.
Structure: create, update, and convert categories and projects, manage hierarchy, colors, icons, labels, and notes; read the full category/project tree.
Habits: list all habits with full documents, view a habit's tracking history, and record or undo check-ins.
Time blocks: read today's time blocks with category/smart-list mapping, and create time blocks (experimental) whose IDs can link tasks to block sections.
Time tracking: see what's being tracked, start/stop tracking on tasks, and read time-tracking history.
Rewards & kudos: get kudos/XP, claim, undo (task-linked only), spend, and reset reward points; get account info including the points balance.
Reminders: list server-side push reminders, set standalone reminders, and delete reminders.
Calendar: create calendar events (experimental; sync depends on the app running).
Account & monitoring: test API connection, get account info, check today's API-call budget via rate-limit status, and get a capability overview without using API calls.
Safety/quality: enforces rate limits globally, validates dates and numeric ranges, avoids known Marvin API quirks (e.g.
#title corruption, shortcut parsing), and documents unsupported operations clearly.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@amazing-marvin-complete-mcpWhat are my tasks for today?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
amazing-marvin-complete-mcp
An MCP (Model Context Protocol) server for
Amazing Marvin with complete coverage of the
public API: 38 tools over all ~31 documented endpoints (plus the
undocumented /doneItems), a global rate
limiter that respects Marvin's documented limits, least-privilege token
routing, and MCP tool annotations. As of 1.1.0 every writable field in
Marvin's official data model (Tasks and Categories/Projects) is either
supported by a tool or explicitly documented as unsupported — see
docs/field-reconciliation.md. Every
non-obvious behavior claim in the tool descriptions was verified against
the live API — the findings are documented below in
Marvin API quirks & findings,
which may be useful even if you never run this server.
Maintenance status: Bug reports are welcome and appreciated — they help keep this working for everyone. Please note this is a side project maintained when time allows: bug reports get looked at, but response times vary and feature requests are unlikely to be picked up. For installation help, paste this README into your AI assistant — it can walk you through setup and troubleshooting far faster than I can. Provided as-is, without guarantees — it's MIT, fork freely.
Tools (38)
Group | Tools |
Core |
|
Reading |
|
Structure |
|
Habits |
|
Time blocks |
|
Time tracking |
|
Kudos/rewards |
|
Misc |
|
Capability overview
list_capabilities (no Marvin API call) returns the same map as the table
below, per tool with can and cannot, plus the list of things that only
work in the app. Call it before assuming something is impossible via MCP.
The server also sends a short instructions text at initialize (shown by
Claude Code, not by the claude.ai clients). The first line of every tool
description is a whole sentence of at most 75 characters stating the
capability — the clients show only that line in their catalog; the test
tests/test_discoverability.py guards it.
Area | Can via MCP | Cannot via MCP (done in the app) |
Tasks | create/update/complete/delete, priority and frog, day, deadline, labels, estimate, note, sections, planned week/month, review date, backburner, orbit, snooze, time block; read today's, due and done | a time/reminder on the task (taskTime), recurrence rules, startDate at creation (update_task afterwards) |
Structure | the hierarchy, children, create/update/convert categories and projects, labels on both, color, icon, note; read labels and goals | creating/editing labels, goals, smart lists, strategies; completing projects |
Habits | list, tracking record, record/undo | creating/editing habits |
Time | today's time blocks with mapping, create a block, time tracking start/stop/history | the smart-time-block mapping on a block |
Rewards | kudos, award/undo/spend/reset reward points | undoing a MANUAL award; reading the app's Rewards |
Reminders | server-side reminders: list, set standalone, delete | task-linked reminders (two-write sync) |
Calendar | create an event (experimental) | reading/editing events |
Account | test, account info, call budget, capability overview | — |
Deliberately not included: Smart List / task-picking logic (Marvin's own
Spotlight does the picking; the server gives your assistant hands, not
opinions), and the /reminder/deleteAll endpoint — the one documented
endpoint without a tool, deliberately: it wipes every reminder in a single
call and delete_reminder already covers targeted cleanup.
Every tool carries MCP tool annotations
(readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so
capable clients can treat delete_task and reset_reward_points with the
respect they deserve.
Related MCP server: Super-Productivity-MCP
Getting your Marvin tokens
Both tokens live in Amazing Marvin under Settings → API (app.amazingmarvin.com/pre?api):
API Token (
MARVIN_API_TOKEN, required for use) — limited access; enough for reading and creating tasks. The server does start without it (so MCP clients and directories can list the tools), but every tool call returns a clear error until the token is set.Full Access Token (
MARVIN_FULL_ACCESS_TOKEN, optional but recommended) — required by all/doc*-based tools:update_task,set_priority,unmark_done,delete_task, category creation, time blocks,list_habits, reminders,reset_reward_points.
Treat them like passwords; see SECURITY.md.
Install & run
Requires Python 3.12+.
From PyPI (recommended): with uv installed
there is nothing to set up — point your MCP client at
uvx amazing-marvin-complete-mcp as shown below.
From source:
git clone <this repo> && cd amazing-marvin-complete-mcp
python -m venv .venv && .venv/bin/pip install .
# then use /path/to/.venv/bin/marvin-mcp as the command belowLocal (stdio) — Claude Desktop, Claude Code, any MCP client
The default transport is stdio, so the client starts the server itself:
{
"mcpServers": {
"amazing-marvin": {
"command": "uvx",
"args": ["amazing-marvin-complete-mcp"],
"env": {
"MARVIN_API_TOKEN": "…",
"MARVIN_FULL_ACCESS_TOKEN": "…",
"MARVIN_TIMEZONE": "Europe/Stockholm"
}
}
}
}(For Claude Code: claude mcp add amazing-marvin -e MARVIN_API_TOKEN=… -- uvx amazing-marvin-complete-mcp.)
Remote (Streamable HTTP)
MCP_TRANSPORT=http PORT=8787 MCP_AUTH_TOKEN_FILE=/path/to/token \
MARVIN_API_TOKEN_FILE=/path/to/api-token .venv/bin/marvin-mcpThe MCP endpoint is /mcp. HTTP mode fails closed: without
MCP_AUTH_TOKEN (or MCP_AUTH_TOKEN_FILE) the server refuses to start,
with instructions in the error message; set MCP_ALLOW_UNAUTHENTICATED=true
only to deliberately run an open instance on localhost. The built-in bearer
check protects every path but is an internal barrier, not a complete auth
story:
put a reverse proxy with TLS in front, and for Claude custom connectors an
OAuth 2.1-capable MCP auth proxy. A Dockerfile for HTTP mode is included
(runs as a non-root user; mount a volume on /data to persist the daily
rate-limit counter across restarts).
Configuration
All settings via environment variables — see .env.example
for the full annotated list. Highlights: every secret supports a *_FILE
variant (recommended); MARVIN_TIMEZONE should match the timezone your
Marvin account lives in (defaults to the system timezone, which is UTC in
most containers).
Rate limiting
Marvin's documented limits — 1 write/second, 1 read/3 seconds, 1440
calls/day — are enforced by a single process-global queue shared by all
tools and sessions, with margin (1.1 s / 3.1 s). The daily counter persists
across restarts (STATE_DIR) and rolls over at midnight in the configured
timezone. get_rate_limit_status shows today's usage.
Marvin API quirks & findings
Everything below was verified against the live API (2026-08-19 through 2026-08-29). This is the half of the repo you can use without running it.
Habits
Non-raw
GET /habitsdoes not read your habit documents. It reads a server-side tracking registry that is created lazily on the first recording — a habit that has never been recorded is missing from the response entirely, and the entries carry no titles (onlyhabitId+ history). Use?raw=1(Full Access Token) to list actual habit documents.GET /habit?id=…returns the tracking record — history but no title.POST /updateHabitrejects integers serialized as floats:"value": 1.0→ 400 Bad request,"value": 1→ 200. Send ints as ints.
Tasks & projects
POST /markDoneworks for tasks only — projects get400 "Can only mark Tasks done with this API".By default
/addTaskparses some of Marvin's quick-add shortcut syntax server-side:~15becomes a 15-minutetimeEstimate,+YYYY-MM-DDsetsday(scheduling — not the deadline) and*p1..*p3set priority. All three are stripped from the title. Note the priority mapping is inverted relative to the stored field:*p1(highest) →isStarred: 3,*p2→2,*p3(lowest) →isStarred: 1. The other magic words (*urgent,*fire,*heavy,*weight,*love,*lowfocus,*physical) and$-words (e.g.$MONTHon a non-recurring task) are not parsed — they are stored literally in the title with no fields set; they only work in the app's quick-add. But the#shortcut is outright dangerous: any#wordin the title (a ticket reference like#123included) is stored literally asparentId(greedy up to the first hyphen, e.g.#MCP-TEST→parentId: "#MCP"and a corrupted title) without resolving any ID — even overriding an explicitly suppliedparentIdin the same request. The task then lives outside every category and outside the Inbox — effectively invisible. (First reported by lucasoeth/marvin-mcp; independently reproduced and expanded here.) This server is not affected:create_tasksends the undocumentedX-Auto-Complete: falseheader (added in MarvinAPI#50), which disables all shortcut parsing — titles are stored verbatim, and thetime_estimate_minutesparameter replaces the~15shortcut (timeEstimateis milliseconds: 15 min =900000)./addProjecthas the same#wordcorruption bug but ignores theX-Auto-Completeheader (live-tested: the title is stripped andparentIdcorrupted even with the header set). This server therefore blocks#in project titles locally (in the client layer, before any API call) with an explanatory error. Category titles are safe — they go through/doc/create, which parses nothing./addEventis unaffected (live-tested 2026-08-25): event titles with#wordare stored verbatim, with and without the header — the quick-add parsing bug exists only in/addTaskand/addProject.Generated instances of recurring tasks have deterministic IDs (
YYYY-MM-DD_<recurringTaskId>), which is why marking them done/undone through the API cannot create duplicates. The instances are generated by the Marvin client, so today's recurring tasks can be missing from/todayItemsuntil the app has been running./doc/updatecan sporadically return a transient 500; the write is atomic (no partial state) — just retry. Project renames, moves, label changes etc. all work through it./doc/updatereturns 500 instead of 404 for documents that do not exist (deleted or never created; live-tested 2026-08-29) — a permanent 500 therefore means "wrong/dead ID", not a server error or a corrupted document.startDate/endDateare ignored by/addTaskand/addProject(live-tested 2026-08-29) — they can only be set afterwards via/doc/update(the update tools)./addProjectalso ignorescolor/icon(set them viaupdate_category_or_project), and/addTasksilently dropsnoAutoOrbit(live-tested 2026-09-13) — set it withupdate_taskafter creating the task.A clock time on a task (Time/
taskTime) is set in the app, not via this MCP — a deliberate MCP choice (the double-write sync, seeset_reminder), NOT a Marvin limitation: Marvin fully supports times on tasks, and with auto-created reminders a set Time automatically becomes a reminder at the same time (live data 2026-09-02). Reading the fields works. The phrasing "you cannot set a time on a task" is therefore wrong about Marvin — it only holds for the MCP write path.Projects are prioritized with the string field
priority("high"/"mid"/"low"), notisStarredlike tasks (live-tested 2026-08-29) — which is whyset_priorityis task-only. Mapping (verified against the app's code 2026-08-30):high= Most important (red),mid= Very important (orange),low= Important (yellow, the one-star level). The app's fourth level Low priority (down arrow) is stored on tasks asisStarred: -1(magic words*low/*p0); projects do not have it — the app clears the priority when converting a low priority task into a project.set_priority/create_taskaccept-1.Completed tasks are readable via the undocumented endpoint
GET /doneItems?date=YYYY-MM-DD(missing from the OpenAPI spec and the wiki; live-tested 2026-08-30, may disappear without notice). It filters on the task'sday, not ondoneAt, and a pastdaysurvives completion both in the app and via/markDone(the app setsdayto today only on unscheduled and future-dated tasks).get_done_itemstherefore fetches the date plus a 7-day lookback window and filters ondoneAt; the response states its coverage (covers_from,days_fetched), complete results are cached for 30 minutes, and on a 429 the tool returns what it got, flaggedincomplete/days_missing. Single completed tasks can also be read with/doc?id=./todayItems,/dueItemsand/childrenexclude completed items;/doneTasksand/completedItemsare 404.Marvin returns 429 even with 3 s spacing when the daily average (1440/day = "1 per minute") is exceeded within a shorter, undocumented window — observed 2026-08-30 after ~100 calls in one hour. After a 429 the limiter pauses all calls for 60 s (or
Retry-After) and logs the response headers (allow-listed names only).The server validates no writes (live-tested 2026-08-29): invalid dates, negative/out-of-range numbers, mistyped values, empty titles, dead parentId/labelIds and unknown fields are stored verbatim via
/doc/update(and almost everything via/addTask). The tools therefore validate dates (strict YYYY-MM-DD, year 2000-2100), titles and numeric ranges client-side; references are not validated (orphan risk documented in the descriptions)./doc/deleteresponds 200 even for IDs that never existed or are already deleted — idempotent, no 404 (unlike/doc/update)./markDoneon the other hand gives a proper 404 for a missing ID and 400 for an already completed task — three endpoints, three different answers to "does not exist" (live-tested 2026-08-29).Read endpoints (
/todayItems,/dueItems) are pure date filters: backburner, startDate and orphan status (dead parentId) do not affect them — and orphans never show up underunassigned(live-tested 2026-08-29)./todayItems?date=Xreturns all open items withday<= X, not just day X (live-tested 2026-09-11, rollover enabled)./markDonestops running time tracking and now also writestask.times(live-tested 2026-09-02; it did not on 2026-08-29 — server behavior changed). A direct/track STOPstill does not writetimes; there/tracksis the only record.orbit/noAutoOrbitare missing from the wiki's data types but present in live data (bool, verified 2026-08-29) — exposed as explicitly undocumented passthrough parameters on the update tools.Project↔category conversion happens in place:
_id,createdAtand the children remain (verified 2026-08-29, both via an app field test and via the API). The app has two conversion paths with different behavior (verified 2026-08-30/31): the Edit Settings button permanently clearsday/dueDate/priority/isFroggedand leavesfirstScheduledbehind (a bug in Marvin's tracker), while the right-click/hover path is a lossless round trip — but that button is not in the menu by default (add it via the gear icon in the right-click menu → Add action).convert_category_or_projectis lossless by default since 1.5.0; passclear_project_fields=Truefor a clean category (the previous values are returned inremoved_project_fields). There is no official conversion endpoint — the tool setstypedirectly, which is undocumented server behavior and marked experimental./doc/createdoes not echo back a server-generated_id— supply your own if you need to reference the document afterwards.Deletion via
/doc/deleteis permanent; Marvin's trash is client-side.The app's view after API writes (live-tested 2026-09-12, PWA + Windows desktop app 1.70.0, both open at the same time): creating, field changes and moves between category/Inbox render immediately with no action needed. Deletions do not render at all — neither waiting nor switching views helps. The same held for a cleared
plannedWeek/plannedMonthwith Planning Ahead on (2026-08-29) and for strategy toggling (method rule since 2026-08-29). Rule of action: (1) confirm the server with a read (get_childrenon the parent — the task should be missing); (2) if the app still shows the row, that is the app's view, not an error — reload the client before the row is touched in the app: F5 in the web app/PWA, restart of the desktop app (it has no refresh). The reason for "before the row is touched": editing a row in the app whose document is already deleted on the server can recreate the document through the client's conflict resolution (observed once, 2026-09-12, in one of the two clients — which one is not recorded; reported upstream). This is the Marvin client's view — not to be confused withget_done_items' own 30-minute cache, which goes the other way (app → MCP).
Reward points & kudos
Kudos (XP/level, read via
/kudos) and reward points (claim/unclaim/spend/reset) are two separate systems./kudoslacksnextMultiplier(MarvinAPI issue #5) — it's in/me./markDonedoes not award a task's reward points (cf. issue #6 for kudos) —claimRewardPointsis a separate call.A
MANUALclaim (itemId: "MANUAL") cannot be undone: the server stores no entry for it, so/unclaimRewardPointsreturns404 "No such entry"(with or without apointsfield), and claiming negative points is rejected with 400. The Marvin web app never usesMANUAL— it is an API-only facility. The only compensation is spending the same amount, which inflates the spent statistics./spendRewardPointsreturns a 500 if the balance would go negative.The app's purchasable rewards are separate
db="Rewards"documents that the public API cannot reach at all (live-tested 2026-08-29:/rewardsand every variant 404, no rewards profile documents, and/docneeds an ID you can't discover). The Task fieldisRewardis decoupled from the app's reward flow and produced no UI effect when set via the API.
Reminders
A task reminder in Marvin is two writes that only the app keeps in sync: reminder fields on the task document (
taskTime,reminderTime,reminderOffset,snooze,autoSnooze) and a server-side entry via/reminder/set. Writing only one side (all the API lets you do comfortably) produces entries the app UI won't show on the task, or server-side orphans. Standalone reminders (typeM) are the safe use of the API. (Risk first documented by Recon2026/marvin-mcp; confirmed by the official wiki's own warning.)
Time & planning
/todayTimeBlocksomits the block↔category link (issue #65); this server recovers the mapping from thestrategySettings.plannerSmartListsprofile document.Stopping time tracking via a direct
/track STOPdoes not update the task's owntimes/durationfields;/tracksis the source of truth./markDoneduring active tracking does write bothtimes(live-tested 2026-09-02) andduration(verified 2026-09-13; the app shows the tracked time under Completed Today when Time Tracking is on).Calendar events created via
/addEventsync onwards only while the Marvin app is running somewhere (client-side calendar sync).
UI behavior of API-set fields (verified in the app, 2026-08-29)
Toggling a strategy requires an app restart before its fields render — without one, freshly enabled strategies show nothing and look broken.
backburneris only effective on unscheduled items: scheduling (day) trumps the flag in the UI. Setday: "unassigned"together withbackburner: true.startDatehides backburner items until their start date (the Start Dates strategy's actual mechanic) — it does not hide scheduled tasks.Icon names are library-prefixed (
lucide-Rocket,huge-happy) or emoji. Projects render their icon only when Master List → Configure View → "Show Custom Icon On" includes projects — "Categories & Projects" (verified 2026-08-31) or "Just Projects" (verified 2026-09-18); the earlier "projects never render an own icon" was our own test error.A project's
timeEstimaterenders as its own estimate; the UI does not aggregate it with the children's estimates, despite the wiki's claim.Snoozed tasks (
itemSnoozeTime) are hidden from the category view too — the wiki's "everywhere except the master list" doesn't hold there.timeBlockSectionlinks a task to a time block's section in Today — but only if the Time Block Sections strategy is on, the day view is grouped by time block (Group by → Group by time block section; set per device, not synced) and the task is scheduled on the block's day. Unscheduled tasks with the field set do not appear in Today at all. The block needs no label/category mapping of its own; that mapping (Smart Time Block) is a second, independent route. Verified in the app 2026-09-17 (1.70.0.0, PWA + desktop); the earlier "stored but not rendered" finding was our own test error (grouping never set) and is withdrawn; the correction to Marvin support is pending. Since 1.7.0create_time_blockreturnstime_block_id(set client-side, as/doc/createdoes not echo the server id), usable directly astime_block_section.reviewDateshows in the Review view; the day-view banner additionally requires the "Review Alert" workflow snippet.Auto-orbit (if enabled) pulls newly scheduled tasks into Orbit unless
noAutoOrbitis set.Project-only fields (
day,dueDate,priority,isFrogged) written onto a category are silently accepted by the server (live-tested 2026-09-11).update_category_or_projectstill type-checks and blocks them, for a structural reason: a category is never completed, so those fields belong to projects and tasks.labelIdsis different — categories have labels in the same field as projects, and an API-set label is stored and rendered (live-tested + verified in the app 2026-09-11), solabel_idsis allowed on categories since 1.6.0.
How this differs from existing alternatives
Several good Amazing Marvin MCP servers exist; this one was built fresh (no shared code) after studying them, with a different goal — complete coverage of the public API rather than a curated subset:
bgheneti/Amazing-Marvin-MCP — the established Python server; broad but not complete coverage, no global rate limiting.
Recon2026/marvin-mcp — smaller scope (19 tools), unusually careful research; chose to make reminders read-only over the two-write risk. This server ships reminder writes with explicit warnings instead.
lucasoeth/marvin-mcp — a different philosophy: a handful of consolidated workflow tools (brief/ capture/…) rather than an API mirror, plus direct CouchDB reads for search and completed tasks (which the public API can't do at all). If you want opinionated workflows or search, use theirs; if you want raw, complete API access with the sharp edges documented, use this one.
LucaDeLeo/amazing-marvin-mcp — a Limited-API subset.
Credits & sources
No code was copied from any of these — the build is fresh — but they materially shaped it:
amazingmarvin/MarvinAPI (+ wiki) — the official API documentation, OpenAPI spec, data types, and issue tracker this server is built against.
bgheneti/Amazing-Marvin-MCP — architecture inspiration, endpoint reference during the initial gap analysis, and the MIT-licensing precedent.
Recon2026/marvin-mcp — the reminder two-write integrity risk and the groundwork on recurring-task instances, both verified and documented here.
lucasoeth/marvin-mcp — the
#Categoryshortcut bug (reproduced here) and the insight that Marvin's sync database is a real CouchDB usable for reads.LucaDeLeo/amazing-marvin-mcp — the pointer that
/addTaskparses shortcut syntax server-side (partly confirmed, partly refuted — see the#Categoryfinding), and the idea of MCP tool annotations.
Built with Claude Code (Claude Fable 5).
License
MIT.
Available Tools
38 toolsclaim_reward_pointsA
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 | Required | Description | Default |
|---|---|---|---|
| date | No | Date YYYY-MM-DD; omit for today (server timezone) | |
| points | Yes | Number of points to award | |
| item_id | Yes | Task ID, or 'MANUAL' for a manual point award |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide generic flags; the description adds crucial behavioral detail: manual awards cannot be undone through the API, unclaim returns 404, negative points are rejected with 400, and compensating via spend_reward_points inflates spent statistics. This is meaningful context beyond what annotations or schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads purpose before caveats. The issue reference and verification date add credibility, though they make the description slightly more verbose than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the full schema and output schema, the description covers the key decision points: when to call this tool, what happens after mark_done, and the irreversible nature of manual awards. No critical invocation detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description reinforces the significance of item_id='MANUAL' and positive point values but does not introduce new parameter-level details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Award') and resource ('reward points for a completed task or manually'). It clearly distinguishes itself from siblings like spend_reward_points and unclaim_reward_points by scoping what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to call this tool: after mark_done, because mark_done does not automatically award reward points. It also warns that manual awards are irreversible and names the only compensation path, spend_reward_points, giving clear context for choosing alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_category_or_projectAIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target type to convert to | |
| item_id | Yes | ID of the project/category to convert (from get_categories) | |
| clear_project_fields | No | 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 permanent conversion); the previous values are then returned in removed_project_fields. Default False = lossless, like the app's correct path |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description goes well beyond these: it discloses that the tool relies on undocumented server behavior via /doc/update, that conversion is a pure type change preserving _id/createdAt/children, that project fields may remain on categories as intentional round-trip data, and that clear_project_fields=True clears specific fields and returns them in removed_project_fields. It also flags the risk of orphans/cycles. This is rich behavioral context that annotations alone do not provide, and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, experimental risk, lossless semantics, the clean-category option, app-path context, and a critical safety warning. It is front-loaded with the core purpose and the most important caveat (EXPERIMENTAL). It is longer than average, but the complexity of the tool justifies the length; minor redundancy exists around the app's correct path being mentioned twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the 100% schema coverage, and the presence of an output schema, the description is complete. It covers the conversion direction, the undocumented endpoint risk, the lossless behavior, the clean-category alternative, the subcategory safety constraint, and the verification date. An agent has everything needed to decide whether and how to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains the lossless default behavior, what clear_project_fields=True actually clears (day/dueDate/priority/isFrogged/firstScheduled), the relationship to the app's buggy Edit Settings path, and the return of removed_project_fields. It also clarifies that item_id comes from get_categories. This elevates the parameter guidance above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Convert a project to a category or back, in place and losslessly.' It clearly distinguishes the tool's bidirectional conversion behavior and immediately contrasts with the sibling update_category_or_project by explaining the type-change semantics. The experimental caveat and lossless-by-default detail further sharpen what this tool uniquely does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use for in-place type conversion, and explicitly warns 'Do NOT convert a category that contains subcategories into a project' with a reason (orphans/cycles) and a check to perform first (get_children). It also explains when to set clear_project_fields=True versus the default lossless path, and notes the app's correct path is not in the menu by default. This is thorough routing and exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_category_or_projectA
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 | Required | Description | Default |
|---|---|---|---|
| day | No | Projects ONLY: schedule on YYYY-MM-DD or 'today' (blocked for categories — a category is never completed) | |
| frog | No | Projects ONLY: frog marker 1=normal, 2=baby, 3=monster | |
| icon | No | 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 projects only when Master List → Configure View → 'Show Custom Icon On' includes projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong) | |
| kind | Yes | Kind | |
| note | No | Note | |
| color | No | Color '#rrggbb'. Categories ONLY at creation — /addProject ignores the field (verified live 2026-08-29); set project color with update_category_or_project afterwards | |
| title | Yes | Name | |
| due_date | No | Projects ONLY: deadline YYYY-MM-DD (blocked for categories — a category is never completed) | |
| priority | No | 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). Projects do not use isStarred (verified live 2026-08-29; mapping verified against the app's code 2026-08-30) | |
| label_ids | No | 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) | |
| parent_id | No | ID of the parent category, or 'root' for the top level | root |
| review_date | No | Review date YYYY-MM-DD (Review Date strategy) | |
| planned_week | No | Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy; mainly projects) | |
| planned_month | No | Plan into a month: YYYY-MM (Planning Ahead strategy; mainly projects) | |
| time_estimate_minutes | No | Time estimate in minutes. NOTE: rendered as the project's OWN estimate — the UI does not aggregate it with the children's, despite the wiki's claim (verified in the app 2026-08-29) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the sparse annotations by disclosing real behavioral traits: endpoint routing, Full Access Token requirement, the fact that /addProject ignores certain fields, and a critical corruption bug when project titles contain '#word'. It also notes that the client blocks the bug locally before any API call, which materially changes how an agent should behave. This is exceptional transparency for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and detailed, but nearly every sentence carries operational necessity for a high-risk create operation. It front-loads the core purpose and then organizes caveats by topic, ending with a clearly separated corruption-bug note. It is dense rather than bloated, and the detail is justified by the number of supported fields and edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters, only 2 required, a complex category-vs-project split, and minimal annotations, this description is remarkably complete. It covers auth requirements, field applicability, sibling-tool routing, unsupported fields, and a serious title-validation bug. With an output schema present, there is no need for the description to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real cross-parameter meaning: label_ids applies to both categories and projects, day/due_date/priority/frog are accepted by the API but meaningless for categories, and startDate/endDate are not settable at creation. These insights strengthen the interpretation of the schema without repeating it verbatim.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a category or project with color, icon, labels and note.' It also names the underlying endpoints (/doc/create and /addProject) and clarifies the nesting rule that distinguishes categories from projects. This is immediately distinguishable from sibling tools like update_category_or_project and create_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance about when not to use this tool: startDate/endDate cannot be set at creation and should be handled with update_category_or_project afterwards, and project color must be set via update_category_or_project. It also explains why fields like day/due_date/priority/frog are not meaningful for categories. It does not explicitly contrast with create_task, but the dual resource name makes that boundary reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventA
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 | Required | Description | Default |
|---|---|---|---|
| note | No | Note (markdown) | |
| title | Yes | Event title | |
| start_iso | Yes | Start time, ISO 8601 with timezone, e.g. 2026-08-20T14:30:00+02:00 | |
| length_minutes | Yes | Length in minutes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-idempotent operation, but the description adds meaningful context beyond those flags: the feature is experimental, sync is client-side, and the event will not sync onward unless the Marvin app is running. This is useful behavioral information that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loads the experimental warning, but it repeats the same information: 'Create a calendar event (experimental)' is immediately followed by 'EXPERIMENTAL: Create a calendar event.' The redundancy prevents it from being as tight and efficient as it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With complete parameter documentation and an output schema available, the description covers the one critical piece of context that could surprise an agent: the dependency on a running client app for external calendar sync. It does not mention alternative behavior or failure modes, but the structured data covers the remaining essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter already has an explicit description, including an ISO 8601 example for start_iso and minimum constraints for length_minutes. The tool description adds no extra parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a direct action ('Create') on a defined resource ('calendar event') and marks it as 'experimental.' It clearly distinguishes this from sibling tools like create_task and create_time_block by specifying the calendar-event context and external-calendar sync. No ambiguity remains about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear operational prerequisite: the Marvin app must be running on some device for the event to sync to an external calendar. However, it does not compare this tool with siblings such as create_time_block, nor does it state when to prefer or avoid this tool. Usage is mostly implied by the resource name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskA
Create a task with category, day, priority, labels, estimate, sections. Prefer priority/frog over dates where possible.
The title is stored verbatim: this tool disables the server's shortcut parsing (X-Auto-Complete: false, verified against the live API 2026-08-20), so quick-add syntax like '#Category', '~15', '+YYYY-MM-DD' and '*p2' is NOT parsed — '#' in titles (e.g. ticket references) is therefore safe. Without this, every '#word' would corrupt the task (the string is stored unresolved as parentId, making the task invisible). Use the parameters instead: parent_id, day, priority, time_estimate_minutes, label_ids.
Note: startDate/endDate CANNOT be set here — /addTask ignores them (verified against the live API 2026-08-29). Set them with update_task after creation. A clock time (Time/taskTime) on the task: fully possible in Marvin, but it is set in the APP, not via this MCP — an MCP limitation, NOT a Marvin limitation. A set Time automatically becomes (with auto-created reminders enabled in the user's settings) a reminder at that time; the task does NOT become an event and blocks no time (time blocking = time blocks). The reason for the app route is the double-write sync — see set_reminder. Strategy-dependent fields (planned_week/month, review_date, backburner, is_reward/reward_points, the sections) are stored even when the strategy is disabled in the app — they just are not shown in the UI then.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | Schedule on date YYYY-MM-DD, 'today', or 'unassigned' (= unscheduled, same as omitting). Same rules as update_task. | |
| frog | No | Frog marker 1=normal, 2=baby, 3=monster | |
| note | No | Note (markdown) | |
| title | Yes | Task title | |
| due_date | No | Deadline YYYY-MM-DD (use sparingly) | |
| priority | No | 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 — the value is stored regardless). 0 is not valid here; omit for no priority | |
| is_reward | No | 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 endpoint exists, and app rewards are not Tasks); the flag on a Task produced no UI effect. Never combine with reward_points | |
| label_ids | No | Label IDs (from get_labels) | |
| parent_id | No | 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 (live-tested 2026-08-29); repaired by running FIX_CYCLES() in the app's console | |
| backburner | No | 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 | |
| review_date | No | Review date YYYY-MM-DD (Review Date strategy) | |
| planned_week | No | Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy) | |
| bonus_section | No | 'Essential' or 'Bonus' (bonusStructure strategy) | |
| daily_section | No | Day section: 'Morning', 'Afternoon' or 'Evening' (dailyStructure strategy) | |
| planned_month | No | Plan into a month: YYYY-MM (Planning Ahead strategy) | |
| reward_points | No | 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 together with is_reward | |
| custom_section | No | ID of a custom section from strategySettings.customStructure (customStructure strategy) | |
| time_block_section | No | 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 (verified in the app 2026-09-17, 1.70.0.0, PWA + desktop): (1) the Time Block Sections strategy is on, (2) the day view is grouped by time block (Group by → Group by time block section — set per device, not synced; help article 1950243), (3) the task is scheduled on the block's day (day ≤ that date) — an unscheduled task with the field set is stored but does not appear in Today at all. Without (2) no sections render and the field looks inert. The field is sufficient on its own: the block needs no label/category/smart list, and blocks from create_time_block behave like blocks created in the app. The block's own Smart Time Block mapping (label/category) is a second, independent route that catches matching tasks without this field. The section shows before the block's start time (after its end: untested). The field is not exposed in the app's task settings — the app sets it when a task is added directly inside a block section | |
| time_estimate_minutes | No | Time estimate in minutes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, openWorldHint=false, idempotentHint=false, destructiveHint=false, which is minimal. The description carries the full burden and does so richly: it discloses that shortcut parsing is disabled (X-Auto-Complete: false), that startDate/endDate are ignored by /addTask, that clock time must be set in the app, that strategy-dependent fields are stored even when disabled, and that parent_id is not validated (orphan risk). This is exactly the kind of behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place: the quick-add warning, the startDate/endDate limitation, the clock-time explanation, and the strategy-field note are all non-obvious facts that prevent real errors. It is front-loaded with the core purpose and the most important caveat (shortcut parsing disabled) before the deeper notes. Slightly dense, but justified for a 19-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter creation tool with no meaningful annotations, the description covers the critical gaps: what the server ignores, what the app requires, what is stored but hidden, and what can corrupt data. The output schema exists, so return values need no explanation. The only minor omission is pagination or rate-limit behavior, but that is not essential for a single create call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter guidance: it tells the agent to use parent_id, day, priority, time_estimate_minutes, label_ids instead of quick-add syntax, and it explains the relationship between backburner and day (scheduling trumps the flag). It also warns against combining is_reward with reward_points. This goes beyond the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Create a task') and immediately enumerates the key fields (category, day, priority, labels, estimate, sections), which distinguishes it from sibling tools like update_task, create_event, and create_category_or_project. It also clarifies what the tool is NOT for (startDate/endDate, clock time), which sharpens the boundary further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: prefer priority/frog over dates where possible, use parameters instead of quick-add syntax, and set startDate/endDate with update_task after creation. It also names the alternative tool (update_task) and explains the MCP limitation around clock times, so an agent knows exactly when to route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_time_blockA
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date YYYY-MM-DD | |
| title | Yes | Block name, e.g. 'Morning' | |
| start_time | Yes | Start time HH:mm (local time) | |
| duration_minutes | Yes | Length in minutes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish that this is a non-read, non-idempotent, non-destructive operation. The description goes far beyond that: it discloses the internal mechanism (/doc/create with db='PlannerItems'), the Full Access Token requirement, the client-side id quirk caused by /doc/create not echoing the server id, and live-test evidence (accepted, listed in /todayTimeBlocks, renders correctly). This is exactly the kind of hidden behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the experimental caveat appears immediately after. The trailing verification details are thorough but somewhat verbose, repeating the date twice and including minor specifics (app 1.70.0.0, PWA + desktop) that could be trimmed without losing the trust-calibration value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that is a workaround with no official endpoint, the description is unusually complete: it explains the mechanism, auth requirement, id-handling behavior, downstream usage in task creation, and verification steps. Combined with the existing output schema and full param schema, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all four parameters (title, date, start_time, duration_minutes) already documented with formats and examples. The description adds no per-parameter detail beyond the schema, which is acceptable since the schema carries the burden. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Create a time block (experimental) and get its id back.' It distinguishes this creation tool from its sibling get_today_time_blocks by making the outcome (returning the id) explicit, and frames how the id feeds into create_task/update_task, locating it in the tool family without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow context: the returned time_block_id can be used directly as time_block_section in create_task/update_task, avoiding an extra get_today_time_blocks call. It also warns that the endpoint is experimental and that the agent should verify the block in the app. It stops short of explicitly naming alternatives or stating when not to use it, so it misses the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_reminderADestructiveIdempotent
Delete one or more server-side reminders. Note: for a reminder that belongs to a task (set in the app), only the server-side entry is removed — the task document's reminder fields are not cleared, so the app may show it as active and recreate it. Prefer using this against standalone reminders (type 'M') or to clean up orphaned entries from get_reminders.
| Name | Required | Description | Default |
|---|---|---|---|
| reminder_ids | Yes | IDs of reminders to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and idempotent, but the description adds critical non-obvious behavior: for task-owned reminders, only the server-side entry is removed and the task document's reminder fields remain, so the app may recreate it. This goes well beyond the annotations and clarifies exactly what is and isn't destroyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two efficient sentences: the main action is front-loaded, and the essential caveat follows immediately. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete tool with an output schema and annotations covering destructiveness and idempotency, the description is fully complete. It covers the main use case, the edge case with task reminders, and how orphaned entries relate to get_reminders.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context about which reminder IDs are valid targets (standalone 'M' reminders versus task-linked reminders), though it doesn't add format or syntax details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Delete one or more server-side reminders.' It also distinguishes itself from sibling tools like set_reminder and get_reminders by clarifying the scope (server-side entries) and target type (standalone 'M' reminders).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use the tool: prefer against standalone reminders (type 'M') or orphaned entries from get_reminders. It also warns against relying on it for task-linked reminders, since the app may recreate them—giving clear selection criteria and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskADestructiveIdempotent
Delete a task permanently, with no trash and no undo. Delete a task/document PERMANENTLY via /doc/delete (Full Access Token). Marvin's trash is client-side — an API deletion bypasses it and CANNOT be undone (deleting in the app instead puts the item in the trash, where it can be restored — prefer the app when undo matters). Only use when the user explicitly wants a deletion. Never delete the generator document of a recurring task here (risk of the whole series disappearing without the app's cleanup logic) — remove the recurrence in the Marvin app instead. THE APP'S VIEW (live-tested 2026-09-12, PWA + Windows desktop app 1.70.0): an API deletion is NOT rendered in an open Marvin client — neither waiting nor switching views helps. First confirm the server with get_children on the parent (the task should be missing), then ask the user to reload the client BEFORE the row is touched in the app: F5 in the web app/PWA, restart of the desktop app. Editing the stale row in the app can RECREATE the document via the client's conflict resolution (observed once, 2026-09-12, in one of the two clients — which one is not recorded: row still shown after the deletion, unscheduled with the x button in the app, document back on a new _rev 84-97 s after the deletion; reported upstream). If the user has the app open: suggest deleting IN THE APP first (goes to the trash, no conflict with the app's own copy); API deletion when the user explicitly wants it, and then with the reload rule above.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | ID of the document to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and non-read-only behavior, but the description adds substantial behavioral context beyond them: API deletion bypasses client-side trash, open clients do not reflect the deletion, stale rows can be recreated by the app, and server-side verification via get_children plus client reload is required. This is far more than the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and highly detailed, but the length is largely justified by the destructive, irreversible nature of the operation and the complex client-sync risks. Key warnings are front-loaded in the first lines, though some later evidence-like details (e.g., exact _rev timestamps, 'reported upstream') could be trimmed without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers authentication token requirements, when not to use the tool, post-deletion verification steps, client reload instructions, and risks of stale client state. Given the destructive and irreversible nature, it is exceptionally complete for an agent to invoke safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes item_id as 'ID of the document to delete' with 100% coverage. The description reinforces that the item is a task/document but does not add any new parameter-specific semantics beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific operation: permanently deleting a task/document via the /doc/delete endpoint, with explicit emphasis on no trash and no undo. It also distinguishes this from in-app deletion, which sends items to trash, and from removing a recurring task's generator document, which should be handled in the app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: use only when the user explicitly wants deletion, prefer in-app deletion when undo matters or the app is open, and never use for recurring task generator documents. It names concrete alternatives and the conditions for choosing them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_infoARead-only
Get account info (/me): email, tracking status and points balance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the endpoint and return fields but provides little additional behavioral context such as authentication requirements or any caveats about tracking status. It is non-contradictory and adequate, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence communicates the essential purpose, endpoint, and returned fields with no wasted words. It is concise without sacrificing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only endpoint with an output schema and annotations already present, the description is complete. An agent has enough information to select and invoke the tool correctly, and the output schema covers return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description has no parameter semantics to explain. Per the baseline for parameterless tools, a 4 is appropriate; the description adds useful detail about what data the response contains, which is helpful context beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a clear verb+resource ('Get account info'), identifies the exact endpoint (/me), and enumerates the specific payload fields (email, tracking status, points balance). This makes the tool's purpose unambiguous and distinguishes it from the many sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied by the resource and fields, but the description does not explicitly state when to prefer this tool over alternatives, nor does it mention any exclusions. No alternative tool serves the same purpose, so the lack is not severe, but no direct usage guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_categoriesARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, and the description adds useful behavioral context: it returns the entire hierarchy, uses parentId='root' for the top level, and is meant for locating parent IDs. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat repetitive: 'Get all categories and projects' appears twice in nearly identical form. It could be condensed into one clear sentence plus the usage note. Still, the key information is front-loaded and the usage hint adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema present, the description is complete. It explains the hierarchy, the root convention, and the intended use, so an agent has enough to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description does not need to explain parameter semantics and correctly focuses on the return structure and usage purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (all categories and projects) and the operation (get as hierarchy with id and parentId). It is unambiguous and distinct from sibling tools like get_children or get_labels, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states a concrete use case: 'Use to find the right parent_id when creating/moving.' It gives clear context for when to call the tool, though it does not specify when not to use it or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_childrenARead-only
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 | Required | Description | Default |
|---|---|---|---|
| parent_id | Yes | Category/project ID, 'unassigned' for the Inbox, or 'root' for the top level |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses detailed behavior: direct-children-only semantics, orphan exclusion under 'unassigned', and the FIX_CYCLES() repair path. This adds valuable context not available in annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy due to the orphan note and live-tested date, but every sentence adds necessary operational detail. It is front-loaded with the main purpose and then expands on limitations, making it well-structured though not maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema, the description fully covers behavior, limitations, and troubleshooting. An agent is equipped to call it correctly without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides complete parameter documentation (100% coverage) including valid values like 'unassigned' and 'root'. The description does not add new meaning to the parameter beyond what the schema states, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves open tasks and subprojects within a specific category or project, using a specific verb and resource. It also distinguishes itself by noting it returns direct children only, and mentions the orphan caveat, which sets it apart from sibling tools like get_today_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: call again for deeper levels, and for orphans, use get_today_items/get_due_items instead. This directly tells an agent when to use this tool and when to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_done_itemsARead-only
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 | Required | Description | Default |
|---|---|---|---|
| date | No | Date YYYY-MM-DD on which tasks were completed (configured timezone); omit for today | |
| lookback_days | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
This description goes far beyond the basic readOnly hint, disclosing that it relies on an undocumented endpoint that may disappear, that lookback is needed due to day vs. doneAt filtering, that results are cached for 30 minutes, and that incomplete results are flagged with covers_from and days_missing. It also explains cache interactions with mark_done, delete_task, and unmark_done, plus performance costs. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence adds critical operational detail. Minor redundancy exists in the opening two sentences both stating the 'completed on a given date' conceptaine, but overall the structure is logical: core purpose, endpoint caveat, caching behavior, exclusions, and cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is exceptionally complete. It covers source endpoint risk, date filtering semantics, caching, error handling with incomplete flags, excluded cases, sorting, and cost estimation. The presence of an output schema further reduces the need to explain return values, and the description covers everything an agent needs to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already documents both parameters, the description adds substantial meaning: it explains why lookback_days exists, that each day corresponds to one read call (~3.1s), and clarifies timezone interpretation. This elevates the semantics well beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get tasks completed on a given date', which clearly identifies the tool's function. It further distinguishes itself with details like 'regardless of priority and deadline' and coverage disclaimers ('Tasks only — completed projects are not listed'), making it distinct from sibling list tools such as get_today_items and get_due_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance on what the tool covers and its limitations, but it never explicitly names alternative sibling tools or states conditions for choosing this tool over them. The 'Not covered' section implies exclusions, but the absence of direct alternative routing keeps this at a minimum viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_due_itemsARead-only
Get open tasks and projects with a deadline today or earlier.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Deadline up to and including YYYY-MM-DD; omit for today |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only safety profile is covered. The description adds useful selection semantics (open items, deadline today or earlier), but it does not disclose additional behavioral traits such as ordering, pagination, or authentication requirements. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to the meaning, and the core operation, resource, and constraint are immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with one optional parameter, an output schema, and full schema description coverage, the description is complete enough. An agent can determine what to call, what the parameter means, and what to expect in terms of safety without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single optional 'by' parameter is fully documented as an inclusive YYYY-MM-DD deadline, with omission meaning today. The description essentially restates this deadline concept without adding new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Get') and resource ('open tasks and projects') with a precise deadline condition ('today or earlier'). It clearly conveys what the tool returns, though it does not explicitly differentiate itself from the similarly named sibling get_today_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended usage is implied by the description: retrieve tasks/projects that are open and due by today or an earlier date. However, it provides no explicit when-to-use guidance, exclusions, or mention of alternatives such as get_today_items or get_done_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goalsARead-only
Get all goals with status and check-in data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is established by structured data. The description adds that the result includes status and check-in data, but does not disclose additional behavioral details such as pagination, rate limits, or whether archived goals are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no redundant wording. Every phrase earns its place by naming the resource, scope, and included data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter schema, read-only annotation, and presence of an output schema, the description is sufficiently complete. It tells the agent what the tool does and what data to expect, while the output schema covers return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty, so there are no parameters to document; the baseline for zero parameters is 4. The description still adds useful scope by clarifying that the tool returns all goals rather than a filtered subset.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and clearly identifies the resource ('all goals') plus the included data ('status and check-in data'). This distinguishes it from sibling tools that operate on tasks, habits, or time blocks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Get all goals' implies this tool should be used when the complete set of goals is needed, and there is no parameter-driven filtering. However, it does not explicitly name alternatives or state when not to use this tool, leaving usage boundaries to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_habitARead-only
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 | Required | Description | Default |
|---|---|---|---|
| habit_id | Yes | Habit ID (from list_habits) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful context: the response is the 'source of truth for recordings' and omits title/settings. This helps the agent set expectations beyond the schema without contradicting the read-only hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the core purpose comes first, followed by the key limitation and pointer to the sibling tool. Every line earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with an output schema and one relevant sibling, this description is complete. It names the source parameter, clarifies the record scope, and warns about missing fields, covering everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter habit_id is already described as 'Habit ID (from list_habits)'. The description adds little beyond the schema, mentioning habitId but no new format or constraints, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Get a habit's server tracking record with its full history') and explicitly differentiates it from list_habits by noting the response lacks title and settings. An agent can confidently identify this as the single-habit full-history retrieval tool among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states this is for a single habit and points to list_habits as the source for title/settings, giving useful routing context. It does not explicitly enumerate when not to use it, but the alternative is named and the scope is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_kudosARead-only
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, so the read-only nature is already known. The description adds value by clarifying that kudos is not the same as reward points and by disclosing the known limitation that nextMultiplier is not present in this endpoint (referencing a specific issue). This provides behavioral context beyond what annotations convey, though it doesn't elaborate on return format (covered by output schema) or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long and front-loaded with the core purpose. The first sentence states exactly what the tool does; the second clarifies a critical distinction and a limitation. Every word earns its place, with no redundancy or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, read-only, output schema present), the description covers all essential aspects: what it returns, how it differs from related tools, and a known limitation. An agent can correctly decide to call this tool and interpret its result without needing additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially fully documented. The description goes beyond the schema by enumerating the returned fields (kudos, level, kudosRemaining) and explicitly noting that nextMultiplier is absent. This adds semantic clarity for an agent, even though no parameters exist to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves kudos, level, and kudosRemaining from Marvin's XP system. It explicitly distinguishes kudos from reward points and points to get_account_info for the point balance, making the tool's purpose unambiguous and differentiating it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: kudos is separate from reward points, and the point balance is found in get_account_info. This implicitly tells the agent when to use this tool (when kudos data is needed) versus get_account_info (for points). It also notes that nextMultiplier is not available here, which is a usage caveat. However, it does not explicitly name the alternative tool or state a definitive when-to-use/when-not-to-use rule, so it falls short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_labelsARead-only
Get all labels with ids, for label_ids and filtering.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds that it returns 'all' labels, implying full coverage, but does not discuss pagination, ordering, or result format. With the output schema present, this is minimally adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no filler. It front-loads the core action and resource, then adds a compact note on how the labels are used.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list operation with an output schema and supported by annotations, the description is sufficient. It names the resource, the returned data (ids), and the purpose (filtering), leaving no critical gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so the baseline is 4. The description adds no parameter semantics, but none are needed here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get all labels with ids', identifying the specific resource (labels) and the expected outcome (IDs for label_ids and filtering). This distinguishes it from sibling getters like get_goals and get_categories without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for label_ids and filtering' implies when this tool is useful, but there is no explicit when-to-use guidance or mention of alternatives. It relies on inference rather than direct instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rate_limit_statusARead-only
Show today's Marvin API calls against the 1440/day budget. Show how many Marvin API calls have been made today (budget 1440/day, shared by all tools).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=false. The description adds useful context about the 1440/day budget and that it is shared by all tools, which goes beyond the annotations and helps the agent understand the scope of the read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but contains redundancy: the second sentence essentially repeats the first, adding only 'shared by all tools' as new information. It could be condensed into one sentence without losing clarity, so it is not as crisp as it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an existing output schema and read-only annotations, the description adequately covers the purpose and key detail of the shared daily budget. It does not need to explain return values since the output schema exists, and there are no other complex aspects requiring elaboration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain parameter syntax or meaning. The schema description coverage is 100%, and with no params, the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool shows today's Marvin API calls against the 1440/day budget. It identifies a specific resource and verb, and it is distinct from all sibling tools, as no other tool covers rate limit status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for checking current API usage against a shared daily budget, but it does not explicitly state when to use it or mention alternatives. There are no direct exclusions, but the guidance is only implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_remindersARead-only
Get all server-side reminders, push notifications to the phone. Requires the Full Access Token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses an additional side effect—pushing notifications to the phone—and states the authorization requirement. This adds useful behavioral context, though the punctuation leaves some ambiguity about whether the push is part of the tool's behavior or a separate instruction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the main action, but the comma splice in 'Get all server-side reminders, push notifications to the phone' creates confusion. A simple conjunction or rewording would make it fully clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema and a read-only annotation, the description covers the key extras: the all-reminders scope, the notification behavior, and the Full Access Token requirement. It is adequate, though the wording could be cleaner.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is complete, so the baseline of 4 applies. There is no parameter detail for the description to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a clear verb and resource: 'Get all server-side reminders.' The 'push notifications to the phone' clause slightly muddies the core purpose, and it does not explicitly differentiate from siblings like get_due_items, but the primary action is still unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as get_due_items or set_reminder. The mention of 'Requires the Full Access Token' is an authentication prerequisite, not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_tracksBRead-only
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 | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | Up to 100 task IDs |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only and non-open-world behavior, so the description does not need to restate those. It adds the 'source of truth' characterization and the 100-task cap, but does not disclose pagination, ordering, or what historical data is included beyond what the schema and output schema likely convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description contains two sentences that repeat nearly the same information. The second sentence adds only 'source of truth' and the max-100 constraint, which is already implied in the first sentence, so the extra sentence does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool with an output schema, the description covers the essential information: what is fetched and the call limit. The remaining context is adequately supplied by the annotations and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single task_ids parameter is documented as 'Up to 100 task IDs.' The description repeats that limit ('max 100 per call') without adding examples, batching advice, or additional parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get time-tracking history' for up to 100 tasks. It is clear enough to identify the tool's purpose, though it does not explicitly distinguish it from related siblings like get_tracked_item or get_today_time_blocks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as get_tracked_item, get_today_time_blocks, or start_tracking. The phrase 'source of truth' hints at authority, but there are no explicit conditions, exclusions, or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_today_itemsARead-only
Get open tasks and projects scheduled today or earlier.
Get open tasks/projects with day <= the date (default today in
MARVIN_TIMEZONE, or the system's local timezone when unset) — i.e.
also items scheduled earlier than the date, not only those on exactly
that day. Tasks that only have a deadline are not included; fetch them
with get_due_items. Observed 2026-09-11 with rollover enabled in the
account; items with a clock time are untested.
Note: today's recurring tasks may be missing if the Marvin app hasn't
been running yet today (instances are generated by the client).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date YYYY-MM-DD; returns everything open with day <= the date; omit for today (MARVIN_TIMEZONE, else the system timezone) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true and openWorldHint=false, the description adds substantial behavioral context: items earlier than the date are included, deadline-only tasks are excluded, timezone behavior is specified, recurring-task generation caveats are disclosed, and known testing limitations are noted. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first sentence, with clarifying edge cases and caveats following. It is slightly verbose with dated observations and testing notes, but those notes are informative and not redundant fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with one optional parameter and an output schema, the description is highly complete: it covers timezone resolution, scheduling semantics, exclusions, known recurring-task behavior, and testing caveats. Nothing essential is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the only parameter with full coverage, including its format, default behavior, and day <= date semantics. The description restates these details rather than adding new parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get open tasks and projects scheduled today or earlier.' It clearly distinguishes this tool from get_due_items by stating that deadline-only tasks are excluded and belong to that sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent exactly what this tool is for and when not to use it: tasks with only a deadline are not included and should be fetched with get_due_items. It also describes the date-filtering behavior precisely (day <= date), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_today_time_blocksARead-only
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 | Required | Description | Default |
|---|---|---|---|
| date | No | Date YYYY-MM-DD; omit for today (server timezone) | |
| include_category_mapping | No | Also look up the block→category/smartlist mapping (1 extra API call, requires Full Access Token) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses a real limitation (MarvinAPI issue #65) and explains the workaround: the mapping is fetched separately from plannerSmartLists using a normalized block title. This is exactly the non-obvious behavior an agent needs to interpret the response and the extra API call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and followed by a focused limitation note. Every clause contributes either a use case or behavioral context; there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the readOnly annotation, an existing output schema, and full parameter coverage in the schema, the description covers the tool's main behavioral quirk and mapping semantics. It does not explicitly position the tool against similar siblings such as get_time_tracks, leaving a minor selection gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters at 100% coverage, so the baseline is 3. The description adds meaning by explaining why include_category_mapping exists and how the mapping key works (normalized block title), which goes beyond the schema's terse '1 extra API call' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Get today's time blocks with their category or smart-list mapping." This clearly states what is returned and differentiates the tool from siblings like get_time_tracks by emphasizing the category/smart-list enrichment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The described use case is clear: call this when you need time blocks and their category/smart-list mapping for today (or any date via the date parameter). It does not name alternative tools or state explicit when-not-to-use conditions, so it stops one step short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tracked_itemARead-only
Show which task is being time-tracked right now.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation and adds useful context by specifying that the tool reports the in-progress tracked item rather than historical records. It doesn't contradict annotations, and while it doesn't detail null-return behavior or edge cases, the read-only annotation plus clear present-state wording provide sufficient safety context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence carries full meaning without redundancy. The essential information — current time-tracked task — is delivered immediately, and there is no filler or repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only query tool with an output schema and clear annotations, the description is complete. It tells the agent exactly what the tool returns conceptually, and the output schema handles return-value details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to add beyond the schema. The baseline of 4 applies here because no parameter documentation is needed, and the description accurately conveys what operation will be performed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and names the exact resource: which task is currently being time-tracked. This clearly distinguishes it from sibling tools like start_tracking, stop_tracking, and get_time_tracks, which concern tracking actions or historical time-track data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case by saying 'right now', indicating this tool reports the current tracking state. However, it does not explicitly state when to prefer this over get_time_tracks or how it relates to start_tracking/stop_tracking, leaving the agent to infer the appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capabilitiesARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds a key behavioral detail: 'Costs no Marvin API call.' This is beyond what annotations provide and informs the agent about resource usage. Does not contradict annotations. Slightly stronger than baseline because it discloses a practical cost aspect, though no further behavioral details are needed given the simple read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no fluff. The primary purpose is front-loaded in the first sentence, usage guidance follows, and the caveat about other tools is concise. Every sentence earns its place and the description is highly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and an output schema exists, the description covers all essential aspects: what it lists, when to use it, its cost (free), and a pointer to per-tool details. Nothing an agent needs to decide to invoke it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has zero parameters, so schema coverage is trivially 100%. Baseline is 4 for no parameters. The description doesn't need to explain parameters; it does clarify the output nature ('every Marvin tool by area'), which adds value beyond the empty schema. No gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('every Marvin tool by area') plus content details ('what it can and cannot do'). Clearly distinguishes itself from all sibling tools, which are operational tools, not a meta-listing tool. No ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to call it: 'Call it before assuming something is impossible via MCP or requires manual work in the app.' Also gives a caveat that detailed live conditions are in each tool's own description, guiding the agent to consult the appropriate tool for specifics. Provides clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_habitsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, so the read-only nature is established. The description adds value beyond that by disclosing the auth requirement (Full Access Token) and the behavioral trap of the non-raw endpoint. It doesn't describe the response shape, but the output schema exists to cover that, and no contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences are redundant — 'Get all habits with title, settings and history' and 'Get all habits as full documents incl. title, settings and history' repeat the same content before adding the format detail. The crucial warning is well-placed at the end, but the opening duplication wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema, the description is nearly complete: it covers the auth prerequisite and the critical pitfall distinguishing it from the non-raw endpoint. The only minor omission is an explicit statement of returned fields beyond the history array, but the output schema carries that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and the schema is trivially 100% covered. The description compensates by clarifying the return format of the history field ([time1, value1, time2, value2, ...] in unix ms), which informs an agent what to expect without any params to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action ('Get all habits') and explicitly enumerates the returned contents (title, settings, history with time/value pairs). The resource and scope are unambiguous, and it separates a bulk listing from the singular get_habit in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit, live-verified guidance: this tool requires the Full Access Token (raw variant of /habits) and explicitly warns that the non-raw variant is wrong here, explaining why (lazy tracking registry, missing never-recorded habits, no titles). That directly tells an agent when and how this tool must be invoked versus its alternate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_doneAIdempotent
Mark a task as done; projects are completed in the app.
Mark a task as done (via /markDone, with the correct timezone offset).
Tasks ONLY: for projects the API responds 400 'Can only mark Tasks done
with this API' (verified live 2026-08-19) — projects are completed in the
Marvin app (done=true via /doc/update would technically work but skips
the app's side effects). Safe for generated instances of recurring tasks
too (verified live): the instance ID is deterministic
('YYYY-MM-DD_'), so no duplicates can occur.
Error codes (live-tested 2026-08-29): 404 = the task does not exist
(deleted/wrong ID — unlike /doc/update, which responds 500);
400 = already marked done (harmless, nothing changes). Stops running
time tracking on the task and writes the tracking interval to
task.times (receipt also in /tracks; live-tested 2026-09-02 in two
runs — on 2026-08-29 times was NOT written, the server behavior has
changed; a direct /track STOP still does not write times, see
stop_tracking). Pinned task: the original stays open and
pinned as documented; the completed copy gets its own ID and can be
found via get_done_items. Leaves day untouched; the app sets day =
today only on unscheduled and future-dated tasks, a past day is kept
there too (app code, 2026-08-30). Completed tasks can be read back with
/doc (by ID) and listed with get_done_items.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | Task ID (NOT a project — see description) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing exact error semantics (404 vs 400), idempotent behavior, time-tracking side effects, pinned-task behavior, and `day`-field handling. It even notes server-behavior changes over time. This is rich behavioral context that the annotations alone could not provide, and it does not contradict the idempotentHint=true or destructiveHint=false annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and mostly valuable, but it opens with two overlapping sentences ('Mark a task as done; projects are completed in the app.' followed by 'Mark a task as done (via /markDone...)'). Several live-testing dates and caveats could be consolidated. Still, the length is largely justified by the many behavioral edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with one parameter, an output schema, and idempotence annotations, the description covers all decision-relevant context: supported vs unsupported resources, error codes, side effects on time tracking, recurring tasks, pinned tasks, and how to read back completed tasks. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes item_id as 'Task ID (NOT a project — see description)', and the description reinforces this with details about deterministic recurring-task instance IDs and the distinction from project IDs. Though schema coverage is 100%, the description adds useful value about what kind of ID is valid and how recurring instances are formed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Mark a task as done') and resource (tasks), and explicitly distinguishes from projects ('Tasks ONLY: for projects the API responds 400'). It also differentiates from related tools like /doc/update and unmark-related behavior. This leaves no ambiguity about the tool's core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance and names alternatives: projects should be completed in the Marvin app, /doc/update would technically work but skips side effects, and get_done_items should be used for listing completed tasks. It also covers edge cases like recurring-task instances and error conditions, so an agent can decide when to invoke this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_habitA
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 | Required | Description | Default |
|---|---|---|---|
| undo | No | True to undo the latest recording instead | |
| value | No | Value to record (1 for boolean habits) | |
| habit_id | Yes | Habit ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a mutating, non-idempotent operation. The description adds a useful side effect: it updates the sync database (updateDB=true) so the Marvin app shows the change immediately. This is beyond the structured hints, though the cryptic 'updateDB=true' parenthetical introduces a name not present in the input schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the primary action front-loaded and no filler. The second sentence earns its place by disclosing the sync side effect, though the parenthetical updateDB=true is unnecessarily cryptic and could be simplified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple tool with full schema coverage and an output schema, so the description does not need to restate return values. It covers the action and the key side effect, leaving only the when-to-choose guidance under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without description-level parameter detail. The description does not add meaning to habit_id, undo, or value; its only parameter-adjacent mention, updateDB=true, is not an actual input parameter and could confuse rather than clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Record or undo a habit check-in.' This clearly identifies the operation and distinguishes it from task-focused siblings like mark_done or unmark_done. However, it does not explicitly contrast itself with sibling tools, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives such as list_habits/get_habit for reading habits or mark_done/unmark_done for tasks. The 'undo' option hints at one usage scenario, but there is no when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_reward_pointsADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses exactly what happens: the entire earn/spend history is deleted and balance is set to 0, and this is permanent. It also adds the auth context (Full Access Token) and goes beyond the destructiveHint/idempotentHint annotations by spelling out the concrete consequence, so an agent can anticipate the irreversible side effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the key consequence (permanently deletes history, sets balance to 0) front-loaded. There's minor redundancy in repeating 'permanently' at the start and in the second sentence, but the warning is important enough that the emphasis is acceptable and no extraneous detail is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter destructive operation with a provided output schema, the description fully covers the operational effect, irreversibility, authorization requirement, and appropriate invocation condition. Nothing relevant to a safe call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the schema covers this completely, so no parameter-level explanation is needed. The baseline for a no-parameter tool is 4, and the description appropriately focuses on the operation's effect rather than input details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation (reset reward points) and precisely defines the scope: deletes the whole earn/spend history and sets balance to 0. This clearly differentiates it from sibling reward tools like claim_reward_points, unclaim_reward_points, and spend_reward_points, which affect only parts of the reward balance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear condition: only use when the user explicitly asks for a reset, and warns it cannot be undone. It doesn't explicitly contrast with sibling reward operations (e.g., use spend_reward_points for a normal deduction), but the irreversibility warning and explicit-request condition are strong enough routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_priorityAIdempotent
Set priority (P1-P3 or low) or the frog marker on a task. Set or change priority (isStarred) and/or the frog marker on an existing TASK. Requires the Full Access Token. The app's four levels are stored as isStarred 3/2/1/-1 (Most/Very/Important/Low priority; -1 verified against the app's code and live-tested 2026-08-30). Low priority is shown in the app only with 'Enable low priority' on in the Priorities strategy; the value is stored regardless. Does not apply to projects: they use the string field priority ('high'/'mid'/'low' = Most/Very/Important; no Low level), not isStarred — set it via update_category_or_project. A permanent 500 = the task does not exist (deleted or wrong ID) — the server responds 500 instead of 404 (verified live 2026-08-29); fetch a fresh ID.
| Name | Required | Description | Default |
|---|---|---|---|
| frog | No | Frog: 3=monster, 2=baby, 1=normal, 0=remove | |
| item_id | Yes | Task ID | |
| priority | No | Priority (isStarred): 3=Most important/red, 2=Very important/orange, 1=Important/yellow, -1=Low priority (down arrow), 0=remove |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds substantial behavioral context beyond annotations: the isStarred mapping (3/2/1/-1) verified against app code, the 'Enable low priority' strategy caveat, the fact that low priority is stored regardless of display, the project-vs-task distinction, and the non-standard 500 error behavior. This is rich, verified behavioral disclosure that goes well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it covers scope, authentication, value semantics, project exclusion, and error behavior. It is front-loaded with the core action and resource. Slightly long, but the length is justified by the verified behavioral details that prevent misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two optional markers, a non-obvious isStarred encoding, a project-vs-task distinction, and a non-standard error code), the description is complete. It covers what the tool does, when to use it, what the values mean, what doesn't apply, and how to interpret failures. The output schema exists, so return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters with their value mappings. The description adds value by explaining the semantic meaning of the priority levels in app terms (Most/Very/Important/Low), the frog marker concept, and the low-priority display caveat. It doesn't repeat the schema's numeric ranges but enriches the meaning, which is exactly what the description should do.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set'), a specific resource ('priority (P1-P3 or low) or the frog marker on a task'), and explicitly distinguishes from projects ('Does not apply to projects... set it via update_category_or_project'). It clearly identifies the target as an existing TASK and names the sibling tool for the alternative case, so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it applies to tasks, not projects, and names the alternative tool (update_category_or_project) for projects. It also discloses the prerequisite (Full Access Token) and the error condition (permanent 500 = task does not exist), which helps the agent decide when to call this tool and when to fetch a fresh ID instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_reminderA
Set a standalone push reminder to the phone. Times on tasks are set in the app, not here. Set a standalone push reminder (type 'M', requires the Marvin mobile app to be logged in). WARNING — data integrity: a task reminder in Marvin consists of TWO writes that only the app keeps in sync — reminder fields on the task document itself (taskTime, reminderTime, reminderOffset, snooze, autoSnooze) AND a server-side entry via /reminder/set. This tool only writes the server-side entry. Setting reminder_id to a task ID therefore does NOT link the reminder to the task in the app's UI, and risks an orphaned/inconsistent server-side entry (only visible through get_reminders). Task-linked reminders are set in the Marvin app; use this tool for standalone reminders only. Facts about time on tasks (live data 2026-09-02): the Time field in the app (taskTime) is a clock time that — with auto-created reminders enabled in the user's settings — automatically becomes a reminder at the same time (reminderTime = the clock time, offset 0); Time and reminder are in practice the same thing there. That this MCP does not set times on tasks is therefore an MCP limitation, never a Marvin limitation.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Text shown in the notification (max 200 chars) | |
| reminder_id | No | Custom ID; randomized otherwise. Do NOT use a task ID here — see description. | |
| time_unix_seconds | Yes | Unix time (seconds) for the reminder |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations false, the description carries the full burden and delivers extensively: it discloses the two-write data integrity hazard, that this tool only writes the server-side entry, that setting reminder_id to a task ID will not link in the UI, and that it can create orphaned entries. It also adds MCP limitation context about task times, far exceeding a minimal schema description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose and repetitive: the standalone-reminder statement appears twice, and the 'Facts about time on tasks' section is tangential to invoking the tool. It is organized with a warning block, but several sentences could be trimmed without losing necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a write side effect and serious data-integrity caveats, the description covers prerequisites, exclusions, side effects, and failure modes (orphaned entries). Combined with a complete input schema and an output schema, an agent has everything it needs to call this correctly and avoid misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds critical semantics for reminder_id by explaining the two-write mechanism and why a task ID must not be used. It also clarifies the constraint that task times are not set here, which helps interpret time_unix_seconds. This exceeds the baseline for fully-covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific action — setting a standalone push reminder — and explicitly contrasts it with task-linked reminders, saying 'Task-linked reminders are set in the Marvin app; use this tool for standalone reminders only.' This clearly distinguishes it from sibling tools like create_task and delete_reminder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool (standalone push reminders only) and when not to (task-linked reminders). It also names the prerequisite that the Marvin mobile app must be logged in and warns against using a task ID as reminder_id. This is explicit routing guidance relative to the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spend_reward_pointsA
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 | Required | Description | Default |
|---|---|---|---|
| date | No | Date YYYY-MM-DD; omit for today (server timezone) | |
| points | Yes | Number of points to spend |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a verified failure mode: the API returns 500 if the balance would go negative, and it directs the agent to get_account_info first. This is valuable behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry the entire definition with no filler. The core action is front-loaded, and the critical warning is placed immediately after, making the description easy to scan and parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is nearly complete for invocation: the schema fully documents parameters, an output schema exists, and the description supplies the most important operational caveat. The only mild gap is that 'a reward' is not explicitly defined or parameterized, but this does not block correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters with 100% coverage, so the description adds little parameter-level meaning. The phrase 'large purchases' vaguely relates to the points amount, but it does not clarify format, constraints, or semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: spending reward points on a reward. It uses a specific verb and resource, making the tool's purpose unambiguous, and the phrase 'on a reward' helps distinguish it from related point-management operations. It does not explicitly name a sibling tool for contrast, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit precondition: check the balance via get_account_info before large purchases to avoid the 500 error. This is clear, actionable usage guidance. It does not, however, discuss when not to use this tool or when an alternative should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_trackingBIdempotent
Start time tracking on a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Task ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, but the description adds no behavioral context beyond the action itself. It does not disclose side effects (e.g., whether it creates a new time track or overwrites an existing one) or requirements like authentication. The idempotency hint is useful, but the description does not elaborate on it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. It is front-loaded with the action and resource, and no information is extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema and annotations covering safety, the description is minimally adequate. However, it does not provide workflow context (e.g., that it pairs with stop_tracking) or mention any preconditions. The existence of an output schema reduces the need for return-value explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with task_id described as 'Task ID', so the schema carries the meaning. The description does not add any additional context about the parameter, but the baseline of 3 applies since the schema is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'start time tracking' and the resource 'a task'. It distinguishes itself from the sibling 'stop_tracking' by describing the opposite operation. However, it lacks specificity about what 'time tracking' entails or what constitutes a task state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of conditions for starting tracking, prerequisites (e.g., task must exist), or exclusions. The description only states what it does, not when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_trackingAIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Task ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a significant behavioral quirk: task.times/duration fields are not updated, and tracking only appears in get_time_tracks/tracks. It also records the side-effect exception for mark_done, giving the agent accurate expectations about where data lands. This strongly exceeds what readOnlyHint, idempotentHint, and destructiveHint already convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and well organized, but the first two sentences repeat the same message almost verbatim: 'Stop time tracking on a task' and 'Stop time tracking for a task.' The API limitation note is valuable, but the duplication means not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, idempotent, non-destructive mutation with an output schema, the description covers the result location, a documented API limitation, and the mark_done exception. It does not need to explain return values because an output schema exists, and the idempotentHint covers repeated-call expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single task_id parameter is 100%, so the description does not need to compensate. It adds some context by referring to 'the task's own times/duration fields,' but it does not add parameter-level format or meaning beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop time tracking on a task.' It clearly differentiates from siblings by naming where the tracking lands, get_time_tracks, and by noting the opposite behavior of mark_done. The action could not be confused with start_tracking or reading tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is used: when time tracking on a task should be stopped. It also provides an important conditional exception involving mark_done, though it does not explicitly spell out 'use this instead of X' beyond the implied contrast with start_tracking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_connectionARead-only
Check that the API token works against Marvin's API. Returns OK if the apiToken works.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description adds meaningful behavioral context by specifying that a successful check returns OK if the API token works. This clarifies the tool's non-destructive auth-testing behavior beyond what annotations alone state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two short sentences, front-loading the core purpose ('Check that the API token works') and then specifying the success result. Every word contributes value, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only connectivity check with an output schema present, the description fully covers what an agent needs to invoke it correctly. The safety profile is captured by annotations, and return semantics are succinctly stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline of 4 applies. The description mentions apiToken conceptually, but since there is no schema to document, no parameter-level detail is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Check') with a clear resource ('API token' against Marvin's API) and states the expected result ('Returns OK if the apiToken works'). This clearly distinguishes the tool from sibling tools like get_account_info or get_rate_limit_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for verifying API token validity but provides no explicit guidance on when to choose it over alternatives. No sibling exclusions or conditions are given, so an agent must infer usage from the tool name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unclaim_reward_pointsAIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | No | Date YYYY-MM-DD; omit for today (server timezone) | |
| item_id | Yes | Task ID whose award should be undone (determines the point amount). 'MANUAL' is NOT supported — see description. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses that only real task IDs work, that manual awards have no server entry, that the endpoint responds 404 for manual awards, and that spend_reward_points is the correct compensation path. This adds valuable behavioral context not present in the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then provides use cases, limitations, and an alternative. There is slight redundancy between the opening sentence and the second sentence ('Undo a reward-point award' vs 'Undo a point award'), but the structure is otherwise tight and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool description covers purpose, trigger scenarios, constraints, error behavior, and alternative handling for manual awards. Since an output schema exists, not detailing return values is acceptable. The description is complete for correct invocation and handling of edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning to item_id by clarifying it is a task ID that determines the point amount and that MANUAL is not supported. This goes beyond the schema's basic description, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Undo a reward-point award tied to a task.' It clearly distinguishes itself from sibling tools like claim_reward_points and spend_reward_points by focusing on undoing awards and explicitly calling out the unsupported MANUAL case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete when-to-use scenarios ('after a misclick', 'when the task was un-completed with unmark_done') and an explicit when-not-to-use case (MANUAL awards) with the exact alternative (spend_reward_points for the same amount). This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmark_doneAIdempotent
Undo a task's completion. Undo a completion (sets done=false and clears doneAt via /doc/update). Requires the Full Access Token. Safe for generated instances of recurring tasks too (verified live). Note: any kudos from the completion are not adjusted; awarded reward points can however be undone with unclaim_reward_points. A permanent 500 = the document does not exist (deleted or wrong ID; the server responds 500 instead of 404, verified live 2026-08-29).
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | Task ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context: it requires the Full Access Token, works on generated instances of recurring tasks, does not adjust kudos, and documents the verified 500-on-missing-document behavior. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action, then adds necessary caveats. Each sentence earns its place, though the error-code detail is slightly verbose for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with an output schema and annotations covering idempotency and destructiveness, the description is nearly complete. It covers auth requirements, edge cases (recurring tasks, kudos), and error behavior. The only minor gap is not describing the success response shape, but the output schema likely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the only parameter, item_id, is already described as 'Task ID'. The description does not add further meaning to the parameter beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Undo' and the resource 'a task's completion', and specifies the exact effect (sets done=false and clears doneAt via /doc/update). It distinguishes itself from mark_done and unclaim_reward_points, so an agent can tell it apart from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly notes when to use it (to undo a completion) and names the alternative for undoing reward points (unclaim_reward_points). It also warns about the 500 error case for non-existent documents, giving clear context for when the tool may fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_category_or_projectAIdempotent
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) 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 | Required | Description | Default |
|---|---|---|---|
| day | No | Projects ONLY: schedule YYYY-MM-DD, 'today', or 'unassigned' to unschedule | |
| frog | No | Projects ONLY: frog 3=monster, 2=baby, 1=normal, 0=remove | |
| icon | No | 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 projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong) | |
| note | No | New note (replaces the existing one) | |
| color | No | Color '#rrggbb', '' removes | |
| orbit | No | Orbit strategy: True = put in orbit (verified in the app 2026-08-29 on tasks: Orbit view + icon in Today). UNDOCUMENTED field | |
| title | No | New title | |
| item_id | Yes | ID of the category/project (from get_categories) | |
| due_date | No | Projects ONLY: deadline YYYY-MM-DD, '' removes | |
| end_date | No | Soft deadline YYYY-MM-DD (Start & End Dates strategy), '' removes | |
| priority | No | 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. Projects use the string field priority, not isStarred (verified live 2026-08-29; mapping verified against the app's code 2026-08-30) | |
| label_ids | No | 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) | |
| parent_id | No | Move to parent category ID, or 'root' | |
| backburner | No | 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 | |
| start_date | No | Start date YYYY-MM-DD (Start & End Dates strategy), '' removes | |
| review_date | No | Review date YYYY-MM-DD (Review Date strategy), '' removes | |
| planned_week | No | 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) | |
| no_auto_orbit | No | Orbit strategy: True = exempt from automatic orbiting. UNDOCUMENTED field (bool type verified in live data 2026-08-29) | |
| planned_month | No | 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) | |
| first_scheduled | No | 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, neither server nor app — verified 2026-08-29). Otherwise leave alone | |
| time_estimate_minutes | No | Time estimate in minutes, 0 removes it. On projects: rendered as the project's OWN estimate, no aggregation with the children's (verified in the app 2026-08-29) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: it discloses a hidden pre-read API call when Projects-ONLY fields are supplied, explains that the tool refuses categories in that case, and gives a precise failure-mode distinction between transient 500s (retry) and permanent 500s (missing document). It also warns that completion via /doc/update skips app side effects. This is consistent with idempotentHint=true and not contradicted by any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-sentence summary and sibling routing, followed by well-separated operational warnings. It is longer than average, but the tool is complex and the extra length covers genuine behavioral hazards. It loses a point for some redundancy with schema details (repeated field lists and numerous verification dates) that could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 21-parameter tool with a rich input schema and an output schema, the description covers the non-obvious operational context: full-access-token requirement, category blocking logic, strategy-disabled behavior, completion side effects, and the 500-as-missing-ID failure mode. An agent has everything it needs to invoke this tool correctly and to interpret common failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value above the schema by grouping parameters into 'Projects ONLY' vs. shared fields, clarifying that label_ids applies to both categories and projects, and noting that strategy fields work even when the strategy is disabled. It does not need to enumerate every parameter because the schema already does that thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Update a category or project' and lists the editable fields (labels, color, icon, note, project fields). It explicitly distinguishes itself from the sibling tool: 'For tasks, use update_task.' An agent can determine what this tool does and what it does not do without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: tasks go to update_task, projects must not be completed here, and Projects-ONLY fields are blocked for categories. It also clarifies that strategy-dependent fields can be set even when the strategy is disabled, which prevents an agent from wrongly assuming a prerequisite. The 'existing CATEGORY or PROJECT' wording plus 'For tasks, use update_task' provides clear when-to-use and when-not-to-use signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskAIdempotent
Update a task: title, day, deadline, labels, note, estimate, sections. Update fields on an existing TASK via /doc/update (Full Access Token). For categories/projects, use update_category_or_project. For priority, use set_priority. Always complete tasks via mark_done, never here. Strategy-dependent fields (start/end date, planned_week/month, review_date, backburner, orbit, the sections) can be set even when the strategy is disabled in the app — they just are not shown in the UI then. A clock time (Time/taskTime) and the task's reminder fields are set in the APP, not here — an MCP limitation (double-write sync, see set_reminder), NOT a Marvin limitation: Marvin fully supports times on tasks. Note on recurring tasks: never edit recurrence rules here — neither on a generated instance (recurring=true, id 'YYYY-MM-DD') nor on the generator document. Do that editing in the Marvin app. Simple field changes (title, note) on a single instance are fine. Note: Marvin's server can sporadically respond 500 on /doc/update (transient and atomic — no partial write); 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 | Required | Description | Default |
|---|---|---|---|
| day | No | Schedule on YYYY-MM-DD, 'today', or 'unassigned' to unschedule | |
| note | No | New note (replaces the existing one) | |
| orbit | No | 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) | |
| title | No | New title | |
| item_id | Yes | Task ID | |
| due_date | No | Deadline YYYY-MM-DD, or '' to remove | |
| end_date | No | Soft deadline YYYY-MM-DD (Start & End Dates strategy), '' removes | |
| label_ids | No | New labels (IDs from get_labels; replaces existing ones, [] removes all) | |
| parent_id | No | 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) | |
| backburner | No | 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-29) | |
| start_date | No | 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='unassigned'; a scheduled task is not affected | |
| review_date | No | 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 | |
| planned_week | No | 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, but with Planning Ahead on (2026-08-29) the task stayed in the month view even after switching views — ask the user to reload the client (F5 in the web app/PWA, restart of the desktop app) before a missing render is taken for an error | |
| bonus_section | No | 'Essential' or 'Bonus' (bonusStructure strategy), '' removes | |
| daily_section | No | Day section 'Morning'/'Afternoon'/'Evening' (dailyStructure strategy), '' removes | |
| no_auto_orbit | No | 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) | |
| planned_month | No | Plan into a month: YYYY-MM (Planning Ahead strategy, verified in the app 2026-08-29), '' removes | |
| reward_points | No | 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 | |
| custom_section | No | ID of a custom section from strategySettings.customStructure, '' removes | |
| perma_snooze_time | No | Hide the task every day until HH:mm (permaSnoozeTime), '' removes. Verified in the app 2026-08-29 | |
| time_block_section | No | 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 time block (per device, not synced) and the task is scheduled on the block's day — see create_task | |
| snooze_until_unix_ms | No | 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' does not hold for the category view) | |
| time_estimate_minutes | No | Time estimate in minutes, 0 removes it |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations, disclosing the /doc/update write endpoint, Full Access Token requirement, MCP limitation around clock time/reminders, strategy-disabled fields still being settable, and the 500-vs-missing-ID server behavior. It also explains that a permanent 500 means a non-existent document. These are valuable behavioral traits not visible in the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is densely informational and every sentence adds decision-relevant context. It is front-loaded with the core purpose, then covers routing, limitations, recurring-task warnings, and error semantics in a logical order. For a complex 23-parameter mutation tool with many verified edge cases, this length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the rich schema, and the output schema, the description is complete: it covers auth, sibling routing, strategy interactions, recurring-task rules, and server error behavior. It does not need to explain return values because an output schema exists. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents all 23 parameters in detail. The tool description adds a high-level field list but does not need to repeat per-parameter semantics. The schema's parameter descriptions carry the load effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update a task: title, day, deadline, labels, note, estimate, sections,' a specific verb plus resource. It explicitly routes category/project updates, priority changes, and completion to sibling tools, distinguishing update_task from update_category_or_project, set_priority, and mark_done.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use alternatives: 'For categories/projects, use update_category_or_project. For priority, use set_priority. Always complete tasks via mark_done, never here.' It also gives strong do-not-use guidance for recurring-task recurrence rules, telling the agent to edit those in the app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.7.2- Changed
create_category_or_project1 field changed- changed
Input schema / properties / icon / descriptionPrevious value: -"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 projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"New value: +"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 projects only when Master List → Configure View → 'Show Custom Icon On' includes projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong)"
- Changed
update_category_or_project1 field changed- changed
Input schema / properties / icon / descriptionPrevious value: -"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"New value: +"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 projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong)"
5 tool updates
v1.7.1- Changed
create_category_or_project1 field changed- changed
Input schema / properties / icon / descriptionPrevious value: -"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. Categories ONLY — projects NEVER render their own icon (the flag stays; only the color is used)"New value: +"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 projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"
- Changed
create_task1 field changed- changed
Input schema / properties / time_block_section / descriptionPrevious value: -"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block). NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29, and re-verified 2026-09-13 with app 1.70.0.0, PWA + desktop, Time Blocking on). In the app the link is carried by the block's own mapping to a label/category/smart list (see get_today_time_blocks), and a block shows its tasks only during its own clock time — to make a task appear in a block, give the block a category in the app and put the task there. Reported upstream"New value: +"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 (verified in the app 2026-09-17, 1.70.0.0, PWA + desktop): (1) the Time Block Sections strategy is on, (2) the day view is grouped by time block (Group by → Group by time block section — set per device, not synced; help article 1950243), (3) the task is scheduled on the block's day (day ≤ that date) — an unscheduled task with the field set is stored but does not appear in Today at all. Without (2) no sections render and the field looks inert. The field is sufficient on its own: the block needs no label/category/smart list, and blocks from create_time_block behave like blocks created in the app. The block's own Smart Time Block mapping (label/category) is a second, independent route that catches matching tasks without this field. The section shows before the block's start time (after its end: untested). The field is not exposed in the app's task settings — the app sets it when a task is added directly inside a block section"
- Added
list_capabilities - Changed
update_category_or_project1 field changed- changed
Input schema / properties / icon / descriptionPrevious value: -"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. ONLY meaningful on categories — projects never render their own icon (verified in the app 2026-08-29)"New value: +"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"
- Changed
update_task1 field changed- changed
Input schema / properties / time_block_section / descriptionPrevious value: -"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block), '' removes. NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29 and 2026-09-13); in the app the link is carried by the block's own label/category/smart-list mapping — see create_task"New value: +"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 time block (per device, not synced) and the task is scheduled on the block's day — see create_task"
2 tool updates
v1.7.0- Changed
create_task1 field changed- changed
Input schema / properties / time_block_section / descriptionPrevious value: -"Time block ID (from get_today_time_blocks). NOTE: stored, but no visible section link renders in Today even with the Time Block Sections strategy active (verified in the app 2026-08-29) — visible section assignment is done in the app"New value: +"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block). NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29, and re-verified 2026-09-13 with app 1.70.0.0, PWA + desktop, Time Blocking on). In the app the link is carried by the block's own mapping to a label/category/smart list (see get_today_time_blocks), and a block shows its tasks only during its own clock time — to make a task appear in a block, give the block a category in the app and put the task there. Reported upstream"
- Changed
update_task1 field changed- changed
Input schema / properties / time_block_section / descriptionPrevious value: -"Time block ID (from get_today_time_blocks), '' removes. NOTE: stored, but no visible section link renders in Today even with the strategy active (verified in the app 2026-08-29)"New value: +"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block), '' removes. NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29 and 2026-09-13); in the app the link is carried by the block's own label/category/smart-list mapping — see create_task"
5 tool updates
v1.6.0- Changed
create_category_or_project3 fields changed- changed
Input schema / properties / day / descriptionPrevious value: -"Projects ONLY: schedule on YYYY-MM-DD or 'today' (categories cannot be scheduled)"New value: +"Projects ONLY: schedule on YYYY-MM-DD or 'today' (blocked for categories — a category is never completed)" - changed
Input schema / properties / due_date / descriptionPrevious value: -"Projects ONLY: deadline YYYY-MM-DD (categories have no dueDate)"New value: +"Projects ONLY: deadline YYYY-MM-DD (blocked for categories — a category is never completed)" - changed
Input schema / properties / label_ids / descriptionPrevious value: -"Projects ONLY: label IDs (from get_labels)"New value: +"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)"
- Changed
create_task1 field changed- changed
Input schema / properties / day / descriptionPrevious value: -"Schedule on date YYYY-MM-DD, or 'today'. Omit for unscheduled."New value: +"Schedule on date YYYY-MM-DD, 'today', or 'unassigned' (= unscheduled, same as omitting). Same rules as update_task."
- Changed
get_today_items1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Date YYYY-MM-DD; omit for today (server timezone)"New value: +"Date YYYY-MM-DD; returns everything open with day <= the date; omit for today (MARVIN_TIMEZONE, else the system timezone)"
- Changed
update_category_or_project3 fields changed- changed
Input schema / properties / label_ids / descriptionPrevious value: -"Projects ONLY: new labels (replaces existing ones, [] removes all)"New value: +"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)" - changed
Input schema / properties / planned_month / descriptionPrevious value: -"Plan into a month: YYYY-MM (Planning Ahead strategy), '' removes"New value: +"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)" - changed
Input schema / properties / planned_week / descriptionPrevious value: -"Plan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy), '' removes"New value: +"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)"
- Changed
update_task1 field changed- changed
Input schema / properties / planned_week / descriptionPrevious value: -"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 (client cache may linger until a view switch)"New value: +"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, but with Planning Ahead on (2026-08-29) the task stayed in the month view even after switching views — ask the user to reload the client (F5 in the web app/PWA, restart of the desktop app) before a missing render is taken for an error"
3 tool updates
v1.4.2- Changed
convert_category_or_project1 field changed- added
Input schema / properties / clear_project_fieldsAdded value: +{ + "default": false, + "description": "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 permanent conversion); the previous values are then returned in removed_project_fields. Default False = lossless, like the app's correct path", + "type": "boolean" +}
- Changed
create_task1 field changed- changed
Input schema / properties / parent_id / descriptionPrevious value: -"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 (live-tested 2026-08-29)"New value: +"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 (live-tested 2026-08-29); repaired by running FIX_CYCLES() in the app's console"
- Changed
update_task1 field changed- changed
Input schema / properties / parent_id / descriptionPrevious value: -"Move to category/project ID (not validated by the server — a wrong ID yields an orphan, live-tested 2026-08-29)"New value: +"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)"
6 tool updates
v1.4.0- Changed
create_category_or_project1 field changed- changed
Input schema / properties / priority / descriptionPrevious value: -"Projects ONLY: priority as a string — projects do not use isStarred (verified live 2026-08-29)"New value: +"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). Projects do not use isStarred (verified live 2026-08-29; mapping verified against the app's code 2026-08-30)"
- Changed
create_task3 fields changed- changed
Input schema / properties / parent_id / descriptionPrevious value: -"ID of the category/project the task belongs in (from get_categories). Omit for the Inbox."New value: +"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 (live-tested 2026-08-29)" - changed
Input schema / properties / priority / anyOfPrevious value: -[ - { - "maximum": 3, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 3, + "minimum": -1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority 1-3 (3=red/highest, 2=orange, 1=yellow)"New value: +"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 — the value is stored regardless). 0 is not valid here; omit for no priority"
- Added
get_done_items - Changed
set_priority2 fields changed- changed
Input schema / properties / priority / anyOfPrevious value: -[ - { - "maximum": 3, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 3, + "minimum": -1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority: 3=red/highest, 2=orange, 1=yellow, 0=remove"New value: +"Priority (isStarred): 3=Most important/red, 2=Very important/orange, 1=Important/yellow, -1=Low priority (down arrow), 0=remove"
- Changed
update_category_or_project1 field changed- changed
Input schema / properties / priority / descriptionPrevious value: -"Projects ONLY: priority 'high'/'mid'/'low', '' removes. Projects use the string field priority, not isStarred (verified live 2026-08-29)"New value: +"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. Projects use the string field priority, not isStarred (verified live 2026-08-29; mapping verified against the app's code 2026-08-30)"
- Changed
update_task1 field changed- changed
Input schema / properties / parent_id / descriptionPrevious value: -"Move to category/project ID"New value: +"Move to category/project ID (not validated by the server — a wrong ID yields an orphan, live-tested 2026-08-29)"
36 tool updates
v1.3.0- First observed
claim_reward_points - First observed
convert_category_or_project - First observed
create_category_or_project - First observed
create_event - First observed
create_task - First observed
create_time_block - First observed
delete_reminder - First observed
delete_task - First observed
get_account_info - First observed
get_categories - First observed
get_children - First observed
get_due_items - First observed
get_goals - First observed
get_habit - First observed
get_kudos - First observed
get_labels - First observed
get_rate_limit_status - First observed
get_reminders - First observed
get_time_tracks - First observed
get_today_items - First observed
get_today_time_blocks - First observed
get_tracked_item - First observed
list_habits - First observed
mark_done - First observed
record_habit - First observed
reset_reward_points - First observed
set_priority - First observed
set_reminder - First observed
spend_reward_points - First observed
start_tracking - First observed
stop_tracking - First observed
test_connection - First observed
unclaim_reward_points - First observed
unmark_done - First observed
update_category_or_project - First observed
update_task
TDQS
Scored across 38 tools
Most tools have clearly distinct purposes targeting specific resources (tasks, habits, rewards, reminders, etc.). A few pairs could cause confusion—get_due_items vs. get_today_items and list_habits vs. get_habit—but the detailed descriptions clarify their differences, so overall ambiguity is low.
All tool names follow a consistent snake_case verb_noun pattern (get_, create_, update_, delete_, set_, start_, stop_, mark_, unmark_, list_, etc.). No mixing of conventions or vague verbs like 'process' or 'run'; the naming is predictable and clear.
With 38 tools, the server is well above the 25-tool threshold for 'too many.' While the Marvin domain is broad, the large number of specialized getters and experimental utilities makes the surface feel heavy and harder for an agent to navigate efficiently.
The tool set covers many areas—tasks, categories/projects, habits, rewards, reminders, time blocks, events, goals, and labels—but has notable gaps. There is no delete/update for categories/projects, habits lack update/delete operations, and time blocks/events only have create/read, leaving lifecycle coverage incomplete.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to interact with the Taskwarrior command-line task management tool. It allows users to list, create, modify, and organize tasks using projects, tags, and annotations through natural language.132MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that connects AI assistants to Super Productivity for managing tasks, projects, and tags. Supports quick capture, batch triage, and full planning sessions through natural language.104 npm94MIT
- AlicenseBqualityCmaintenanceAn MCP server that lets your AI assistant manage TickTick tasks, projects, habits, and more through natural language, supporting both TickTick and Dida365.521MIT
- FlicenseNot gradedqualityDmaintenanceA personal assistant MCP server that integrates Todoist, Anki, Obsidian, and Google Calendar to help you learn, organize, and stay productive through natural language interactions.2-