Skip to main content
Glama

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.

Rust MCP Gryzzly API Transports CI License Stars


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 expected

No 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_bulk and timesheet, 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=1 withholds every write tool. GRYZZLY_TOOLSETS trims 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-gryzzly
cargo install --git https://github.com/edouard-claude/gryzzly-mcp
docker build -t mcp-gryzzly .
docker run --rm -i -e GRYZZLY_API_KEY=… mcp-gryzzly

The 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 --check
base 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

GRYZZLY_API_KEY

yes

The API key, sent as Authorization: Bearer …

GRYZZLY_API_KEY_FILE

A file holding the key instead, for Docker secrets

GRYZZLY_USER_ID

The UUID of the person the server acts as

GRYZZLY_USER_EMAIL

That person's email, resolved to an id at startup

GRYZZLY_BASE_URL

https://api.gryzzly.io/v1

API root, prefix included

GRYZZLY_DEFAULT_PROJECT

A project name, code or id used when a tool omits one

GRYZZLY_TOOLSETS

all

time,projects,directory,leaves,budget,exports

GRYZZLY_READ_ONLY

0

1 withholds every write tool

GRYZZLY_TIMEOUT_SECS

30

Per-request timeout

GRYZZLY_CACHE_TTL_SECS

60

How long name lookups are reused

GRYZZLY_MAX_RETRIES

3

Retries on 429 and transient 5xx

GRYZZLY_LOOKBACK_DAYS

365

How far back a declaration is searched by id

GRYZZLY_HTTP_BIND

Listen address for the HTTP transport

GRYZZLY_HTTP_TOKEN

Bearer token the HTTP transport requires

GRYZZLY_LOG

info

warn, debug, mcp_gryzzly=debug…

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-gryzzly

claude_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

whoami

Who the server acts as, what it may do, and this week's total

log_time

Declare time: a duration, a task or project name, a day

log_time_bulk

A whole week in one call, with one outcome line per entry

list_time_entries

Declared time over a week or a period, names filled in

timesheet

Totals per day and per project, plus the days that fall short

update_time_entry

Change a declaration's duration, day, task or description

delete_time_entry

Remove one, with confirm: true

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

list_projects

Filtered by status, customer, or a fragment of name or code

get_project

One project in full

list_tasks

The tasks of a project, containers and completed ones filtered out

get_task

One task in full

get_project_metrics · list_projects_metrics

Budget and time counters

create_project · update_project · delete_project

Project administration

create_task · update_task · delete_task

Task administration

directory — people and labels

Tool

list_users · get_user · invite_user

The team

list_customers · get_customer · create_customer · update_customer · delete_customer

Customers

list_groups · get_group · list_groupsets · get_groupset

Groups (read-only upstream)

list_tags · get_tag · list_tagsets · get_tagset

Tags (read-only upstream)

leaves — days off

Tool

list_leave_periods · get_leave_period

Read

create_leave_period · update_leave_period · delete_leave_period

Write

import_leave_periods

Feed Gryzzly a CSV or XLSX, inline or from a path

budget — what a project costs beyond time

Tool

list_purchases · get_purchase · create_purchase · update_purchase · delete_purchase

Purchases

list_discounts · get_discount · create_discount · update_discount · delete_discount

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

export_projects

Gryzzly's project export, CSV or XLSX

export_times_and_leaves

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

gryzzly://me

The current user and their week

gryzzly://projects

Every project

gryzzly://users

Every user the key can see

gryzzly://customers

Every customer

gryzzly://projects/{project}/tasks

The tasks of one project, by name or id

gryzzly://timesheet/{week}

One week, totalled — 2026-W38, this week

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 one log_time_bulk call.

  • 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 *.list action matching nothing answers 404 not_found, not an empty page

Reads that 404 as the empty page it means, so "no time logged last week" is not an error

declarations.list needs task_ids present, even as [], or it 404s

Always sends both user_ids and task_ids, empty when unfiltered

There is no /me: a key is a team key

GRYZZLY_USER_ID / GRYZZLY_USER_EMAIL, resolved once and cached; a team of one needs neither

There is no declarations.get, and no id filter on the list

update_time_entry finds the entry over GRYZZLY_LOOKBACK_DAYS and fills the fields you left out

declarations.update requires date, task and duration on every call

