Skip to main content
Glama
andreasd083

amazing-marvin-complete-mcp

amazing-marvin-complete-mcp

一个用于 Amazing Marvin 的 MCP(Model Context Protocol)服务器,完整覆盖公共 API:34 个工具覆盖全部 ~31 个已记录端点,一个尊重 Marvin 文档限制的全局速率限制器,最小权限令牌路由,以及 MCP 工具注解。工具描述中每一个不明显的非平凡行为声明都已针对实时 API 验证——相关发现记录在下面的 Marvin API 怪癖与发现 中,即使你从不运行此服务器,这些内容也可能有用。

按原样提供。 此项目未积极维护,也不提供支持。Issue 被有意禁用。欢迎 fork——它是 MIT 许可的。

工具(34)

分组

工具

核心

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

读取

get_today_items, get_due_items, get_children, get_categories

结构

create_category_or_project

习惯

list_habits, get_habit, record_habit

时间块

get_today_time_blocks, create_time_block(实验性)

时间追踪

get_tracked_item, start_tracking, stop_tracking, get_time_tracks

声望/奖励

get_kudos, claim_reward_points, unclaim_reward_points, spend_reward_points, reset_reward_points

其他

get_labels, get_goals, get_reminders, set_reminder, delete_reminder, create_event(实验性), get_account_info, get_rate_limit_status

有意不包含:智能列表 / 任务挑选逻辑。Marvin 自己的 Spotlight 负责挑选;服务器为你的助手提供双手,而不是观点。

每个工具都带有 MCP 工具注解(readOnlyHint、destructiveHint、idempotentHint、openWorldHint),以便有能力的客户端能够以应有的谨慎对待 delete_task 和 reset_reward_points。

Related MCP server: Super-Productivity-MCP

获取你的 Marvin 令牌

两个令牌都位于 Amazing Marvin 的 设置 → API(app.amazingmarvin.com/pre?api)下:

  • API 令牌(MARVIN_API_TOKEN,必需)——受限访问;足以读取和创建任务。

  • 完全访问令牌(MARVIN_FULL_ACCESS_TOKEN,可选但推荐)——所有基于 /doc* 的工具都需要:update_task、set_priority、unmark_done、delete_task、类别创建、时间块、list_habits、提醒、reset_reward_points。

像对待密码一样对待它们;参见 SECURITY.md。

安装与运行

需要 Python 3.12+。

git clone <this repo> && cd amazing-marvin-complete-mcp
python -m venv .venv && .venv/bin/pip install .

本地(stdio)——Claude Desktop、Claude Code、任何 MCP 客户端

默认传输是 stdio,因此客户端自行启动服务器:

{
  "mcpServers": {
    "amazing-marvin": {
      "command": "/path/to/.venv/bin/marvin-mcp",
      "env": {
        "MARVIN_API_TOKEN": "…",
        "MARVIN_FULL_ACCESS_TOKEN": "…",
        "MARVIN_TIMEZONE": "Europe/Stockholm"
      }
    }
  }
}

(对于 Claude Code:claude mcp add amazing-marvin -e MARVIN_API_TOKEN=… -- /path/to/.venv/bin/marvin-mcp。)

