Skip to main content
Glama
wirkspace

wirk-mcp

Official
by wirkspace

wirk-mcp

wirk-mcp gives agents WIRK over MCP: five tools, wirk_status, wirk_query, wirk_write, wirk_review and wirk_show, whose arguments are WIRK's request bodies and whose answers are WIRK's compact text. Coordination and ticketing built for agents and the people they work with: your wirk, its context and its evidence in one wirkspace.

Install

One command installs the wirk command and this server, sets up Claude Code and Codex when they are present, and logs in:

curl -fsSL https://wirk.life/install | sh

By hand, install the CLI and MCP server as separate tools from PyPI:

uv tool install wirk
uv tool install wirk-mcp

Installing wirk-mcp alone provides the server binary, not the wirk CLI command. Run wirk login, then point your agent host at the installed binary. First check claude mcp get wirk or codex mcp get wirk: a server named wirk with another command is an earlier install. Replace it (Claude Code needs claude mcp remove --scope user wirk first; Codex's add replaces it), or skip the add when it already runs this binary:

claude mcp add --scope user wirk -- "$(command -v wirk-mcp)"      # Claude Code
codex mcp add wirk -- "$(command -v wirk-mcp)"                    # Codex

Package releases are also listed on GitHub.

The server uses the configuration wirk login made (~/.config/wirk, or $WIRK_CONFIG_DIR) and only the agents' token in it; it never reads a person's own token. A new login needs no restart. In an agent chat it uses that chat's own token instead, the one wirk login in the chat made: the chat is recognised by the thread ID a Codex request carries (or CODEX_THREAD_ID) and by CLAUDE_CODE_SESSION_ID in the server's environment (Claude Code, in the terminal and the desktop app), never by a tool argument. Until the chat has run wirk login, its calls answer actor_setup_required.

Related MCP server: 7dayrag

Use

For catch-ups about status, priorities or blockers, use wirk_status for breadth. Batch a few visible work and decision leads in the first wirk_query, then follow selected links or truncated details in the next before naming specific blockers, owners or next work. Cards and counts are leads; stop when evidence suffices and name gaps. Catch-ups are read-only and answered from WIRK: read the repository or other sources only to implement or when asked to verify, and otherwise offer to check. Old handoffs and age do not establish release or worker state. Direct MCP is preferred; the CLI also works.

An agent starts with wirk_status, optionally with a one-line task. wirk_query fetches by ID, short ID or exact title, lists with fields, finds what matters for the words in about, or looks up a receipt. wirk_write changes items and links in one batch, stating in expect the revision it read (rN on a card); completing wirk gives its evidence as reason. Context changes apply when the agent may make them; otherwise they are refused with requires_review and the agent proposes them. wirk_review accepts, rejects or defers proposals when the agent's role may review; a background agent only proposes. wirk_show returns a link to a live, read-only page for a person; anyone with the link can open it until it expires after 24 hours. wirk_status and wirk_query are annotated read-only. In wirk_write, uploads (on item.create and message.send) and attach_uploads (on item.edit) take upload IDs or absolute local file paths: the server stores each file first and sends the write only when every file is stored; set your own request_id when attaching files. format: "json" returns data instead of text. request_id may be left out: the server makes one and names it, and resending the identical body with it applies once.

What leaves the machine

The requests the agent makes and their content; the token, only as the bearer header to the configured address; and with wirk_status, the host's name and version, a session number for this server process, and the repository (host/owner/name, or a hash) and branch of the directory it runs in. No telemetry.

Development

The tests need the wirk package installed beside this one: uv pip install -e ../wirk-cli && uv pip install -e . && python -m pytest tests -q.

Releasing

A release is a version bump merged to main with Release: publish wirk-mcp <version> in its squash body; the version must equal the wirk== pin in pyproject.toml. After the release check passes on that exact commit, the tag v<version> is created there; pushing main publishes nothing, and a tag is never moved. The tag's Release workflow waits up to ten minutes for the wirk release of the same version, tests against that public CLI wheel, attaches the wheel, the sdist and SHA256SUMS to a GitHub Release, and publishes to PyPI through trusted publishing; no token is stored anywhere.

Release wirk first: a tag whose matching wirk release does not exist fails and stays unpublished, and the next version is released in step instead of moving the tag. New GitHub releases stay prereleases until their downloaded public bytes match the build and a clean public installation passes. Retry failed jobs to reuse the successful build artifacts: identical existing assets are retained, missing assets are uploaded, and differing bytes or a moved tag stop the run. The Release workflow's manual verification input checks an existing public tag without publishing. Publication does not update already-installed or running clients.

License

Apache-2.0. See LICENSE.

Available Tools

5 tools
wirk_queryC
Read-onlyIdempotent

Fetch by ID, short ID or exact title; list with fields; find what matters for about (by meaning on Pro); or look up a receipt. A result "label: query …" maps bare refs to fetch, known keys to arguments, other KEY=VALUE to fields (comma values as lists, except text, linked and folder).

NameRequiredDescriptionDefault
sortNosort=changed is newest first; leading - reverses
waitNoWith inbox=me: hold up to this many seconds (0–60) for a message.
aboutNoWords; on Pro, items ranked by meaning; otherwise items containing every word.
depthNo
fetchNoRefs: ID, short ID, exact title, ID@N, or {ref, revision, select}; a file's derived text: {"fetch":[{"ref":"ID","select":[{"type":"whole","part":{"type":"file","file_id":"F"}}]}]}
limitNo
cursorNo
fieldsNoFilters, e.g. {"status": ["open"], "kind": "work", "owner": "me", "linked": "ID", "changed_days": 7}; text: a case-insensitive substring; kind: work, context, folder, record, message; inbox=me: your unseen messages; participant=[ID]: by or to; state is an initiative's; proposal=["proposed"] lists proposals.
formatNo
receiptNoA request_id: its stored write or review receipt.
max_bytesNo1024–65536; default set by depth
workspace_idNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description's second sentence adds genuinely non-obvious behavior about how a 'label: query …' result maps bare refs and KEY=VALUE pairs, but it says nothing about pagination (cursor/limit), what depth controls, or response size shaping beyond what the schema states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Only two sentences and no filler, with the mode list front-loaded. However the second sentence is a dense run-on about result-label parsing that forces re-reading, and the mode enumeration is packed into a semicolon chain rather than structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

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

For a 12-parameter, five-mode, nested-object tool with no output schema, the description covers the ref/query grammar but omits paging, depth semantics, format selection, and how the modes interact with limit/cursor. An agent can pick a mode but cannot confidently call it correctly in the list/pagination path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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

Schema coverage is 58%, so the schema already documents sort, wait, about, fetch, fields, receipt and max_bytes. The description adds the KEY=VALUE-to-fields mapping rule and the comma-as-list exception for text/linked/folder, which is real added meaning, but it leaves depth, limit, cursor, format and workspace_id entirely unaddressed in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

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

The description enumerates four modes (fetch by ref, list with fields, meaning search via about, receipt lookup), which goes beyond a tautology, but the phrasing is heavily compressed ('find what matters for about') and never names or distinguishes the siblings wirk_show or wirk_review, which plausibly overlap on reading records by ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

The only conditional offered is '(by meaning on Pro)' for the about mode. There is no statement of when to use this versus wirk_show or wirk_write, no prerequisites, and no exclusions; an agent must infer mode selection entirely from parameter names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wirk_reviewA
Idempotent

Accept, reject or defer proposals at the revision you read. Anyone whose role may review decides; other roles get not_authorized. A background agent never decides.

NameRequiredDescriptionDefault
formatNo
decisionsYes
request_idNo
workspace_idNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly=false and idempotent=true, so the description is not obligated to restate mutability. It adds genuinely non-schema behavior: the authorization failure mode (not_authorized) and the prohibition on background agents deciding, which an agent could not infer from structured fields. It leaves the stale-revision outcome and the effect of a rejection unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with no filler, and the core action is front-loaded. 'At the revision you read' is compressed to the point of being slightly cryptic, and 'A background agent never decides' reads as a fragment, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a mutation tool with no output schema and 0% schema coverage, the description covers the decision-critical pieces: who is permitted, what happens if not, and revision pinning. The remaining gaps (stale-revision conflict behavior, request_id idempotency key semantics) are real but secondary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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

Schema description coverage is 0%, so the description must carry the load, and it only partly does. It gives real semantic content for the decisions array (action verbs map to the enum, 'the revision you read' explains why revision is required and what pinning means), but reason, request_id, workspace_id and format are never mentioned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

States a specific set of verbs (accept, reject, defer) against a named resource (proposals) with a scoping constraint ('at the revision you read'). An agent knows exactly what operation this performs, though it never names a sibling tool to contrast against wirk_write or wirk_query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Explicitly defines eligibility ('Anyone whose role may review decides') and two exclusion cases: non-review roles receive not_authorized, and background agents never decide. That is concrete when/when-not guidance, but it stops short of routing the agent to a specific alternative for the excluded cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wirk_showC
Idempotent

A live read-only page for a person, from the preset status or a view config; returns its link. Anyone with the link can open it until it expires after 24 hours.

NameRequiredDescriptionDefault
titleNo
blocksNoView blocks; a refusal names the path and the allowed keys.
formatNo
presetNo
revokeNo
workspace_idNo

TDQS

C2.8/5.0
Behavior3/5

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

The description adds genuinely useful behavior beyond annotations: link-based open access, a 24-hour expiry, and that a link is returned. However, it omits that the tool mutates state (annotations correctly say readOnlyHint=false, which the wording 'read-only page' could mislead a reader into overlooking), and it does not explain what revoke does or whether anyone with the link can re-share.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the most decision-relevant facts (link return, expiry) front-loaded and no filler. Slight cost: cramming 'preset status or a view config' into one clause makes the input options harder to parse than a short list would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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

No output schema exists, and the description does usefully say a link is returned, so the return side is covered. Against 6 mostly-undocumented parameters and an undocumented revoke path, though, an agent still lacks enough to call this correctly in all but the simplest preset case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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

Schema description coverage is only 17% across 6 parameters, so the description must compensate and largely does not. It hints at 'preset' and 'view config' (blocks) but says nothing about title, format, workspace_id, or the operationally significant revoke string — the one parameter an agent most needs explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

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

The description conveys that a live shareable page for a person is produced and its link returned, which is a clear enough resource+outcome. But it never states the action verb (create/share), and the phrase 'live read-only page' describes the artifact rather than the operation, leaving ambiguity about whether this publishes or merely reads. Sibling differentiation is only implicit via 'preset status', which brushes against wirk_status without clarifying the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

There is no statement of when to choose this over wirk_status, wirk_query, or wirk_write, nor any prerequisites (workspace scoping, creation vs. revocation). The revoke parameter is never acknowledged, so an agent gets no routing signal for the teardown path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wirk_statusB
Read-onlyIdempotent

Start here: who you work for, your wirk, what waits, and recent changes. Writes nothing.

NameRequiredDescriptionDefault
taskNoOne line about your task; items that matter for it are listed.
formatNo
max_bytesNo
workspace_idNoWirkspace ID, full or short; omit for your only one.

TDQS

B3/5.0
Behavior2/5

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

'Writes nothing' merely restates the readOnlyHint=true and destructiveHint=false annotations, earning no additional credit. Nothing is said about output size behavior despite a max_bytes parameter, nor about how 'recent changes' are scoped (time window, workspace boundary). With annotations already covering the safety profile, the description adds essentially no new behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with 'Start here' so the agent gets the routing cue immediately. 'Writes nothing' is a wasted clause given the annotations already say so, but overall the text is tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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

For a zero-required-parameter read tool with full annotations and no output schema, the description gives an adequate sketch of the returned sections. It still leaves format vs. default text output, max_bytes truncation behavior, and the meaning of 'recent' unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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

Schema coverage is 50% and the description mentions no parameters at all — task, workspace_id, format and max_bytes are entirely undocumented in prose. The relevance-filtering behavior of 'task' is useful but lives only in the schema, so the description fails to compensate for the uncovered max_bytes and format parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

The description enumerates what the tool returns — 'who you work for, your wirk, what waits, and recent changes' — which reads as an orientation/dashboard summary rather than a query or write. 'Start here' establishes it as the entry point relative to siblings like wirk_query and wirk_show, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

'Start here' is real ordering guidance: call this first. But there is no statement of when to prefer wirk_query, wirk_review or wirk_show afterwards, and no exclusions or prerequisites. Usage is implied by sequencing only.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wirk_writeA
Idempotent

Change items and links atomically. In expect put each changed or linked-from item’s rN and the parent work of a contributes_to link; missing revisions get basis_changed. Context changes apply when you may make them; requires_review means propose with a reason.

NameRequiredDescriptionDefault
modeNo
expectNo{"<ID>": <revision you read>}, e.g. {"5c1e7a90": 3}.
formatNo
reasonNoWhy: required to propose and to archive; to complete wirk, the evidence (tests, link, file path or upload ID).
operationsYes1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id? (me or an ID), due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?, uploads?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?, reservation?, attach_uploads?}}; reservation occupied starts; occupied:G guards any edit; vacant:G releases; replace:G takes over (a reviewer, with a reason, when a person asks) · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites, relies_on or works_at (a person record to a company record), from/to may be $ref of a new item; a cites link also takes target_revision, selector, relation and quotation: the exact text, else quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id} · {op:message.send, ref?, data:{body, title?, to?:[principal], reply_to?, uploads?}}; a board post adds link.create related_to from its $ref to the item · {op:message.acknowledge, messages:[ID]}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears. uploads/attach_uploads: upload IDs or absolute local file paths, stored first; if one fails nothing is written.
request_idNoOptional; named in the receipt; set your own when attaching files. After an uncertain result, resend with that ID.
workspace_idNo

TDQS

A3.6/5.0
Behavior4/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=true) the description discloses the atomicity contract, optimistic-concurrency behavior via revisions ('missing revisions get basis_changed'), and the review/propose escalation path. It does not say what the receipt looks like or how partial failures are reported, but the safety profile added here is well above annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and there is no filler, but the two follow-on sentences are densely packed clauses that trade readability for brevity. For a tool with eight operation types, the compression pushes detail an agent needs out of reach rather than earning tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

The heavy per-operation detail correctly lives in the operations schema, so the description need not repeat it, and there is no output schema to explain. What remains missing is the receipt/return shape and the fact that reason is also mandatory for archiving, both of which the schema mentions only in passing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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

Schema coverage is 57%, and the description adds real meaning for 'expect' (which IDs and revisions to supply, and the contributes_to parent rule) and for 'reason' tied to proposing. It says nothing about 'mode', 'format', 'workspace_id' or 'request_id', and those gaps are only partially covered by the schema's own descriptions, so a baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

The first sentence gives a specific verb and resource set ('Change items and links atomically'), which cleanly separates it from the read-oriented siblings wirk_query, wirk_show and wirk_status. The remaining sentences stay on topic but rely on internal vocabulary (rN, basis_changed, contributes_to) that softens the clarity slightly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

'Context changes apply when you may make them; requires_review means propose with a reason' does hint at the apply-vs-propose decision, but only for the review case. It never names a sibling tool or states when to prefer this batch write over, say, wirk_review, and the conditions are phrased as jargon rather than decision rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.4.29
    • Changedwirk_query1 field changed
      • changedInput schema / properties / fields / description
        Previous value: -"Filters, e.g. {\"status\": [\"open\"], \"kind\": \"work\", \"owner\": \"me\", \"linked\": \"ID\", \"changed_days\": 7}; kind: work, context, folder, record, message; inbox=me: your unseen messages; participant=[ID]: by or to; state is an initiative's; proposal=[\"proposed\"] lists proposals."New value: +"Filters, e.g. {\"status\": [\"open\"], \"kind\": \"work\", \"owner\": \"me\", \"linked\": \"ID\", \"changed_days\": 7}; text: a case-insensitive substring; kind: work, context, folder, record, message; inbox=me: your unseen messages; participant=[ID]: by or to; state is an initiative's; proposal=[\"proposed\"] lists proposals."
    • Changedwirk_write1 field changed
      • changedInput schema / properties / operations / description
        Previous value: -"1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id?, due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?, uploads?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?, attach_uploads?}} · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites, relies_on or works_at (a person record to a company record), from/to may be $ref of a new item; a cites quotation must match the cited text exactly, or quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id} · {op:message.send, ref?, data:{body, title?, to?:[principal], reply_to?, uploads?}} · {op:message.acknowledge, messages:[ID]}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears. uploads/attach_uploads: upload IDs or absolute local file paths, stored first; if one fails nothing is written."New value: +"1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id? (me or an ID), due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?, uploads?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?, reservation?, attach_uploads?}}; reservation occupied starts; occupied:G guards any edit; vacant:G releases; replace:G takes over (a reviewer, with a reason, when a person asks) · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites, relies_on or works_at (a person record to a company record), from/to may be $ref of a new item; a cites link also takes target_revision, selector, relation and quotation: the exact text, else quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id} · {op:message.send, ref?, data:{body, title?, to?:[principal], reply_to?, uploads?}}; a board post adds link.create related_to from its $ref to the item · {op:message.acknowledge, messages:[ID]}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears. uploads/attach_uploads: upload IDs or absolute local file paths, stored first; if one fails nothing is written."
  2. 3 tool updatesv0.4.16
    • Changedwirk_review1 field changed
      • removedInput schema / properties / request_id / description
        Removed value: -"Optional; generated and named in the answer."
    • Changedwirk_status2 fields changed
      • removedInput schema / properties / format / description
        Removed value: -"text (default) or json."
      • changedInput schema / properties / task / description
        Previous value: -"Optional one line about your task; the items that matter for it are listed."New value: +"One line about your task; items that matter for it are listed."
    • Changedwirk_write2 fields changed
      • changedInput schema / properties / operations / description
        Previous value: -"1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id?, due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?}} · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites, relies_on or works_at (a person record to a company record), from/to may be $ref of a new item; a cites quotation must match the cited text exactly, or quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id} · {op:message.send, ref?, data:{body, title?, to?:[principal], reply_to?}} · {op:message.acknowledge, messages:[ID]}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears."New value: +"1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id?, due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?, uploads?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?, attach_uploads?}} · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites, relies_on or works_at (a person record to a company record), from/to may be $ref of a new item; a cites quotation must match the cited text exactly, or quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id} · {op:message.send, ref?, data:{body, title?, to?:[principal], reply_to?, uploads?}} · {op:message.acknowledge, messages:[ID]}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears. uploads/attach_uploads: upload IDs or absolute local file paths, stored first; if one fails nothing is written."
      • changedInput schema / properties / request_id / description
        Previous value: -"Optional; generated and named in the receipt. After an uncertain result, resend with that ID."New value: +"Optional; named in the receipt; set your own when attaching files. After an uncertain result, resend with that ID."
  3. 2 tool updatesv0.4.15
    • Changedwirk_query8 fields changed
      • changedInput schema / properties / about / description
        Previous value: -"Words; items ranked by meaning, or containing every word when ranking is unavailable."New value: +"Words; on Pro, items ranked by meaning; otherwise items containing every word."
      • changedInput schema / properties / fetch / description
        Previous value: -"Refs: ID, short ID, exact title, or ID@N for revision N."New value: +"Refs: ID, short ID, exact title, ID@N, or {ref, revision, select}; a file's derived text: {\"fetch\":[{\"ref\":\"ID\",\"select\":[{\"type\":\"whole\",\"part\":{\"type\":\"file\",\"file_id\":\"F\"}}]}]}"
      • addedInput schema / properties / fetch / items / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / fetch / items / type
        Removed value: -"string"
      • changedInput schema / properties / fields / description
        Previous value: -"Filters, e.g. {\"status\": [\"open\", \"in_progress\"], \"kind\": \"work\", \"owner\": \"me\", \"text\": \"exact words\", \"linked\": \"ID\", \"changed_days\": 7}; kind is work, context, folder or doc; state is an initiative's; proposal=[\"proposed\"] lists proposals."New value: +"Filters, e.g. {\"status\": [\"open\"], \"kind\": \"work\", \"owner\": \"me\", \"linked\": \"ID\", \"changed_days\": 7}; kind: work, context, folder, record, message; inbox=me: your unseen messages; participant=[ID]: by or to; state is an initiative's; proposal=[\"proposed\"] lists proposals."
      • addedInput schema / properties / max_bytes / description
        Added value: +"1024–65536; default set by depth"
      • addedInput schema / properties / sort / description
        Added value: +"sort=changed is newest first; leading - reverses"
      • addedInput schema / properties / wait
        Added value: +{
        +  "description": "With inbox=me: hold up to this many seconds (0–60) for a message.",
        +  "type": "integer"
        +}
    • Changedwirk_write1 field changed
      • changedInput schema / properties / operations / description
        Previous value: -"1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id?, due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?}} · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites or relies_on, from/to may be $ref of a new item; a cites quotation must match the cited text exactly, or quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears."New value: +"1-32 of: {op:item.create, ref?, data:{title, body?, work?:{owner_id?, due_at?, criteria?:[{text}]}, context?:{level, state?, steward_id?, open?}, fields?}, allow_duplicate_of?} · {op:item.edit, id, patch:{title?, body?, work?, fields?}} · {op:link.create, data:{type, from, to}}, type related_to, contributes_to, requires, cites, relies_on or works_at (a person record to a company record), from/to may be $ref of a new item; a cites quotation must match the cited text exactly, or quotation_mismatch · {op:link.remove, id} · {op:item.archive, id} · {op:item.restore, id} · {op:message.send, ref?, data:{body, title?, to?:[principal], reply_to?}} · {op:message.acknowledge, messages:[ID]}. work makes an item work, context makes it context (level organization or initiative); fields maps a field to an option, null clears."
  4. 5 tool updatesv0.4.0
    • First observedwirk_query
    • First observedwirk_review
    • First observedwirk_show
    • First observedwirk_status
    • First observedwirk_write

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation4/5

The tools are mostly distinct by role: query reads, write mutates, review decides proposals, show publishes a read-only view, and status gives a starting dashboard. Status, query, and show all involve reading, but their descriptions clarify different outputs and use cases.

Naming Consistency5/5

All tools share a clear wirk_ prefix and follow a predictable second-word pattern. The names are concise and consistently snake_case.

Tool Count5/5

Five tools are well-scoped for a work-item collaboration server. Each tool maps to a distinct lifecycle phase without obvious redundancy.

Completeness4/5

The surface covers reading, atomic writes, review decisions, sharing, and status, which is strong lifecycle coverage. Minor gaps remain around explicit create/delete/archive semantics, though wirk_write may cover some of these implicitly.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI models to perform IT service management operations on Freshservice, including managing tickets, changes, problems, releases, assets, projects, and more through a set of MCP tools.
    36
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI clients to access and manage an internal support ticket queue through MCP tools, resources, and prompts, including searching and viewing tickets, adding comments, closing tickets with confirmation, reading knowledge base articles, and viewing queue summaries over OAuth-secured Streamable HTTP.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents and humans to collaboratively manage kanban boards and Markdown documentation via MCP tools, with stable item keys, revision-safe editing, and full audit trails.
    MIT