gryzzly-mcp
An MCP server that puts the whole Gryzzly time-tracking API (53 tools) in front of any MCP client, resolving names/dates/durations for you so logging time is one call.
Log and edit time —
log_time,log_time_bulk,update_time_entry,delete_time_entry; durations as2h30/90m/1.5h, dates asyesterday/2026-W38, projects/tasks by name, with the day's new total reported.Read your timesheet —
whoami,list_time_entries, andtimesheetfor per-day and per-project totals plus short days.Manage projects and tasks — list/get/create/update/delete projects, tasks, and their budget/time metrics.
Manage the directory — users (list, get, invite), customers (list, get, create, update, delete), plus read-only groups, groupsets, tags and tagsets.
Handle leaves — list/get/create/update/delete leave periods, and import them from CSV/XLSX.
Budget items — purchases and discounts (create, read, update, delete; needs Gryzzly's budget offer).
Exports —
export_projectsandexport_times_and_leavesas CSV/XLSX (upstream usually rejects API keys).Resources —
gryzzly://me,://projects,://users,://customers,://projects/{project}/tasks,://timesheet/{week}.Prompts —
fill_my_week,weekly_review,catch_up_timesheet, all of which read and ask before writing.Safety controls — deletes need
confirm: true,GRYZZLY_READ_ONLY=1withholds writes,GRYZZLY_TOOLSETStrims the surface, and it runs over stdio or Streamable HTTP.
mcp-gryzzly
Your timesheet, filled by asking.
A single Rust binary that puts the whole Gryzzly time-tracking API in front of any MCP client — and makes logging time the easy part.
Ask your assistant "log 2h30 on Alyxa yesterday", "what did I miss last week?", "fill my timesheet from my commits" — and have it land in the same Gryzzly your team actually reports on.
> log 2h30 on Alyxa yesterday, pairing on the importer
log_time 2h30 on Alyxa / Development, Thursday 2026-09-17
that day now totals 7h30
> did I miss anything last week?
timesheet 2026-W38 · 31h30 over 5 days
.INTERNE 16h40 47.6%
Alyxa 9h00 28.6%
Le14 5h50 23.8%
Friday 2026-09-18 is short: 4h of the 7h expectedNo identifiers, no seconds, no date arithmetic. You name a project, say 2h30, and
the server resolves the rest.
Why
Gryzzly's API is an RPC surface of 50 actions where time is attached to tasks by
UUID, durations are seconds, and a list that matches nothing answers 404. It is a
fine API to integrate and a miserable one to hand a language model raw. This server
is the translation layer.
The whole API, nothing hidden. All 50 documented actions, plus
whoami,log_time_bulkandtimesheet, which exist because the API has no/me, no batch and no aggregate. A test fails if that count ever drops.Names, not UUIDs. Every tool takes a project, task, user or customer by name, code, email or id. A name that matches two objects comes back with the candidates rather than a guess — the one thing you never want automated is which project your afternoon went to.
Durations and dates as people say them.
2h30,90m,1.5h,2:30;today,yesterday,monday,2026-W38,last week.Written for a model to read. Structured output with schemas on all 53 tools, annotations on every one, three prompts that stop and ask before writing, and server instructions that say up front that time hangs on tasks.
Fail-closed where it matters. Deletes refuse to run without
confirm: true.GRYZZLY_READ_ONLY=1withholds every write tool.GRYZZLY_TOOLSETStrims the surface to what you actually use.One binary, no state. No database, no OAuth dance, no background jobs. An API key in the environment, stdio or HTTP, and Gryzzly's own rate limit respected from the client side.
Related MCP server: Timesheet MCP Server
Install
git clone https://github.com/edouard-claude/gryzzly-mcp
cd gryzzly-mcp
cargo build --release
# the binary is at target/release/mcp-gryzzlycargo install --git https://github.com/edouard-claude/gryzzly-mcpdocker build -t mcp-gryzzly .
docker run --rm -i -e GRYZZLY_API_KEY=… mcp-gryzzlyThe image runs unprivileged and speaks stdio by default; add --http for the HTTP
transport. See Run it over HTTP instead.
Get an API key from Gryzzly: Administration → API keys. Then check the wiring before pointing a client at it:
GRYZZLY_API_KEY=… mcp-gryzzly --checkbase url https://api.gryzzly.io/v1
toolsets time, projects, directory, leaves, budget, exports
read only false
tools 53
team 6 users visible
acting as Edouard CLAUDE <edouard@squirrel.fr>
projects 41 (41 active)
ready.Configure
Variable | Required | Default | What it is |
| yes | The API key, sent as | |
| A file holding the key instead, for Docker secrets | ||
| The UUID of the person the server acts as | ||
| That person's email, resolved to an id at startup | ||
|
| API root, prefix included | |
| A project name, code or id used when a tool omits one | ||
|
|
| |
|
|
| |
|
| Per-request timeout | |
|
| How long name lookups are reused | |
|
| Retries on 429 and transient 5xx | |
|
| How far back a declaration is searched by id | |
| Listen address for the HTTP transport | ||
| Bearer token the HTTP transport requires | ||
|
|
|
One key, one person. A Gryzzly API key belongs to a team, not to a user, and
the API has no /me. So GRYZZLY_USER_ID or GRYZZLY_USER_EMAIL names whose
timesheet is being filled. A team of exactly one user needs neither. The binary
refuses to start on a malformed variable and names the one at fault.
Connect a client
claude mcp add gryzzly --scope user \
--env GRYZZLY_API_KEY=… \
--env GRYZZLY_USER_EMAIL=you@example.com \
-- /absolute/path/to/mcp-gryzzlyclaude_desktop_config.json:
{
"mcpServers": {
"gryzzly": {
"command": "/absolute/path/to/mcp-gryzzly",
"env": {
"GRYZZLY_API_KEY": "…",
"GRYZZLY_USER_EMAIL": "you@example.com"
}
}
}
}Same shape: one command pointing at the binary, the key in env. The server speaks
the stdio transport and prints nothing but protocol on stdout — logs go to stderr.
Point it at http://127.0.0.1:8080/mcp after starting the server with
--http 127.0.0.1:8080. See below.
Then ask "who am I in Gryzzly?". whoami should answer with your name, your role,
and this week's total.
Tools
53 tools in six toolsets. GRYZZLY_TOOLSETS picks which ones are registered;
GRYZZLY_READ_ONLY=1 keeps only the ones that declare themselves read-only.
time — the point of the whole thing
Tool | |
| Who the server acts as, what it may do, and this week's total |
| Declare time: a duration, a task or project name, a day |
| A whole week in one call, with one outcome line per entry |
| Declared time over a week or a period, names filled in |
| Totals per day and per project, plus the days that fall short |
| Change a declaration's duration, day, task or description |
| Remove one, with |
log_time is the one to know. {"project": "Alyxa", "duration": "2h30", "date": "yesterday", "description": "pairing on the importer"} is enough: the project is
matched by name, its single declarable task is chosen (or you name one), the duration
becomes seconds, and the answer repeats the day's new total so a double entry is
visible immediately.
projects — the catalogue, and its administration
Tool | |
| Filtered by status, customer, or a fragment of name or code |
| One project in full |
| The tasks of a project, containers and completed ones filtered out |
| One task in full |
| Budget and time counters |
| Project administration |
| Task administration |
directory — people and labels
Tool | |
| The team |
| Customers |
| Groups (read-only upstream) |
| Tags (read-only upstream) |
leaves — days off
Tool | |
| Read |
| Write |
| Feed Gryzzly a CSV or XLSX, inline or from a path |
budget — what a project costs beyond time
Tool | |
| Purchases |
| Discounts |
Gryzzly gates both behind its budget offer; without it every call answers
no_permission, and the error says so.
exports — the two download endpoints
Tool | |
| Gryzzly's project export, CSV or XLSX |
| Declarations and leaves, CSV or XLSX |
Both are exposed for completeness and both currently fail with an API key: see Gryzzly, as it actually behaves.
Resources and prompts
Four resources and two templates, for clients that prefer attaching context to calling a function:
URI | |
| The current user and their week |
| Every project |
| Every user the key can see |
| Every customer |
| The tasks of one project, by name or id |
| One week, totalled — |
Three prompts drive the workflows, and all three read before they write:
fill_my_week— read the week, propose the missing entries from real evidence, show a table, stop and wait, then write it in onelog_time_bulkcall.weekly_review— totals, per-project split, and what looks wrong. Writes nothing.catch_up_timesheet— find the empty working days over a period and close them one approved week at a time, leave periods excluded.
Gryzzly, as it actually behaves
Everything below was found against the live API, and every line of it is handled for you. It is written down because the next person integrating Gryzzly will hit the same walls.
What happens | What this server does |
A | Reads that 404 as the empty page it means, so "no time logged last week" is not an error |
| Always sends both |
There is no |
|
There is no |
|
| Reads the current values first, so a partial update stays partial |
| Says exactly that, and points at |
Purchases and discounts answer | Surfaces |
| Reported as a configuration problem when it is |
50 requests per 10 seconds, per team | A sliding window paces the process; 429 and transient 5xx are retried with backoff, honouring |
| Walked page by page when more is needed |
Safety
Filling a timesheet is a write operation on the record your employer bills from, so the defaults lean careful.
Deletes are fail-closed. Seven tools can destroy something; each refuses without
confirm: trueand says what would go. They are annotateddestructiveHint, so a client can warn before running them.Read-only is structural.
GRYZZLY_READ_ONLY=1drops every route that does not annotate itselfreadOnlyHint— not a list of names to keep in sync, so a new write tool is excluded by construction. A test asserts it.Nothing is guessed. An ambiguous name is an error with candidates. A malformed duration is refused before any HTTP call.
log_timereports the day's new total rather than letting a duplicate pass unnoticed.The key never leaks. It is redacted in
Debug, marked sensitive on the HTTP header, and never serialized into a tool answer or a log line.The prompts ask first. All three stop for explicit approval before writing, and the one that proposes entries is told not to invent what it cannot see.
Run it over HTTP instead
mcp-gryzzly --http 127.0.0.1:8080
# MCP at http://127.0.0.1:8080/mcp, health at /healthzOff loopback, the server refuses to start without GRYZZLY_HTTP_TOKEN: one API
key means one identity, and an open endpoint is an open proxy to your team's
timesheet. With the token set, every request to /mcp needs
Authorization: Bearer <token>; /healthz stays open for probes.
docker run -d --name mcp-gryzzly -p 8080:8080 \
-e GRYZZLY_API_KEY=… \
-e GRYZZLY_USER_EMAIL=you@example.com \
-e GRYZZLY_HTTP_BIND=0.0.0.0:8080 \
-e GRYZZLY_HTTP_TOKEN="$(openssl rand -hex 32)" \
mcp-gryzzlyPut TLS in front of it. The process speaks plain HTTP and does not pretend otherwise.
Verify
cargo test # 88 tests
cargo clippy --all-targets -- -D warnings
cargo fmt --all --check
mcp-gryzzly --list-tools # the surface, as registered
mcp-gryzzly --check # the configuration, against the live APIThe suite includes the protocol itself: tests/mcp_stdio.rs spawns the real binary,
speaks JSON-RPC to its stdin and asserts on what comes back — the handshake, all 53
tools with their schemas, the resources, the prompts, an ambiguous name, a refused
delete, read-only mode. tests/api_contract.rs holds every quirk in the table above
against a fake Gryzzly, and tests/mcp_http.rs checks the HTTP transport and its
bearer guard.
src/
├── client.rs RPC over HTTP: rate limiting, retries, the empty-list 404
├── config.rs the environment, validated once, with the key redacted
├── resolve.rs names to identifiers, and the refusal to guess
├── duration.rs 2h30, 90m, 1.5h, 2:30
├── dates.rs today, monday, 2026-W38
├── model.rs the Gryzzly objects, read leniently
├── tools/ one module per toolset, one function per tool
├── resources.rs four URIs and two templates
├── prompts.rs three workflows that ask before writing
└── server.rs capabilities, instructions, and the glueContributing
Issues and pull requests welcome. A change is ready when cargo test,
cargo clippy --all-targets -- -D warnings and cargo fmt --all --check pass, and
when a new tool carries a description, an annotation and an output schema — three
tests will tell you if it does not.
gh repo edit edouard-claude/gryzzly-mcp --add-topic \
mcp,model-context-protocol,mcp-server,gryzzly,time-tracking,timesheet,rust,rmcp,llm-tools,ai-agents,claude,claude-desktop,claude-code,anthropic,api-client,productivity,developer-tools,automation,stdio,streamable-httpLicense
MIT — see LICENSE. Not affiliated with Gryzzly.
mcp-name: io.github.edouard-claude/gryzzly-mcp
Available Tools
53 toolscreate_customerA
Create a customer, the organisation projects are attached to and billed for. Managers can be given by name, email or id. Use it before create_project when the customer does not exist yet; check list_customers first, since a second call creates a duplicate. Returns the new customer with its id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The customer's name. | |
| managers | No | The managers, by name, email or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The customer's identifier. |
| name | No | The customer's name. |
| managers | No | The users managing this customer. |
| is_active | No | Whether the customer is active. |
| created_at | No | When the customer was created. |
| updated_at | No | When the customer was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true. The description adds real value by warning that a second call creates a duplicate, which directly reinforces the non-idempotent semantics. It omits auth/permission requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers domain role, a parameter hint, ordering guidance, and the duplicate warning. Every sentence carries a distinct piece of information 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 2-param create tool with full schema coverage and an output schema, the description covers the creation semantics, prerequisite ordering, duplicate risk, and the return value. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including that managers may be given by name, email or id. The description restates this manager guidance rather than adding format or constraint detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a customer") and immediately clarifies its domain role (the entity that organisation projects are attached to and billed for). This lets an agent distinguish it from the many create_* siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit ordering guidance (use before create_project when the customer doesn't exist) and a concrete precondition plus alternative (check list_customers first to avoid duplicates). Both the when-to-use and the sibling to consult are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_discountA
Grant a discount on exactly one project or one task, named or identified, with a name and an amount taken off its budget. Use it to add a discount; use update_discount to change one. Each call creates a new record, so check list_discounts first to avoid granting it twice. Passing both a project and a task, or neither, is refused before any request. Requires Gryzzly's budget offer.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The discount's name. | |
| task | No | The task it applies to, by name or id. One of project or task. | |
| amount | No | How much is taken off. | |
| project | No | The project it applies to, by name, code or id. One of project or task. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The discount's identifier. |
| name | No | The discount's name. |
| amount | No | How much is taken off. |
| task_id | No | The task it applies to. |
| created_at | No | When the discount was created. |
| project_id | No | The project it applies to. |
| updated_at | No | When the discount was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive, open-world behavior, and the description goes further by disclosing the validation rule (both project and task, or neither, is refused before any request is sent) and an entitlement prerequisite (Gryzzly's budget offer). The non-idempotency consequence is also made actionable via the list_discounts warning.
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 scope constraint and the create-vs-update distinction are front-loaded, and every sentence carries either scope, routing, or a prerequisite. Slightly long across four sentences, but there is no filler or restated name/title.
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 mutation tool with an output schema available, the description need not explain return values, and it covers what matters: scope, sibling routing, duplicate-avoidance workflow, pre-request validation, and the budget-offer prerequisite. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so name, project, task, and amount are already documented, including the 'one of project or task' note. The description restates the one-of constraint and adds a small amount of enforcement detail (refused before any request), but supplies no new format, unit, or identifier syntax beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (grant) and resource (discount) plus the exact cardinality/scope: exactly one project OR one task, named or identified, with a name and an amount off budget. That level of precision separates it cleanly from update_discount, get_discount, and delete_discount without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes creation to this tool and modification to update_discount, and adds a concrete pre-call workflow: check list_discounts first because each call creates a new record. This is when-to-use, when-to-use-something-else, and a de-duplication guard in three sentences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_leave_periodA
Declare a leave period (days off) for a user, the current one by default. Use it for holidays and absences; use update_leave_period to move one and list_leave_periods to check existing ones first. Half days are expressed with start_type and end_type: a single afternoon off is the same day twice, pm to pm. Gryzzly refuses a leave over days that already carry time unless delete_declarations is true, which deletes that time irreversibly.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Whose leave it is, by name, email or id. Defaults to the current user. | |
| end_at | No | Last day off. Defaults to `start_at`, which is one day off. | |
| end_type | No | How much of the last day is off. Defaults to `full`. | |
| start_at | Yes | First day off. | |
| start_type | No | How much of the first day is off. Defaults to `full`. | |
| description | No | Why the person is away. | |
| delete_declarations | No | Delete the declarations already made over those days. Defaults to false, which makes Gryzzly refuse the leave when time is already declared. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The leave period's identifier. |
| end_at | No | The last day of the leave. |
| user_id | No | The user on leave. |
| end_type | No | `full`, `am` or `pm`. |
| start_at | No | The first day of the leave. |
| edited_by | No | Who last edited the leave period. |
| created_at | No | When the leave period was created. |
| start_type | No | `full`, `am` or `pm`. |
| updated_at | No | When the leave period was last updated. |
| description | No | Why the person is away. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: the refusal rule when time is already declared over those days, and that delete_declarations removes that time irreversibly. There is a mild tension with destructiveHint=false, since a conditional irreversible deletion is disclosed, though it defaults to false — the description is more informative than the hint, not contradictory, but the mismatch is worth noting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then alternative routing, then the half-day encoding rule, then the destructive caveat. Four dense sentences with no filler; each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and the mutation semantics are well covered. Remaining minor gaps: no indication of permission requirements for declaring leave on behalf of another user, and no date/timezone format hint for start_at, though the schema carries the parameter-level detail.
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, but the description adds non-obvious semantics: the half-day encoding rule ('a single afternoon off is the same day twice, pm to pm') and the consequence of delete_declarations in relation to the refusal behavior. Those are genuinely useful beyond the per-property 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?
States a specific verb and resource ('Declare a leave period (days off) for a user'), including the default scope ('the current one by default'). It immediately separates itself from update_leave_period and list_leave_periods, so an agent can route without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('for holidays and absences') and names the two most confusable alternatives with their selecting conditions: update_leave_period to move an existing one, list_leave_periods to check existing ones first. That is exactly the routing guidance an agent needs before calling a create tool on a resource that can conflict with existing data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectA
Create a project, the container tasks and time are attached to. A customer and managers or contributors can be named rather than identified. Gryzzly needs a start date, so today is used when none is given; a private project takes contributors, a public one must not. Check list_projects first, since a second call creates a duplicate; then add tasks with create_task, because time cannot be logged on a project without one.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | The project's short code. | |
| name | Yes | The project's name. | |
| tags | No | Tag identifiers to attach. | |
| end_at | No | When the project is supposed to end. | |
| groups | No | Group identifiers to assign. | |
| customer | No | The customer, by name or id. | |
| managers | No | The managers, by name, email or id. | |
| start_at | No | When the project starts. Required by Gryzzly. Defaults to today. | |
| visibility | No | `public` (everyone) or `private` (contributors only). | |
| is_billable | No | Whether the project is billable. | |
| contributors | No | The contributors, by name, email or id. Must be empty on a public project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The project's identifier. |
| code | No | The project's short code. |
| name | No | The project's name. |
| note | No | The project note. |
| tags | No | The tags attached to the project. |
| end_at | No | When the project is supposed to end. |
| groups | No | The groups assigned to the project. |
| status | No | One of `active`, `done`, `archived`. |
| managers | No | The users managing the project. |
| start_at | No | When the project starts. |
| created_at | No | When the project was created. |
| updated_at | No | When the project was last updated. |
| visibility | No | `public` or `private`. |
| customer_id | No | The customer this project belongs to, when any. |
| is_billable | No | Whether the project is billable. |
| contributors | No | The users allowed to declare on a private project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is already covered. The description goes further with genuinely new behavior: duplicate creation on repeat calls, the implicit start-date default ('today is used when none is given'), and the cross-field invariant that a public project must not carry contributors. It stops short of permissions/auth or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then ordered as constraints, defaults and the recommended call sequence. It is dense but nearly every clause carries actionable content; the 'Gryzzly needs a start date' framing is slightly verbose relative to the point it makes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eleven-parameter create tool with an output schema, the description supplies the domain role, the defaulting behavior, the visibility/contributor invariant, the duplicate risk and the required next step. Nothing needed to invoke it correctly in sequence is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all eleven parameters, including start_at's default and the contributors/public constraint. The description adds only a modest relational gloss ('A customer and managers or contributors can be named rather than identified'), which the schema fields largely restate. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource, then adds the conceptual role ('the container tasks and time are attached to'), which is exactly what an agent needs to place it in the domain model. It also names siblings (list_projects, create_task), so it is separable from create_task, create_customer and the other create_* tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Check list_projects first, since a second call creates a duplicate') and an explicit follow-up ('then add tasks with create_task, because time cannot be logged on a project without one'). The alternative/complementary tools and the conditions selecting them are stated outright rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_purchaseA
Record a purchase (an expense outside declared time) against exactly one project or one task, both accepted by name or id. Use it to add a cost; use update_purchase to change an existing one. Creates a new record on every call, so check list_purchases first to avoid duplicates. billing_policy add counts it in the budget, ignore records it only. Requires Gryzzly's budget offer.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What was bought. | |
| task | No | The task it is charged to, by name or id. One of project or task. | |
| paid_at | No | When it was paid. | |
| project | No | The project it is charged to, by name, code or id. One of project or task. | |
| billed_at | No | When it was billed. | |
| paid_price | No | What it cost. | |
| billed_price | No | What it is billed for. | |
| billing_policy | No | Whether it counts in the budget. Defaults to `add`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The purchase's identifier. |
| name | No | What was bought. |
| paid_at | No | When it was paid. |
| task_id | No | The task it is charged to. |
| billed_at | No | When it was billed. |
| created_at | No | When the purchase was created. |
| paid_price | No | What it cost. |
| project_id | No | The project it is charged to. |
| updated_at | No | When the purchase was last updated. |
| billed_price | No | What it was billed for. |
| billing_policy | No | `add` or `ignore`, how it weighs on the budget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description goes beyond them by spelling out the consequence of non-idempotency ('Creates a new record on every call, so check list_purchases first'), the billing_policy side effect on budgets, and the prerequisite feature flag. It stops short of describing permissions or failure modes, keeping it at 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?
Front-loaded with the core action and target, then the routing rule, then the duplicate warning and prerequisite. Nothing is padding. The billing_policy sentence is telegraphic ('add counts it in the budget, ignore records it only') and slightly awkward, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, all documented at 100% coverage, annotations, and an output schema that removes any need to describe return values, the description supplies what is left: the routing alternative, the mutual-exclusion constraint, the duplicate risk, and the feature prerequisite.
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 baseline is 3 and the schema already carries the field-level detail. The description still adds value by stating the exactly-one-of constraint across project/task and that both accept 'name or id', plus a plain-language reading of billing_policy that the enum descriptions only partially convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Record a purchase') and immediately scopes it ('an expense outside declared time', 'against exactly one project or one task'). It explicitly distinguishes itself from update_purchase, which is the closest sibling, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when (add a cost), the when-not (use update_purchase to change an existing one), and a concrete prerequisite workflow ('check list_purchases first to avoid duplicates'). It also names a hard external requirement ('Requires Gryzzly's budget offer'), which is exactly the kind of gating condition an agent needs before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskA
Create a task in a project, both named or identified. Tasks are what time is declared against, so a project needs at least one before log_time works. A task with is_container true only holds other tasks and takes no time; a subtask names its parent. planned_duration and estimated_duration accept human durations (40h, 90m). Check list_tasks first, since a second call creates a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The task's name. | |
| tags | No | Tag names to attach. | |
| end_at | No | When the task is supposed to end. | |
| groups | No | Group identifiers to assign. | |
| parent | No | The parent task, by name or id, when this is a subtask. | |
| project | Yes | The project it belongs to, by name, code or id. | |
| start_at | No | When the task starts. Required by Gryzzly. Defaults to today. | |
| budget_type | No | How the budget is expressed. | |
| hourly_rate | No | The hourly rate, when the type calls for one. | |
| is_container | No | Whether this task only holds other tasks. A container takes no time. | |
| budget_amount | No | The budget amount, when the type calls for one. | |
| hourly_rate_mode | No | Where the hourly rate comes from. | |
| planned_duration | No | Planned time, as a duration (`40h`, `3600s`, `90m`). | |
| estimated_duration | No | Estimated time, as a duration. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The task's identifier. |
| name | No | The task's name. |
| tags | No | The tags attached to the task. |
| end_at | No | When the task is supposed to end. |
| groups | No | The groups assigned to the task. |
| start_at | No | When the task starts. |
| parent_id | No | The parent task, when this task is a subtask. |
| created_at | No | When the task was created. |
| project_id | No | The project the task belongs to. |
| updated_at | No | When the task was last updated. |
| budget_type | No | One of `none`, `detailed`, `global`, `time`. |
| hourly_rate | No | The task's hourly rate. |
| completed_at | No | When the task was completed. |
| is_container | No | Whether the task only holds other tasks. |
| budget_amount | No | The task's budget. |
| hourly_rate_mode | No | One of `task`, `group`, `contributor`. |
| planned_duration | No | Planned duration, in seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, non-idempotent, open-world behavior; the description reinforces non-idempotency by warning that repeat calls duplicate. It also adds semantics the annotations cannot carry: container tasks take no time, subtasks name a parent, and tasks are the unit that log_time declares against.
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?
Four sentences, front-loaded with the core purpose and then the operational caveats. Dense but each sentence carries a distinct fact (dependency, container semantics, duration format, duplicate risk); 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?
With an output schema present, return values need no explanation, and the annotations cover the safety profile. The description fills the remaining gaps an agent needs: required context (project, optional parent), the log_time dependency, duration syntax, and the duplicate hazard.
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% across 14 parameters, so the schema already documents each field, including the duration format examples. The description restates is_container/subtask behavior and the 40h/90m duration format that the schema's own descriptions already provide, adding little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (create a task) plus the scoping detail that it lives in a project identified by name or id. An agent can separate this from create_project, update_task, or delete_task from the description alone.
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 routes the agent to list_tasks first and explains why (a second create call produces a duplicate), which is real when-to-use guidance. It also discloses the cross-tool dependency that log_time requires at least one task, though it never states an outright 'do not use when' condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_customerADestructiveIdempotent
Delete a customer. Gryzzly refuses while projects are attached to it.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be `true` to delete. Ignored when reading. | |
| customer | Yes | The customer, by name or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds real value beyond that by disclosing a business rule that blocks the operation when projects are attached — a failure mode the annotations cannot express. It does not state reversibility or cascade effects, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the operation is front-loaded and the blocking precondition follows immediately. Nothing is padded or restated.
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?
A destructive tool with an output schema and full annotation coverage needs only a crisp statement of action plus the non-obvious failure condition, both of which are present. The agent knows what it does, when it will be refused, and that the return shape is documented elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'customer' (name or id) and 'confirm' (must be true to delete) are fully documented in the schema. The description adds no syntax, format, or constraint detail about either parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (customer) in the first sentence, which cleanly separates it from the create_/update_/get_/list_ siblings by naming convention. It stops short of explicitly differentiating itself from adjacent deletion tools (delete_project, delete_task) in the way a 5 would require.
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 precondition 'Gryzzly refuses while projects are attached to it' implicitly tells the agent when this call will succeed, but there is no explicit when-to-use guidance, no statement of alternatives (e.g. detach projects first), and no mention of required permissions. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_discountADestructiveIdempotent
Delete a discount, which puts its amount back into the project's budget.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The identifier. | |
| confirm | No | Must be `true` to delete. Ignored when reading. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavioral context not in the annotations: deletion restores the discount amount to the project budget, which is the key downstream consequence an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, no filler, with the resource and the important budget side effect both front-loaded. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the destructive/idempotent profile. The budget-restoration effect is the critical missing piece an agent would otherwise lack, making this nearly complete; only permission prerequisites or irreversibility notes are absent.
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%; both the id and the 'Must be true to delete' confirm flag are fully documented in the schema, including the read-mode caveat. The description adds no parameter detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (discount), and adds the consequential side effect that the deleted amount is returned to the project's budget. This clearly distinguishes it from sibling mutations like update_discount or delete_purchase.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to delete versus update a discount, no prerequisites, and no mention of the confirm requirement or irreversibility. Usage is only implied by the verb 'delete'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_leave_periodADestructiveIdempotent
Delete a leave period, which frees its days for declarations again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The leave period's identifier. | |
| confirm | No | Must be `true` to delete. Ignored when reading. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds domain-specific behavioral context beyond them: deletion has the side effect of re-freeing the period's days for declarations. It stops short of stating irreversibility or the confirm requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero filler; the verb and resource lead and the effect follows immediately.
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 annotations covering the destructive/idempotent profile, a 100%-covered schema, and an output schema for return values, the description only needs purpose and effect — both present. It could mention that 'confirm' must be true, but the schema already carries that requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'id' and the mandatory 'confirm' flag fully documented in the schema. The description adds no parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('Delete') and resource ('a leave period'), and adds the consequence that its days become available for declarations again. It is clearly distinguishable from the other delete_* siblings by resource, but it does not explicitly route against alternatives such as update_leave_period.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the note about freeing days for declarations hints at why an agent would delete rather than update or keep the period, but there is no explicit when-to-use/when-not guidance or named alternative. Adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectADestructiveIdempotent
Delete a project. Gryzzly refuses while declarations are attached to it,
which is the safety net; confirm: true is this server's.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be `true`. Without it nothing is deleted. | |
| project | Yes | The project to delete, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, idempotentHint=true, readOnlyHint=false), so the description's job is to add nuance. It does: it discloses a hard server-side refusal condition (attached declarations) and the confirm gate that governs whether anything is deleted. It doesn't discuss reversibility or what the output reports, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no padding; the destructive action and its two gates are front-loaded. The second clause ("which is the safety net; `confirm: true` is this server's") trails off grammatically, costing a point for structure but not for length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, annotated mutation with a 100%-covered schema and an output schema present, the description supplies the two facts an agent most needs before invoking it: the refusal condition and the confirm requirement. Return-value detail is correctly delegated to the output schema, so 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 coverage is 100% and both parameters are already documented in the schema (including "Must be `true`. Without it nothing is deleted."). The description restates the confirm requirement with a rationale framing but adds no new syntax, accepted identifier forms, or edge cases beyond the schema. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ("Delete a project"), which is unambiguous and cleanly distinguishable from siblings like delete_task, delete_customer, or update_project. It does not explicitly name siblings, but the verb+resource pair is concrete enough that no differentiation is needed.
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 the operative precondition: deletion is refused while declarations are attached, and `confirm: true` is required. That is real usage context about when the call will and won't succeed. It stops short of naming alternatives (e.g., detaching declarations first, or update_project), so it isn't a full when/when-not/alternative statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_purchaseADestructiveIdempotent
Delete a purchase, which removes its amount from the project's budget.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The identifier. | |
| confirm | No | Must be `true` to delete. Ignored when reading. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the bar is lower, yet the description still contributes real value by disclosing the downstream effect on the project's budget. It does not address whether the deletion is recoverable or what the response returns, but the budget side effect is the non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler; the action and its consequence are front-loaded and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations cover the safety and idempotency profile. The description supplies the one missing high-value fact — the budget impact — leaving only minor gaps such as reversibility of the delete.
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 both 'id' and the 'confirm' flag (required true to delete) are already documented in the schema. The description adds no parameter detail beyond that, which is the expected baseline when the schema carries the 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?
States a specific verb and resource ('Delete a purchase') and adds the consequence that distinguishes it from a generic delete. It does not explicitly contrast with siblings like update_purchase or get_purchase, but the purchase scoping makes the target unambiguous among the many delete_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to delete versus update, no prerequisites, and no mention of alternatives such as update_purchase or list_purchases. The agent must infer that this is the terminal operation for a purchase record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskADestructiveIdempotent
Delete a task. Gryzzly refuses while declarations are attached to it.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The task to delete, by name or id. | |
| confirm | No | Must be `true`. Without it nothing is deleted. | |
| project | No | The project it belongs to, to disambiguate a name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, readOnlyHint=false, idempotentHint=true), so the bar is lower, and the description still contributes a non-obvious behavioral rule: deletion is blocked while declarations are attached. It does not, however, describe error behavior beyond that or the confirm guard, which lives only 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 short sentences, front-loaded with the operation and followed by the one non-obvious constraint. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the annotations plus description cover the destructive nature and the declaration precondition. What remains thin is failure/auth context, but for a simple single-target delete this is close to sufficient.
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 all three parameters including the mandatory 'confirm=true' guard and the project disambiguator are already documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a task'), which cleanly separates it from the create/update/get/list_task siblings. It does not explicitly differentiate itself from other delete_* tools, but the resource name makes the target 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?
Usage is implied by the operation, and the description adds a useful precondition ('refuses while declarations are attached'), which tells the agent when the call will fail. However, it names no alternatives and gives no guidance on prerequisites such as permissions or the required confirm flag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_time_entryADestructiveIdempotent
Delete one time declaration by its id, as returned by list_time_entries. Irreversible: Gryzzly has no undo, so the call refuses to run without confirm true, and the person should see the entry and agree first. Use update_time_entry instead to correct a duration, day, task or description.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The declaration's identifier. | |
| confirm | No | Must be `true`. Without it nothing is deleted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | What was deleted. |
| kind | Yes | The kind of object that was deleted. |
| deleted | Yes | Always true: a failure is an error, not a `false`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds context the annotations cannot carry: the action is irreversible, Gryzzly has no undo, and the call refuses to run unless confirm is true. This is exactly the behavioral disclosure needed for a destructive mutation.
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 tight sentences: action, risk/gating constraint, then alternative path. The most important operational facts are front-loaded and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, schema-backed tool with an output schema, the description covers everything an agent needs: what it does, the id source, the irreversibility and confirm requirement, and the correct sibling for corrections. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds provenance for the id parameter ('as returned by list_time_entries') that the schema does not provide. The confirm semantics ('refuses to run without confirm true') largely restate the schema, keeping this just short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one time declaration by its id') and ties the identifier to its source ('as returned by list_time_entries'). It explicitly distinguishes itself from update_time_entry, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative with the selecting condition: 'Use update_time_entry instead to correct a duration, day, task or description.' It also sets the precondition that the person must see and agree to the deletion before calling, leaving no ambiguity about 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.
export_projectsARead-only
Download Gryzzly's project export, as CSV or XLSX. Upstream this endpoint wants a browser session, so with an API key it usually fails with an explanation rather than a file.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day of the period. | |
| from | No | First day of the period. | |
| format | No | The file format. Defaults to `csv`. | |
| save_to | No | A path on the machine running this server to write the file to. | |
| projects | No | The projects to export, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the file was too large to inline. |
| text | No | The file itself, when it is text and small enough to read here. |
| bytes | Yes | How many bytes came back. |
| saved_to | No | Where the file was written, when `save_to` was given. |
| content_type | Yes | The file's media type, as Gryzzly labelled it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, openWorldHint), and the description adds real value beyond them by disclosing the upstream browser-session dependency and the typical API-key failure mode. It does not mention the disk side effect implied by `save_to`, which is the one behavior left dark.
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, no filler, and the most decision-relevant fact (it often fails without a browser session) is stated up front rather than buried. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the description covers the critical failure mode. The remaining gap is what happens when `projects` is left null (all projects?) and the fact that `save_to` writes to the server's filesystem.
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 every parameter (including the format enum and the date bounds) is already documented in the schema. The description only echoes the CSV/XLSX formats, adding no syntax or default detail beyond what the schema provides — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Download Gryzzly's project export") and names the output formats (CSV or XLSX), so the agent knows this produces a file rather than records. It doesn't explicitly contrast with the sibling export_times_and_leaves, but the resource name is specific enough to separate the two.
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 caveat that the endpoint "usually fails with an explanation rather than a file" when using an API key is a genuinely useful signal about when this tool will and won't succeed. However, no alternatives are named (e.g. list_projects for querying data), and there's no guidance on defaults such as what happens when `projects` is omitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_times_and_leavesARead-only
Download Gryzzly's combined export of declared time and leave periods over a date range, as CSV or XLSX, optionally saved to a path on the server's machine. Prefer list_time_entries or timesheet for reading time: this endpoint authenticates a browser session upstream, so with an API key it currently fails with an explanation rather than a file. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day of the period. | |
| from | No | First day of the period. | |
| format | No | The file format. Defaults to `csv`. | |
| save_to | No | A path on the machine running this server to write the file to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the file was too large to inline. |
| text | No | The file itself, when it is text and small enough to read here. |
| bytes | Yes | How many bytes came back. |
| saved_to | No | Where the file was written, when `save_to` was given. |
| content_type | Yes | The file's media type, as Gryzzly labelled it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds the decisive behavioral fact that the endpoint requires an upstream browser session and currently fails with an explanation (not a file) under API-key auth. That auth-failure mode is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool produces, followed by the alternative-routing caveat and a one-word safety note. No filler; every sentence carries information the agent needs before invoking.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary; the description still covers the failure mode the output schema cannot. For a 4-param, zero-required export tool, nothing an agent needs to decide or call 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 from/to/format/save_to are already documented in the schema. The description restates the date range, format choices and save path without adding syntax, defaults beyond 'csv', or path-format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Download/export) and resource (declared time and leave periods) with scope (date range), output forms (CSV/XLSX), and an optional server-side save path. It is clearly distinguishable from export_projects and from list_time_entries/timesheet.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the preferred alternatives ('Prefer list_time_entries or timesheet for reading time') and gives the condition under which this tool is the wrong choice (API-key auth fails against the upstream browser session). This is a rare, fully actionable routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_customerARead-only
Read one customer: whether it is active, and who manages it.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be `true` to delete. Ignored when reading. | |
| customer | Yes | The customer, by name or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The customer's identifier. |
| name | No | The customer's name. |
| managers | No | The users managing this customer. |
| is_active | No | Whether the customer is active. |
| created_at | No | When the customer was created. |
| updated_at | No | When the customer was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile, so the bar is lower. The description adds the returned fields but omits notable behavior implied by the schema, such as the 'confirm' flag being ignored for reads, and offers no auth or pagination context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the scope ('one customer') comes first and the payoff is immediate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations carrying the safety profile, the description needn't explain return values. It is essentially complete for a simple single-resource read, though it could note the ignored 'confirm' parameter.
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 both parameters (customer, confirm) are already fully documented in the schema. The description adds no syntax, format, or resolution detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read one customer') and even the fields of interest (active status, manager), which cleanly separates it from list_customers and get_user. It does not name a sibling explicitly, but the singular scope makes the distinction obvious.
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?
Reading one customer implicitly contrasts with list_customers, but the description never states when to use this versus the list or get_user variants, nor any prerequisite. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_discountARead-only
Read one discount by its identifier: name, amount, and the project or task it applies to. Use list_discounts to find the id first. Read-only; an unknown id is reported as not found. Requires Gryzzly's budget offer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The identifier. | |
| confirm | No | Must be `true` to delete. Ignored when reading. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The discount's identifier. |
| name | No | The discount's name. |
| amount | No | How much is taken off. |
| task_id | No | The task it applies to. |
| created_at | No | When the discount was created. |
| project_id | No | The project it applies to. |
| updated_at | No | When the discount was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context beyond annotations: the result for an unknown id and the budget-offer prerequisite. It does not, however, explain the odd confirm parameter that the schema says is ignored when reading.
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 four short sentences with no waste. It front-loads what the tool does, then adds lookup guidance, read-only behavior, and the prerequisite in a logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented. The description covers the required id, the read-only guarantee, not-found handling, the list_discounts lookup path, and the feature prerequisite. Nothing essential for calling this read tool 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 already documents both parameters. The description only restates that the id identifies the discount and says nothing about the confirm parameter. Baseline 3 is appropriate when the schema fully carries 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 states a specific verb and resource ("Read one discount by its identifier") and enumerates the fields returned (name, amount, project/task). It clearly distinguishes this single-object read from list_discounts and from create/update/delete_discount siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to list_discounts to obtain the id first, states the read-only nature, describes the not-found behavior for unknown ids, and names the prerequisite feature (Gryzzly's budget offer). This covers when to use the tool and the key prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupARead-only
Read one group by identifier: its name, its groupset, its manager.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The object's identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The group's identifier. |
| name | No | The group's name. |
| created_at | No | When the group was created. |
| manager_id | No | The group's manager. |
| updated_at | No | When the group was last updated. |
| groupset_id | No | The groupset the group belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the identity of the returned fields, but does not mention permissions, rate limits, or failure behavior for a missing id. With annotations carrying the main burden, this is an adequate but modest contribution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single economical sentence with the core action front-loaded and the returned fields listed after the colon. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter lookup with an output schema present, the description is complete: it identifies the operation, the key, and the returned fields. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single id parameter is already fully documented in the schema. The description only restates that lookup is 'by identifier', adding no syntax, format, or example beyond the structured data. Baseline 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 states a specific verb and resource ('Read one group by identifier') and names the fields returned (name, groupset, manager). It implicitly distinguishes itself from list_groups by saying 'one group', but never explicitly names a sibling as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: fetch a single group when you have its identifier. There is no explicit when-to-use, when-not-to-use, or pointer to a sibling like get_groupset or list_groups, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupsetARead-only
Read one groupset by identifier, and whether its groups are exclusive.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The object's identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The groupset's identifier. |
| name | No | The groupset's name. |
| color | No | The colour shown in the interface. |
| created_at | No | When the groupset was created. |
| updated_at | No | When the groupset was last updated. |
| is_group_unique | No | Whether one group of this set at most may be attributed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds only that the response carries an exclusivity flag, which is return-value information the output schema likely already conveys, so it adds little behavioral 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?
A single well-formed sentence with the action and payload front-loaded and no wasted words.
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-parameter read with full schema coverage, annotations covering safety, and an output schema that documents returns, the description is essentially sufficient. It could name the sibling boundary explicitly to be fully self-guiding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single id parameter already documented as 'The object's identifier.' The description's 'by identifier' merely restates the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (one groupset) and identifies the lookup key (identifier). It implicitly contrasts with the sibling list_groupsets but never names it, so an agent still has to infer the retrieval-vs-listing boundary.
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?
'Read one groupset by identifier' implies the when: single-item lookup when you already have the id. There is no explicit statement of when to prefer it over list_groupsets or get_group, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leave_periodARead-only
Read one leave period by identifier: its days, its half days, its reason.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The leave period's identifier. | |
| confirm | No | Must be `true` to delete. Ignored when reading. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The leave period's identifier. |
| end_at | No | The last day of the leave. |
| user_id | No | The user on leave. |
| end_type | No | `full`, `am` or `pm`. |
| start_at | No | The first day of the leave. |
| edited_by | No | Who last edited the leave period. |
| created_at | No | When the leave period was created. |
| start_type | No | `full`, `am` or `pm`. |
| updated_at | No | When the leave period was last updated. |
| description | No | Why the person is away. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description is consistent with those hints but adds no extra behavioral context such as permission requirements or what happens when the id does not exist (error vs empty), which matters for a fetch tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb, scope and payload summary are all delivered without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the read-only nature. The description is complete enough to call the tool correctly, with only error/not-found behavior left unspecified.
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 both the id and the confirm parameter are fully documented in the schema itself ('Must be true to delete. Ignored when reading.'). The description's 'by identifier' merely restates the id parameter, adding no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('one leave period by identifier') and distinguishes itself from list_leave_periods by emphasizing the single-item, id-keyed scope. It even previews the returned content (days, half days, reason), so an agent knows exactly what it fetches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'by identifier' signals this is the lookup-by-id path versus the list siblings, but there is no explicit when-to-use statement or named alternative (list_leave_periods, get_... variants). Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectARead-only
Read one project in full, found by name, code or id: status, dates, visibility, contributors, managers, groups, tags, customer and note. Use list_projects to browse or search; use get_project_metrics for budget and time counters. Read-only. An ambiguous name is refused with the matching candidates rather than guessed.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | The project, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The project's identifier. |
| code | No | The project's short code. |
| name | No | The project's name. |
| note | No | The project note. |
| tags | No | The tags attached to the project. |
| end_at | No | When the project is supposed to end. |
| groups | No | The groups assigned to the project. |
| status | No | One of `active`, `done`, `archived`. |
| managers | No | The users managing the project. |
| start_at | No | When the project starts. |
| created_at | No | When the project was created. |
| updated_at | No | When the project was last updated. |
| visibility | No | `public` or `private`. |
| customer_id | No | The customer this project belongs to, when any. |
| is_billable | No | Whether the project is billable. |
| contributors | No | The users allowed to declare on a private project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the 'Read-only' statement adds little. However, the description adds a genuinely useful behavioral trait not in the annotations: an ambiguous name is refused and matching candidates are returned instead of guessing, which tells the agent how to handle a failed lookup.
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 tight sentences: the core action and returned fields first, sibling routing second, behavioral caveat last. No filler, and the enumeration of returned fields is compact rather than exhaustive prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-read lookup tool with an output schema present, the description covers everything the agent needs: what it returns, how to disambiguate from siblings, safety profile, and ambiguity failure behavior. Return-value format is delegated correctly to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is already documented as 'by name, code or id.' The description reinforces the accepted identifier forms and adds the ambiguity-resolution behavior tied to that parameter, modestly exceeding the baseline for a fully documented single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one project in full') and enumerates the scope of what is returned (status, dates, visibility, contributors, managers, groups, tags, customer, note). It explicitly distinguishes itself from the sibling tools list_projects and get_project_metrics.
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 alternatives and the conditions that select them: 'Use list_projects to browse or search; use get_project_metrics for budget and time counters.' The agent can route between the three project tools without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_metricsARead-only
Read the budget and time counters of one project, found by name, code or id: budget amount, budget spent, planned time and elapsed (declared) time, durations in seconds. Use list_projects_metrics to compare several projects in one call, and get_project for the project's settings rather than its numbers. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | The project, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| project_id | No | The project these metrics belong to. |
| budget_spent | No | How much of the budget is spent. |
| time_elapsed | No | Declared time, in seconds. |
| time_planned | No | Planned time, in seconds. |
| budget_amount | No | The project's budget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description's 'Read-only' merely restates that. The one genuinely additive detail is the unit disclosure ('durations in seconds'), which the annotations do not provide. Beyond that it says nothing about permissions, missing-data behavior, or freshness of the counters.
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 tightly packed sentences: purpose and return fields first, then sibling routing, then the safety hint. No filler, and the most decision-relevant information is 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?
With an output schema present, the description need not explain return values, and annotations carry the safety profile. Purpose, lookup key, and sibling disambiguation are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented in the schema as 'The project, by name, code or id.' The description repeats that phrasing verbatim, adding no syntax, format, or ambiguity-resolution detail. Baseline 3 is appropriate when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the budget and time counters of one project') and enumerates exactly what is returned: budget amount, budget spent, planned time, elapsed declared time. It also names the lookup key (name, code or id), so an agent can distinguish it from sibling getters without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives with conditions: 'Use list_projects_metrics to compare several projects in one call, and get_project for the project's settings rather than its numbers.' Both the multi-project case and the settings-vs-numbers case are covered, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_purchaseARead-only
Read one purchase by its identifier: name, project or task it is charged to, paid and billed prices, dates and billing policy. Use list_purchases to find the id first. Read-only; an unknown id is reported as not found. Requires Gryzzly's budget offer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The identifier. | |
| confirm | No | Must be `true` to delete. Ignored when reading. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The purchase's identifier. |
| name | No | What was bought. |
| paid_at | No | When it was paid. |
| task_id | No | The task it is charged to. |
| billed_at | No | When it was billed. |
| created_at | No | When the purchase was created. |
| paid_price | No | What it cost. |
| project_id | No | The project it is charged to. |
| updated_at | No | When the purchase was last updated. |
| billed_price | No | What it was billed for. |
| billing_policy | No | `add` or `ignore`, how it weighs on the budget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description's "Read-only" restatement adds little. What it does add is genuinely useful and not in the structured data: unknown ids surface as not-found rather than erroring, and it requires Gryzzly's budget offer — a real prerequisite/feature-gate the agent must satisfy before calling.
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 tight sentences, front-loaded with the action and the id-lookup path, then the prerequisite. Slightly padded by enumerating return fields that an output schema (which exists) already carries, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering return values, annotations covering the read-only profile, and full schema coverage on both params, the description only needed to add the non-obvious bits — the list_purchases prerequisite, not-found behavior, and the budget-offer requirement. It does exactly that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself explains that `confirm` is only meaningful for deletion and ignored when reading — more than the description says. The description only restates that `id` identifies the purchase, adding no format or lookup semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Read one purchase by its identifier") and enumerates what is returned (name, charge-to project/task, paid and billed prices, dates, billing policy). It is immediately distinguishable from list_purchases and from sibling getters like get_project or get_discount.
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 routes the agent: "Use list_purchases to find the id first," which is the key prerequisite for obtaining the required id. It does not state exclusions (e.g., when get_project_metrics or list_purchases would be preferable), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagARead-only
Read one tag by identifier: its name and the tagset it belongs to.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The object's identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The tag's identifier. |
| name | No | The tag's name. |
| tagset_id | No | The tagset the tag belongs to. |
| created_at | No | When the tag was created. |
| updated_at | No | When the tag was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the response includes the tag's name and its owning tagset, which is mild but useful context; there is no mention of error behavior when the id is unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the scope and the returned fields are packed into one clause without 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?
For a simple one-parameter read with full schema coverage, an output schema, and annotations covering safety, the description covers what is needed to invoke it correctly. Nothing critical is missing, though it could note the not-found case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'id' parameter is documented in the schema itself. The description's 'by identifier' merely restates the parameter rather than adding format, source, or lookup semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one tag') and scopes it to a single object via identifier, which cleanly separates it from the sibling list_tags and from get_tagset. It does not explicitly name an alternative, but the singular/plural distinction makes the role 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?
Usage is only implied: an agent can infer this is for fetching a single tag when its id is known. There is no explicit when-to-use, no guidance on when to prefer list_tags or get_tagset instead, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagsetARead-only
Read one tagset by identifier, and whether its tags are exclusive.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The object's identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The tagset's identifier. |
| name | No | The tagset's name. |
| color | No | The colour shown in the interface. |
| created_at | No | When the tagset was created. |
| updated_at | No | When the tagset was last updated. |
| is_tag_unique | No | Whether one tag of this set at most may be attributed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true), so the description only needs to add context. It does add one useful behavioral fact, that the result reports tag exclusivity, but says nothing about error/not-found behavior or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource, with minimal waste. The trailing 'whether its tags are exclusive' clause is slightly awkward but earns its place by disclosing a return-value characteristic.
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 read-only single-entity getter with an output schema present, the description does not need to explain return values. Combined with annotations covering safety, only minor edge-case context (not-found handling) is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'id' parameter is documented in the schema, so the baseline is 3. The description only echoes that lookup is by identifier, adding no format or constraint details 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?
States a specific verb (Read) and resource (one tagset) with the lookup key (identifier), which cleanly separates it from list_tagsets and get_tag/get_tagset-adjacent tools. It does not name a sibling explicitly, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The singular 'one tagset by identifier' implies the single-fetch use case versus the list_tagsets bulk case, but there is no explicit when-to-use or when-not-to-use statement. Usage is inferable from naming conventions rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskARead-only
Read one task in full: its budget, its rate, its planned time, its place in the project's hierarchy.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The task, by name or id. | |
| project | No | The project the task belongs to, to disambiguate a name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The task's identifier. |
| name | No | The task's name. |
| tags | No | The tags attached to the task. |
| end_at | No | When the task is supposed to end. |
| groups | No | The groups assigned to the task. |
| start_at | No | When the task starts. |
| parent_id | No | The parent task, when this task is a subtask. |
| created_at | No | When the task was created. |
| project_id | No | The project the task belongs to. |
| updated_at | No | When the task was last updated. |
| budget_type | No | One of `none`, `detailed`, `global`, `time`. |
| hourly_rate | No | The task's hourly rate. |
| completed_at | No | When the task was completed. |
| is_container | No | Whether the task only holds other tasks. |
| budget_amount | No | The task's budget. |
| hourly_rate_mode | No | One of `task`, `group`, `contributor`. |
| planned_duration | No | Planned duration, in seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read profile is covered. The description adds that the response is the full task record including budget, rate and hierarchy placement, but says nothing about missing-task behavior or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence, front-loaded with the verb and resource, with the enumerated fields earning their place by telling the agent what comes back.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the two parameters are fully covered by the schema. The only gap is the absence of guidance on single-vs-list retrieval, which is minor for a simple read 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 both parameters (task, project) are already documented in the schema, including that project disambiguates a name. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (one task) and enumerates the content returned (budget, rate, planned time, hierarchy). The singular 'one task' implicitly separates it from list_tasks, though that sibling is never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: fetch a single task's full detail. There is no statement of when to prefer this over list_tasks or get_project, and no mention of prerequisites or the name-ambiguity case that the project parameter exists to resolve.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userARead-only
Read one user: their role, their groups, the date their times are approved until, and their rates when the plan exposes them.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | The user, by name, email, id, or `me`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The user's identifier. |
| code | No | The user's code, as set by the administrators. |
| name | No | The user's display name. |
| role | No | One of `contributor`, `collaborator`, `manager`, `director`, `admin`. |
| No | The user's email address. | |
| groups | No | The groups the user belongs to. |
| created_at | No | When the user was created. |
| updated_at | No | When the user was last updated. |
| disabled_at | No | When the user was disabled, if they were. |
| hourly_cost | No | The user's hourly cost. Only on the budget offer. |
| hourly_rate | No | The user's hourly rate. Only on the budget offer. |
| is_disabled | No | Deprecated upstream in favour of `disabled_at`. |
| timesheet_approved_until | No | The date until which this user's times are approved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds one useful behavioral detail — that rates are only returned 'when the plan exposes them' — but says nothing about permissions, error cases, or the meaning of 'approved until'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly packed sentence that front-loads the verb and resource and appends the returned fields with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only getter with an output schema present, the description covers what the agent needs; return-value documentation is provided in the schema. It stops short of routing guidance or edge-case behavior, but nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the single `user` parameter is already documented as accepting name, email, id, or `me`. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one user') and enumerates the returned data (role, groups, approval date, rates). This distinguishes it from siblings like list_users (plural), whoami (self), and get_group (different resource) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the singular 'one user' framing; the description never says when to reach for this vs list_users or whoami, nor any prerequisites. Adequate but leaves the agent to infer the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_leave_periodsA
Import leave periods from a CSV or an XLSX. The content can be written inline, or read from a path on the machine running this server. The report names every line Gryzzly refused.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | The format. Inferred from the file extension, or `csv` for inline content. | |
| content | No | The file's contents, for a CSV written inline. | |
| file_path | No | A path on the machine running this server, for a CSV or an XLSX. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | Whether the import went through. |
| errors | No | Every line the importer rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false. The description adds two pieces of context the annotations cannot: that file_path resolves on the server's filesystem (an important security/location constraint) and that the report names every refused line, disclosing partial-failure semantics. Idempotency/duplicate handling remains unaddressed.
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 the core action before the input-mode details. The closing sentence about refused lines is slightly awkwardly phrased but earns its place by conveying failure behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description need not explain return values. It covers sources, server-side path semantics, and partial-failure reporting, leaving only cross-sibling routing and permission prerequisites uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the format is self-documenting via the ImportFormat enum, so the schema carries the burden. The description reinforces the inline-vs-path distinction but adds no syntax, format, or mutual-exclusivity rules beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (import leave periods) and the accepted source formats (CSV/XLSX). It does not explicitly distinguish itself from siblings like create_leave_period or list_leave_periods, but an agent can infer the bulk-import scope from the name and text.
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 explains the two input modes (inline content vs. a path on the server machine) which is genuinely useful routing guidance. However, it never says when to use this bulk importer instead of the single-record create_leave_period sibling, nor prerequisites such as required permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_userA
Invite someone to the team by email. Gryzzly sends the invitation; the user exists from that moment, pending their acceptance.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | The role to grant. Defaults to `contributor`. | |
| Yes | The email address to invite. Gryzzly sends the invitation itself. | ||
| group_ids | No | Group identifiers to put the new user in. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The user's identifier. |
| code | No | The user's code, as set by the administrators. |
| name | No | The user's display name. |
| role | No | One of `contributor`, `collaborator`, `manager`, `director`, `admin`. |
| No | The user's email address. | |
| groups | No | The groups the user belongs to. |
| created_at | No | When the user was created. |
| updated_at | No | When the user was last updated. |
| disabled_at | No | When the user was disabled, if they were. |
| hourly_cost | No | The user's hourly cost. Only on the budget offer. |
| hourly_rate | No | The user's hourly rate. Only on the budget offer. |
| is_disabled | No | Deprecated upstream in favour of `disabled_at`. |
| timesheet_approved_until | No | The date until which this user's times are approved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, idempotentHint=false, and readOnlyHint=false. The description adds crucial behavioral context beyond annotations: Gryzzly sends the invitation and the user record exists immediately, pending acceptance. This informs the agent about state changes and the non-idempotent nature of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste, front-loading the purpose and then the key behavioral side effect. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, annotations cover the safety profile, and schema descriptions are complete, the description supplies the needed purpose and side-effect details. It could mention permission requirements or duplicate-invite behavior, but those are minor gaps for a simple invite operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add any meaning beyond what the schema already documents for email, role, and group_ids. Baseline 3 is appropriate when the schema fully carries 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?
States a specific verb and resource: 'Invite someone to the team by email.' No sibling tool performs this action, so it is unambiguous. The added clause about the user existing immediately further distinguishes it from a simple notification.
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 clear context for when to use the tool: to invite someone to the team by email. There are no alternative invite tools among siblings, so no explicit comparison is needed, but it also lacks when-not-to-use guidance or prerequisites such as required permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_customersARead-only
List customers, the organisations projects are attached to and billed for. Use it to find a customer's id or name before create_project or list_projects(customer=...); use get_customer for one customer's detail. Read-only. Filter by name fragment, active status, or managers given by name, email or id. An empty result is an empty list, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only customers whose name contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| managers | No | Keep only customers managed by these people, by name, email or id. | |
| is_active | No | Keep only active, or only inactive, customers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description reinforces read-only and adds genuinely non-obvious behavior: an empty result is an empty list, not an error. It stops short of describing pagination behavior beyond what limit/offset imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage routing, then filters, then error semantics. Every clause carries distinct information; no filler or repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers the remaining gaps: alternatives, filter scope, read-only nature, and empty-result semantics. Nothing needed to call or route this tool 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 already documents all five parameters. The description summarizes the filter axes (name fragment, active status, managers by name/email/id), which mirrors rather than extends the schema — correct baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus resource (customers) and even clarifies the domain model — organisations that projects are attached to and billed for. It distinguishes itself from get_customer (single detail) and from list_projects, so an agent can separate it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow trigger ('find a customer's id or name before create_project or list_projects(customer=...)') and names the alternative for single-record retrieval ('use get_customer for one customer's detail'). When-to-use and when-not-to-use are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_discountsARead-only
List discounts (amounts taken off a project's or task's budget) with their names and amounts. Use it to audit what was granted on a project; use get_discount when you already hold one discount id. Read-only. Filters accept project and task names, codes or ids. Without Gryzzly's budget offer every call answers no_permission.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| tasks | No | Keep only charges of these tasks, by name or id. | |
| offset | No | How many objects to skip, for the next page. | |
| projects | No | Keep only charges of these projects, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a valuable behavioral constraint beyond annotations: every call returns no_permission without Gryzzly's budget offer. It does not describe pagination or rate limits, but those are partly covered by 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?
The description is short and front-loads the purpose before usage, alternatives, and caveats. The standalone 'Read-only.' sentence repeats the readOnlyHint annotation and slightly reduces the otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a full input schema, an output schema, and annotations, the description covers purpose, sibling differentiation, permission prerequisites, and filtering behavior. Return values and pagination details are handled by the output schema and input schema respectively, so 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 already documents all four parameters. The description says filters accept project and task names, codes or ids, which largely mirrors the schema descriptions and adds no new syntax or defaults beyond what is already structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List discounts') and clarifies the domain object as amounts taken off a project's or task's budget. It explicitly distinguishes from the sibling get_discount and names what is returned ('their names and amounts').
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 when-to-use guidance ('audit what was granted on a project') and names the alternative ('use get_discount when you already hold one discount id'). It also states the prerequisite for any successful call ('Without Gryzzly's budget offer every call answers no_permission'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsARead-only
List groups, the user groupings Gryzzly assigns projects and rates to. Read-only upstream: groups are managed in the Gryzzly interface.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Keep only these identifiers. | |
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only entries whose name contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| set_ids | No | Keep only members of these sets, by identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds a genuinely useful operational fact beyond them: the upstream is read-only and groups can only be managed through the Gryzzly UI, so no create/update tool exists. It does not cover pagination behavior or result shape, but the output schema handles returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The purpose is front-loaded and the read-only constraint follows immediately, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter list tool with a full schema and an output schema, the description is largely sufficient: identity, domain meaning, and the read-only upstream constraint are all covered. It stops short of routing the agent among the many list_* siblings, which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every one of the five parameters (ids, limit, query, offset, set_ids) is documented in the schema itself. The description adds no filtering, pagination, or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (List) and resource (groups) and adds domain meaning by explaining that groups are the user groupings to which Gryzzly assigns projects and rates. It does not, however, distinguish itself from near-siblings like list_groupsets or get_group, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use guidance, no conditions for choosing this over get_group, list_groupsets, or list_users, and no prerequisites. The only directional hint is that writes must happen in the Gryzzly interface, which is behavioral rather than usage-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsetsARead-only
List groupsets, the families user groups belong to (a groupset holds groups such as teams or sites). Use it to understand how the team is organised before reading list_groups; use get_groupset for one groupset. Read-only, and read-only upstream too: groupsets are managed in the Gryzzly web app. An empty result is an empty list.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Keep only these identifiers. | |
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only entries whose name contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| set_ids | No | Keep only members of these sets, by identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds real context beyond that: groupsets are managed upstream in the Gryzzly web app, so no write path exists, and an empty result is an empty list rather than an error. It stops short of describing pagination behaviour or result ordering, but the safety profile is well covered.
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, front-loaded with the definition, then usage, then behavioural constraints. Every sentence carries information the agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape detail is not required here. The description covers the domain model, the read-only constraint, the empty-result semantics, and routing to siblings, which is everything needed to call a five-parameter list 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?
Schema description coverage is 100%, so all five filters (ids, limit, query, offset, set_ids) are already documented in the schema. The description adds no filter syntax, pagination interaction, or default-value guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List groupsets') and immediately defines the domain concept ('the families user groups belong to ... holds groups such as teams or sites'). It also names the sibling it is not (get_groupset for a single one), so an agent can distinguish it from list_groups and get_groupset without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing advice ('use it to understand how the team is organised before reading list_groups') and points to the alternative for the single-item case ('use get_groupset for one groupset'). Both when-to-use and the alternative are spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leave_periodsARead-only
List leave periods over a week or a period. Useful before logging time: Gryzzly refuses a declaration on a day already declared as leave.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day of an explicit period. | |
| from | No | First day of an explicit period. | |
| week | No | A week: `this week`, `last week`, `2026-W38`, or a date inside it. | |
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| users | No | Whose leaves to read, by name, email or id. Defaults to everyone. | |
| offset | No | How many objects to skip, for the next page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds a non-obvious domain rule not present in structured fields (the system refuses a declaration on a day already declared as leave). It does not discuss pagination behavior, though limit/offset in the schema imply it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the first states what is listed and its scope, the second earns its place by explaining the concrete downstream benefit. The core action is 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?
An output schema exists, so return values need not be explained, and the input schema fully documents all six optional parameters. With annotations covering the read-only/open-world profile and the description covering when-to-use and the leave-conflict rule, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (to, from, week, limit, users, offset) are already documented with examples and defaults in the schema. The description adds no parameter-level syntax or format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List leave periods') plus the scoping dimension ('over a week or a period'), which maps to the week/from/to parameters. It does not name the sibling singular lookups (get_leave_period) or the sibling list tools, so the agent must infer differentiation from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit usage context tied to a sibling workflow: 'Useful before logging time,' which routes the agent to call this before log_time/log_time_bulk. No when-not guidance or explicit alternative-naming, but the when-to-use signal is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsARead-only
List projects, filtered by status, customer or a fragment of their name
or code. This is the starting point for logging time: a project's name
here is what log_time accepts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only projects whose name or code contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| status | No | Keep only these statuses. Defaults to every status. | |
| customer | No | Keep only projects of this customer, by name or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description earns credit for the cross-tool behavioral fact that the name returned here is what log_time accepts, which is not derivable from any structured field. It stops short of describing pagination behavior beyond what the schema already documents.
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, filters front-loaded, and the second sentence is a genuinely useful routing hint rather than filler. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-param list tool with a full-coverage schema and an output schema, the description covers what is needed: what it lists, how it filters, and how its output is consumed downstream. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all five parameters (limit, offset, query, status, customer) are documented there, including enum values for ProjectStatus. The description only restates the filter intent ('status, customer or a fragment of their name or code') without adding syntax, formats, or defaults beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (projects) plus the exact filter dimensions, which cleanly separates it from get_project (single fetch), list_projects_metrics (metrics) and export_projects (export). An agent can pick it out of a very crowded sibling set without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides real when-to-use context by naming the downstream workflow ('starting point for logging time') and the tool it feeds (log_time). It does not, however, state when to prefer siblings such as get_project or list_projects_metrics, so the exclusion side of the guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projects_metricsARead-only
Read budget and time counters (budget amount, budget spent, planned and elapsed time in seconds) for several projects in one call, each given by name, code or id. Use it to compare projects or build a portfolio view; use get_project_metrics for a single project. Read-only. Every name is resolved before the request: an unknown or ambiguous one fails the whole call with the candidates listed.
| Name | Required | Description | Default |
|---|---|---|---|
| projects | Yes | The projects to measure, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely non-obvious behavior: identifiers are resolved before the request and an unknown or ambiguous name aborts the entire call, listing candidates. That all-or-nothing failure mode is valuable context, though auth/rate-limit behavior is not addressed.
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?
Four compact sentences, front-loaded with what is read, then usage, then safety, then failure behavior. The parenthetical enumerating the counters is dense but informative, and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not detail return values, and the annotations carry the read-only profile. It covers the remaining agent-critical unknowns: batch semantics, sibling routing, and identifier-resolution failure handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'projects' parameter already documents 'by name, code or id', so the description's restatement earns no credit. It does, however, add resolution semantics for the parameter values — that an unresolvable name fails the whole call and returns candidates — which goes 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?
States a specific verb and resource ('Read budget and time counters'), enumerates exactly what is returned (budget amount, budget spent, planned and elapsed time), and scopes it to 'several projects in one call'. It explicitly distinguishes itself from the sibling get_project_metrics, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both a positive use case ('compare projects or build a portfolio view') and the named alternative with the condition that selects it ('use get_project_metrics for a single project'). Nothing about when to pick this over its sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_purchasesARead-only
List purchases (extra costs such as licences or subcontracting) charged to projects or tasks, with paid and billed amounts and dates. Use it to review what a project cost beyond time; use get_purchase when you already hold one purchase id. Read-only. Filters accept project and task names, codes or ids; an unknown name is an error listing what exists. Without Gryzzly's budget offer every call answers no_permission.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| tasks | No | Keep only charges of these tasks, by name or id. | |
| offset | No | How many objects to skip, for the next page. | |
| projects | No | Keep only charges of these projects, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, but the description adds material the annotations cannot express: that an unknown name is an error listing what exists, and that without the Gryzzly budget offer every call returns no_permission. It does not discuss response shape or pagination behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with purpose and definition before alternatives, permissions and filter behavior. No filler and nothing that restates the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; with annotations plus output schema, the description supplies the remaining gaps an agent needs — sibling routing, permission gate, and filter error behavior. Complete for a read-only filtered list 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 baseline is 3; the description adds marginal value by restating that filters accept project and task names, codes or ids and by specifying the failure mode for an unknown name. It says nothing about limit/offset semantics, which the schema already documents, so it does not fully escape the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource, defines what a 'purchase' is (extra costs such as licences or subcontracting), and distinguishes itself from get_purchase by contrast. An agent can tell it apart from the many sibling list_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases ('review what a project cost beyond time') and names the alternative plus the condition that selects it ('use get_purchase when you already hold one purchase id'). It also flags the permission prerequisite, so the agent knows when this call is even viable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsARead-only
List tags, which projects and tasks are labelled with. Read-only upstream: tags are managed in the Gryzzly interface.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Keep only these identifiers. | |
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only entries whose name contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| set_ids | No | Keep only members of these sets, by identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds genuine value by disclosing that the read-only restriction is an upstream property and that mutation must occur in the Gryzzly interface, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action followed by the read-only constraint. No filler, no 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?
With a dedicated output schema present, return values need not be explained, and the schema fully covers parameters. The description covers what the tool does and its read-only nature, leaving only alternative-tool routing unaddressed.
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 five parameters (ids, limit, query, offset, set_ids) are already fully documented in the schema. The description adds no filtering or pagination detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List tags') and adds scope by noting tags label projects and tasks. It does not explicitly differentiate itself from close siblings like get_tag or list_tagsets, but the plural list-noun pattern is reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not conditions, and no alternative sibling is named. The note that tags are managed in the Gryzzly interface implies this tool is read-only lookup, which is implied usage guidance rather than stated routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsetsARead-only
List tagsets, the families tags belong to (a tagset holds tags used to label projects and tasks). Use it before list_tags to see which tag families exist; use get_tagset for one tagset. Read-only, and read-only upstream too: tagsets are managed in the Gryzzly web app. An empty result is an empty list.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Keep only these identifiers. | |
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only entries whose name contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| set_ids | No | Keep only members of these sets, by identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine context beyond that: read-only upstream too (tagsets managed in the Gryzzly web app) and the empty-result behavior ("An empty result is an empty list"). Missing pagination behavior, though offset/limit are documented 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?
Front-loaded with the core action and concept, then usage guidance, then behavioral notes, in a compact three-sentence block. Every clause earns its place; the parenthetical definition prevents ambiguity about what a tagset is.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and annotations cover the safety profile. The description supplies the conceptual definition, sibling routing, upstream read-only status, and empty-result semantics, leaving nothing 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 description coverage is 100%, so all five parameters (ids, limit, query, offset, set_ids) are already documented in the schema. The description adds no parameter-level detail, which is acceptable when the schema does the heavy lifting, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List tagsets") and immediately defines the concept ("the families tags belong to... used to label projects and tasks"). It distinguishes itself from siblings by naming both list_tags and get_tagset, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ("Use it before list_tags to see which tag families exist") and explicit alternative ("use get_tagset for one tagset"). It also signals that tagsets are managed upstream in the web app, implying no create/update path here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksARead-only
List the tasks of a project, which is what time is actually declared against. Container tasks and completed tasks are filtered out by default, since neither is a place to log time.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only tasks whose name contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| project | No | Keep only tasks of this project, by name, code or id. | |
| include_completed | No | Include tasks already completed. Defaults to true. | |
| include_containers | No | Include container tasks, which hold other tasks and take no time. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description usefully adds that container and completed tasks are filtered by default, but the claim that completed tasks are 'filtered out by default' directly conflicts with the schema's include_completed 'Defaults to true', leaving the actual default ambiguous.
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 tight sentences, front-loaded with the action and resource, with the filtering defaults following. Nothing is padded, though the second sentence could be shorter given the schema already documents both include_* flags.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description need not explain return values. Combined with 100% schema coverage on all six optional parameters, the definition is sufficient 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?
Schema description coverage is 100% (6/6 params documented), so the baseline is 3. The description adds no parameter-level detail such as whether 'project' accepts name, code or id, or what happens when project is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the tasks of a project') and adds the domain rationale that tasks are what time is logged against, which separates it from list_projects and get_task. It does not explicitly name a sibling it is not, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by explaining the filtering defaults (containers/completed excluded), which tells the agent this is the default listing surface. However, it never says when to prefer get_task or list_projects, and gives no exclusion guidance for the include_* flags.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_time_entriesARead-only
Read declared time over a week or a period, with task and project names filled in, per-day and per-project totals, and the identifiers needed to change an entry. Read before you write.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day of an explicit period. Defaults to `from`. | |
| from | No | First day of an explicit period. Ignored when `week` is set. | |
| task | No | Keep only this task, by name or id. | |
| user | No | Whose time to read. Defaults to the user this server acts as. | |
| week | No | A week: `this week`, `last week`, `2026-W38`, or a date inside it. | |
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| offset | No | How many objects to skip, for the next page. | |
| project | No | Keep only this project, by name, code or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | Last day of the period. |
| days | Yes | One line per day that carries time. |
| from | Yes | First day of the period. |
| user | Yes | Whose time this is. |
| week | No | The ISO week, when the period is exactly one. |
| total | Yes | The same, human readable. |
| entries | No | The declarations themselves, when the caller asked for them. |
| projects | Yes | One line per project, largest first. |
| total_hours | Yes | The same, in decimal hours. |
| total_seconds | Yes | Declared time over the period, in seconds. |
| missing_workdays | Yes | Working days of the period with nothing declared. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuine behavioral context beyond that: names/totals are filled in, per-day and per-project aggregates are produced, and it returns the identifiers needed to mutate entries, which is useful for planning a read-then-write flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence front-loaded with the verb and resource, plus a short four-word directive. Little waste, though the run-on clause list is slightly heavy for the amount of information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not document return values, and the readOnly annotations cover the safety profile. It conveys scope (week/period), enrichment (names, totals), and the write-workflow hook, leaving little an agent would need before calling it.
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 every parameter (week, from/to, task, project, user, limit, offset) is already documented in the schema. The description adds no parameter-level syntax or default details beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (declared time entries), with the added scope detail of week/period reads. It is clearly distinct from the write siblings (log_time, update_time_entry, delete_time_entry), but it never explicitly contrasts itself with the closest read alternative, `timesheet`.
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?
"Read before you write" gives an implicit workflow cue for pairing with update/delete tools, but no explicit when-to-use-vs-alternatives guidance is given (e.g., when to prefer this over `timesheet` or `export_times_and_leaves`). Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersARead-only
List the users this API key can see, which is the whole team. Disabled users are left out unless asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many objects to return. Upstream maximum is 1000. | |
| query | No | Keep only users whose name or email contains this text. | |
| offset | No | How many objects to skip, for the next page. | |
| include_disabled | No | Include users who have been disabled. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when the answer is worth a word of explanation. |
| count | Yes | How many objects match the filters upstream, beyond this page. |
| items | Yes | The objects. |
| returned | Yes | How many objects this answer carries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true and openWorldHint=true, the description adds useful context: the visibility scope ('this API key can see, which is the whole team') and the default filtering behavior for disabled users. It does not cover pagination behavior or permissions beyond API key scope, but those gaps are minor given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences with zero waste. The scope is front-loaded, followed by the default filtering rule, making every sentence earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with a fully described input schema and an output schema, the description supplies the essential behavioral context: API-key scope and disabled-user default. Nothing critical is missing for an agent to call this 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 description coverage is 100%, so the schema already documents limit, query, offset, and include_disabled in detail. The description restates only the default disabled-user filtering, which is already in the schema description for include_disabled, and adds no new semantics for the other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('users'), and adds a clear scope: 'the users this API key can see, which is the whole team.' It distinguishes itself from resource siblings like list_tasks and from the singular get_user by verb and resource, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an implicit condition for the include_disabled parameter ('Disabled users are left out unless asked for') but gives no explicit guidance on when to choose this tool over get_user or other user-related endpoints. Usage is implied by the verb 'List' and the scope statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_timeA
Declare time. Gryzzly attaches time to a task, so name a task, or a
project whose tasks can be narrowed down to one. Durations are human:
2h30, 90m, 1.5h. The answer repeats the day's new total, which is
how you notice you have logged the same afternoon twice.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The day: `today` (the default), `yesterday`, a weekday, `YYYY-MM-DD`. | |
| task | No | The task, by name or id. Optional when the project has one task only. | |
| user | No | Whose time it is. Defaults to the user this server acts as. | |
| project | No | The project, by name, code or id. Narrows the task lookup. | |
| duration | Yes | How long: `2h30`, `90m`, `1.5h`, `2:30`, or a bare number of minutes. | |
| description | No | What the time was spent on. Worth filling: it is what a human reads later. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entry | Yes | The declaration Gryzzly created. |
| day_total | Yes | What the whole day now totals, so a double entry is visible at once. |
| day_total_seconds | Yes | The same, in seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-idempotent, open-world behavior. The description goes beyond them by disclosing the response shape (it repeats the day's new total) and using that to warn about double-logging — a genuinely useful operational cue consistent with idempotentHint=false. It stops short of stating permission requirements or what happens on an ambiguous project/task match.
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?
Four short sentences, front-loaded with the action and followed immediately by the targeting rule, format examples, and the duplicate-detection payoff. Only the closing aside about logging 'the same afternoon twice' is stylistically loose, though it does carry a real warning.
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 six parameters, a fully documented schema, an output schema, and rich annotations, the description supplies the few things structured fields can't: the intent of the operation, the target-resolution rule, and how to read the response. The one omission is any mention of the bulk variant for multi-entry logging.
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 every parameter already carries its own documentation, establishing a baseline of 3. The description's duration examples duplicate the schema, and its task-vs-project rule largely restates the schema's 'optional when the project has one task only' note, so added meaning is marginal.
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 concrete action and resource: Gryzzly attaches a duration to a task (or a project that resolves to one task). That is enough for an agent to understand this writes a time entry. It never names or contrasts with the obvious sibling log_time_bulk, so differentiation is left to the tool name alone.
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 a real rule for parameter selection — name a task, or a project whose tasks narrow to one — which implies when the call is valid. However, it offers no guidance on when to prefer this over log_time_bulk, timesheet, or update_time_entry, which is the primary routing decision among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_time_bulkA
Declare several time entries in one call, which is what filling a week looks like: each entry takes the same arguments as log_time. Entries are created in order; by default a refusal does not stop the others, and every outcome is reported with its position. Read the week first with timesheet: Gryzzly accepts duplicates, so calling this twice logs twice.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | The declarations to create, in order. | |
| stop_on_error | No | Stop at the first refusal instead of carrying on. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total time created, human readable. |
| failed | Yes | How many were refused. |
| created | Yes | How many declarations were created. |
| outcomes | Yes | One line per requested entry, in order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, idempotent=false, destructive=false, openWorld=true), and the description adds genuinely useful behavioral detail beyond them: entries are created in order, a refusal by default does not stop the rest, each outcome is reported with its position, and duplicates are accepted so calling twice logs twice. It doesn't describe permissions or rate limits, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and packs several distinct facts (ordering, failure handling, duplicate risk, read-first advice) into tight clauses. It is a touch dense but every sentence carries information an agent needs.
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 rich annotations and an output schema present, the description needn't explain return values, and it correctly focuses on the non-obvious gaps: ordering, partial-failure behavior, and non-idempotency. Only minor items like permission requirements are absent.
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 both parameters are fully documented, so the baseline is 3. The description restates the default failure semantics already captured by stop_on_error and adds nothing about the nested BulkEntry fields, so it does not meaningfully exceed 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?
States a specific verb+resource (declaring several time entries in one call) and immediately scopes it with a concrete use case ('what filling a week looks like'). It explicitly relates to the sibling log_time ('each entry takes the same arguments as log_time'), so an agent can distinguish bulk from single-entry logging without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('filling a week') and a prerequisite action ('read the week first with timesheet'), routing the agent to the read tool before writing. It does not explicitly say when to prefer log_time instead, so it stops short of full when/when-not guidance, but the alternatives are strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timesheetARead-only
Summarise declared time over a week or a period for one user, the current one by default: totals per day and per project, each project's share, and the working days below the expected hours. Use it to answer how much was logged or what is missing; use list_time_entries when you need the individual entries and their ids. Read-only. Optional project and task filters narrow the totals, not just a listing.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day of an explicit period. Defaults to `from`. | |
| from | No | First day of an explicit period. Ignored when `week` is set. | |
| task | No | Keep only this task, by name or id. | |
| user | No | Whose time to read. Defaults to the user this server acts as. | |
| week | No | A week: `this week`, `last week`, `2026-W38`, or a date inside it. | |
| project | No | Keep only this project, by name, code or id. | |
| expected_hours_per_day | No | Hours expected on a working day, used to list the days that fall short. Defaults to 7. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | Last day of the period. |
| days | Yes | One line per day that carries time. |
| from | Yes | First day of the period. |
| user | Yes | Whose time this is. |
| week | No | The ISO week, when the period is exactly one. |
| total | Yes | The same, human readable. |
| entries | No | The declarations themselves, when the caller asked for them. |
| projects | Yes | One line per project, largest first. |
| total_hours | Yes | The same, in decimal hours. |
| total_seconds | Yes | Declared time over the period, in seconds. |
| missing_workdays | Yes | Working days of the period with nothing declared. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the 'Read-only' line is largely redundant. However the description adds real behavioral context beyond the schema: project/task filters narrow the *totals* rather than acting as a listing filter, and the default subject is the acting user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the summary behavior before the routing hint and the read-only/filter caveats. Efficient overall, though the trailing filter clarification is a slightly dense clause that could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no elaboration, annotations carry the safety profile, and the description still covers scope, defaults, filter semantics, and sibling routing. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3-baseline applies, but the description genuinely adds meaning the schema lacks: that the project/task filters restrict the aggregation itself, not merely a listing, and that the target user defaults to the server's own identity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Summarise) and resource (declared time) and enumerates the exact outputs: totals per day, per project, each project's share, and shortfall days. It explicitly distinguishes itself from list_time_entries, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two positive use cases (how much was logged, what is missing) and names the alternative tool with the condition that selects it ('when you need the individual entries and their ids'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_customerAIdempotent
Change an existing customer, found by name or id: rename it, mark it active or inactive, or replace its managers (the list you pass replaces the current one). Fields you omit are kept; Gryzzly requires a name on every update, so the current one is resent. Use delete_customer to remove a customer instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A new name. Gryzzly requires one on every update; the current one is sent when this is absent. | |
| customer | Yes | The customer to change, by name or id. | |
| managers | No | The managers, by name, email or id. Replaces the current list. | |
| is_active | No | Whether the customer is active. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The customer's identifier. |
| name | No | The customer's name. |
| managers | No | The users managing this customer. |
| is_active | No | Whether the customer is active. |
| created_at | No | When the customer was created. |
| updated_at | No | When the customer was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, non-destructive mutation, so the bar is lower, yet the description adds real behavioral detail: the managers list fully replaces the current list, omitted fields are preserved (merge semantics), and Gryzzly's quirk of requiring a name means the current one is resent. These are non-obvious traits an agent could not infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and what it changes, then appends the two key behavioral caveats and the sibling routing. Each sentence earns its place, though the clause about managers replacing the current list is slightly dense in the opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description supplies the remaining critical context (merge behavior, managers replacement, required-name workaround, delete alternative), leaving nothing an agent needs in order 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 description coverage is 100%, so the schema already documents all four parameters, establishing a baseline of 3. The description restates the managers replacement semantics and the name requirement, both already present in the schema, adding little param-level meaning beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change/update) and resource (existing customer), and enumerates exactly what can change: rename, active status, and manager replacement. It also explicitly distinguishes itself from delete_customer for removal, so an agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it to change an existing customer found by name or id, and explicitly routes removal to delete_customer. It does not, however, discuss when to prefer other update_* siblings or any preconditions beyond the required name, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_discountAIdempotent
Change an existing discount's name or amount, by its identifier. Only the fields you pass are sent. Use create_discount for a new one and delete_discount to remove one; the project or task a discount applies to cannot be moved. Requires Gryzzly's budget offer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The discount's identifier. | |
| name | No | A new name. | |
| amount | No | A new amount. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The discount's identifier. |
| name | No | The discount's name. |
| amount | No | How much is taken off. |
| task_id | No | The task it applies to. |
| created_at | No | When the discount was created. |
| project_id | No | The project it applies to. |
| updated_at | No | When the discount was last updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, but the description adds behavior beyond them: partial-update semantics ('Only the fields you pass are sent'), an immutability constraint (project/task cannot be moved), and an authorization precondition ('Requires Gryzzly's budget offer'). These are meaningful traits the structured fields do not carry.
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, front-loaded with the core action and its identifier scoping, followed by alternatives and constraints. Every sentence earns its place with no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Combined with the annotations and full schema coverage, the description supplies everything an agent needs: scope, partial-update behavior, immutability limits, sibling routing, and the authorization prerequisite.
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 three parameters are already documented, making 3 the baseline. The description adds value beyond the schema by clarifying that unpassed fields are left untouched ('Only the fields you pass are sent'), which explains the nullable/optional semantics of name and amount.
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 ('Change an existing discount's name or amount, by its identifier') and immediately distinguishes itself from sibling tools by naming create_discount and delete_discount. An agent can identify the tool's scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names both alternatives explicitly with their selection conditions ('Use create_discount for a new one and delete_discount to remove one'), and adds the constraint that the project/task a discount applies to cannot be moved. Nothing about when to use this vs. siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_leave_periodAIdempotent
Change a leave period: move it, shorten it, turn a full day into a half one.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The leave period's identifier. | |
| end_at | No | A new last day. | |
| end_type | No | How much of the last day is off. | |
| start_at | No | A new first day. | |
| start_type | No | How much of the first day is off. | |
| description | No | A new description. | |
| delete_declarations | No | Delete the declarations already made over those days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The leave period's identifier. |
| end_at | No | The last day of the leave. |
| user_id | No | The user on leave. |
| end_type | No | `full`, `am` or `pm`. |
| start_at | No | The first day of the leave. |
| edited_by | No | Who last edited the leave period. |
| created_at | No | When the leave period was created. |
| start_type | No | `full`, `am` or `pm`. |
| updated_at | No | When the leave period was last updated. |
| description | No | Why the person is away. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is largely covered. The description adds the mutation semantics (shifting edges, shortening, half-day conversion) but says nothing about the side effect of clearing existing declarations or about validation/conflict behavior on overlapping periods.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource, the verb, and three concrete mutation patterns with zero filler. Nothing could be cut without losing meaning.
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 a full output schema, complete parameter descriptions, and rich annotations, the only real gap is that the destructive sub-action (delete_declarations wiping existing declarations) and the effect of omitted optional fields are not surfaced in prose. For an update tool this is close to complete but leaves one behaviorally significant detail to 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 description coverage is 100%, so every parameter is already documented in structured form and the baseline is 3. The description reinforces start_at/end_at/start_type/end_type semantics via 'move it, shorten it, half day', but adds nothing about description or delete_declarations beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-resource pair (change a leave period) and enumerates concrete operations: move, shorten, convert full day to half day. The verb 'change' implicitly separates it from create_leave_period and delete_leave_period siblings, though those alternatives are never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the required 'id' and the word 'change' signal this operates on an existing leave period rather than creating one. There is no explicit when-to-use/when-not guidance, no mention of reading the period first with get_leave_period, and no pointer to delete_leave_period for removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectAIdempotent
Change a project. Gryzzly requires a start date on every update, so the current one is sent when none is given.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | A new code. | |
| name | No | A new name. | |
| tags | No | Tag identifiers. Replaces the current list. | |
| end_at | No | A new end date. | |
| groups | No | Group identifiers. Replaces the current list. | |
| status | No | A new status. | |
| project | Yes | The project to change, by name, code or id. | |
| customer | No | A new customer, by name or id. | |
| managers | No | The managers, by name, email or id. Replaces the current list. | |
| start_at | No | A new start date. Gryzzly requires one on every update; the current one is sent when this is absent. | |
| visibility | No | A new visibility. | |
| is_billable | No | Whether the project is billable. | |
| contributors | No | The contributors, by name, email or id. Replaces the current list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The project's identifier. |
| code | No | The project's short code. |
| name | No | The project's name. |
| note | No | The project note. |
| tags | No | The tags attached to the project. |
| end_at | No | When the project is supposed to end. |
| groups | No | The groups assigned to the project. |
| status | No | One of `active`, `done`, `archived`. |
| managers | No | The users managing the project. |
| start_at | No | When the project starts. |
| created_at | No | When the project was created. |
| updated_at | No | When the project was last updated. |
| visibility | No | `public` or `private`. |
| customer_id | No | The customer this project belongs to, when any. |
| is_billable | No | Whether the project is billable. |
| contributors | No | The users allowed to declare on a private project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, idempotent, open-world mutation, so the safety profile is covered. The description adds a genuinely non-obvious behavioral trait: Gryzzly requires a start date and the current one is silently resent when omitted. That is real added context, though it stops short of describing permission needs or what happens on partial failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences; the purpose is front-loaded and the second sentence is the single non-obvious constraint. Efficient, though the second sentence is largely a restatement of the start_at parameter description rather than new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter partial-update tool with annotations covering safety and an output schema covering returns, the description gives enough to invoke correctly, with the schema handling field-level semantics. It could note that unspecified fields remain unchanged, but that is inferable from the optional/nullable parameters.
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 every one of the 13 parameters is already documented, including the same start-date fallback note, the enum meanings for status/visibility, and the 'replaces the current list' semantics. The description adds nothing beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Change a project" gives a clear verb + resource, and the name plus siblings (update_task, update_customer) make the target unambiguous. It does not enumerate what fields are updatable, but the schema does that at 100% coverage. No explicit sibling differentiation, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied by the name and reinforced by the start-date constraint note, but there is no explicit when-to-use / when-not-to-use or guidance on prerequisites (permissions required to change a project). Adequate but thin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_purchaseAIdempotent
Change an existing purchase: name, paid or billed price, paid or billed date, billing policy. Only the fields you pass are sent; the rest are left as they are. Use create_purchase for a new cost and delete_purchase to remove one. Dates accept YYYY-MM-DD, today or yesterday. Requires Gryzzly's budget offer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The purchase's identifier. | |
| name | No | A new name. | |
| paid_at | No | A new paid date. | |
| billed_at | No | A new billed date. | |
| paid_price | No | A new paid price. | |
| billed_price | No | A new billed price. | |
| billing_policy | No | A new billing policy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The purchase's identifier. |
| name | No | What was bought. |
| paid_at | No | When it was paid. |
| task_id | No | The task it is charged to. |
| billed_at | No | When it was billed. |
| created_at | No | When the purchase was created. |
| paid_price | No | What it cost. |
| project_id | No | The project it is charged to. |
| updated_at | No | When the purchase was last updated. |
| billed_price | No | What it was billed for. |
| billing_policy | No | `add` or `ignore`, how it weighs on the budget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the mutation/safety profile is covered. The description adds real behavioral context beyond that: partial-update semantics ('Only the fields you pass are sent; the rest are left as they are'), accepted date formats, and a feature prerequisite. It stops short of describing failure modes or what the returned object contains, so a 4 rather than 5.
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?
Four short sentences, zero waste, with the verb+resource and mutable field list front-loaded. The alternative-tool routing, partial-update rule, date formats and prerequisite each carry distinct information, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with full schema coverage, an output schema (so return values need no explanation) and annotations covering safety, the description supplies everything else an agent needs: partial-update semantics, date formats, sibling routing, and the budget-offer prerequisite.
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, but the description adds meaning the schema does not carry: 'Dates accept YYYY-MM-DD, today or yesterday' gives accepted input formats for paid_at/billed_at that the schema only labels as 'A new paid date'. The partial-update sentence also clarifies that omitted params are intentionally untouched rather than nulled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Change) and resource (existing purchase) and enumerates the mutable fields, so the scope is unambiguous. It also explicitly names the sibling tools it is not (create_purchase, delete_purchase), letting an agent route without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use alternatives ('Use create_purchase for a new cost and delete_purchase to remove one') and states a hard precondition ('Requires Gryzzly's budget offer'). Both the selection condition and the eligibility gate are spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskAIdempotent
Change a task: rename it, move its dates, set its budget or its rate, mark it completed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A new name. | |
| tags | No | Tag names. Replaces the current list. | |
| task | Yes | The task to change, by name or id. | |
| end_at | No | A new end date. | |
| groups | No | Group identifiers. Replaces the current list. | |
| project | No | The project it belongs to, to disambiguate a name. | |
| start_at | No | A new start date. | |
| hourly_rate | No | A new hourly rate. | |
| completed_at | No | When the task was completed. Marks it done. | |
| budget_amount | No | A new budget amount. | |
| hourly_rate_mode | No | Where the hourly rate comes from. | |
| planned_duration | No | Planned time, as a duration (`40h`, `90m`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The task's identifier. |
| name | No | The task's name. |
| tags | No | The tags attached to the task. |
| end_at | No | When the task is supposed to end. |
| groups | No | The groups assigned to the task. |
| start_at | No | When the task starts. |
| parent_id | No | The parent task, when this task is a subtask. |
| created_at | No | When the task was created. |
| project_id | No | The project the task belongs to. |
| updated_at | No | When the task was last updated. |
| budget_type | No | One of `none`, `detailed`, `global`, `time`. |
| hourly_rate | No | The task's hourly rate. |
| completed_at | No | When the task was completed. |
| is_container | No | Whether the task only holds other tasks. |
| budget_amount | No | The task's budget. |
| hourly_rate_mode | No | One of `task`, `group`, `contributor`. |
| planned_duration | No | Planned duration, in seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=true, so the safety profile is covered and the description's 'Change a task' is consistent with it. However, the description adds no behavioral context of its own: it does not say whether this is a partial patch (unspecified fields preserved) or whether omitted list fields are cleared, nor anything about auth or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and then lists the mutation surface. No filler, no restatement of the tool name, and the most important information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. But for a 12-parameter mutation tool the description omits the one thing an agent most needs: whether fields not supplied are left untouched, plus the meaning of 'mark it completed' relative to completed_at.
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 fully documents all 12 parameters and the HourlyRateMode union. The description only names four of the twelve capabilities and adds no syntax, format, or interaction detail (e.g. project disambiguation for a duplicate name) beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (change) plus the resource (a task) and enumerates the kinds of mutations it performs: rename, move dates, set budget/rate, mark completed. That is far more specific than a tautology, but it never differentiates itself from siblings such as create_task, delete_task or get_task beyond the name itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'Change a task'. There is no statement of when to prefer this over update_project/update_time_entry, no prerequisites, and no note about what happens if the task is not found or the caller lacks permission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_time_entryAIdempotent
Change one time entry (a declaration), by the id list_time_entries returns: its duration, its day, its task, its description. Gryzzly's update requires all of them, so whatever is left out is read back from the existing entry first. Use log_time to add time and delete_time_entry to remove an entry.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The declaration's identifier, as returned by `list_time_entries`. | |
| date | No | The new day. Left alone when absent. | |
| task | No | The new task, by name or id. Left alone when absent. | |
| user | No | Whose declaration it is, when it is not the current user's. | |
| project | No | The project the new task belongs to, to narrow the lookup. | |
| duration | No | The new duration. Left alone when absent. | |
| description | No | The new description. Left alone when absent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The declaration's identifier, needed to update or delete it. |
| date | Yes | The day, as `YYYY-MM-DD`. |
| task | No | The task's name, when it could be resolved. |
| project | No | The project's name, when it could be resolved. |
| seconds | Yes | The duration in seconds, which is what Gryzzly stores. |
| task_id | Yes | The task the time is declared against. |
| user_id | Yes | Whose time it is. |
| duration | Yes | The duration, human readable. |
| project_id | No | The project the task belongs to. |
| description | No | What the time was spent on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a non-obvious behavioral trait beyond the annotations: Gryzzly's update requires all fields, so omitted values are 'read back from the existing entry first,' i.e., a read-modify-write merge. Annotations already cover safety (readOnly=false, idempotent=true, destructive=false), so this adds genuine value; it does not mention permission needs or concurrency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and reasonably sized, but the sentence 'by the id list_time_entries returns: its duration...' is run-on and awkward to parse, mixing the identifier source with the field list in a way that requires re-reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the annotations cover the safety profile. The description supplies the routing (log_time/delete_time_entry) and the partial-update semantics, making it largely complete, though it omits auth/permission context for editing another user's entry.
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 already carries a description including 'Left alone when absent,' so the schema does the heavy lifting. The description reinforces the absent-field behavior but adds little beyond it, and never mentions the user/project params, so the baseline 3 holds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change one time entry'), names the returned identifier source (list_time_entries), and enumerates the mutable fields (duration, day, task, description). It also names the sibling tools log_time and delete_time_entry, letting the agent distinguish this update tool from the add/remove alternatives without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to alternatives: 'Use log_time to add time and delete_time_entry to remove an entry,' which clarifies this is neither creation nor deletion. It gives clear context for use but stops short of stating when-not conditions or prerequisites (e.g., permissions on others' entries).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiARead-only
Who this server declares time for, what it is allowed to do, and how much time is already logged this week. Call it first: Gryzzly API keys belong to a team, not to a person, so the person has to be named by configuration, and this is where you see which one was.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| role | No | The user's role in Gryzzly. |
| user | Yes | The user this server declares time for. |
| toolsets | Yes | The toolsets this server exposes. |
| read_only | Yes | True when every write tool was withheld. |
| this_week | Yes | This week, so a client knows where it stands before logging anything. |
| team_users | Yes | How many users the API key can see. |
| identified_by | No | Which environment variable named this user, if any did. |
| default_project | No | The project used when a tool omits one. |
| timesheet_approved_until | No | The date until which this user's times are approved and locked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring this a safe read, the description adds genuinely useful behavioral context: the identity comes from server configuration rather than the API key, and the response includes permission scope plus the current week's logged time. It stops short of describing response structure, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are mostly front-loaded, but the phrasing is indirect and literary ('Who this server declares time for'), and the second sentence is a long clause chain. The point could be made in fewer, plainer words.
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 an output schema and readOnly/openWorld annotations, the description supplies the missing context an agent needs — that identity is configured rather than derived from the key — and tells the agent to call it first. It is essentially complete for a no-parameter identity probe.
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 takes zero parameters, so the baseline is 4; there is nothing for the description to clarify and no schema gap to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names what the tool surfaces — the acting identity, its permissions, and time logged this week — which is enough to distinguish it from the CRUD siblings. However, it lacks a clean verb and relies on roundabout phrasing ('Who this server declares time for'), so the purpose is clear but not crisp.
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 instructs 'Call it first' and explains why: Gryzzly API keys belong to a team, not a person, so the identity must be named via configuration. That is an unambiguous when-to-use directive with rationale, which is exactly what usage guidance should do.
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.
53 tool updates
v0.1.0- First observed
create_customer - First observed
create_discount - First observed
create_leave_period - First observed
create_project - First observed
create_purchase - First observed
create_task - First observed
delete_customer - First observed
delete_discount - First observed
delete_leave_period - First observed
delete_project - First observed
delete_purchase - First observed
delete_task - First observed
delete_time_entry - First observed
export_projects - First observed
export_times_and_leaves - First observed
get_customer - First observed
get_discount - First observed
get_group - First observed
get_groupset - First observed
get_leave_period - First observed
get_project - First observed
get_project_metrics - First observed
get_purchase - First observed
get_tag - First observed
get_tagset - First observed
get_task - First observed
get_user - First observed
import_leave_periods - First observed
invite_user - First observed
list_customers - First observed
list_discounts - First observed
list_groups - First observed
list_groupsets - First observed
list_leave_periods - First observed
list_projects - First observed
list_projects_metrics - First observed
list_purchases - First observed
list_tags - First observed
list_tagsets - First observed
list_tasks - First observed
list_time_entries - First observed
list_users - First observed
log_time - First observed
log_time_bulk - First observed
timesheet - First observed
update_customer - First observed
update_discount - First observed
update_leave_period - First observed
update_project - First observed
update_purchase - First observed
update_task - First observed
update_time_entry - First observed
whoami
TDQS
Scored across 53 tools
Each tool has a distinct action and resource, and descriptions explicitly cross-reference alternatives (e.g., list_projects vs get_project_metrics vs list_projects_metrics). The CRUD pairs and specialized tools (timesheet, log_time_bulk) are clearly delineated, leaving no real overlap.
The vast majority follow a consistent verb_noun pattern (list_projects, create_customer, update_task). Minor deviations like 'timesheet' (noun) and 'whoami' (phrase) are the only exceptions.
53 tools is excessive for any single server; even with a broad domain, this exceeds the 50-tool threshold for extreme mismatch. Many tools could be consolidated or grouped into resources.
Core entities (projects, tasks, time entries, leave, discounts, purchases, customers) have full CRUD and specialized operations. Minor gaps exist for users (no update/delete) and read-only upstream entities (groups/tags), but the surface is largely complete.
Maintenance
Related MCP Connectors
Read time entries, projects, clients, tasks and invoices; log and update tracked time.
Track time in Clockify: time entries, projects, clients, tags and reports; start, stop and log time.
Read teams, spaces, lists and tasks; create, update and comment on tasks and track time.
Track time, manage clients and projects, review timesheets, and create invoices with OAuth.
Related MCP Servers
- -licenseAqualityNot gradedmaintenanceEnables natural language time tracking through Claude with markdown file storage. Supports multi-company tracking, flexible time parsing, auto-calculated summaries, and commitment warnings all through conversational input.1-
- AlicenseNot gradedqualityDmaintenanceEnables automated timesheet management including creating entries, listing work activities, managing daily scrum updates, and viewing assigned projects with automatic authentication handling.4 npmMIT
- AlicenseNot gradedqualityDmaintenanceIntegrates with Clockify time tracking API to retrieve user information, manage projects, and log time entries with flexible time specifications across workspaces.MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to query a self-hosted TimeTracker instance over its /api/v1 REST API, exposing tracked hours, per-day and per-project summaries, projects, clients, tasks, search, and active-timer status in natural language. Optionally registers write tools to start, stop, pause, resume, and create timers or time entries when write mode is enabled.MIT