远程(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

MCP 端点是 /mcp。内置的 bearer 检查(MCP_AUTH_TOKEN)保护每个路径,但这只是内部屏障,并非完整的身份验证方案:请在前面放置带 TLS 的反向代理,对于 Claude 自定义连接器,请使用支持 OAuth 2.1 的 MCP 身份验证代理。包含用于 HTTP 模式的 Dockerfile(以非 root 用户运行;将卷挂载到 /data 以在重启后保留每日速率限制计数器)。

配置

所有设置均通过环境变量进行——参见 .env.example 获取完整的带注释列表。重点:每个机密都支持 *_FILE 变体(推荐);MARVIN_TIMEZONE 应与你的 Marvin 账户所在的时区匹配(默认为系统时区,在大多数容器中为 UTC)。

速率限制

Marvin 的文档限制——1 次写入/秒、1 次读取/3 秒、1440 次调用/天——由所有工具和会话共享的单个进程级队列强制执行,并留有裕量(1.1 秒 / 3.1 秒)。每日计数器在重启后保留(STATE_DIR),并在配置时区的午夜重置。get_rate_limit_status 显示今天的用量。

Marvin API 怪癖与发现

以下所有内容均于 2026-08-19 针对实时 API 验证。这是本仓库中你无需运行即可使用的一半内容。

习惯

  • 非原始 GET /habits 不会读取你的习惯文档。它读取的是服务器端跟踪注册表,该注册表是在首次记录时惰性创建的——从未被记录的习惯会完全从响应中缺失,且条目不包含标题(只有 habitId + 历史记录)。使用 ?raw=1(完全访问令牌)列出实际的习惯文档。GET /habit?id=… 返回跟踪记录——有历史记录但没有标题。

  • POST /updateHabit 拒绝序列化为浮点数的整数:"value": 1.0 → 400 错误请求,"value": 1 → 200。请以整数形式发送整数。

任务与项目

  • POST /markDone 仅适用于任务——项目会收到 400 "Can only mark Tasks done with this API"。

  • /addTask 在服务器端解析 Marvin 的快速添加快捷语法:~15 变为 15 分钟的 timeEstimate,+YYYY-MM-DD 设置 day(计划——不是截止日期)。两者都会从标题中剥离。但切勿通过 API 使用 #Category:服务器会将字符串按字面存储为 parentId(贪婪匹配到第一个连字符,例如 #MCP-TEST → parentId: "#MCP" 和损坏的标题),而不会解析任何 ID。该任务随后会存在于每个类别和收件箱之外——实际上不可见。(首次由 lucasoeth/marvin-mcp 报告;此处独立复现。)

  • 重复任务的生成实例具有确定性的 ID(YYYY-MM-DD_<recurringTaskId>),这就是为什么通过 API 将它们标记为完成/未完成不会产生重复项。实例由 Marvin 客户端生成,因此在应用运行之前,今天的重复任务可能会从 /todayItems 中缺失。

  • /doc/update 偶尔会返回瞬时 500;写入是原子的(无部分状态)——只需重试。项目重命名、移动、标签更改等都可以通过它完成。

  • /doc/create 不会回显服务器生成的 _id——如果你之后需要引用该文档,请自行提供。

  • 通过 /doc/delete 删除是永久性的;Marvin 的回收站是客户端行为。

奖励积分与声望

  • 声望(XP/等级,通过 /kudos 读取)和奖励积分(领取/取消领取/花费/重置)是两个独立的系统。/kudos 缺少 nextMultiplier(MarvinAPI issue #5)——它在 /me 中。

  • /markDone 不会奖励任务的奖励积分(关于声望请参见 issue #6)——claimRewardPoints 是单独的调用。

  • MANUAL 领取(itemId: "MANUAL")无法撤销:服务器不会为其存储任何条目,因此 /unclaimRewardPoints 返回 404 "No such entry"(无论是否带有 points 字段),而领取负积分会被 400 拒绝。Marvin Web 应用从不使用 MANUAL——它是仅限 API 的功能。唯一的补偿是花费相同金额,但这会夸大已花费统计。

  • 如果余额将为负,/spendRewardPoints 会返回 500。

提醒

  • Marvin 中的任务提醒是两次写入,只有应用才能保持同步:任务文档上的提醒字段(taskTime、reminderTime、reminderOffset、snooze、autoSnooze)以及通过 /reminder/set 的服务器端条目。只写入一侧(API 让你轻松做到的)会产生应用 UI 不会在任务上显示的条目,或服务器端孤立条目。独立提醒(类型 M)是 API 的安全用法。(风险首先由 Recon2026/marvin-mcp 记录;官方 wiki 自己的警告也证实了这一点。)

时间与计划

  • /todayTimeBlocks 省略了块↔类别链接(issue #65);此服务器从 strategySettings.plannerSmartLists 配置文档中恢复映射。

  • 通过 API 停止时间跟踪不会更新任务自身的 times/duration 字段;/tracks 是事实来源。

  • 通过 /addEvent 创建的日历事件仅在 Marvin 应用在某个地方运行时才会继续同步(客户端日历同步)。

与现有替代方案的区别

存在几个不错的 Amazing Marvin MCP 服务器;本服务器是在研究它们之后全新构建的(无共享代码),目标不同——完整覆盖公共 API,而不是精选子集:

  • bgheneti/Amazing-Marvin-MCP——成熟的 Python 服务器;覆盖广泛但不完整,没有全局速率限制。

  • Recon2026/marvin-mcp——范围较小(19 个工具),研究异常仔细;选择将提醒设为只读以避免两次写入风险。此服务器改为在明确警告的情况下提供提醒写入。

  • lucasoeth/marvin-mcp——不同的理念:少量整合的工作流工具(brief/capture/…)而不是 API 镜像,外加直接 CouchDB 读取以支持搜索和已完成任务(公共 API 完全无法做到)。如果你想要有主见的工作流或搜索,请使用他们的;如果你想要原始、完整且记录了尖锐边缘的 API 访问,请使用本服务器。

  • LucaDeLeo/amazing-marvin-mcp——Limited-API 子集。

致谢与来源

没有从这些项目中复制任何代码——构建是全新的——但它们对项目产生了实质性影响:

  • amazingmarvin/MarvinAPI(+ wiki)——本服务器所依据的官方 API 文档、OpenAPI 规范、数据类型和问题跟踪器。

  • bgheneti/Amazing-Marvin-MCP——架构灵感、初始差距分析期间的端点参考,以及 MIT 许可先例。

  • Recon2026/marvin-mcp——提醒两次写入完整性风险以及重复任务实例的基础工作,均已在此验证和记录。

  • lucasoeth/marvin-mcp——#Category 快捷方式错误(此处已复现)以及 Marvin 的同步数据库是可用于读取的真实 CouchDB 的见解。

  • LucaDeLeo/amazing-marvin-mcp——/addTask 在服务器端解析快捷方式语法的提示(部分确认,部分反驳——参见 #Category 发现),以及 MCP 工具注解的想法。

使用 Claude Code(Claude Fable 5)构建。

许可证

MIT。

Available Tools

50 tools
claim_reward_pointsA

Award reward points for a completed task or manually. Note: mark_done does not award a task's rewardPoints automatically through the API (cf. issue #6 about kudos) — call this tool separately afterwards. WARNING: a MANUAL award CANNOT be undone through the API (verified live 2026-08-19: unclaim returns 404, negative points are rejected with 400). The only compensation is spend_reward_points for the same amount (which however inflates the spent statistics) — award MANUAL points thoughtfully.

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.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide generic flags; the description adds crucial behavioral detail: manual awards cannot be undone through the API, unclaim returns 404, negative points are rejected with 400, and compensating via spend_reward_points inflates spent statistics. This is meaningful context beyond what annotations or schema provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loads purpose before caveats. The issue reference and verification date add credibility, though they make the description slightly more verbose than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Together with the full schema and output schema, the description covers the key decision points: when to call this tool, what happens after mark_done, and the irreversible nature of manual awards. No critical invocation detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description reinforces the significance of item_id='MANUAL' and positive point values but does not introduce new parameter-level details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Award') and resource ('reward points for a completed task or manually'). It clearly distinguishes itself from siblings like spend_reward_points and unclaim_reward_points by scoping what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to call this tool: after mark_done, because mark_done does not automatically award reward points. It also warns that manual awards are irreversible and names the only compensation path, spend_reward_points, giving clear context for choosing alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_category_or_projectA
Idempotent

Convert a project to a category or back, in place and losslessly. EXPERIMENTAL: Convert project→category or category→project IN PLACE via /doc/update (Full Access Token; there is no official conversion endpoint, and this relies on undocumented server behavior that Marvin could change). Same _id, createdAt and children remain — conversion is a pure type change (verified against the live API 2026-08-29: the server accepts and persists the change in both directions, and the app renders correctly after an API-set change). LOSSLESS BY DEFAULT (since 1.5.0): only type is changed — the same semantics as the app's correct conversion path (the right-click/hover menu, verified as a lossless round trip 2026-08-30: all project fields incl. firstScheduled preserved through project→category→project). Project fields remaining on the category are then intentional round-trip data; the type guard in update_category_or_project only prevents NEW project fields from being written to it. If you want a clean category for a permanent conversion: set clear_project_fields=True (mimics the app's Edit Settings path — a bug in their tracker; also clears firstScheduled, which that path otherwise leaves behind) and receive the values in removed_project_fields. Note: the app's correct path (right-click/hover) is not in the menu by default — it is added via the gear icon directly in the right-click menu → Add action (app-verified 2026-08-31), so unmodified apps only show the buggy path. Do NOT convert a category that contains subcategories into a project — projects cannot contain categories (risk of orphans/cycles; check get_children first).

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.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description goes well beyond these: it discloses that the tool relies on undocumented server behavior via /doc/update, that conversion is a pure type change preserving _id/createdAt/children, that project fields may remain on categories as intentional round-trip data, and that clear_project_fields=True clears specific fields and returns them in removed_project_fields. It also flags the risk of orphans/cycles. This is rich behavioral context that annotations alone do not provide, and it does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, experimental risk, lossless semantics, the clean-category option, app-path context, and a critical safety warning. It is front-loaded with the core purpose and the most important caveat (EXPERIMENTAL). It is longer than average, but the complexity of the tool justifies the length; minor redundancy exists around the app's correct path being mentioned twice.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

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, the 100% schema coverage, and the presence of an output schema, the description is complete. It covers the conversion direction, the undocumented endpoint risk, the lossless behavior, the clean-category alternative, the subcategory safety constraint, and the verification date. An agent has everything needed to decide whether and how to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains the lossless default behavior, what clear_project_fields=True actually clears (day/dueDate/priority/isFrogged/firstScheduled), the relationship to the app's buggy Edit Settings path, and the return of removed_project_fields. It also clarifies that item_id comes from get_categories. This elevates the parameter guidance above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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: 'Convert a project to a category or back, in place and losslessly.' It clearly distinguishes the tool's bidirectional conversion behavior and immediately contrasts with the sibling update_category_or_project by explaining the type-change semantics. The experimental caveat and lossless-by-default detail further sharpen what this tool uniquely does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: use for in-place type conversion, and explicitly warns 'Do NOT convert a category that contains subcategories into a project' with a reason (orphans/cycles) and a check to perform first (get_children). It also explains when to set clear_project_fields=True versus the default lossless path, and notes the app's correct path is not in the menu by default. This is thorough routing and exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_category_or_projectA

Create a category or project with color, icon, labels and note. Create a category (via /doc/create, Full Access Token) or a project (via /addProject). Categories can contain categories; projects cannot. day/due_date/priority/frog are rejected for kind='category' for a structural reason, not a technical one: a category can never be completed or checked off, and deadline, scheduling, priority and frog belong to things that can be finished — projects and tasks. The API accepts the fields on categories (live-tested 2026-09-11) but they are not meaningful there (rule 2026-09-11). label_ids applies to both categories and projects. startDate/endDate cannot be set at creation (/addProject ignores them, verified live 2026-08-29) — use update_category_or_project afterwards.

Note: project titles must not contain '#word' — /addProject has the same corruption bug as /addTask (the string is stored unresolved as parentId and the project becomes invisible) but ignores the X-Auto-Complete header (verified against the live API 2026-08-20), so the client blocks it locally before any API call. Category titles are unaffected (/doc/create parses nothing).

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoProjects ONLY: schedule on YYYY-MM-DD or 'today' (blocked for categories — a category is never completed)
frogNoProjects ONLY: Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level)
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. Rendered directly on categories; on projects only when Master List → Configure View → 'Show Custom Icon On' includes projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong)
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. The project's own estimate takes precedence; without one the project shows the sum of its children's (per Marvin support)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring non-readOnly, non-destructive and non-idempotent, the description adds genuinely new behavior: the category path requires a Full Access Token via /doc/create, project titles containing '#word' are blocked locally by the client before any API call because of an /addProject corruption bug, and /addProject silently ignores color and startDate/endDate. These are exactly the silent-failure disclosures an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, but the prose is bloated with parenthetical verification dates ('live-tested 2026-09-11', 'verified live 2026-08-29') and restates constraints that already appear in the schema descriptions, such as the color and day/due_date restrictions. The startDate/endDate paragraph discusses fields that are not parameters of this tool, adding noise.

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?

An output schema exists, so return values need not be explained. For a 15-parameter mutation tool with rich annotations, the description covers auth requirements, silent-ignores, and a local validation block, leaving only minor gaps (e.g., what happens on an invalid kind/field combination).

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 schema already carries the per-parameter meaning, and much of the description's field commentary (color Categories ONLY, day/due_date blocked for categories, label_ids applies to both) duplicates it nearly verbatim. The description adds little parameter meaning beyond the schema, so the baseline 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 opening sentence states a specific verb (Create) and the two resources (category or project) along with the fields it accepts. It also makes the structural distinction between the two kinds explicit (categories can contain categories; projects cannot), which lets an agent tell this apart from create_task and update_category_or_project 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?

It gives real routing guidance: use update_category_or_project afterwards for startDate/endDate, since /addProject ignores them at creation, and it explains why certain fields (day/due_date/priority/frog) are rejected for kind='category'. It never contrasts with create_task for task creation, so it stops short of fully explicit when/when-not/alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_eventA

Create a calendar event (experimental), synced by the app. EXPERIMENTAL: Create a calendar event. Calendar sync happens in the client — the Marvin app must be running on some device for the event to sync onwards to an external calendar.

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?

Annotations already indicate this is a mutating, non-idempotent operation, but the description adds meaningful context beyond those flags: the feature is experimental, sync is client-side, and the event will not sync onward unless the Marvin app is running. This is useful behavioral information that annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is short and front-loads the experimental warning, but it repeats the same information: 'Create a calendar event (experimental)' is immediately followed by 'EXPERIMENTAL: Create a calendar event.' The redundancy prevents it from being as tight and efficient as it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With complete parameter documentation and an output schema available, the description covers the one critical piece of context that could surprise an agent: the dependency on a running client app for external calendar sync. It does not mention alternative behavior or failure modes, but the structured data covers the remaining essentials.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and each parameter already has an explicit description, including an ISO 8601 example for start_iso and minimum constraints for length_minutes. The tool description adds no extra parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a direct action ('Create') on a defined resource ('calendar event') and marks it as 'experimental.' It clearly distinguishes this from sibling tools like create_task and create_time_block by specifying the calendar-event context and external-calendar sync. No ambiguity remains about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear operational prerequisite: the Marvin app must be running on some device for the event to sync to an external calendar. However, it does not compare this tool with siblings such as create_time_block, nor does it state when to prefer or avoid this tool. Usage is mostly implied by the resource name and purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_notebookA

Create a standalone notebook, optionally with sections. A notebook for a project or category is not created here: it comes into being when a page is moved there (update_notebook_page move_to_parent_id) or when a second page is added in the app. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe notebook's name
sectionsNoSections to create (titles)

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?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description goes beyond them by disclosing that the tool relies on undocumented/experimental writes (/doc/create, /doc/update) and that the shape is pinned to app 1.71 — valuable fragility and reliability context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by the exclusion rule and then the experimental-writes caveat. It runs to three sentences but each carries distinct value; the technical note about undocumented endpoints 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?

With an output schema present, return values need not be explained, and annotations cover safety. The description adds the exclusion logic and reliability caveat, leaving little an agent would need to call it correctly, though the positive use-case trigger could be sharper.

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 both parameters (title, sections) are already documented in the schema. The description only echoes 'optionally with sections' and adds no format or syntax detail beyond the schema, so the baseline 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?

States a specific verb and resource ('Create a standalone notebook, optionally with sections') and explicitly scopes what it does not create. It distinguishes itself from create_category_or_project and the notebook-page tools without the reader needing to open 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 a clear when-not-to-use rule: project/category notebooks are not created here but come into being when a page is moved (update_notebook_page move_to_parent_id) or a second page is added. The alternative mechanism is named, though it doesn't spell out the positive trigger condition as crisply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_notebook_pageA

Create a page at the end of a notebook, optionally in a section. Own pg_ id, rank after the existing pages. '- ' at the start of a line is written as '* ' (code protection against the app deleting lists). Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoThe page's text (markdown, see list_capabilities.note_format)
titleYesThe page's title
section_idNoSection id to put the page in
notebook_idYesThe notebook's id (nb_...)

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?

Annotations already declare the mutation/non-idempotent/non-destructive profile, but the description adds meaningful context beyond them: the page ranks after existing pages, the '- ' to '* ' marker rewriting (list-deletion protection), and notably that it depends on undocumented, experimental endpoints matched against app 1.71. That fragility warning is genuinely valuable. It stops short of auth or error behavior.

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 core action and placement, then progressively discloses behavioral quirks and dependency risk. Four sentences, each carrying distinct information; only minor tightening possible.

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?

Output schema exists so return values need not be explained, and full schema coverage handles parameters. The description completes the mutation picture with ordering, text transformation, and endpoint fragility. Missing only ancillary details like required permissions or rate-limit context.

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 parameters (notebook_id, title, text, section_id) are already documented. The prose only loosely restates placement ('notebook', 'section') and adds no syntax or format detail beyond the schema, so the baseline 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?

States a specific verb and resource ('Create a page') plus precise placement scope ('at the end of a notebook, optionally in a section'). This clearly distinguishes it from siblings like create_notebook, update_notebook_page, and delete_notebook_page without needing to open 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 Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The placement semantics ('at the end of a notebook, optionally in a section') imply when this tool is appropriate versus adding elsewhere, but there is no explicit when-to-use vs alternatives routing (e.g., update_notebook_page). Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_recurring_taskA

Create a recurring task of any of the repeat dialog's eleven types. Written via /doc/create in the app's own shape, so every type shows correctly in the app's repeat dialog. Occurrences are created the first time a Marvin client opens after midnight, in the window today to today + Create occurrences — not immediately. Without create_occurrences the account's default applies. After completion: the tool writes the first occurrence on the start day, also when the start day is in the future. Custom accepts only an RRULE string (e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR'). New occurrences inherit label, priority, size, note, subtasks, sections and hard deadline (verified against the live API). Only on weekdays: a month day on a weekend is moved to Friday (documented for monthly, verified); every_x_days then counts in weekdays (inferred from a series; the documentation does not mention the type).

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoNote (markdown)
sizeNoSize XS-XL
titleYesTitle
customNocustom: an RRULE string, e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR'
repeatYesThe dialog's eleven types: daily, weekly (weekday), monthly (month_day), x_times_per_week (weekdays), every_x_days / every_x_weeks / every_x_months / every_x_years (interval), after_completion (after_days), on_off (on_days, off_days), custom (custom: an RRULE string, e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR')
ends_onNoStop repeating on YYYY-MM-DD
on_daysNoon_off: days on
weekdayNoweekly: weekday
intervalNoevery_x_*: interval
off_daysNoon_off: days off
priorityNoisStarred 3/2/1/-1
subtasksNoSubtasks (titles)
weekdaysNox_times_per_week: weekdays
label_idsNoLabel IDs
month_dayNomonthly: day of the month
parent_idNoCategory/project ID; omit for the Inbox
starts_onNoStarts on YYYY-MM-DD; defaults to today
after_daysNoafter_completion: days after completion
bonus_sectionNo'Essential' or 'Bonus'
daily_sectionNoDay section 'Morning'/'Afternoon'/'Evening'
only_weekdaysNoOnly on weekdays (Mon-Fri), only for the types the dialog offers it on. A month day on a weekend is moved to Friday (verified); every_x_days then counts in weekdays (inferred)
if_you_miss_oneNoIf you miss one; default = the account's setting
create_occurrencesNoCreate occurrences: default (the account's default) or 0/1/3/7/14/30 days ahead
hard_deadline_daysNoHard deadline: days after the occurrence's day

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the safety profile (readOnly=false, destructive=false, idempotent=false), and the description adds extensive behavior: occurrences are materialized when a client next opens after midnight rather than immediately, defaults apply when create_occurrences is omitted, first occurrence is written on the start day even if future, and inherited fields (label, priority, size, note, subtasks, sections, hard deadline) are enumerated and flagged as API-verified.

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 each paragraph carries distinct information about timing, inheritance, and weekend rules. It is dense but not padded, though the RRULE example and the only_weekdays caveat are near-duplicated from the schema, which is a minor redundancy rather than true waste.

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, return values need no explanation, and the description covers the tricky semantics an agent would otherwise get wrong: deferred occurrence creation, default fallbacks, parameter-type coupling, and weekend edge cases. Nothing required to call the tool correctly across its 24 parameters 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 baseline is 3, but the description adds real meaning: it maps each repeat enum value to its required companion parameter and to the dialog type, explains custom requires an RRULE string, and annotates only_weekdays edge behavior as 'verified' (weekend month-day moves to Friday) versus 'inferred' (every_x_days counting weekdays). This goes beyond restating schema 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?

The opening sentence states a specific verb (Create) and resource (recurring task) and bounds the scope to the app's eleven repeat-dialog types, which cleanly distinguishes it from create_task and update_recurring_task. An agent can identify what this produces 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 Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through the repeated framing of the in-app 'repeat dialog' and the note that omitting create_occurrences falls back to the account default, but the description never explicitly names an alternative (e.g. create_task for non-recurring items) or states when-not-to-use. The agent must infer routing from the pervasive dialog context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_taskA

Create a task with category, day, priority, size, time and reminders. The title is stored verbatim: the server's shortcut parsing is disabled (X-Auto-Complete: false), so '#Category', '~15', '*m' and '*p2' are NOT parsed — '#' in titles is safe. Use the parameters instead. startDate/endDate are set with update_task afterwards (/addTask ignores them). Size, subtasks, clock time and reminders are written in a second step with /doc/update and /reminder/set in the app's form; if a step fails the response says which ones were done (the task then already exists). A clock time requires day. Strategy-dependent fields (planned_week/month, review_date, backburner, reward_points, the sections) are stored even when the strategy is off in the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoSchedule on date YYYY-MM-DD, 'today', or 'unassigned' (= unscheduled, same as omitting). Same rules as update_task.
frogNoDread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level)
noteNoNote (markdown; '- ' at line start is written as '* ', see list_capabilities.note_format)
sizeNoSize XS/S/M/L/XL (taskSize 1-5). XS and XL can be disabled in the account. Written with /doc/update after creation (/addTask drops the field)
timeNoClock time HH:MM (requires a day). Writes the app's form: taskTime, title prefix 'HH:MM ', reminderTime and a server entry of type T — the app reminds at that time. '' removes the time (update_task)
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
subtasksNoSubtasks (titles), written after creation
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
remindersNoOwn reminders: 'HH:MM' on the task's day, or 'before:N' = N minutes before the clock time. Stored as the reminders list + one server entry of type M per reminder; before values are saved as an absolute time, as in the app. Without a day, today applies
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, or time_block_id from create_time_block). Points the task at a time block; the task then appears under that block's section in Today. Three conditions (verified in the app 2026-09-17, 1.70.0.0, PWA + desktop): (1) the Time Block Sections strategy is on, (2) the day view is grouped by time block (Group by → Group by time block section — set per device, not synced; help article 1950243), (3) the task is scheduled on the block's day (day ≤ that date) — an unscheduled task with the field set is stored but does not appear in Today at all. Without (2) no sections render and the field looks inert. The field is sufficient on its own: the block needs no label/category/smart list, and blocks from create_time_block behave like blocks created in the app. The block's own Smart Time Block mapping (label/category) is a second, independent route that catches matching tasks without this field. The section shows before the block's start time (after its end: untested). The field is not exposed in the app's task settings — the app sets it when a task is added directly inside a block section
time_estimate_minutesNoTime estimate in minutes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is not read-only, not idempotent and not destructive; the description goes well beyond them by disclosing that shortcut parsing is disabled (X-Auto-Complete: false), that size/subtasks/time/reminders are written in a second step via /doc/update and /reminder/set, and that a partial failure leaves a task that already exists with the response naming which steps succeeded. That partial-success semantics is exactly the kind of behavioral trait an agent must know to avoid duplicating a task.

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 action is front-loaded in one short sentence before the caveats, which is the right ordering for a 23-parameter tool. The remaining text is dense and clause-heavy with parenthetical asides, but each statement carries operational information rather than filler.

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?

An output schema exists so return values need not be explained, and the description still covers the important exception: partial-step failure reporting. For a creation tool with heavy strategy-dependent fields and a two-phase write, the non-obvious cross-field constraints are surfaced, though the relationship to sibling creation tools remains unaddressed.

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 every parameter carries a detailed description, so the schema already does the heavy lifting and a 3 is the baseline. The description reinforces a few cross-cutting rules (clock time requires day, strategy-dependent fields are stored even when the strategy is off) but adds no per-parameter syntax or format detail beyond what the schema supplies.

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 opening sentence states a specific verb and resource plus the field families it accepts ('Create a task with category, day, priority, size, time and reminders'), so an agent can identify it immediately. It does not name or distinguish itself from near siblings such as create_recurring_task or create_event, which is the only gap.

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?

It routes some work elsewhere ('startDate/endDate are set with update_task afterwards', 'Use the parameters instead' of inline shortcuts), which is genuine when-to-use guidance. However, there is no explicit statement of when to prefer this over create_recurring_task/create_event, nor of prerequisites such as needing a day before a clock time presented as a usage rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_time_blockA

Create a time block (experimental) and get its id back. EXPERIMENTAL: Create a time block via /doc/create (db='PlannerItems', Full Access Token). No official endpoint exists. Verify in the app that the block looks right.

The response carries time_block_id (the id is set client-side because /doc/create does not echo the server-generated id) and can be used directly as time_block_section in create_task/update_task — no extra get_today_time_blocks call needed. Client-set id live-tested 2026-09-13: accepted, listed in /todayTimeBlocks with the same id, and the block renders in the app like one created there (verified in the app 2026-09-13, app 1.70.0.0, PWA + desktop).

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.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only establish that this is a non-read, non-idempotent, non-destructive operation. The description goes far beyond that: it discloses the internal mechanism (/doc/create with db='PlannerItems'), the Full Access Token requirement, the client-side id quirk caused by /doc/create not echoing the server id, and live-test evidence (accepted, listed in /todayTimeBlocks, renders correctly). This is exactly the kind of hidden behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and the experimental caveat appears immediately after. The trailing verification details are thorough but somewhat verbose, repeating the date twice and including minor specifics (app 1.70.0.0, PWA + desktop) that could be trimmed without losing the trust-calibration value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that is a workaround with no official endpoint, the description is unusually complete: it explains the mechanism, auth requirement, id-handling behavior, downstream usage in task creation, and verification steps. Combined with the existing output schema and full param schema, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all four parameters (title, date, start_time, duration_minutes) already documented with formats and examples. The description adds no per-parameter detail beyond the schema, which is acceptable since the schema carries the burden. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: 'Create a time block (experimental) and get its id back.' It distinguishes this creation tool from its sibling get_today_time_blocks by making the outcome (returning the id) explicit, and frames how the id feeds into create_task/update_task, locating it in the tool family without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear workflow context: the returned time_block_id can be used directly as time_block_section in create_task/update_task, avoiding an extra get_today_time_blocks call. It also warns that the endpoint is experimental and that the agent should verify the block in the app. It stops short of explicitly naming alternatives or stating when not to use it, so it misses the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_notebookA
DestructiveIdempotent

Delete a notebook and its pages permanently, in two steps if text. No trash via the API. The pages are deleted first and then the notebook, as the app does. Two steps: a notebook with a parent and more than one page, and a standalone notebook where any page has text, are only deleted with confirm=true — the first call shows the pages (title, size, first line). Notebook with a parent: page 1's text is written back as the project's/category's note after the deletion; the text is always included in the response, so it is not lost if a step fails. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoTrue = delete after the pages have been shown
notebook_idYesThe notebook's id (nb_...)

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?

Beyond the destructive/idempotent annotations, it discloses the internal deletion order (pages first, then notebook), the absence of trash, the text-preservation write-back to the parent project/category note, and reliance on undocumented experimental endpoints pinned to app 1.71. This is exactly the behavioral context annotations can't convey.

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 core action and information-dense with no filler, so every sentence earns its place. However the 'Two steps:' sentence is grammatically tangled and requires a re-read, slightly hurting clarity.

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 no prose. For a destructive, side-effect-heavy mutation, the description covers prerequisites, ordering, data preservation, and fragility — nothing an agent needs to call it safely 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 baseline is 3, but the description adds meaning the schema lacks: the conditional circumstances under which confirm must be true and what the first (non-confirming) call returns (title, size, first line). That materially changes how an agent sequences calls.

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 up front ('Delete a notebook and its pages permanently') and clarifies scope versus the page-level sibling delete_notebook_page. An agent knows exactly what is removed and that no trash/recovery path 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?

Gives explicit conditions for when confirm=true is required (parented notebook with >1 page; standalone notebook with any text page) and describes the two-step confirm dance. It does not explicitly name alternative tools (e.g. delete_notebook_page) to route between, which keeps it 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_notebook_pageA
DestructiveIdempotent

Delete a notebook page permanently, with confirmation if it has text. No trash via the API. A page with text is only deleted with confirm=true; the first call shows title, size and first line. The last page of a notebook with a parent is not deleted here — use delete_notebook. If the parent's first page is deleted, the note then points to whichever page is first. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoTrue = delete a page with text after it has been shown
page_idYesThe page's id (pg_...)

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?

Beyond the annotations (destructive/idempotent), it discloses that there is no trash via the API (permanent deletion), the two-step confirm workflow and what the first call returns, the parent's first-page pointer behavior, and that it relies on undocumented writes ('/doc/create', '/doc/update') matched to app 1.71. This is unusually rich behavioral context and is consistent with destructiveHint=true and idempotentHint=true.

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?

Purpose is front-loaded in the opening clause, followed by edge cases and the implementation caveat. Dense and slightly long, but each sentence carries a distinct constraint (trash, confirm, last page, first-page pointer, experimental writes), so little is wasted for a destructive tool with tricky semantics.

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. Combined with the permanence warning, confirm workflow, routing to delete_notebook, and the undocumented-writes disclaimer, the description covers everything an agent needs to call this safely.

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, but the description adds real meaning: it explains that confirm=true is the gate for deleting a page with text and that the preceding call surfaces title, size and first line. That workflow context goes beyond the schema's terse confirm description.

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 notebook page permanently') and immediately distinguishes itself from the sibling delete_notebook by scoping the last-page case. An agent can tell exactly what this does and what it does not handle.

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 and when-not-to-use: 'The last page of a notebook with a parent is not deleted here — use delete_notebook.' It also explains the conditional confirm flow (a page with text requires confirm=true). Nothing is left to inference.

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 reminders, also from the task's list when task_id is given. With task_id the entries are removed from the task's reminders list and from the server (both are needed; an entry left in the list makes an open client notify). Without task_id only the server entries are removed — use it for standalone reminders or orphaned entries from get_reminders. The clock time's reminder (type T) is removed with update_task(time='').

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idNoThe task's id when the reminders belong to a task: they are then also removed from the reminders list
reminder_idsYesIDs of reminders to delete

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 already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: the dual-removal requirement (list + server), the side effect that a stale list entry makes an open client notify, and the special-case for type T reminders. This is exactly the behavioral depth an agent needs for a destructive operation.

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 core action and then elaborates on the task_id distinction and the type T exception. Slightly dense across several clauses, but every sentence carries actionable information 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?

With an output schema present, return values need no explanation, and annotations cover the safety profile. The description supplies the branching logic, side effects, and edge case needed to invoke this destructive tool correctly, leaving no meaningful gap.

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, but the description adds real meaning: task_id controls whether removal is local-list-only or also cascades from the server, and it explains the consequence of the cascade. That is more than the schema's one-line parameter doc conveys.

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 (delete) and resource (reminders) and goes further by distinguishing the two operating modes (with vs without task_id). An agent can immediately tell this is a deletion tool scoped to reminders, distinct from set_reminder/get_reminders.

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 says when to pass task_id (task-owned reminders, both list and server removal) versus when to omit it (standalone reminders or orphaned entries from get_reminders). It also routes the agent to an alternative for the special clock-time reminder type T (update_task(time='')).

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 permanently, with no trash and no undo. Deletion via the API bypasses the app's trash and cannot be undone — use only when the user explicitly wants a deletion. If the task has reminders they are cleared and the server entries removed before the deletion, so that no notification arrives. An occurrence of a recurring task follows the app's two choices: 'this' adds the occurrence's day to the recurring task's deletedDates and deletes the occurrence; 'all' deletes all open occurrences and then the recurring task, completed occurrences are kept. If a step fails the response says which were done. THE APP'S VIEW: an open client does not render the deletion — reload the client (F5, restart of the desktop app) before the row is touched; a write from the app on the stale row recreates the document. A recurring task (db RecurringTasks) is deleted with scope 'all', on an occurrence or on the recurring task's own id — also before it has any occurrences (they are created only when a client opens after the day rolls over). Habit recurrences are not deleted here. Projects and categories: deleted only without open children — the tool reads /children first (one more call) and otherwise refuses, with the list, so that no children are left with a parent that does not exist. Completed children do not show in /children and are left behind with the parent gone. The project's notebook is not deleted (as in the app); the response gives its id for delete_notebook.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoOccurrence of a recurring task: 'this' = only this one (default), 'all' = the whole recurring task with all open occurrences (completed ones are kept). The recurring task's own id is accepted only with 'all'this
item_idYesID of the task (or of a project/category without open children) to delete

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 already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: trash bypass, reminder/server-entry cleanup before deletion, partial-failure reporting, the pre-flight /children read that can add a call, completed-children left orphaned, and the stale-client recreation hazard. This is exactly the extra context destructive operations need.

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 critical warning is front-loaded, which is good, but the body is a dense wall of prose with a mid-block all-caps label and repeated restatement of the scope enum. The content is substantive, yet it is longer and less scannable than it needs to be for a two-parameter tool.

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, yet the description still covers partial-failure reporting, the notebook-id handoff, and the client reload hazard. For a destructive, non-idempotent-looking operation, nothing an agent needs to call it safely 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 description coverage is 100%, so item_id and the scope enum are already documented in the schema, and the description's 'this'/'all' explanation largely restates it. It adds only marginal detail (the recurring task's own id accepted only with 'all', which the schema also states), so baseline 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?

