
# MCP tools

Each instance serves Streamable HTTP MCP at `<instance>/mcp`, authorized by an OAuth access token or a personal Access Token. Codex/ChatGPT plugins use OAuth discovery and PKCE; Benchyard shell agents use a personal token directly. Both resolve to the same account permissions. On connect, the server's instructions point the agent at the [product skill](/skill.md). Clients should discover tools each session rather than trusting a cached list.

Every tool is also a REST endpoint under `<instance>/acahti/v1`. Path segments fill the matching arguments; the rest go in the query string or a JSON body. Required arguments are in bold. The [CLI](cli.md) exposes named commands for the shell delivery loop; agents use MCP for the full catalog.

## Work permissions and files

Work operations need an authenticated instance account. Web sessions, personal Tokens and OAuth call the same service. Work is instance-wide shared collaboration, independent of the selected Git organization and repository ACLs. Personal list views are filters. Actor fields come from authentication and cannot be supplied in request bodies.

Work schemas reject unknown fields and invalid IDs. PATCH preserves omitted fields; explicit empty text clears it. Lists use stable ordering and database pagination. Archived tickets reject comments and updates. Failed reads of comments or attachment metadata fail the whole detail request.

In addition to the tool routes below, binary transport uses `POST /work/attachments/{type}/{id}` (multipart `file`, owner type `todo` or `document`), `GET /work/attachments/{id}/content`, and `GET /work/attachments/{id}/preview` (PDF preview: native PDF or Office converted through Gotenberg). Ticket comments accept JSON `body` or multipart `body` and repeated `file` fields (up to nine, 200 MiB each). Content and preview URLs require authentication and never include credentials; the only unauthenticated reads are external share links under `/ui/share/{token}`. Missing records return 404, bad inputs 400, archived mutations 409, and an unavailable Work database, storage, conversion or Aidy model 503.

## Argos runs and files

Every signed-in member reads Argos. After creation a registered case source or plan changes only by its owner, creator or an org admin: `argos_test_save` needs `expected_sha256` from a fresh read, `argos_plan_save` the current `revision`. The Argos CLI streams runs over REST only, as the runner's own identity: `POST /argos/runs` (returns `sid` and `url`), `POST /argos/runs/{sid}/events`, `POST /argos/runs/{sid}/finish` and `PUT /argos/runs/{sid}/files/{path}` (up to 1 MiB). Only the run's runner or an org admin writes a run. `GET /argos/runs/{sid}/files` lists its files and `GET /argos/runs/{sid}/files/{path}` returns one as inert text. See [Argos](testing.md).

## Tools

<!-- tools:start -->
### plugin_document

Read verified documentation for an accessible active plugin.

- Arguments: **`id`** **`section`**
- REST: `GET /plugins/{id}/docs/{section}`

### plugin_list

List verified plugin releases and actual installation states. Org admin only.

- REST: `GET /plugins`

### plugin_get

Read a plugin installation state. Org admin only.

- Arguments: **`id`**
- REST: `GET /plugins/{id}`

### plugin_operate

Install, upgrade, enable, disable or uninstall a verified plugin with revision concurrency control. Org admin only.

- Arguments: **`action`** **`id`** **`revision`** `version`
- REST: `POST /plugins/{id}/operations`

### plugin_retry

Retry an interrupted plugin operation using its current revision. Org admin only.

- Arguments: **`id`** **`operation`** **`revision`**
- REST: `POST /plugins/{id}/retry`

### repo_list

List repositories the token can see.

- Arguments: `page` `page_size`
- REST: `GET /repos`

### repo_get

Get one repository.

- Arguments: **`name`** **`owner`**
- REST: `GET /repos/{owner}/{name}`

### repo_create

Create a private org repo. Optional team attaches access. Does not set branch protection.

- Arguments: **`name`** `team`
- REST: `POST /repos`

### repo_rename

Rename a repo. Repo admin. Moves team access, collaborators, pipeline history, and CI. Clones must git remote set-url.

- Arguments: **`name`** **`new_name`** **`owner`**
- REST: `PATCH /repos/{owner}/{name}`

### repo_team_set

Move a repo to another team. Org admin. The new team's members get access if the old team's grant was on.

- Arguments: **`name`** **`owner`** **`team`**
- REST: `PUT /repos/{owner}/{name}/team/{team}`

### repo_archive

Archive a repo (read-only, hidden from members, skipped by CI) or unarchive it with archived false. Org admin.

- Arguments: **`archived`** **`name`** **`owner`**
- REST: `PUT /repos/{owner}/{name}/archived`

### repo_delete

Delete a repo: its git repository, index, team grants, collaborators, and pipeline history. Org admin. Irreversible.

- Arguments: **`name`** **`owner`**
- REST: `DELETE /repos/{owner}/{name}`

### branch_list

List branches with default and protected flags from repo settings.

- Arguments: **`name`** **`owner`** `page` `page_size`
- REST: `GET /repos/{owner}/{name}/branches`

### ref_delete

Delete a git ref. ref is dev, heads/dev, or refs/heads/dev.

- Arguments: **`name`** **`owner`** **`ref`**
- REST: `DELETE /repos/{owner}/{name}/refs/{ref...}`

### pr_create

Open a pull request. base defaults to the repo default_branch.

- Arguments: **`head`** **`name`** **`owner`** **`title`** `base` `body`
- REST: `POST /repos/{owner}/{name}/pulls`

### pr_list

List pull requests.

- Arguments: **`name`** **`owner`** `page` `page_size` `state`
- REST: `GET /repos/{owner}/{name}/pulls`

### pr_get

Get a pull request with latest commit checks per context.

- Arguments: **`name`** **`number`** **`owner`**
- REST: `GET /repos/{owner}/{name}/pulls/{pr}`

### pr_comment

Comment on a pull request.

- Arguments: **`body`** **`name`** **`number`** **`owner`**
- REST: `POST /repos/{owner}/{name}/pulls/{pr}/comments`

### pr_comments

List pull request comments.

- Arguments: **`name`** **`number`** **`owner`** `page` `page_size`
- REST: `GET /repos/{owner}/{name}/pulls/{pr}/comments`

### pr_merge

Merge a PR when the latest pipeline round on the head SHA is green.

- Arguments: **`name`** **`number`** **`owner`**
- REST: `POST /repos/{owner}/{name}/pulls/{pr}/merge`

### pr_close

Close a pull request.

- Arguments: **`name`** **`number`** **`owner`**
- REST: `DELETE /repos/{owner}/{name}/pulls/{pr}`

### checks_wait

Snapshot of indexed pipelines for a commit. Poll this tool; it does not block.

- Arguments: **`name`** **`owner`** **`sha`**
- REST: `GET /repos/{owner}/{name}/checks/{sha}`

### pipeline_list

List pipelines for a repo with wait (queue, deps, concurrency) on in-flight runs. sha is a commit prefix.

- Arguments: **`repo`** `branch` `page` `page_size` `sha` `status`
- REST: `GET /repos/{owner}/{name}/pipelines`

### pipeline_get

Get one pipeline with jobs, steps, and wait (queue, deps, concurrency).

- Arguments: **`number`** **`repo`**
- REST: `GET /repos/{owner}/{name}/pipelines/{run}`

### pipeline_log

Fetch pipeline logs. Omit step for failed steps only.

- Arguments: **`number`** **`repo`** `step` `tail_lines`
- REST: `GET /repos/{owner}/{name}/pipelines/{run}/log`

### pipeline_rerun

Rerun a pipeline. Needs push access.

- Arguments: **`number`** **`repo`**
- REST: `POST /repos/{owner}/{name}/pipelines/{run}/rerun`

### pipeline_trigger

Manual run on a ref, the default branch when ref is empty. Needs push access. Official release is still git push.

- Arguments: **`repo`** `ref`
- REST: `POST /repos/{owner}/{name}/pipelines`

### pipeline_cancel

Cancel a running or queued pipeline. Needs push access.

- Arguments: **`number`** **`repo`**
- REST: `POST /repos/{owner}/{name}/pipelines/{run}/cancel`

### pipeline_delete

Delete a finished pipeline run. Needs push access.

- Arguments: **`number`** **`repo`**
- REST: `DELETE /repos/{owner}/{name}/pipelines/{run}`

### inbox

Inbox across repositories. pipes: latest failed or blocked run per repo. prs: open PRs whose head SHA latest pipeline is success (ready to merge).

- Arguments: `page` `page_size` `section`
- REST: `GET /inbox`

### pkg_publish

Publish a language package (pypi wheel URL or npm tarball URL).

- Arguments: **`kind`** **`url`** `filename`
- REST: `POST /packages`

### pkg_list

List language packages.

- Arguments: `kind` `owner` `page` `page_size`
- REST: `GET /packages`

### pkg_delete

Delete a language package version. Org admin. Omit version to delete every version of that name.

- Arguments: **`kind`** **`name`** `owner` `version`
- REST: `DELETE /packages`

### whoami

Acahti git identity: git_name, git_email, clone_url_template, skill_url, apply_when_remote_host, setup_local, org_admin and installed plugins.

- REST: `GET /me`

### agent_status

Host runners plus queue stats counted per pipeline (running / queued).

- Arguments: `page` `page_size`
- REST: `GET /agents`

### deploy_approve

Approve a gated deploy pipeline. Needs push access.

