Altiplano
Altiplano is an MCP server that lets you manage Vikunja projects, tasks, kanban boards, relations, labels, comments, and assignees through tool calls.
Projects: list projects (including sub-projects) and create projects/sub-projects.
Tasks: list, search, get, create, update, move, duplicate, bulk-create, bulk-update, set reminders for, and delete tasks; supports priorities, dates, progress, favorites, and repeating tasks.
Kanban: list kanban views and buckets, create/delete buckets, list tasks per bucket, see a task's buckets, and move tasks between buckets (including done-column behavior).
Relations: add and remove task relations such as subtask, parenttask, duplicate, blocking, precedes/follows, and copied-from/to links.
Labels: list, create, delete labels, and attach/detach them from tasks.
Comments: list, add, update, and delete comments on tasks.
Assignees: search users, list task assignees, and assign/unassign users.

Altiplano
A small, dependable MCP server for Vikunja. Named after the Andean altiplano, the high plateau that is the Vicuña's native habitat.
Altiplano runs locally through uvx, or as a stand-alone HTTP service that several people share on one endpoint, each acting as their own Vikunja user. Both modes expose the same tools and the same guidance.
Choose how to use Altiplano
Local, through | Shared, over HTTP | |
Where Altiplano runs | On your computer, launched by your MCP client. | On a host running Altiplano as a stand-alone service. |
How your MCP client connects | Runs | Connects to the service URL with a valid bearer token. |
Requirements on your computer |
| An MCP client supporting Streamable HTTP and a configured |
Where the Vikunja credentials live | On each computer running Altiplano. | On the service host, one token per client. |
Setup |
Connecting to an existing HTTP service needs its URL and an Altiplano client token. You do not need to install Altiplano,
uv, or Python on the client.
The configuration examples below use an mcpServers block. Adapt the surrounding structure to your MCP client's configuration format.
Related MCP server: ticktick-mcp
Use locally with uvx
Your MCP client launches Altiplano as a local subprocess and communicates with it over stdio. Each client manages its own Altiplano process.
1. Install uv
uv provides the uvx command, which runs Altiplano from PyPI without a repository checkout.
2. Configure Vikunja credentials
Create an API token in Vikunja under Settings → API Tokens, reachable from the menu under your username. Give it the scopes covering the tools you intend to call. See Vikunja's API documentation.
mkdir -p ~/.config/altiplanoCreate ~/.config/altiplano/env containing:
VIKUNJA_URL=https://altiplano.example.com/api/v2
VIKUNJA_API_TOKEN=tk_replace_meRestrict the file's permissions:
chmod 600 ~/.config/altiplano/envAltiplano checks these sources in order:
The
VIKUNJA_URLandVIKUNJA_API_TOKENenvironment variables.A file containing
KEY=VALUEpairs, defaulting to~/.config/altiplano/env.
Set ALTIPLANO_CONFIG before starting Altiplano to read a different file. Use absolute paths; ~ is not expanded in custom paths.
VIKUNJA_URLmust end in/api/v1or/api/v2. That suffix selects the version, for examplehttps://altiplano.example.com/api/v2.
Vikunja 2.4.0 introduced
/api/v2. Altiplano strips trailing slashes and enables v2 only for a URL ending in/api/v2. Every other URL keeps its configured path and uses v1 request verbs. Use/api/v2when the server supports it.
Permissions broader than
600produce a warning on POSIX systems and startup continues. An unreadable file is ignored after a warning.
3. Configure your MCP client
Add a local server entry:
{
"mcpServers": {
"altiplano": {
"command": "uvx",
"args": ["--refresh-package", "altiplano", "altiplano@latest"]
}
}
}
--refresh-package altiplanochecks PyPI for a current release. If an older version still starts, close the client and runuv cache clean altiplano.
4. Verify with one call
Restart or reconnect your MCP client, then call list_projects(). Any list, an empty one included, confirms that Altiplano reaches Vikunja with the configured credentials.
Altiplano speaks MCP over stdio. Running
uvx altiplanoin a terminal prints nothing and waits for a client on stdin and stdout.
Use over HTTP
altiplano-http serves the same tools over Streamable HTTP from one always-on host. Each client presents its own bearer token, which Altiplano mints, stores as a SHA-256 hash, and revokes one at a time.
The service must already be running and reachable from the computer running your MCP client. Adding its URL to your client configuration connects to the service. It does not start it. DEPLOYMENT.md covers standing one up, and Docker is the shortest path there.
One endpoint serves several people, each as their own Vikunja user. There is no shared Vikunja API token: the host holds one per registered client, and a request is made with the token belonging to the client that sent it. Two people on one service reach their own projects and their own tasks, with Vikunja applying its own permissions to each.
Registering a client is a manual step for whoever operates the host. An unrecognised client token is refused with
401. A registered client whose record holds no Vikunja token is refused with403.
Connect to an existing service
Obtain the MCP endpoint URL and a client token from whoever operates the host server. If that is you, Register clients has the steps.
Use one client token per client. Sharing one works, at two costs: the clients all act as the same Vikunja user, and revoking it cuts off every one of them.
claude mcp add --transport http altiplano \
https://altiplano.example.com/mcp \
--header "Authorization: Bearer altp_replace_me"The equivalent in a client's own configuration:
{
"mcpServers": {
"altiplano": {
"type": "http",
"url": "https://altiplano.example.com/mcp",
"headers": {
"Authorization": "Bearer altp_replace_me"
}
}
}
}type: Not part of the MCP protocol, which covers the wire format and leaves the configuration shape to each client. They disagree: some require
type, some spell the valuestreamable-httpand othershttp, some call the keytransport, and some infer the transport fromurlalone. Use the form your client documents.url: Replace it with the real endpoint, including its port and path where required. The example assumes HTTPS is configured for the service.
headers: The bearer token here is an Altiplano client token, issued by
altiplano-clientkey, and it says which client is calling. Your Vikunja API token is a separate thing: it stays on the service host, registered against your client, and it is the identity your requests act as. Give the operator a token from your own Vikunja account.
A client that only launches subprocesses cannot reach an HTTP URL at all. Keep the stdio entry on those machines.
Restart or reconnect your MCP client, then call list_projects(). A successful response confirms the connection, the client token, and access to Vikunja.
Keep the client token private. It grants access to the service and every tool it exposes. Ask the operator to revoke and replace a lost or exposed token. A revocation applies to the next request.
The supported path is a client that sends the header you configure. Altiplano answers an unauthenticated request with a bare
WWW-Authenticate: Bearerchallenge and publishes no OAuth metadata. A client may still probe the well-known metadata URLs on its own initiative and will get a404. A client that can only obtain credentials through an OAuth flow is not supported here.
Tools
list_projects(include_archived=False): includesparent_project_idfor sub-projects andis_archived. Vikunja omits archived projects from this endpoint;include_archived=Trueadds them back alongside the active ones.create_project(title, parent_project_id?, description?): passparent_project_idto create a sub-project.update_project(project_id, title?, description?, parent_project_id?, is_archived?, hex_color?): changes only the supplied fields and requires at least one.is_archivedarchives and unarchives, and Vikunja has no separate archive endpoint.hex_coloris six hexadecimal digits without#.delete_project(project_id): deletes the project, its sub-projects, and every task in all of them, along with each task's comments, labels, and assignees. Vikunja retains them for 30 days and provides no restore endpoint. Treat deletion as irreversible, and preferupdate_project(project_id, is_archived=True)to set a project aside.
Archiving hides a project from
list_projectsunlessinclude_archived=True. Vikunja also refuses every other edit to an archived project, and to the tasks in it, with a412. Unarchive it first.
list_tasks(project_id, filter?, sort_by?, page=1, per_page=50): Vikunja appliesfilterandsort_bybefore pagination.search_tasks(query?, filter?, sort_by?, page=1, per_page=50): searches all visible projects and includesproject_idin each result. Vikunja does not combine text search withfilter.get_task(task_id): returns full task detail. On v2, the description is Markdown.create_task(project_id, title, description?, priority?, due_date?, start_date?, end_date?, percent_done?, is_favorite?, repeat_after?, repeat_mode?)update_task(task_id, title?, description?, done?, priority?, due_date?, start_date?, end_date?, percent_done?, is_favorite?, repeat_after?, repeat_mode?): changes only the supplied fields and requires at least one. Pass an empty string fordue_date,start_date, orend_dateto clear it.move_task(task_id, project_id): moves labels, assignees, comments, relations, and dates with the task. The destination project assigns a new localidentifier.duplicate_task(task_id): copies the task, labels, assignees, attachments, and reminders into the same project. The copy receives acopiedfromrelation to the original.bulk_create_tasks(project_id, tasks): creates a batch of tasks in one request, atomically and in the given order. Requires/api/v2. Each entry takes the same fields ascreate_task,titleincluded, anything else is refused. Vikunja caps a batch at 100 and names the entry that fails. Returns one summary per created task.bulk_update_tasks(task_ids, done?, priority?): requires at least one field. The request fails as a unit if the token lacks write access to any affected project.set_reminders(task_id, reminders): replaces all reminders with the supplied ISO 8601 datetimes. Pass an empty list to clear them.delete_task(task_id): soft-deletes the task and removes its comments, labels, and assignees. Vikunja retains the task for 30 days and provides no restore endpoint. Treat deletion as irreversible.
list_kanban_views(project_id): includes the default and done bucket IDs.list_buckets(project_id, view_id?): returns columns in board order and marks the default and done columns.create_bucket(project_id, title, view_id?, limit?): adds a column at the right. Omitlimit, or pass0, for no limit.update_bucket(project_id, bucket_id, title?, limit?, view_id?): renames a column or changes its limit, and requires at least one field. Neither API version offers a partial update here. The call reads the column and writes it back whole. Column order is not writable.delete_bucket(project_id, bucket_id, view_id?): moves the column's tasks to the default column. Vikunja will not remove the last column.list_board(project_id, view_id?, filter?): returns columns and their tasks.task_countremains the full count when Vikunja caps the returned task list. Takes the same arguments aslist_bucketsand adds the tasks and their counts.list_task_placements(task_id): returns the column holding the task, one entry for each kanban view.move_task_to_bucket(task_id, bucket_id, view_id?): reads the project ID from the task.
Bucket behaviour:
Bucket operations require a view with
view_kind="kanban". Withoutview_id, Altiplano uses the first kanban view in the project's view order.bucket_configuration_mode="manual"accepts explicit moves. Infiltermode, filters determine the column.A move into a full bucket fails.
Moving a task into the done column closes it; moving it out reopens it.
A repeating task moved into the done column reopens in the default column.
Setting
doneto true throughupdate_taskmoves the task into the done column.
add_relation(task_id, other_task_id, relation_kind="related")remove_relation(task_id, other_task_id, relation_kind="related"): use the same kind that created the relation.
get_taskreturnsrelated_tasks, grouped by kind. Supported kinds aresubtask,parenttask,related,duplicateof,duplicates,blocking,blocked,precedes,follows,copiedfrom, andcopiedto.
add_relation(task_id, other_task_id, "subtask")makesother_task_ida child oftask_id.
list_labels(), create_label(title, hex_color?, description?), update_label(label_id, title?, hex_color?, description?), delete_label(label_id), add_label(task_id, label_id), remove_label(task_id, label_id).
hex_coloris six hexadecimal digits without#.update_labelchanges only the supplied fields and requires at least one; every task with the label shows the change. Deleting a label removes it from every task.
list_comments(task_id), add_comment(task_id, comment), update_comment(task_id, comment_id, comment), delete_comment(task_id, comment_id).
update_commentreplaces the complete text. Getcomment_idfromlist_comments.
search_users(query), list_assignees(task_id), add_assignee(task_id, user_id), remove_assignee(task_id, user_id).
Use
search_usersto find theuser_idrequired by the assignment tools.
Guidance
Altiplano documents its own use in four places.
The handshake sends usage rules: resolve ids by name, which calls cannot be undone, how to close a task. Clients apply them on connect.
The
altiplano_guideprompt holds the full version, with cross-tool sequencing and the v1 and v2 differences. Clients list it asUsing Altiplano.AGENTS.mdcovers working on this repository, and installing Altiplano for someone else.CLAUDE.mdimports it, for Claude Code.DEPLOYMENT.mdcovers running the HTTP transport as a service on a host: Docker with aDockerfileand a compose file, a two-commanduvpath with no clone, every environment variable the transport reads, minting client tokens, encrypting the connection, four checks that say whether it works, and an FAQ of the ways it fails.
Task behaviour
Task updates
Both API versions preserve fields omitted from an update.
On v1, POST /tasks/{id} replaces the complete task. Altiplano reads the current task, merges the changes, and writes it back for update_task, set_reminders, and move_task. Each call costs one extra request.
On v2, those calls use PATCH. A description change uses a read and full replacement because PATCH does not apply Markdown conversion.
When a v2 read includes an ETag, Altiplano sends it in If-Match during the replacement. Vikunja returns HTTP 412 if the task changed between the read and write. Read the task again before retrying. V1 and v2 responses without an ETag have no concurrency guard.
Dates, priority, and progress
Priorities use Vikunja's scale:
0Unset,1Low,2Medium,3High,4Urgent, and5DO NOW.Dates are ISO 8601 datetimes.
start_dateandend_datedefine the work window;due_dateis the deadline.An empty string clears a date by writing Vikunja's zero time,
0001-01-01T00:00:00Z.percent_doneis a fraction. A quarter complete is0.25. Vikunja does not clamp the value, and50remains50.
Repeating tasks
repeat_after is measured in seconds. Completing a repeating task reopens it and advances its due date and reminders.
repeat_mode values:
0: advance the existing dates byrepeat_after.1: repeat monthly and ignorerepeat_after.2: calculate the next occurrence from the completion date.
Vikunja's v1 specification lists 3 in the repeat_mode description; its generated enum defines the final mode as 2.
A repeating task with no dates reopens immediately and cannot remain closed. Set a due_date when enabling repetition.
Identifiers and errors
The Vikunja UI displays a project-local identifier, such as #50. API calls use the global numeric id.
Failed requests include Vikunja's detail, message, or title field when present. Altiplano also includes a non-zero numeric error code when Vikunja provides one. Redirects are errors and include the destination.
Requests time out after 30 seconds and are not retried.
Markdown
Vikunja stores task descriptions and comments as HTML. Altiplano requests Markdown conversion for full task reads, task creates, project creates, comment reads and writes, and full task replacements.
The v1 API has no Markdown conversion. Markdown sent through v1 is stored literally.
V2 partial updates through update_task, move_task, and set_reminders return the stored HTML description. Call get_task to retrieve Markdown. An update_task call that changes description uses a full replacement.
Vikunja resolves @mentions during Markdown conversion and notifies the named user.
Compatibility
Tested with Vikunja 2.5.0 against /api/v1 and /api/v2.
Identified issues:
On Vikunja 2.5.0, the v2 grouped-bucket route used by
list_boardmay return HTTP 401 when the token works elsewhere. Try a new full-permission token or/api/v1. The same diagnosis is returned for every v2 HTTP 401 from that route. Verify the token itself too.list_bucketsreads a different route and is unaffected.On Vikunja 2.3.0,
list_assigneesreturns HTTP 500. The endpoint worked on 2.5.0.
Contributing
Pull requests are always welcome. CONTRIBUTING.md covers the development setup, the commands, the pre-commit hook, the source layout, and what a pull request needs. Taking part means agreeing to the code of conduct.
Licence
MIT.
Support
RTFM, then RTFS. If you are still stuck, or just need an additional feature, file an issue.
Available Tools
39 toolsadd_assigneeC
Assign a user to a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| user_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the mutation itself; it does not say whether assignment is additive, whether an existing assignee is replaced, whether multiple assignees are allowed, or what validation/permission requirements exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler; every word contributes to the core action. For a two-parameter tool this is an appropriately sized statement of purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter write operation, the description is minimally sufficient to construct a call: task_id identifies the task and user_id identifies the user. However, it is incomplete on behavioral context (add vs. replace, duplicates, permissions) and does not mention the sibling remove_assignee/list_assignees for contrast, leaving room for hesitation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only provides names/titles. The description maps 'user' and 'task' to the two parameters only implicitly and gives no operational details such as ID validity, uniqueness, or relationship to existing assignees, so it doesn't compensate for the missing parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('assign') and the objects ('a user', 'a task'), so the core purpose is unambiguous and semantically distinct from remove_assignee/list_assignees. It doesn't explicitly name or differentiate siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool instead of alternatives, nor any context about prerequisites, exclusions, or ordering relative to other operations. The description implies the obvious use case but provides no explicit usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_commentC
Add a comment to a task.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | Yes | ||
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It conveys that this is a create operation but discloses nothing else: no mention of return value, idempotency, whether it appends to existing comments, error behavior, or required permissions. This is a mutation tool with zero behavioral context beyond the verb itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no wasted words, and the key action is front-loaded. It is appropriately terse for a simple two-parameter create operation, though one additional clause about the return value or behavior would not have degraded readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with only two required parameters and no nested objects, the description is minimally adequate. However, with no annotations and no output schema, the agent is left guessing about success behavior, return value, and failure conditions — gaps that matter for a write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the two undocumented parameters. It only loosely maps comment and task_id through the phrase 'a comment to a task,' which adds little beyond what the parameter names already imply. No constraints, formats, or edge-case semantics are clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add') with a clear resource ('a comment') and target ('a task'), making the core purpose unambiguous. It implicitly distinguishes from siblings like update_comment, delete_comment, and list_comments through the verb choice, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It doesn't contrast with update_comment (modify existing) or list_comments (read), and provides no context about when adding is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_labelB
Attach a label to a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| label_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral context on its own. It only implies a mutation/association and does not mention idempotency, duplicate handling, error behavior, permissions, or whether the label must pre-exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It directly communicates the core operation without redundant filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool itself is simple with only two integer parameters and no output schema, so a short description can be adequate. But with no annotations, no parameter descriptions in the schema, and no usage or behavioral guidance, the description only covers the minimum viable information for selecting and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It maps the two parameters conceptually: task_id refers to the task and label_id refers to the label. However, it does not explicitly describe each parameter's meaning, constraints, or source, leaving the agent to infer the mapping from names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact action ('Attach') and the resources involved ('a label', 'a task'). This clearly distinguishes it from related siblings like create_label (creating a label definition), remove_label (removing the association), and list_labels (listing available labels).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as create_label, remove_label, or add_assignee. It does not mention prerequisites like whether the label and task must already exist, or when an agent should prefer a different tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_relationA
Relate one task to another. Defaults to a plain, symmetric related link.
Kinds: subtask, parenttask, related, duplicateof, duplicates, blocking, blocked, precedes, follows, copiedfrom, copiedto.
task_id is the base task and other_task_id is the one being related to it.
That direction decides the asymmetric kinds: subtask makes the other task a
child of this one. Needs write access to the base task and read access to the
other; they do not have to be in the same project.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| other_task_id | Yes | ||
| relation_kind | No | related |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does well by revealing the symmetric default, directional semantics for asymmetric kinds, permission needs, and the fact that tasks need not be in the same project. It stops short of describing edge cases such as duplicate relations or failure behavior, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, with no filler. It front-loads the core purpose, organizes the kinds into a list, then explains direction and access in a clear, structured way.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with no output schema, the description covers the key inputs, valid values, directionality, permissions, and cross-project behavior. It does not mention return values or error conditions, but these are not essential for selecting or invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It fully explains the meaning of task_id versus other_task_id, lists all valid relation kinds, and states the default value for relation_kind. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Relate one task to another.' It identifies the resource, the default relation kind, and enumerates the supported relation kinds, making the tool's scope obvious and distinct from siblings like remove_relation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful usage context: it explains defaults, which task is the base versus the other, the role of direction for asymmetric kinds, and access requirements. It does not explicitly contrast this tool with alternatives or state when not to use it, but the practical context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_create_tasksA
Create several tasks in one project, in one request. Needs the v2 API.
Vikunja creates the batch atomically: if one entry is invalid then none are
created, and the error names the entry that failed. The tasks also keep the
order they were given. A loop of create_task calls races: a numbered plan can
come back shuffled, and a failure halfway through leaves the rest uncreated.
Each entry is an object taking the same fields as create_task. title is
required; description, priority, due_date, start_date, end_date,
percent_done, is_favorite, repeat_after, and repeat_mode are optional
and mean what they do there, including an empty string to clear a date.
Anything else is refused. A dropped key would read as a task created with a
date or a priority it never got. Vikunja caps a batch at 100.
Returns a summary per created task, in creation order. Call get_task for the
full detail of one.
| Name | Required | Description | Default |
|---|---|---|---|
| tasks | Yes | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it excels: it discloses atomicity, the error naming the failed entry, ordering guarantees, the 100-task cap, strict validation that refuses unknown fields, the empty-string date-clearing convention, and the summary-only return format. This goes well beyond what the sparse schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then provides dense, non-redundant behavioral and parameter details. Each paragraph earns its place: atomicity, ordering, comparison to create_task, field semantics, limits, and return-value guidance. Nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and zero annotation coverage, the description is complete: it covers the API requirement, atomic behavior, ordering, validation, batch limit, field semantics, and return type. The output schema likely covers the exact summary shape, so the description's high-level mention of 'summary per created task' is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only declares project_id and tasks as generic types, so the description must compensate. It does so thoroughly by listing required and optional fields, explaining that entries mirror create_task fields, and warning that unknown keys are refused and dropped keys can silently produce unintended dates or priorities.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create several tasks in one project, in one request,' giving a specific verb and resource while clearly distinguishing it from the single-task create_task sibling. It also states the v2 API requirement and the atomic/ordered batch behavior, so an agent can identify exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts this tool with a loop of create_task calls, explaining that the loop races and can leave partially-created tasks, while bulk_create_tasks is atomic and preserves order. It also directs the agent to get_task when full detail of an individual task is needed, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_tasksA
Set done or priority on many tasks in one request.
Only the fields you pass are written, on either API version. This endpoint takes the field names separately from the values. That makes it a genuine partial update on v1 too, where updating a single task is a replace.
You need write access to every project involved. If it is missing on even one, the whole request is refused and nothing changes.
| Name | Required | Description | Default |
|---|---|---|---|
| done | No | ||
| priority | No | ||
| task_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full disclosure burden and delivers: partial-update semantics ('Only the fields you pass are written'), a per-project write-access requirement, and an all-or-nothing failure mode ('the whole request is refused and nothing changes'). This goes well beyond generic 'update' language and prevents an agent from assuming partial success or that omitted fields are cleared.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs with the purpose front-loaded in the first sentence. The only mild redundancy is the middle paragraph's three sentences all circling the single point 'this is a partial update on both versions'; informative, but it could be tightened into fewer sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no annotations and no output schema, the description covers the decision-critical facts: fields affected, partial-update behavior, permissions, and atomic failure. The notable omissions are the response shape (no output schema exists to carry this) and any maximum batch size for task_ids.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it does by clarifying the key gotcha: only passed fields are written, meaning omitted optional parameters are untouched despite their null defaults. task_ids is also implicitly scoped across multiple projects via the 'every project involved' permission note. It stops short of explaining explicit-null behavior (does done:null clear the field?) or any priority value range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names a specific verb ('Set'), the exact writable fields (`done`, `priority`), and the scope ('many tasks in one request'). This clearly differentiates it from siblings like update_task (single task) and bulk_create_tasks (creation), so an agent can route correctly without opening any schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the tool works 'on either API version' and contrasts its behavior with single-task update, which is a replace on v1 — clear context for when the bulk endpoint is appropriate. However, it never explicitly names sibling alternatives or states when-not-to-use it, so exclusions remain implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bucketA
Add a column to a project's kanban view. It goes on the right-hand end.
limit caps how many tasks the column accepts, and moves into a full one are
refused; leave it out, or pass 0, for no limit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| title | Yes | ||
| view_id | No | ||
| project_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the burden of behavioral disclosure. It does add useful behavior: the column appears at the right-hand end, and a limit caps accepted tasks, with moves into a full column refused. However, it does not mention permissions, success response, irreversibility, or what happens if the limit is omitted beyond the limit semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: the first sentence states the core purpose, and the following sentences add necessary behavioral detail. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has four parameters, no annotations, and no output schema, so the description needs to provide more contextual grounding. It misses explanation of `view_id` in relation to `project_id`, and it does not describe the return value or expected outcome from a successful call, leaving an agent under-informed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains the `limit` parameter, and even that is not fully precise about default behavior. `title`, `project_id`, and especially `view_id` are not described, leaving important parameter relationships unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action — add a column — with a clear target resource (a project's kanban view). This distinguishes it from sibling tools like delete_bucket, list_buckets, and move_task_to_bucket, so an agent can tell what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when adding a column to a project's kanban view. However, it does not explicitly discuss alternatives, prerequisites, or when not to use it, leaving the routing logic mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_labelA
Create a label, which add_label can then attach to tasks.
hex_color is six hex digits with no leading #, as list_labels reports them.
description is rich text, written as Markdown. Vikunja stores it as HTML and
v2 converts on the way in.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| hex_color | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, and the description covers only input formatting (hex_color, Markdown-to-HTML conversion), omitting return value, side effects, permissions, and error behavior. As a mutation tool, more behavioral disclosure is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise and well-structured, using short paragraphs for separate notes. No unnecessary words or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key input formats and the relationship to add_label, but lacks title expectations, return value, and error handling. Given the simplicity of the tool, it is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides meaningful detail for hex_color and description, including format and conversion behavior, but the required title parameter is not described at all. This is a significant gap for the one mandatory input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool creates a label and explains its downstream use by referencing add_label. The action and subject are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides some usage context by noting that labels can be attached to tasks with add_label, but does not explain when to prefer this over update_label or delete_label, nor any prerequisites. The guidance is minimal but not misleading.
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. Pass parent_project_id to create it as a sub-project.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| description | No | ||
| parent_project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does state the core side effect (creates a project) and the parent-child variant, which lets the agent know this is an additive operation. However, it does not disclose auth requirements, error conditions, whether the parent project must exist, or what the tool returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The main action is front-loaded, and the sub-project guidance follows immediately, making it easy for an agent to parse the essential behavior quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for basic invocation, especially since the parameter names and schema cover title/description/required details. However, with no annotations, no output schema, and no mention of errors, prerequisites, or return behavior, an agent is left without full context for edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds real meaning to parent_project_id by explaining that passing it creates a sub-project. The title and description parameters are self-explanatory from their names, and title is already marked required in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Create') and the resource ('a project'), and it adds a specific variant: passing parent_project_id creates a sub-project. It does not explicitly distinguish itself from sibling creation tools like create_task, but the resource name is enough to establish the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is the conditional for sub-projects: 'Pass parent_project_id to create it as a sub-project.' There is no explicit statement about when to prefer this tool over related tools such as create_task, bulk_create_tasks, or list_projects, nor any exclusions or prerequisites beyond the parent id.
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.
start_date and end_date are ISO 8601 datetimes marking the window you
plan to work on the task (start work / finish work), distinct from
due_date (the deadline).
percent_done is a fraction despite the name. A quarter done is 0.25. Vikunja
does not validate it, and 50 is stored as 50.
repeat_after is a number of seconds, and repeating happens when the task is
marked done: it reopens itself and moves its due date and reminders forward.
repeat_mode is 0 to advance by repeat_after, 1 to repeat monthly and ignore
repeat_after, or 2 to count from the day it was completed. Give a repeating
task a due_date. It reopens whether or not there is a date to advance, and one
with no dates can never be closed.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| due_date | No | ||
| end_date | No | ||
| priority | No | ||
| project_id | Yes | ||
| start_date | No | ||
| description | No | ||
| is_favorite | No | ||
| repeat_mode | No | ||
| percent_done | No | ||
| repeat_after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility, and it delivers: it warns that percent_done is a fraction and unvalidated, explains start/end versus due_date semantics, and details the reopening behavior of repeat tasks, including the trap that a repeating task with no date can never be closed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but waste-free: the opening sentence states the core purpose, and every following paragraph targets a real trap or field ambiguity. Parameter names are formatted clearly and the most important caveats come early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no annotations and no output schema, the description covers the highest-risk behaviors and field semantics, which is enough for a correct call in most cases. It does not mention the return value of the created task or the meaning of priority, leaving minor but real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by giving concrete semantics for the non-obvious fields: ISO datetime meanings, percent_done as a 0-1 fraction, repeat_after in seconds, and repeat_mode values. Some parameters like priority still lack semantic detail, so the compensation is not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence, 'Create a task in a project,' names a specific operation and object, so the purpose is immediately clear. It does not explicitly distinguish this from sibling tools such as bulk_create_tasks or duplicate_task, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to choose create_task over alternatives like bulk_create_tasks or update_task. The intended use is only implied by the name and the opening sentence; no exclusions, prerequisites, or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_bucketA
Delete a column from a project's kanban view.
Vikunja moves the tasks it held to the default bucket, leaving them intact. A view keeps at least one column, and the last one cannot be removed.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | No | ||
| bucket_id | Yes | ||
| project_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It transparently explains that tasks are moved to the default bucket and left intact, and that the last column cannot be removed. This is strong disclosure of side effects and invariants, though it does not mention permissions or error responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with the primary purpose. The supporting details about task migration and the last-column constraint are directly relevant and add no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the behavioral outcome well but is incomplete for invocation. A caller cannot confidently determine how view_id should be used when multiple kanban views exist, and there is no output schema or annotation to offset this. The tool has only three parameters, so a complete definition should clarify each one or at least explain the view_id relationship.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the three parameters. It loosely implies that project_id identifies the project and bucket_id identifies the column, but the optional view_id is completely unexplained. This is a meaningful gap because the distinction between bucket_id and view_id is not obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'Delete a column from a project's kanban view.' It equates bucket with column, which distinguishes it from other deletion tools like delete_task or delete_label. The behavior is immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use the tool by defining the delete action and including the constraint that the last column cannot be removed. However, it does not explicitly mention alternatives or when-not-to-use conditions, such as using move_task_to_bucket if tasks should be relocated manually. The guidance is implied rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_commentB
Delete a comment from a task. Get comment_id from list_comments.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| comment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It does disclose that the tool mutates state by deleting a comment, but it does not mention permanence, side effects, or response/error behavior, which are relevant for a deletion tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the core operation in the first and the one essential prerequisite in the second. There is no filler or redundant restatement of the input schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a delete tool with no annotations and no output schema, the invocation contract is incomplete: it does not state what a successful deletion returns or how the task_id should be obtained. The description gives only partial parameter context and no behavioral expectations beyond the act of deletion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the schema. It adds meaning only for comment_id by directing the agent to list_comments; task_id remains an unexplained integer with no guidance on where it comes from or how it should be formatted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly the operation ('Delete a comment') and the resource scope ('from a task'). It naturally distinguishes itself from sibling tools like list_comments, add_comment, and update_comment by naming the destructive variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The first sentence implies when to use it (whenever a comment needs removal), and the second gives a concrete prerequisite ('Get comment_id from list_comments'). However, it does not explicitly discuss when not to use it or compare against alternatives such as update_comment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_labelA
Delete a label everywhere. It comes off every task that has it.
remove_label takes a label off one task and leaves the label itself alone.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It reveals the key non-obvious behavioral trait — the deletion propagates to every task carrying the label. It does not mention irreversibility or error behavior when the label doesn't exist, but the global-destruction side effect is clearly conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste: the first front-loads the action and scope, the second disambiguates from remove_label. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete tool with no output schema and no annotations, the description covers the essential decision facts: what is deleted, the global scope, and the sibling distinction. Omissions like return value and behavior for nonexistent labels are low-stakes given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole required parameter label_id has 0% schema description coverage and the description adds no explicit explanation of it. The meaning is nevertheless inferable from the parameter's self-explanatory name and integer type, and the description clarifies what effect applying the ID has, so the gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete), resource (a label), and scope ('everywhere... every task that has it'), which precisely defines the operation. It explicitly contrasts itself with the sibling remove_label, so an agent can distinguish them without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly names the alternative (remove_label) and states the selection condition: use this tool when the label itself should be destroyed everywhere, use remove_label when detaching it from just one task. That is explicit 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.
delete_projectA
Delete a project, everything in it, and every project under it.
This cascades. Deleting a parent takes its sub-projects, every task in all of them, and each task's comments, labels, and assignees. Checked against Vikunja 2.5.0 with a parent, one sub-project, and a task: all three ids read 404 afterwards.
Vikunja soft-deletes and documents a 30 day retention window, while exposing no
endpoint to list or restore anything deleted. Through this API the call is
permanent. Confirm the id with list_projects first, and look there for a
parent_project_id matching this one: any project that names it goes too.
To put a project out of the way and keep it, call update_project with
is_archived: true.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses that deletion is cascading, that Vikunja soft-deletes with 30-day retention, that no restore endpoint exists, and that the operation is effectively permanent. This is highly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than strictly necessary but each section adds critical warnings: cascading behavior, soft-delete/retention, permanence, confirmation step, and archive alternative. The repetition of 'Checked against' could be trimmed, but overall structure is clear and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single-parameter input and no output schema, the description fully covers the operation's effects, risks, and alternative. It provides enough context for an agent to decide correctly and act safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only one required integer project_id with no description coverage. The description references confirming the id via list_projects and mentions parent_project_id, but does not explicitly define the project_id parameter beyond its obvious role. Some compensation exists, but it is minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool deletes a project and cascades to sub-projects, tasks, comments, labels, and assignees. It is distinct from sibling tools like update_project and delete_task, and explicitly contrasts with archiving.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use and when not to use: it advises confirming the ID with list_projects first and directs users to update_project with is_archived: true for non-destructive archiving. This leaves no ambiguity about appropriate invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskA
Delete a task. There is no way to undo this through the API.
Vikunja soft-deletes, and documents deleted tasks as retained for 30 days before permanent removal, while exposing no endpoint to list or restore them. The row outlives the task and stays unreachable from here. Treat this as irreversible and confirm the id first. Deleting a task also takes its comments, labels, and assignees with it.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral burden. It discloses soft-delete behavior, 30-day retention, the lack of list/restore endpoints, irreversibility, and cascading deletion of comments, labels, and assignees. This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and uses every sentence to convey essential risk information. The wording is efficient and memorable without being padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers everything an agent needs to call it safely: irreversibility, retention behavior, lack of restore, confirm-id guidance, and cascading effects. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description does not explain task_id beyond 'confirm the id first.' That is a safety caution, not parameter semantics. However, the single integer parameter is self-evident from its name, so the lack of explanation is only a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Delete a task,' a specific verb and resource that clearly distinguishes this from sibling deletion tools like delete_comment, delete_bucket, and delete_label. The scope is unambiguous and immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: this is irreversible, the id should be confirmed first, and deletion cascades to associated objects. It does not explicitly name an alternative tool, but none is truly relevant for deleting a task, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_taskA
Copy a task, with its labels, assignees, attachments, and reminders.
The copy lands in the same project as the original and links back to it with a
copiedfrom relation. Vikunja offers no way to duplicate straight into another
project; call move_task on the copy for that.
Returns the copy, with the id a caller needs to act on it. Vikunja wraps
this one response in a duplicated_task envelope on both API versions, and that
wrapper is removed here. A body without the key is passed through whole.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: the copy includes specific attributes, lands in the same project, links back with a copiedfrom relation, and returns the copy with the id. It also explains the response envelope handling. However, the final sentence about 'A body without the key is passed through whole' is cryptic and could confuse, slightly reducing transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat verbose, including details about response envelopes and a cryptic final sentence. It is structured with a clear lead sentence, but the extra detail about envelope removal and the 'body without the key' clause is redundant and could be trimmed for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple copy operation, the description covers the essential context: what is copied, where it lands, relation created, and response content. It also mentions the alternative for moving. It lacks potential error scenarios or permission requirements, but these are not critical for a basic copy. The response format is partially explained, though the final sentence is unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter is task_id, which is clearly the ID of the task to duplicate from context, but the description does not explicitly mention it. With 0% schema coverage, the description should compensate by naming and explaining the parameter; it does not, leaving some inference required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Copy a task, with its labels, assignees, attachments, and reminders.' It specifies the resource (task) and scope (same project, with copiedfrom relation). It also distinguishes from siblings like move_task, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on the primary use case and points to an alternative: 'Vikunja offers no way to duplicate straight into another project; call move_task on the copy for that.' This is helpful for when to use this tool versus move_task. However, it does not contrast with create_task or other task creation methods, leaving some room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskB
Get a single task with full detail. On v2 the description is Markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral context. 'Get' implies a read-only operation and 'full detail' suggests a rich response, which is helpful. But it doesn't disclose auth requirements, not-found behavior, errors, or response shape beyond the vague phrase 'full detail.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is appropriately concise and front-loaded, but the second sentence 'On v2 the description is Markdown' is extraneous and confusing. It does not help an agent select or invoke the tool, and should be removed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple single-parameter getter, so the core invocation is clear. However, there is no output schema, no guidance on when to choose this over similar task tools, and no mention of error behavior or what fields 'full detail' actually includes. It is minimally viable but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required parameter, task_id, with 0% schema description coverage. The description does not explain task_id beyond the schema's own title 'Task Id,' and it doesn't add examples, constraints, or context about how the ID is obtained or used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Get a single task with full detail.' This distinguishes it from list/search/update/delete siblings by scope ('single') and depth ('full detail'). However, it doesn't explicitly name a sibling it is not, and the second sentence about v2 Markdown is irrelevant to the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this tool when you need one task's full details rather than a list of tasks. But there is no explicit 'when to use' or 'when not to use' guidance, and no mention of alternatives like list_tasks or search_tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assigneesC
List the users assigned to a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does not mention whether the operation is read-only, whether it requires authentication, how the assignees are ordered, or what an empty result looks like. For a simple list operation this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words, and the core operation is front-loaded. It is concise and easily parsed, though it sacrifices useful context for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema but no annotations and no parameter documentation, the description should clarify the shape of returned assignees and any required prerequisite state (e.g., task must exist). It covers only the basic action, leaving an agent without enough context to anticipate edge cases or correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, task_id, is an integer and schema coverage is 0%, so the description adds no meaning beyond stating that a task is involved. The schema provides no human-readable description either, but the single parameter and tool name make the semantics fairly inferable; still, the description should have added at least a hint of what task_id must reference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a resource ('users assigned to a task'), making the core purpose clear. It does not explicitly differentiate from sibling tools like list_comments or list_buckets, but the focus on assignees is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as search_users or add_assignee. It does not state exclusions or scenarios, leaving the agent to infer usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_boardA
The whole board: a kanban view's columns with the tasks sitting in each.
list_buckets answers the thinner question, the columns alone, and takes the same
arguments. Reach for that one when the tasks are of no interest, and for this one
when they are.
task_count is the column's true size, which can exceed the tasks returned:
Vikunja caps how many it sends per column. To reach the rest, narrow with
filter, the same server-side syntax list_tasks takes.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | ||
| view_id | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that 'task_count' may exceed the number of tasks returned due to caps, and suggests using a filter to obtain the remaining tasks. This is a useful behavioral detail about potential pagination or truncation. Since no annotations are provided, this carries the full burden and is reasonably transparent, though it doesn't explicitly state read-only behavior or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but uses ornate, indirect phrasing ('The whole board', 'thinner question') instead of straightforward language. While it packs useful information, the poetic style detracts from clarity and could be more concise and direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema reduces the need to describe return values. The description covers the tool's purpose, differentiation from a sibling, and a behavioral nuance (task caps), but it does not explain any parameters or provide broader context such as typical use cases or required permissions. Overall, it is adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameter descriptions, and the description does not explain what 'filter', 'view_id', or 'project_id' mean. It only mentions that 'filter' uses the same syntax as 'list_tasks', but does not elaborate on the others. With no compensation for the complete lack of parameter documentation, this dimension is poorly addressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clarifies that this tool lists both columns and tasks (unlike 'list_buckets' which only lists columns), and mentions it takes the same arguments as list_buckets. However, the wording is somewhat metaphorical ('The whole board') and could be more direct about the exact resource returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly distinguishes when to use this tool over 'list_buckets' ('Reach for that one when the tasks are of no interest, and for this one when they are') and advises narrowing results with a 'filter' if task_count exceeds returned tasks, referencing the filter syntax of 'list_tasks'. This provides clear usage guidance relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bucketsA
List the columns of a project's kanban view, in board order.
The columns alone, with no tasks in them. list_board takes the same arguments and
returns each column with its tasks.
limit is the most tasks the bucket accepts, where 0 means no limit; a move into
a full bucket is refused. Vikunja does not populate task counts on this endpoint,
and list_board reports them.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that only columns are returned (no tasks), board order is preserved, and explains the limit field semantics. With no annotations, this provides good transparency, though it does not address potential errors or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise paragraphs, one covering purpose and one covering limit semantics. No redundant content, though the repeated reference to 'list_board' could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides sufficient context to choose the tool and understand its output compared to list_board. The presence of an output schema mitigates the need to describe return values, but the parameter descriptions are thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%; the description only says 'takes the same arguments' as list_board without explaining project_id or view_id directly. The agent must infer their meaning from sibling context, which is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists the columns of a project's kanban view in board order, and distinguishes itself from list_board by noting it returns columns without tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with list_board, which returns each column with its tasks, and mentions both take the same arguments, giving the agent clear guidance on when to use each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsA
List comments on a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry behavioral disclosure. 'List' clearly conveys a non-mutating read operation, but the description does not mention ordering, pagination, comment scope, or whether deleted comments are included. It is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every word earns its place, and it is appropriately sized for a simple one-parameter listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter list tool, the description plus input/output schemas provide a workable baseline. However, it lacks explicit usage guidance and behavioral context such as ordering or pagination, and there are no annotations to compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required integer task_id with no property descriptions (0% coverage). The phrase 'on a task' clarifies that task_id identifies the task whose comments are listed, but the mapping is implicit and no additional formatting or usage detail is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and identifies the resource ('comments') and scope ('on a task'). It is clearly the read counterpart to add_comment, update_comment, and delete_comment, though it does not explicitly call out sibling distinctions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the name and description indicate this tool lists comments for a given task, while sibling comment tools cover creation, update, and deletion. However, the description gives no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_kanban_viewsA
List a project's kanban views, with the bucket ids that give them meaning.
Most projects have one. Pass an id from here as view_id to the bucket tools
to target a specific one.
bucket_configuration_mode is manual when you arrange tasks yourself, or
filter when Vikunja builds a bucket per filter. In filter mode, moving a
task between buckets is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains the meaning of `bucket_configuration_mode` and the important limitation that in `filter` mode, moving tasks between buckets is unavailable. It also implies read-only behavior through 'List,' though it doesn't explicitly confirm no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence earns its place: the first states the core action and result, the second explains how to chain the output into other tools, and the third clarifies a meaningful behavioral distinction. The structure is clean and front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity and the presence of an output schema, the description covers everything an agent needs to call the tool correctly: what it lists, what the ids are for, and the behavioral caveat about `filter` mode. There is no significant missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does connect the single parameter to the project context ('a project's kanban views'), but it does not explicitly document `project_id` beyond what the schema title already conveys. For a single obvious parameter this is acceptable but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'List a project's kanban views,' and explains that the result includes bucket ids, which is a distinctive return detail. It clearly identifies the tool's role relative to the bucket tools, so an agent can tell this from sibling list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on how to use the output: pass an `id` from this tool as `view_id` to the bucket tools. It explains the typical case ('Most projects have one') but does not explicitly state when not to use this tool or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_labelsA
List all labels.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It only states 'List all labels' and adds no information about ordering, pagination, scope (e.g., global vs project), or read-only status beyond the implied 'list.' This is minimal disclosure for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three words, perfectly efficient for a parameterless list operation. No redundant or extra sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple zero-parameter list operation with an output schema present. The description covers the core action, but omits potential nuances like whether this lists labels across all projects or in a specific context (though parameters could not disambiguate). Overall, it is nearly complete for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the input schema is fully covered by definition. The description need not add parameter context; the baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('labels'), and explicitly says 'all labels,' making the operation unambiguous. It distinguishes from sibling tools by naming the label resource, which no other sibling lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. While there is no other list-labels sibling, it doesn't mention related operations like create_label or add_label, nor any context such as retrieve labels to filter tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
List all projects (boards). parent_project_id shows sub-project nesting.
Vikunja leaves archived projects out of this endpoint. include_archived adds
them back alongside the active ones, and is_archived on each result says which
is which. An archived project is otherwise unreachable through this tool, and its
id is what update_project needs to bring it back.
| Name | Required | Description | Default |
|---|---|---|---|
| include_archived | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the behavior regarding archived projects, the is_archived output field, and the fact that the id is needed for updates. This is transparent about the side effects and data returned, despite lacking annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet comprehensive, fitting in two sentences without unnecessary fluff. It is well-structured and front-loads the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the necessary context: what it lists, how the parameter works, and what the output contains. It is complete enough for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The include_archived parameter is fully explained in the description, including its default and effect. The schema provides no additional description, but the tool description covers it entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool lists all projects, uses the verb 'List', and identifies the resource as projects (boards). It also distinguishes from sibling tools like create_project and update_project by focusing on listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear guidance on the include_archived parameter and explains the default behavior of excluding archived projects, and how to include them. It also notes that archived projects are otherwise unreachable, which informs when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_task_placementsC
Where one task sits: the column holding it, one entry per kanban view.
A task holds a position in every kanban view of its project. A project with two boards puts the task in two columns. Usually there is one.
The bucket_id on a task read any other way is 0. That field only means
something inside a view.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not state whether the operation is read-only or has side effects. The confusing note about bucket_id does not clarify the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but uses poetic and ambiguous language (e.g., 'sits,' 'read any other way is 0') that obscures the meaning. It is not efficiently structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description does not describe the output schema or response format beyond mentioning 'one entry per kanban view.' No error conditions or edge cases are covered, leaving the agent without essential context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter task_id is not described beyond the schema's title. The description does not explain its meaning, format, or how it is used, leaving the agent to infer from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description hints at listing the column (bucket) for a task in each kanban view, but uses vague phrasing like 'Where one task sits' and 'read any other way is 0.' It lacks a clear, direct statement of the operation's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like list_buckets, list_kanban_views, or move_task_to_bucket. The description does not mention any conditions or precedence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksA
List tasks in a project.
filter and sort_by are passed to Vikunja and applied server-side, e.g.
filter="done = false && priority >= 4", sort_by="priority". Vikunja filters
then paginates. Results are complete at any page size.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| filter | No | ||
| sort_by | No | ||
| per_page | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It adds valuable transparency by explaining that filter and sort_by are applied server-side, that filtering happens before pagination, and that results are complete at any page size. This goes beyond what the schema alone would convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the one-line purpose comes first, followed by the essential behavioral details and a concrete example. Every sentence earns its place, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key runtime semantics needed to use the tool correctly: server-side filtering, sorting, pagination ordering, and result completeness. An output schema exists, so return-value details are not required. The main gap is lack of explicit guidance on selecting this tool over sibling listing/search tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so for the two non-obvious parameters, filter and sort_by, with a concrete Vikunja filter/sort example. The remaining parameters (project_id, page, per_page) are self-explanatory from their names and schema defaults, so the coverage is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and resource: 'List tasks in a project.' It does not explicitly contrast with sibling tools like search_tasks or list_bucket_tasks, but the scope is specific enough that an agent can infer its core purpose without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by focusing on project-level task listing and gives concrete examples for filter and sort_by. However, it never explicitly says when to prefer this over search_tasks or list_bucket_tasks, and it does not provide when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_taskA
Move a task to another project. Needs write access to the target.
Vikunja has no endpoint for this. A task's project_id is writable and setting
it is the move. This costs what an update costs: two requests on v1, one on v2.
Labels, assignees, comments, relations, and dates all come along. The
project-local identifier derives from the project the task is in, and is
reassigned on arrival.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| project_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that there is no dedicated endpoint, that the operation costs two requests on v1 vs one on v2, and that labels, assignees, comments, relations, dates, and `identifier` are carried over or reassigned. It does not describe response or error behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs: purpose and permission, implementation and cost, side effects and identifier reassignment. It is dense, front-loaded, and every sentence adds operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The two simple parameters are operationally covered well, but with no output schema the description omits what the call returns. It also only mentions write access to the target, saying nothing about whether source-project or task write access is also required. Adequate but with clear gaps for a mutating operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates by explaining that `project_id` is the writable field whose value performs the move and that the target project needs write access. `task_id` is not elaborated, though its role as the task being moved is clear from context and naming.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: "Move a task to another project." The implementation note — setting the writable `project_id` is the move — clearly distinguishes it from siblings like `update_task` and `move_task_to_bucket`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The first sentence establishes the clear use case, and the write-access prerequisite tells the agent when it can run. It doesn't name alternatives or exclusions, such as using `move_task_to_bucket` for board-level moves, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_task_to_bucketA
Move a task into a kanban bucket. Re-sending the same bucket does nothing.
This changes more than the column, and list_kanban_views tells you which
bucket is which:
Moving into the done bucket marks the task done, and moving it out un-marks it.
A repeating task moved into the done bucket is reopened and sent to the default bucket.
A bucket at its task limit refuses the move.
Only meaningful when the view's bucket_configuration_mode is manual. In
filter mode the filters decide which bucket a task sits in.
The project is read from the task. That costs a request and removes an argument that could contradict the task it was given.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| view_id | No | ||
| bucket_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses idempotency ('re-sending the same bucket does nothing'), done-bucket toggling, repeating-task reopening, task-limit refusals, and the project-read-from-task request cost. This is unusually complete disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and idempotency note, uses bullet points for side effects, and every sentence adds relevant operational detail. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating kanban operation with no output schema or annotations, it covers action, side effects, mode restrictions, and request-cost behavior. The remaining gap is the role of the optional view_id and expected response/error shape, but the provided context is enough for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It gives useful context about task_id (project is read from the task) and view (manual/filter mode), but it never explains the optional view_id parameter or how it is used, and bucket_id is only implied. The semantics are partially covered, not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Move a task into a kanban bucket' names a specific action and object, and the rest clarifies it is a column move with side effects. It doesn't explicitly contrast with the sibling move_task tool, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: only meaningful when the view's bucket_configuration_mode is manual, and states filter mode is not appropriate. It references list_kanban_views for mapping buckets, but doesn't name alternatives like move_task for other kinds of moves, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_assigneeB
Unassign a user from a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| user_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the primary action but does not mention side effects, error behavior, permissions, reversibility, or whether the operation is idempotent. This is a mutation with no behavioral context beyond the action itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear, front-loaded sentence with no wasted words. It communicates the core operation effectively and is appropriately sized for a simple two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description leaves important context unaddressed: return behavior, error cases, prerequisites, and how this tool relates to add_assignee or list_assignees. For a mutation tool, this is incomplete guidance for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not add meaning to task_id or user_id beyond the obvious parameter names. The phrase 'a user from a task' loosely maps to the parameters, but it does not clarify constraints, relationships, or formats, so the description fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Unassign a user from a task.' This clearly identifies the tool's purpose and distinguishes it from related tools like add_assignee, though it does not explicitly name or differentiate siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied by the name and description: use this tool when a user should be removed from a task. However, there is no explicit guidance about when not to use it or which sibling tool (e.g., remove_relation, list_assignees) might be more appropriate in a given context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_labelB
Remove a label from a task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| label_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It indicates a mutating action, but does not state whether the operation is reversible, what happens if the task or label does not exist, or whether the label definition itself remains intact. The sentence 'Remove a label from a task' gives minimal behavioral detail beyond the operation itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that is appropriately sized for a simple two-parameter mutation. It is front-loaded with the action and object, containing no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two required integer parameters, the description plus parameter names may be sufficient to form a basic call. However, it lacks any guidance on behavior in edge cases, relationship to add_label, or expected result, so an agent has some gaps to reason through.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explicitly explain task_id or label_id. The parameter names are self-explanatory and the description provides some context, but it does not compensate for the missing schema descriptions or clarify IDs, required relationships, or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Remove a label from a task.' This clearly distinguishes it from sibling tools like delete_label (removing a label entity) and add_label, and the 'from a task' phrasing removes ambiguity about the operation's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to use this tool versus alternatives such as delete_label or remove_assignee. The intended use is only implied by the name and sibling context; there are no exclusions, prerequisites, or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_relationA
Remove a relation between two tasks.
The kind has to match the one the relation was created with; see
add_relation for the list. get_task reports what a task currently has.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| other_task_id | Yes | ||
| relation_kind | No | related |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by disclosing the non-obvious requirement that the kind must match the original relation. It also points to get_task for verifying current state. It does not mention error behavior or side effects, but for a simple relation removal this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no fluff. The main purpose is front-loaded, and each subsequent sentence adds necessary behavioral or reference information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple operation with three parameters and no output schema, the description covers the essential invocation requirements. It tells the agent what to do, what constraint applies, and where to find valid values and current state. Minor gaps like default behavior or error cases are not critical for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains the meaning and constraint of relation_kind ('kind has to match... see add_relation for the list') and clarifies the task parameters by describing the operation as between two tasks. The task_id and other_task_id are self-explanatory from names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Remove a relation between two tasks,' which is a specific verb-resource pairing. It is immediately distinguishable from the sibling add_relation, and the second sentence reinforces that distinction by pointing to add_relation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: the relation kind must match the one used at creation, and get_task can be used to inspect current relations. It names both add_relation and get_task as alternative/reference tools, though it does not explicitly state 'use this only when a relation exists.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tasksA
Search tasks across every project you can see.
list_tasks needs to be told a project. This is the tool for "find this task,
I do not remember where it lives", and every result reports its project_id.
query is a text search over titles and descriptions. filter and sort_by are
the same server-side syntax list_tasks takes. Vikunja documents the text search
as incompatible with a filter. Use one or the other.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| query | No | ||
| filter | No | ||
| sort_by | No | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It explains that the search spans all visible projects, that every result includes project_id, and that query searches titles and descriptions. It also reveals the important server-side behavior that query and filter cannot be combined. It does not explicitly state 'read-only', but the search semantics make this clear enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loads the core purpose, and uses a short paragraph to clarify when to use it. It then explains parameter semantics and the critical incompatibility without wasted words. Every sentence contributes to correct tool selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with an output schema, the description covers what the tool searches, its scope, the key result field, parameter semantics, and a critical usage constraint. It correctly delegates return-value documentation to the output schema. The reference to list_tasks for filter/sort_by syntax is sufficient given that sibling tool exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It meaningfully explains query as a text search over titles and descriptions, and clarifies that filter and sort_by reuse list_tasks' server-side syntax. It does not explicitly describe page or per_page, but those are conventional pagination parameters with defaults, and the description adds value on the non-obvious parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Search tasks across every project you can see.' It immediately differentiates this from list_tasks by noting list_tasks requires a project and search_tasks is for finding a task when you don't know where it lives. The result reporting project_id further reinforces its distinct purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool instead of list_tasks, including the exact use case: 'find this task, I do not remember where it lives.' It also provides a clear exclusion, warning that query text search is incompatible with filter and instructing to use one or the other. This gives the agent actionable selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_usersA
Search users by name or username. Use this to find a user_id for assignees.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states what is searched by, not how the search behaves: no mention of partial matching, case sensitivity, result limits, pagination, or multiple matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. It front-loads the action and resource, then adds the use case, making it instantly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter search tool with an output schema, the description covers the search semantics and the intended use case. It does not detail result limits or matching rules, but the presence of an output schema lowers the need to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does by clarifying that the single 'query' parameter is matched against 'name or username,' adding real meaning beyond the bare property title.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('users'), the action ('Search'), and the searchable fields ('name or username'). It also states the practical purpose, 'find a user_id for assignees,' which makes the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use this to find a user_id for assignees' gives an explicit usage context. No alternative user-search sibling exists, so exclusion guidance is less critical, though the description does not explicitly say when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_remindersA
Replace a task's reminders with the given ISO 8601 datetimes. Empty list clears them.
Nothing else about the task changes. On v1 that costs an extra request: its update endpoint is a replace, and the task has to be read and written back whole. On v2 it is a single partial update.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| reminders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It states that reminders are replaced, empty list clears them, and no other task fields are affected. It also usefully reveals the v1 vs v2 request-cost difference, which is beyond what the schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action, followed by the clear-list behavior and the version-specific request implications. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking annotations and an output schema, the description covers the main behavior, side effects, and version-specific costs. It does not mention return values, permissions, or error conditions, but the tool is simple enough that these omissions are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only gives names and types, so the description adds essential meaning: reminders must be ISO 8601 datetime strings, the list replaces existing reminders, and an empty array clears them. The task_id parameter is not elaborated, but its purpose is evident from the name and context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Replace') and resource ('a task's reminders'), and precisely defines behavior including that an empty list clears reminders. This clearly distinguishes it from generic update_task and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear: modify or clear a task's reminders without changing any other task fields. It does not explicitly name an alternative tool or state when not to use it, but the scope is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bucketA
Rename a column, or change how many tasks it accepts.
limit is the most tasks the column takes, and 0 means no limit. Lowering it
below the number already there is allowed: Vikunja keeps them and refuses the
next move in.
Neither API version has a partial update for a bucket. This reads the column and
writes it back whole, and a body with only a title resets limit to 0 on both
versions. There is also no endpoint for reading one bucket. The read comes from the
view's bucket list, and a bucket_id absent from that view is refused before
anything is written.
Position is preserved. To move a column, use the Vikunja web interface: this API exposes no ordering call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| title | No | ||
| view_id | No | ||
| bucket_id | Yes | ||
| project_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses full-replacement behavior, the limit reset risk, the refusal when bucket_id is absent from the view, and that position is preserved. This is strong behavioral disclosure, though it does not mention return values or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into paragraphs and includes useful details, but it is somewhat repetitive and awkwardly phrased, mixing 'column' and 'bucket' terminology. It could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key update semantics, limit behavior, read alternatives, and ordering limitations. However, it lacks explicit guidance on how project_id and view_id relate, and does not describe expected return values or error handling beyond one refusal case. Overall adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the parameters. It explicitly explains 'limit' and indirectly explains 'title' and 'bucket_id', but leaves 'project_id' and 'view_id' undefined. Given the low schema coverage, this is insufficient for full parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's core purpose: renaming a column (bucket) or changing its task limit. This is specific enough to distinguish it from related bucket operations like create, delete, or list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides important usage caveats: there is no partial update, a body with only a title resets limit to 0, reads must come from the view's bucket list, and moving a column must be done via the web interface. It does not explicitly name sibling tools, but the guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_commentA
Replace the text of an existing comment. Get comment_id from list_comments.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | Yes | ||
| task_id | Yes | ||
| comment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly indicates a mutating, replacing action and the need for an existing comment, but it does not disclose return behavior, permissions, or error scenarios.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences, no fluff, and the core operation is front-loaded. The follow-up instruction about comment_id adds practical value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter mutation with no output schema, the description covers the basic operation and ID sourcing but omits return value, auth requirements, and failure behavior. It is adequate for basic invocation but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It clarifies where comment_id comes from and implies the comment parameter is the replacement text, but it does not explain task_id's role or provide details on format or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action, 'Replace the text of an existing comment,' with a clear resource and scope. This clearly distinguishes it from sibling tools like add_comment and delete_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through 'existing comment' and gives the operational hint to obtain comment_id from list_comments. However, it does not explicitly state when to prefer this over related comment tools or mention any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_labelB
Update a label. Only the fields you pass change. Every task with the label sees the change.
hex_color is six hex digits with no leading #, and an empty string clears it.
description is Markdown.
v1 has no partial update, and neither does a description change on v2. Both read the label and write it back with your changes merged in, at the cost of one extra request. Everything else on v2 is a single PATCH.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| label_id | Yes | ||
| hex_color | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden. It discloses read-modify-write behavior for v1 and description changes on v2, and notes the extra request cost, but it does not mention idempotency, error handling, or permissions. This is partial but non-trivial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a bit wordy, especially the v1/v2 explanation, which is somewhat convoluted and could be clearer. It is structured in three short paragraphs, but the version behavior section reads awkwardly. Overall, it is acceptable but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple update operation with no output schema, the description covers the core action and some behavioral nuances. However, it omits key details like whether at least one field must be supplied, the meaning of null for title, and any error cases. These gaps make it only moderately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (coverage 0%). The description adds meaning for hex_color (format and clearing via empty string) and description (Markdown), but leaves title and label_id unexplained, and does not specify how null values behave for title or description. Coverage is about 50%, so it partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a label' and explicitly clarifies partial update semantics with 'Only the fields you pass change' and the effect on tasks. This distinguishes it from other label operations like create, list, or delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus sibling tools such as create_label, delete_label, or list_labels. It does not mention that it should be used for modifying existing labels and that other tools handle creation/removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectA
Update a project. Only the fields you pass change.
is_archived archives and unarchives, and Vikunja has no separate archive
endpoint. Archiving has two consequences worth knowing before using it. The
project drops out of list_projects unless that call is given
include_archived: true. And Vikunja then refuses every other edit to it, and to
the tasks in it, with a 412 naming the archive. Unarchive it before changing
anything else on it.
parent_project_id re-parents the project. Pass the id of the project it should
sit under. hex_color is six hex digits with no leading #, and an empty string
clears it. description is Markdown.
v1 has no partial update, and neither does a description change on v2. Both read the project and write it back with your changes merged in, at the cost of one extra request. Everything else on v2 is a single PATCH.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| hex_color | No | ||
| project_id | Yes | ||
| description | No | ||
| is_archived | No | ||
| parent_project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently discloses side effects and edge cases: archiving affects list_projects and editability, unarchiving is required before further edits, re-parenting changes the project hierarchy, and v1 does a full read-write instead of a partial update. Since no annotations are provided, the description fully carries the burden of behavioral disclosure and does so comprehensively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear paragraphs and concise sentences. Every sentence provides necessary information—no fluff or redundancy. The format is easy to parse, with key points (archiving, re-parenting, v1/v2 behavior) highlighted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (partial updates, archiving side effects, version differences), the description is complete. It covers all relevant operational aspects and edge cases. Although no output schema is provided, the description focuses on inputs and their consequences, which is sufficient for an update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Each parameter is semantically explained beyond the schema: 'Only the fields you pass change' clarifies partial update semantics; 'is_archived' archives and unarchives; 'parent_project_id' re-parents; 'hex_color' is six hex digits; 'description' is Markdown. The schema itself has no descriptions, so this added clarity is essential and fully compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Update a project. Only the fields you pass change.' The verb 'Update' combined with the resource 'project' is specific and unambiguous, distinguishing it from other update tools for tasks, buckets, comments, and labels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides thorough usage guidance, explaining partial updates, archiving/unarchiving behavior, re-parenting, and version-specific differences (v1 vs v2). It also mentions the consequence of archiving (projects drop out of list_projects unless include_archived is true) and the associated 412 error, which helps the agent use the tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskA
Update a task. Only the fields you pass change. Use done to open/close it.
v1 has no partial update. There, this reads the task and writes it back with your changes merged in, at the cost of one extra request. v2 is a single PATCH unless a description is involved.
due_date is the deadline. start_date and end_date are ISO 8601 datetimes
marking the window you plan to work on the task (start work / finish work).
Pass an empty string to any of the three to clear it.
percent_done is a fraction despite the name. A quarter done is 0.25. Vikunja
does not validate it, and 50 is stored as 50.
repeat_after is a number of seconds. Setting it changes what done means for
this task: it reopens itself with its dates moved forward. repeat_mode is 0 to
advance by repeat_after, 1 to repeat monthly and ignore repeat_after, or 2 to
count from the day it was completed. A repeating task with no dates can never be
closed: it reopens regardless.
Two wrinkles in what comes back. On v2 a partial update returns the description
as the stored HTML. v2 does not convert on a PATCH. Call get_task when you need
it as Markdown. And a write that changes nothing returns
{"ok": true, "unchanged": true} there, which is Vikunja answering 304.
| Name | Required | Description | Default |
|---|---|---|---|
| done | No | ||
| title | No | ||
| task_id | Yes | ||
| due_date | No | ||
| end_date | No | ||
| priority | No | ||
| start_date | No | ||
| description | No | ||
| is_favorite | No | ||
| repeat_mode | No | ||
| percent_done | No | ||
| repeat_after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It thoroughly discloses partial-update behavior, v1/v2 differences, field semantics (percent_done is a fraction, repeat modes), response quirks (HTML vs Markdown, 304 unchanged), and validation gaps (Vikunja doesn't validate percent_done). This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries substantive information. It is front-loaded with the core action and then systematically covers field semantics and edge cases. The structure is logical (partial update, dates, percentages, repeats, response quirks) without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 params, 0% schema coverage, no output schema), the description is quite complete. It covers the tricky fields and response nuances but omits some self-explanatory params (title, priority, is_favorite) and does not mention error cases. However, the main risks are well addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains due_date, start_date/end_date (ISO 8601, clear via empty string), percent_done (fraction, not percent), repeat_after (seconds) and repeat_mode (0/1/2 meanings). Also covers the done parameter's interaction with repeat. This adds critical meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a task') and immediately clarifies the partial-update semantics. It differentiates behavior across v1/v2 and explains field-specific effects, making the tool's scope unambiguous even without naming sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to call get_task ('when you need it as Markdown') and explains v1 vs v2 behavior that affects usage (extra request vs PATCH). Does not explicitly mention alternatives like bulk_update_tasks, but the guidance is sufficient for common usage decisions.
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. Dates show when Glama detected each change.
9 tool updates
v2.0.0- Added
delete_project - Added
list_board - Removed
list_bucket_tasks - Changed
list_projects1 field changed- added
Input schema / properties / include_archivedAdded value: +{ + "default": false, + "title": "Include Archived", + "type": "boolean" +}
- Removed
list_task_buckets - Added
list_task_placements - Added
update_bucket - Added
update_label - Added
update_project
35 tool updates
v1.2.0- First observed
add_assignee - First observed
add_comment - First observed
add_label - First observed
add_relation - First observed
bulk_create_tasks - First observed
bulk_update_tasks - First observed
create_bucket - First observed
create_label - First observed
create_project - First observed
create_task - First observed
delete_bucket - First observed
delete_comment - First observed
delete_label - First observed
delete_task - First observed
duplicate_task - First observed
get_task - First observed
list_assignees - First observed
list_bucket_tasks - First observed
list_buckets - First observed
list_comments - First observed
list_kanban_views - First observed
list_labels - First observed
list_projects - First observed
list_task_buckets - First observed
list_tasks - First observed
move_task - First observed
move_task_to_bucket - First observed
remove_assignee - First observed
remove_label - First observed
remove_relation - First observed
search_tasks - First observed
search_users - First observed
set_reminders - First observed
update_comment - First observed
update_task
TDQS
Most tools are cleanly separated by resource and action, and the create/delete versus add/remove distinctions are well explained. The main confusion risk is the mirror-named list_bucket_tasks and list_task_buckets pair, plus some overlap between list_buckets and list_kanban_views, though the descriptions resolve them.
All tool names follow a consistent lowercase snake_case verb_noun pattern. create/delete is reserved for entities while add/remove is used for associations, and bulk_ and set_ prefixes are applied consistently.
35 tools is above the 25+ threshold and gives an agent a large surface to weigh on every call. The domain is broad and most tools are individually justified, but the set would benefit from being split into smaller focused servers or having some list/search/bulk variants consolidated.
Task, comment, assignee, relation, and label attachment coverage is strong, including bulk and search variants. However, projects only have list/create with no update/delete/archive, and labels and buckets lack update operations, leaving notable lifecycle gaps that agents cannot work around.
Maintenance
Related MCP Connectors
An MCP server that provides access to Testiny projects, test cases and test runs
MCP server wrapping the Tesla Fleet API and TeslaMate API
MCP server for Linear project management and issue tracking
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server for managing your repositories on Forgejo/Gitea server.66Mozilla Public 2.0
- AlicenseAqualityAmaintenanceMCP server for TickTick — create, update, complete, move, and filter tasks (plus subtasks, completed-task retrieval, and recurring reminders) via the TickTick v2 API. Maintained fork of jen6/ticktick-mcp adding field-preserving updates, day-of-week date validation, completion tracking and more.141GPL 3.0
- AlicenseNot gradedqualityDmaintenanceLightweight MCP server for Vikunja task management, providing tools to manage projects, tasks, labels, and comments via API.31MIT
- AlicenseNot gradedqualityCmaintenanceA security-hardened MCP server for TickTick that enables managing your tasks directly through any MCP-compatible client.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/aichholzer/altiplano'
If you have feedback or need assistance with the MCP directory API, please join our Discord server