Opens with a specific verb and resource plus a crucial qualifier ('permanently, with no trash and no undo'), and immediately distinguishes scope: tasks and recurring occurrences here, habit recurrences excluded, and the project notebook handed off to delete_notebook. An agent can tell it apart from delete_notebook, delete_reminder and update_task 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?

Gives an explicit gate ('use only when the user explicitly wants a deletion'), states when the tool refuses (projects/categories with open children), names the sub-case behavior for 'this' vs 'all', and routes the notebook cleanup to a sibling. That is when-to-use, when-not, and alternatives in one pass.

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 and points balance.

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 and openWorldHint=false, so the safety profile is covered. The description adds the endpoint and return fields but provides little additional behavioral context such as authentication requirements or any caveats about tracking status. It is non-contradictory and adequate, but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence communicates the essential purpose, endpoint, and returned fields with no wasted words. It is concise without sacrificing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only endpoint with an output schema and annotations already present, the description is complete. An agent has enough information to select and invoke the tool correctly, and the output schema covers return-value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description has no parameter semantics to explain. Per the baseline for parameterless tools, a 4 is appropriate; the description adds useful detail about what data the response contains, which is helpful context beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a clear verb+resource ('Get account info'), identifies the exact endpoint (/me), and enumerates the specific payload fields (email, tracking status, points balance). This makes the tool's purpose unambiguous and distinguishes it from the many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied by the resource and fields, but the description does not explicitly state when to prefer this tool over alternatives, nor does it mention any exclusions. No alternative tool serves the same purpose, so the lack is not severe, but no direct usage guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_categoriesA
Read-only

Get all categories and projects as a hierarchy with id and parentId. Get all categories and projects (the whole hierarchy; parentId='root' is the top level). Use to find the right parent_id when creating/moving.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, and the description adds useful behavioral context: it returns the entire hierarchy, uses parentId='root' for the top level, and is meant for locating parent IDs. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat repetitive: 'Get all categories and projects' appears twice in nearly identical form. It could be condensed into one clear sentence plus the usage note. Still, the key information is front-loaded and the usage hint adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

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 explains the hierarchy, the root convention, and the intended use, so an agent has enough to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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. The description does not need to explain parameter semantics and correctly focuses on the return structure and usage purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (all categories and projects) and the operation (get as hierarchy with id and parentId). It is unambiguous and distinct from sibling tools like get_children or get_labels, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states a concrete use case: 'Use to find the right parent_id when creating/moving.' It gives clear context for when to call the tool, though it does not specify when not to use it or mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_childrenA
Read-only

Get open tasks and subprojects in a category or project. Returns direct children only — call again for deeper levels. Note: orphans (tasks whose parentId points to a deleted/non-existent document) do NOT show up under 'unassigned' — only in get_today_items/get_due_items if they have a day/dueDate (live-tested 2026-08-29). Orphans are repaired by running FIX_CYCLES() in the app's console (a documented troubleshooting path).

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.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses detailed behavior: direct-children-only semantics, orphan exclusion under 'unassigned', and the FIX_CYCLES() repair path. This adds valuable context not available in annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy due to the orphan note and live-tested date, but every sentence adds necessary operational detail. It is front-loaded with the main purpose and then expands on limitations, making it well-structured though not maximally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema, the description fully covers behavior, limitations, and troubleshooting. An agent is equipped to call it correctly without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides complete parameter documentation (100% coverage) including valid values like 'unassigned' and 'root'. The description does not add new meaning to the parameter beyond what the schema states, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves open tasks and subprojects within a specific category or project, using a specific verb and resource. It also distinguishes itself by noting it returns direct children only, and mentions the orphan caveat, which sets it apart from sibling tools like get_today_items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: call again for deeper levels, and for orphans, use get_today_items/get_due_items instead. This directly tells an agent when to use this tool and when to use alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_done_itemsA
Read-only

Get tasks completed on a given date. Tasks completed on a given date (doneAt within that day, configured timezone) — regardless of priority and deadline. Built on the UNDOCUMENTED endpoint GET /doneItems?date= (missing from the OpenAPI spec and the wiki; live-tested 2026-08-30, may disappear): it filters on the task's day, not on doneAt. A past day is kept on completion both in the app and via the API (the app sets day = today only on unscheduled and future-dated tasks) — hence the date plus lookback_days earlier are fetched and everything is filtered on doneAt. The response always states its coverage: covers_from (= date − lookback) and days_fetched. On a 429/error the fetch stops: incomplete=true, days_missing lists the days not fetched and warning explains; the date's own completions are always included because it is fetched first. Complete results are cached for 30 minutes (cached=true) — repeated calls then cost no API calls; mark_done inserts its task into the cache, delete_task and unmark_done remove theirs. Completions or deletions made in the app show up only once the cache expires. Not covered: a task with a FUTURE day completed via the API (it sits under its day). Tasks only — completed projects are not listed. Items without doneAt (older data) are excluded and counted in skipped_without_done_at. Sorted by doneAt. Cost: one read call per day (~3.1 s each in the queue).

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.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