- Arguments: **`number`** **`repo`**
- REST: `POST /repos/{owner}/{name}/pipelines/{run}/approve`

### secret_list

List pipeline secret names (never values). scope org is org admins. scope repo is the effective set (org inherited plus repo) for repo admins. repo or owner+name for repo scope.

- Arguments: `name` `owner` `page` `page_size` `repo` `scope`
- REST: `GET /repos/{owner}/{name}/secrets`, `GET /secrets`

### secret_put

Create or replace a pipeline secret. Does not echo value. org scope needs org admin. repo scope needs repo admin. name is the secret.

- Arguments: **`value`** `name` `owner` `repo` `scope` `secret`
- REST: `PUT /repos/{owner}/{name}/secrets/{secret}`, `PUT /secrets/{secret}`

### secret_delete

Delete a pipeline secret. org scope needs org admin. repo scope needs repo admin and only deletes the repo override.

- Arguments: `name` `owner` `repo` `scope` `secret`
- REST: `DELETE /repos/{owner}/{name}/secrets/{secret}`, `DELETE /secrets/{secret}`

### user_list

List people by login and display name. q matches either. Does not return email.

- Arguments: `page` `page_size` `q`
- REST: `GET /users`

### user_create

Create an org member. Org admin. author is the git display name. Returns a one-time password; do not put it in skill.md or chat logs.

- Arguments: **`login`** `admin` `author` `email`
- REST: `POST /users`

### user_update

Update git author (full_name), email and/or org admin. Org admin for author and admin; self or admin for email. admin cannot change your own account or the gateway service account.

- Arguments: **`login`** `admin` `author` `email`
- REST: `PATCH /users/{login}`

### user_permissions

Get creation permissions. Self or org admin.

- Arguments: **`login`**
- REST: `GET /users/{login}/permissions`

### user_permissions_set

Set team and repository creation permissions. Org admin only.

- Arguments: **`can_create_repo`** **`can_create_team`** **`login`**
- REST: `PUT /users/{login}/permissions`

### team_create

Create a team and become its admin. Requires can_create_team.

- Arguments: **`team`**
- REST: `POST /teams`

### team_list

List teams the caller can see, with repo counts.

- Arguments: `page` `page_size`
- REST: `GET /teams`

### team_get

Team members and repositories. A member's permission applies to every repo in the team.

- Arguments: **`team`**
- REST: `GET /teams/{team}`

### team_delete

Delete a team. Team admin or org admin. Removes membership and team repo grants.

- Arguments: **`team`**
- REST: `DELETE /teams/{team}`

### team_member_set

Add or update a team member. Team admin or org admin. permission is read, write, or admin; omit for write. The grant covers every repository in the team.

- Arguments: **`login`** **`team`** `permission`
- REST: `PUT /teams/{team}/members/{login}`

### team_member_remove

Remove a person from a team. Team admin or org admin.

- Arguments: **`login`** **`team`**
- REST: `DELETE /teams/{team}/members/{login}`

### repo_access

List one repository's inherited team members and direct collaborators.

- Arguments: **`name`** **`owner`**
- REST: `GET /repos/{owner}/{name}/access`

### collaborator_set

Grant one person access to one repository. Repo admin. permission is read, write, or admin; omit for write. Does not add them to the team.

- Arguments: **`login`** **`name`** **`owner`** `permission`
- REST: `PUT /repos/{owner}/{name}/collaborators/{login}`

### collaborator_remove

Remove a direct collaborator from one repository. Repo admin. Does not change team membership.

- Arguments: **`login`** **`name`** **`owner`**
- REST: `DELETE /repos/{owner}/{name}/collaborators/{login}`

### project_list

List Work projects in display order with member logins, repository count, open todos and the current iteration (active, else blocked, else planned) with its done/total todos.

- REST: `GET /work/projects`

### project_reorder

Set the display order of projects; work managers only. Listed ids come first in order, others keep their relative order after them.

- Arguments: **`ids`**
- REST: `POST /work/projects/order`

### project_get

Read a project with members, repositories and whether the caller can edit it.

- Arguments: **`id`**
- REST: `GET /work/projects/{id}`

### project_create

Create a project container for people, agents and repositories.

- Arguments: **`en`** **`id`** `description` `kind` `members` `owner_login` `repos` `status` `zh`
- REST: `POST /work/projects`

### project_update

Update a project using its current revision; stale edits conflict.

- Arguments: **`id`** **`revision`** `description` `en` `kind` `members` `owner_login` `repos` `status` `zh`
- REST: `PATCH /work/projects/{id}`

### project_members_set

Replace project members (humans and agents).

- Arguments: **`id`** **`members`**
- REST: `PUT /work/projects/{id}/members`