Reads the current values first, so a partial update stays partial

*.export authenticate a browser session, so with a key they answer 500 no cookie

Says exactly that, and points at list_time_entries for the same data

Purchases and discounts answer no_permission without the budget offer

Surfaces error_type in the error's data, so a model can tell policy from breakage

users.get on an unknown id answers 500, not 404

Reported as a configuration problem when it is GRYZZLY_USER_ID

50 requests per 10 seconds, per team

A sliding window paces the process; 429 and transient 5xx are retried with backoff, honouring Retry-After

limit caps at 1000

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: true and says what would go. They are annotated destructiveHint, so a client can warn before running them.

  • Read-only is structural. GRYZZLY_READ_ONLY=1 drops every route that does not annotate itself readOnlyHint — 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_time reports 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 /healthz

Off 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-gryzzly

Put 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 API

The 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 glue

Contributing

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-http

License

MIT — see LICENSE. Not affiliated with Gryzzly.

mcp-name: io.github.edouard-claude/gryzzly-mcp

Available Tools

53 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe customer's name.
managersNoThe managers, by name, email or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe customer's identifier.
nameNoThe customer's name.
managersNoThe users managing this customer.
is_activeNoWhether the customer is active.
created_atNoWhen the customer was created.
updated_atNoWhen the customer was last updated.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe discount's name.
taskNoThe task it applies to, by name or id. One of project or task.
amountNoHow much is taken off.
projectNoThe project it applies to, by name, code or id. One of project or task.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe discount's identifier.
nameNoThe discount's name.
amountNoHow much is taken off.
task_idNoThe task it applies to.
created_atNoWhen the discount was created.
project_idNoThe project it applies to.
updated_atNoWhen the discount was last updated.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
userNoWhose leave it is, by name, email or id. Defaults to the current user.
end_atNoLast day off. Defaults to `start_at`, which is one day off.
end_typeNoHow much of the last day is off. Defaults to `full`.
start_atYesFirst day off.
start_typeNoHow much of the first day is off. Defaults to `full`.
descriptionNoWhy the person is away.
delete_declarationsNoDelete the declarations already made over those days. Defaults to false, which makes Gryzzly refuse the leave when time is already declared.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe leave period's identifier.
end_atNoThe last day of the leave.
user_idNoThe user on leave.
end_typeNo`full`, `am` or `pm`.
start_atNoThe first day of the leave.
edited_byNoWho last edited the leave period.
created_atNoWhen the leave period was created.
start_typeNo`full`, `am` or `pm`.
updated_atNoWhen the leave period was last updated.
descriptionNoWhy the person is away.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