This description goes far beyond the basic readOnly hint, disclosing that it relies on an undocumented endpoint that may disappear, that lookback is needed due to day vs. doneAt filtering, that results are cached for 30 minutes, and that incomplete results are flagged with covers_from and days_missing. It also explains cache interactions with mark_done, delete_task, and unmark_done, plus performance costs. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but each sentence adds critical operational detail. Minor redundancy exists in the opening two sentences both stating the 'completed on a given date' conceptaine, but overall the structure is logical: core purpose, endpoint caveat, caching behavior, exclusions, and cost.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

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, the description is exceptionally complete. It covers source endpoint risk, date filtering semantics, caching, error handling with incomplete flags, excluded cases, sorting, and cost estimation. The presence of an output schema further reduces the need to explain return values, and the description covers everything an agent needs to invoke it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents both parameters, the description adds substantial meaning: it explains why lookback_days exists, that each day corresponds to one read call (~3.1s), and clarifies timezone interpretation. This elevates the semantics well beyond the bare schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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: 'Get tasks completed on a given date', which clearly identifies the tool's function. It further distinguishes itself with details like 'regardless of priority and deadline' and coverage disclaimers ('Tasks only — completed projects are not listed'), making it distinct from sibling list tools such as get_today_items and get_due_items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong contextual guidance on what the tool covers and its limitations, but it never explicitly names alternative sibling tools or states conditions for choosing this tool over them. The 'Not covered' section implies exclusions, but the absence of direct alternative routing keeps this at a minimum viable level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_due_itemsA
Read-only

Get open tasks and projects with a deadline today or earlier. Filters Keep just one (carry) as the app does: only the oldest open occurrence per recurring task is shown. Only the current one (skip) is not filtered here. The mode is read only for recurring tasks with an open occurrence before today and cached until local midnight; changes made in the app take effect by the next day at the latest. The response gives hidden_count; include_hidden=true includes all.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNoDeadline up to and including YYYY-MM-DD; omit for today
include_hiddenNoTrue = include occurrences the app hides (Keep just one)

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 only declare readOnlyHint and openWorldHint, leaving the description to carry behavioral weight. It discloses substantive traits: which recurring occurrences are filtered, that results are cached until local midnight, and that app-side changes may lag by a day — genuine operational context an agent needs to interpret staleness.

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 purpose is correctly front-loaded in sentence one. However, the middle sentences are dense and jargon-laden ('Keep just one (carry)', 'Only the current one (skip) is not filtered here'), so some sentences obscure more than they earn.

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 read-only query with an output schema and complete annotation coverage, the description supplies everything needed: scope, recurrence filtering, caching/staleness, and the hidden-item behavior. Return-format details are correctly left to 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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning to include_hidden by explaining the underlying 'Keep just one (carry)' filter it toggles. The 'by' parameter gets no extra meaning, but the added filter semantics push this above the baseline.

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?

States a specific verb+resource+scope: 'Get open tasks and projects with a deadline today or earlier.' The scope is precise, but it never references the sibling get_today_items, whose overlap with this tool ('deadline today or earlier' vs. today's items) is left for the agent to infer.

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 explains internal filtering behavior but never states when to choose this tool over get_today_items, get_done_items, or get_tracked_item. No prerequisites, no explicit exclusions, no alternative naming — the agent must infer selection from scope alone.

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 a habit's server tracking record with its full history. Get the server's tracking record for a single habit (habitId + full history — the source of truth for recordings). Note: the response lacks title and settings; those are in list_habits.

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 the description adds meaningful context: the response is the 'source of truth for recordings' and omits title/settings. This helps the agent set expectations beyond the schema without contradicting the read-only hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the core purpose comes first, followed by the key limitation and pointer to the sibling tool. Every line earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with an output schema and one relevant sibling, this description is complete. It names the source parameter, clarifies the record scope, and warns about missing fields, covering everything an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 habit_id is already described as 'Habit ID (from list_habits)'. The description adds little beyond the schema, mentioning habitId but no new format or constraints, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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 a habit's server tracking record with its full history') and explicitly differentiates it from list_habits by noting the response lacks title and settings. An agent can confidently identify this as the single-habit full-history retrieval tool among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states this is for a single habit and points to list_habits as the source for title/settings, giving useful routing context. It does not explicitly enumerate when not to use it, but the alternative is named and the scope is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_kudosA
Read-only

Get kudos, level and kudosRemaining from Marvin's XP system. Note: kudos is separate from reward points (the reward currency) — the point balance is in get_account_info. nextMultiplier only exists in /me, not here (known limitation, MarvinAPI issue #5).

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 declare readOnlyHint=true and openWorldHint=false, so the read-only nature is already known. The description adds value by clarifying that kudos is not the same as reward points and by disclosing the known limitation that nextMultiplier is not present in this endpoint (referencing a specific issue). This provides behavioral context beyond what annotations convey, though it doesn't elaborate on return format (covered by output schema) or other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long and front-loaded with the core purpose. The first sentence states exactly what the tool does; the second clarifies a critical distinction and a limitation. Every word earns its place, with no redundancy or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, read-only, output schema present), the description covers all essential aspects: what it returns, how it differs from related tools, and a known limitation. An agent can correctly decide to call this tool and interpret its result without needing additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema is trivially fully documented. The description goes beyond the schema by enumerating the returned fields (kudos, level, kudosRemaining) and explicitly noting that nextMultiplier is absent. This adds semantic clarity for an agent, even though no parameters exist to describe.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves kudos, level, and kudosRemaining from Marvin's XP system. It explicitly distinguishes kudos from reward points and points to get_account_info for the point balance, making the tool's purpose unambiguous and differentiating it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: kudos is separate from reward points, and the point balance is found in get_account_info. This implicitly tells the agent when to use this tool (when kudos data is needed) versus get_account_info (for points). It also notes that nextMultiplier is not available here, which is a usage caveat. However, it does not explicitly name the alternative tool or state a definitive when-to-use/when-not-to-use rule, so it falls short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_labelsA
Read-only

Get all labels with ids, for label_ids and filtering.

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 known. The description adds that it returns 'all' labels, implying full coverage, but does not discuss pagination, ordering, or result format. With the output schema present, this is minimally adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no filler. It front-loads the core action and resource, then adds a compact note on how the labels are used.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

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 operation with an output schema and supported by annotations, the description is sufficient. It names the resource, the returned data (ids), and the purpose (filtering), leaving no critical gap for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so the baseline is 4. The description adds no parameter semantics, but none are needed here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get all labels with ids', identifying the specific resource (labels) and the expected outcome (IDs for label_ids and filtering). This distinguishes it from sibling getters like get_goals and get_categories without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for label_ids and filtering' implies when this tool is useful, but there is no explicit when-to-use guidance or mention of alternatives. It relies on inference rather than direct instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_notebookA
Read-only

Read a notebook including the text of its pages, or a single page. Give exactly one of notebook_id, parent_id (project/category) and page_id. Pages come in rank order; the first page of a notebook with a parent is the one the parent shows as its note. If the text exceeds max_chars the rest is omitted and the response says which pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idNoA single page (pg_...), instead of the others
max_charsNoCap on page text in the response; pages beyond it are omitted
parent_idNoThe project's or category's id, instead of notebook_id
notebook_idNoThe notebook's id (nb_...)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/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 safety is covered. The description adds real behavioral detail beyond that: page text is returned in rank order, the parent's note is the first page, and truncation at max_chars is reported back with an indication of which pages were dropped. Auth requirements and any rate limits are not mentioned, keeping it from a 5.

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?

Four short sentences, none wasted, with the core action front-loaded in the first clause. The constraint about exactly one id follows immediately, and truncation behavior is last. Line wrapping splits sentences awkwardly but the content is tight.

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?

An output schema exists, so return-value detail is not required here. The description covers the two retrieval modes, the id-exclusivity rule, page ordering, and overflow handling, which is enough for correct invocation. Minor gaps such as what happens if no id is supplied leave it just short of 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 description coverage is 100%, so the baseline is 3, and the description meaningfully exceeds it by stating the mutual exclusivity of the three id parameters and explaining what parent_id resolves to (a project's or category's note). It also restates max_chars truncation semantics, which the schema covers only as a cap. Marginal added value over the schema, hence 4.

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 states a concrete verb and resource: 'Read a notebook including the text of its pages, or a single page.' This is clearly distinct from list-style siblings such as get_notebooks, and the mention of page text signals the depth of retrieval. It stops short of naming a sibling it should be preferred over, so it falls 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit invocation rule: 'Give exactly one of notebook_id, parent_id (project/category) and page_id,' which tells the agent how to choose among the identifier modes. The parent_id option is annotated with its meaning ('project/category'), clarifying when that route applies. There is no explicit statement of when to prefer search_notebooks or get_notebooks instead, so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_notebooksA
Read-only

List all notebooks with page titles, order and sections, without text. Standalone notebooks have parent_id null; a notebook that belongs to a project or category has parent_id and parent_type. A page's updated_at changes when the page is edited in the app. For text: get_notebook. A notebook whose parent has been deleted gets parent_missing, one on a done project gets parent_done. Costs 2 calls (1 when no notebook has a parent) plus one per distinct parent missing from /categories (deleted or done projects).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 only cover readOnlyHint and openWorldHint, but the description adds substantial behavioral context beyond them: parent_id/parent_type semantics, updated_at edit behavior, parent_missing/parent_done flags, and an explicit cost model (2 calls, plus one per distinct parent missing). The call-cost disclosure is particularly valuable for planning.

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 core purpose, and every sentence carries information (parent semantics, updated_at, text routing, missing/done flags, cost). It is dense and the trailing cost sentence is complex to parse, which keeps it from a 5, but there is 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?

An output schema exists, so return values need not be explained, yet the description still covers the output-relevant semantics (parent fields, flags, updated_at). For a zero-param, read-only list tool this is complete for correct invocation and interpretation.

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 takes zero parameters, so the baseline is 4. There are no arguments to document and the description correctly spends its text on output semantics instead.

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 ('List all notebooks') plus the exact scope ('with page titles, order and sections, without text'). It explicitly routes the agent away from itself for a related need ('For text: get_notebook'), so it is distinguishable from siblings get_notebook and search_notebooks.

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?

Clear context for when to use it (overview listing without page text) and names the alternative for full text (get_notebook). It does not address when to prefer search_notebooks over a full list, so no explicit exclusion is given, keeping it below a 5.

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 today's Marvin calls against the budget and the last call time. Show how many Marvin API calls have been made today (budget 1440/day, shared by all tools) and when the latest one went out. The counter is shared by every client that goes through this server. If a call went out within the last minute, another client is active. This tool costs no Marvin call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 establish readOnlyHint=true/openWorldHint=false, and the description goes further by disclosing the shared budget semantics, cross-client counter behavior, the last-minute activity heuristic, and that this call is free against the budget. These are genuinely useful behavioral traits beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key facts are front-loaded and the description is short. The first two sentences restate the same action ('Show today's Marvin calls' vs 'Show how many Marvin API calls have been made today'), a minor redundancy that keeps it just under a 5.

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?

An output schema exists, so return values need no prose explanation, and the description covers budget semantics, sharing, and cost. Complete enough for a no-arg monitoring tool; only the absence of explicit usage-trigger guidance keeps it from a 5.

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 per the rubric the baseline is 4. The description correctly implies the tool takes no arguments, leaving nothing for the schema to add.

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 opening sentence states a specific verb and resource — showing today's Marvin API call count against a budget plus the last call time. This is a distinct monitoring tool with no realistic sibling overlap, so an agent can identify it immediately.

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 supplies clear operational context (check the shared 1440/day budget, detect other active clients within the last minute) but does not explicitly frame when to call it versus continuing work, nor any 'do not use' conditions. Usage is strongly implied rather than stated as routing rules.

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

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses an additional side effect—pushing notifications to the phone—and states the authorization requirement. This adds useful behavioral context, though the punctuation leaves some ambiguity about whether the push is part of the tool's behavior or a separate instruction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the main action, but the comma splice in 'Get all server-side reminders, push notifications to the phone' creates confusion. A simple conjunction or rewording would make it fully clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema and a read-only annotation, the description covers the key extras: the all-reminders scope, the notification behavior, and the Full Access Token requirement. It is adequate, though the wording could be cleaner.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is complete, so the baseline of 4 applies. There is no parameter detail for the description to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a clear verb and resource: 'Get all server-side reminders.' The 'push notifications to the phone' clause slightly muddies the core purpose, and it does not explicitly differentiate from siblings like get_due_items, but the primary action is still unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as get_due_items or set_reminder. The mention of 'Requires the Full Access Token' is an authentication prerequisite, not usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_time_tracksB
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idsYesUp to 100 task IDs

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only and non-open-world behavior, so the description does not need to restate those. It adds the 'source of truth' characterization and the 100-task cap, but does not disclose pagination, ordering, or what historical data is included beyond what the schema and output schema likely convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description contains two sentences that repeat nearly the same information. The second sentence adds only 'source of truth' and the max-100 constraint, which is already implied in the first sentence, so the extra sentence does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/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 covers the essential information: what is fetched and the call limit. The remaining context is adequately supplied by the annotations and schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the single task_ids parameter is documented as 'Up to 100 task IDs.' The description repeats that limit ('max 100 per call') without adding examples, batching advice, or additional parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/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 time-tracking history' for up to 100 tasks. It is clear enough to identify the tool's purpose, though it does not explicitly distinguish it from related siblings like get_tracked_item or get_today_time_blocks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as get_tracked_item, get_today_time_blocks, or start_tracking. The phrase 'source of truth' hints at authority, but there are no explicit conditions, exclusions, or alternatives mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_today_itemsA
Read-only

Get open tasks and projects scheduled today or earlier. Open tasks/projects with day <= the date (default today in the configured timezone, MARVIN_TIMEZONE), not only exactly on the date. Deadline-only items: get_due_items. Filters as the app does: for a recurring task with If you miss one = Keep just one (carry) only the oldest open occurrence is shown, for Only the current one (skip) only the date's own; Keep them all and the account default ('', assumed to be Keep them all) show all. The mode is read (/doc) only for recurring tasks with an open occurrence before today, cached until local midnight; a mode changed in the app takes effect by the next day at the latest. If the mode cannot be read the occurrences are shown. The response gives hidden_count and which were hidden; include_hidden=true includes all. Habit tasks (field habitId) are listed in habit_task_ids. Recurring occurrences are created the first time a Marvin client opens after the day rolls over; read before that, today's occurrences are missing, and a recurring task created during the day may lack them.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate YYYY-MM-DD; returns everything open with day <= the date; omit for today (MARVIN_TIMEZONE, else the system timezone)
include_hiddenNoTrue = include occurrences the app hides (If you miss one)

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?

Much richer than the readOnlyHint/openWorldHint annotations: it discloses recurrence filtering modes (carry/skip/keep all), that the mode is read/cached until local midnight, the fallback when the mode can't be read, and the significant caveat that occurrences are only created once a client opens after the day rolls over. This is exactly the kind of behavior an agent could not infer 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?

The core purpose and scope constraint are front-loaded, and every paragraph carries information the agent needs. It is dense and unstyled, with the recurring-mode sentence bordering on implementation detail, but nothing is truly wasted.

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, yet the description still explains the notable return fields (hidden_count, which items were hidden, habit_task_ids) and the timing caveat about missing occurrences. For a read tool with a filtering quirk, nothing an agent needs 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 baseline is 3, but the description adds real meaning: it ties include_hidden to the app's hiding modes and reinforces the 'day <= date' semantics of the date parameter beyond the schema wording, so the agent understands the interaction between the two params.

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 open tasks and projects scheduled today or earlier') and immediately clarifies the subtle scope ('day <= the date, not only exactly on the date'). It also names the sibling that covers the other case ('Deadline-only items: get_due_items'), so an agent can distinguish it 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the deadline-only case to get_due_items and explains when to set include_hidden=true. It doesn't address how it relates to other near-neighbors (get_done_items, get_tracked_item, get_today_time_blocks), but the primary ambiguity is resolved.

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 with their category or smart-list mapping. The API response lacks the category link (known limitation, MarvinAPI issue #65); the mapping is therefore fetched separately from the profile setting plannerSmartLists (key = normalized block title).

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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses a real limitation (MarvinAPI issue #65) and explains the workaround: the mapping is fetched separately from plannerSmartLists using a normalized block title. This is exactly the non-obvious behavior an agent needs to interpret the response and the extra API call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose and followed by a focused limitation note. Every clause contributes either a use case or behavioral context; there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the readOnly annotation, an existing output schema, and full parameter coverage in the schema, the description covers the tool's main behavioral quirk and mapping semantics. It does not explicitly position the tool against similar siblings such as get_time_tracks, leaving a minor selection gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters at 100% coverage, so the baseline is 3. The description adds meaning by explaining why include_category_mapping exists and how the mapping key works (normalized block title), which goes beyond the schema's terse '1 extra API call' note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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: "Get today's time blocks with their category or smart-list mapping." This clearly states what is returned and differentiates the tool from siblings like get_time_tracks by emphasizing the category/smart-list enrichment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The described use case is clear: call this when you need time blocks and their category/smart-list mapping for today (or any date via the date parameter). It does not name alternative tools or state explicit when-not-to-use conditions, so it stops one step short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tracked_itemA
Read-only

Show which task is being time-tracked right now.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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?

The description aligns with the readOnlyHint annotation and adds useful context by specifying that the tool reports the in-progress tracked item rather than historical records. It doesn't contradict annotations, and while it doesn't detail null-return behavior or edge cases, the read-only annotation plus clear present-state wording provide sufficient safety context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded sentence carries full meaning without redundancy. The essential information — current time-tracked task — is delivered immediately, and there is no filler or repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only query tool with an output schema and clear annotations, the description is complete. It tells the agent exactly what the tool returns conceptually, and the output schema handles return-value details, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 nothing for the description to add beyond the schema. The baseline of 4 applies here because no parameter documentation is needed, and the description accurately conveys what operation will be performed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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 names the exact resource: which task is currently being time-tracked. This clearly distinguishes it from sibling tools like start_tracking, stop_tracking, and get_time_tracks, which concern tracking actions or historical time-track data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case by saying 'right now', indicating this tool reports the current tracking state. However, it does not explicitly state when to prefer this over get_time_tracks or how it relates to start_tracking/stop_tracking, leaving the agent to infer the appropriate selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_capabilitiesA
Read-only

List every Marvin tool by area, with what it can and cannot do. Costs no Marvin API call. Call it before assuming something is impossible via MCP or requires manual work in the app; field conditions and live-tested details live in each tool's own description.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 declare readOnlyHint=true, and the description adds a key behavioral detail: 'Costs no Marvin API call.' This is beyond what annotations provide and informs the agent about resource usage. Does not contradict annotations. Slightly stronger than baseline because it discloses a practical cost aspect, though no further behavioral details are needed given the simple read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no fluff. The primary purpose is front-loaded in the first sentence, usage guidance follows, and the caveat about other tools is concise. Every sentence earns its place and the description is highly scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists, the description covers all essential aspects: what it lists, when to use it, its cost (free), and a pointer to per-tool details. Nothing an agent needs to decide to invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has zero parameters, so schema coverage is trivially 100%. Baseline is 4 for no parameters. The description doesn't need to explain parameters; it does clarify the output nature ('every Marvin tool by area'), which adds value beyond the empty schema. No gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('every Marvin tool by area') plus content details ('what it can and cannot do'). Clearly distinguishes itself from all sibling tools, which are operational tools, not a meta-listing tool. No ambiguity about its function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes when to call it: 'Call it before assuming something is impossible via MCP or requires manual work in the app.' Also gives a caveat that detailed live conditions are in each tool's own description, guiding the agent to consult the appropriate tool for specifics. Provides clear context and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_habitsA
Read-only

Get all habits with title, settings and history. Get all habits as full documents incl. title, settings and history ([time1, value1, time2, value2, ...], unix ms). Requires the Full Access Token (the raw variant of /habits). Important (verified live 2026-08-19): non-raw /habits would be wrong here — it reads the server's tracking registry, which is created lazily on the first recording, so never-recorded habits are missing entirely, and the responses lack titles.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint=true, so the read-only nature is established. The description adds value beyond that by disclosing the auth requirement (Full Access Token) and the behavioral trap of the non-raw endpoint. It doesn't describe the response shape, but the output schema exists to cover that, and no contradiction with annotations is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first two sentences are redundant — 'Get all habits with title, settings and history' and 'Get all habits as full documents incl. title, settings and history' repeat the same content before adding the format detail. The crucial warning is well-placed at the end, but the opening duplication wastes space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with an output schema, the description is nearly complete: it covers the auth prerequisite and the critical pitfall distinguishing it from the non-raw endpoint. The only minor omission is an explicit statement of returned fields beyond the history array, but the output schema carries that burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 and the schema is trivially 100% covered. The description compensates by clarifying the return format of the history field ([time1, value1, time2, value2, ...] in unix ms), which informs an agent what to expect without any params to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise action ('Get all habits') and explicitly enumerates the returned contents (title, settings, history with time/value pairs). The resource and scope are unambiguous, and it separates a bulk listing from the singular get_habit in the sibling set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit, live-verified guidance: this tool requires the Full Access Token (raw variant of /habits) and explicitly warns that the non-raw variant is wrong here, explaining why (lazy tracking registry, missing never-recorded habits, no titles). That directly tells an agent when and how this tool must be invoked versus its alternate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_doneA
Idempotent

Mark a task as done and clean up its reminders as the app does. Reads the task, runs /markDone (configured timezone) and then does what the app does: the server entries T and M are removed and reminderTime is cleared; the reminders list remains. Projects: /markDone responds 400 (tasks only); projects are closed with mark_project_done. 404 = does not exist, 400 = already done or a project. Habit task (field habitId): the habit is also recorded with /updateHabit at 12:00 on the task's day, and habitRepAt is set. Habit with a count (recordType number): value is recorded with the current time; the task is checked off only once the day's total reaches the target — otherwise it stays open and the response shows the total. Recurring occurrence: safe (deterministic id). After completion: the next occurrence is created +N days later. With a future day the tool does what the app does: the occurrence is moved to today before it is checked off, and the next one is counted from today. If a step fails the response says which steps were done. Running time tracking is stopped and written to task.times. /markDone does not set workedOnAt and does not stamp fieldUpdates, which the app does.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNoHabit task with a count only: the value to record (default 1)
item_idYesTask ID (NOT a project — mark_project_done closes those)

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?

With annotations present the bar is lower, yet the description goes well beyond them: it enumerates exactly what is removed (server entries T and M, reminderTime cleared, reminders list kept), how habits are recorded, how recurring occurrences shift, that running time tracking is stopped and written to task.times, and the notable gaps (/markDone does not set workedOnAt or stamp fieldUpdates). That is unusually rich side-effect disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The paragraph is long and dense, but nearly every sentence carries behavioral information rather than filler, and the core action is front-loaded ahead of the edge cases. A tighter grouping of the habit/recurring/future-day branches would read better than the current run-on flow.

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 explained, yet the description still tells the agent that partial failures report which steps succeeded. Combined with the edge-case coverage for habits, recurring tasks, and future days, an agent has everything needed to 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics for `value`: it defines the habit-with-count case, that the value is recorded with the current time, and that the task only closes once the day's total reaches the target. `item_id`'s task-not-project constraint is reinforced in prose as well.

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 ('Mark a task as done') and immediately scopes it by naming the sibling it is not: 'tasks only ... projects are closed with mark_project_done'. An agent can distinguish this from mark_project_done, unmark_done, and record_habit 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 routing rules: projects get a 400 here and must use mark_project_done; 404 vs 400 are decoded; habit and recurring cases are given their own conditions. This is genuine when/when-not guidance, not inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_project_doneA
Idempotent

Close a project and its open tasks, in two steps. Step 1 (without confirm_code): reads the project and its open children, lists them with the warning that they too will be marked done, and returns a code. Nothing is written. Step 2 (confirm_code from step 1): reads the children again; if the code no longer matches, nothing is closed and the response gives the new list and code. Otherwise each open task is checked off like mark_done (/markDone and reminder cleanup) and the project is closed last with a /doc/update of the app's five fields: done, doneAt and workedOnAt (now), day (the project's day, or today if it has none) and doneDate (same as day) — as the app does. The deadline (dueDate) is not touched. The app itself refuses to close a project with open children; this tool closes them on purpose. The children are checked off with /markDone, which does not set workedOnAt and does not stamp fieldUpdates — the app sets workedOnAt on the children. Stops in step 1 without a code if an open child is a sub-project, a habit task or an occurrence of a recurring task — close those first (the app's behavior there is untested). Completed projects do not show in get_categories. Undo in the app; unmark_done refuses projects. If a step fails the response says which were done; the project then stays open. Cost: step 1 two calls; step 2 three, plus one per task and two more per task with reminders.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesID of the project to close
confirm_codeNoThe code from step 1. Without a code only the open children and the code are shown; nothing is closed

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?

Far exceeds the annotations: it discloses that step 1 writes nothing, the exact /doc/update fields applied (done, doneAt, workedOnAt, day, doneDate), that dueDate is deliberately untouched, that children are closed via /markDone without workedOnAt or fieldUpdates, that a stale code aborts silently, and that partial failure leaves the project open with a per-target report. It also notes the tool intentionally bypasses the app's refusal to close projects with open children. No contradiction with the given hints (closing is reversible via app undo, so destructiveHint=false holds).

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 two-step model is front-loaded and the remaining content is dense edge-case and cost detail, most of which earns its place. It is a long, single-block paragraph with a few expendable clauses ('as the app does', repeated /markDone caveats), so it is slightly heavier than strictly necessary but far from padded.

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-but-reversible two-phase tool with an output schema present, the description covers everything the agent needs: preconditions, abort conditions, per-step call costs, partial-failure semantics, and reversal path. Return-value formatting is correctly left to 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics on top: confirm_code is not just an opaque string but the artifact of step 1, and its absence changes the tool from a read into a no-write preview, while a stale code produces a re-listing rather than an error. That meaning goes beyond what the schema property text conveys.

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: 'Close a project and its open tasks, in two steps.' It immediately distinguishes itself from the sibling mutators (mark_done, unmark_done, update_category_or_project) and explicitly notes that unmark_done refuses projects and completed projects don't show in get_categories. An agent can tell what this does and what it is not 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance via the two-step protocol: step 1 without confirm_code only reads and returns a code; step 2 with the code performs the close. It names preconditions to clear first (sub-projects, habit tasks, recurring occurrences) and the alternative for reversal ('Undo in the app; unmark_done refuses projects'). Nothing about selecting or sequencing the tool is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_habitA

Record or undo a habit check-in, synced to the app. Also updates the sync database (updateDB=true) so the Marvin app shows the change immediately.

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.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a mutating, non-idempotent operation. The description adds a useful side effect: it updates the sync database (updateDB=true) so the Marvin app shows the change immediately. This is beyond the structured hints, though the cryptic 'updateDB=true' parenthetical introduces a name not present in the input schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, with the primary action front-loaded and no filler. The second sentence earns its place by disclosing the sync side effect, though the parenthetical updateDB=true is unnecessarily cryptic and could be simplified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple tool with full schema coverage and an output schema, so the description does not need to restate return values. It covers the action and the key side effect, leaving only the when-to-choose guidance under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even without description-level parameter detail. The description does not add meaning to habit_id, undo, or value; its only parameter-adjacent mention, updateDB=true, is not an actual input parameter and could confuse rather than clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: 'Record or undo a habit check-in.' This clearly identifies the operation and distinguishes it from task-focused siblings like mark_done or unmark_done. However, it does not explicitly contrast itself with sibling tools, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives such as list_habits/get_habit for reading habits or mark_done/unmark_done for tasks. The 'undo' option hints at one usage scenario, but there is no when-to-use or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_reward_pointsA
DestructiveIdempotent

Reset reward points permanently, balance and history. Reset reward points PERMANENTLY: deletes the whole earn/spend history and sets the balance to 0 (Full Access Token). CANNOT be undone — only use when the user explicitly asks for it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 discloses exactly what happens: the entire earn/spend history is deleted and balance is set to 0, and this is permanent. It also adds the auth context (Full Access Token) and goes beyond the destructiveHint/idempotentHint annotations by spelling out the concrete consequence, so an agent can anticipate the irreversible side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with the key consequence (permanently deletes history, sets balance to 0) front-loaded. There's minor redundancy in repeating 'permanently' at the start and in the second sentence, but the warning is important enough that the emphasis is acceptable and no extraneous detail is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter destructive operation with a provided output schema, the description fully covers the operational effect, irreversibility, authorization requirement, and appropriate invocation condition. Nothing relevant to a safe call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, and the schema covers this completely, so no parameter-level explanation is needed. The baseline for a no-parameter tool is 4, and the description appropriately focuses on the operation's effect rather than input details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific operation (reset reward points) and precisely defines the scope: deletes the whole earn/spend history and sets balance to 0. This clearly differentiates it from sibling reward tools like claim_reward_points, unclaim_reward_points, and spend_reward_points, which affect only parts of the reward balance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear condition: only use when the user explicitly asks for a reset, and warns it cannot be undone. It doesn't explicitly contrast with sibling reward operations (e.g., use spend_reward_points for a normal deduction), but the irreversibility warning and explicit-request condition are strong enough routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_notebooksA
Read-only

Search notebooks: notebook names, page titles and page text. The list is fetched with one call; page text is cached in memory and fetched only for notebooks with pages changed since the previous search (updated_at), at most 20 notebooks per call. Notebooks whose text has not been fetched yet are listed in not_searched — search again to continue. Hits in a notebook whose parent has been deleted get parent_missing, on a done project parent_done (as in get_notebooks).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch text, case-insensitive

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, the description discloses substantive behavioral traits: text is cached in memory, only notebooks with pages changed since the last search (updated_at) are re-read, a hard cap of 20 notebooks per call, a not_searched list for pending notebooks, and per-hit status codes (parent_missing, parent_done). This is exactly the operational context 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?

The purpose is front-loaded ahead of the caching/continuation mechanics, and there is little wasted text. The second half is dense and slightly elliptical (e.g., 'fetched with one call' is ambiguous), but every sentence carries information the agent needs.

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 an output schema present and annotations covering the read-only profile, the description's main burden is explaining the incremental/paged search model — which it does via not_searched, the 20-notebook cap, and the status codes. The missing piece is routing guidance against the notebook read siblings.

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?

There is a single required parameter with 100% schema description coverage ('Search text, case-insensitive'), so the schema already carries the semantics. The description adds nothing about matching behavior, multi-word handling, or result ranking, which lands this at the baseline 3.

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 states a specific verb and resource plus the search scope: 'Search notebooks: notebook names, page titles and page text.' An agent immediately knows this is a full-text search over notebook content, not a plain list. It does not, however, explicitly contrast itself with siblings like get_notebooks or get_notebook, so differentiation must be inferred.

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?

Usage is implied rather than stated: the description explains the continuation protocol ('search again to continue') and references get_notebooks for the parent_done status, but never says when to reach for this tool versus get_notebooks/get_notebook. No exclusions or preconditions are given.

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 priority (P1-P3 or low) or the dread level on a task. Set or change priority (isStarred) and/or the frog/dread level (isFrogged 1-4, read in the app 2026-10) on an existing TASK. Requires the Full Access Token. The app's four priority levels are stored as isStarred 3/2/1/-1; Low priority is shown only with 'Enable low priority' on. Does not apply to projects: they use the string field priority ('high'/'mid'/'low'); set it via update_category_or_project. A permanent 500 = the task does not exist (deleted or wrong ID).

ParametersJSON Schema
NameRequiredDescriptionDefault
frogNoDread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level). 0 removes (stored as false)
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.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=true, destructive=false, so safety is covered; the description goes well beyond by disclosing the Full Access Token requirement, the storage encoding (isStarred 3/2/1/-1), the account setting needed for Low/Toxic levels, and a concrete error contract (a permanent 500 means the task does not exist). This is exactly the extra context annotations cannot carry.

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?

Purpose is front-loaded in the first sentence, and the remaining sentences carry auth, encoding, account-setting, scope-exclusion and error information, all of which earn their place. There is mild redundancy (priority is defined once as P1-P3/low and again as isStarred values), which keeps 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 no explanation. With three simple parameters, full schema coverage, and annotations covering the mutation profile, the description supplies everything else an agent needs: auth prerequisite, scope limits, the removal sentinel, account settings affecting visibility, and the failure signature.

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 description coverage is 100%, so the baseline is 3; the description adds value by mapping the app-facing labels (P1-P3, low, dread levels 1-4) onto the integer encodings, including that 0 removes the setting. It is somewhat duplicative of the schema's own value documentation, keeping it just above baseline.

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 (set/change) applied to a specific resource (priority and/or dread/frog level on a TASK), using the app's own vocabulary (P1-P3, low, isStarred, isFrogged). It explicitly distinguishes the target resource from projects, which use a different field and different sibling tool.

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?

Names when the tool applies (existing TASK) and when it does not (projects), and routes the caller to the correct alternative by name: update_category_or_project for project priority. The 'existing task' constraint and the wrong-ID failure mode further bound correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_reminderA

Set an own reminder on a task, or a standalone reminder. With task_id the reminder is written in the app's form: an entry in the task's reminders list (reminderId of 13 characters, time in seconds) and a server entry of type M with taskId — the app shows it under Reminders and the notification arrives, and mark_done/delete_task clean it up. A clock time on a task is set with update_task(time=...). Without task_id a standalone server entry of type M is written (requires Marvin's mobile app for the notification).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNotification text (max 200 chars). Standalone: required. On a task: the task's title is used
task_idNoThe task's id: the reminder is added to the task in the app's form. Omit for a standalone reminder
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?

Annotations only declare the write/idempotent/safety profile; the description goes well beyond by disclosing the internal representation (task reminders list entry plus a type-M server entry), the cleanup behavior (mark_done/delete_task remove it), and a real operational constraint (standalone reminders require Marvin's mobile app for the notification). That is exactly the extra context annotations cannot express.

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 purpose, then the two modes in order. It is dense and includes some low-level implementation detail ('reminderId of 13 characters', 'type M') that is arguably noise for an agent, but it stays on one topic and every sentence carries routing or behavioral value.

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 explained, and the annotations cover the safety profile. The description completes the picture with both invocation modes, the cleanup path, and the delivery limitation for standalone reminders, so an agent has everything needed to 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?

Schema coverage is 100%, so the baseline is 3 and the schema already documents title/task_id/time_unix_seconds semantics. The description adds mode-dependent meaning beyond the schema, notably that standalone reminders need the mobile app for delivery, though most of the task_id/title split largely restates the schema 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?

The description states a specific verb+resource ('Set a reminder') and immediately splits it into the two distinct modes it supports (on a task vs. standalone). It also names the sibling that handles the related clock-time case (update_task(time=...)), letting an agent distinguish it from update_task, get_reminders and delete_reminder without reading 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 conditional guidance: 'With task_id...' versus 'Without task_id...', and explicitly redirects the clock-time-on-a-task case to update_task(time=...). This is a clear when-to-use / when-to-use-something-else routing that leaves nothing to inference.

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/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses a verified failure mode: the API returns 500 if the balance would go negative, and it directs the agent to get_account_info first. This is valuable behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry the entire definition with no filler. The core action is front-loaded, and the critical warning is placed immediately after, making the description easy to scan and parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition is nearly complete for invocation: the schema fully documents parameters, an output schema exists, and the description supplies the most important operational caveat. The only mild gap is that 'a reward' is not explicitly defined or parameterized, but this does not block correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters with 100% coverage, so the description adds little parameter-level meaning. The phrase 'large purchases' vaguely relates to the points amount, but it does not clarify format, constraints, or semantics beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: spending reward points on a reward. It uses a specific verb and resource, making the tool's purpose unambiguous, and the phrase 'on a reward' helps distinguish it from related point-management operations. It does not explicitly name a sibling tool for contrast, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit precondition: check the balance via get_account_info before large purchases to avoid the 500 error. This is clear, actionable usage guidance. It does not, however, discuss when not to use this tool or when an alternative should be chosen.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_trackingB
Idempotent

Start time tracking on a task.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesTask ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, but the description adds no behavioral context beyond the action itself. It does not disclose side effects (e.g., whether it creates a new time track or overwrites an existing one) or requirements like authentication. The idempotency hint is useful, but the description does not elaborate on it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It is front-loaded with the action and resource, and no information is extraneous.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with an output schema and annotations covering safety, the description is minimally adequate. However, it does not provide workflow context (e.g., that it pairs with stop_tracking) or mention any preconditions. The existence of an output schema reduces the need for return-value explanation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with task_id described as 'Task ID', so the schema carries the meaning. The description does not add any additional context about the parameter, but the baseline of 3 applies since the schema is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'start time tracking' and the resource 'a task'. It distinguishes itself from the sibling 'stop_tracking' by describing the opposite operation. However, it lacks specificity about what 'time tracking' entails or what constitutes a task state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

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 alternatives. There is no mention of conditions for starting tracking, prerequisites (e.g., task must exist), or exclusions. The description only states what it does, not when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_trackingA
Idempotent

Stop time tracking on a task; the time lands in get_time_tracks. Stop time tracking for a task. Note (documented API limitation, confirmed live 2026-09-02): the task's own times/duration fields are not updated by /track STOP — the tracking only lands in /tracks (get_time_tracks). Exception: mark_done during active tracking now writes task.times (see mark_done).

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesTask ID

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?

Beyond the annotations, the description discloses a significant behavioral quirk: task.times/duration fields are not updated, and tracking only appears in get_time_tracks/tracks. It also records the side-effect exception for mark_done, giving the agent accurate expectations about where data lands. This strongly exceeds what readOnlyHint, idempotentHint, and destructiveHint already convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and well organized, but the first two sentences repeat the same message almost verbatim: 'Stop time tracking on a task' and 'Stop time tracking for a task.' The API limitation note is valuable, but the duplication means not every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, idempotent, non-destructive mutation with an output schema, the description covers the result location, a documented API limitation, and the mark_done exception. It does not need to explain return values because an output schema exists, and the idempotentHint covers repeated-call expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage for the single task_id parameter is 100%, so the description does not need to compensate. It adds some context by referring to 'the task's own times/duration fields,' but it does not add parameter-level format or meaning beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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 on a task.' It clearly differentiates from siblings by naming where the tracking lands, get_time_tracks, and by noting the opposite behavior of mark_done. The action could not be confused with start_tracking or reading tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

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 the tool is used: when time tracking on a task should be stopped. It also provides an important conditional exception involving mark_done, though it does not explicitly spell out 'use this instead of X' beyond the implied contrast with start_tracking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_connectionA
Read-only

Check that the API token works 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.1/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 meaningful behavioral context by specifying that a successful check returns OK if the API token works. This clarifies the tool's non-destructive auth-testing behavior beyond what annotations alone state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two short sentences, front-loading the core purpose ('Check that the API token works') and then specifying the success result. Every word contributes value, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

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 connectivity check with an output schema present, the description fully covers what an agent needs to invoke it correctly. The safety profile is captured by annotations, and return semantics are succinctly stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 of 4 applies. The description mentions apiToken conceptually, but since there is no schema to document, no parameter-level detail is needed or missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Check') with a clear resource ('API token' against Marvin's API) and states the expected result ('Returns OK if the apiToken works'). This clearly distinguishes the tool from sibling tools like get_account_info or get_rate_limit_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for verifying API token validity but provides no explicit guidance on when to choose it over alternatives. No sibling exclusions or conditions are given, so an agent must infer usage from the tool name and description alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unclaim_reward_pointsA
Idempotent

Undo a reward-point award tied to a task. Undo a point award (e.g. after a misclick, or when the task was un-completed with unmark_done). Only works for awards tied to a real task ID: Marvin's server stores no entry for MANUAL awards (verified live 2026-08-19, /unclaimRewardPoints responds 404 'No such entry'). Compensate a MANUAL award with spend_reward_points for the same amount instead.

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.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses that only real task IDs work, that manual awards have no server entry, that the endpoint responds 404 for manual awards, and that spend_reward_points is the correct compensation path. This adds valuable behavioral context not present in the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then provides use cases, limitations, and an alternative. There is slight redundancy between the opening sentence and the second sentence ('Undo a reward-point award' vs 'Undo a point award'), but the structure is otherwise tight and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool description covers purpose, trigger scenarios, constraints, error behavior, and alternative handling for manual awards. Since an output schema exists, not detailing return values is acceptable. The description is complete for correct invocation and handling of edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 to item_id by clarifying it is a task ID that determines the point amount and that MANUAL is not supported. This goes beyond the schema's basic description, so a 4 is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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: 'Undo a reward-point award tied to a task.' It clearly distinguishes itself from sibling tools like claim_reward_points and spend_reward_points by focusing on undoing awards and explicitly calling out the unsupported MANUAL case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete when-to-use scenarios ('after a misclick', 'when the task was un-completed with unmark_done') and an explicit when-not-to-use case (MANUAL awards) with the exact alternative (spend_reward_points for the same amount). This is exemplary routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unmark_doneA
Idempotent

Undo a task's completion, and the habit's record. Projects and categories: refuses without writing — a closed project is reopened in the app. Sets done=false and clears doneAt via /doc/update (Full Access Token); the app's own undo leaves doneAt in place. A task that never had a day (firstScheduled 'unassigned' and no fieldUpdates.day stamp) got its day from /markDone: the day that mark_done set is removed (stored as 'unassigned'; the app's own undo writes null — both mean no day). Otherwise the day stays. As in the app: the clock time's reminder (T) is not restored — the time does not remind until it is set again — but own reminders in the reminders list still apply. Habit task: the habit's latest record is undone with /updateHabit undo and habitRepAt is cleared, but only if the history's last entry is the task's habitRepAt; otherwise the response says so and the habit is left untouched (undo always takes the latest entry). Open habit task (a partial record on a habit with a count): nothing is written — undo the record with record_habit undo=true, as the app's undo does. Kudos are not adjusted; reward points are undone with unclaim_reward_points. A permanent 500 = the document does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesTask ID (not a project — those are reopened in the app)

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 cover safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false) but the description adds substantial non-structured behavior: sets done=false and clears doneAt via /doc/update, refuses on projects/categories, day-removal semantics for firstScheduled 'unassigned', that the clock-time reminder is not restored, habit undo only fires if the last history entry matches habitRepAt, and that a permanent 500 means the document does not exist. This is well beyond what annotations convey.

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 purpose is front-loaded in the first sentence, and every subsequent sentence carries a distinct behavioral edge case, so the length is justified by the operation's complexity. The dense run-on structure makes it harder to scan than ideal, but there is little wasted text.

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 explained, and the description still covers the tricky outcomes (refusal on projects, untouched habit on history mismatch, permanent 500). Nothing an agent needs to call this 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% and the schema description already states 'Task ID (not a project — those are reopened in the app)', so the description largely reinforces rather than adds new parameter syntax. It does add the downstream consequence of passing a project id, giving slight value 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?

States a specific verb+resource ('Undo a task's completion, and the habit's record') and immediately distinguishes itself from its inverse sibling mark_done and from record_habit. An agent can tell exactly what this 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes alternatives: for an open habit task with a count it says nothing is written and to use record_habit undo=true instead; for reward points it points to unclaim_reward_points; for projects it says the call refuses and the app reopens it. When-to-use and when-to-use-something-else are both covered.

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 a category or project: labels, color, icon, note, project fields. Update fields on an existing CATEGORY or PROJECT via /doc/update (Full Access Token). For tasks, use update_task. Fields marked 'Projects ONLY' (day/due_date/priority/frog/size) are blocked for categories: if any of them is given, the tool first reads the document (1 extra API call) and refuses if it is a category. The reason is structural, not technical: a category can never be completed or checked off, and deadline, scheduling, priority and frog belong to things that can be finished — projects and tasks. The API accepts the fields on categories (live-tested 2026-09-11) but they are not meaningful there (rule 2026-09-11). label_ids applies to both categories and projects. Strategy-dependent fields (start/end date, planned_week/month, review_date, orbit) can be set even when the strategy is disabled in the app. Do not complete projects here (done via /doc/update skips the app's side effects) — that is done in the Marvin app. Note: Marvin's server can sporadically respond 500 on /doc/update (transient and atomic); just retry. But a PERMANENT 500 (persists across retries) means the document does not exist — deleted, or a wrong/never-existing ID (the server responds 500 instead of 404 for missing IDs, verified live 2026-08-29). Fetch a fresh ID via get_categories/get_children.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoProjects ONLY: schedule YYYY-MM-DD, 'today', or 'unassigned' to unschedule
frogNoProjects ONLY: Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level). 0 removes
iconNoIcon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only when Master List → Configure View → 'Show Custom Icon On' includes projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong)
noteNoNew note (replaces the existing one)
sizeNoProjects ONLY: size XS/S/M/L/XL (taskSize 1-5), '' removes
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 the own estimate takes precedence; without one the project shows the sum of its children's (per Marvin support)

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?

