Strong foundation with clear naming, comprehensive descriptions, and proper schema definitions. All 6 tools follow verb_noun pattern (nowtask_*). Descriptions are detailed (100-250 chars) and include scope requirements. Input schemas use Zod with type constraints and descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. Key gaps: output schemas are not documented in the tool definitions themselves; error handling is generic (ApiError.agentMessage); no pagination guidance in search results despite accepting page/size parameters.
Return the comment thread of one task, oldest first. Use it to understand a decision before acting on the task.
Return one task in full: description, assignee, reviewer, dates, estimate, labels, subtasks, relations and custom fields. Read a task with this tool before changing it, so you patch only what you mean to change.
Return the change log of one task: which field changed, from what to what, who did it and when. Entries whose ruleName starts with "agent:" were made through an API key, that is by an AI agent, and the text after the colon names the key.
List tasks with optional filters and paging. This is the main way to find work. With no arguments it returns the current sprint, which is usually what "what are we working on" means. Combine filters freely: they are joined with AND. Ids come from nowtask_workspace. Prefer this over nowtask_search when you want structured filtering rather than a free-text jump.
Report which nowtask workspace this server talks to, which API key it uses and which scopes that key has. Call this once at the start of a session, or whenever a tool fails with a permission error, so you can tell the user exactly which scope is missing instead of guessing.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Return one task in full: description, assignee, reviewer...') but no formal schema definition is visible in the code. LLMs cannot reliably parse unstructured responses or plan downstream tool calls without knowing field names and types.
nowtask_tasks_search accepts page/size parameters but no guidance on result limits or pagination behavior. Description does not state max page size, default limit, or whether results are capped.
Error handling is generic. ApiError.agentMessage is returned but the code does not show how errors are categorized (retryable vs. fatal) or what recovery guidance is provided. LLMs need explicit 'what to do next' instructions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
Return the workspace dictionary: projects, statuses (id, code, label), people, epics and saved views. Use it to turn a human name into the UUID that write tools need, for example to find the status id for "in review" or the user id for "Anna". Call it once and reuse the result; it changes rarely.
nowtask_tasks_search filter parameter is complex (nested object with field/op/values) but lacks examples or guidance on valid field names and operators. Description lists field keys but does not show how to construct a filter object or provide a worked example.
Scope-based permission gating is implemented (missingScopeMessage check) but no audit trail or logging is visible. Tool calls should be logged with caller, parameters, timestamp, and outcome for compliance and debugging.