### project_repos_set

Replace repositories bound to a project.

- Arguments: **`id`** **`repos`**
- REST: `PUT /work/projects/{id}/repos`

### project_context

Agent briefing: project, open tasks, decisions and related open iterations.

- Arguments: **`id`**
- REST: `GET /work/projects/{id}/context`

### agent_run_list

List agent runs for a project.

- Arguments: `page_size` `project_id`
- REST: `GET /work/agent-runs`

### agent_run_get

Read an agent run and its activity events.

- Arguments: **`id`**
- REST: `GET /work/agent-runs/{id}`

### agent_run_create

Start an agent run for a project task or ticket.

- Arguments: **`agent_login`** **`project_id`** `evidence` `status` `summary` `ticket_id` `todo_id` `trigger`
- REST: `POST /work/agent-runs`

### agent_run_update

Update agent run status, summary or evidence.

- Arguments: **`id`** `evidence` `status` `summary`
- REST: `PATCH /work/agent-runs/{id}`

### agent_run_event

Append a thought, progress or comment to an agent run.

- Arguments: **`body`** **`id`** `kind`
- REST: `POST /work/agent-runs/{id}/events`

### decision_list

List non-superseded decisions for a project.

- Arguments: **`project_id`** `page_size`
- REST: `GET /work/decisions`

### decision_create

Record a project decision; optional supersedes_id marks the prior decision superseded.

- Arguments: **`project_id`** **`title`** `body` `status` `supersedes_id`
- REST: `POST /work/decisions`

### decision_update

Update a decision title, body or status.

- Arguments: **`id`** `body` `status` `title`
- REST: `PATCH /work/decisions/{id}`

### planning_move_todos

Atomically move same-project todos to one open iteration; revisions and idempotency required. Todos joining an iteration that has started are out of plan; reason says why.

- Arguments: **`items`** **`iteration_id`** **`request_key`** `reason`
- REST: `POST /work/planning/move-todos`

### planning_todo_links

Add and remove todo relationships without replacing others: ticket or document by to_id; pull or pipeline by to_key owner/repo#n; argos by run sid. The caller must be able to read a linked repository or run.

- Arguments: **`id`** **`revision`** `add` `remove`
- REST: `POST /work/planning/todos/{id}/links`

### planning_todo_time

Read all authors and dates of a todo's time entries, with full totals and pagination.

- Arguments: **`id`** `page` `page_size`
- REST: `GET /work/planning/todos/{id}/time`

### planning_progress

Read exact full-dataset status distribution and overdue count for a project or iteration.

- Arguments: **`project`** `iteration_id`
- REST: `GET /work/planning/progress`

### planning_brief

Measured state of a project, or of one of its iterations (default: the current one), for status updates and planning: status counts; the project's latest deliveries and history (such as deleted iterations); risks (overdue, blocked, due day pushed later twice or more); this week's completions and logged time; each assignee's open todos, estimated minutes and capacity left before the iteration's due day; unestimated todos and done todos with no time; and for an iteration its scope against the baseline it started with, every change since, and a daily burndown. Use it to write a project or iteration update.

- Arguments: **`project`** `iteration_id`
- REST: `GET /work/planning/brief`

### delivery_submit

Allocate a project-wide X.Y.Z with immutable changelog, the iteration's todos it delivers (at least one) and repository coordinates, then publish tags through repository pipelines. Draft todo_ids and changelog with delivery_draft.

- Arguments: **`changelog`** **`iteration_id`** **`repositories`** **`request_key`** **`summary`** **`todo_ids`**
- REST: `POST /work/deliveries`

### delivery_draft

Draft a delivery for an iteration: its todos (done first, marking those an earlier delivery carried) and a changelog listing the chosen todo_ids, by default the done todos not yet delivered.

- Arguments: **`iteration_id`** `todo_ids`
- REST: `GET /work/deliveries/draft`

### delivery_list

List an iteration's delivery versions, changelogs and delivered todos.

- Arguments: **`iteration_id`** `page` `page_size`
- REST: `GET /work/deliveries`

### delivery_get

Read immutable release coordinates, dispatch history and observed pipeline results.

- Arguments: **`id`**
- REST: `GET /work/deliveries/{id}`

### delivery_retry

Resume tag dispatch for the same immutable delivery; never allocate another version.

- Arguments: **`id`**
- REST: `POST /work/deliveries/{id}/retry`

### planning_run_step

Create or update a structured execution step with optimistic concurrency.

- Arguments: **`id`** **`step`**
- REST: `PUT /work/planning/runs/{id}/step`

### planning_run_steps

Read structured execution steps and dependencies.

- Arguments: **`id`**
- REST: `GET /work/planning/runs/{id}/steps`

### iteration_list