Output schema exists, so return values need 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe project's short code.
nameYesThe project's name.
tagsNoTag identifiers to attach.
end_atNoWhen the project is supposed to end.
groupsNoGroup identifiers to assign.
customerNoThe customer, by name or id.
managersNoThe managers, by name, email or id.
start_atNoWhen the project starts. Required by Gryzzly. Defaults to today.
visibilityNo`public` (everyone) or `private` (contributors only).
is_billableNoWhether the project is billable.
contributorsNoThe contributors, by name, email or id. Must be empty on a public project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe project's identifier.
codeNoThe project's short code.
nameNoThe project's name.
noteNoThe project note.
tagsNoThe tags attached to the project.
end_atNoWhen the project is supposed to end.
groupsNoThe groups assigned to the project.
statusNoOne of `active`, `done`, `archived`.
managersNoThe users managing the project.
start_atNoWhen the project starts.
created_atNoWhen the project was created.
updated_atNoWhen the project was last updated.
visibilityNo`public` or `private`.
customer_idNoThe customer this project belongs to, when any.
is_billableNoWhether the project is billable.
contributorsNoThe users allowed to declare on a private project.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWhat was bought.
taskNoThe task it is charged to, by name or id. One of project or task.
paid_atNoWhen it was paid.
projectNoThe project it is charged to, by name, code or id. One of project or task.
billed_atNoWhen it was billed.
paid_priceNoWhat it cost.
billed_priceNoWhat it is billed for.
billing_policyNoWhether it counts in the budget. Defaults to `add`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe purchase's identifier.
nameNoWhat was bought.
paid_atNoWhen it was paid.
task_idNoThe task it is charged to.
billed_atNoWhen it was billed.
created_atNoWhen the purchase was created.
paid_priceNoWhat it cost.
project_idNoThe project it is charged to.
updated_atNoWhen the purchase was last updated.
billed_priceNoWhat it was billed for.
billing_policyNo`add` or `ignore`, how it weighs on the budget.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3 and the 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe task's name.
tagsNoTag names to attach.
end_atNoWhen the task is supposed to end.
groupsNoGroup identifiers to assign.
parentNoThe parent task, by name or id, when this is a subtask.
projectYesThe project it belongs to, by name, code or id.
start_atNoWhen the task starts. Required by Gryzzly. Defaults to today.
budget_typeNoHow the budget is expressed.
hourly_rateNoThe hourly rate, when the type calls for one.
is_containerNoWhether this task only holds other tasks. A container takes no time.
budget_amountNoThe budget amount, when the type calls for one.
hourly_rate_modeNoWhere the hourly rate comes from.
planned_durationNoPlanned time, as a duration (`40h`, `3600s`, `90m`).
estimated_durationNoEstimated time, as a duration.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe task's identifier.
nameNoThe task's name.
tagsNoThe tags attached to the task.
end_atNoWhen the task is supposed to end.
groupsNoThe groups assigned to the task.
start_atNoWhen the task starts.
parent_idNoThe parent task, when this task is a subtask.
created_atNoWhen the task was created.
project_idNoThe project the task belongs to.
updated_atNoWhen the task was last updated.
budget_typeNoOne of `none`, `detailed`, `global`, `time`.
hourly_rateNoThe task's hourly rate.
completed_atNoWhen the task was completed.
is_containerNoWhether the task only holds other tasks.
budget_amountNoThe task's budget.
hourly_rate_modeNoOne of `task`, `group`, `contributor`.
planned_durationNoPlanned duration, in seconds.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present, return values need no explanation, and the 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Delete a customer. Gryzzly refuses while projects are attached to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be `true` to delete. Ignored when reading.
customerYesThe customer, by name or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Delete a discount, which puts its amount back into the project's budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe identifier.
confirmNoMust be `true` to delete. Ignored when reading.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present, return values need not be explained, and annotations cover 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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb (delete) and resource (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.

Usage Guidelines2/5

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

The description gives no guidance on when to 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_periodA
DestructiveIdempotent

Delete a leave period, which frees its days for declarations again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe leave period's identifier.
confirmNoMust be `true` to delete. Ignored when reading.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Delete a project. Gryzzly refuses while declarations are attached to it, which is the safety net; confirm: true is this server's.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be `true`. Without it nothing is deleted.
projectYesThe project to delete, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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

The first sentence states a specific verb and resource ("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.

Usage Guidelines4/5

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

Delete a purchase, which removes its amount from the project's budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe identifier.
confirmNoMust be `true` to delete. Ignored when reading.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present, return values need not be 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

Delete a task. Gryzzly refuses while declarations are attached to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesThe task to delete, by name or id.
confirmNoMust be `true`. Without it nothing is deleted.
projectNoThe project it belongs to, to disambiguate a name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return values need no 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe declaration's identifier.
confirmNoMust be `true`. Without it nothing is deleted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesWhat was deleted.
kindYesThe kind of object that was deleted.
deletedYesAlways true: a failure is an error, not a `false`.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of the period.
fromNoFirst day of the period.
formatNoThe file format. Defaults to `csv`.
save_toNoA path on the machine running this server to write the file to.
projectsNoThe projects to export, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the file was too large to inline.
textNoThe file itself, when it is text and small enough to read here.
bytesYesHow many bytes came back.
saved_toNoWhere the file was written, when `save_to` was given.
content_typeYesThe file's media type, as Gryzzly labelled it.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return-value 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of the period.
fromNoFirst day of the period.
formatNoThe file format. Defaults to `csv`.
save_toNoA path on the machine running this server to write the file to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the file was too large to inline.
textNoThe file itself, when it is text and small enough to read here.
bytesYesHow many bytes came back.
saved_toNoWhere the file was written, when `save_to` was given.
content_typeYesThe file's media type, as Gryzzly labelled it.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

Read one customer: whether it is active, and who manages it.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be `true` to delete. Ignored when reading.
customerYesThe customer, by name or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe customer's identifier.
nameNoThe customer's name.
managersNoThe users managing this customer.
is_activeNoWhether the customer is active.
created_atNoWhen the customer was created.
updated_atNoWhen the customer was last updated.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true 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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present and annotations 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.

Parameters3/5

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

Schema description coverage is 100%, so both parameters (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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe identifier.
confirmNoMust be `true` to delete. Ignored when reading.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe discount's identifier.
nameNoThe discount's name.
amountNoHow much is taken off.
task_idNoThe task it applies to.
created_atNoWhen the discount was created.
project_idNoThe project it applies to.
updated_atNoWhen the discount was last updated.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return values need not be 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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

The description states a specific verb and resource ("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.

Usage Guidelines5/5

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

Read one group by identifier: its name, its groupset, its manager.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe object's identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe group's identifier.
nameNoThe group's name.
created_atNoWhen the group was created.
manager_idNoThe group's manager.
updated_atNoWhen the group was last updated.
groupset_idNoThe groupset the group belongs to.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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

For a simple one-parameter 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.

Parameters3/5

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.

Purpose4/5

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

The description states a specific verb and resource ('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.

Usage Guidelines3/5

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

Read one groupset by identifier, and whether its groups are exclusive.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe object's identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe groupset's identifier.
nameNoThe groupset's name.
colorNoThe colour shown in the interface.
created_atNoWhen the groupset was created.
updated_atNoWhen the groupset was last updated.
is_group_uniqueNoWhether one group of this set at most may be attributed.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Read one leave period by identifier: its days, its half days, its reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe leave period's identifier.
confirmNoMust be `true` to delete. Ignored when reading.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe leave period's identifier.
end_atNoThe last day of the leave.
user_idNoThe user on leave.
end_typeNo`full`, `am` or `pm`.
start_atNoThe first day of the leave.
edited_byNoWho last edited the leave period.
created_atNoWhen the leave period was created.
start_typeNo`full`, `am` or `pm`.
updated_atNoWhen the leave period was last updated.
descriptionNoWhy the person is away.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return values need not be explained, and 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesThe project, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe project's identifier.
codeNoThe project's short code.
nameNoThe project's name.
noteNoThe project note.
tagsNoThe tags attached to the project.
end_atNoWhen the project is supposed to end.
groupsNoThe groups assigned to the project.
statusNoOne of `active`, `done`, `archived`.
managersNoThe users managing the project.
start_atNoWhen the project starts.
created_atNoWhen the project was created.
updated_atNoWhen the project was last updated.
visibilityNo`public` or `private`.
customer_idNoThe customer this project belongs to, when any.
is_billableNoWhether the project is billable.
contributorsNoThe users allowed to declare on a private project.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesThe project, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
project_idNoThe project these metrics belong to.
budget_spentNoHow much of the budget is spent.
time_elapsedNoDeclared time, in seconds.
time_plannedNoPlanned time, in seconds.
budget_amountNoThe project's budget.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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

With an output schema present, the description need not explain return values, and 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe identifier.
confirmNoMust be `true` to delete. Ignored when reading.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe purchase's identifier.
nameNoWhat was bought.
paid_atNoWhen it was paid.
task_idNoThe task it is charged to.
billed_atNoWhen it was billed.
created_atNoWhen the purchase was created.
paid_priceNoWhat it cost.
project_idNoThe project it is charged to.
updated_atNoWhen the purchase was last updated.
billed_priceNoWhat it was billed for.
billing_policyNo`add` or `ignore`, how it weighs on the budget.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Read one tag by identifier: its name and the tagset it belongs to.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe object's identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe tag's identifier.
nameNoThe tag's name.
tagset_idNoThe tagset the tag belongs to.
created_atNoWhen the tag was created.
updated_atNoWhen the tag was last updated.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true 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.

Conciseness5/5

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.

Completeness4/5

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

For a simple one-parameter read 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Read one tagset by identifier, and whether its tags are exclusive.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe object's identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe tagset's identifier.
nameNoThe tagset's name.
colorNoThe colour shown in the interface.
created_atNoWhen the tagset was created.
updated_atNoWhen the tagset was last updated.
is_tag_uniqueNoWhether one tag of this set at most may be attributed.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Read one task in full: its budget, its rate, its planned time, its place in the project's hierarchy.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesThe task, by name or id.
projectNoThe project the task belongs to, to disambiguate a name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe task's identifier.
nameNoThe task's name.
tagsNoThe tags attached to the task.
end_atNoWhen the task is supposed to end.
groupsNoThe groups assigned to the task.
start_atNoWhen the task starts.
parent_idNoThe parent task, when this task is a subtask.
created_atNoWhen the task was created.
project_idNoThe project the task belongs to.
updated_atNoWhen the task was last updated.
budget_typeNoOne of `none`, `detailed`, `global`, `time`.
hourly_rateNoThe task's hourly rate.
completed_atNoWhen the task was completed.
is_containerNoWhether the task only holds other tasks.
budget_amountNoThe task's budget.
hourly_rate_modeNoOne of `task`, `group`, `contributor`.
planned_durationNoPlanned duration, in seconds.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true 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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return values need not be 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Read one user: their role, their groups, the date their times are approved until, and their rates when the plan exposes them.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYesThe user, by name, email, id, or `me`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe user's identifier.
codeNoThe user's code, as set by the administrators.
nameNoThe user's display name.
roleNoOne of `contributor`, `collaborator`, `manager`, `director`, `admin`.
emailNoThe user's email address.
groupsNoThe groups the user belongs to.
created_atNoWhen the user was created.
updated_atNoWhen the user was last updated.
disabled_atNoWhen the user was disabled, if they were.
hourly_costNoThe user's hourly cost. Only on the budget offer.
hourly_rateNoThe user's hourly rate. Only on the budget offer.
is_disabledNoDeprecated upstream in favour of `disabled_at`.
timesheet_approved_untilNoThe date until which this user's times are approved.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoThe format. Inferred from the file extension, or `csv` for inline content.
contentNoThe file's contents, for a CSV written inline.
file_pathNoA path on the machine running this server, for a CSV or an XLSX.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoWhether the import went through.
errorsNoEvery line the importer rejected.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present and annotations covering the 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoThe role to grant. Defaults to `contributor`.
emailYesThe email address to invite. Gryzzly sends the invitation itself.
group_idsNoGroup identifiers to put the new user in.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe user's identifier.
codeNoThe user's code, as set by the administrators.
nameNoThe user's display name.
roleNoOne of `contributor`, `collaborator`, `manager`, `director`, `admin`.
emailNoThe user's email address.
groupsNoThe groups the user belongs to.
created_atNoWhen the user was created.
updated_atNoWhen the user was last updated.
disabled_atNoWhen the user was disabled, if they were.
hourly_costNoThe user's hourly cost. Only on the budget offer.
hourly_rateNoThe user's hourly rate. Only on the budget offer.
is_disabledNoDeprecated upstream in favour of `disabled_at`.
timesheet_approved_untilNoThe date until which this user's times are approved.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only customers whose name contains this text.
offsetNoHow many objects to skip, for the next page.
managersNoKeep only customers managed by these people, by name, email or id.
is_activeNoKeep only active, or only inactive, customers.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists so return values need no explanation, 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many objects to return. Upstream maximum is 1000.
tasksNoKeep only charges of these tasks, by name or id.
offsetNoHow many objects to skip, for the next page.
projectsNoKeep only charges of these projects, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose5/5

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

States a specific verb and resource ('List 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.

Usage Guidelines5/5

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

List groups, the user groupings Gryzzly assigns projects and rates to. Read-only upstream: groups are managed in the Gryzzly interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoKeep only these identifiers.
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only entries whose name contains this text.
offsetNoHow many objects to skip, for the next page.
set_idsNoKeep only members of these sets, by identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoKeep only these identifiers.
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only entries whose name contains this text.
offsetNoHow many objects to skip, for the next page.
set_idsNoKeep only members of these sets, by identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ('List 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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of an explicit period.
fromNoFirst day of an explicit period.
weekNoA week: `this week`, `last week`, `2026-W38`, or a date inside it.
limitNoHow many objects to return. Upstream maximum is 1000.
usersNoWhose leaves to read, by name, email or id. Defaults to everyone.
offsetNoHow many objects to skip, for the next page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return values need not be explained, and the 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only projects whose name or code contains this text.
offsetNoHow many objects to skip, for the next page.
statusNoKeep only these statuses. Defaults to every status.
customerNoKeep only projects of this customer, by name or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb (List) and resource (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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
projectsYesThe projects to measure, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and 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.

Conciseness5/5

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.

Completeness5/5

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

With an output schema present, the description need not 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many objects to return. Upstream maximum is 1000.
tasksNoKeep only charges of these tasks, by name or id.
offsetNoHow many objects to skip, for the next page.
projectsNoKeep only charges of these projects, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return values need no explanation; with 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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

List tags, which projects and tasks are labelled with. Read-only upstream: tags are managed in the Gryzzly interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoKeep only these identifiers.
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only entries whose name contains this text.
offsetNoHow many objects to skip, for the next page.
set_idsNoKeep only members of these sets, by identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoKeep only these identifiers.
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only entries whose name contains this text.
offsetNoHow many objects to skip, for the next page.
set_idsNoKeep only members of these sets, by identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, 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.

Conciseness5/5

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.

Completeness5/5

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

With an output schema present, return values 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only tasks whose name contains this text.
offsetNoHow many objects to skip, for the next page.
projectNoKeep only tasks of this project, by name, code or id.
include_completedNoInclude tasks already completed. Defaults to true.
include_containersNoInclude container tasks, which hold other tasks and take no time. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of an explicit period. Defaults to `from`.
fromNoFirst day of an explicit period. Ignored when `week` is set.
taskNoKeep only this task, by name or id.
userNoWhose time to read. Defaults to the user this server acts as.
weekNoA week: `this week`, `last week`, `2026-W38`, or a date inside it.
limitNoHow many objects to return. Upstream maximum is 1000.
offsetNoHow many objects to skip, for the next page.
projectNoKeep only this project, by name, code or id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYesLast day of the period.
daysYesOne line per day that carries time.
fromYesFirst day of the period.
userYesWhose time this is.
weekNoThe ISO week, when the period is exactly one.
totalYesThe same, human readable.
entriesNoThe declarations themselves, when the caller asked for them.
projectsYesOne line per project, largest first.
total_hoursYesThe same, in decimal hours.
total_secondsYesDeclared time over the period, in seconds.
missing_workdaysYesWorking days of the period with nothing declared.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

List the users this API key can see, which is the whole team. Disabled users are left out unless asked for.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many objects to return. Upstream maximum is 1000.
queryNoKeep only users whose name or email contains this text.
offsetNoHow many objects to skip, for the next page.
include_disabledNoInclude users who have been disabled. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoSet when the answer is worth a word of explanation.
countYesHow many objects match the filters upstream, beyond this page.
itemsYesThe objects.
returnedYesHow many objects this answer carries.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoThe day: `today` (the default), `yesterday`, a weekday, `YYYY-MM-DD`.
taskNoThe task, by name or id. Optional when the project has one task only.
userNoWhose time it is. Defaults to the user this server acts as.
projectNoThe project, by name, code or id. Narrows the task lookup.
durationYesHow long: `2h30`, `90m`, `1.5h`, `2:30`, or a bare number of minutes.
descriptionNoWhat the time was spent on. Worth filling: it is what a human reads later.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entryYesThe declaration Gryzzly created.
day_totalYesWhat the whole day now totals, so a double entry is visible at once.
day_total_secondsYesThe same, in seconds.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entriesYesThe declarations to create, in order.
stop_on_errorNoStop at the first refusal instead of carrying on. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesTotal time created, human readable.
failedYesHow many were refused.
createdYesHow many declarations were created.
outcomesYesOne line per requested entry, in order.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of an explicit period. Defaults to `from`.
fromNoFirst day of an explicit period. Ignored when `week` is set.
taskNoKeep only this task, by name or id.
userNoWhose time to read. Defaults to the user this server acts as.
weekNoA week: `this week`, `last week`, `2026-W38`, or a date inside it.
projectNoKeep only this project, by name, code or id.
expected_hours_per_dayNoHours expected on a working day, used to list the days that fall short. Defaults to 7.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYesLast day of the period.
daysYesOne line per day that carries time.
fromYesFirst day of the period.
userYesWhose time this is.
weekNoThe ISO week, when the period is exactly one.
totalYesThe same, human readable.
entriesNoThe declarations themselves, when the caller asked for them.
projectsYesOne line per project, largest first.
total_hoursYesThe same, in decimal hours.
total_secondsYesDeclared time over the period, in seconds.
missing_workdaysYesWorking days of the period with nothing declared.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists so return values need no 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA new name. Gryzzly requires one on every update; the current one is sent when this is absent.
customerYesThe customer to change, by name or id.
managersNoThe managers, by name, email or id. Replaces the current list.
is_activeNoWhether the customer is active.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe customer's identifier.
nameNoThe customer's name.
managersNoThe users managing this customer.
is_activeNoWhether the customer is active.
created_atNoWhen the customer was created.
updated_atNoWhen the customer was last updated.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present, return values need 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe discount's identifier.
nameNoA new name.
amountNoA new amount.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe discount's identifier.
nameNoThe discount's name.
amountNoHow much is taken off.
task_idNoThe task it applies to.
created_atNoWhen the discount was created.
project_idNoThe project it applies to.
updated_atNoWhen the discount was last updated.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return values need not be described. Combined with the 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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource ('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.

Usage Guidelines5/5

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

Change a leave period: move it, shorten it, turn a full day into a half one.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe leave period's identifier.
end_atNoA new last day.
end_typeNoHow much of the last day is off.
start_atNoA new first day.
start_typeNoHow much of the first day is off.
descriptionNoA new description.
delete_declarationsNoDelete the declarations already made over those days.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe leave period's identifier.
end_atNoThe last day of the leave.
user_idNoThe user on leave.
end_typeNo`full`, `am` or `pm`.
start_atNoThe first day of the leave.
edited_byNoWho last edited the leave period.
created_atNoWhen the leave period was created.
start_typeNo`full`, `am` or `pm`.
updated_atNoWhen the leave period was last updated.
descriptionNoWhy the person is away.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Change a project. Gryzzly requires a start date on every update, so the current one is sent when none is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoA new code.
nameNoA new name.
tagsNoTag identifiers. Replaces the current list.
end_atNoA new end date.
groupsNoGroup identifiers. Replaces the current list.
statusNoA new status.
projectYesThe project to change, by name, code or id.
customerNoA new customer, by name or id.
managersNoThe managers, by name, email or id. Replaces the current list.
start_atNoA new start date. Gryzzly requires one on every update; the current one is sent when this is absent.
visibilityNoA new visibility.
is_billableNoWhether the project is billable.
contributorsNoThe contributors, by name, email or id. Replaces the current list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe project's identifier.
codeNoThe project's short code.
nameNoThe project's name.
noteNoThe project note.
tagsNoThe tags attached to the project.
end_atNoWhen the project is supposed to end.
groupsNoThe groups assigned to the project.
statusNoOne of `active`, `done`, `archived`.
managersNoThe users managing the project.
start_atNoWhen the project starts.
created_atNoWhen the project was created.
updated_atNoWhen the project was last updated.
visibilityNo`public` or `private`.
customer_idNoThe customer this project belongs to, when any.
is_billableNoWhether the project is billable.
contributorsNoThe users allowed to declare on a private project.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe purchase's identifier.
nameNoA new name.
paid_atNoA new paid date.
billed_atNoA new billed date.
paid_priceNoA new paid price.
billed_priceNoA new billed price.
billing_policyNoA new billing policy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe purchase's identifier.
nameNoWhat was bought.
paid_atNoWhen it was paid.
task_idNoThe task it is charged to.
billed_atNoWhen it was billed.
created_atNoWhen the purchase was created.
paid_priceNoWhat it cost.
project_idNoThe project it is charged to.
updated_atNoWhen the purchase was last updated.
billed_priceNoWhat it was billed for.
billing_policyNo`add` or `ignore`, how it weighs on the budget.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema 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.

Purpose5/5

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.

Usage Guidelines5/5

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

Change a task: rename it, move its dates, set its budget or its rate, mark it completed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA new name.
tagsNoTag names. Replaces the current list.
taskYesThe task to change, by name or id.
end_atNoA new end date.
groupsNoGroup identifiers. Replaces the current list.
projectNoThe project it belongs to, to disambiguate a name.
start_atNoA new start date.
hourly_rateNoA new hourly rate.
completed_atNoWhen the task was completed. Marks it done.
budget_amountNoA new budget amount.
hourly_rate_modeNoWhere the hourly rate comes from.
planned_durationNoPlanned time, as a duration (`40h`, `90m`).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe task's identifier.
nameNoThe task's name.
tagsNoThe tags attached to the task.
end_atNoWhen the task is supposed to end.
groupsNoThe groups assigned to the task.
start_atNoWhen the task starts.
parent_idNoThe parent task, when this task is a subtask.
created_atNoWhen the task was created.
project_idNoThe project the task belongs to.
updated_atNoWhen the task was last updated.
budget_typeNoOne of `none`, `detailed`, `global`, `time`.
hourly_rateNoThe task's hourly rate.
completed_atNoWhen the task was completed.
is_containerNoWhether the task only holds other tasks.
budget_amountNoThe task's budget.
hourly_rate_modeNoOne of `task`, `group`, `contributor`.
planned_durationNoPlanned duration, in seconds.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

An output schema exists, so return values need no explanation, 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema 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.

Purpose4/5

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.

Usage Guidelines3/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe declaration's identifier, as returned by `list_time_entries`.
dateNoThe new day. Left alone when absent.
taskNoThe new task, by name or id. Left alone when absent.
userNoWhose declaration it is, when it is not the current user's.
projectNoThe project the new task belongs to, to narrow the lookup.
durationNoThe new duration. Left alone when absent.
descriptionNoThe new description. Left alone when absent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe declaration's identifier, needed to update or delete it.
dateYesThe day, as `YYYY-MM-DD`.
taskNoThe task's name, when it could be resolved.
projectNoThe project's name, when it could be resolved.
secondsYesThe duration in seconds, which is what Gryzzly stores.
task_idYesThe task the time is declared against.
user_idYesWhose time it is.
durationYesThe duration, human readable.
project_idNoThe project the task belongs to.
descriptionNoWhat the time was spent on.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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

An output schema exists, so return values need not be explained, and the 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.

Parameters3/5

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

Schema coverage is 100% and each parameter already 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
roleNoThe user's role in Gryzzly.
userYesThe user this server declares time for.
toolsetsYesThe toolsets this server exposes.
read_onlyYesTrue when every write tool was withheld.
this_weekYesThis week, so a client knows where it stands before logging anything.
team_usersYesHow many users the API key can see.
identified_byNoWhich environment variable named this user, if any did.
default_projectNoThe project used when a tool omits one.
timesheet_approved_untilNoThe date until which this user's times are approved and locked.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4; there 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.

Purpose4/5

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.

Usage Guidelines5/5

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.

  1. 53 tool updatesv0.1.0
    • First observedcreate_customer
    • First observedcreate_discount
    • First observedcreate_leave_period
    • First observedcreate_project
    • First observedcreate_purchase
    • First observedcreate_task
    • First observeddelete_customer
    • First observeddelete_discount
    • First observeddelete_leave_period
    • First observeddelete_project
    • First observeddelete_purchase
    • First observeddelete_task
    • First observeddelete_time_entry
    • First observedexport_projects
    • First observedexport_times_and_leaves
    • First observedget_customer
    • First observedget_discount
    • First observedget_group
    • First observedget_groupset
    • First observedget_leave_period
    • First observedget_project
    • First observedget_project_metrics
    • First observedget_purchase
    • First observedget_tag
    • First observedget_tagset
    • First observedget_task
    • First observedget_user
    • First observedimport_leave_periods
    • First observedinvite_user
    • First observedlist_customers
    • First observedlist_discounts
    • First observedlist_groups
    • First observedlist_groupsets
    • First observedlist_leave_periods
    • First observedlist_projects
    • First observedlist_projects_metrics
    • First observedlist_purchases
    • First observedlist_tags
    • First observedlist_tagsets
    • First observedlist_tasks
    • First observedlist_time_entries
    • First observedlist_users
    • First observedlog_time
    • First observedlog_time_bulk
    • First observedtimesheet
    • First observedupdate_customer
    • First observedupdate_discount
    • First observedupdate_leave_period
    • First observedupdate_project
    • First observedupdate_purchase
    • First observedupdate_task
    • First observedupdate_time_entry
    • First observedwhoami

TDQS

A3.8/5.0

Scored across 53 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count1/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers