amazing-marvin-complete-mcp
This MCP server gives an AI assistant full read/write access to your Amazing Marvin account through 37 tools covering essentially every public API endpoint (plus the undocumented /doneItems).
Tasks: create, update, set priority/frog, mark done/undone, and permanently delete (
create_task,update_task,set_priority,mark_done,unmark_done,delete_task); set day, due date, start/end dates, notes, labels, parent, time estimate, reward points, and strategy fields (planned week/month, review date, backburner, orbit, sections, snooze).Reading/listing: today's items, due items, completed items (with lookback + caching), direct children of a category/project, and the full category/project hierarchy.
Structure: create, update, and convert (experimental, in place) categories and projects, with color/icon/priority/labels.
Habits: list habit documents, read a habit's tracking record, and record/undo recordings (with immediate sync-DB update).
Time blocks: read today's blocks (including the block→category mapping) and create blocks (experimental).
Time tracking: see the currently tracked item, start/stop tracking, and read track history (up to 100 task IDs).
Kudos/rewards: read kudos and level, claim/unclaim reward points, spend points, and permanently reset the point history.
Misc: labels, goals, reminders (read, set standalone push reminders, delete), calendar events (experimental), account info, and rate-limit status.
Safety/operational features: global rate limiter respecting Marvin's limits (1 write/s, 1 read/3 s, 1440 calls/day) shared across all tools, MCP tool annotations (readOnly/destructive/idempotent/openWorld), least-privilege token routing (API token vs. Full Access token), stdio and authenticated Streamable HTTP transports, and extensive documented API quirks/edge cases.
Limitations: no Smart List/task-picking logic, no
/reminder/deleteAll, task-linked reminders must be set in the app, deleted items can't be restored (API deletes bypass the client-side trash), and complete projects can't be marked done via the API.
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: 37 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 (37)
Group | Tools |
Core |
|
Reading |
|
Structure |
|
Habits |
|
Time blocks |
|
Time tracking |
|
Kudos/rewards |
|
Misc |
|
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).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 the API does not update the task's own
times/durationfields;/tracksis the source of truth.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 never render an own icon — the app offers the picker but only the color is used.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.timeBlockSectionis stored but shows no visible section link in Today.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
37 toolsclaim_reward_pointsA
Award reward points for a completed task (or a manual celebration). 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?
The description goes well beyond the annotations by disclosing that a MANUAL award cannot be undone through the API, citing live verification, specific HTTP status codes for unclaim (404) and negative points (400), and the side effect that spend_reward_points inflates spent statistics. This is valuable behavioral context for an irreversible 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 compact yet information-dense, using a clear note/warning structure. Every sentence contributes either to the core purpose, the automatic-award caveat, or the critical irreversibility warning. There is minimal redundancy; the final caution reinforces the high-stakes nature without repeating details.
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 and the presence of an output schema, the description is complete: it states the trigger conditions, the need to call it separately after mark_done, the irreversible nature of manual awards, the failure modes, and the only compensation path. An agent has enough context to invoke it correctly and avoid harmful manual awards.
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 documents all three parameters with descriptions and defaults, including 'MANUAL' for item_id. The description adds no meaningful parameter-level semantics beyond reinforcing the manual-award concept, so the baseline of 3 for fully schema-covered parameters 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 opens with a specific verb and resource: 'Award reward points for a completed task (or a manual celebration).' This clearly defines what the tool does and distinguishes it from reward-related siblings like spend_reward_points, reset_reward_points, and unclaim_reward_points by framing it as the awarding action.
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: after a task is completed or for a manual celebration, and it instructs to call it separately after mark_done because points are not awarded automatically. It does not exhaustively contrast with all reward siblings, but the manual-award warning and the mention of spend_reward_points as the only compensation give practical routing guidance.
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
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?
The description is highly transparent: it discloses the undocumented /doc/update endpoint, the Full Access Token requirement, in-place mutation with same _id/createdAt/children, lossless default behavior, and the risk of orphans/cycles. This goes well beyond the annotations and gives the agent crucial operational 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?
The description is long but well-structured and front-loaded with the essential conversion semantics. Some verification dates and app-path details could be trimmed without losing actionability, but they support the tool's experimental nature and are not 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?
For an experimental and potentially risky conversion tool, the description covers prerequisites, side effects, field preservation/clearing behavior, return values, and a critical warning. An output schema exists, so return-value documentation is not required here; the description is operationally complete.
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%, but the description adds meaningful nuance beyond the schema: it explains the default False for clear_project_fields means lossless conversion, clarifies what gets cleared when True, and notes that removed values are returned in removed_project_fields. This is useful supplementary meaning for a documented parameter set.
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 an explicit, specific operation: 'Convert project→category or category→project IN PLACE'. This clearly distinguishes it from sibling create/update tools and explains the core type-changing behavior.
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 strong usage context: it warns not to convert a category with subcategories, tells the agent to check get_children first, and explains when to choose clear_project_fields=True vs the lossless default. However, it does not explicitly contrast itself with update_category_or_project or other siblings, so the alternative-selection guidance is mostly implied.
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 (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. Categories ONLY — projects NEVER render their own icon (the flag stays; only the color is used) | |
| 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?
Annotations mark it as a non-read-only, non-destructive, non-idempotent mutation; the description goes well beyond that by disclosing endpoint divergence (/doc/create vs /addProject), live-verified field-ignoring behavior, and a client-side local block that prevents the '#word' corruption bug before any API call. Minor gap: it does not spell out permissions/auth for the project path or what the response contains, though an output schema 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?
Front-loaded with the action and the category/project split, then ordered by caveat severity (field rejection → creation-time ignores → title corruption bug). It is long and mildly redundant, since the schema already labels several fields 'Projects ONLY', so parts of the body repeat structured 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?
For a 15-parameter creation tool with two divergent API backends, the description supplies the cross-parameter rules, the workaround path (update afterwards), and the title validation rule that no other field covers. Annotations and the output schema handle the safety and return-value halves, so nothing material 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 coverage is already 100%, yet the description adds cross-field semantics the schema cannot express: day/due_date/priority/frog are structurally meaningless for categories, label_ids applies to both kinds, and startDate/endDate are silently ignored at creation. These are genuine usage-critical constraints beyond per-parameter text.
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?
Opens with a specific verb+resource pair and immediately disambiguates the two modes ('Create a category (via /doc/create...) or a project (via /addProject)'), which is exactly the distinction an agent needs given both live behind one tool name. It also states the containment rule (categories can contain categories; projects cannot), separating it from sibling tools like create_task and create_event.
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?
Gives clear conditional routing for the two kinds and explicitly redirects to update_category_or_project for startDate/endDate that cannot be set at creation. It does not, however, state when to prefer this tool over create_task/create_event or note prerequisites such as the Full Access Token requirement beyond the parenthetical mention of it for /doc/create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventA
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?
The description discloses a non-obvious behavior: event creation is local and external calendar sync only happens if the Marvin client app is running. This adds value beyond the annotations, which are all false and provide no safety profile. The 'EXPERIMENTAL' label further signals risk.
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. The first sentence delivers the purpose immediately, and the second adds a critical caveat. There is no wasted wording or repetition.
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 fully documented schema and the presence of an output schema, the description covers the essential creation context and the important client-sync dependency. It lacks only usage-alternative guidance, which is a usage-guidelines gap rather than a completeness 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?
Schema coverage is 100% with descriptions for all four parameters, including an ISO 8601 format example for start_iso and an exclusiveMinimum constraint for length_minutes. The description itself adds no extra parameter semantics, so the baseline score 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 states a specific verb and resource: 'Create a calendar event.' This distinguishes it from sibling tools like create_task, create_time_block, and create_category_or_project. The 'EXPERIMENTAL' prefix does not obscure the 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 no guidance on when to use this tool versus alternatives such as create_time_block or create_task. The sync caveat describes a behavioral constraint but does not explain when this tool is appropriate or when a sibling should be chosen instead.
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 in Amazing Marvin. 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). 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 | |
| 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 declare the safety profile (write, non-destructive, non-idempotent), while the description discloses far more: X-Auto-Complete: false means titles are stored verbatim and quick-add syntax is NOT parsed, and silently ignored fields (startDate/endDate) are called out with live-verification dates. It also explains the failure mode of the shortcut path (a '#word' stored as parentId makes the task invisible), which is exactly the kind of consequence an agent cannot infer from 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?
Purpose and the key title-parsing rule are front-loaded, which is good, but the middle paragraph on Time/taskTime, reminders, events and time blocking is largely tangential to invoking this tool correctly, and the closing strategy paragraph is dense. For a 19-parameter tool some length is warranted, yet several sentences do not earn their place for a create call.
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 an output schema present the description need not explain return values, and it still covers the gaps structured data cannot: parser behavior, silently ignored fields, storage-vs-UI divergence for strategy fields, and inter-tool handoffs. Nothing an agent needs to call create_task correctly appears to be 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 coverage is already 100%, so the baseline is 3; the description earns an extra point by telling the agent which parameters to use in place of quick-add syntax (parent_id, day, priority, time_estimate_minutes, label_ids) and by clarifying that strategy-dependent fields (planned_week/month, review_date, backburner, sections) are persisted even when the strategy is off in the UI.
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?
Opens with a specific verb+resource ('Create a task in Amazing Marvin') and immediately differentiates scope from siblings by naming update_task for start/end dates and by stating that time blocking belongs to time blocks, not this tool. An agent can separate create_task from create_event, create_time_block and update_task without opening a 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?
Gives concrete routing: set startDate/endDate with update_task after creation, set a clock Time in the app rather than via MCP, and prefer priority/frog parameters over date-based scheduling. It lacks an explicit 'use create_event instead when…' statement, so the event/time-block distinction is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_time_blockA
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.
| 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 say the operation is not read-only/no idempotence/no destruction, but the description adds value by revealing that this is an unofficial workaround through /doc/create and that the result must be manually verified. 'EXPERIMENTAL' warns about reliability beyond what the structured 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 a single front-loaded sentence that conveys experimental status, the endpoint, auth requirement, and post-call verification without excess wording. Every clause carries useful operational information.
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 four-parameter experimental write tool, the description covers the essential invocation context: the endpoint, token requirement, risk, and verification step. An output schema exists and param coverage is complete, so return values and parameter details are already handled elsewhere.
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 each of the four parameters already has a clear format description (e.g., 'YYYY-MM-DD', 'HH:mm'). The tool description does not need to repeat parameter details and adds no additional semantic meaning 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?
The description begins with a specific action and resource: 'Create a time block' and further identifies the exact implementation route via /doc/create. It also flags a critical distinction from sibling tools by noting no official endpoint exists, so an agent can tell it apart from create_task/create_event.
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 provides clear context for use: the tool is experimental, has no official endpoint, requires a Full Access Token, and should be verified in the app. It does not explicitly name alternatives or say when not to use it, so it stops short of a 5.
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?
Beyond the destructiveHint and idempotentHint annotations, the description discloses an important side effect: for task reminders, only the server-side entry is removed and the task's reminder fields remain, allowing the app to recreate it. This is exactly the kind of behavioral detail an agent needs to avoid incorrect expectations.
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: the main action is stated first, then the caveat and usage preference follow. Every sentence adds meaningful information with no filler or repetition.
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 destructive delete operation, the description covers what is deleted, what is not deleted, when it is safe to use, and where to get the target IDs. Combined with the output schema and annotations, an agent has enough context to invoke it correctly and anticipate side effects.
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 reminder_ids as 'IDs of reminders to delete,' so the baseline is 3. The description adds useful semantic guidance by specifying that IDs should be standalone reminders or orphaned entries from get_reminders, which helps the agent select valid inputs rather than task-associated reminders.
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: 'Delete one or more server-side reminders.' It clearly distinguishes the server-side behavior from task-document reminder fields and references standalone reminders of type 'M', making it easy to tell apart from broader task deletion operations.
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 usage guidance: prefer deleting standalone reminders or cleaning up orphaned entries from get_reminders, and warns against relying on it for task reminders because the app may recreate them. This tells the agent when to use the tool and when the result may be incomplete.
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/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?
Goes well beyond the destructiveHint annotation: irreversible PERMANENT deletion, trash bypass, stale-client rendering behavior, conflict-resolution recreation risk, required reload procedure, and full-access-token requirement. Adds genuinely valuable operational context not present in structured data.
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?
Severely overlong and meandering: parenthetical asides, a dated live-testing narrative, and an unrecorded-client anecdote bury the critical actionable rules. Front-loading is decent but the volume of incident detail dilutes the core 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?
Covers destructive semantics, auth requirements, recovery limits, and post-deletion verification steps; output schema exists so return values needn't be explained. The verbosity is a style issue more than a completeness 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?
Schema coverage is 100% and there is only one required param (item_id), so the schema fully carries parameter meaning. The description adds no syntax or format detail beyond the schema, warranting the baseline 3.
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+resource (delete a task/document via /doc/delete) and distinguishes itself sharply from in-app deletion by noting the client-side trash bypass. No sibling ambiguity remains.
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 when-to-use ('only when the user explicitly wants a deletion'), when-not (recurring task generators, cases where undo matters), and a named preferred alternative (delete in the app for trash/restore behavior).
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, etc.
| 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's 'Get' aligns with a read operation, so there is no contradiction. The description adds modest context by revealing the endpoint and example response fields, but it does not disclose auth requirements, error behavior, or rate-limit implications.
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 the verb and resource front-loaded, followed by endpoint and example fields. Every part earns its place; 'etc.' is slightly vague but acceptable in this 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 zero-parameter, read-only tool with an output schema, the description is sufficiently complete. It identifies the resource and key fields, while additional return-structure details are already available from the output 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?
The input schema is empty, so there are no parameters to document; the baseline of 4 applies. The description adds some value by hinting at the response contents (email, tracking status), though this is not strictly required for a zero-parameter tool.
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 ('Get'), a clear resource ('account info'), the endpoint ('/me'), and example fields ('email, tracking status'), making the operation unambiguous. It is naturally distinct from sibling tools like get_rate_limit_status or test_connection.
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 its siblings or when not to use it. The agent must infer intent solely from the name and brief description; no alternatives or exclusions are mentioned.
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 (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?
The description adds hierarchy-structure behavior beyond the readOnlyHint annotation: it returns the full hierarchy and indicates the root level. This is useful context, though it could have been richer about ordering or response shape.
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 action and scope, followed by the intended use case. Every word earns its place with no repetition or 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?
With no parameters and an output schema present, the description is complete for an agent to understand what the tool returns and when to call it. The hierarchy note and parentId hint cover the key conceptual 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?
Tool has 0 parameters, so the baseline is 4. The description adds helpful meaning about the parentId field and its role in the hierarchy, which helps an agent interpret the response even though there are no parameters.
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: 'Get all categories and projects', and explicitly clarifies scope as 'the whole hierarchy' with parentId='root' as the top level. This distinguishes it clearly from siblings like get_children, which likely returns a narrower subset.
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?
Provides an explicit use case: 'Use to find the right parent_id when creating/moving.' This gives clear context for when the tool is valuable, though it does not mention explicit exclusions or alternative tools.
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/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 reveals important behavioral edge cases: direct-children-only traversal, orphan exclusion from 'unassigned,' and the FIX_CYCLES() repair path. This is substantial behavioral context that an agent could not infer from annotations or schema alone. No contradiction with the readOnlyHint 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 main behavior is front-loaded in the first sentence, followed by a concise recursion note and then a detailed but relevant orphan edge-case caveat. Each sentence earns its place, and the live-tested date adds credibility without excessive verbosity.
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 fully covers the core operation, iteration strategy, and an important data-consistency quirk. It also supplies a remediation path. Nothing essential is missing for an agent to call this tool correctly and interpret its results.
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 100% coverage for the single parameter parent_id, including valid special values like 'unassigned' and 'root'. The description repeats the notion of 'category/project' but does not add new parameter-level syntax or format details beyond the schema. Baseline 3 is appropriate because the schema carries the semantic weight.
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 open tasks and subprojects in a category/project.' It also clarifies scope by noting 'Returns direct children only,' which distinguishes it from recursive traversal and aligns with the tool's name. This is sufficiently differentiated from sibling tools like get_categories and 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?
It gives explicit guidance: 'call again for deeper levels' tells the agent how to navigate hierarchies. The orphan note also explains when not to expect orphans and points to get_today_items/get_due_items as alternatives for orphans with a day/dueDate, providing clear when-to-use and when-not-to-use context.
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
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?
With only readOnlyHint and openWorldHint in annotations, the description goes far beyond by disclosing the undocumented endpoint, filtering on day vs doneAt, future-day caveats, 429/error handling, cache invalidation, excluded items, sorting, and API cost. This is exceptionally transparent behavior documentation.
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 and every sentence carries non-obvious information, but the text is dense and somewhat run-on. Given the undocumented endpoint and multiple edge cases, the length is justified, though it could be tightened.
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 an output schema present and annotations covering the safe-read nature, the description fully covers selection and invocation: parameters, edge cases, failure behavior, cache semantics, exclusions, and cost. Nothing critical is missing for 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?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by explaining timezone behavior, that omitting date defaults to today, how lookback_days catches earlier-scheduled tasks, and the per-day cost of each lookback day. This goes beyond the 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: "Tasks completed on a given date (doneAt within that day, configured timezone)", clearly distinguishing it from sibling tools like get_today_items and get_due_items. It also clarifies scope with exclusions like "regardless of priority and deadline" and "Tasks only — completed projects are not listed."
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 to use the tool: to retrieve tasks completed on a specific date, with lookback behavior and exclusions. It does not explicitly name alternative tools or state when not to use it, but the scope is precise enough for an agent to select it correctly.
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/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 safe-read nature is covered. The description adds the 'open' status filter and the deadline range behavior, which is helpful, but it does not clarify what 'open' means or any other behavioral details beyond the 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?
One compact sentence that front-loads the action and resource, then states the deadline filter. There is no wordiness or redundant information.
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, optional-parameter read-only tool with an output schema, the description plus annotations and schema fully cover what an agent needs. The main concepts—open items, deadline today or earlier, and optional override—are all represented.
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 single parameter `by` is fully documented in the schema with format and default behavior, so the schema carries the parameter-semantics burden. The description adds no new parameter detail beyond restating the 'today or earlier' concept.
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') with a clear resource ('open tasks/projects') and a precise filter ('deadline today or earlier'). This meaningfully distinguishes it from the sibling tool get_today_items, which appears to cover only today's 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 implies the tool is for overdue items plus items due today, which gives useful context. However, it does not explicitly say when to prefer this over get_today_items or other listing tools, nor does it mention alternatives or exclusions.
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 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 openWorldHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations by stating the response contains the full history as 'the source of truth for recordings' and explicitly disclosing the absence of title and settings.
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: the core action and resource appear in the first clause, followed by a single valuable caveat about missing fields. There is no wasted wording, and 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?
Given that the tool has only one parameter, a well-described input schema, read-only annotations, an output schema, and no nested objects, the description provides all necessary context. It explains the response's scope and explicitly points to list_habits for missing metadata, making it complete for correct invocation.
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 covers 100% of the single parameter with the description 'Habit ID (from list_habits),' which is already clear. The tool description mentions 'habitId' but does not add format, source, or usage details beyond what the schema provides, so the baseline score 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 identifies the verb 'Get' and the specific resource: the server's tracking record for a single habit, including 'habitId + full history.' It also distinguishes itself from list_habits by noting exactly what the response omits, making the tool's purpose immediately clear to an agent.
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 useful context about when to use this tool versus list_habits, noting that title and settings are not included in this response and 'those are in list_habits.' It gives a clear sense of the available alternatives, though it does not explicitly state 'use this when you need full history' or list exclusion cases.
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 (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 provide readOnlyHint=true, and the description adds useful behavioral context: kudos is separate from reward points and nextMultiplier is absent due to a known limitation. This goes beyond the annotation without contradicting 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 three purposeful sentences: it states the action, clarifies a likely currency confusion, and documents a limitation. No filler or repeated schema information.
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, the description covers purpose, sibling differentiation, and a known limitation. Nothing necessary 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?
The tool has zero parameters, so the baseline is 4. There is nothing for the description to add about parameter semantics, and the input schema is already complete.
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 ('Get') and resource ('kudos, level and kudosRemaining') and names Marvin's XP system. It explicitly distinguishes kudos from reward points and points to get_account_info, so the tool's purpose is unambiguous and separable from 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?
The description tells the agent that reward points belong to get_account_info, effectively saying 'use this for kudos, not reward currency.' It also flags that nextMultiplier is not available here. It lacks an explicit 'use when...' statement, but the context 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_labelsARead-only
Get all labels (for label_ids when creating/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?
The annotations already declare readOnlyHint=true, so the description does not need to restate that this is a safe read operation. The description adds a use-case hint but no extra behavioral traits such as pagination, rate limits, or auth requirements. This is adequate given the annotation coverage, but no more than that.
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 that front-loads the primary action ('Get all labels') and appends a compact purpose clause. Every word adds value, and there is no redundancy or 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?
For a zero-parameter, read-only tool with an output schema present, the description is complete. It names the resource, indicates the purpose, and relies on the output schema for return-value details. There are no missing prerequisites or hidden configuration requirements to worry about.
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 the schema is trivially covered at 100%, so the baseline for parameter semantics is 4. The description contributes nothing about parameters because there are none to document; this 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 all labels') and adds a clear purpose ('for label_ids when creating/filtering'), which distinguishes it from sibling getters like get_categories or get_goals. An agent can immediately tell what this tool returns and why it exists.
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 parenthetical gives clear context for when to use this tool: when you need label IDs for creating or filtering tasks. It does not explicitly name alternative tools or state when not to use it, but the resource being labels is distinct enough among siblings that the context is sufficient.
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 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 declare readOnlyHint=true, and the description adds useful behavioral context: the budget is 1440/day and shared by all tools. This helps the agent understand that calls to other tools consume this budget. No contradictions 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?
A single, front-loaded sentence that conveys the purpose and the key constraint. Every word earns its place, with no filler or repetition of annotation 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?
For a zero-parameter read-only status tool with an output schema, the description is complete. It explains what is being measured and the relevant budget, which is all an agent needs to select and invoke the 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?
The tool has zero parameters, so the baseline is 4. There is nothing for the description to add about parameter semantics, and the schema coverage is complete by default.
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 clear verb ('Show') and resource ('how many Marvin API calls have been made today'), making the tool's purpose immediately obvious. It also includes the daily budget context, which distinguishes it from sibling tools like get_account_info or test_connection.
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: this is the tool for checking today's API call usage against the 1440/day budget. It does not explicitly name alternatives or exclusions, but the unique purpose is evident and the shared-budget note helps the agent understand when to consult it.
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?
The readOnlyHint annotation already establishes this is a read-only operation, and the description adds useful context beyond that: reminders are server-side push notifications and the Full Access Token is required. This extra behavioral context is valuable and does not contradict 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 description is two sentences with no filler. It front-loads the core action and resource, then adds the relevant auth requirement. 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 zero-parameter, read-only list tool with an output schema, the description covers what an agent needs: the resource type, its scope, and the required token. There are no gaps that would prevent correct invocation.
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. There are no parameter semantics to document, and the description appropriately avoids inventing parameter-level 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 states a specific verb and resource: 'Get all server-side reminders', and clarifies the special meaning of reminders as 'push notifications to the phone'. This is enough to distinguish the tool from its sibling set_reminder and delete_reminder without opening their 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 provides no explicit guidance about when to use this tool versus its siblings, nor does it mention when not to use it. It only notes the auth requirement, which is a prerequisite rather than 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_tracksARead-only
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 declare readOnlyHint=true, so the description does not need to repeat safety. The phrase 'source of truth' adds some behavioral context, but the 'max 100 per call' largely duplicates the schema's 'Up to 100 task IDs' rather than disclosing new behavior.
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 sentence that front-loads the core purpose and packs the key constraints ('source of truth', 'max 100 per call') without wasted words. Every element 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 simple read-only tool with one well-documented parameter and an output schema, the description includes the essential constraints. It omits edge-case behavior for exceeding 100 IDs, but that is minor given the overall clarity.
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 the only parameter already documented as 'Up to 100 task IDs'. The description's 'max 100 per call' add no new meaning beyond what the schema provides, 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 clearly identifies the operation ('Get time-tracking history') and the resource ('for the given tasks'), and adds the qualifier 'source of truth' to distinguish it from other tracking-related tools. It does not explicitly name or contrast siblings, 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 implies usage when you need authoritative time-tracking history for specific tasks, and the 'max 100 per call' constraint gives a practical boundary. However, it provides no explicit guidance on when not to use it or which sibling tool to choose instead.
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/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?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds substantial context beyond them: rollover inclusion semantics, timezone resolution order, the caveat that today's recurring tasks may be missing until the client generates them, and an explicit note that clock-time items are untested. This is unusually candid behavioral disclosure.
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 selection rule and the sibling exclusion are front-loaded, which is correct. The trailing provenance note ('Observed 2026-09-11...') and untested-clock-time remark are useful but slightly verbose, keeping it short of a 5.
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?
An output schema exists, so return values need not be described. Given that, the description covers the selection semantics, the alternative tool, timezone handling, and known staleness caveats — 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?
Schema coverage is 100% and the single parameter's schema description already states the YYYY-MM-DD format, the day <= date behavior, and the timezone fallback. The description largely restates this, 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?
States a specific verb and resource (open tasks/projects) plus the exact selection rule (day <= date, including rollover items, not just items on that day). It also distinguishes itself from the sibling get_due_items, which handles deadline-only tasks.
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 names the alternative for the excluded case ('Tasks that only have a deadline are not included; fetch them with get_due_items'), giving a clear when/when-not routing rule. The default-timezone behavior of omitting the date is also spelled out.
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. 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?
Annotations already mark the tool as read-only, and the description goes further by disclosing a meaningful API limitation: the response lacks the category link and the mapping is fetched separately from plannerSmartLists. This gives the agent useful expectations about data shape and an extra lookup without contradicting the readOnlyHint.
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 purpose front-loaded and the critical limitation placed immediately after. No filler or redundant restatement of the schema; both sentences earn their 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?
Given the simple surface area, rich schema parameter descriptions, output schema, and read-only annotations, the description covers the important non-obvious behavior. The only notable completeness gap is the lack of explicit sibling comparison, but the core calling context is sufficiently conveyed.
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 parameters are already well documented. The description adds useful implementation context about the category-mapping lookup and normalized block title, but it does not substantively add to the parameter-level meaning 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 identifies the operation ('Get') and the resource ('today's time blocks'), so the purpose is immediately understandable. It does not explicitly name a sibling to distinguish itself from, though 'time blocks' is reasonably distinct from tools like get_today_items or get_time_tracks.
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?
There is no direct guidance about when to use this tool versus alternatives such as get_today_items, get_time_tracks, or create_time_block. The first sentence implies retrieval of today's blocks, but it never states exclusions or conditions that would route an agent to a different sibling.
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 currently being time-tracked (if any).
| 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 readOnlyHint annotation already communicates that this is a safe read operation. The description adds a small but useful behavioral detail with '(if any)', indicating that the result may be empty when no task is being tracked. This is modest extra context beyond the annotations, not a rich behavioral disclosure.
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 wasted words. It front-loads the core action and resource, and the parenthetical '(if any)' adds necessary optionality information without bloating the 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 zero-parameter, read-only tool with an output schema and readOnlyHint annotation, the description fully satisfies the agent's needs. It clearly states what the tool returns and the optional nature of the result. No additional context about return values is required because an output schema exists.
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 are no parameter semantics to document. The schema coverage is effectively 100% because the input schema is empty, and the description correctly focuses on output rather than input. The baseline of 4 applies here since no parameter explanation is needed.
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 a precise resource ('which task is currently being time-tracked'), which makes the tool's purpose immediately clear. It also naturally distinguishes it from related siblings like get_time_tracks by emphasizing the current active tracking state rather than a history of tracks.
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 'currently being time-tracked (if any)' clearly signals the intended use case: check the active tracking state. It does not explicitly mention alternatives or exclusions, but the 'current' qualifier is enough context to prevent obvious confusion with time-tracking history tools.
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 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 mark readOnlyHint=true, but the description adds the Full Access Token requirement, the lazy-registry behavior of the alternative endpoint, and the exact history format (time/value pairs in unix ms). These are behavioral facts 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 description is three sentences with no filler: core purpose first, then auth requirement, then an 'Important' caveat with a verification date. Every clause 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?
It covers what the tool returns, the required token, and a non-obvious failure mode. An output schema is present for structured return details, so no essential invocation context 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 no parameter detail to clarify. The schema coverage is 100% and the description has nothing to add, which meets the baseline for a parameterless tool.
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 all habits as full documents incl. title, settings and history'. The word 'all' plus the detailed output format clearly distinguishes this from siblings like get_habit and from a non-raw /habits endpoint.
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 explicitly says the non-raw /habits variant 'would be wrong here' and explains why (registry lazily created, missing never-recorded habits, responses lack titles). It also names the required auth variant, so an agent knows when and how to use this tool.
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 (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 side effects: it stops running time tracking, writes the tracking interval to task.times, records receipts in /tracks, keeps the original pinned task open, creates a new ID for the completed copy, and leaves `day` untouched. It even notes a server behavior change with dates. The idempotentHint=true is consistent with the 400-already-done and deterministic recurring-ID notes, so there is no contradiction.
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 opening sentence is front-loaded and clear, but the rest is a dense wall of parentheticals, semicolons, and date-stamped caveats. Every sentence earns its place, yet the structure could be improved with bullets or separation between error handling, recurring tasks, and side effects. It is appropriately sized for the complexity but not concise in form.
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 mutating tool with one parameter and an output schema, the description is remarkably complete: it covers valid/invalid targets, recurring instances, error semantics, side effects on time tracking, pinned tasks, day-field behavior, and how to read back completed tasks. An agent has everything needed to invoke the tool correctly and anticipate consequences.
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 covers the single item_id at 100% with 'Task ID (NOT a project — see description)'. The description adds extra semantic value by specifying the deterministic recurring instance ID format ('YYYY-MM-DD_<recurringTaskId>') and by reinforcing that projects are invalid; this helps an agent construct the correct parameter value beyond the schema itself.
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: 'Mark a task as done (via /markDone, with the correct timezone offset)'. It explicitly narrows the scope to tasks only and distinguishes this from projects by citing the live 400 error, so an agent can separate it from sibling tools like unmark_done or update_task 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?
It gives explicit when-to-use guidance: tasks ONLY, projects should be completed in the Marvin app, and /doc/update would technically work but skips side effects. It also covers recurring tasks, error-code meanings, and the tracking side effect, which collectively tell an agent exactly when to choose this tool over alternatives.
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. 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?
The description adds value beyond the annotations by disclosing that the sync database is updated and the Marvin app reflects the change immediately. Since the annotations already establish this is a mutating, non-idempotent operation, this is meaningful extra context rather than redundancy. There is no contradiction with 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?
Two concise, front-loaded sentences with no filler. The first sentence states the primary action, and the second explains an important behavioral side effect and why it matters.
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 mutation tool with full schema parameter coverage, annotations covering the safety profile, and an output schema present, the description is complete enough for correct invocation. The sync-database side effect is explicitly disclosed, leaving no critical behavioral 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?
All three parameters have complete descriptions in the input schema, so the baseline applies. The description does not add parameter-level detail, and the mention of updateDB=true could be slightly confusing since it is not a schema parameter. Overall, the schema carries the parameter documentation burden adequately.
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 action ('Record (or undo)') and the resource ('a habit'), making the tool's purpose immediately understandable. It does not explicitly call out sibling tools, so it stops short of full differentiation, but the verb and resource are distinct from task-oriented siblings like mark_done/unmark_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 implies the tool is for recording or undoing habit entries, but it gives no explicit guidance on when to prefer it over list_habits/get_habit or how it relates to task completion tools. The core use case is inferable, but the description lacks explicit when/when-not 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: 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 goes well beyond the annotations by detailing what is destroyed ('whole earn/spend history'), what happens to the balance ('sets the balance to 0'), and that the operation is permanent ('CANNOT be undone'). It also discloses the authentication requirement ('Full Access Token').
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 most important fact ('PERMANENTLY') stated first. Every clause adds value: what happens, auth requirement, irreversibility, and usage condition.
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 destructive action, the description covers the purpose, the behavioral impact, the irreversibility, the authentication prerequisite, and the appropriate trigger condition. The output schema exists to cover return values, so nothing needed for safe 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?
The tool has zero parameters, and the input schema is empty, so there are no parameter semantics to clarify. The description appropriately focuses on the operation rather than parameters, meeting the baseline for a parameterless tool.
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 ('reset'), a clear resource ('reward points'), and the exact effect: deleting the entire earn/spend history and setting the balance to 0. It is plainly distinguishable from the sibling reward tools (claim, unclaim, spend) because it describes a full reset rather than a point adjustment.
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 to use this only when the user explicitly asks for it, which serves as a strong when-to-use and when-not-to-use gate. The irreversibility warning reinforces the caution needed before invoking this destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_priorityAIdempotent
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?
Beyond the annotations, it discloses the Full Access Token requirement, verified isStarred value semantics, the conditional display behavior of low priority while still storing the value, and the server's 500-instead-of-404 error quirk. These are concrete behavioral traits that an agent cannot infer from annotations or 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?
The description is dense but every sentence serves a purpose: core function, auth requirement, value semantics, display caveat, project exclusion, and error behavior. Front-loading the purpose and scoping before caveats makes it easy to 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?
Given the complexity of the priority/frog semantics, project differences, and server error oddity, the description covers everything needed to call the tool correctly. An output schema exists for return values, so return-format details are not required here.
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 detailed value mappings for both priority and frog, so the description does not need to add parameter-level detail. It adds some verification/context beyond the schema but does not significantly extend the meaning of the parameters themselves.
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?
Opens with a specific verb and resource: 'Set or change priority (isStarred) and/or the frog marker on an existing TASK.' It scopes itself to tasks and explicitly disambiguates from projects, which use a different field and sibling tool. This clearly distinguishes it from update_task and update_category_or_project.
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 states when the tool applies and when it does not: it applies to TASK priority/frog changes, and it explicitly says 'Does not apply to projects' with the alternative 'set it via update_category_or_project.' It also gives a behavioral cue for invalid IDs (permanent 500) and advises fetching a fresh ID, so an agent knows not to use this tool with stale IDs.
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 (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?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false): it discloses that a Marvin reminder is normally TWO writes, that this tool performs only the server-side /reminder/set write, and that using a task ID risks an orphaned entry 'only visible through get_reminders'. The app-login prerequisite and the practical limitation about taskTime/autoSnooze are also surfaced. No annotation contradiction.
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?
Front-loads the WARNING and the standalone-only rule before the explanatory detail, which is the right ordering. The trailing 'Facts about time on tasks' paragraph is somewhat tangential to invoking this tool, though it does justify the stated MCP limitation; the definition is long but most sentences earn their 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 write tool with real data-integrity hazards, a 3-param schema at 100% coverage, an output schema, and partial annotation coverage, the description supplies the missing pieces: integrity semantics, prerequisites, safe-use boundary, and the task-reminder limitation. An agent can call this correctly and know when not to.
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 reason-level meaning for reminder_id (why a task ID is dangerous) and clarifies what the reminder represents. It stops short of stating any format details beyond the schema, but the added semantic context for the risky parameter is real value.
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 clause states a specific verb+resource ('Set a standalone push reminder') and immediately scopes it as type 'M' requiring the mobile app. It explicitly distinguishes this from task-linked reminders, which is the exact confusion an agent would otherwise have.
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?
Gives an explicit when-to-use ('use this tool for standalone reminders only') and a when-not-to-use ('Task-linked reminders are set in the Marvin app'), plus a concrete parameter-level exclusion ('Setting reminder_id to a task ID therefore does NOT link the reminder'). Alternative routing is fully specified.
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?
It reveals a non-obvious, live-verified API behavior: the endpoint returns 500 if the balance would go negative. This goes well beyond the annotations, which only list generic hints, and it gives the agent a concrete way to avoid failure.
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 focused sentences: the first names the operation, the second delivers a verified caveat and mitigation. No filler or redundant restatement of the schema.
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 a simple 2-parameter schema, full schema descriptions, and an output schema, the description covers the main action and the critical precondition. It is slightly incomplete only in that it does not clarify what 'a reward' refers to or whether any reward state must exist before spending.
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 schema already documents both parameters (points and date) adequately. The description does not add parameter-level detail beyond the schema; the balance warning relates to the overall operation, not a specific parameter's format.
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 — 'spend reward points on a reward' — so it clearly states what the tool does. It does not explicitly compare against sibling tools like claim_reward_points or reset_reward_points, so it falls just 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 note gives actionable guidance: check the balance (get_account_info) before large purchases to avoid a 500 error. It does not explicitly say when not to use this tool or name an alternative, but it provides clear situational context.
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 for 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 already indicate this is a mutating, idempotent, non-destructive operation, and the description adds little beyond the word 'start'. It does not explain what state changes occur, whether starting tracking again after an active session is handled, or any other behavioral details that would supplement 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 description is one short declarative sentence with no filler, and the main verb and object are front-loaded. For such a simple tool, this level of brevity is appropriate and effective.
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 only one required parameter, full schema coverage, and an output schema present, the description provides enough information to make a basic correct invocation. It could explain more about tracking semantics or when to choose this tool, but those are minor gaps given the tool's simplicity.
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 single parameter task_id is fully documented in the schema (100% coverage), so the description does not need to repeat its meaning. The description adds nothing beyond the schema's existing 'Task ID' documentation, making the baseline score of 3 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 names a specific action ('Start') and resource ('time tracking for a task'), so the core purpose is immediately clear. It does not explicitly contrast with sibling tools like create_time_block or stop_tracking, but the opposition with stop_tracking is strongly implied by naming.
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?
There is no explicit guidance on when to use this tool versus siblings such as create_time_block or get_time_tracks. The description simply states what it does, leaving the agent to infer the appropriate context without conditions, prerequisites, or exclusions.
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 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?
The description discloses a documented and live-confirmed API limitation: the task's own times/duration fields are not updated by /track STOP. It also names the exception with mark_done and points to get_time_tracks. This adds substantial behavioral context beyond the annotations, which only declare idempotency and non-destructiveness.
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 primary action and then adds a clearly marked, high-value limitation note. Every sentence earns its place, and the caveat is structured to be easily parsed by an agent.
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 tool with an output schema and non-destructive/idempotent annotations, the description covers the essential behavioral caveats and exceptions. Nothing critical is missing for correct invocation or interpretation.
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 provides 100% coverage with a single task_id parameter described as 'Task ID'. The description does not add new parameter-level detail, which is acceptable given the schema's completeness. Baseline 3 is appropriate 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 states a specific verb and resource: 'Stop time tracking for a task.' It clearly differentiates from sibling start_tracking and explains the precise scope of the action. The additional caveats reinforce rather than obscure the 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 clear context about what happens when stopping tracking and where the data lands (get_time_tracks). It also points to mark_done as an exception that writes task.times, which implies an alternative when task field updates are needed. It does not state the when-not condition quite as explicitly as a full 5 would require.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_connectionARead-only
Test authentication 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 already declare readOnlyHint=true and openWorldHint=false, establishing this is a safe, read-only operation. The description adds the valuable behavioral detail that the tool returns OK only if the apiToken is valid, giving the agent expectation about success criteria without over-specifying.
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 short sentences, front-loaded with the action and resource, followed by the result condition. Every word earns its place. No filler or redundant restatement.
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, output-schema-equipped tool, this description is fully sufficient. It states the purpose, the success indicator, and is complemented by the annotations. Nothing else is needed for an agent to select and 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?
There are zero parameters, so the schema trivially covers 100%. The description does not need to elaborate on parameters. The baseline for zero-parameter tools is 4 because no parameter ambiguity exists.
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: 'Test authentication against Marvin's API.' It clearly states what the tool does and distinguishes it from the sibling tools, none of which are connection/auth checks. The success condition ('Returns OK if the apiToken works') further clarifies the behavior.
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 clearly communicates when to use this tool: when you need to verify authentication or API token validity. It does not explicitly exclude alternatives, but no sibling tool exists for this purpose, so the context is sufficient.
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 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?
Annotations already cover safety and idempotency, and the description adds valuable behavioral context: MANUAL awards have no server entry, /unclaimRewardPoints returns 404 'No such entry', and the compensation path via spend_reward_points. It does not discuss effects on balances or repeated calls, but annotations cover idempotency and non-destructiveness.
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, starts with the core purpose and examples, then layers edge-case behavior and the alternative tool. Every sentence earns its place with no redundancy or 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?
Given the output schema, 100%-covered input schema, and annotations, the description is complete enough. It covers what the tool does, when to use it, the critical unsupported case, and the fallback path, leaving no meaningful invocation gaps.
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 beyond the schema by explaining that item_id must reference a real task award and that 'MANUAL' is unsupported with a concrete compensation alternative. This helps the agent understand the parameter's semantic constraint more deeply.
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 action ('Undo a point award'), names the resource, and gives concrete examples (misclick, task un-completed with unmark_done). It also distinguishes this tool from spend_reward_points by explicitly assigning manual awards to that sibling.
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?
Usage guidance is explicit: use this only for awards tied to a real task ID, and use spend_reward_points instead for MANUAL awards. This clearly separates when to call this tool versus the alternative.
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 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?
Beyond the annotations, the description reveals that kudos are not adjusted, that reward points can be undone separately, that a permanent 500 means the document does not exist (server behavior verified live), and that it works for generated instances of recurring tasks. This is rich behavioral disclosure that annotations alone do not provide. It also mentions the required Full Access Token, which is important for invocation. 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?
Three sentences, each carrying distinct value: the core effect, the auth requirement plus recurrence behavior, and the notable server error semantics. The content is front-loaded and every sentence earns its place with no 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?
For a one-parameter mutation tool with an output schema, the description covers the effect, the auth token, edge cases (recurring tasks), side effects (kudos), and an error behavior that could otherwise cause an agent to think the call failed due to a server fault. Nothing important 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 coverage is 100%: item_id is described as 'Task ID' in the schema itself. The description adds no further parameter-level meaning beyond what the schema already says, which meets the baseline for full coverage.
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 action (undo a completion), the concrete effect (sets done=false and clears doneAt), and the underlying mechanism (/doc/update). This clearly distinguishes it from mark_done and unclaim_reward_points, and an agent can tell exactly what the tool does without opening 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?
The description explains when to use it (after a task has been completed) and explicitly mentions an alternative for undoing reward points (unclaim_reward_points). It doesn't explicitly say 'use this instead of mark_done when...' but the context is clear enough because it names the related sibling and notes what it does NOT adjust.
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 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. ONLY meaningful on categories — projects never render their own icon (verified in the app 2026-08-29) | |
| 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?
Goes well beyond annotations (readOnly=false, idempotent=true, destructive=false) by disclosing a hidden cost (1 extra API call when blocked fields are supplied), refusal semantics, a hard prohibition on completing projects due to skipped side effects, transient vs permanent 500 behavior, and that the server returns 500 instead of 404 for missing IDs.
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?
Long but front-loaded: the core verb, resource, scope, and sibling routing come first, and later sentences carry distinct error-handling and field-scoping facts. Dense rather than padded, though some parenthetical provenance dates could be trimmed.
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 mutation tool with an output schema already present, the description covers the remaining agent-relevant unknowns: cross-type field applicability, refusal conditions, retry semantics, and the wrong-ID error shape. Nothing needed 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?
Although schema coverage is 100%, the description adds meaning the schema lacks: the structural rationale for 'Projects ONLY' blocking, confirmation that label_ids applies to both types, that icon is categories-only, and that strategy-dependent fields can be set even when the strategy is disabled.
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 ('Update fields on an existing CATEGORY or PROJECT via /doc/update') and immediately distinguishes itself from the sibling update_task for tasks. An agent can route between update_category_or_project, update_task, and create_category_or_project 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?
Explicit when-to-use routing ('For tasks, use update_task') plus explicit when-not guidance: 'Do not complete projects here' and the refusal behavior for category-blocked fields. Also names recovery alternatives (get_categories/get_children) for the missing-ID case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskAIdempotent
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), '' removes. NOTE: stored, but no visible section link renders in Today even with the strategy active (verified in the app 2026-08-29) | |
| 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?
Annotations only declare write/idempotent/non-destructive; the description adds far more: Full Access Token requirement, transient 500s being atomic with safe retry, permanent 500 meaning a missing document (server returns 500 not 404), strategy-dependent fields persisting while hidden in the UI, and the MCP-side limitation on clock times/reminders. These are exactly the operational facts an agent cannot get from 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?
Front-loaded with purpose and sibling routing, and nearly every sentence earns its place with non-obvious operational detail. It is long, however, and the repeated 'verified in the app 2026-08-29' provenance tag appears ten-plus times and the planned_week sentence sprawls, adding noise to an otherwise tight structure.
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 23-parameter mutation tool with an output schema and annotations, the description covers the remaining agent-facing gaps: auth scope, error/retry semantics, missing-ID recovery via get_categories/get_children, recurring-task restrictions, and client-reload caveats. Nothing essential to calling 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 coverage is 100% so the per-parameter docs carry most of the load, but the description adds cross-cutting semantics the schema can't: strategy-dependent fields (start/end date, planned_week/month, review_date, backburner, orbit, sections) are settable even when the strategy is disabled, and the backburner/start_date interaction in the schema aligns with the description's note that scheduling trumps the flag. Useful, though not comprehensive 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?
Opens with a specific verb+resource+endpoint: 'Update fields on an existing TASK via /doc/update'. It immediately distinguishes itself from siblings by naming update_category_or_project, set_priority, and mark_done and stating what those handle instead. An agent can route correctly without opening any 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?
Explicit when/not and alternatives: categories/projects go to update_category_or_project, priority to set_priority, completion to mark_done ('never here'). It also carves out recurring-task recurrence editing as forbidden and restricts simple field edits to single instances, which is a real usage boundary.
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.
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 37 tools
Most tools have clear distinct purposes, but there is semantic overlap: update_task vs set_priority (explicitly warns to use set_priority for priority), mark_done vs update_task, and create_category_or_project vs convert_category_or_project. The descriptions are exceptionally detailed and often clarify boundaries, preventing lower scoring, but an agent must read carefully to avoid misselection.
The vast majority follow a consistent snake_case verb_noun pattern (get_*, create_*, update_*, delete_*, mark_done, unmark_done, start_tracking, stop_tracking). A couple of deviations like 'mark_done' (verb without explicit object) and 'test_connection' are minor and readable.
37 tools is heavy for a task-management API integration. While the domain is broad (tasks, projects, categories, habits, rewards, time tracking, calendar, reminders), many tools could be consolidated (e.g., separate getters for today, due, done, children), and the count strains the 'well-scoped' ideal.
The surface covers a large portion of the domain with CRUD for tasks, categories/projects, time tracking, rewards, reminders, habits, and read operations for various views. Some gaps exist (e.g., no dedicated tool to set task time/reminder fields, no batch operations), but agents can work around most missing operations via update_task or other tools.
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.90 npm85MIT
- 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-