Skip to main content
Glama
andreasd083

amazing-marvin-complete-mcp

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

test_connection, create_task, mark_done, unmark_done, update_task, set_priority, delete_task

Reading

get_today_items, get_due_items, get_done_items, get_children, get_categories

Structure

create_category_or_project, update_category_or_project, convert_category_or_project (experimental)

Habits

list_habits, get_habit, record_habit

Time blocks

get_today_time_blocks, create_time_block (experimental)

Time tracking

get_tracked_item, start_tracking, stop_tracking, get_time_tracks

Kudos/rewards

get_kudos, claim_reward_points, unclaim_reward_points, spend_reward_points, reset_reward_points

Misc

get_labels, get_goals, get_reminders, set_reminder, delete_reminder, create_event (experimental), get_account_info, get_rate_limit_status

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 below

Local (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-mcp

The 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 /habits does 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 (only habitId + history). Use ?raw=1 (Full Access Token) to list actual habit documents. GET /habit?id=… returns the tracking record — history but no title.

  • POST /updateHabit rejects integers serialized as floats: "value": 1.0 → 400 Bad request, "value": 1 → 200. Send ints as ints.

Tasks & projects

  • POST /markDone works for tasks only — projects get 400 "Can only mark Tasks done with this API".

  • By default /addTask parses some of Marvin's quick-add shortcut syntax server-side: ~15 becomes a 15-minute timeEstimate, +YYYY-MM-DD sets day (scheduling — not the deadline) and *p1..*p3 set priority. All three are stripped from the title. Note the priority mapping is inverted relative to the stored field: *p1 (highest) → isStarred: 3, *p22, *p3 (lowest) → isStarred: 1. The other magic words (*urgent, *fire, *heavy, *weight, *love, *lowfocus, *physical) and $-words (e.g. $MONTH on 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 #word in the title (a ticket reference like #123 included) is stored literally as parentId (greedy up to the first hyphen, e.g. #MCP-TESTparentId: "#MCP" and a corrupted title) without resolving any ID — even overriding an explicitly supplied parentId in 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_task sends the undocumented X-Auto-Complete: false header (added in MarvinAPI#50), which disables all shortcut parsing — titles are stored verbatim, and the time_estimate_minutes parameter replaces the ~15 shortcut (timeEstimate is milliseconds: 15 min = 900000).

  • /addProject has the same #word corruption bug but ignores the X-Auto-Complete header (live-tested: the title is stripped and parentId corrupted 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.

  • /addEvent is unaffected (live-tested 2026-08-25): event titles with #word are stored verbatim, with and without the header — the quick-add parsing bug exists only in /addTask and /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 /todayItems until the app has been running.

  • /doc/update can 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/update returns 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/endDate are ignored by /addTask and /addProject (live-tested 2026-08-29) — they can only be set afterwards via /doc/update (the update tools). /addProject also ignores color/icon (set them via update_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, see set_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"), not isStarred like tasks (live-tested 2026-08-29) — which is why set_priority is 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 as isStarred: -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_task accept -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's day, not on doneAt, and a past day survives completion both in the app and via /markDone (the app sets day to today only on unscheduled and future-dated tasks). get_done_items therefore fetches the date plus a 7-day lookback window and filters on doneAt; 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, flagged incomplete/days_missing. Single completed tasks can also be read with /doc?id=. /todayItems, /dueItems and /children exclude completed items; /doneTasks and /completedItems are 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/delete responds 200 even for IDs that never existed or are already deleted — idempotent, no 404 (unlike /doc/update). /markDone on 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 under unassigned (live-tested 2026-08-29). /todayItems?date=X returns all open items with day <= X, not just day X (live-tested 2026-09-11, rollover enabled). /markDone stops running time tracking and now also writes task.times (live-tested 2026-09-02; it did not on 2026-08-29 — server behavior changed). A direct /track STOP still does not write times; there /tracks is the only record.

  • orbit/noAutoOrbit are 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, createdAt and 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 clears day/dueDate/priority/isFrogged and leaves firstScheduled behind (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_project is lossless by default since 1.5.0; pass clear_project_fields=True for a clean category (the previous values are returned in removed_project_fields). There is no official conversion endpoint — the tool sets type directly, which is undocumented server behavior and marked experimental.

  • /doc/create does not echo back a server-generated _id — supply your own if you need to reference the document afterwards.

  • Deletion via /doc/delete is 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/plannedMonth with 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_children on 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 with get_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. /kudos lacks nextMultiplier (MarvinAPI issue #5) — it's in /me.

  • /markDone does not award a task's reward points (cf. issue #6 for kudos) — claimRewardPoints is a separate call.

  • A MANUAL claim (itemId: "MANUAL") cannot be undone: the server stores no entry for it, so /unclaimRewardPoints returns 404 "No such entry" (with or without a points field), and claiming negative points is rejected with 400. The Marvin web app never uses MANUAL — it is an API-only facility. The only compensation is spending the same amount, which inflates the spent statistics.

  • /spendRewardPoints returns 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: /rewards and every variant 404, no rewards profile documents, and /doc needs an ID you can't discover). The Task field isReward is 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 (type M) are the safe use of the API. (Risk first documented by Recon2026/marvin-mcp; confirmed by the official wiki's own warning.)

Time & planning

  • /todayTimeBlocks omits the block↔category link (issue #65); this server recovers the mapping from the strategySettings.plannerSmartLists profile document.

  • Stopping time tracking via the API does not update the task's own times/duration fields; /tracks is the source of truth.

  • Calendar events created via /addEvent sync 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.

  • backburner is only effective on unscheduled items: scheduling (day) trumps the flag in the UI. Set day: "unassigned" together with backburner: true.

  • startDate hides 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 timeEstimate renders 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.

  • timeBlockSection is stored but shows no visible section link in Today.

  • reviewDate shows 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 noAutoOrbit is 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_project still type-checks and blocks them, for a structural reason: a category is never completed, so those fields belong to projects and tasks. labelIds is 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), so label_ids is 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 #Category shortcut 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 /addTask parses shortcut syntax server-side (partly confirmed, partly refuted — see the #Category finding), and the idea of MCP tool annotations.

Built with Claude Code (Claude Fable 5).

License

MIT.

Available Tools

37 tools
claim_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD; omit for today (server timezone)
pointsYesNumber of points to award
item_idYesTask ID, or 'MANUAL' for a manual point award

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_projectA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesTarget type to convert to
item_idYesID of the project/category to convert (from get_categories)
clear_project_fieldsNoOnly 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoProjects ONLY: schedule on YYYY-MM-DD or 'today' (blocked for categories — a category is never completed)
frogNoProjects ONLY: frog marker 1=normal, 2=baby, 3=monster
iconNoIcon 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)
kindYesKind
noteNoNote
colorNoColor '#rrggbb'. Categories ONLY at creation — /addProject ignores the field (verified live 2026-08-29); set project color with update_category_or_project afterwards
titleYesName
due_dateNoProjects ONLY: deadline YYYY-MM-DD (blocked for categories — a category is never completed)
priorityNoProjects 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_idsNoLabel 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_idNoID of the parent category, or 'root' for the top levelroot
review_dateNoReview date YYYY-MM-DD (Review Date strategy)
planned_weekNoPlan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy; mainly projects)
planned_monthNoPlan into a month: YYYY-MM (Planning Ahead strategy; mainly projects)
time_estimate_minutesNoTime 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoNote (markdown)
titleYesEvent title
start_isoYesStart time, ISO 8601 with timezone, e.g. 2026-08-20T14:30:00+02:00
length_minutesYesLength in minutes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoSchedule on date YYYY-MM-DD, 'today', or 'unassigned' (= unscheduled, same as omitting). Same rules as update_task.
frogNoFrog marker 1=normal, 2=baby, 3=monster
noteNoNote (markdown)
titleYesTask title
due_dateNoDeadline YYYY-MM-DD (use sparingly)
priorityNoPriority (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_rewardNoDocumented 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_idsNoLabel IDs (from get_labels)
parent_idNoID 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
backburnerNoTrue = 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_dateNoReview date YYYY-MM-DD (Review Date strategy)
planned_weekNoPlan into a week: the week's Monday YYYY-MM-DD (Planning Ahead strategy)
bonus_sectionNo'Essential' or 'Bonus' (bonusStructure strategy)
daily_sectionNoDay section: 'Morning', 'Afternoon' or 'Evening' (dailyStructure strategy)
planned_monthNoPlan into a month: YYYY-MM (Planning Ahead strategy)
reward_pointsNoReward 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_sectionNoID of a custom section from strategySettings.customStructure (customStructure strategy)
time_block_sectionNoTime 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_minutesNoTime estimate in minutes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate YYYY-MM-DD
titleYesBlock name, e.g. 'Morning'
start_timeYesStart time HH:mm (local time)
duration_minutesYesLength in minutes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reminderA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reminder_idsYesIDs of reminders to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_taskA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesID of the document to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_infoA
Read-only

Get account info (/me): email, tracking status, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_categoriesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_childrenA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_idYesCategory/project ID, 'unassigned' for the Inbox, or 'root' for the top level

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_itemsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD on which tasks were completed (configured timezone); omit for today
lookback_daysNoDays 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_itemsA
Read-only

Get open tasks/projects with a deadline today or earlier.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNoDeadline up to and including YYYY-MM-DD; omit for today

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_goalsA
Read-only

Get all goals with status and check-in data.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_habitA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
habit_idYesHabit ID (from list_habits)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_kudosA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_labelsA
Read-only

Get all labels (for label_ids when creating/filtering).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_statusA
Read-only

Show how many Marvin API calls have been made today (budget 1440/day, shared by all tools).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_remindersA
Read-only

Get all server-side reminders (push notifications to the phone). Requires the Full Access Token.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_tracksA
Read-only

Get time-tracking history for the given tasks (the source of truth, max 100 per call).

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idsYesUp to 100 task IDs

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_itemsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD; returns everything open with day <= the date; omit for today (MARVIN_TIMEZONE, else the system timezone)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_blocksA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD; omit for today (server timezone)
include_category_mappingNoAlso look up the block→category/smartlist mapping (1 extra API call, requires Full Access Token)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_itemA
Read-only

Show which task is currently being time-tracked (if any).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_habitsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_doneA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesTask ID (NOT a project — see description)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
undoNoTrue to undo the latest recording instead
valueNoValue to record (1 for boolean habits)
habit_idYesHabit ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_pointsA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_priorityA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frogNoFrog: 3=monster, 2=baby, 1=normal, 0=remove
item_idYesTask ID
priorityNoPriority (isStarred): 3=Most important/red, 2=Very important/orange, 1=Important/yellow, -1=Low priority (down arrow), 0=remove

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesText shown in the notification (max 200 chars)
reminder_idNoCustom ID; randomized otherwise. Do NOT use a task ID here — see description.
time_unix_secondsYesUnix time (seconds) for the reminder

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD; omit for today (server timezone)
pointsYesNumber of points to spend

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_trackingB
Idempotent

Start time tracking for a task.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesTask ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_trackingA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesTask ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_connectionA
Read-only

Test authentication against Marvin's API. Returns OK if the apiToken works.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_pointsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD; omit for today (server timezone)
item_idYesTask ID whose award should be undone (determines the point amount). 'MANUAL' is NOT supported — see description.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_doneA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesTask ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_projectA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoProjects ONLY: schedule YYYY-MM-DD, 'today', or 'unassigned' to unschedule
frogNoProjects ONLY: frog 3=monster, 2=baby, 1=normal, 0=remove
iconNoIcon 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)
noteNoNew note (replaces the existing one)
colorNoColor '#rrggbb', '' removes
orbitNoOrbit strategy: True = put in orbit (verified in the app 2026-08-29 on tasks: Orbit view + icon in Today). UNDOCUMENTED field
titleNoNew title
item_idYesID of the category/project (from get_categories)
due_dateNoProjects ONLY: deadline YYYY-MM-DD, '' removes
end_dateNoSoft deadline YYYY-MM-DD (Start & End Dates strategy), '' removes
priorityNoProjects 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_idsNoNew 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_idNoMove to parent category ID, or 'root'
backburnerNoTrue = 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_dateNoStart date YYYY-MM-DD (Start & End Dates strategy), '' removes
review_dateNoReview date YYYY-MM-DD (Review Date strategy), '' removes
planned_weekNoPlan 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_orbitNoOrbit strategy: True = exempt from automatic orbiting. UNDOCUMENTED field (bool type verified in live data 2026-08-29)
planned_monthNoPlan 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_scheduledNoThe 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_minutesNoTime 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_taskA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoSchedule on YYYY-MM-DD, 'today', or 'unassigned' to unschedule
noteNoNew note (replaces the existing one)
orbitNoOrbit 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)
titleNoNew title
item_idYesTask ID
due_dateNoDeadline YYYY-MM-DD, or '' to remove
end_dateNoSoft deadline YYYY-MM-DD (Start & End Dates strategy), '' removes
label_idsNoNew labels (IDs from get_labels; replaces existing ones, [] removes all)
parent_idNoMove 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)
backburnerNoTrue = 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_dateNoStart 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_dateNoReview 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_weekNoPlan 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_sectionNo'Essential' or 'Bonus' (bonusStructure strategy), '' removes
daily_sectionNoDay section 'Morning'/'Afternoon'/'Evening' (dailyStructure strategy), '' removes
no_auto_orbitNoOrbit 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_monthNoPlan into a month: YYYY-MM (Planning Ahead strategy, verified in the app 2026-08-29), '' removes
reward_pointsNoReward 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_sectionNoID of a custom section from strategySettings.customStructure, '' removes
perma_snooze_timeNoHide the task every day until HH:mm (permaSnoozeTime), '' removes. Verified in the app 2026-08-29
time_block_sectionNoTime 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_msNoSnooze 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_minutesNoTime estimate in minutes, 0 removes it

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 5 tool updatesv1.6.0
    • Changedcreate_category_or_project3 fields changed
      • changedInput schema / properties / day / description
        Previous 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)"
      • changedInput schema / properties / due_date / description
        Previous 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)"
      • changedInput schema / properties / label_ids / description
        Previous 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)"
    • Changedcreate_task1 field changed
      • changedInput schema / properties / day / description
        Previous 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."
    • Changedget_today_items1 field changed
      • changedInput schema / properties / date / description
        Previous 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)"
    • Changedupdate_category_or_project3 fields changed
      • changedInput schema / properties / label_ids / description
        Previous 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)"
      • changedInput schema / properties / planned_month / description
        Previous 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)"
      • changedInput schema / properties / planned_week / description
        Previous 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)"
    • Changedupdate_task1 field changed
      • changedInput schema / properties / planned_week / description
        Previous 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"
  2. 3 tool updatesv1.4.2
    • Changedconvert_category_or_project1 field changed
      • addedInput schema / properties / clear_project_fields
        Added 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"
        +}
    • Changedcreate_task1 field changed
      • changedInput schema / properties / parent_id / description
        Previous 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"
    • Changedupdate_task1 field changed
      • changedInput schema / properties / parent_id / description
        Previous 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)"
  3. 6 tool updatesv1.4.0
    • Changedcreate_category_or_project1 field changed
      • changedInput schema / properties / priority / description
        Previous 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)"
    • Changedcreate_task3 fields changed
      • changedInput schema / properties / parent_id / description
        Previous 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)"
      • changedInput schema / properties / priority / anyOf
        Previous value: -[
        -  {
        -    "maximum": 3,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 3,
        +    "minimum": -1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / priority / description
        Previous 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"
    • Addedget_done_items
    • Changedset_priority2 fields changed
      • changedInput schema / properties / priority / anyOf
        Previous value: -[
        -  {
        -    "maximum": 3,
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 3,
        +    "minimum": -1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / priority / description
        Previous 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"
    • Changedupdate_category_or_project1 field changed
      • changedInput schema / properties / priority / description
        Previous 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)"
    • Changedupdate_task1 field changed
      • changedInput schema / properties / parent_id / description
        Previous 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)"
  4. 36 tool updatesv1.3.0
    • First observedclaim_reward_points
    • First observedconvert_category_or_project
    • First observedcreate_category_or_project
    • First observedcreate_event
    • First observedcreate_task
    • First observedcreate_time_block
    • First observeddelete_reminder
    • First observeddelete_task
    • First observedget_account_info
    • First observedget_categories
    • First observedget_children
    • First observedget_due_items
    • First observedget_goals
    • First observedget_habit
    • First observedget_kudos
    • First observedget_labels
    • First observedget_rate_limit_status
    • First observedget_reminders
    • First observedget_time_tracks
    • First observedget_today_items
    • First observedget_today_time_blocks
    • First observedget_tracked_item
    • First observedlist_habits
    • First observedmark_done
    • First observedrecord_habit
    • First observedreset_reward_points
    • First observedset_priority
    • First observedset_reminder
    • First observedspend_reward_points
    • First observedstart_tracking
    • First observedstop_tracking
    • First observedtest_connection
    • First observedunclaim_reward_points
    • First observedunmark_done
    • First observedupdate_category_or_project
    • First observedupdate_task

TDQS

A3.7/5.0

Scored across 37 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers