Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.Developyn/laver-mcp

NPM · @LAVER/MCP · SCANNED AUG 18

Kanban boards, sprints, tickets and a team wiki, with versioned writes for concurrent agents.

Available components

68 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 30 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 16889 tokens (~291/item across 58 items; 58 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management13
  • Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · @laver/mcp

# add to Claude Code
claude mcp add developyn-laver-mcp -- npx -y @laver/mcp
# add to Codex CLI
codex mcp add developyn-laver-mcp -- npx -y @laver/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "developyn-laver-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@laver/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add developyn-laver-mcp --command npx --arg -y --arg @laver/mcp
# ~/.hermes/config.yaml
mcp_servers:
  developyn-laver-mcp:
    command: "npx"
    args: ["-y", "@laver/mcp"]
// mcp.json
{
  "mcpServers": {
    "developyn-laver-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@laver/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Aug 26 +2
    • Schema quality: 8991 → 16889 functional
    • Tool coverage: 71% → 100% functional
    • Stability: unverified → 0.07 functional
    • Package version: 0.3.1 → 0.4.0 functional
  • 14 Aug 26 65

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 18 Aug 2026 · Analysed npm/@laver/mcp@0.4.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm
Dependencies 95 packages
Packages resolved 95
Stale 30
Tree resolution Complete
MCP tools · 58 exposed · ~16,889 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
add_subtask ~194

Add one item to a ticket's checklist. This is where acceptance criteria belong when they are meant to be ticked off one at a time rather than read as prose: they show as a progress count on the card, and update_subtask is how each one gets marked done. It appends to the bottom of the list. Plain text, not Markdown — an item is a line on a checklist rather than a document, so write the criterion as a sentence and put the detail in the ticket's description. One item per call; a checklist of seven is seven calls. A ticket you cannot open is a 404.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search
titlestringyesThe item's text, 1 to 500 characters. A name only — there is no description, no assignee and no due date on a checklist item.

No output schema declared.

No examples provided.

append_wiki_page ~353

Add markdown to the END of a page that already exists. This is the tool for writing what you learned into your own section of a shared page — the thing create_wiki_page cannot do without leaving you a second page of the same name. It ADDS ONLY: it cannot change or remove a word that is already on the page, which is exactly why it is safe to offer where a general edit is not. There is still no tool to edit or delete existing content; if you need to correct something you appended, append the correction. Takes NO version and never conflicts — two agents appending to the same page at the same moment both get their text, in whichever order the server serialises them, and neither is asked to retry. Markdown is converted server-side by the same parser create_wiki_page uses, so headings, lists, tables, code blocks and links all survive; lead with a heading if you want your section to be findable. The reply is the page's identity and its new version, deliberately NOT the page body — appending does not need you to have read the page, and getting the whole document back is the cost this tool exists to avoid. Markdown that is only whitespace is a 400 rather than a version bump for no change. Needs write access to the workspace: a read-only role or a guest key is a 403 and retrying cannot fix it.

NameTypeReqDescription
content_markdownstringyesAppended after everything already on the page. Longer than 100k characters is refused rather than truncated
page_uuidstringyesFrom get_wiki_tree or a search_wiki hit. A wiki uuid passed here is a 404, not a page

No output schema declared.

No examples provided.

archive_ticket ~219

Move a ticket to the workspace trash — the recoverable half of deleting. It leaves the board, stops appearing in list_tickets and search, and get_ticket answers 404 for it, but it can be restored for 30 days from the workspace's trash in the web app, and is destroyed automatically once that window passes. This server has no restore tool, so from here archiving is a door only a person can reopen. It takes no `version` and cannot 409 — archiving is not a field edit, so there is nothing to conflict with. Already archived, never existed, and on a board you cannot open are all the same 404, so a retry is safe and a 404 tells you nothing about tickets you cannot see. If you intend to destroy the ticket permanently, call get_ticket FIRST and keep its `workspace_uuid`: delete_ticket needs one and an archived ticket can no longer be read to find it.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

comment_on_ticket ~218

Add a comment to a ticket. Markdown in `body` is parsed — headings, lists and code fences all render. Comments are not versioned: this takes no `version` and cannot 409, so it is the one write that is always safe to make against a ticket somebody else is editing, and it is the right way to report something rather than editing the description out from under them. It is also the write a read-only key can still make — a `commenter` role is refused update_ticket and move_ticket with a 403 but allowed this. A ticket you cannot open is a 404. Posting does not mark the thread read on your behalf.

NameTypeReqDescription
bodystringyesThe comment, Markdown, 1 to 20000 characters. Posting is not idempotent here unless you send an Idempotency-Key, so on an unclear failure read the thread back with get_ticket_comments before trying a…
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

create_automation ~1,230

Create an automation rule on a board from a trigger, one to twenty actions, and optional conditions. READ THIS BEFORE CALLING IT: the rule runs as the user this API key acts as, every time it is triggered, for as long as it exists — a standing grant of that person's permissions to anybody who can cause the trigger, not a one-off write like every other tool here, and the resulting history is attributed to them. This one takes effect immediately: the rule is live as soon as it is created and fires on its trigger within a couple of seconds, so do not create one speculatively to see what it would do. Creating one requires a workspace OWNER or ADMIN — a member who can otherwise write on the board is a 403 and retrying cannot fix it. A 402 means the plan's per-board rule limit is already reached (two on free) and nothing was created. Conditions are a flat AND of field/operator/value tests and every one must hold; the operators a field accepts differ, so `title contains x` is valid where `title is x` is a 400 listing the operators title takes. `run_as_user_uuid` defaults to the key's own user, and naming somebody else is refused unless they are an active member who can write and can see the board. Rules arrive switched on unless you pass `enabled: false`. The `schedule` and `ticket.due` triggers are not events and REQUIRE `trigger_config`: a schedule fans out over every ticket the conditions select at its appointed time, in UTC, so give it conditions unless you really mean the whole board; a due-date rule fires once per ticket per threshold and never retroactively, so creating one does nothing to work that is already overdue. `column.empty` is the odd one: it is about ONE ticket rather than the board, so it requires a `task_uuid` alongside `trigger_config: {status_uuid}`, and it fires the moment that column holds nothing — which may be the moment you create it, since a column that is already empty is already empty. It also keeps doing it every time that column empties aga…

NameTypeReqDescription
actionsarrayyesEach action is an object with a `type` from the list and whatever that action needs — a status, a user, a label, a comment body
board_uuidstringyesThe board's uuid, from list_boards
conditionsarrayA flat AND — every condition must hold. No OR and no nesting. Omit for every occurrence of the trigger
enabledbooleanWhether the rule runs. Defaults to true, so a rule you are still assembling is live the moment it is created — pass false and enable it once the actions are right.
namestringyesWhat the rule is called, 1 to 200 characters. It appears in the board's automation list and on every run record, so name it after what it does rather than after the trigger.
run_as_user_uuidstringDefaults to the user this key acts as. Read the warning above
run_limitintegercolumn.empty only, and every other trigger refuses it. How many times the rule may move the ticket before it retires itself: a ticket can leave that column and the column can empty again, and without…
task_uuidstringcolumn.empty only, where it is required: the ticket the rule moves. Every other trigger refuses it, since those act on the ticket that set them off. Cannot be changed afterwards — a rule about the wr…
trigger_configobjectRequired for the schedule, ticket.due, ticket.in_column and column.empty triggers and ignored by every other one. A schedule needs {interval, at}; a due-date rule needs {when} plus {days} unless when…
trigger_typestringyesWhat starts the rule. Most are occurrences and need no trigger_config. Four are not: `schedule` and `ticket.due` require one, `ticket.in_column` needs {status_uuid, days} because sitting in a column…

No output schema declared.

No examples provided.

create_board ~254

Create a board in a workspace. Without `template` the board arrives with Laver's default columns; with one it is seeded with that template's columns, labels and a few example tickets. `template` accepts exactly "crm" or "sales-leads" — anything else is a 400 from the schema, so do not guess an id. A template applies once, at creation: there is no way to apply one to an existing board and no link back afterwards, so a board created without one has to be arranged by hand. A workspace you cannot open is a 404, and a 402 means the plan's board limit is already reached and the board was not created — neither is worth retrying.

NameTypeReqDescription
namestringyesThe board's name, 1 to 200 characters. Names are not unique, so creating the same one twice gives you two boards rather than an error.
templatestringOmit for the default columns
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

create_custom_field ~381

Define a custom field on a board — a column of structured data every ticket on that board can carry, in addition to its description. Types: text, number, date, checkbox, select, currency. A `select` REQUIRES `options` and is refused without at least one; a `currency` takes a three-letter ISO 4217 code in `currency` (checked against the real list, so 'ZZZ' is a 400). The type cannot be changed afterwards — there is no answer to what a text value should become as a number that is not a guess — so a field of the wrong type has to be deleted and made again, losing every value stored in it. Defining a field requires a workspace OWNER or ADMIN; an ordinary member who can edit tickets is a 403, even though that same member may fill the field in once it exists. The reply carries the new field's uuid, which is the key update_ticket writes values against.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
currencystringFor `currency` only: an ISO 4217 code such as USD or GBP. Ignored by every other type.
namestringyesWhat the field is called, 1 to 60 characters. Unique per board — a name another field on this board already has is a 409 — and board-scoped, so the same name on another board is a different field.
optionsarrayThe choices, for `select` only and required by it — up to 40, each 1 to 60 characters. Ignored by every other type.
typestringyesWhat kind of value it holds. Fixed at creation and not editable afterwards, so choose it before you create the field rather than after.

No output schema declared.

No examples provided.

create_group ~136

Add a group to a board — the horizontal swimlanes tickets are sorted into, as opposed to the status columns they move through. A ticket's group is set with update_ticket, not here. Appended to the bottom; reorder_groups moves it. There is deliberately no tool that renames a group: the API has no route for it, so a group named wrongly is deleted and made again. A board you cannot open is a 404.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
namestringyesThe group's name, 1 to 100 characters. Not unique.

No output schema declared.

No examples provided.

create_label ~249

Create a workspace label. Names are unique ignoring case and surrounding space — 'Bug', 'bug' and ' bug ' are one label — so creating one that exists is a 409 rather than a second label. List_labels first and reuse the uuid you find rather than calling this to see whether it conflicts. A colour is REQUIRED — six-digit hex, '#d97757' — because a label with no colour is a label nobody can pick out on a board. The new label exists workspace-wide immediately and appears on every board, but is on no ticket until update_ticket puts it there. The reply carries its uuid, which is what `label_uuids` takes.

NameTypeReqDescription
colorstringyesSix-digit hex with the leading hash, '#334455'. Required, and stored lower-case.
namestringyesThe label's text, 1 to 50 characters. Unique across the workspace — a duplicate is a 409.
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

create_status ~178

Add a status column to a board. It is appended to the right-hand end; reorder_statuses is how it goes anywhere else. The reply carries the new column's uuid, which is what create_ticket and move_ticket take, so a column can be created and filled without re-reading the board. Names are not unique — creating "Review" twice gives you two columns called Review and no error — so read get_board first if you mean to check. A board you cannot open is a 404.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
namestringyesThe column's name as it appears on the board, 1 to 100 characters. This is also what `status` accepts anywhere a column can be named instead of pointed at by uuid, so make it something worth typing.

No output schema declared.

No examples provided.

create_ticket ~476

Create a ticket on a board. Give either `status` (the column name) or `status_uuid`; with neither it lands in the first column. Markdown in `description` is parsed — headings, lists and code fences all render. It is appended to the bottom of its column unless you send a `position`. The reply is the new ticket, including the `uuid` to reference it by and the `version` any later write to it will need, so there is no need to re-read it before your next call. This tool sends no idempotency key, so calling it twice makes two tickets: on a timeout or an unclear failure, use list_tickets with `q` set to the title to see whether the first one landed before you retry.

NameTypeReqDescription
board_uuidstringyesThe board to create it on, from list_boards
descriptionstringThe body, Markdown, up to 20000 characters. Headings, lists and code fences all render.
due_datestringDue date as an ISO 8601 date, e.g. 2026-08-14
positionnumberSort key within the column, not an index — smaller sorts higher. Read the neighbours' `position` off get_board and send a number between them; omit it to append to the bottom. Positions come back as…
prioritystringOne of low, medium, high or urgent. Left off, the ticket simply has no priority set, which is not the same as low.
statusstringThe column to place it in, by name as shown on the board. Must be a column on this board. Send this or `status_uuid`, not both; with neither it lands in the first column.
status_uuidstringThe column to place it in, by uuid, from get_board. The exact form of `status` and the one to prefer once you have read the board, since renaming a column does not break it.
titlestringyesThe ticket's title, 1 to 500 characters. This is the whole of what shows on the card, so put the specifics here rather than in the description alone.

No output schema declared.

No examples provided.

create_wiki_page ~470

Write a NEW page into a wiki, with its body as markdown. This is how an agent puts findings somewhere durable instead of handing them back as chat text. `wiki_uuid` comes from list_wikis; `parent_page_uuid` (from get_wiki_tree) nests the new page under an existing one and is where a page belongs unless it is genuinely top-level. The markdown is converted server-side by the same parser ticket descriptions and comments go through — headings, lists, tables, code blocks, blockquotes, horizontal rules and links all survive. An `![alt](https://…)` image survives too, as a reference to that URL — but only for a URL already hosted somewhere public, because there is no tool here to upload an attachment, and an image the reader cannot fetch renders as a broken one. Raw HTML is kept as literal text rather than interpreted, so do not reach for it to get something markdown lacks. ADD ONLY: there is deliberately no tool to change or delete what is already on a page. Wiki pages have a live collaborative editor behind them, so a whole-document overwrite from here would silently destroy whatever a person had open at the time. Adding cannot damage anything, so it is offered and overwriting is not. Do not call this twice to 'update' a page; you will get two pages — to add to a page that already exists, use append_wiki_page. Creating a page needs write access to the workspace: a read-only role or a guest key is a 403 and retrying cannot fix it. A title is required and a body is not, so a page can be created empty and filled in by a person later.

NameTypeReqDescription
content_markdownstringThe page body as markdown. Omit for an empty page. Longer than 100k characters is refused rather than truncated
parent_page_uuidstringNest under this page. Must be in the same wiki — a page from another wiki is a 400, not a silent move
titlestringyesThe page's title, 1 to 500 characters. This is what the tree and search results show, so make it findable rather than clever.
wiki_uuidstringyesThe wiki's uuid, from list_wikis

No output schema declared.

No examples provided.

delete_automation ~251

Delete an automation rule. It stops firing at once and the rule is gone — there is no trash for one and nothing here restores it, so a rule deleted by mistake has to be rebuilt from what you read before deleting. It also takes the rule's ENTIRE RUN HISTORY with it: after this, list_automation_runs has nothing, and the record of what the rule did to which tickets survives only in the workspace audit log. If the goal is to stop a rule rather than to be rid of it, update_automation with `enabled: false` does that reversibly and keeps the history. Requires a workspace OWNER or ADMIN and the current `version`; a stale version is a 409 carrying the current one, which is the guard against deleting a rule somebody else has just changed under you. The reply is empty on success.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
rule_uuidstringyesThe rule's uuid, from list_automations
versionintegeryesThe rule's version as get_automation last returned it. Required, for the same reason editing needs one: what you discard should be what you last looked at.

No output schema declared.

No examples provided.

delete_comment ~208

Retract one of YOUR OWN comments. As with editing, only the author may do it and anybody else's comment is an indistinguishable 404. The comment leaves the thread immediately and goes to the workspace trash, where a person can restore it for 30 days — there is no tool here that restores one, so from an agent's side treat it as final. Deleting a comment nobody has replied to is unremarkable; deleting one that a colleague has already answered leaves their reply talking to nothing, so prefer update_comment with a correction when the thread has moved on. A comment already deleted is the same 404 again, which makes a retry safe and tells you nothing.

NameTypeReqDescription
comment_uuidstringyesThe comment's uuid, from get_ticket_comments — or from the reply comment_on_ticket gave you, which is the cheap way to hold on to one you just wrote.
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

delete_custom_field ~161

Remove a custom field definition from a board, and with it every value any ticket on that board held in it. This is the destructive one in this group: the values are not archived, do not go to the trash, and cannot be recovered by restoring anything — deleting a field to recreate it loses the data even if you spell the name identically. There is no confirmation and no dry run, so read list_custom_fields and decide first. Requires a workspace OWNER or ADMIN. A field that is not there, or a board you cannot open, is a 404.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
field_uuidstringyesThe field's uuid, from list_custom_fields or get_board

No output schema declared.

No examples provided.

delete_group ~140

Remove a group from a board. Unlike deleting a column this does NOT require the group to be empty: the tickets in it survive and are simply left ungrouped, which also bumps each of their versions — so anything holding a version for one of those tickets has just been made stale and must re-read before writing. The group itself does not go to the trash and cannot be restored. A group that is not there, or a board you cannot open, is a 404.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
group_uuidstringyesThe group's uuid, from get_board's `groups`

No output schema declared.

No examples provided.

delete_label ~207

Delete a workspace label and strip it from every ticket that carries it, across every board. There is no trash for a label and nothing here restores one: recreating it by name gives a NEW uuid on no tickets, so the association is gone even if the word comes back. The reply's `label.affected_task_uuids` names every ticket it was stripped from, which is the only record of what it was on — keep it if there is any chance of wanting to put the label back. A label that is not there, or a workspace this key cannot open, is a 404.

NameTypeReqDescription
label_uuidstringyesThe label's uuid, from list_labels or from a board's `labels` in get_board
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

delete_status ~171

Remove a column from a board. It has to be EMPTY first: a column still holding tickets is a 409 saying how many, and the tickets are not moved or archived for you — move them with move_ticket and call this again. A board also has to keep one column, so deleting the last one is a 409 as well. Neither refusal is worth retrying unchanged. Unlike a ticket this does not go to the trash and cannot be restored, though the tickets that were in it are untouched because you moved them out first. A column that is not there, or a board you cannot open, is a 404.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
status_uuidstringyesThe column's uuid, from get_board's `statuses`

No output schema declared.

No examples provided.

delete_subtask ~170

Remove an item from a ticket's checklist. This one is not recoverable — a checklist item does not go to the trash the way a ticket or a comment does, so a criterion deleted here is gone and has to be typed again. Tick it off with update_subtask when it is done; delete it only when it should never have been on the list. An item already deleted, one on another ticket, and a ticket you cannot open are all the same 404, so a retry is safe and confirms nothing.

NameTypeReqDescription
subtask_uuidstringyesThe item's uuid, from the ticket's `subtasks` in get_ticket — or from the reply add_subtask gave you.
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

delete_ticket ~303

Permanently destroy a ticket that is ALREADY in the trash, along with its comments and attachments. Nothing undoes this — not the trash, not a restore, not support. It is the second step and never the first: archive_ticket, then this. A ticket still live on a board answers 404 rather than being destroyed, so this cannot bin something in one call. `workspace_uuid` must be the workspace the ticket belongs to — from get_ticket before it was archived, or get_board for the board it was on. Naming a workspace your key was not issued for is a 403 (`This API key is scoped to a different workspace.`) and never reaches the ticket; naming your own workspace for a ticket that does not live in it is a 404. Keep this for tickets that should never have existed: a duplicate, a probe, a test fixture you created. Anything a person might want back can simply be left archived, where it expires on its own. The 404 is otherwise deliberately undistinguished — not archived, already destroyed, and a board you cannot open all look identical.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

delete_ticket_attachment ~169

Remove a file from a ticket. This is the same one-way-but-recoverable move archive_ticket makes: the attachment leaves the ticket immediately and its bytes sit in the workspace trash for 30 days, after which the sweep destroys them. There is no tool here to restore one — that is the web app — so treat it as final in an agent's hands. The freed bytes stop counting against the workspace's storage quota straight away. An attachment already deleted, still uploading, or on a ticket this key cannot open are all the same 404, so this never confirms that a file existed.

NameTypeReqDescription
attachment_uuidstringyesThe attachment's uuid, from list_ticket_attachments
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

get_automation ~203

One automation rule in full — its trigger and trigger_config, its conditions, its actions, whether it is `enabled`, the user it runs as, and the `version` that update_automation and delete_automation require. Read it immediately before either write: the version is the whole point of this call, and a version read minutes ago may already be stale. Board access is enough, but a non-admin sees a `call_webhook` action's url and body as "[hidden]" — the rule still reads correctly, and sending those redacted values back through update_automation would overwrite the real url with the word, so never round-trip an action list you did not read as an admin. A rule on another board, or a board you cannot open, is the same 404.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
rule_uuidstringyesThe rule's uuid, from list_automations

No output schema declared.

No examples provided.

get_board ~266

A board with its status columns, labels, members and tickets. The status uuids returned here are what create_ticket and move_ticket expect. Each ticket carries `label_uuids` — bare uuids, resolvable against the board's `labels` list in the same reply — which is exactly the field `update_ticket` takes, so a label read from here can be written straight back without remapping. Note that `list_tickets` and `get_ticket` still return expanded `labels` objects, because neither reply has the dictionary to resolve uuids against. The tickets are around 90% of this reply, so pass `include_tasks: false` when you came for the uuids.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
include_tasksbooleanSet false to leave the tickets out and get the board's structure alone — statuses, labels, members, custom fields and `server_time`. That is what you want when you called this for a status_uuid or a…

No output schema declared.

No examples provided.

get_ticket ~200

One ticket in full: its fields, its `subtasks`, its expanded `labels` objects, and the `version` every write needs. Read this before you write. update_ticket, move_ticket, archive_ticket and the rest all take that version and answer 409 if it has moved on since you read it — that 409 is the signal to call this again and retry against the fresh version, never to drop the version or force the write. `labels` arrive expanded rather than as bare uuids because this reply carries no board dictionary to resolve them against; get_board returns `label_uuids` instead, and that bare-uuid shape is the one update_ticket wants. A ticket you cannot open answers 404, the same 404 as one that never existed, so a 404 here is not proof the ticket is gone.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

get_ticket_attachment ~291

Fetch one attachment's CONTENT, having found its uuid with list_ticket_attachments. What comes back depends on what the file is, because a tool result is text and most files are not: a text or CSV attachment is returned inline as text; an image is returned as an image block, which is the only form the model can actually look at; anything else — a PDF, a spreadsheet, a document — cannot cross this boundary as text at all, and needs `save_to`. Pass `save_to` for any file you want on disk, and for anything large: it writes the bytes to that path on the machine THIS SERVER runs on (normally the same machine as the agent, since the client starts it as a subprocess) and returns the path and size instead of the content. Files over 4 MB always need `save_to`, whatever their type, because an inline result that size costs more context than the answer is worth. Missing, still uploading, deleted, or on a ticket you cannot open are all the same 404.

NameTypeReqDescription
attachment_uuidstringyesThe attachment's uuid, from list_ticket_attachments
save_tostringAbsolute path to write the file to, on the machine running this server. Parent directories are created. An existing file is overwritten
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

get_ticket_comments ~163

The discussion on a ticket, as two lists: `comments` — the thread, oldest first — and `events`, the activity history the web app draws alongside it (moves, field edits, who did what and when). The whole thread comes back in one call; there is no paging and no cursor, so a very long one is simply long. Reading is free of side effects: it does NOT mark the thread as read or clear anyone's unread badge, so polling this to follow a ticket cannot make a teammate think their comment has been seen. A ticket you cannot open is a 404, the same 404 a ticket that never existed gives.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

get_ticket_flow ~292

How long this ticket has spent in each column, derived from the moves already recorded in its history — the answer to "where is the time going". READ `visits` RATHER THAN THE `by_status` TOTALS if you are adding several tickets up: each visit is one stay in one column with its own `entered_at`, `left_at` and `hours`, where `by_status` is those visits already summed per column — and a ticket's per-column totals overlap with another's whenever the two were worked in the same batch, so summing totals across tickets double-counts wall-clock time that was shared. The hours are wall clock, not working hours: a ticket that sat over a weekend counts the weekend. `gaps` is the honest part of the reply and is worth reading before quoting any number — a ticket created before its board recorded moves has `no_move_recorded`, and `chain_broken` or `status_mismatch` mean the history and the ticket's current column disagree, so the totals are a floor rather than a measurement. The current column's visit is still open, with `left_at` null, and its hours grow until the ticket moves. A ticket you cannot open is a 404, the same 404 one that never existed gives.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

get_wiki_page ~176

One wiki page in full, with its content and any attachments it references. Get `page_uuid` from get_wiki_tree or from a search_wiki hit — a page uuid is not a wiki uuid, and passing one for the other is a 404. A page you cannot open is that same 404, so it never confirms that a page exists. This server can create a page (create_wiki_page) and add to the end of one (append_wiki_page), but cannot change or delete what is already written: to correct something, append the correction rather than planning to edit the page.

NameTypeReqDescription
page_uuidstringyesThe wiki page's uuid, from get_wiki_tree or search_wiki. A page you cannot open is a 404, the same 404 as one that never existed.

No output schema declared.

No examples provided.

get_wiki_page_version ~237

What a wiki page said at an earlier version — its title, content and who saved it. This is how you recover something that was overwritten, and it is a READ: the page is not changed and its version does not move. Reach for it the moment you find that a page no longer says what you put there. `version` counts from 1 and goes up by one on every save; the current version is on the page from get_wiki_page. A version that was never saved, and a page you cannot open, are both the same 404. There is deliberately no tool here that puts an old version back — read it and append the wording you want, because a restore overwrites whatever a colleague has open in the live editor right now.

NameTypeReqDescription
page_uuidstringyesThe wiki page's uuid, from get_wiki_tree or search_wiki. A page you cannot open is a 404, the same 404 as one that never existed.
versionintegeryesWhich save to read. 1 is the page as first created; get_wiki_page reports the current number

No output schema declared.

No examples provided.

get_wiki_tree ~253

Every page in a wiki as a tree — titles, uuids and nesting — without any page content. This is the cheap way to find a page uuid when you know roughly where it sits; search_wiki is the way when you know roughly what it says. Follow up with get_wiki_page for the content of one. A wiki you cannot open is a 404, the same one a wiki that does not exist gives. A big wiki is tens of thousands of tokens of metadata, so narrow it with `parent_page_uuid` and `depth` rather than reading all of it to find one uuid.

NameTypeReqDescription
depthintegerHow many levels of nesting to return. 1 is the top level alone — the whole wiki's top-level pages, or just `parent_page_uuid` itself when one is given; 2 adds their children. Omit for every level.
parent_page_uuidstringReturn only this page and everything nested under it. The uuid must be a page in THIS wiki — anything else is an error naming it, not an empty tree. Omit for the whole wiki.
wiki_uuidstringyesThe wiki's uuid, from list_wikis

No output schema declared.

No examples provided.

link_tickets ~196

Record that one ticket must be finished before another can start. Direction is from the point of view of task_uuid: "blocks" means task_uuid has to be done first. Every ticket read afterwards carries `blocked_by`, `blocks` and `is_blocked`, so this is how you work out what order to do things in.

NameTypeReqDescription
directionstringyesRead from task_uuid's side: 'blocks' means task_uuid must be finished before other_task_uuid can start; 'blocked_by' means the reverse. Unlink with unlink_tickets.
other_task_uuidstringyesThe ticket at the far end of the link. Must be a different ticket from task_uuid.
task_uuidstringyesThe ticket the link is stated from, and the one `direction` is read relative to. Swapping this with other_task_uuid reverses the meaning, so decide which end you are describing before you call.

No output schema declared.

No examples provided.

list_automation_runs ~420

What a rule has actually done — newest first. This is the tool for "why did this ticket move?" and "why is my rule not firing?", and the answers come from different halves of it. Each run carries its `status`, the ticket it acted on with that ticket's title, `actions_done` out of `actions_total`, an `error` when one failed, and the times it was enqueued, started and finished. The runs that did nothing because the conditions did not hold are `no_match`, and they are EXCLUDED by default — a rule with conditions produces far more of them than real runs, so they would bury the interesting rows; pass `include_no_match: true` when the question is why nothing happened, because then they are the entire answer. `depth` above zero means the run was set off by another rule's write rather than by a person, and a run stopped at the depth cap is how a rule that feeds itself shows up. A ticket that has since been deleted or moved to another board keeps its run with a null title rather than vanishing. Deleting a rule destroys its history with it. Board access is enough to read this — deliberately, since being told why the board did something to your ticket is not the same power as writing rules.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
include_no_matchbooleanInclude the runs where the trigger fired and the conditions did not hold. Off by default. Turn it on when the complaint is that a rule never runs — a `no_match` row proves it is being triggered and f…
limitintegerHow many runs to return, 1 to 200, newest first. Defaults to 50. There is no paging beyond this, so an older run than the limit reaches is not retrievable here.
rule_uuidstringyesThe rule's uuid, from list_automations

No output schema declared.

No examples provided.

list_automations ~223

The automation rules on a board — each with its trigger, conditions, actions, whether it is `enabled`, the user it runs as, and the `version` any edit would need. These are live: a rule with `enabled: true` fires on its trigger within a couple of seconds and applies its actions as the person named in `run_as_user_uuid`. Read this before creating a rule on a board you did not set up, both because the per-board limit counts what is already here (two on the free plan) and because an existing rule may already do what you were about to add. What a rule has actually done is list_automation_runs rather than this. A rule that switched itself off after looping shows up here as `enabled: false` with a `disabled_reason`. Board access is enough to read them, which is wider than creating one. A board you cannot open is a 404, the same 404 a board that never existed gives.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards

No output schema declared.

No examples provided.

list_boards ~144

The boards in a workspace, with their uuids and names — where you go from a workspace to something you can actually read. It lists only the boards this key can open, so a short list means limited access rather than an empty workspace, and archived boards are not in it. The uuid you want for get_board and list_tickets is here; the status uuids those need are not — get_board has those.

NameTypeReqDescription
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

list_custom_fields ~169

The custom fields defined on a board: each one's uuid, name, type and — for a select — its options. The uuid is the key `update_ticket`'s `custom_fields` is written against, and a value keyed by a field's NAME is dropped silently, so this is the read that makes writing one possible. get_board returns the same definitions alongside everything else; this is the cheap way to ask for them alone. Fields are board-scoped by design — 'Size' on one board is not 'Size' on another — so a uuid from one board written to a ticket on another is discarded without an error. Reading them needs only board access, where defining one needs a workspace admin.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards

No output schema declared.

No examples provided.

list_labels ~174

Every label in the workspace, alphabetically, with its uuid and colour. This is the workspace-wide source of the uuids `update_ticket` takes as `label_uuids` — get_board only shows the ones already in use on that board, so a label another team applies elsewhere is invisible there and is here. Labels are shared across every board in the workspace: applying one to a ticket does not copy it anywhere, and renaming it changes it for everybody. An empty list means the workspace genuinely has none. A workspace this key cannot open is a 404.

NameTypeReqDescription
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

list_published_links ~377

What of this workspace's is on the public internet right now: `wiki_pages` and `boards`, each with its `public_token` — the share link's secret — plus who published it, when, and how many times a stranger has viewed it. This is the inventory read, and no other tool answers it, since a page or board reads exactly the same here whether or not the world can see it. Two fields carry the meaning. `live` is what a stranger actually gets, so a row is not proof of reachability; when it is false, `dark_reason` says why — `page_deleted`, `wiki_deleted`, `board_deleted`, `page_private`, `workspace_switch_off`, or `unavailable` for a cause an admin cannot act on, such as a plan that no longer includes publishing. An archived page still holding a token is listed on purpose: it goes straight back onto the internet the moment somebody restores it, and that state has no other way of being found. `public_wiki_pages_enabled` and `public_boards_enabled` are the workspace-wide switches, so every row can be dark for one reason. At most 500 rows of each; `truncated` says if that happened. Requires a workspace OWNER or ADMIN — an ordinary member is a 403, a non-member a 404 — and it grants no access a reader did not already have, since every link here is public by definition. Taking one back down is deliberately not a tool: report what is published and let a person decide what to unpublish.

NameTypeReqDescription
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

list_ticket_attachments ~148

The files on a ticket: name, content type, size in bytes and uuid, newest first. Nothing else here reads a ticket's files, so this is the way to find out whether the specification an agent is working from is actually a PDF somebody attached. `get_ticket` reports `attachment_total`, which is how you know whether calling this is worth a round trip. Only finished uploads are listed — an upload still in flight and a deleted file both read as absent — and the reply carries metadata, never the bytes; get_ticket_attachment fetches those one at a time.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

list_tickets ~825

Tickets on a board, in board order, optionally filtered by status or by free text. This is what to read a column or walk a whole board with; get_board returns the same tickets but takes neither `limit` nor a cursor. Paging: `limit` defaults to 50 and caps at 200, and `next_cursor` comes back only on a FULL page — a short page is the end of the walk, so stop when it is absent instead of calling again, and pass it back verbatim when it is there. Following a board over time: send the `server_time` from a previous reply as `updated_since` and you get only what changed since, plus `removed_task_uuids` for tickets that left the board or went out of view. Use the server's clock for that rather than your own, which is the whole point of `server_time` — your clock can drift and silently skip a ticket. Archived tickets are never returned.

NameTypeReqDescription
board_uuidstringyesThe board to read, from list_boards
cursorstringThe `next_cursor` from the previous page, passed back unchanged. It encodes a position on the board, so it is only meaningful for the same board and the same filters — do not build one yourself or re…
include_descriptionsbooleanSet false to leave `description` off every ticket, keeping titles, statuses, labels and uuids. Bodies are around 78% of a column listing, and you have not chosen a ticket to read yet — get_ticket has…
limitintegerTickets per page, 1 to 200. Defaults to 50. A reply holding exactly this many is a full page and carries a `next_cursor`; anything shorter is the last page.
qstringFree-text search over titles and descriptions, ranked by relevance. Whole words and prefixes, not mid-word substrings. A ranked reply cannot be paged, so this cannot be combined with cursor. A UUID,…
statusstringA status column's name, as shown on the board — 'To Do', 'In progress'. Matched against that board's columns, so a name from another board is a 400 rather than an empty list. Use status_uuid instead…
status_uuidstringA status column's uuid, from get_board. The exact form of `status`, and the one to prefer once you have read the board, since it survives a column being renamed.
updated_sincestringReturn only tickets changed after this moment: an ISO 8601 timestamp, or — better — the `server_time` from a previous reply, which is the server's own clock and cannot drift against it. The reply the…

No output schema declared.

No examples provided.

list_wikis ~250

The wikis in a workspace, with their uuids — the only place a `wiki_uuid` comes from, so every other wiki tool starts here. `workspace_uuid` is required; start from list_workspaces if you do not have one. An empty list is not proof the workspace has no wiki: a key acting as a guest is excluded from workspace-wide reads and sees nothing here. Archiving a wiki (done in the browser; there is no tool here for it) takes it out of this list entirely, along with every page under it — pass `archived: true` to see those instead, which is also the only way to find a `wiki_uuid` for restore_wiki.

NameTypeReqDescription
archivedbooleanOmit or false for the normal list. true swaps it for archived wikis instead — the two never mix in one reply, the same way an archived wiki never appears beside a live one in the workspace sidebar.
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

list_workspace_tickets ~502

Tickets from EVERY board in the workspace at once — the triage read, and the only one here that does not need a board_uuid. Two questions it answers that nothing else can: `overdue: true` is everything past its due date and not yet in a column the board counts as finished, oldest deadline first; `unassigned: true` is everything nobody owns. Send both and you get the intersection, since the filters are ANDed rather than ORed. `q` is the same word-and-prefix search list_tickets uses, ranked, across the whole workspace. Deliberately the small sibling of list_tickets: one page, 50 by default and 200 at most, no cursor and no paging — so a `limit`-sized reply means there may be more and you cannot ask for the rest from here. Narrow it, or go board by board with list_tickets. It shows only the boards this key can open, so a restricted member's triage is their own boards and the reply never says which ones were left out. Archived tickets are not in it.

NameTypeReqDescription
limitintegerHow many tickets to return, 1 to 200. Defaults to 50. There is no cursor on this route, so this is a ceiling rather than a page size — a full reply is not proof there is nothing else.
overduebooleantrue for tickets whose due date has passed and that are not in a column marked complete. The comparison uses the server's calendar day rather than yours, so the same ticket is overdue for everybody a…
qstringFree-text over titles and descriptions across every board, ranked by relevance. Whole words and prefixes, not mid-word substrings, and three characters minimum for a prefix to count. Unlike list_tick…
unassignedbooleantrue for tickets with nobody assigned. Combine with `overdue` for the pair of questions triage usually asks. Omit or false for no filter.
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

list_workspaces ~140

The workspaces this key can act in, with their uuids, names and the role it holds in each. Start here when you do not already have a workspace uuid, then go to list_boards. Through an API key this is always exactly one workspace — the one the key was issued for — even when the person who created it belongs to several, so a single entry is the normal answer rather than a sign of missing access. Archived workspaces are not in it. Each entry carries `billing_status`, which is how you tell a workspace that has gone read-only from one you can still write to, before a write fails rather than after.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

mark_comments_read ~186

Clear this ticket's unread badge for the user this key acts as. Every other tool here leaves read state alone — get_ticket_comments deliberately does not mark anything read — so this is the one call that says "I have seen the thread", and the one that clears an unread count an agent's own comment created for the person whose key it is. It marks read up to the NEWEST comment that exists right now: a comment posted a second later is unread again, so this is a point in time rather than a standing subscription. Idempotent — calling it on a thread with nothing unread succeeds and changes nothing — and it reports `unread_comment_count: 0` with the moment it recorded. Reading is not affected: the thread is still fully readable afterwards.

NameTypeReqDescription
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.

move_ticket ~429

Move a ticket to another column. Give either `status` (the column name) or `status_uuid` — with NEITHER this is a 400 ("body must NOT have fewer than 2 properties") and not a no-op, and with both it is a 400 saying to pick one. A column name is matched case-insensitively and trimmed, so "to do" finds "To Do", but a name no column has is a 400 naming it, and a `status_uuid` belonging to another board is refused too — get_board is where both come from. `version` must be the one get_ticket returned; a stale one is a 409 that carries the current version with it, so the retry does not need another read. The ticket is appended to the bottom of the column it arrives in unless you send a `position`; it does not keep the number it had in the column it left.

NameTypeReqDescription
positionnumberSort key within the column, not an index — smaller sorts higher. Read the neighbours' `position` off get_board and send a number between them; omit it to append to the bottom. Positions come back as…
statusstringThe column to move it to, by name as shown on the board. Send this or `status_uuid`, not both, and one of the two is required — there is no default target.
status_uuidstringThe column to move it to, by uuid, from get_board. The exact form of `status`, and unaffected by a column being renamed.
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search
versionintegeryesThe `version` from the ticket as you last read it. Not a number you choose or increment: send back exactly what get_ticket gave you. If somebody else has written since, the call answers 409 rather th…

No output schema declared.

No examples provided.

reorder_groups ~128

Set the top-to-bottom order of a board's groups. Same contract as reorder_statuses: send the COMPLETE list of group uuids from get_board in the order you want, and a list that no longer matches the board is a 409 ("The group list changed. Refresh and try again.") rather than a partial reorder. Tickets keep their groups; only the lanes move.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
group_uuidsarrayyesEvery group on the board, exactly once each, in the order you want them shown.

No output schema declared.

No examples provided.

reorder_statuses ~170

Set the left-to-right order of a board's columns. Send the COMPLETE list of status uuids in the order you want — a partial list is refused rather than applied, which is what stops two people reordering at once from silently dropping a column. Read them off get_board immediately before calling, and if a column has been added or removed since, this answers 409 ("The column list changed. Refresh and try again."): re-read and send the new complete list. Nothing moves between columns; only the order changes.

NameTypeReqDescription
board_uuidstringyesThe board's uuid, from list_boards
status_uuidsarrayyesEvery column on the board, exactly once each, in the order you want them shown. Anything less than the whole set is a 409.

No output schema declared.

No examples provided.

restore_wiki ~158

Undo an archive: brings a wiki, and every page under it, back into list_wikis and back onto the internet if any of its pages were published. `wiki_uuid` comes from list_wikis with `archived: true` — that is the only place one is visible at all, since an archived wiki is invisible everywhere else this server reads. A wiki that is not archived, one in a workspace this key cannot open, and a uuid that does not exist are all the same 404, so this never confirms that a wiki exists. There is deliberately no tool here that archives one in the first place: that half stays a browser action.

NameTypeReqDescription
wiki_uuidstringyesThe wiki's uuid, from list_wikis

No output schema declared.

No examples provided.

search ~352

Search tickets, wiki pages AND ticket comments across a whole workspace in one call, ranked by relevance with a highlighted excerpt. Use this when you know roughly what something is called but not which board or wiki it is on — list_tickets needs a board_uuid, this does not. The reply has FOUR lists: `boards` and `tasks` and `pages` matched their own text, and `comments` are tickets found by something said ABOUT them — each carries the ticket it belongs to, and a ticket already in `tasks` is never repeated there. `boards` is easy to miss and is often the one you want: it is how you find the board a term names without listing every board first. Matches whole words and prefixes, not mid-word substrings: 'deploy' finds 'deployment', 'eploy' finds nothing. Three characters minimum. Returns a short line per hit, not the full ticket or comment — follow up with get_ticket, get_ticket_comments or get_wiki_page. Each excerpt marks the matched words with the control characters \x01 and \x02 rather than with markup; strip them before showing the text to anyone.

NameTypeReqDescription
limitintegerResults per kind, tickets and pages counted separately
qstringyesWhat to look for, 1 to 200 characters. Whole words and prefixes across every board, ticket, comment and wiki page the key can open — three characters minimum for a prefix to count.
workspace_uuidstringyesThe workspace's uuid, from list_workspaces. A key only ever reaches the one workspace it was issued for, so this is that one; another workspace's uuid is a 404 rather than a permission error.

No output schema declared.

No examples provided.

search_wiki ~221

Full-text search inside ONE wiki, returning matching pages with a highlighted excerpt. A title match outranks a body match, so the page actually about the term comes first. A single word also matches as a prefix — 'custom' finds 'Customark' — while a multi-word query keeps the usual search semantics: "quoted phrase", -excluded, and OR. Matches are marked in the excerpt with the control characters \x01 and \x02 around each hit, not with markup; strip them before showing the text to anyone. `wiki_uuid` comes from list_wikis, and a wiki that does not exist or that you cannot open is the same 404. To search tickets and wikis together across a whole workspace, use `search` instead.

NameTypeReqDescription
qstringyesWhat to look for across this wiki's page titles and bodies, 1 to 500 characters. Scoped to the one wiki — use search to cover boards and tickets as well.
wiki_uuidstringyesThe wiki's uuid, from list_wikis

No output schema declared.

No examples provided.

unlink_tickets ~222

Remove the link between two tickets. Order does not matter — it finds the pair from either end, so you do not have to know which one is recorded as the blocker. Note what it removes: Laver can hold more than one kind of link between the same pair (a dependency, a related-to, a duplicate-of), a person can add the other kinds in the web app, and this removes ALL of them rather than only the dependency link_tickets creates. It is not an error to unlink a pair that was never linked — nothing matches, nothing is removed, and the call still succeeds — so this cannot be used to test whether a link exists; read `blocked_by` and `blocks` on the ticket for that. Either uuid being unreadable, on a board you cannot open, or nonexistent is a 404.

NameTypeReqDescription
other_task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search
task_uuidstringyesThe ticket's uuid, from list_tickets, get_board or search

No output schema declared.

No examples provided.