goalslot-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@goalslot-mcpShow me my today's tasks and time logged"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
goalslot-mcp
An MCP server for GoalSlot. It gives an AI assistant tools for goals, tasks, the weekly schedule template, time tracking, the shared timer, reports, notes and the journal, against your own GoalSlot account.
Runs over stdio, so any MCP host can spawn it. Ships four skills that teach a model how to use the tools well.
Install
You need the goalslot CLI signed in first, because this server reads the credential the CLI writes. It never runs a login flow itself.
npm install -g goalslot-cli
goalslot loginThen add the MCP server to Claude Code:
claude mcp add goalslot -- npx -y goalslot-mcpFor Claude Desktop, or any host that takes a JSON config:
{
"mcpServers": {
"goalslot": {
"command": "npx",
"args": ["-y", "goalslot-mcp"]
}
}
}Check it is working:
npx -y goalslot-mcp --list-toolsThis package is not published to npm yet. Until it is, install it from source: clone the repo,
npm install && npm run build, then point the host atnode /path/to/goalslot-mcp/dist/cli.js.
Related MCP server: ExecuFunction MCP Server
How auth works
There is no login flow in this server. stdio is the protocol channel, so a server cannot prompt for anything, and asking a model to handle a token would be worse. It reads a credential that already exists on the machine.
Resolution order:
GOALSLOT_ACCESS_TOKENfrom the environment, if set and non-empty.$GOALSLOT_CONFIG_DIR/credentials.json.%APPDATA%\goalslot\credentials.jsonon Windows.$XDG_CONFIG_HOME/goalslot/credentials.json, else~/.config/goalslot/credentials.json.
The file is written by goalslot login and shared with the CLI. Its shape:
{
"version": 1,
"apiBaseUrl": "https://api.goalslot.io/api",
"apiUrl": "https://api.goalslot.io/api",
"accessToken": "<jwt>",
"refreshToken": "gsl_rt_...",
"accessTokenExpiresAt": "2026-08-25T12:00:00.000Z",
"refreshTokenExpiresAt": "2026-11-23T00:00:00.000Z",
"tokenId": "<uuid>",
"scopes": ["full"],
"user": { "id": "...", "email": "..." },
"defaultTimezone": "Asia/Karachi",
"weekStartsOn": 1
}apiBaseUrl and apiUrl are both read and both written with the same value, so the CLI and this server cannot clobber each other. Unknown keys survive a rewrite.
CLI tokens are ordinary Bearer JWTs carrying typ: "cli" and a cid claim naming the revocable token row, and every normal API route accepts them. Access tokens live one hour. On a 401 this server rotates the refresh token against POST /api/auth/cli/token/refresh, writes the new pair to disk atomically before using it, and replays the original request once. Rotation is single-flight: refresh tokens are single use, and replaying a rotated one revokes the whole credential, so two concurrent refreshes would be a permanent logout.
No token, header or Authorization line is ever written to any log, at any level.
If the credential is missing or dead, every tool returns a structured NOT_AUTHENTICATED or SESSION_EXPIRED telling the model to have you run goalslot login. It will not ask you to paste a token.
Headless and CI
GOALSLOT_ACCESS_TOKEN overrides the file entirely. Pair it with GOALSLOT_REFRESH_TOKEN if you want refresh to work; without one, refresh is disabled and the session dies when the one-hour access token expires. For anything long-lived, set GOALSLOT_CONFIG_DIR instead and let the server manage the file.
Tools
Nine read tools and nine write tools. Read tools are safe to call freely and are annotated readOnlyHint. Every write tool's description starts with WRITES. and nothing exposed here deletes user data.
Read
Tool | What it does |
| Orientation call, no arguments. User, plan limits and current usage, category value strings, labels, timezone, today's date, the current week, and any running timer. Every skill calls this first. |
| Goals with target hours, logged hours, progress, deadline and labels. Optional status, category and label filters. |
| One goal in full, optionally with the user's written reflections on it. |
| Tasks filtered by status, goal, schedule block or day of week, capped so a big backlog cannot flood the context. |
| The weekly schedule template, grouped by day and sorted by start time, with planned minutes per day. |
| Individual time entries over a window or a preset, with a total. Optional goal filter and text search. |
| Nine report endpoints behind one |
| Finds notes by title or body substring, or fetches one by id. Returns the tree path and converts the HTML body to markdown. |
| Journal entries and daily check-ins merged by date: mood, energy, focus, what worked, what blocked. |
Write
Tool | What it does |
| Creates a goal. |
| Updates a goal including its status. Deliberately cannot set |
| Creates a task, optionally linked to a goal and a schedule block. |
| The whole task lifecycle behind an |
| Records time already spent. Supports |
| Starts the shared server timer. Returns |
| Stops the timer into a time entry, or discards it. |
| Creates, updates or deletes one block in the weekly template. Supports |
| Upserts a journal entry and a daily check-in for one date. Markdown in, TipTap HTML out. |
Deliberately not tools
Deleting goals, tasks and time entries; clearing the whole schedule; sharing anything publicly or with another person; the AI coach chat endpoints; billing and account settings; template imports. Destruction with cascading effects and anything that publishes personal data belongs where a human types it, not where an agent can call it in a loop. Use the GoalSlot app or the CLI.
Conventions the tools enforce
Durations are whole minutes, always named
durationMinutes, never a bareduration. Reads also returndurationHoursas a float for display only. A goal'stargetHoursis the single exception.Dates are
YYYY-MM-DDand are rejected at the boundary if they carry a time. "Today" is computed in your timezone, not from a UTC ISO slice.The schedule is a repeating weekly template, not dated events. Every relevant tool description says so.
dayOfWeekis Sunday-first (0 = Sunday), which is not the Monday-first ordering weekly reports use. Both are labelled inline and every response carries adayName.Weekly buckets are recomputed from entry dates rather than read from the API's stored
dayOfWeekcolumn, which is derived in the API server's timezone and can be off by one.
Errors
Failures come back as isError: true with one JSON object:
{
"error": {
"code": "PLAN_LIMIT",
"message": "You've reached your FREE plan limit for goals.",
"httpStatus": 403,
"retryable": false,
"remedy": "The account is at its goal limit. Ask the user to pause a goal with update_goal (status PAUSED), delete one from the CLI, or upgrade. Do not retry.",
"details": { "plan": "FREE", "limitType": "goals" }
}
}remedy is written in the imperative, for the model. Codes: NOT_AUTHENTICATED, SESSION_EXPIRED, PLAN_LIMIT, FORBIDDEN, SCHEDULE_CONFLICT, INVALID_INPUT, NOT_FOUND, RATE_LIMITED, UPSTREAM_ERROR, WRITE_BUDGET_EXCEEDED, READ_ONLY_MODE, TIMER_ALREADY_RUNNING, NO_TIMER_RUNNING.
Skills
Four skills ship in skills/. They carry the judgement the tool descriptions cannot: which order to call things in, what to confirm before writing, and what not to say.
Skill | When |
| Planning a week, blocking time for a goal, rebalancing the schedule. |
| Catching up on untracked time, correcting entries, driving the timer. |
| End of week, "how did my week go", writing a reflection. |
| "Am I on track for X", deciding between cutting a target and moving a deadline. |
Install them into Claude Code by copying the directories into your skills folder:
# macOS and Linux
cp -r "$(npm root -g)/goalslot-mcp/skills/"* ~/.claude/skills/
# Windows PowerShell
Copy-Item "$(npm root -g)\goalslot-mcp\skills\*" "$env:USERPROFILE\.claude\skills\" -RecurseFrom a clone, copy skills/* from the repo instead. Project-scoped works too: put them in .claude/skills/ inside a repo.
Configuration
Variable | Effect |
| Directory holding |
| Overrides the credential file entirely. CI escape hatch. |
| Refresh token to pair with the above. Rotations are held in memory only. |
| API base URL. Defaults to |
| IANA timezone overriding the one from login. |
| Every write tool returns |
| Write calls allowed per process. Defaults to 25. A runaway loop stops here rather than at the plan limit, which only backstops free accounts. |
HTTP transport
Optional, behind a flag:
npx -y goalslot-mcp --http --port 7801It serves the same tool registry at http://127.0.0.1:7801/mcp over the streamable HTTP transport, statelessly.
This is single user and local only. Every request is served with this machine's GoalSlot credentials. There is no per-caller authentication, no OAuth and no token custody, so anyone who can reach the port can read and write the account. It binds to loopback and should stay there. It is not the hosted multi-tenant MCP server tracked in goal-slot-api#55; that needs a real OAuth flow and per-user token storage, which is a different piece of work.
stdio is the supported path.
Development
npm install
npm run typecheck
npm test
npm run build
node dist/cli.js --list-toolsTypeScript strict, ESM, Node 20 or newer. Tests are vitest with a stubbed fetch; nothing in the suite touches a live API. CI runs typecheck, tests and build on Node 20 and 22 across Ubuntu and Windows.
License
MIT
Available Tools
18 toolsgoalslot_create_goalCreate a goalA
WRITES. Creates a new goal on the user's account. category must be a value string from get_context.categories[].value, not a display name. targetHours is the one field measured in HOURS; everything else in this server is minutes. Creating a goal counts against the plan limit reported by get_context. If the account is at its limit this returns PLAN_LIMIT, so check the limit before calling rather than after. Confirm the title, category and target with the user before calling. Do not invent goals from an offhand remark.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Optional hex color such as #3B82F6. | |
| title | Yes | Short goal name, for example "Ship the CLI". | |
| labels | No | Optional labels to attach, as {name, color}. Labels are created if they do not exist. | |
| category | Yes | A category value string, not a display name and not an id. It must be one of the values from get_context.categories[].value, for example DEEP_WORK or LEARNING. An unknown value does not error, it silently produces an uncategorized record, so read get_context first. | |
| deadline | No | Optional target date for finishing the goal. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| description | No | Optional longer description. | |
| targetHours | Yes | Target effort in HOURS, minimum 1. This is the only field in hours; time entries and estimates are in minutes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, destructiveHint false), the description discloses critical side effects: the goal counts against the plan limit, exceeding it returns PLAN_LIMIT, an unknown category silently produces an uncategorized record, and targetHours is the only field in hours while everything else is minutes. This is rich, non-obvious behavioral context that an agent needs to avoid mistakes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads 'WRITES.' and the core purpose, then follows with critical usage notes. Every sentence adds value, though it could be structured as bullets for easier scanning. It avoids fluff while covering essential constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description covers the major pitfalls: unit mismatch, plan limit, category validation, and user confirmation. It doesn't describe the response format, but that is largely inferable for a creation tool; the description provides enough to call successfully without hidden surprises.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description adds meaningful extra semantics: category must be a value string, not a display name or id, and silently produces an uncategorized record if invalid; targetHours is explicitly the only field in hours (all others in minutes). These go beyond the schema's field descriptions, especially clarifying the unit convention.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action verb 'creates' and the resource 'a new goal on the user's account,' distinguishing it from sibling tools like update_goal or create_task. It also reinforces the write nature with the leading 'WRITES.' token, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit preconditions: check the plan limit before calling (via get_context), confirm title/category/target with the user, and use get_context.categories[] values. It doesn't name alternative tools for other operations, but the creation-specific context and the warning against inventing goals from offhand remarks give clear practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_create_taskCreate a taskA
WRITES. Creates a task, optionally attached to a goal and to a weekly schedule block. estimatedMinutes is in MINUTES. Creating a task does not log any time; completing it with update_task does. Prefer attaching a goalId when the task clearly serves one, because that is what makes reports and goal progress meaningful later.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Task-specific notes. | |
| title | Yes | Short task name. | |
| goalId | No | Goal id from list_goals. Never construct or guess an id. | |
| status | No | Defaults to BACKLOG when omitted. | |
| dueDate | No | Optional due date for the task. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| category | No | A category value string, not a display name and not an id. It must be one of the values from get_context.categories[].value, for example DEEP_WORK or LEARNING. An unknown value does not error, it silently produces an uncategorized record, so read get_context first. | |
| description | No | Longer description of the task. | |
| scheduleBlockId | No | Schedule block id from get_schedule. Never construct or guess an id. | |
| estimatedMinutes | No | Estimated effort in whole MINUTES. 90 means one and a half hours. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write (readOnlyHint=false) and non-destructive nature. The description adds the side-effect distinction that creating a task does not log time but completing it with update_task does, and that attaching a goalId affects report/progress meaning—context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all purposeful, with the core action front-loaded. Minor redundancy with 'WRITES.' and the estimatedMinutes unit repeating the schema, but overall tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-param create tool with a fully-covered schema, the description adds key behavioral context (no time logging, goalId preference) and references get_context for timezone/categories. It omits nothing critical an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds the rationale for goalId ('makes reports and goal progress meaningful') and reiterates estimatedMinutes unit, but most parameter meaning is already in the schema. The added guidance nudges it to a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Creates a task') with optional attachments to a goal and schedule block, and explicitly contrasts it with goalslot_update_task for completion/time logging, distinguishing it from siblings like goalslot_create_goal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: prefer attaching a goalId when the task serves one for meaningful reports, and clarifies this tool does not log time—use update_task for that. It names the alternative and the condition, satisfying the highest bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_get_contextGet GoalSlot account contextARead-only
READ ONLY. Call this first, before any other GoalSlot tool, in every session. It returns the facts the other tools require and that you must not guess: the signed-in user, the plan limits and how much of each is already used, the category VALUE strings that create_goal and manage_schedule_block require, the labels, the timezone, today's date in that timezone, the current Monday-first week window, and any timer already running. Do not assume today's date from your own sense of time, and do not invent a category value. Both come from here. Cheap and side-effect free. Call it again after a long conversation rather than relying on a stale copy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive; the description adds that it is 'Cheap and side-effect free' and that it should be re-called after long conversations to avoid stale data. It also clarifies that the returned date and category values must not be guessed, providing additional behavioral nuance beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most critical instruction ('READ ONLY' and 'Call this first') and then provides a compact list of returned facts, followed by warnings. Each sentence contributes value, and the structure guides the agent clearly from invocation to handling of results.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, the description is the only source of return information, and it enumerates the key facts (user, plan limits, category values, timezone, date, week window, timer). It also covers the use-after-long-conversation nuance, making it fully sufficient for the agent to correctly invoke and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description correctly says nothing about input semantics. The schema coverage is trivially 100%, and the description focuses on output context rather than inputs, which is appropriate for a parameterless tool. Baseline 4 is earned because there is no parameter documentation needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it retrieves the GoalSlot account context, enumerating the specific data it returns (signed-in user, plan limits, category values, timezone, etc.). It distinguishes itself from siblings by being the foundational context-gathering tool, and the imperative 'Call this first' reinforces its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to use it: 'Call this first, before any other GoalSlot tool, in every session' and 'Call it again after a long conversation rather than relying on a stale copy.' It also warns against assuming the date or inventing category values, clarifying that this tool is the authoritative source for those facts, leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_get_goalGet one goalARead-only
READ ONLY. Full detail for a single goal, optionally with the user's own written reflections on it. Use this when the conversation is about one specific goal. For "how are all my goals doing", call list_goals instead, which is one request rather than many.
| Name | Required | Description | Default |
|---|---|---|---|
| goalId | Yes | Goal id from list_goals. Never construct or guess an id. | |
| includeReflections | No | Also fetch the user's written reflection history for this goal. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description reinforces this with 'READ ONLY' and adds useful behavioral context: it returns full detail and optionally includes the user's written reflections. It does not substantially describe output shape, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with 'READ ONLY' and the primary purpose. The usage guidance and sibling alternative are compact and directly useful, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-goal retrieval tool with two well-documented parameters and strong annotations, this description covers what the tool does, when to use it, and how it differs from the closest alternative. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema carries the parameter documentation. The description adds no new parameter guidance beyond echoing the optional reflections behavior, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('get') and resource ('single goal'), and clarifies it returns 'full detail' with optional reflections. It also explicitly differentiates itself from list_goals, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage condition: use when the conversation is about one specific goal. It also names the alternative (list_goals) and the condition for choosing it ('how are all my goals doing'), plus a rationale ('one request rather than many').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_get_journalGet journal entries and check-insARead-only
READ ONLY. Returns the user's written journal and their daily check-ins over a window, merged by date. A journal entry is free-written prose plus optional mood and energy. A check-in is the structured version: mood, energy and focus each 1 to 5, plus short "what worked" and "what blocked me" notes. This is what answers "how did my week feel", as opposed to get_report which answers "where did my hours go". Read both when the user asks how a week went. Journal bodies are stored as HTML and converted to markdown here. Quote the user's own words rather than paraphrasing them.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | A single day to fetch. Overrides the range when given. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| preset | No | A named window resolved in the user's timezone: today, yesterday, this_week, last_week, last_7_days, last_30_days, this_month, last_month. Weeks start Monday. If startDate or endDate is also given, the explicit dates win and this is ignored. The response always echoes the range that was actually used. | |
| endDate | No | End of the window, inclusive. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| include | No | Which sources to read. Defaults to both. | |
| startDate | No | Start of the window, inclusive. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already include readOnlyHint=true and destructiveHint=false, but the description adds meaningful behavioral information beyond that: results are merged by date, journal bodies are stored as HTML and converted to markdown, and there is a practical instruction to quote the user's words. This exceeds the baseline set by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'READ ONLY' and each sentence earns its place: scope, content explanation, distinction from get_report, usage hint, and a formatting note. It is slightly long but not padded, and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what data is returned, the merge behavior, the two data types, and the relationship to get_report. Without an output schema it does not spell out the exact response field structure, but the high-quality parameter schema and the description's detail make the tool adequately understandable for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all five parameters, including formats, defaults, and timezone interpretation. The description adds no parameter-specific detail beyond clarifying the distinction between journal and check-ins, which is consistent with the schema's 'include' enum. The baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Returns') and resource ('the user's written journal and their daily check-ins') and clearly distinguishes itself from get_report. It is not a tautology and gives an agent enough to know exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts with get_report ('as opposed to get_report which answers "where did my hours go"') and instructs when to use it ('Read both when the user asks how a week went'). This gives clear selection criteria against a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_get_reportGet a time reportARead-only
READ ONLY. The single reporting tool. Pick a view; the tool routes to the right report and normalizes the answer. Views: "day_total" is minutes per day, the best default for "how did my week go". "summary" with groupBy goal or category is the per-goal rollup. "detailed" lists every entry grouped by day. "day_by_task" is per day broken down by task. "schedule" compares hours PLANNED in the weekly template against hours actually LOGGED, which is the only way to tell "I never allocated time" apart from "I allocated it and did not honour it". "goals_progress" and "dashboard" are account-wide snapshots that ignore the date range. "weekly" and "monthly" are convenience windows. The response always echoes the resolved date range. Quote that range to the user rather than saying "this week", and never state a number that did not come back from a tool. All durations are minutes. Percentages are already computed; do not recompute them.
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | Which report to run. Start with day_total or summary unless you need something specific. | |
| preset | No | A named window resolved in the user's timezone: today, yesterday, this_week, last_week, last_7_days, last_30_days, this_month, last_month. Weeks start Monday. If startDate or endDate is also given, the explicit dates win and this is ignored. The response always echoes the range that was actually used. | |
| endDate | No | End of the reporting window, inclusive. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| goalIds | No | Restrict to these goal ids. | |
| groupBy | No | summary view only. How to roll the totals up. Defaults to goal. | |
| taskIds | No | Restrict to these task ids. | |
| category | No | Restrict to one category value. | |
| startDate | No | Start of the reporting window, inclusive. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| hourlyRate | No | Rate used for billable totals. | |
| includeBillable | No | Add billable totals. Requires hourlyRate to be meaningful. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=true, destructiveHint=false, openWorldHint=true), the description adds: response echoes the resolved date range, all durations are minutes, percentages are precomputed, and the tool normalizes answers. It also warns against inventing numbers, which is actionable behavioral guidance. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'READ ONLY' and 'The single reporting tool', then systematically walks through every view, and ends with response-format guidance. Despite its length, every sentence provides unique value; there is no fluff. It is structured for quick scanning by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, 9 views, no output schema, and rich behavioral expectations, the description covers everything an agent needs: view selection cues, date-range echo behavior, units, recomputation warnings, and explicit guidance on quoting ranges. It also clarifies edge cases like account-wide snapshots ignoring date ranges. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameter descriptions, but the tool description adds significant meaning: it explains each view's use case, clarifies that groupBy applies only to summary, notes that presets are timezone-resolved, and highlights the schedule view's unique planned-vs-logged comparison. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool is the 'single reporting tool' with a clear verb (get) and resource (report), and distinguishes it from siblings by noting it routes to the right report and normalizes the answer. It also lists all views with their purposes, making it unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains when to use each view (e.g., 'day_total' for 'how did my week go', 'schedule' for planned vs logged) and instructs on how to quote the resolved date range to the user. It also says 'READ ONLY' and implies it is the go-to reporting tool, with no ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_get_scheduleGet the weekly scheduleARead-only
READ ONLY. Returns the user's weekly schedule template, grouped by day and sorted by start time. The GoalSlot schedule is a REPEATING WEEKLY TEMPLATE, not a calendar of dated events. A block on Tuesday 09:00-12:00 happens every Tuesday. There is no way to schedule something for one specific date. Times are wall-clock HH:mm with no date and no timezone. dayOfWeek is Sunday-first: 0 = Sunday through 6 = Saturday. Call this before proposing any new block, so you can see which windows are already taken.
| Name | Required | Description | Default |
|---|---|---|---|
| dayOfWeek | No | Restrict to a single day. 0 = Sunday, 1 = Monday, ... 6 = Saturday. Omit for the whole week. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds vital behavioral context by explaining that the schedule is a repeating weekly template, not dated events. It also specifies wall-clock times with no timezone and Sunday-first day indexing, which are not captured in annotations. This significantly enriches the agent's understanding beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence carries essential information: the read-only nature, the repeating-template semantics, time and day conventions, and a clear usage directive. It is front-loaded with 'READ ONLY' and structured logically from purpose to usage, so the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the return shape (grouped by day, sorted by start time) and the crucial conceptual distinction from a dated calendar, which is essential for an agent to interpret results correctly. It also clarifies the time format and day-of-week indexing, and provides explicit guidance to call this before proposing new blocks. With no output schema, this provides sufficient context for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the single parameter dayOfWeek with its range and Sunday-first indexing, achieving 100% coverage. The description repeats this convention but adds no new semantic meaning beyond reinforcing it, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the user's weekly schedule template, grouped by day and sorted by start time. It explicitly contrasts it with a calendar of dated events, distinguishing it from sibling tools like goalslot_manage_schedule_block. The verb 'returns' and resource 'weekly schedule template' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this before proposing any new block, so you can see which windows are already taken,' giving a concrete trigger. It also clarifies the repeating nature of the schedule, preventing the agent from misinterpreting it as a dated calendar. While it doesn't name alternatives, the instruction is clear and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_list_goalsList goalsARead-only
READ ONLY. Lists the user's goals with target hours, hours already logged, progress and deadline. This is the tool that answers "what am I working on" and "am I behind". loggedHours is accumulated by time entries, so it moves whenever log_time is called with a goalId. Returns ids you must reuse verbatim when calling create_task, log_time or manage_schedule_block.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Goal status. One of ACTIVE, COMPLETED, PAUSED. There is no archived state; PAUSED is how a goal is shelved. | |
| labelIds | No | Label ids from get_context.labels[].id. | |
| categories | No | Category value strings from get_context.categories[].value. Omit for all categories. | |
| includeStats | No | Include the active/completed/paused counts for the whole account. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful context beyond that: the freshness of loggedHours tied to log_time, and a critical instruction to reuse returned ids verbatim in other calls. This is valuable behavioral disclosure not captured in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: purpose and output, usage context, and id-reuse guidance. It is front-loaded with 'READ ONLY' and avoids fluff, though 'READ ONLY' is slightly redundant given the readOnlyHint annotation. Still, it remains efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description explains what is returned (target hours, logged hours, progress, deadline), why ids matter (reuse in other tools), and how data stays current (tied to log_time). For a simple list tool with annotations covering safety, nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter (status, labelIds, categories, includeStats) already has an explanatory description. The tool description does not add any parameter-specific semantics, so the baseline score of 3 applies as the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a precise verb and resource: 'Lists the user's goals with target hours, hours already logged, progress and deadline.' It also ties the tool to concrete user questions ('what am I working on' and 'am I behind'), making its purpose unmistakable and clearly distinct from siblings like list_tasks or get_goal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames when the tool is appropriate ('This is the tool that answers...') and explains freshness behavior ('loggedHours is accumulated by time entries, so it moves whenever log_time is called'), which guides when to call it relative to log_time. It does not explicitly name alternatives or exclusions, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_list_tasksList tasksARead-only
READ ONLY. Lists tasks, optionally filtered by status, goal, schedule block or day of week. Statuses are BACKLOG, TODO, DOING, DONE. Results are capped by limit (default 50) so a large backlog cannot flood the conversation; the response says whether it was truncated. dayOfWeek here is Sunday-first (0 = Sunday), which is not the Monday-first ordering that weekly reports use.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum tasks to return. Defaults to 50, maximum 200. | |
| goalId | No | Goal id from list_goals. Never construct or guess an id. | |
| status | No | Task status. One of BACKLOG, TODO, DOING, DONE. | |
| statuses | No | Several statuses at once. Overrides status when both are given. | |
| dayOfWeek | No | Day of week: 0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday. Note this is Sunday-first and differs from the Monday-first ordering weekly reports use. | |
| scheduleBlockId | No | Schedule block id from get_schedule. Never construct or guess an id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses result capping ('default 50'), the motivation ('a large backlog cannot flood the conversation'), truncation signaling, and the Sunday-first dayOfWeek convention that differs from weekly reports. These are non-obvious behaviors not visible in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the read-only safety cue and a direct action, followed by the caveats that matter. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter list tool with no output schema, it covers the major invocation decisions: filters, statuses, cap/truncation, and date-ordering gotcha. It stops short of describing the response structure or sorting, but those are minor for correctly invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters with defaults, enums, and id provenance rules. The description adds useful context for limit and dayOfWeek, but mostly restates statuses and filters rather than introducing new parameter meaning, matching the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'READ ONLY. Lists tasks' — a specific verb and resource — and enumerates the optional filters (status, goal, schedule block, day of week). This clearly separates the tool from siblings like list_goals or list_time_entries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the tool is for listing tasks and gives the filter dimensions and default cap, so an agent can infer when to call it. It does not explicitly name alternatives or exclusion conditions, but none of the sibling names compete for the same task-listing purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_list_time_entriesList time entriesARead-only
READ ONLY. Returns the individual time entries the user logged over a window, with a total. This is the raw record of what was tracked. For aggregates, comparisons and per-goal rollups use get_report instead, which is one call rather than summing these yourself. Every duration is returned as durationMinutes (whole minutes, authoritative) and durationHours (a float for display only, never send it back). The response always echoes the resolved date range, so check it matches what the user meant before quoting numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum entries to return. Defaults to 100. | |
| goalId | No | Only entries credited to this goal. | |
| preset | No | A named window resolved in the user's timezone: today, yesterday, this_week, last_week, last_7_days, last_30_days, this_month, last_month. Weeks start Monday. If startDate or endDate is also given, the explicit dates win and this is ignored. The response always echoes the range that was actually used. | |
| search | No | Substring match against the entry task name. | |
| endDate | No | End of the window, inclusive. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| startDate | No | Start of the window, inclusive. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and destructiveHint, so the description's 'READ ONLY' adds nothing. However, it goes beyond the annotations by explaining the authoritative durationMinutes vs display-only durationHours distinction and the fact that the response echoes the resolved date range, which is critical behavioral context for correctly interpreting results. That extra value justifies a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is economical, with the key scoping guidance and alternative routing up front. The repeated 'READ ONLY' is redundant given annotations but harmless, and other sentences each add value: alternatives, duration handling, and range-echo caveat. No waste, though the redundancy keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description does well to explain the return shape (durations, total, echoed range) and the safety check about verifying the range. It covers the essential pitfalls an agent must know to use it correctly. The only minor gap is no mention of pagination or total semantics, but the limit parameter is self-explanatory and the tool is read-only, so completeness is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter (limit, goalId, preset, search, endDate, startDate) is already well-documented in the schema with defaults, formats, and timezone semantics. The description adds no parameter-specific information beyond what the schema provides, so the baseline of 3 applies. It does mention duration output but that is not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns 'the individual time entries the user logged over a window, with a total', specifying a distinct verb and resource. It further distinguishes itself from get_report by contrasting raw entries against aggregated rollups, making sibling differentiation explicit without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs the agent to use get_report for aggregates, comparisons and per-goal rollups, and frames this tool as the raw-record alternative. The 'rather than summing these yourself' phrasing gives a clear when-to-use condition, and the absence of any other exclusions keeps the guidance unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_log_timeLog a time entryA
WRITES. Records time the user already spent. This is the workhorse tool for catching up on untracked work. durationMinutes is in whole MINUTES: an hour and a half is 90. date is a calendar date in the user's timezone, taken from get_context.today, never guessed. When goalId is set this ALSO increases that goal's logged hours. That is usually what the user wants, but it means a wrong goalId quietly corrupts goal progress, so confirm the goal before logging. Never invent a duration. If the user did not say how long something took, ask. Restate the minutes back in hours when you confirm, so a units mistake is visible. Entries count against the per-day task limit on free plans. Use dryRun true to show a batch to the user before committing it.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The day the work happened. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| notes | No | Optional detail about the session. | |
| dryRun | No | When true nothing is written. The tool validates the arguments and returns exactly what it would have done. Use this to show the user a plan before committing to it. | |
| goalId | No | Credit the time to this goal. This increases the goal's loggedHours. | |
| taskId | No | Link the entry to an existing task. | |
| taskName | Yes | What the time was spent on, in the user's own words. | |
| startedAt | No | Optional ISO 8601 instant with an explicit offset or Z, for example 2026-08-25T09:00:00Z, recording when the work began. Its calendar date in the user's timezone must match the date field or the call is rejected with DATE_MISMATCH. | |
| durationMinutes | Yes | Duration in whole minutes. One hour thirty minutes is 90. Never send hours here and never send a decimal. Minimum 1. | |
| scheduleBlockId | No | Link the entry to the weekly schedule block it belongs to, which is what makes schedule adherence reports work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, but the description goes further, disclosing side effects: 'When goalId is set this ALSO increases that goal's logged hours... wrong goalId quietly corrupts goal progress.' It also reveals free-plan per-day limits and the dryRun validation behavior. No contradiction with annotations; the description adds substantial behavioral context beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, front-loading the purpose and then layering warnings and usage notes. It is perhaps longer than strictly necessary but every sentence adds critical operational detail (units, date sourcing, goal confirmation, dryRun). No filler; efficient for the complexity involved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters and no output schema, the description covers all critical aspects: unit correctness, date handling, side effects, error prevention, and free-plan limits. It explains the dryRun mechanism for previewing batches. For a write tool, it anticipates the likely failure modes and equips the agent to handle them, making it complete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by giving concrete examples ('an hour and a half is 90') and explicit prohibitions ('Never send hours here and never send a decimal'). It also reinforces date sourcing from get_context.today and the goal side-effect warning. These enrich parameter understanding beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'WRITES.' and states 'Records time the user already spent,' specifying the exact verb and resource. It positions itself as 'the workhorse tool for catching up on untracked work,' clearly distinguishing it from sibling tools like start_timer or list_time_entries. The purpose is unmistakable and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it is for recording already-spent time, warns 'Never invent a duration' and to ask if the user didn't specify length, and instructs to use 'dryRun true to show a batch to the user before committing it.' It also advises confirming goalId before logging to avoid corrupting progress. This goes beyond implied context to actionable do/don't guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_manage_schedule_blockCreate, update or delete a schedule blockA
WRITES. Creates, updates or deletes one block in the weekly schedule template. The GoalSlot schedule is a REPEATING WEEKLY TEMPLATE, not a calendar of dated events. A block on Tuesday 09:00-12:00 happens every Tuesday. There is no way to schedule something for one specific date. Adding a block therefore changes every future week, not one date. Say that back to the user before you commit a plan. Overlapping an existing block is rejected with SCHEDULE_CONFLICT. On a conflict, re-read that day with get_schedule and shift your proposal. Never delete the incumbent block to make room without asking. Use dryRun true to validate a whole proposed week and show it to the user before writing anything. Blocks count against the plan limit in get_context, so stop one short of it rather than erroring into it. action "delete" removes a single block. There is no way to clear the whole schedule from this server, deliberately.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Optional hex color such as #FFD700. | |
| title | No | Required for create. What the block is for, such as "Deep Work". | |
| action | Yes | What to do with the block. | |
| dryRun | No | When true nothing is written. The tool validates the arguments and returns exactly what it would have done. Use this to show the user a plan before committing to it. | |
| goalId | No | Link the block to a goal so schedule adherence reports can compare planned against logged. | |
| blockId | No | Required for update and delete. Get it from get_schedule. | |
| endTime | No | Required for create. 24-hour HH:mm wall-clock, for example 12:00. Must be after startTime. | |
| category | No | Required for create. A value from get_context.categories[].value. | |
| dayOfWeek | No | Required for create. 0 = Sunday through 6 = Saturday. | |
| isPrivate | No | Hide this block from anyone the user has shared their workspace with. | |
| startTime | No | Required for create. 24-hour HH:mm wall-clock, for example 09:00. | |
| updateScope | No | update only. "single" changes just this block, "series" changes every block linked by seriesId. Defaults to single. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behaviors beyond the annotation flags: the template is repeating (every Tuesday), there is no single-date scheduling, conflicts reject with SCHEDULE_CONFLICT, dryRun writes nothing, and delete only removes one block. It also explicitly says 'WRITES' at the start, matching readOnlyHint=false without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though lengthy, every sentence is purposeful and action-oriented. It front-loads the most critical context ('WRITES' and the repeating template) and then systematically covers conflict, dryRun, plan limits, and delete semantics. No filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with 12 parameters and no output schema, this description covers all operational essentials: the template semantics, how to handle conflicts, how to validate with dryRun, the plan limit, and the delete/clear limitations. It references related tools (get_schedule, get_context) appropriately, leaving no gap an agent would need to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter already described (e.g., required for create/update, formats, meanings). The description adds marginal parameter-specific detail, like the nuance of 'action delete removes a single block' and updateScope behavior, but the bulk of parameter meaning is already in the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (create, update, delete), the resource (one block in the weekly schedule template), and the key distinguishing property: it operates on a repeating weekly template, not calendar dates. This alone separates it from any dated-event tool and matches its siblings like get_schedule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: use dryRun to validate a whole week before writing, re-read with get_schedule on conflict, stop one short of the plan limit, and never delete an incumbent block without asking. It also states that there is no way to clear the whole schedule, which prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_search_notesSearch notesARead-only
READ ONLY. Finds notes by a substring of their title or body, or fetches one note by id. Notes are a tree, so every result carries its full path such as "Work / Meetings / Standup". Bodies are stored as HTML and are converted to markdown here, then truncated to maxChars, so long notes come back readable rather than as a wall of tags. With no query this lists the user's notes without their bodies, which is the cheap way to see what exists before pulling one. This server cannot create, edit, delete or share notes. Say so rather than looking for another tool.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum notes to return. Defaults to 10. | |
| query | No | Case-insensitive substring matched against note titles and bodies. Omit to list titles only. | |
| noteId | No | Fetch exactly this note, including its full body. Overrides query. | |
| maxChars | No | Maximum characters of each note body to return. Defaults to 4000. | |
| includeShared | No | Also search notes other people shared with the user. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, destructiveHint), the description discloses several behavioral traits: notes form a tree and results carry full paths, HTML bodies are converted to markdown and truncated to maxChars, and omitting the query lists titles only. These details meaningfully explain what the agent can expect beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with 'READ ONLY' and the primary purpose. Every sentence adds meaningful information: tree paths, HTML conversion, truncation, list behavior, and the explicit inability to mutate notes. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with no output schema, the description explains what results look like (paths, converted markdown, truncated bodies, titles when no query). It also covers the key edge cases of empty queries and id-based fetching. Combined with the complete input schema and annotations, an agent has enough to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all five parameters (100% coverage), so a baseline of 3 applies. The description adds extra semantic value by explaining how the parameters interact: noteId fetches a single note, no query lists without bodies, and maxChars controls truncation. It also interprets the query as substring matching on title or body, which reinforces but slightly extends the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: finds notes by substring of title/body or fetches by id. It also clearly marks the operation as READ ONLY and distinguishes it from sibling tools by noting it cannot create, edit, delete, or share notes. This differentiates it from the many goal/task/schedule tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage context: use it to search/substring, fetch by id, or list without bodies when no query. It also tells the agent when not to use it by stating 'This server cannot create, edit, delete or share notes' and advises saying so rather than looking for another tool. This is clear guidance on both when and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_start_timerStart the timerA
WRITES. Starts the shared GoalSlot timer for this account. The same timer the user sees in the web and mobile apps, not a private one. Only one timer can run at a time. If one is already running this returns TIMER_ALREADY_RUNNING with what it is tracking and how long it has been going. Do not pass takeOver to get past that on your own: takeOver DISCARDS the running session and its elapsed time is lost with no time entry written. Show the user what is running and let them choose to stop it or replace it. Attach goalId when the work belongs to a goal, so stopping the timer credits that goal.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Notes carried onto the time entry when the timer stops. | |
| goalId | No | Goal id from list_goals. Never construct or guess an id. | |
| taskId | No | Task id from list_tasks. Never construct or guess an id. | |
| takeOver | No | Replace a session that is already running. DESTRUCTIVE: the replaced session is discarded and its elapsed time is never written anywhere. Only send true after the user has explicitly said to throw that time away. | |
| taskName | No | Free-text label for what is being worked on, for example "Refactoring the timer store". | |
| scheduleBlockId | No | Schedule block id from get_schedule. Never construct or guess an id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: the timer is shared, only one can run, an already-running timer returns TIMER_ALREADY_RUNNING with details, and takeOver discards the running session with elapsed time lost and no time entry written. This gives the agent the safety-critical context needed for correct invocation. No contradiction with annotations; destructiveHint=false reflects the default non-destructive path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and uses a compact paragraph. It is somewhat dense, but each sentence adds necessary operational or safety information, so the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema and six optional parameters, the description covers the most important operational facts: single-timer constraint, conflict response, destructive takeOver semantics, and goal linking. It does not describe the success return payload, but this is a minor gap for a start action whose parameters are already well documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful parameter guidance by warning that takeOver is destructive and by directing the agent to attach goalId when work belongs to a goal so stopping the timer credits that goal. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Starts the shared GoalSlot timer for this account.' It also clarifies this is the same timer seen in web/mobile apps, not a private one, and contrasts clearly with the sibling stop_timer tool by describing start behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: start the timer when work begins, and because only one timer can run at a time, do not use takeOver autonomously. It instructs the agent to surface the existing session and let the user choose to stop or replace it, effectively routing toward goalslot_stop_timer, though not by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_stop_timerStop or discard the timerA
WRITES. Stops the running timer and converts it into a time entry, or discards it. Stopping is atomic and credits the linked goal, so the goal's logged hours go up by the elapsed minutes. Duration is floored at 1 minute and capped at 12 hours: a session left open overnight writes 12 hours, not the real elapsed time, and the response says so via "capped". discard true writes nothing at all and the elapsed time is lost. Only use it when the user says the timer was started by mistake. Attribution fields sent here override whatever the timer was started with.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Notes to save on the resulting time entry. | |
| goalId | No | Overrides or sets the goal the time is credited to. | |
| taskId | No | Task id from list_tasks. Never construct or guess an id. | |
| discard | No | Throw the session away without writing any time entry. Only when the user says the timer was a mistake. | |
| taskName | No | Overrides the label the timer was started with. | |
| scheduleBlockId | No | Schedule block id from get_schedule. Never construct or guess an id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses atomicity, goal crediting, the 1-minute floor and 12-hour cap with a 'capped' response marker, and that discard writes nothing and loses elapsed time. This is rich behavioral detail that the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'WRITES.' and the main action, then proceeds to edge cases in a logical order. While fairly dense, every sentence contributes essential behavioral or usage detail; there is no filler. It could be slightly tightened but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers the core behavior, edge cases, and usage guardrails. It does not mention what happens if no timer is running, which is a minor gap, but the critical operating details (floor, cap, discard semantics) are fully disclosed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant meaning by stating that 'Attribution fields sent here override whatever the timer was started with,' clarifying the role of goalId, taskId, taskName, and scheduleBlockId. It also explains the discard parameter's effect beyond its schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact action: 'Stops the running timer and converts it into a time entry, or discards it.' It clearly identifies the resource (timer) and the two possible outcomes, and it distinguishes itself from sibling start_timer by being its inverse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use when a timer is running. It explicitly scopes the discard option with 'Only use it when the user says the timer was started by mistake.' It does not name alternatives like goalslot_log_time for manual entry, but the trigger condition is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_update_goalUpdate a goalAIdempotent
WRITES. Updates fields on an existing goal, including its status. There is deliberately no way to set loggedHours here. Logged hours are accumulated from time entries; to change them, add or correct a time entry with log_time. There is no archived status. PAUSED is how the user shelves a goal without deleting it. Deleting a goal is not available as a tool at all; tell the user to run the CLI if they want one gone. Only send the fields that should change.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | New hex color such as #3B82F6. | |
| title | No | New goal name. | |
| goalId | Yes | Goal id from list_goals. Never construct or guess an id. | |
| status | No | Goal status. One of ACTIVE, COMPLETED, PAUSED. There is no archived state; PAUSED is how a goal is shelved. | |
| category | No | A category value string, not a display name and not an id. It must be one of the values from get_context.categories[].value, for example DEEP_WORK or LEARNING. An unknown value does not error, it silently produces an uncategorized record, so read get_context first. | |
| deadline | No | New deadline for the goal. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| description | No | New longer description. | |
| targetHours | No | New target in HOURS, minimum 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint false, idempotentHint true), the description discloses critical behavior: it writes, it cannot set loggedHours because those come from time entries, there is no archived status, and CLIs are needed for deletion. It also explains the partial-update expectation with 'Only send the fields that should change,' which is not derivable from the schema or annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. Every sentence adds value: the opening line states purpose, then exclusions, status semantics, deletion guidance, and usage instruction. No filler or redundancy; it is well-structured with the core purpose front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description covers all operational aspects needed to invoke the tool correctly: what it updates, what it cannot update, how to handle related behaviors (logged hours, shelving, deletion), and the PATCH-like calling convention. The only minor gap is the return value, but the annotations and sibling context make this a complete picture for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully describes each parameter. The description adds meaningful usage context by explaining that loggedHours is deliberately absent and instructs to send only changed fields, which clarifies partial-update semantics. This goes beyond what the schema states about optionality, though it doesn't add per-parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: 'Updates fields on an existing goal, including its status.' This is a specific verb and resource that clearly separates it from sibling tools like create_goal or update_task. It also explicitly notes what it does not do (loggedHours, deleting), further sharpening purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when not to use this tool and directs to alternatives: logged hours must be changed via log_time, and deletion is not available as a tool (tell the user to use the CLI). It also clarifies status semantics (no archived, PAUSED for shelving), which helps the agent decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_update_taskUpdate, complete or restore a taskAIdempotent
WRITES. One tool for the whole task lifecycle, selected by action. action "update" edits fields. action "complete" marks the task done AND creates a time entry for actualMinutes, which also increases the linked goal's logged hours; it counts against the per-day task limit. action "restore" reopens a completed task. actualMinutes is required for complete and is in whole MINUTES. Never guess it: ask the user how long the task actually took.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | complete only. The date to log the time against. Defaults to today in the user's timezone. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| notes | No | update or complete. | |
| title | No | update only. | |
| action | Yes | "update" to edit fields, "complete" to finish the task and log time for it, "restore" to reopen it. | |
| goalId | No | update only. | |
| status | No | update only. Use action "complete" rather than setting DONE here, so the time is logged too. | |
| taskId | Yes | Task id from list_tasks. Never construct or guess an id. | |
| dueDate | No | update only. New due date. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| category | No | update only. | |
| description | No | update only. | |
| actualMinutes | No | complete only, and required for it. Whole MINUTES actually spent. | |
| scheduleBlockId | No | update only. | |
| estimatedMinutes | No | update only. Whole MINUTES. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=false annotation, the description details side effects: completing a task creates a time entry, increases the linked goal's logged hours, and counts against the daily limit. It also warns against guessing actualMinutes, adding behavioral nuance the schema and annotations lack.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but information-dense, front-loading the write nature and then systematically covering each action's side effects. It avoids fluff, though the long run-on about complete could be slightly cleaned up; it's still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters and three complex actions, it explains the core behaviors, side effects, and required conditions well. It doesn't cover failure states or edge cases like double-completing, but the essentials are all present, and the rich parameter descriptions fill gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters, but the description enriches key ones: actualMinutes is explicitly called out as required-for-complete and in whole minutes, date is clarified to default to today in user's timezone, and get_context.today guidance adds practical usage context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource, breaking down the tool's three actions (update, complete, restore) and their effects. It clearly distinguishes itself from related tools by positioning it as the single task-lifecycle manager, leaving no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on when to use each action, such as using 'complete' rather than setting DONE so time is logged, and instructs to ask the user for actualMinutes. It doesn't explicitly name alternative tools like goalslot_log_time, but the self-contained lifecycle framing implicitly guides selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
goalslot_write_journalWrite a journal entry or check-inAIdempotent
WRITES. Saves the user's journal entry and daily check-in for one date. Both are upserts keyed by date. IMPORTANT: mode "replace" (the default) REPLACES that day's whole journal body. Use mode "append" to add to what is already there. If the day may already have content and the user did not ask you to overwrite it, append. content is markdown and is converted to the HTML the GoalSlot editor stores. Write in the user's voice, using their words, not a summary of them. focus, worked and blocked are part of the check-in, and the check-in requires mood, energy and focus together. Supplying only some of the three is rejected rather than guessed at. Never invent a mood, an energy level or a reflection the user did not express.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Which day this entry belongs to. Calendar date as YYYY-MM-DD, for example 2026-08-25, interpreted in the user's timezone (get_context.timezone). Never include a time or a Z suffix. Use get_context.today rather than assuming what today is. | |
| mode | No | "replace" overwrites the day's existing body, "append" adds to it. Defaults to replace, so pass append when in doubt. | |
| mood | No | 1 to 5, where 1 is worst and 5 is best. | |
| focus | No | 1 to 5. Check-in only, and it requires mood and energy to be sent as well. | |
| energy | No | 1 to 5, where 1 is drained and 5 is energised. | |
| worked | No | Check-in field: what went well. Requires mood, energy and focus. | |
| blocked | No | Check-in field: what got in the way. Requires mood, energy and focus. | |
| content | No | The journal body, in markdown. Headings, bullets, bold, italic and inline code survive the round trip. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is rich in behavioral detail, but it directly contradicts the annotations: it warns that mode 'replace' REPLACES that day's whole journal body, while annotations declare destructiveHint=false. Additionally, 'append' mode is not idempotent, conflicting with idempotentHint=true. This is a clear annotation contradiction, so the score must be 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but nearly every sentence earns its place by conveying a non-obvious constraint or warning. The 'WRITES.' opener is slightly redundant with 'Saves', but the information is front-loaded and well organized with an 'IMPORTANT' flag.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of this write tool, the description covers the critical input semantics, mode selection, check-in validation, and tone guidance. The main gap is that no output schema exists and the description does not state what the tool returns on success or failure, leaving that to runtime inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema: it explains the default replace behavior and when to append, warns that partial check-in fields are rejected, notes markdown conversion to HTML, and instructs the agent to write in the user's voice. This goes well beyond the parameter types and formats in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear action verb ('Saves') and names the resource ('user's journal entry and daily check-in for one date'). It also distinguishes this tool from read-only siblings like goalslot_get_journal by emphasizing the write/upsert behavior and the replace/append modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit situational guidance: use 'append' when the day may already have content and the user did not ask to overwrite, and notes that partial check-in data will be rejected. It does not explicitly name alternative sibling tools, but the write-vs-read distinction and the append/replace rule provide strong usage direction.
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.
18 tool updates
v0.1.0- First observed
goalslot_create_goal - First observed
goalslot_create_task - First observed
goalslot_get_context - First observed
goalslot_get_goal - First observed
goalslot_get_journal - First observed
goalslot_get_report - First observed
goalslot_get_schedule - First observed
goalslot_list_goals - First observed
goalslot_list_tasks - First observed
goalslot_list_time_entries - First observed
goalslot_log_time - First observed
goalslot_manage_schedule_block - First observed
goalslot_search_notes - First observed
goalslot_start_timer - First observed
goalslot_stop_timer - First observed
goalslot_update_goal - First observed
goalslot_update_task - First observed
goalslot_write_journal
TDQS
Scored across 18 tools
Each tool targets a distinct resource and action (e.g., log_time vs. stop_timer, get_report vs. list_time_entries, get_schedule vs. manage_schedule_block). The overlapping cases are clearly differentiated by descriptions, such as manual logging vs. timer-driven logging, and raw entries vs. aggregated reports. No two tools appear to do the same thing.
All tools follow the 'goalslot_' prefix plus a consistent snake_case verb_noun pattern (e.g., get_goal, create_task, stop_timer). The verb choice is uniform across read (get/list/search) and write (create/update/start/stop/manage/log/write) operations. There are no stylistic deviations or mixed conventions.
18 tools cover a broad domain (goals, tasks, schedule, time tracking, reporting, journal, timer, notes). While this falls slightly above the typical 3–15 'well-scoped' range, the count is justified by the variety of features; each tool has a clear purpose and none are redundant. It feels comprehensive without being bloated.
The core workflows are covered: goal lifecycle (create/update, though delete is deliberately absent), task lifecycle (create/update/complete/restore, but no delete), schedule management (create/update/delete), time logging (manual and timer), reporting (multiple views), and journaling. However, there are no tools to delete or edit time entries, and goals/tasks cannot be fully removed, which are notable gaps for a productivity domain. The server explicitly documents these limitations, but they still create dead ends for agents.
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage TickTick tasks, projects, habits, and focus sessions through the MCP server.141MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with ExecuFunction's project management, knowledge base, code indexing, and calendar tools via MCP, allowing natural language management of tasks, notes, and code.112 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with the app via MCP tools and resources, supporting self-improvement through goal-setting and metrics tracking on Cloudflare Workers.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables authenticated MCP clients to manage projects, tasks, habits, and daily capacity through tool calls.7 npmISC