List release history and roadmap for product or ops projects; state is one status or current (planned, active or blocked).

- Arguments: `page` `page_size` `project_id` `state`
- REST: `GET /work/iterations`

### iteration_get

Read a project iteration and its audit history.

- Arguments: **`id`**
- REST: `GET /work/iterations/{id}`

### iteration_create

Plan a release on a product or ops project with repository versions and linked work.

- Arguments: **`owner`** **`project_id`** **`title`** **`version`** `description` `due_at` `kind` `links` `participants` `start_at` `status`
- REST: `POST /work/iterations`

### iteration_update

Update a project iteration using its current revision; stale edits conflict. The first change to active records its todos as the scope baseline. Release or cancel with iteration_close.

- Arguments: **`id`** **`revision`** `description` `due_at` `kind` `links` `owner` `participants` `project_id` `start_at` `status` `title` `version`
- REST: `PATCH /work/iterations/{id}`

### iteration_close

Release or cancel an iteration at its current revision. Every unfinished todo in it (requirement, todo, in_progress, blocked) needs one carry: move to another open iteration of the project, unplan, or keep in this iteration with a reason; list them with todo_list iteration_id and state. The carries and the status change commit together.

- Arguments: **`id`** **`request_key`** **`revision`** **`status`** `carry`
- REST: `POST /work/iterations/{id}/close`

### iteration_delete

Delete a cancelled iteration without deliveries using its current revision; its todos stay in the project, unplanned, and the project's history records the deletion. Project owners, members and Work managers may delete.

- Arguments: **`id`** **`revision`**
- REST: `DELETE /work/iterations/{id}`

### search

Search shared knowledge, tickets, todos and product iterations with source links; optional assignee, state and scope filters refine ticket and todo hits.

- Arguments: `assignee` `page` `page_size` `q` `scope` `state` `type`
- REST: `GET /work/search`

### knowledge_backlinks

Find knowledge articles linking to this document.

- Arguments: **`id`**
- REST: `GET /work/knowledge/{id}/backlinks`

### knowledge_history

Read immutable document revisions, newest first.

- Arguments: **`id`** `page` `page_size`
- REST: `GET /work/knowledge/{id}/history`

### knowledge_restore

Restore a document revision as a new revision.

- Arguments: **`id`** **`revision`**
- REST: `POST /work/knowledge/{id}/restore`

### knowledge_save_chat_file

Save a file from a conversation the caller belongs to into the knowledge base without copying it; returns the existing document when the same file is already there.

- Arguments: **`id`** `folder_id` `title`
- REST: `POST /work/chat-files/{id}/knowledge`

### knowledge_share_links

List external links to a document, or every link for Work managers when document_id is omitted.

- Arguments: `document_id`
- REST: `GET /work/share-links`

### knowledge_share_link_create

Create an external read-only link to a document. Expires after expires_in_days (default 7, 0 never); an optional password and allow_download control access. The URL is returned only once.

- Arguments: **`document_id`** `allow_download` `expires_in_days` `password`
- REST: `POST /work/share-links`

### knowledge_share_link_revoke

Revoke an external link; its creator, people who manage the document's access and Work managers may revoke.

- Arguments: **`id`**
- REST: `DELETE /work/share-links/{id}`

### knowledge_sharing

Read whether external links are enabled on this instance.

- REST: `GET /work/sharing`

### knowledge_sharing_configure

Turn external links on or off for the instance; off makes every existing link unavailable. Administrators only.

- Arguments: **`enabled`**
- REST: `PUT /work/sharing`

### aidy_settings

Read Aidy model configuration, with secrets redacted.

- REST: `GET /work/aidy/settings`

### aidy_configure

Configure Aidy backbone model and optional API key; org admin only.

- Arguments: **`base_url`** **`enabled`** **`model`** `api_key`
- REST: `PUT /work/aidy/settings`

### aidy_ask

Ask Aidy in one of your conversations (omit conversation_id to start one). Aidy calls the operations you may call: reads run at once; a write stops the reply as pending until aidy_confirm approves or cancels it.

- Arguments: **`question`** `conversation_id`
- REST: `POST /work/aidy/ask`

### aidy_confirm

Approve or cancel the write a conversation waits on (call_id from aidy_ask pending); Aidy then runs or drops it and continues the reply.

- Arguments: **`approve`** **`call_id`** **`id`**
- REST: `POST /work/aidy/conversations/{id}/confirm`

### aidy_conversation_list

List your Aidy conversations, the last active first.

- Arguments: `page` `page_size`
- REST: `GET /work/aidy/conversations`

### aidy_conversation_get

Read one of your Aidy conversations: questions, answers and the operations Aidy ran or proposed.

- Arguments: **`id`**
- REST: `GET /work/aidy/conversations/{id}`

### aidy_conversation_update

Rename one of your Aidy conversations.

- Arguments: **`id`** **`title`**
- REST: `PATCH /work/aidy/conversations/{id}`

### aidy_conversation_delete

Delete one of your Aidy conversations.

- Arguments: **`id`**
- REST: `DELETE /work/aidy/conversations/{id}`

### track_get

Trace the delivery flow around a ticket, todo, iteration, delivery or Argos case: its flow type, the stages of that type's template (adjusted by the flow's override, plus any stage with evidence) with state, time and actor, and the linked tickets, todos, pull requests, pipelines, Argos runs and deliveries; id is the record number, or the Argos case id.

- Arguments: **`id`** **`type`**
- REST: `GET /work/track/{type}/{id}`

### track_list

List open flows with their stage states. view work (default) lists open todos and open tickets no todo carries, tickets lists every open ticket, argos lists Argos cases failing now or fixed in the last 14 days and reports unavailable ["argos"] when Argos cannot be read. project and owner filter work and tickets; pack, group and env filter argos; stuck_days keeps flows without activity for that many days.

- Arguments: `env` `group` `owner` `pack` `page` `page_size` `project` `stuck_days` `view`
- REST: `GET /work/track`

### track_template_list

List the Track flow templates: for each flow type (bug, feature, todo, ops, argos_case, iteration) its stages in order, the built-in stages and whether it was customized, and stage_keys with the evidence each stage reads. A flow shows its template's stages plus any other stage it has evidence for.

- REST: `GET /work/track-templates`

### track_template_update

Replace one flow type's template stages; Work managers only. stages are stage keys with an optional label replacing the stage's name (e.g. planned labelled Triaged); they run in the natural stage order whatever order is given.

- Arguments: **`stages`** **`type`**
- REST: `PUT /work/track-templates/{type}`

### track_template_reset

Restore one flow type's built-in template; Work managers only.

- Arguments: **`type`**
- REST: `DELETE /work/track-templates/{type}`

### track_flow_update

Adjust one flow where reality differs from its template: template switches it to another flow type's template, add shows stages the template lacks, skip hides stages even when they have evidence. The call replaces the flow's previous adjustment; send none of template, add and skip to return it to its template. Work managers, and the assignee, delegate or creator of a todo or ticket (owner of an iteration). Returns the flow as track_get does.

- Arguments: **`id`** **`type`** `add` `skip` `template`
- REST: `PUT /work/track/{type}/{id}/flow`

### track_activity

What one person did over a range of days, for workload questions such as what X did this week: counts (todos and tickets touched, commits pushed, pull requests opened and merged, reviews, pipelines run, failed and fixed, tags, deliveries, minutes logged), the same counts per project and per repository, and a newest-first timeline. login defaults to the caller; reading someone else needs a Work manager. days (1-31, default 7) ends at until (YYYY-MM-DD, default today, Asia/Shanghai). Repository events follow the caller's repository visibility; unavailable names repos when they cannot be read.

- Arguments: `days` `login` `page` `page_size` `until`
- REST: `GET /work/track/activity`

### work_overview

Work manager overview of all Work: exact risk counts, status/project/assignee breakdowns and 7/30-day intake and completion trends.

- Arguments: `days`
- REST: `GET /work/overview`

### work_manager_list

List Work managers who can use global views.

- REST: `GET /work/managers`

### work_manager_set

Grant Work manager access; org admin only.

- Arguments: **`login`**
- REST: `PUT /work/managers/{login}`

### work_manager_remove

Revoke Work manager access; org admin only.

- Arguments: **`login`**
- REST: `DELETE /work/managers/{login}`

### time_entry_list

Read your task entries and standard eight-hour daily reference total.

- Arguments: **`work_date`**
- REST: `GET /work/time-entries`

### time_entry_save

Insert a task completion entry for a date; each entry maximum 960 minutes.

- Arguments: **`minutes`** **`summary`** **`todo_id`** **`work_date`**
- REST: `POST /work/time-entries`

### time_entry_delete

Delete your own time entry.

- Arguments: **`id`**
- REST: `DELETE /work/time-entries/{id}`

### time_entry_suggest

Suggest time entries for a day from what you did: todos in progress or touched that day and commits, pull requests and reviews naming todo#N, with the evidence and the minutes still unlogged against an eight-hour day. Nothing is saved; confirm each with time_entry_save.

- Arguments: **`work_date`**
- REST: `GET /work/time-entries/suggest`

### notification_nav

Unread and total Work notification counts for the current account.

- REST: `GET /work/notification-nav`

### notification_list

List Work notifications for the current account.

- Arguments: `page` `page_size`
- REST: `GET /work/notifications`

### notification_mark_read

Mark one Work notification as read.

- Arguments: **`id`**
- REST: `POST /work/notifications/{id}/read`

### notification_mark_all_read

Mark every unread Work notification as read.

- REST: `POST /work/notifications/read-all`

### ticket_nav

Ticket counts for the current account.

- REST: `GET /work/ticket-nav`

### ticket_list

List tickets in a personal view (mine, created, assigned, open, verifying, rejected, closed, completed_week, archived); work managers may use global_all for all unarchived tickets or global_open for unfinished tickets. project takes one id or a comma-separated set; unassigned_project also keeps tickets without a project.

- Arguments: `assignee` `order` `page` `page_size` `project` `sort` `state` `unassigned_project` `view`
- REST: `GET /work/tickets`

### ticket_get

Read a ticket with its complete comments and attachment metadata.

- Arguments: **`id`**
- REST: `GET /work/tickets/{id}`

### ticket_create

Create a ticket as the authenticated account.

- Arguments: **`title`** `actual` `assignee_login` `description` `expected` `kind` `participants` `project` `repos` `reproduce` `service` `source_argos_case` `source_argos_run_id` `source_todo_id` `status` `status_reason`
- REST: `POST /work/tickets`

### ticket_update

Update a non-archived ticket. Statuses run todo, in_progress, verifying (fixed, waiting for its reporter), then closed when verification passes or rejected when it fails; rejected goes back to in_progress. Only the ticket's creator or a Work manager closes or rejects, and rejecting needs status_reason.

- Arguments: **`id`** `actual` `assignee_login` `description` `expected` `kind` `participants` `project` `repos` `reproduce` `service` `source_argos_case` `source_argos_run_id` `source_todo_id` `status` `status_reason` `title`
- REST: `PATCH /work/tickets/{id}`

### ticket_comment

Comment on a non-archived ticket; HTTP also accepts multipart body and file parts.

- Arguments: **`id`** `body`
- REST: `POST /work/tickets/{id}/events`

### ticket_archive

Set a ticket's archive state.

- Arguments: **`archived`** **`id`**
- REST: `POST /work/tickets/{id}/archive`

### todo_nav

Todo counts for the current account.

- REST: `GET /work/todo-nav`

### todo_list

List todos in a personal view; project_* views list within a project filter; work managers may use global_* across projects. state takes one status or a comma-separated set; mine_role keeps rows the caller is assigned or created; unplanned keeps todos without an iteration; overdue keeps unfinished todos past their due day; deferred keeps todos whose due day was pushed later; out_of_plan keeps todos added to their iteration after it started; sort takes iteration (by version), deferrals or estimate besides the columns.

- Arguments: `assignee` `closed` `deferred` `iteration_id` `mine_role` `order` `out_of_plan` `overdue` `page` `page_size` `project` `sort` `state` `unplanned` `view`
- REST: `GET /work/todos`

### todo_get

Read a todo, events and attachments.

- Arguments: **`id`**
- REST: `GET /work/todos/{id}`

### todo_create

Create a todo under a project. due_at and start_at are days (YYYY-MM-DD, Asia/Shanghai): a todo is overdue once its due day ends. estimate_minutes is the planned effort (480 is one day). A todo joining an iteration that has started is out of plan; iteration_reason says why.

- Arguments: **`project`** **`title`** `acceptance` `assignee_login` `closed` `delegate_login` `description` `due_at` `due_change_reason` `estimate_minutes` `iteration_id` `iteration_reason` `links` `priority` `request_key` `revision` `start_at` `status` `ticket_ids`
- REST: `POST /work/todos`

### todo_update

Update a todo; pushing due_at to a later day requires due_change_reason and counts as a deferral. Moving it into or out of a started iteration records iteration_reason in the iteration's scope.

- Arguments: **`id`** **`revision`** `acceptance` `assignee_login` `closed` `delegate_login` `description` `due_at` `due_change_reason` `estimate_minutes` `iteration_id` `iteration_reason` `links` `priority` `project` `request_key` `start_at` `status` `ticket_ids` `title`
- REST: `PATCH /work/todos/{id}`

### todo_delete

Delete a todo.

- Arguments: **`id`**
- REST: `DELETE /work/todos/{id}`

### todo_comment

Comment on a todo; HTTP also accepts multipart body and file parts.

- Arguments: **`id`** `body`
- REST: `POST /work/todos/{id}/events`

### todo_link_ticket

Create a ticket from a todo.

- Arguments: **`id`**
- REST: `POST /work/todos/{id}/link-ticket`

### document_nav

List documents the caller can read.

- REST: `GET /work/doc-nav`

### document_list

List documents and folders visible to the caller.

- Arguments: `folder_id` `order` `page` `page_size` `sort`
- REST: `GET /work/docs`

### document_get

Read a document the caller can access.

- Arguments: **`id`**
- REST: `GET /work/docs/{id}`

### document_create

Create a document; visibility is instance or restricted.

- Arguments: **`title`** `body` `folder_id` `tags` `visibility`
- REST: `POST /work/docs`

### document_update

Update a document the caller can edit.

- Arguments: **`id`** `body` `folder_id` `tags` `title` `visibility`
- REST: `PATCH /work/docs/{id}`

### document_delete

Delete a document the caller can edit.

- Arguments: **`id`**
- REST: `DELETE /work/docs/{id}`

### document_grants

List access grants for a document.

- Arguments: **`id`**
- REST: `GET /work/docs/{id}/grants`

### document_grant_set

Grant a member view or edit access on a document.

- Arguments: **`id`** **`login`** **`role`**
- REST: `PUT /work/docs/{id}/grants/{login}`

### document_grant_delete

Remove a document access grant.

- Arguments: **`id`** **`login`**
- REST: `DELETE /work/docs/{id}/grants/{login}`

### document_folder_update

Rename a document folder.

- Arguments: **`id`** **`title`**
- REST: `PATCH /work/doc-folders/{id}`

### document_folder_delete

Delete an empty document folder; nonempty folders return conflict.

- Arguments: **`id`**
- REST: `DELETE /work/doc-folders/{id}`

### document_folder_create

Create a document folder.

- Arguments: **`title`** `parent_id`
- REST: `POST /work/doc-folders`

### attachment_get

Read attachment metadata and an authenticated content URL; use CLI attachment download for bytes.

- Arguments: **`id`**
- REST: `GET /work/attachments/{id}`

### chat_search

Search only messages in conversations the caller belongs to.

- Arguments: **`q`** `page` `page_size`
- REST: `GET /chat/search`

### chat_share_document

Send a knowledge document as a card into a conversation the caller belongs to; restricted documents gain view grants for the members, which needs permission to manage the document's access.

- Arguments: **`conversation_id`** **`document_id`** `body`
- REST: `POST /chat/documents`

### argos_overview

Read the newest failing Argos case results, optionally in one environment.

- Arguments: `env`
- REST: `GET /argos/overview`

### argos_catalog

Read every observed Argos case with its newest result, and the known packs, groups and environments.

- REST: `GET /argos/catalog`

### argos_case_history

Page one observed case's results across runs, newest first, with steps.

- Arguments: **`id`** `env` `page` `page_size`
- REST: `GET /argos/cases/{id}/results`

### argos_run_list

List Argos runs newest first with a brief summary and case results without steps; read one run with argos_run_get.

- Arguments: `env` `page` `page_size` `status`
- REST: `GET /argos/runs`

### argos_run_get

Read an Argos run with its case results, steps and comments.

- Arguments: **`sid`**
- REST: `GET /argos/runs/{sid}`

### argos_run_interrupt

Interrupt a running Argos run; its unfinished cases become interrupted.

- Arguments: **`sid`**
- REST: `POST /argos/runs/{sid}/interrupt`

### argos_run_comment

Comment on an Argos run, optionally on one case.

- Arguments: **`body`** **`sid`** `case_id`
- REST: `POST /argos/runs/{sid}/comments`

### argos_test_list

List registered Argos case sources with provenance and owners.

- Arguments: `pack` `page` `page_size` `q`
- REST: `GET /argos/tests`

### argos_test_get

Read a registered Argos case including its full source.

- Arguments: **`id`**
- REST: `GET /argos/tests/{id}`

### argos_test_save

Register or update a case with its complete source; after creation only its owner, creator or an org admin, with expected_sha256 from a fresh read.

- Arguments: **`id`** **`owner`** **`pack`** **`path`** **`repository`** **`revision`** **`source`** **`title`** `expected_sha256` `group` `tags`
- REST: `PUT /argos/tests/{id}`

### argos_test_source

Read a retained source snapshot of a registered case by checksum.

- Arguments: **`id`** **`sha256`**
- REST: `GET /argos/tests/{id}/source`

### argos_plan_list

List shared Argos test plans.

- Arguments: `page` `page_size`
- REST: `GET /argos/plans`

### argos_plan_save

Save a shared test plan of registered cases with an owner, environment, status and product iteration; updates pass the current revision.

- Arguments: **`cases`** **`environment`** **`id`** **`owner`** **`status`** **`title`** `iteration` `revision`
- REST: `PUT /argos/plans/{id}`

### argos_search

Search registered Argos cases, their source, and runs with their case results.

- Arguments: **`q`** `page` `page_size`
- REST: `GET /argos/search`

<!-- tools:end -->