Annotations only cover the safety/idempotency profile; the description goes much further by disclosing the hidden extra read call (1 extra API call) when project-only fields are supplied, the Full Access Token requirement, replacement semantics for note/label_ids, and the 500-instead-of-404 convention 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core routing and blocking rules are front-loaded in the first two sentences, but the middle section is bloated with dated provenance notes ('live-tested 2026-09-11', 'verified 2026-08-29') and a philosophical justification for the category/project split that an agent does not need to invoke the tool.

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 22 parameters and a mutation tool with only a bare annotation set, the description covers auth requirements, error semantics, cross-tool routing, refusal conditions, and strategy-dependent field behavior. With an output schema present, return values need no further explanation.

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 baseline is 3, but the description adds real meaning: which fields apply to categories versus projects, why day/due_date/priority/frog/size are refused on categories, and that label_ids works on both. A few parameters (orbit, no_auto_orbit, first_scheduled) are noted as undocumented, which is honest but leaves some residual ambiguity.

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 ('Update a category or project') and enumerates the editable surface. It explicitly routes task updates to update_task, so the agent can distinguish it from the closest sibling without opening either 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?

States when to use update_task instead, warns not to complete projects here because the app's side effects would be skipped, and explains the 'Projects ONLY' field blocking behavior on categories. It also gives explicit retry guidance for transient 500s versus permanent 500s.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_notebookA
Idempotent

Rename a standalone notebook or change its sections. Renaming is refused on a notebook that belongs to a project or category (the app would otherwise show the notebook's name instead of the project's). The section list is read just before the write and is rewritten in full. On removal, sectionId is first set to null on the pages in that section, so that no page points to a missing section. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNew name — standalone notebooks only
notebook_idYesThe notebook's id (nb_...)
sections_addNoNew sections (titles), added last
sections_deleteNoSection ids to remove; their pages become unsectioned
sections_renameNoSection id -> new title

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 annotations (readOnly=false, idempotent=true, destructive=false) by disclosing read-modify-write semantics (section list read just before the write and rewritten in full), the exact side effect of removal (sectionId nulled on affected pages), and a stability caveat about undocumented experimental endpoints matched to app 1.71. This is exactly the extra context annotations cannot carry.

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 purpose, then layers constraints and mechanics efficiently in five short sentences with no filler. The endpoint/version sentence is dense but justified as a stability warning, so it 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?

An output schema exists, so return values need not be described, and the description covers the mutation semantics, refusal condition, side effects, and reliability caveat. An agent has everything needed to invoke this 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: the refusal condition constrains title, and the full-rewrite / null-out behavior explains how sections_add, sections_delete, and sections_rename interact. Only the id format and object shape are left entirely to the schema.

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?

States a specific verb and resource: rename a notebook or change its sections, and scopes the rename to standalone notebooks. It does not name any sibling tool (e.g. update_notebook_page) to route the agent, but the standalone-vs-project distinction makes the operation unambiguous.

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 when-not: renaming is refused on a notebook that belongs to a project or category, with the rationale. It does not name alternative tools an agent should consider, so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_notebook_pageA
Idempotent

Change a page's text, title, order or section, or move it. text replaces, append adds at the end; '- ' at the start of a line is written as '* '. New text shows up immediately in an open client. Move: the section does not follow (sectionId null). The first page of a notebook with a parent is not moved out — it is the parent's note. Moving to a project or category without a notebook creates one in the app's shape. The response says when an order change switches which page the parent's note points to. Relies on undocumented writes (/doc/create and /doc/update, marked experimental by Marvin); the shape is matched against app 1.71.

ParametersJSON Schema
NameRequiredDescriptionDefault
rankNoNew order (lowest rank = page 1)
textNoNew text (replaces)
titleNoNew title
appendNoText to add at the end (after a blank line)
page_idYesThe page's id (pg_...)
section_idNoSection id, '' = no section
move_to_parent_idNoMove the page to a project's or category's notebook (created if needed)
move_to_notebook_idNoMove the page to this notebook

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?

Adds a great deal beyond the annotations: overwrite-vs-append semantics, markdown rewriting ('- ' becomes '* '), immediate propagation to open clients, the section-not-following rule on move, auto-creation of a notebook when moving to a project/category, and the fact that the response signals parent-note re-pointing. It even discloses reliance on undocumented experimental write endpoints. Note the tension with destructiveHint=false (text replaces existing content) and idempotentHint=true (append is not idempotent), but the description itself discloses these behaviors rather than contradicting them, so the agent is not misled.

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 purpose and labels the move behavior, and the length is defensible for 8 parameters and several edge cases. A few clauses are dense and cryptic (e.g. the sentence about the response signalling an order change), which keeps it from a 5.

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 parameter count, the move/section complexity, and an existing output schema (so return values need not be explained), the description covers the non-obvious edge cases well. It does not touch permissions/auth or error conditions, which is the remaining gap.

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 description coverage is 100%, so the baseline is 3, but the prose genuinely adds meaning: it explains replace-vs-append behavior, the blank-line separator on append, the '- ' to '* ' rewrite, and that move_to_parent_id auto-creates a notebook. It clarifies semantics rather than merely restating 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?

Opens with a specific verb and resource plus an enumeration of the modifiable facets (text, title, order, section, move), which immediately distinguishes it from create_notebook_page and delete_notebook_page. An agent knows exactly which mutation surface this tool covers 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?

Gives strong contextual guidance on which parameter to reach for (text replaces vs append adds) and states conditional limits on moves ('the section does not follow', 'the first page of a notebook with a parent is not moved out'). It never names an alternative sibling or an explicit do-not-use case, so it stops just 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.

update_recurring_taskA
Idempotent

Change a recurring task: rule, window, place, end date, properties. Existing occurrences are not corrected when the rule changes via the API, and a later save in the app does not correct them either; they keep their old shape. When the rule is changed in the app's dialog, the app itself removes those that no longer match. When type, interval or Create occurrences change, the tool then works out which open, untouched occurrences from today on do not match the new rule or window. Mode 'list' (default): they are listed and removed only with confirm=true (without deletedDates: they do not come back if they do not match the rule, and outside the window they should come back). Changed occurrences, occurrences before today, custom rules that are not RRULEs and Only on weekdays are listed only. Deleted occurrences can remain visible in an open client until it reloads. New occurrences follow a rule and properties changed via the API, counted from the start day. Custom accepts only an RRULE string. Lowering Create occurrences via the API removes nothing, not even at the next generation; the app's dialog removes untouched upcoming occurrences when the lowering is saved there. confirm=true does what the dialog does.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoNote (replaces)
sizeNoSize XS-XL, '' removes it
titleNoNew title
customNocustom: an RRULE string, e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR'
repeatNoNew type (not to/from after_completion). The dialog's eleven types: daily, weekly (weekday), monthly (month_day), x_times_per_week (weekdays), every_x_days / every_x_weeks / every_x_months / every_x_years (interval), after_completion (after_days), on_off (on_days, off_days), custom (custom: an RRULE string, e.g. 'RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR')
confirmNoTrue = remove the occurrences the cleanup listed
ends_onNoEnd date YYYY-MM-DD, '' removes it
on_daysNoon_off
weekdayNoweekly
intervalNoevery_x_*
off_daysNoon_off
priorityNoisStarred 3/2/1/-1, 0 removes it
weekdaysNox_times_per_week
label_idsNoLabels (replaces)
month_dayNomonthly
parent_idNoMove the recurring task (the next occurrences land there)
subtasks_addNoNew subtasks on the recurring task
bonus_sectionNoEssential/Bonus, '' removes it
daily_sectionNoDay section, '' removes it
only_weekdaysNoOnly on weekdays: a month day on a weekend is moved to Friday (verified); every_x_days counts in weekdays (inferred)
if_you_miss_oneNoIf you miss one
recurring_task_idYesThe recurring task's ID (recurringTaskId on an occurrence)
create_occurrencesNodefault/0/1/3/7/14/30
hard_deadline_daysNoHard deadline, 0 = off

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 declare readOnly=false, idempotent=true, destructive=false, openWorld=false, so the bar is lower, yet the description adds genuinely non-obvious behavior: occurrences keep their old shape after a rule change, removal happens only with confirm=true, deleted occurrences linger in open clients until reload, custom accepts only an RRULE, and lowering create_occurrences via the API removes nothing while the app's dialog does. The occurrence removal it discloses for confirm=true is in slight tension with destructiveHint=false, but it is an explicit, opt-in cleanup of derived occurrences rather than destruction of the target task, so it is not scored as a contradiction.

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?

The first sentence is a clean, front-loaded summary, but the rest is an unstructured ~230-word run-on that repeats 'via the API'/'in the app' and 'the app's dialog' many times and uses fragments like 'Mode list (default): they are listed...' to embed the confirm semantics. The density makes the critical list-vs-confirm rule hard to extract.

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 24-parameter update tool with an output schema present, the description concentrates on the surprising behaviors an agent most needs (occurrence reconciliation, confirm-gated deletion, delayed propagation, RRULE-only custom rules) while parameter-level details sit in a 100%-covered schema. It lacks only prerequisites such as permissions and what happens to untouched properties, so it is essentially 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?

With 100% schema description coverage the baseline is 3, but the description adds real semantics on top of the schema: changing repeat, interval or create_occurrences triggers reconciliation of open untouched occurrences from today on, custom accepts only an RRULE string, and lowering create_occurrences via the API removes nothing even at the next generation. These are behavior-level meanings the schema alone does not convey.

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 opening line 'Change a recurring task: rule, window, place, end date, properties' gives a specific verb (change), the exact resource (recurring task) and the editable dimensions, so the purpose is unmistakable. It does not, however, differentiate itself from siblings such as update_task or create_recurring_task, so the agent must infer which tool owns 'recurring' semantics.

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?

Usage is implied rather than stated: the 'Mode list (default)' vs 'confirm=true' discussion effectively describes a preview-then-confirm workflow, and the app-vs-API notes hint at when reconciliation happens. But there is no explicit 'use this tool when…' clause and no contrast against update_task/create_recurring_task, so an agent gets the mechanics of the confirm flag but not the selection rule.

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 a task: title, day, time, reminders, size, subtasks. /doc/update (Full Access Token). Categories/projects: update_category_or_project; priority and frog: set_priority; completion: mark_done. Changing the day does what the app does: reminderTime and the server entry T move to the new day, own reminders (M) stay and are listed in the response. New clock time: new T, own reminders (including 'X min before') keep their time. time='' removes the clock time in the app's form. If the day is removed (day='unassigned') the clock time and T are removed as in the app; own reminders stay. Subtasks are written with dotted keys. parent_id or subtasks on a recurring occurrence give a warning: the recurring task stays as it is, so future occurrences follow it — change it with update_recurring_task. Strategy-dependent fields are stored even when the strategy is off in the app. A sporadic 500 on /doc/update is transient (retried once); a permanent 500 = the document does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoSchedule on YYYY-MM-DD, 'today', or 'unassigned' to unschedule
noteNoNew note (replaces the existing one)
sizeNoSize XS/S/M/L/XL (taskSize 1-5), '' removes (false)
timeNoClock time HH:MM (requires a day). Writes the app's form: taskTime, title prefix 'HH:MM ', reminderTime and a server entry of type T — the app reminds at that time. '' removes the time (update_task)
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)
remindersNoOwn reminders: 'HH:MM' on the task's day, or 'before:N' = N minutes before the clock time. Stored as the reminders list + one server entry of type M per reminder; before values are saved as an absolute time, as in the app. Without a day, today applies. Replaces the list; [] removes all own reminders
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
subtasks_addNoNew subtasks (titles), added last
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
subtasks_doneNoSubtask ids to check off (ids from the task's subtasks)
custom_sectionNoID of a custom section from strategySettings.customStructure, '' removes
subtasks_renameNoSubtask id → new title
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, or time_block_id from create_time_block), '' removes. Shows under the block's section in Today when Time Block Sections is on, the day view is grouped by time block (per device, not synced) and the task is scheduled on the block's day — see create_task
snooze_until_unix_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 say non-read-only, idempotent, non-destructive; the description adds the endpoint and auth requirement (/doc/update, Full Access Token), the day/time coupling (T entry moves, own M reminders stay), the outcome of day='unassigned', and failure semantics (transient 500 retried once, permanent 500 = missing document). These are behavioral facts the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and routing are front-loaded, and nearly every sentence carries a distinct behavior. Some lines are telegraphic to the point of opacity (the M/T entry shorthand, 'strategy-dependent fields are stored even when the strategy is off'), costing a little readability for a 29-parameter tool.

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 high-complexity mutation tool it covers the essentials: auth level, destructive-free semantics, edge cases around scheduling and recurrences, and error transience. An output schema exists, so the description is not obligated to explain return values, and it correctly limits itself to noting reminders are echoed back.

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, but the description adds cross-parameter meaning the per-field schema text cannot: changing the day relocates reminderTime and the T entry while own reminders remain, and subtasks are written with dotted keys. It stops short of documenting most of the 29 fields, which the schema already handles.

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 plus an enumeration of the updatable surface ('Update a task: title, day, time, reminders, size, subtasks'). It also routes three adjacent operations to their own tools (update_category_or_project, set_priority, mark_done), so an agent can distinguish it from siblings 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?

Gives explicit when-not guidance: categories/projects, priority/frog, and completion belong to other tools, and changes to a recurring task belong in update_recurring_task. The warning that parent_id/subtasks on a recurring occurrence leave the recurrence untouched is exactly the kind of exclusion that prevents a wrong call.

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. 24 tool updatesv1.7.3
    • Changedcreate_category_or_project3 fields changed
      • changedInput schema / properties / frog / anyOf
        Previous value: -[
        -  {
        -    "maximum": 3,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 4,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / frog / description
        Previous value: -"Projects ONLY: frog marker 1=normal, 2=baby, 3=monster"New value: +"Projects ONLY: Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level)"
      • changedInput schema / properties / time_estimate_minutes / description
        Previous value: -"Time estimate in minutes. NOTE: rendered as the project's OWN estimate — the UI does not aggregate it with the children's, despite the wiki's claim (verified in the app 2026-08-29)"New value: +"Time estimate in minutes. The project's own estimate takes precedence; without one the project shows the sum of its children's (per Marvin support)"
    • Addedcreate_notebook
    • Addedcreate_notebook_page
    • Addedcreate_recurring_task
    • Changedcreate_task7 fields changed
      • changedInput schema / properties / frog / anyOf
        Previous value: -[
        -  {
        -    "maximum": 3,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 4,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / frog / description
        Previous value: -"Frog marker 1=normal, 2=baby, 3=monster"New value: +"Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level)"
      • changedInput schema / properties / note / description
        Previous value: -"Note (markdown)"New value: +"Note (markdown; '- ' at line start is written as '* ', see list_capabilities.note_format)"
      • addedInput schema / properties / reminders
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Own reminders: 'HH:MM' on the task's day, or 'before:N' = N minutes before the clock time. Stored as the reminders list + one server entry of type M per reminder; before values are saved as an absolute time, as in the app. Without a day, today applies"
        +}
      • addedInput schema / properties / size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "XS",
        +        "S",
        +        "M",
        +        "L",
        +        "XL",
        +        ""
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Size XS/S/M/L/XL (taskSize 1-5). XS and XL can be disabled in the account. Written with /doc/update after creation (/addTask drops the field)"
        +}
      • addedInput schema / properties / subtasks
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Subtasks (titles), written after creation"
        +}
      • addedInput schema / properties / time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Clock time HH:MM (requires a day). Writes the app's form: taskTime, title prefix 'HH:MM ', reminderTime and a server entry of type T — the app reminds at that time. '' removes the time (update_task)"
        +}
    • Addeddelete_notebook
    • Addeddelete_notebook_page
    • Changeddelete_reminder1 field changed
      • addedInput schema / properties / task_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The task's id when the reminders belong to a task: they are then also removed from the reminders list"
        +}
    • Changeddelete_task2 fields changed
      • changedInput schema / properties / item_id / description
        Previous value: -"ID of the document to delete"New value: +"ID of the task (or of a project/category without open children) to delete"
      • addedInput schema / properties / scope
        Added value: +{
        +  "default": "this",
        +  "description": "Occurrence of a recurring task: 'this' = only this one (default), 'all' = the whole recurring task with all open occurrences (completed ones are kept). The recurring task's own id is accepted only with 'all'",
        +  "enum": [
        +    "this",
        +    "all"
        +  ],
        +  "type": "string"
        +}
    • Changedget_due_items1 field changed
      • addedInput schema / properties / include_hidden
        Added value: +{
        +  "default": false,
        +  "description": "True = include occurrences the app hides (Keep just one)",
        +  "type": "boolean"
        +}
    • Addedget_notebook
    • Addedget_notebooks
    • Changedget_today_items1 field changed
      • addedInput schema / properties / include_hidden
        Added value: +{
        +  "default": false,
        +  "description": "True = include occurrences the app hides (If you miss one)",
        +  "type": "boolean"
        +}
    • Changedmark_done2 fields changed
      • changedInput schema / properties / item_id / description
        Previous value: -"Task ID (NOT a project — see description)"New value: +"Task ID (NOT a project — mark_project_done closes those)"
      • addedInput schema / properties / value
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Habit task with a count only: the value to record (default 1)"
        +}
    • Addedmark_project_done
    • Addedsearch_notebooks
    • Changedset_priority2 fields changed
      • changedInput schema / properties / frog / anyOf
        Previous value: -[
        -  {
        -    "maximum": 3,
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 4,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / frog / description
        Previous value: -"Frog: 3=monster, 2=baby, 1=normal, 0=remove"New value: +"Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level). 0 removes (stored as false)"
    • Changedset_reminder7 fields changed
      • removedInput schema / properties / reminder_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Custom ID; randomized otherwise. Do NOT use a task ID here — see description."
        -}
      • addedInput schema / properties / task_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The task's id: the reminder is added to the task in the app's form. Omit for a standalone reminder"
        +}
      • addedInput schema / properties / title / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / title / default
        Added value: +null
      • changedInput schema / properties / title / description
        Previous value: -"Text shown in the notification (max 200 chars)"New value: +"Notification text (max 200 chars). Standalone: required. On a task: the task's title is used"
      • removedInput schema / properties / title / type
        Removed value: -"string"
      • changedInput schema / required
        Previous value: -[
        -  "title",
        -  "time_unix_seconds"
        -]New value: +[
        +  "time_unix_seconds"
        +]
    • Changedunmark_done1 field changed
      • changedInput schema / properties / item_id / description
        Previous value: -"Task ID"New value: +"Task ID (not a project — those are reopened in the app)"
    • Changedupdate_category_or_project4 fields changed
      • changedInput schema / properties / frog / anyOf
        Previous value: -[
        -  {
        -    "maximum": 3,
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 4,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / frog / description
        Previous value: -"Projects ONLY: frog 3=monster, 2=baby, 1=normal, 0=remove"New value: +"Projects ONLY: Dread/frog 1-4 (read in the app, 2026-10): 1=I dread this a little (A little), 2=I dread this (Dread), 3=I dread this a lot (A lot), 4=This might kill me (Toxic — requires 'Enable toxic frog level' in the account; Simple mode shows only one level). 0 removes"
      • addedInput schema / properties / size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "XS",
        +        "S",
        +        "M",
        +        "L",
        +        "XL",
        +        ""
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Projects ONLY: size XS/S/M/L/XL (taskSize 1-5), '' removes"
        +}
      • changedInput schema / properties / time_estimate_minutes / description
        Previous value: -"Time estimate in minutes, 0 removes it. On projects: rendered as the project's OWN estimate, no aggregation with the children's (verified in the app 2026-08-29)"New value: +"Time estimate in minutes, 0 removes it. On projects the own estimate takes precedence; without one the project shows the sum of its children's (per Marvin support)"
    • Addedupdate_notebook
    • Addedupdate_notebook_page
    • Addedupdate_recurring_task
    • Changedupdate_task6 fields changed
      • addedInput schema / properties / reminders
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Own reminders: 'HH:MM' on the task's day, or 'before:N' = N minutes before the clock time. Stored as the reminders list + one server entry of type M per reminder; before values are saved as an absolute time, as in the app. Without a day, today applies. Replaces the list; [] removes all own reminders"
        +}
      • addedInput schema / properties / size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "XS",
        +        "S",
        +        "M",
        +        "L",
        +        "XL",
        +        ""
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Size XS/S/M/L/XL (taskSize 1-5), '' removes (false)"
        +}
      • addedInput schema / properties / subtasks_add
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "New subtasks (titles), added last"
        +}
      • addedInput schema / properties / subtasks_done
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Subtask ids to check off (ids from the task's subtasks)"
        +}
      • addedInput schema / properties / subtasks_rename
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Subtask id → new title"
        +}
      • addedInput schema / properties / time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Clock time HH:MM (requires a day). Writes the app's form: taskTime, title prefix 'HH:MM ', reminderTime and a server entry of type T — the app reminds at that time. '' removes the time (update_task)"
        +}
  2. 2 tool updatesv1.7.2
    • Changedcreate_category_or_project1 field changed
      • changedInput schema / properties / icon / description
        Previous value: -"Icon name with a library prefix, e.g. 'lucide-Rocket' (Lucide, PascalCase) or 'huge-happy' (verified in the app 2026-08-29); the app's picker also allows emoji. Rendered directly on categories; on projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"New value: +"Icon name with a library prefix, e.g. 'lucide-Rocket' (Lucide, PascalCase) or 'huge-happy' (verified in the app 2026-08-29); the app's picker also allows emoji. Rendered directly on categories; on projects only when Master List → Configure View → 'Show Custom Icon On' includes projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong)"
    • Changedupdate_category_or_project1 field changed
      • changedInput schema / properties / icon / description
        Previous value: -"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"New value: +"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only when Master List → Configure View → 'Show Custom Icon On' includes projects ('Categories & Projects' verified in the app 2026-08-31, 'Just Projects' 2026-09-18; the earlier wording 'projects never render their own icon' was wrong)"
  3. 5 tool updatesv1.7.1
    • Changedcreate_category_or_project1 field changed
      • changedInput schema / properties / icon / description
        Previous value: -"Icon name with a library prefix, e.g. 'lucide-Rocket' (Lucide, PascalCase) or 'huge-happy' (verified in the app 2026-08-29); the app's picker also allows emoji. Categories ONLY — projects NEVER render their own icon (the flag stays; only the color is used)"New value: +"Icon name with a library prefix, e.g. 'lucide-Rocket' (Lucide, PascalCase) or 'huge-happy' (verified in the app 2026-08-29); the app's picker also allows emoji. Rendered directly on categories; on projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"
    • Changedcreate_task1 field changed
      • changedInput schema / properties / time_block_section / description
        Previous value: -"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block). NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29, and re-verified 2026-09-13 with app 1.70.0.0, PWA + desktop, Time Blocking on). In the app the link is carried by the block's own mapping to a label/category/smart list (see get_today_time_blocks), and a block shows its tasks only during its own clock time — to make a task appear in a block, give the block a category in the app and put the task there. Reported upstream"New value: +"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block). Points the task at a time block; the task then appears under that block's section in Today. Three conditions (verified in the app 2026-09-17, 1.70.0.0, PWA + desktop): (1) the Time Block Sections strategy is on, (2) the day view is grouped by time block (Group by → Group by time block section — set per device, not synced; help article 1950243), (3) the task is scheduled on the block's day (day ≤ that date) — an unscheduled task with the field set is stored but does not appear in Today at all. Without (2) no sections render and the field looks inert. The field is sufficient on its own: the block needs no label/category/smart list, and blocks from create_time_block behave like blocks created in the app. The block's own Smart Time Block mapping (label/category) is a second, independent route that catches matching tasks without this field. The section shows before the block's start time (after its end: untested). The field is not exposed in the app's task settings — the app sets it when a task is added directly inside a block section"
    • Addedlist_capabilities
    • Changedupdate_category_or_project1 field changed
      • changedInput schema / properties / icon / description
        Previous value: -"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. ONLY meaningful on categories — projects never render their own icon (verified in the app 2026-08-29)"New value: +"Icon name with a library prefix ('lucide-Rocket', 'huge-happy'), '' removes. Rendered directly on categories; on projects only with Master List → Configure View → 'Show Custom Icon On' = 'Categories & Projects' (verified in the app 2026-08-31 — the earlier wording 'projects never render their own icon' was wrong)"
    • Changedupdate_task1 field changed
      • changedInput schema / properties / time_block_section / description
        Previous value: -"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block), '' removes. NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29 and 2026-09-13); in the app the link is carried by the block's own label/category/smart-list mapping — see create_task"New value: +"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block), '' removes. Shows under the block's section in Today when Time Block Sections is on, the day view is grouped by time block (per device, not synced) and the task is scheduled on the block's day — see create_task"
  4. 2 tool updatesv1.7.0
    • Changedcreate_task1 field changed
      • changedInput schema / properties / time_block_section / description
        Previous value: -"Time block ID (from get_today_time_blocks). NOTE: stored, but no visible section link renders in Today even with the Time Block Sections strategy active (verified in the app 2026-08-29) — visible section assignment is done in the app"New value: +"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block). NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29, and re-verified 2026-09-13 with app 1.70.0.0, PWA + desktop, Time Blocking on). In the app the link is carried by the block's own mapping to a label/category/smart list (see get_today_time_blocks), and a block shows its tasks only during its own clock time — to make a task appear in a block, give the block a category in the app and put the task there. Reported upstream"
    • Changedupdate_task1 field changed
      • changedInput schema / properties / time_block_section / description
        Previous value: -"Time block ID (from get_today_time_blocks), '' removes. NOTE: stored, but no visible section link renders in Today even with the strategy active (verified in the app 2026-08-29)"New value: +"Time block ID (from get_today_time_blocks, or time_block_id from create_time_block), '' removes. NOTE: stored, but gives no visible link in Today (verified in the app 2026-08-29 and 2026-09-13); in the app the link is carried by the block's own label/category/smart-list mapping — see create_task"
  5. 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"
  6. 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)"
  7. 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)"
  8. 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.6/5.0

Scored across 50 tools

Disambiguation4/5

Tools are organized around distinct resources and actions (tasks, categories/projects, notebooks, reminders, habits, tracking, rewards), with clear cross-references (e.g. update_task vs update_category_or_project vs set_priority). Minor overlap exists between get_today_items/get_due_items/get_done_items and between start_tracking/get_tracked_item/stop_tracking, but descriptions disambiguate them well.

Naming Consistency4/5

Strong overall verb_noun pattern (create_task, update_task, delete_task, get_notebook, record_habit). A few deviations (mark_done, mark_project_done, set_priority, set_reminder don't include the noun, and get_today_items vs get_due_items is fine) slightly break the pattern but remain readable and predictable.

Tool Count1/5

With 50 tools this is far beyond a well-scoped surface; at this size it becomes hard for an agent to discover and select the right tool. Many tools are tightly coupled (mark_done/mark_project_done/unmark_done, or the seven notebook/page tools) and could be consolidated, making the count feel heavy for the apparent domain.

Completeness4/5

Coverage is extensive — CRUD for tasks, categories/projects, notebooks and pages, plus reminders, habits, recurring tasks, tracking, rewards, goals and labels. Missing pieces include a bulk/clear operation for recurring task occurrences and no 'get_task' single fetch (though update/delete return state), and there is no direct way to undo a manual reward award, but these are minor gaps relative to the breadth.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers