Dutify
io.github.dutifyai/dutifydutifyaistreamable-httpv0.1.1Scanned
Whole Dutify suite in one server: Hub call recordings, projects, Codexum wiki, Roadmarq requests.
189 tools: 85 can delete or cancel things, 25 change things and 79 only read.
- Reads private data · 11
- Reads text others write · 119
- Can send data out · 8
- 8 findings
Anlyon alternative
110 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
189 tools
Deletes or cancels 85Claude Code: deny
fr_delete_bugPermanently delete a bug report.Reads text others writeNo findings
Why it is in this group
- The name "fr_delete_bug" says "delete": a word for removing or ending something.
- The description says "Permanently delete".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Permanently delete a bug report. Requires `Manage Queue` permission. Irreversible. API-key scope: `feedback:bugs:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_delete_requestPermanently delete a feature request.Reads text others writeNo findings
Why it is in this group
- The name "fr_delete_request" says "delete": a word for removing or ending something.
- The description says "Permanently delete".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Permanently delete a feature request. Requires `Manage Queue` permission. Returns 204 on success. This operation is irreversible — confirm with the user before calling unless the intent is unambiguous. API-key scope: `feedback:requests:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_moderate_bugApprove, reject, or mark a bug as spam.Reads text others writeNo findings
Why it is in this group
- The description's first verb is "approve": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Approve, reject, or mark a bug as spam. Action is case-insensitive. Requires `Manage Queue` permission. API-key scope: `feedback:moderation:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_moderate_requestApprove, reject, or mark a feature request as spam.Reads text others writeNo findings
Why it is in this group
- The name "fr_moderate_request" says "request": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Approve, reject, or mark a feature request as spam. Action is case-insensitive. Requires `Manage Queue` permission. API-key scope: `feedback:moderation:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_set_bug_assigneeAssign or unassign a bug.Reads text others writeNo findings
Why it is in this group
- The name "fr_set_bug_assignee" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Assign or unassign a bug. Provide `assigneeEmail` (resolved case-insensitive against workspace members) OR `assigneeId` (UUID). Exactly one; both = 400. Passing neither unassigns. API-key scope: `feedback:bugs:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_set_bug_statusChange a bug status by name (lenient match against the board's bug-status set).Reads text others writeNo findings
Why it is in this group
- The name "fr_set_bug_status" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Change a bug status by name (lenient match against the board's bug-status set). API-key scope: `feedback:bugs:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_set_bug_visibilityToggle a bug's public visibility.Reads text others writeNo findings
Why it is in this group
- The name "fr_set_bug_visibility" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Toggle a bug's public visibility. Security bugs stay private regardless. API-key scope: `feedback:bugs:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_set_request_statusChange a feature request's status by name.Reads text others writeNo findings
Why it is in this group
- The name "fr_set_request_status" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Change a feature request's status by name. The name is resolved leniently against the request's board's status set (trim + case-insensitive). Returns the updated request detail. API-key scope: `feedback:requests:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_toggle_bug_affectedToggle the caller's "I'm affected" marker on a bug.Reads text others writeNo findings
Why it is in this group
- The name "fr_toggle_bug_affected" says "toggle": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Toggle the caller's "I'm affected" marker on a bug. Returns the updated bug detail with new affectedCount. API-key scope: `feedback:bugs:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
fr_vote_requestToggle a vote or emoji reaction on a feature request.Reads text others writeNo findings
Why it is in this group
- The name "fr_vote_request" says "request": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Toggle a vote or emoji reaction on a feature request. Passing emoji=null or omitting the field registers a plain upvote. Calling the tool again with the same emoji removes the vote (idempotent toggle). API-key scope: `feedback:votes:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_clear_call_custom_promptRemove the caller's own per-call prompt.Reads text others writeNo findings
Why it is in this group
- The name "hub_clear_call_custom_prompt" says "call": a word for a change.
- The description's first verb is "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove the caller's own per-call prompt. Their next hub_regenerate_summary uses their instruction set without a per-call prompt. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_clear_event_custom_promptRemove one occurrence's own prompt.Reads text others writeNo findings
Why it is in this group
- The description's first verb is "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove one occurrence's own prompt. The series prompt, if any, keeps applying on its own — nothing 'falls back', the series prompt was already in use. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_clear_series_custom_promptRemove a series' custom prompt.Reads text others writeNo findings
Why it is in this group
- The description's first verb is "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove a series' custom prompt. Each occurrence keeps only its own prompt, if it has one. Never clear a series prompt to 'avoid a conflict' with an occurrence prompt: there is no conflict, both apply, and clearing it drops instructions every other occurrence relies on. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_delete_callDelete a call by ID.Reads text others writeNo findings
Why it is in this group
- The name "hub_delete_call" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a call by ID. Hard-deletes both the UserCall metadata and the underlying recording media. NOT REVERSIBLE — use with care. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_lens_chatRun a Lens chat query against the workspace's knowledge (recordings, calls, transcripts, integrated SaaS data).Reads text others writeNo findings
Why it is in this group
- The description's first verb is "run": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Run a Lens chat query against the workspace's knowledge (recordings, calls, transcripts, integrated SaaS data). Returns the synthesized answer as a string. Pass `lastMessage` (the new user turn) and optionally `history` (prior turns). For multi-turn conversations the agent SHOULD pass an accumulating history so Lens can resolve references like "the last call we discussed". Calls can take 15-30s on synthesis-heavy queries; the MCP timeout is generous to allow this. Requires lens:chat scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_regenerate_summaryRe-run the analysis for the CALLER's own version of the summary, key points, action items and (when they have notes) enhanced notes, against the existing transcript and using their…Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Re-run the analysis for the CALLER's own version of the summary, key points, action items and (when they have notes) enhanced notes, against the existing transcript and using their CURRENT instruction set (workspace prompt, per-call prompt, notes and note template). Other participants' versions are never touched. Cheaper than `hub_reprocess_recording`. Returns the new summary text. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_reprocess_recordingRe-run the FULL pipeline on a recording: transcription + summary + key points + action items.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Re-run the FULL pipeline on a recording: transcription + summary + key points + action items. Slower and more expensive than `hub_regenerate_summary`. Use when a fresh transcription would meaningfully improve the result (different language detection, speaker diarization fix, etc.). Returns the updated recording DTO. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_send_call_to_airtablePush a call's extracted tasks into Airtable rows under one base + one or more tables.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "hub_send_call_to_airtable" says "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "hub_send_call_to_airtable" says "send": it sends or publishes something to other people.
Description, as the server wrote it Push a call's extracted tasks into Airtable rows under one base + one or more tables. Requires recordings:write scope AND an Airtable integration on the workspace. Same return-shape caveat as `hub_send_call_to_jira` — boolean response = "request accepted", not "actually pushed".
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_send_call_to_clickupPush a call's extracted tasks into a ClickUp list.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "hub_send_call_to_clickup" says "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "hub_send_call_to_clickup" says "send": it sends or publishes something to other people.
Description, as the server wrote it Push a call's extracted tasks into a ClickUp list. Requires recordings:write scope AND a ClickUp integration on the workspace. Same return-shape caveat as `hub_send_call_to_jira` — boolean response = "request accepted", not "actually pushed".
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_send_call_to_jiraPush a call's extracted tasks into one or more Jira projects under the same cloud.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "hub_send_call_to_jira" says "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "hub_send_call_to_jira" says "send": it sends or publishes something to other people.
Description, as the server wrote it Push a call's extracted tasks into one or more Jira projects under the same cloud. Hub fans the action items out across the listed projects. Requires recordings:write scope AND a Jira integration on the workspace (see `hub_list_integrations`). IMPORTANT: returns boolean — `true` means Hub ACCEPTED the request, NOT that it actually landed in Jira. The vendor push happens async and silently fails on bad cloudId/project/expired tokens. To confirm landing, call `hub_get_call` again and check that `jiraProjectId` is populated.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_set_call_custom_promptSet the custom prompt on an already-recorded call, by its integer call id.Reads text others writeNo findings
Why it is in this group
- The name "hub_set_call_custom_prompt" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Set the custom prompt on an already-recorded call, by its integer call id. This is the right tool for meetings that never had a calendar event (ad-hoc desktop or bot recordings), and for re-analysing a call differently. It is the CALLER's own prompt: it shapes only their version of the summary, key points, action items and enhanced notes. Stored only — follow it with hub_regenerate_summary to rebuild that version. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_set_custom_promptUpdate the workspace's custom prompt.Reads text others writeNo findings
Why it is in this group
- The name "hub_set_custom_prompt" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update the workspace's custom prompt. Pass null or empty string to clear it. Takes effect on the next recording processed, or on hub_regenerate_summary for an existing one; existing recordings are not re-analysed automatically. Requires workspace-settings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_set_default_workspaceSet the user's "default workspace" to the workspace this API key is bound to (future calendar events without an explicit workspace will route here).Reads text others writeNo findings
Why it is in this group
- The name "hub_set_default_workspace" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Set the user's "default workspace" to the workspace this API key is bound to (future calendar events without an explicit workspace will route here). To clear the default entirely, pass { clear: true }. The MCP fills the workspace UUID from the selected workspace (or the workspace bound to a workspace key) automatically — agents do not need to (and cannot) target a different workspace from this key. Requires user-settings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_set_event_custom_promptSet the custom prompt for ONE calendar occurrence.Reads text others writeNo findings
Why it is in this group
- The name "hub_set_event_custom_prompt" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Set the custom prompt for ONE calendar occurrence. For a series occurrence it is applied TOGETHER with the series prompt (and the workspace prompt), not instead of them; for a one-off meeting it is the meeting's only per-call prompt. Takes effect the next time that meeting is processed. Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_set_preferred_integrationSet the workspace's preferred integration target.Reads text others writeNo findings
Why it is in this group
- The name "hub_set_preferred_integration" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Set the workspace's preferred integration target. The value should be the integration system name returned by `hub_list_integrations` (e.g. "JIRA", "CLICKUP", "AIRTABLE", "PM"). Requires workspace-settings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
hub_set_series_custom_promptSet the custom prompt for an entire recurring series.Reads text others writeNo findings
Why it is in this group
- The name "hub_set_series_custom_prompt" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Set the custom prompt for an entire recurring series. Applies to every occurrence, IN ADDITION to any occurrence-specific prompt set with hub_set_event_custom_prompt (both are applied when both are set). Requires recordings:write scope.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_add_comment_reactionAdd an emoji reaction to a task comment.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "pm_add_comment_reaction" says "add": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "pm_add_comment_reaction" says "add" and "comment": it writes something other people read.
Description, as the server wrote it Add an emoji reaction to a task comment. `reactionType` is the emoji code (e.g. "thumbs_up", "heart", "smile"). Each user may add at most one reaction of each reactionType per comment. Requires COMMENT-level access on the task. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_add_tasks_to_sprintAssociate tasks with a sprint.Reads text others writeNo findings
Why it is in this group
- The name "pm_add_tasks_to_sprint" says "add": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Associate tasks with a sprint. All tasks must belong to the same space as the sprint group. Pass identifiers (tsk_…), not task keys. Returns updated SprintDTO. API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_add_team_memberAdd a single user to a team.Reads text others writeNo findings
Why it is in this group
- The name "pm_add_team_member" says "add": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Add a single user to a team. Pass the user UUID (from pm_list_workspace_members). Idempotent — adding a user who is already a member is a no-op. Requires MANAGE_TEAMS. API-key scope: `teams:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_bulk_change_task_typeChange the task type for many tasks at once (≤5000 per call).Reads text others writeNo findings
Why it is in this group
- The name "pm_bulk_change_task_type" says "type": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Change the task type for many tasks at once (≤5000 per call). `taskIdentifiers` are stable wire identifiers (e.g. tsk_…) — task keys (PROJ-42) are NOT accepted here; use pm_search_tasks first if you only have keys. `taskType` is a name (e.g. "Bug") or null to clear the type. Returns 200 sync for ≤500 tasks; 202 with a {jobId, statusUrl} for larger batches — poll the statusUrl for completion. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_cancel_invitationRevoke a pending workspace invitation by its identifier.Reads text others writeNo findings
Why it is in this group
- The name "pm_cancel_invitation" says "cancel": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Revoke a pending workspace invitation by its identifier. Caller needs MANAGE_USERS permission. Returns 204. API-key scope: `users:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_change_member_roleChange a member's workspace access level.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Change a member's workspace access level. `userUuid` is the target user's UUID (NOT email — call pm_list_workspace_members first to find it). `workspaceAccessLevelId` is a numeric Long id from the workspace `/access-levels` catalogue (e.g. 1, 2, 3) — fetch it via the catalog meta tools or your existing endpoint introspection if you don't already have it. Caller needs MANAGE_USERS permission. Note: this endpoint is HTTP PUT on the collection path (not PATCH on a sub-resource). API-key scope: `workspaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_complete_sprintTransition a sprint from IN_PROGRESS to DONE.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Transition a sprint from IN_PROGRESS to DONE. Optionally pass `rolloverSprintIdentifier` to move incomplete tasks into a different sprint (typically the next one in the group). Omit the field to leave incomplete tasks unsorted (no rollover). API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_configure_task_sharingEnable, disable, or reconfigure public sharing for a task.Reads text others writeNo findings
Why it is in this group
- The description's first verb is "enable": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Enable, disable, or reconfigure public sharing for a task. Pass `shared: true` to generate a public link (or refresh the configuration); the response includes the resulting publicLink. Pass `shared: false` to revoke an existing share. All other fields are optional toggles for which slices of the task are visible to a public viewer. Requires FULL access to the task. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_confirm_import_mappingsConfirm column mappings for a previewed CSV import job and start async import processing.Reads text others writeNo findings
Why it is in this group
- The name "pm_confirm_import_mappings" says "import": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Confirm column mappings for a previewed CSV import job and start async import processing. Call this AFTER another (non-MCP) client has uploaded the CSV via /csv/preview and produced a job in PREVIEW status. `columnMappings` is a non-empty array of objects with: csvHeader (exact CSV column name), targetField (e.g. 'title', 'status', or a custom field identifier), and targetType ('builtin' or 'custom_field'). API-key scope: `imports:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_automationDelete an automation rule.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_automation" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete an automation rule. Returns 204. Existing audit log rows are preserved. API-key scope: `automations:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_custom_fieldDelete a custom field and all its values.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_custom_field" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a custom field and all its values. Requires FULL access. 204. API-key scope: `custom_fields:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_folderSoft-delete a folder and its child lists+tasks.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_folder" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Soft-delete a folder and its child lists+tasks. Requires FULL access. 204. API-key scope: `folders:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_listSoft-delete a list and its tasks.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_list" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Soft-delete a list and its tasks. Requires FULL access. 204. API-key scope: `lists:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_saved_filterDelete a saved filter you own.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_saved_filter" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a saved filter you own. NOTE: `id` is a numeric Long (e.g. 42), NOT a slug. Only the owner may delete. Returns 204. There is NO endpoint to "apply" a saved filter — that is a UI affordance only. API-key scope: `filters:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_sprintSoft-delete a sprint.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_sprint" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Soft-delete a sprint. Tasks lose their sprint association but remain in their lists. 204 on success. API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_tagDelete a tag.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_tag" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a tag. The tag is removed from every task that currently carries it; the tasks themselves are not affected. Returns 204. API-key scope: `tags:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_taskDelete a task by ref.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_task" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a task by ref. Cascade-deletes subtasks. Requires FULL access (not just EDIT). Returns 204 on success. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_task_commentDelete a comment.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_task_comment" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a comment. Only the original author may delete. Returns 204. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_task_relationshipDelete a relationship by identifier.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_task_relationship" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a relationship by identifier. Returns 204. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_teamDelete a team.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_team" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a team. Removes the team and all of its grants — existing access controls that referenced this team are reduced accordingly. Returns 204. Requires the workspace MANAGE_TEAMS permission. API-key scope: `teams:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_time_entryDelete a time entry from a task.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_time_entry" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a time entry from a task. NOTE: `timeEntryId` is a numeric Long (e.g. 42), NOT a slug/identifier. Returns 204 on success. API-key scope: `time:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_viewDelete a view by identifier.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_view" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a view by identifier. Mandatory views (system-created defaults) return 409 Conflict. Returns 204 on success. API-key scope: `views:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_delete_webhookDelete a webhook subscription permanently.Reads text others writeNo findings
Why it is in this group
- The name "pm_delete_webhook" says "delete": a word for removing or ending something.
- The description says "cannot be recovered".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Delete a webhook subscription permanently. Stops all future deliveries. Returns 204. The HMAC secret cannot be recovered — recreate the webhook to get a new one. API-key scope: `webhooks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_leave_workspaceVoluntarily leave the current workspace.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Voluntarily leave the current workspace. WARNING: this affects the calling user (the user identity behind the API key) — there is no parameter to pick a different user. The workspace owner cannot leave; they must transfer ownership first. After a successful leave the API key may stop working against this workspace. No body. API-key scope: `workspaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_mark_all_notifications_readMark every unread notification in the active workspace as read for the current user.Reads text others writeNo findings
Why it is in this group
- The name "pm_mark_all_notifications_read" says "mark": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Mark every unread notification in the active workspace as read for the current user. API-key scope: `notifications:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_mark_notification_readMark a single notification as read.Reads text others writeNo findings
Why it is in this group
- The name "pm_mark_notification_read" says "mark": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Mark a single notification as read. Only the notification owner may do this — calling with another user's notification identifier returns an error. API-key scope: `notifications:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_remove_comment_reactionRemove a reaction by identifier.Reads text others writeNo findings
Why it is in this group
- The name "pm_remove_comment_reaction" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove a reaction by identifier. Only the user who added the reaction may remove it. 204. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_remove_tasks_from_sprintRemove task-sprint associations.Reads text others writeNo findings
Why it is in this group
- The name "pm_remove_tasks_from_sprint" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove task-sprint associations. Tasks remain in their lists. Pass identifiers (tsk_…), not task keys. Returns updated SprintDTO. API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_remove_team_memberRemove a single user from a team.Reads text others writeNo findings
Why it is in this group
- The name "pm_remove_team_member" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove a single user from a team. Returns 204. Requires MANAGE_TEAMS. API-key scope: `teams:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_remove_workspace_memberRemove a member from the workspace.Reads text others writeNo findings
Why it is in this group
- The name "pm_remove_workspace_member" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Remove a member from the workspace. NOTE: the target user UUID is passed as the `deletionUserUuid` QUERY parameter, not in the path or body. Caller needs MANAGE_USERS permission. Cannot remove the workspace owner — transfer ownership first via pm_transfer_workspace_ownership. Returns 204. API-key scope: `workspaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_replay_webhook_deliveryRe-send a specific past delivery to the webhook URL.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Re-send a specific past delivery to the webhook URL. Useful when the subscriber was down during the original attempt window or you need to re-trigger downstream processing. Replays use the same payload, signature, and X-Webhook-Delivery id as the original — subscribers MUST treat receipt of a duplicate delivery id as idempotent. API-key scope: `webhooks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_save_filterCreate a new saved filter on a list.Reads text others writeNo findings
Why it is in this group
- The name "pm_save_filter" says "save": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new saved filter on a list. Body is a FilterAggregateDTO with structured `filterGroups` — each group has a `precedingLogic` (AND/OR) and a list of filters. Each filter has `field`, `operator` (one of: is, equals, not, not_equals, like, greater_than, less_than, greater_or_equal, less_or_equal, is_set, is_not_set, in, not_in), `value`, optional `precedingLogic`, and `isCustomField` flag. Max 10 groups, max 20 filters per group. No PATCH/PUT exists — to edit, delete + re-create. API-key scope: `filters:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_send_invitationSend an email invitation to join the current workspace.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "pm_send_invitation" says "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "pm_send_invitation" says "send": it sends or publishes something to other people.
Description, as the server wrote it Send an email invitation to join the current workspace. `workspaceAccessLevelId` is a numeric Long id (NOT a name like "admin"/"member") — fetch the catalogue from /v1/workspaces/{ws}/access-levels to translate role names to ids before calling. Caller needs MANAGE_USERS permission. Returns 201 on success. API-key scope: `users:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_start_sprintTransition a sprint from NOT_STARTED to IN_PROGRESS.Reads text others writeNo findings
Why it is in this group
- The name "pm_start_sprint" says "start": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Transition a sprint from NOT_STARTED to IN_PROGRESS. Only ONE sprint per group can be IN_PROGRESS at a time — starting a sprint while another is in progress will fail. No body. API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_test_webhookFire a synthetic test delivery to a webhook on demand, without waiting for a real workspace event.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Fire a synthetic test delivery to a webhook on demand, without waiting for a real workspace event. PM POSTs a `webhook-test` event with body {"test": true, "message": "This is a test webhook delivery"} to the registered URL, signed with the same X-Webhook-Signature-256 HMAC as live deliveries. Use this to verify a receiver is reachable and that your HMAC signature-verification is correct when setting up two-way communication. Returns the resulting delivery record (status, attempt, timestamps) — inspect it (or pm_list_webhook_deliveries) to confirm the endpoint accepted it. API-key scope: `webhooks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_transfer_workspace_ownershipTransfer workspace ownership to another existing member.Reads text others writeNo findings
Why it is in this group
- The name "pm_transfer_workspace_ownership" says "transfer": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Transfer workspace ownership to another existing member. Only the current owner can do this, and the target user must already be a member. `resultingOwnerAccessLevelId` is the numeric access-level id the CURRENT (departing) owner will keep — typically a regular admin/member level. Discover access-level ids via /v1/workspaces/{ws}/access-levels. API-key scope: `workspaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_automationUpdate an existing automation.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_automation" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update an existing automation. All fields except `identifier` are optional — only specified fields change. `triggers`, `actions`, and `conditionNodes`, when present, REPLACE the existing collection (not append). Use `active: false` to disable without deleting. API-key scope: `automations:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_current_userUpdate the current user's profile.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_current_user" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update the current user's profile. Today the request body has a single field (`fullName`) — pass the new display name. Returns the updated TaskManagementUserDTO. API-key scope: `users:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_custom_fieldUpdate custom-field metadata (name / description / emoji / color / isPrivate).Reads text others writeNo findings
Why it is in this group
- The name "pm_update_custom_field" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update custom-field metadata (name / description / emoji / color / isPrivate). API-key scope: `custom_fields:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_folderUpdate folder metadata by identifier (fld_…).Reads text others writeNo findings
Why it is in this group
- The name "pm_update_folder" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update folder metadata by identifier (fld_…). All fields optional. API-key scope: `folders:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_listUpdate list metadata by identifier (tl_…).Reads text others writeNo findings
Why it is in this group
- The name "pm_update_list" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update list metadata by identifier (tl_…). All fields optional. API-key scope: `lists:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_notification_channelEnable or disable a single notification module/channel combination — e.g.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_notification_channel" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Enable or disable a single notification module/channel combination — e.g. email-off for due-date reminders. The module names come from pm_get_notification_settings. Pass `enabled: true|false`. To bulk-toggle all channels for a module, repeat this tool for each channel; there is no bulk endpoint. API-key scope: `users:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_sprintFull update of sprint name, goal, and date window.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_sprint" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Full update of sprint name, goal, and date window. NOTE: this is a PUT, not a PATCH — fields you omit may be cleared by the backend. Pass every field you want to keep. API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_tagRename or recolor an existing tag.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_tag" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Rename or recolor an existing tag. All updatable fields are optional — pass only what you want to change. The tag identifier stays the same; any task already tagged keeps the new name and colors automatically. API-key scope: `tags:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_taskPartial-update a task by ref.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_task" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Partial-update a task by ref. Only fields present in the call are changed. Pass an explicit null to clear nullable fields (dueDate, parent, taskType, etc.). Names resolve leniently against the current effective set. To change just the type and nothing else, prefer this with `taskType` set; use `pm_bulk_change_task_type` when changing many tasks at once. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_task_commentUpdate an existing comment.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "pm_update_task_comment" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "pm_update_task_comment" says "update" and "comment": it writes something other people read.
Description, as the server wrote it Update an existing comment. Only the original author may edit. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_teamUpdate a team's metadata or replace its full member list.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_team" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update a team's metadata or replace its full member list. All fields are optional — only specified fields change. NOTE: `memberUuids`, if present, REPLACES the existing membership (not appends). Use pm_add_team_member / pm_remove_team_member for incremental changes. Requires the workspace MANAGE_TEAMS permission. API-key scope: `teams:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_viewUpdate a view, including the auto-created primary List view when finishing list setup.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_view" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update a view, including the auto-created primary List view when finishing list setup. Configure useful column order, grouping, and sorting instead of leaving a defaults-only view. filters / columns use FilterGroupDTO / ColumnOrderItem shapes. Sending columns replaces the entire selection/order: include every native and custom field that should remain visible. Use raw custom-field identifiers from pm_get_workspace_context. Header icons belong in custom-field emoji/color metadata. Read back the rich resource-view configuration for verification; Lite GET/list responses omit columns and filters. API-key scope: `views:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
pm_update_webhookPartial-update a webhook subscription.Reads text others writeNo findings
Why it is in this group
- The name "pm_update_webhook" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Partial-update a webhook subscription. Only fields present in the call are changed (pass-through PATCH-style semantics). Use `active: false` to pause deliveries without deleting. Updating eventTypes replaces the full subscribed set. Does not return or rotate the HMAC secret. API-key scope: `webhooks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_confirm_attachmentStep 3 of uploading: confirm that the bytes were successfully PUT to the presigned `uploadUrl`, activating the attachment.Reads text others writeNo findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Step 3 of uploading: confirm that the bytes were successfully PUT to the presigned `uploadUrl`, activating the attachment. Returns the WikiAttachmentDTO (status becomes "confirmed"). Call only after the byte PUT succeeded. API-key scope: `wiki:attachments:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_delete_attachmentPermanently delete an attachment and its stored file (returns 204).Reads text others writeNo findings
Why it is in this group
- The name "wiki_delete_attachment" says "delete": a word for removing or ending something.
- The description says "Permanently delete".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Permanently delete an attachment and its stored file (returns 204). Useful for cleaning up unused or leftover uploads. This does not remove image nodes that still reference it in a page body — update the page content separately if needed. API-key scope: `wiki:attachments:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_delete_pageArchive (soft-delete) or permanently delete a wiki page by slug.Reads text others writeNo findings
Why it is in this group
- The name "wiki_delete_page" says "delete": a word for removing or ending something.
- The description says "permanently delete".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Archive (soft-delete) or permanently delete a wiki page by slug. Falls through to the non-lite Wiki Pages API since there is no lite delete endpoint — path is `DELETE /v1/workspaces/{workspaceIdentifier}/wiki/spaces/{spaceKey}/pages/{slug}` with optional `?permanent=true`. Default behavior archives the page (soft delete); pass `permanent: true` to hard-delete (requires admin access). Returns 204 on success. API-key scope: `wiki:pages:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_delete_spacePERMANENTLY delete a wiki space AND every page inside it.Reads text others writeNo findings
Why it is in this group
- The name "wiki_delete_space" says "delete": a word for removing or ending something.
- The description says "PERMANENTLY delete".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it PERMANENTLY delete a wiki space AND every page inside it. Requires admin access to the space. This is destructive — surface a clear confirmation to the user before calling. Returns 204. API-key scope: `wiki:spaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_move_pageMove a wiki page to a new parent and/or a new space.Reads text others writeNo findings
Why it is in this group
- The name "wiki_move_page" says "move": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Move a wiki page to a new parent and/or a new space. All body fields are optional and use slugs (resolved server-side in the target space) instead of UUIDs: `targetSpaceKey` for cross-space moves (omit to stay in the current space); `newParent` is the slug of the new parent page (omit/null to move to space root); `afterPage` is the slug of the sibling page to insert after (omit/null to place first). Returns the moved page DTO. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:pages:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_set_public_settingsPublish / unpublish a space to the PUBLIC INTERNET, or update its public-site config.Reads text others writeNo findings
Why it is in this group
- The name "wiki_set_public_settings" says "set": a word for a change.
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote itContains invisible characters, shown as [U+…] Publish / unpublish a space to the PUBLIC INTERNET, or update its public-site config. This is the REAL publish switch — NOT the space `isPublic` flag (which is internal visibility). Pass only the fields you want to change: `isEnabled` (true = publish to the web, false = take offline), `customSlug` (public URL slug — validate first with wiki_check_public_slug), `allowedEmojis` (string[]), `showReactions`, `showPageViews`, `showLastUpdated`, `showAuthor`, `viewMode` ("space"|"helpcenter"), `heroTitle`, `heroSubtitle`. Provided fields are merged onto the current settings (read-modify-write), so unspecified fields are preserved. Minimal publish: { isEnabled: true, customSlug: "my-docs" }. ⚠[U+FE0F] HIGH-TRUST / OUTWARD-FACING: enabling makes the space readable by ANYONE on the internet — confirm with the user before publishing. Requires space ADMIN. API-key scope: `wiki:spaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_update_pageUpdate an existing wiki page by slug.Reads text others writeNo findings
Why it is in this group
- The name "wiki_update_page" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update an existing wiki page by slug. Any field left unset preserves the current value. Pass EITHER `markdown` OR `content` (TipTap/ProseMirror JSON) for the body — they're mutually exclusive. Use `content` for rich features (banners, collapsibles, mermaid, etc.); call get_endpoint_examples(tag="Wiki Pages (Lite)") for the full doc shape. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:pages:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
wiki_update_spaceUpdate a wiki space's metadata.Reads text others writeNo findings
Why it is in this group
- The name "wiki_update_space" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Update a wiki space's metadata. All fields are optional — pass only what you want to change. The space key cannot be changed. Requires edit access to the space. API-key scope: `wiki:spaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
Changes things 25Claude Code: ask
fr_comment_bugAdd a comment to a bug report.Reads text others writeNo findings
Why it is in this group
- The name "fr_comment_bug" says "comment": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Add a comment to a bug report. Pass isInternal=true for internal-only. API-key scope: `feedback:comments:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
fr_comment_requestAdd a comment to a feature request.Reads text others writeNo findings
Why it is in this group
- The name "fr_comment_request" says "comment": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Add a comment to a feature request. Pass isInternal=true to make the comment visible only to users with `View Internal Data` permission. API-key scope: `feedback:comments:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
fr_create_bugCreate a new bug report on a board.Reads text others writeNo findings
Why it is in this group
- The name "fr_create_bug" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new bug report on a board. Severity and productArea are resolved by name (lenient match). Environment is a free-form map (browser, OS, url, etc.). API-key scope: `feedback:bugs:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
fr_create_requestCreate a new feature request on a board.Reads text others writeNo findings
Why it is in this group
- The name "fr_create_request" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new feature request on a board. Category is resolved by name (lenient match). No turnstile token required — API-key authentication is sufficient. Returns the new request with assigned shortId. API-key scope: `feedback:requests:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
hub_get_audio_urlGenerate a short-lived signed URL to download the recording's audio (typically MP3 or WAV).Reads text others write1 finding
Why it is in this group
- The name "hub_get_audio_url" says "get": a word for reading.
- The description's first verb is "generate": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
What it can reach
- untrusted-inputThe name "hub_get_audio_url" says "get" and "url": it reads web pages, which anyone can write.
- untrusted-inputThe description's first sentence says "generate" and "url": it reads web pages, which anyone can write.
Findings
- Warn
The server marks "hub_get_audio_url" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "hub_get_audio_url" says "get": a word for reading.
Description, as the server wrote it Generate a short-lived signed URL to download the recording's audio (typically MP3 or WAV). The URL is valid for `expiryMinutes` minutes (default 30, max enforced by Hub). The agent should NOT cache the URL — request a fresh one each time the audio is needed. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_clone_viewClone an existing view into a (possibly different) scope.Reads text others write1 finding
Why it is in this group
- The name "pm_clone_view" says "view": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Warn
The server marks "pm_clone_view" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "pm_clone_view" says "view": a word for reading.
Description, as the server wrote it Clone an existing view into a (possibly different) scope. Requires VIEW on the source and EDIT on the target scope. API-key scope: `views:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_automationCreate an automation rule.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_automation" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create an automation rule. Exactly ONE scope must be set — `listIdentifier` OR `folderIdentifier` OR `spaceIdentifier`. `triggers` and `actions` are arrays; `conditionNodes` is the flattened condition tree (omit for "always-true"). All `parameters` fields on triggers/actions/conditions are JSON-encoded strings, not nested objects. Before crafting, call pm_list_reference_data to learn the valid action/condition/trigger types. API-key scope: `automations:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_custom_fieldCreate a custom field at workspace / space / list scope.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_custom_field" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a custom field at workspace / space / list scope. scope=workspace ignores scopeName; scope=space takes a space name; scope=list takes a list name (first match in the workspace). For dropdown / labels (multi-select) types, pass `options` as an array of {value, color?, emoji?, orderIndex?}. Keep field names plain for column headers; set semantic emoji/color metadata for visual icons, using supported keys from pm_list_reference_data (custom-field-icon-options). Reuse suitable existing fields before creating another; color dropdown/label options consistently. CREATING A FIELD IS NOT ENOUGH TO MAKE IT VISIBLE: a custom field only shows up where it's added to a view's columns. After creating fields for a list, finish by creating/updating a view (pm_create_view / pm_update_view) whose `columns` include these fields, or the list keeps a defaults-only, empty-looking view. API-key scope: `custom_fields:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_folderCreate a folder inside a space.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_folder" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a folder inside a space. Space identified by name. API-key scope: `folders:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_listCreate a task list inside a space (optionally inside a folder).Reads text others writeNo findings
Why it is in this group
- The name "pm_create_list" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a task list inside a space (optionally inside a folder). Space and folder are identified by name. Omit folder to create the list directly under the space. Prefer setting icon and color on create when the list purpose is known. For icon, prefer a semantic emoji name first; use an icon identifier only when no emoji fits. List setup is not finished after this call: unless the user requested a bare list, reuse/add relevant custom fields with emoji/color header metadata, refresh pm_get_workspace_context, then use pm_list_views and pm_update_view to configure the auto-created primary view with explicit ordered columns and useful grouping/sorting. Verify the saved configuration before reporting completion. API-key scope: `lists:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_spaceCreate a new space in the current workspace.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_space" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new space in the current workspace. Description / icon / color / isPrivate are optional metadata. Returns LiteSpaceResponse. API-key scope: `spaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_sprintCreate a sprint inside a sprint group.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_sprint" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a sprint inside a sprint group. New sprints start in NOT_STARTED state. `name` required (max 200 chars). `goal`, `startDate`, `endDate` optional (ISO-8601 instants for dates). API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_sprint_groupCreate a sprint group inside a space.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_sprint_group" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a sprint group inside a space. `name` is required (max 100 chars). `description` is optional (max 2000 chars). `defaultDurationDays` is the default sprint length used when creating new sprints (1–90 days, optional). API-key scope: `sprints:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_tagCreate a new tag in a space.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_tag" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new tag in a space. Tags are auto-created on first inline use (e.g. `tags: ["urgent"]` when creating a task via the Lite API), so use this only when you need to pre-create a tag with specific colors before applying it. Returns the persisted TagDTO with its identifier. API-key scope: `tags:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_taskCreate a task.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_task" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a task. In the result, title/webUrl are for presentation; displayKey is the optional visible key. Keep key/identifier for API calls and do not expose a hidden raw key in the summary. References are name-based: status/priority/level/taskType are names; assignees are emails; tags are strings (auto-created if missing); customFields is a {name: value} map. `list` is the task-list identifier (tl_…). For subtasks, set `parent` to a task key or identifier (omit `list` and the parent's list is used). Task type is OPTIONAL: omit `taskType` to inherit the closest non-null default along the three-level chain `list → folder → space`. There's NO workspace-level fallback — if all three are null the task is created untyped (`taskType: null` in the response), which is a valid persistent state. Use `pm_list_task_types` to see what types this workspace has (9 SYSTEM rows seeded at workspace creation, plus any CUSTOM ones). MANDATORY CUSTOM FIELDS: a list can mark custom fields required (isMandatory, per field via pm_get_workspace_context). Populate them in `customFields` on create AND update — the API rejects a write that leaves one empty with HTTP 400 errorCode VALIDATION_ERROR, details.field = the field's display name; the message also names it (e.g. Mandatory custom field 'Priority' requires a value). Fix and retry; don't ask the user as a substitute. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_task_commentAdd a comment to a task.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "pm_create_task_comment" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "pm_create_task_comment" says "create" and "comment": it writes something other people read.
Description, as the server wrote it Add a comment to a task. `mentions` is an array of emails — the server resolves them to user UUIDs and substitutes `@<email>` literals in `text` with mention spans. Pass `replyTo` (a comment identifier) to thread. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_task_relationshipCreate a relationship from one task to another.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_task_relationship" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a relationship from one task to another. `type` is the relationship-type name in the workspace (e.g. "Blocking"). `target` is a task key or identifier. The current task (ref) is the owner. API-key scope: `tasks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_teamCreate a new team in the current workspace.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_team" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new team in the current workspace. Returns the persisted TeamDTO including its identifier. Requires the workspace MANAGE_TEAMS permission. API-key scope: `teams:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_viewCreate a view.Reads text others writeNo findings
Why it is in this group
- The name "pm_create_view" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a view. type is one of list / board / table / dashboard / gantt / calendar / gallery. For a newly created list, prefer configuring its auto-created primary view with pm_update_view; add another view only for a distinct workflow. ALWAYS pass `columns` listing exactly what should be visible, in display order, INCLUDING every custom field you want shown — a view created without `columns` falls back to system defaults, so custom fields you just created will NOT appear and the view looks empty. This is the most common mistake here: do not create a view and forget to select its columns. If unsure which custom-field column identifiers exist for this scope, call pm_get_workspace_context first instead of guessing. Columns and filters are applied atomically with the create — invalid columnIdentifier or filter shape rolls the whole create back with 400, so a 201 always means the view exists and is fully configured. In columns, the list order is display order and omitted columns are hidden. Keep new custom-field/header names plain; custom-field icons belong in emoji/color metadata. API-key scope: `views:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_create_webhookCreate an outgoing webhook subscription for the current workspace.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "pm_create_webhook" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe input takes a URL (input.url): a request to a URL can carry data to whoever runs it.
Description, as the server wrote it Create an outgoing webhook subscription for the current workspace. The response includes a one-time `secret` (HMAC-SHA256 key used to verify the X-Webhook-Signature-256 header on delivery). SAVE THIS SECRET IMMEDIATELY — subsequent reads (pm_get_webhook / pm_list_webhooks) do NOT return it; the only way to get a new one is to delete and recreate the webhook. eventTypes are dash-cased names (e.g. "task-created", "task-status-changed", "comment-added"); the catalog has 130+ entries — common ones include task-created/deleted, task-status-changed, task-priority-changed, task-assignee-added/removed, task-due-date-updated, comment-added/updated, reaction-added, custom-field-value-updated, space-deleted, folder-deleted, task-list-deleted, workspace-user-role-changed. Optionally narrow delivery to a single entity by setting scopeType (SPACE / FOLDER / TASK_LIST / TASK) plus scopeEntityIdentifier; omit both for workspace-wide delivery. Outgoing payload envelope is {version, id, type, timestamp, workspaceIdentifier, data}; retries fire at +0s / +1min / +5min (3 attempts total) and treat both 4xx and 5xx as failures. API-key scope: `webhooks:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
pm_log_timeLog a time entry against a task.Reads text others write1 finding
Why it is in this group
- The name "pm_log_time" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Warn
The server marks "pm_log_time" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "pm_log_time" says "log": a word for reading.
Description, as the server wrote it Log a time entry against a task. `timeSpent` is in minutes (0 to 10080 — 7 days max). `startedAt` is an ISO-8601 instant marking when the tracked work started. `notes` is optional (max 10000 chars). The user is set server-side from the JWT — do NOT pass userUuid. API-key scope: `time:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
wiki_check_public_slugCheck whether a public URL slug is available and validly formatted for a space, before publishing.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Check whether a public URL slug is available and validly formatted for a space, before publishing. Returns a SlugAvailabilityDTO. Call this when choosing a `customSlug` for wiki_set_public_settings. Requires space admin. API-key scope: `wiki:spaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_create_pageCreate a wiki page under a space.Reads text others writeNo findings
Why it is in this group
- The name "wiki_create_page" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a wiki page under a space. Pass EITHER `markdown` (simpler, server converts to TipTap) OR `content` (TipTap/ProseMirror JSON, mutually exclusive with markdown). Use `content` when you need rich features that markdown can't express — banners, collapsibles, mermaid diagrams, action buttons, inline labels, mentions, code blocks with language, etc. For the full TipTap doc shape and a copy-friendly reference of every node and mark, call `get_endpoint_examples` with tag="Wiki Pages (Lite)" (and optionally name="full-tiptap"). Optional parent slug to nest under another page. Returns the created page DTO. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:pages:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
wiki_create_spaceCreate a new wiki space in the current workspace.Reads text others writeNo findings
Why it is in this group
- The name "wiki_create_space" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Create a new wiki space in the current workspace. `key` is the unique short identifier used in URLs and subsequent API calls — uppercase letters + digits only, 2-20 chars, must start with a letter (e.g. "DOCS", "ENG2"). `name` is the human display name. Defaults: `isPublic: true` (INTERNAL visibility — all workspace members can view), `isEditPublic: false`. NOTE: `isPublic` is internal workspace visibility ONLY; it does NOT publish the space to the public web — use wiki_set_public_settings for that. Requires workspace-level edit access. API-key scope: `wiki:spaces:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
wiki_request_attachment_uploadStep 1 of uploading an image/file to a wiki page.Reads text others writeNo findings
Why it is in this group
- The name "wiki_request_attachment_upload" says "request": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Step 1 of uploading an image/file to a wiki page. Returns { attachmentId, uploadUrl, storageKey }. AFTER calling this you MUST: (2) PUT the raw file bytes to `uploadUrl` with your OWN HTTP client — the MCP server cannot do this binary upload — sending the EXACT same `Content-Type` as `contentType` and a `Content-Length` equal to `sizeBytes` (both are baked into the presigned URL; a mismatch 403s); then (3) call wiki_confirm_attachment to activate it. To embed the result as an image, add a TipTap image node with no `src` — { type:"image", attrs:{ attachmentId, pageId, width, height, align } }, width <= ~660 and height proportional — via wiki_update_page (content payload). Do NOT embed base64 data: URIs; they render distorted. Max 25 MB; system-executable file types are rejected. `pageId` is the page UUID (wiki_get_space_with_pages tree node `id`). API-key scope: `wiki:attachments:write`.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
Only reads 79Show 79 read-only tools
find_my_workspaceUnified Dutify find_my_workspace: fresh credential/workspace discovery.Reads private data1 finding
Why it is in this group
- The name "find_my_workspace" says "find": a word for reading.
What it can reach
- private-dataThe description's first sentence says "credential": it reads secrets.
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "Unified Dutify find_my_workspace: fresh credential/workspace discovery. Does not require a..."
Description, as the server wrote it Unified Dutify find_my_workspace: fresh credential/workspace discovery. Does not require a selected workspace or reserve quota.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
fr_get_bugGet a bug report by short ID (e.g.No findings
Why it is in this group
- The name "fr_get_bug" says "get": a word for reading.
Description, as the server wrote it Get a bug report by short ID (e.g. "BG-99"). Returns full detail: title, reproduction steps, expected/actual result, severity, status, product area, assignee, affectedCount, environment, comments count. Internal notes and linkedIssueUrl populated only for `View Internal Data` permission. API-key scope: `feedback:bugs:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
fr_get_requestGet a feature request by short ID (e.g.No findings
Why it is in this group
- The name "fr_get_request" says "get": a word for reading.
Description, as the server wrote it Get a feature request by short ID (e.g. "FR-42"). Returns full detail: title, description, status, category, milestone, voteCount, commentCount, reactions. Internal notes and linkedTaskIds are populated only when the caller has `View Internal Data` permission. API-key scope: `feedback:requests:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
fr_list_bugsList bug reports on a feedback board (by board slug).No findings
Why it is in this group
- The name "fr_list_bugs" says "list": a word for reading.
Description, as the server wrote it List bug reports on a feedback board (by board slug). Filter by severity and/or status name (lenient match). API-key scope: `feedback:bugs:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
fr_list_requestsList feature requests on a feedback board (by board slug).No findings
Why it is in this group
- The name "fr_list_requests" says "list": a word for reading.
Description, as the server wrote it List feature requests on a feedback board (by board slug). Filter by status / category / milestone name (lenient — trimmed + case-insensitive). Pass `q` to search request titles instead. Paginated via page/size. API-key scope: `feedback:requests:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_api_catalogDiscover deployed API tags or a tag schema for one product.Reads text others writeNo findings
Why it is in this group
- The name "get_api_catalog" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Discover deployed API tags or a tag schema for one product. Prefers the versioned service-qualified catalog; falls back only when unsupported. Discovery never grants access.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_endpoint_examplesFetch the request/response example payloads (full JSON values) for a Dutify API resource tag.No findings
Why it is in this group
- The name "get_endpoint_examples" says "get": a word for reading.
Description, as the server wrote it Fetch the request/response example payloads (full JSON values) for a Dutify API resource tag. Use this when you're about to write rich content via a tool that accepts a TipTap `content` parameter (e.g. wiki_create_page) and need a concrete reference of what the doc shape looks like — banners, collapsibles, mermaid diagrams, code blocks with language, mentions, inline labels, tables, task lists, etc. Pass the resource tag (e.g. "Wiki Pages (Lite)", "Milestone Articles"). Optionally narrow with `operationId` (e.g. "createPage") and `name` (e.g. "full" or "full-tiptap") — both names appear in the per-tag detail response so an agent can pick exactly the example it needs without paying tokens for the rest. Returns the catalog JSON; the example payloads are under `operations[*].requestBodyExamples[name].value`. Tag list (lightweight) is at GET /v1/api-catalog. Per-tag detail (schemas, no example bodies) is at GET /v1/api-catalog/{tag}. This tool calls the third tier — GET /v1/api-catalog/{tag}/examples — which carries the heavy payloads.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_count_callsReturn the total number of calls visible to the actor user.No findings
Why it is in this group
- The name "hub_count_calls" says "count": a word for reading.
Description, as the server wrote it Return the total number of calls visible to the actor user. Use to plan pagination. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_count_search_callsCount of calls matching a search query.No findings
Why it is in this group
- The name "hub_count_search_calls" says "count": a word for reading.
Description, as the server wrote it Count of calls matching a search query. Pair with `hub_search_calls` for paginated UIs. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_callFetch a single call by ID.No findings
Why it is in this group
- The name "hub_get_call" says "get": a word for reading.
Description, as the server wrote it Fetch a single call by ID. Returns the full UserCallDTO. Field map (the DTO is deeply nested): - top-level `id` (integer) — what /usercall/{id} expects, what list/search return - top-level `clickupList`/`jiraProjectId`/`airtableBaseId`/`airtableTableId` — populated when this call has been pushed to that vendor - top-level `summaryApplied`/`actionItemsApplied`/etc. (bool) — has the summary/etc. been pushed? - `call.id` (integer) — INTERNAL Zoom/Meet/Teams call id, NOT for /usercall/{id} paths - `call.callUuid` (string) — what `hub_send_call_to_jira/clickup/airtable` want as `callUUID` - `call.attendees` (string, often "") — NOT a structured array - `call.recordings[i].id` (integer) — recording id for /recording/{id}/audio-url etc. - `call.recordings[i].summary`/`keyPoints`/`actionItems`/`enhancedNotes` — markdown STRINGS, not arrays; the CALLER's own version (generated from their workspace prompt, per-call prompt, notes and note template), never another participant's - `call.recordings[i].userNotes` — only the caller's own desktop notes, null otherwise Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_custom_promptGet the workspace's custom prompt — house-style instructions that, together with each participant's own per-call prompt, notes and note template, form the instruction set their ver…Reads private dataNo findings
Why it is in this group
- The name "hub_get_custom_prompt" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "get" and "note": it reads notes.
Description, as the server wrote it Get the workspace's custom prompt — house-style instructions that, together with each participant's own per-call prompt, notes and note template, form the instruction set their version of the summary, key points, action items and enhanced notes is generated from (task generation too). Returns { customPrompt: string | null }. Requires workspace-settings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_default_workspaceGet the user's "default workspace" — where new calendar events without an explicit assignment get routed.Reads private dataNo findings
Why it is in this group
- The name "hub_get_default_workspace" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "get" and "calendar": it reads calendars.
Description, as the server wrote it Get the user's "default workspace" — where new calendar events without an explicit assignment get routed. Returns { workspaceId: uuid | null }. Requires user-settings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_media_urlLike `hub_get_audio_url` but returns the full media (video + audio) when the recording has a video track.Reads text others writeNo findings
Why it is in this group
- The name "hub_get_media_url" says "get": a word for reading.
What it can reach
- untrusted-inputThe name "hub_get_media_url" says "get" and "url": it reads web pages, which anyone can write.
- untrusted-inputThe description's first sentence says "url": it reads web pages, which anyone can write.
Description, as the server wrote it Like `hub_get_audio_url` but returns the full media (video + audio) when the recording has a video track. Falls back to audio-only when there isn't one. Same expiry semantics. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_preferred_integrationGet the workspace's preferred integration target — which task system new actions are routed to by default (Jira, ClickUp, Airtable, PM, etc.).No findings
Why it is in this group
- The name "hub_get_preferred_integration" says "get": a word for reading.
Description, as the server wrote it Get the workspace's preferred integration target — which task system new actions are routed to by default (Jira, ClickUp, Airtable, PM, etc.). Requires workspace-settings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_preview_urlGet a signed URL for the recording's preview thumbnail (a still image or short looping clip).Reads text others writeNo findings
Why it is in this group
- The name "hub_get_preview_url" says "get": a word for reading.
What it can reach
- untrusted-inputThe name "hub_get_preview_url" says "get" and "url": it reads web pages, which anyone can write.
- untrusted-inputThe description's first sentence says "get" and "url": it reads web pages, which anyone can write.
Description, as the server wrote it Get a signed URL for the recording's preview thumbnail (a still image or short looping clip). Useful for embedding a card. Same expiry semantics. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_recording_progressGet the processing progress of a recording.No findings
Why it is in this group
- The name "hub_get_recording_progress" says "get": a word for reading.
Description, as the server wrote it Get the processing progress of a recording. Returns an integer 0-100 — useful for polling after a `hub_reprocess_recording` call. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_get_workspaceGet details for the selected workspace (or the workspace bound to a workspace key) (the one this API key was provisioned for).No findings
Why it is in this group
- The name "hub_get_workspace" says "get": a word for reading.
Description, as the server wrote it Get details for the selected workspace (or the workspace bound to a workspace key) (the one this API key was provisioned for). Hub does not currently expose a single-workspace GET, so this returns the matching entry from the user's workspaces list. Requires workspaces:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_list_calendar_eventsList the actor user's calendar events in a date range.Reads private dataNo findings
Why it is in this group
- The name "hub_list_calendar_events" says "list": a word for reading.
What it can reach
- private-dataThe name "hub_list_calendar_events" says "list" and "calendar": it reads calendars.
- private-dataThe description's first sentence says "list" and "calendar": it reads calendars.
Description, as the server wrote it List the actor user's calendar events in a date range. Use this to find the eventId or seriesMasterId a prompt should attach to. Each event includes subject, start/end, whether a recording bot is subscribed, and any eventCustomPrompt / seriesCustomPrompt already set. Events belong to the user across all workspace assignments; workspace assignment is processing context, not ownership. Requires calendar:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_list_callsPage through all calls the actor user can see (their own + any explicitly shared).No findings
Why it is in this group
- The name "hub_list_calls" says "list": a word for reading.
Description, as the server wrote it Page through all calls the actor user can see (their own + any explicitly shared). Returns a list of UserCallDTO. Pagination is page+size; sort order is most-recent first. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_list_integrationsList all integrations connected to the selected workspace (or the workspace bound to a workspace key).No findings
Why it is in this group
- The name "hub_list_integrations" says "list": a word for reading.
Description, as the server wrote it List all integrations connected to the selected workspace (or the workspace bound to a workspace key). Returns one entry per connected toolkit (Slack, Jira, ClickUp, Airtable, Notion, Gmail, GCal, GitHub, etc.) with system name, connection status, last sync time, and any vendor metadata. Useful for choosing which `setPreferredIntegration` value is valid, or for reporting connection health to the user. Requires integrations:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_list_membersList all members of the selected workspace (or the workspace bound to a workspace key).No findings
Why it is in this group
- The name "hub_list_members" says "list": a word for reading.
Description, as the server wrote it List all members of the selected workspace (or the workspace bound to a workspace key). Each entry includes user UUID, email, name, role, and join timestamp. Useful for "tag this person", "summarize who said what in the last call", etc. Requires members:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_search_callsFree-text search across call name, description, attendees, and recording transcript content.No findings
Why it is in this group
- The name "hub_search_calls" says "search": a word for reading.
Description, as the server wrote it Free-text search across call name, description, attendees, and recording transcript content. Returns paginated UserCallDTO results. Requires recordings:read scope.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_accountsList the accounts configured for this MCP session.1 finding
Why it is in this group
- The name "list_accounts" says "list": a word for reading.
Findings
- Warn
The description names a tool "account" that this server does not list.
What this check looks forMatched text
description: "...me` (the label the caller passes as the `account` tool argument) and `workspace` (the workspac..."
Description, as the server wrote it List the accounts configured for this MCP session. Returns one entry per account with `name` (the label the caller passes as the `account` tool argument) and `workspace` (the workspace identifier or name declared for that account). API keys are not returned. In single-account mode (X-API-Key with optional X-Dutify-Workspace), returns a single entry with name="default". In multi-account mode (X-Dutify-Accounts header), returns every configured account. Call this first when you do not know which account names are available.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_boardsList feature-request boards the caller can view in the current workspace.No findings
Why it is in this group
- The name "list_boards" says "list": a word for reading.
Description, as the server wrote it List feature-request boards the caller can view in the current workspace. Each entry includes the board slug and the short-ID prefixes (featureRequestKey, bugReportKey) needed to address requests/bugs in follow-up tool calls.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_spacesList wiki spaces the caller can view in the current workspace, each with a page count.No findings
Why it is in this group
- The name "list_spaces" says "list": a word for reading.
Description, as the server wrote it List wiki spaces the caller can view in the current workspace, each with a page count. Use the `key` field as the space identifier in follow-up wiki tool calls.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_workspacesUnified Dutify list_workspaces: fresh credential/workspace discovery.Reads private data1 finding
Why it is in this group
- The name "list_workspaces" says "list": a word for reading.
What it can reach
- private-dataThe description's first sentence says "credential": it reads secrets.
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "Unified Dutify list_workspaces: fresh credential/workspace discovery. Does not require a..."
Description, as the server wrote it Unified Dutify list_workspaces: fresh credential/workspace discovery. Does not require a selected workspace or reserve quota.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_count_unread_notificationsReturn the bare unread-notification count (a Long) for the current user in the active workspace.No findings
Why it is in this group
- The name "pm_count_unread_notifications" says "count": a word for reading.
Description, as the server wrote it Return the bare unread-notification count (a Long) for the current user in the active workspace. The response body is a single number, not an object. API-key scope: `notifications:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_describe_status_priority_level_endpointsOrientation/meta tool: return the canonical REST paths and field shapes for managing the Status, Priority, and Task-Level catalogues at each scope (workspace / space / folder / lis…Reads private dataNo findings
Why it is in this group
- The name "pm_describe_status_priority_level_endpoints" says "describe": a word for reading.
What it can reach
- private-dataThe description's first sentence says "folder": it reads files.
Description, as the server wrote it Orientation/meta tool: return the canonical REST paths and field shapes for managing the Status, Priority, and Task-Level catalogues at each scope (workspace / space / folder / list). Call this ONCE before reaching for endpoint-example tools — it cuts a 30-tool surface down to a single readable map. The agent can then use the catalog tools (e.g. `get_endpoint_examples`) to fetch real request/response bodies for whichever path it picks.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_automationFetch a single automation by identifier.No findings
Why it is in this group
- The name "pm_get_automation" says "get": a word for reading.
Description, as the server wrote it Fetch a single automation by identifier. Returns the full AutomationDTO including triggers, condition tree, and actions. API-key scope: `automations:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_automation_auditFetch the execution audit log for an automation.No findings
Why it is in this group
- The name "pm_get_automation_audit" says "get": a word for reading.
Description, as the server wrote it Fetch the execution audit log for an automation. Each row records a single firing — timestamp, triggering task, trigger type, overall execution status (SUCCESS/FAILED/IN_PROGRESS/ROLLED_BACK), and per-action audit detail. Use to debug "did my automation run?" — it is the authoritative answer; the UI does not currently show summary stats. API-key scope: `automations:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_current_userGet the profile of the human behind the API key — identifier, email, fullName, and the userSettings object.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "pm_get_current_user" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "get" and "email": it reads mail.
- untrusted-inputThe description's first sentence says "get" and "email": it reads inbound email, which other people can write.
Description, as the server wrote it Get the profile of the human behind the API key — identifier, email, fullName, and the userSettings object. Use this when the agent needs to address the user by name, route a notification to the right preference channel, or confirm "whose API key am I holding". API-key scope: `users:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_dashboardGet aggregated counts and breakdowns (status / priority / assignee distributions, custom-field summaries) for any scope.No findings
Why it is in this group
- The name "pm_get_dashboard" says "get": a word for reading.
Description, as the server wrote it Get aggregated counts and breakdowns (status / priority / assignee distributions, custom-field summaries) for any scope. Useful for "how is project X doing?" questions without paginating through tasks. API-key scope: `dashboards:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_import_jobFetch the current status and progress of a CSV import job by identifier.No findings
Why it is in this group
- The name "pm_get_import_job" says "get": a word for reading.
Description, as the server wrote it Fetch the current status and progress of a CSV import job by identifier. Use this to poll a job that another client started via /csv or /csv/preview. API-key scope: `imports:write`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_notification_settingsRead the current user's aggregated notification settings — one tree covering every module (comments, mentions, assignments, due dates, automation events, …) and every delivery chan…Reads private dataReads text others writeNo findings
Why it is in this group
- The name "pm_get_notification_settings" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "read" and "email": it reads mail.
- untrusted-inputThe description's first sentence says "read" and "comment": it reads comments, which other people can write.
Description, as the server wrote it Read the current user's aggregated notification settings — one tree covering every module (comments, mentions, assignments, due dates, automation events, …) and every delivery channel (app / browser / email). Use this to find out which channel is on for a given event before asking the user to flip a flag. API-key scope: `users:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_sprintFetch a sprint by identifier.No findings
Why it is in this group
- The name "pm_get_sprint" says "get": a word for reading.
Description, as the server wrote it Fetch a sprint by identifier. Returns SprintDTO with task statistics. API-key scope: `sprints:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_sprint_burndownReturn burndown/burnup chart data for the sprint — daily snapshots of remaining vs completed work.No findings
Why it is in this group
- The name "pm_get_sprint_burndown" says "get": a word for reading.
Description, as the server wrote it Return burndown/burnup chart data for the sprint — daily snapshots of remaining vs completed work. Use this to render burndown charts or audit sprint progress over time. API-key scope: `sprints:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_sprint_tasksList all tasks currently in the sprint.No findings
Why it is in this group
- The name "pm_get_sprint_tasks" says "get": a word for reading.
Description, as the server wrote it List all tasks currently in the sprint. Returns an array of full TaskDTO. API-key scope: `sprints:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_subtasksList the direct subtasks (one level deep) of a parent task by ref.No findings
Why it is in this group
- The name "pm_get_subtasks" says "get": a word for reading.
Description, as the server wrote it List the direct subtasks (one level deep) of a parent task by ref. API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_tagFetch a single tag by identifier.No findings
Why it is in this group
- The name "pm_get_tag" says "get": a word for reading.
Description, as the server wrote it Fetch a single tag by identifier. Returns the TagDTO (identifier, name, backgroundColor, textColor). API-key scope: `tags:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_taskFetch a task by ref.No findings
Why it is in this group
- The name "pm_get_task" says "get": a word for reading.
Description, as the server wrote it Fetch a task by ref. Ref accepts a system identifier (tsk_…) OR a task key (e.g. 'PROJ-42'). Returns LiteTaskResponse with names instead of UUIDs and emails instead of user UUIDs. Internal note: when ref is a task key the workspace query param is required — the MCP injects it automatically. Present title linked to webUrl; show displayKey only when non-empty. Do not display the raw key when displayKey is null or absent. API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_task_sharingRead a task's current public sharing settings.No findings
Why it is in this group
- The name "pm_get_task_sharing" says "get": a word for reading.
Description, as the server wrote it Read a task's current public sharing settings. Returns the full TaskSharingSettingsDTO — `shared` (is the public link active), `publicLink` (the share URL when active), `expiresAt`, and per-field visibility toggles (shareAssignee, shareDescription, shareStatus, sharePriority, shareDueDate, shareComments, shareAttachments, shareCustomFields, shareSubtasks, shareTags) plus the explicit list of custom-field identifiers exposed (sharedCustomFieldIdentifiers). Requires at least VIEW access to the task. API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_teamFetch a team by identifier.No findings
Why it is in this group
- The name "pm_get_team" says "get": a word for reading.
Description, as the server wrote it Fetch a team by identifier. Returns the full TeamDTO with members. API-key scope: `teams:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_viewFetch a view by identifier (vw_…).No findings
Why it is in this group
- The name "pm_get_view" says "get": a word for reading.
Description, as the server wrote it Fetch a view by identifier (vw_…). API-key scope: `views:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_webhookFetch a single webhook by identifier.No findings
Why it is in this group
- The name "pm_get_webhook" says "get": a word for reading.
Description, as the server wrote it Fetch a single webhook by identifier. Returns its url / name / eventTypes / scope / active flag; does NOT return the HMAC secret (only available at creation time). API-key scope: `webhooks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_webhook_usageReport webhook quota for the current workspace: { userManaged, agentManaged, total, max }.No findings
Why it is in this group
- The name "pm_get_webhook_usage" says "get": a word for reading.
Description, as the server wrote it Report webhook quota for the current workspace: { userManaged, agentManaged, total, max }. `total` is the count of active subscriptions and `max` is the per-workspace cap; `agentManaged` is the subset created via API keys (like this MCP). Check this before calling pm_create_webhook in bulk — creation fails once `total` reaches `max`. API-key scope: `webhooks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_workspace_contextSingle-call workspace orientation: members, spaces (with folders, lists, per-list statuses/priorities/taskTypes/customFields), workspace-level taskTypes, relationshipTypes, tags.Reads private dataNo findings
Why it is in this group
- The name "pm_get_workspace_context" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "folder": it reads files.
Description, as the server wrote it Single-call workspace orientation: members, spaces (with folders, lists, per-list statuses/priorities/taskTypes/customFields), workspace-level taskTypes, relationshipTypes, tags. The biggest agent-onboarding tool — call it first when starting in a new workspace. Pass shallow=true to skip per-list statuses/priorities for a faster tree-only response. Each per-list custom field carries an `isMandatory` flag — fields with isMandatory=true MUST be supplied in `customFields` when creating/updating a task in that list, or the write is rejected with 400 VALIDATION_ERROR. API-key scope: `workspaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_get_workspace_user_avatar_urlReturn the avatar URL for a specific user in the current workspace.Reads text others writeNo findings
Why it is in this group
- The name "pm_get_workspace_user_avatar_url" says "get": a word for reading.
What it can reach
- untrusted-inputThe name "pm_get_workspace_user_avatar_url" says "get" and "url": it reads web pages, which anyone can write.
- untrusted-inputThe description's first sentence says "return" and "url": it reads web pages, which anyone can write.
Description, as the server wrote it Return the avatar URL for a specific user in the current workspace. The response is a short-lived signed URL pointing at the user's avatar image — embed it in chat messages, mentions, or attribution UI. Returns null if the user has no avatar set. API-key scope: `users:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_automations_for_folderList automations scoped to a folder.Reads private dataNo findings
Why it is in this group
- The name "pm_list_automations_for_folder" says "list": a word for reading.
What it can reach
- private-dataThe name "pm_list_automations_for_folder" says "list" and "folder": it reads files.
- private-dataThe description's first sentence says "list" and "folder": it reads files.
- private-dataThe input names a folder (input.folderIdentifier), and the tool reads: it reads files.
Description, as the server wrote it List automations scoped to a folder. Automations attached at folder level cascade to every list inside that folder unless overridden at the list level. API-key scope: `automations:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_automations_for_listList automations scoped to a specific list.No findings
Why it is in this group
- The name "pm_list_automations_for_list" says "list": a word for reading.
Description, as the server wrote it List automations scoped to a specific list. Each row is an AutomationDTO with name, active, triggers, conditionNodes, actions, and the owning scope identifiers. API-key scope: `automations:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_automations_for_spaceList automations scoped to a space.No findings
Why it is in this group
- The name "pm_list_automations_for_space" says "list": a word for reading.
Description, as the server wrote it List automations scoped to a space. Automations attached at space level cascade to every list and folder inside that space. API-key scope: `automations:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_comment_reactionsList reactions on a task comment.Reads text others writeNo findings
Why it is in this group
- The name "pm_list_comment_reactions" says "list": a word for reading.
What it can reach
- untrusted-inputThe name "pm_list_comment_reactions" says "list" and "comment": it reads comments, which other people can write.
- untrusted-inputThe description's first sentence says "list" and "comment": it reads comments, which other people can write.
Description, as the server wrote it List reactions on a task comment. Page-style pagination (page/size). API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_import_jobsList CSV import jobs for the current workspace, paginated.No findings
Why it is in this group
- The name "pm_list_import_jobs" says "list": a word for reading.
Description, as the server wrote it List CSV import jobs for the current workspace, paginated. The actual CSV upload endpoints (/csv and /csv/preview) are multipart/form-data and are not exposed by the MCP — agents that want to start a fresh import must upload via a non-MCP client and then come back here with the returned jobIdentifier. API-key scope: `imports:write`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_invitationsList pending (not yet accepted, not expired) invitations for the current workspace.No findings
Why it is in this group
- The name "pm_list_invitations" says "list": a word for reading.
Description, as the server wrote it List pending (not yet accepted, not expired) invitations for the current workspace. Caller needs MANAGE_USERS permission. Returns an array of InvitationDTO. API-key scope: `users:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_notificationsList notifications for the current user in the active workspace.No findings
Why it is in this group
- The name "pm_list_notifications" says "list": a word for reading.
Description, as the server wrote it List notifications for the current user in the active workspace. NOTE: this endpoint uses PAGE-style pagination (?page=&size=) not cursor-based — unusual for this API. `page` is 0-indexed; `size` is 1–100. Optional `unreadOnly`, `sortColumn`, `sortDirection`. API-key scope: `notifications:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_reference_dataList a Dutify reference-data enum (status types, custom-field types, view types, automation action/condition types, access levels, etc.).1 finding
Why it is in this group
- The name "pm_list_reference_data" says "list": a word for reading.
Findings
- Info
The description is 2,731 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...rs, or have the user mint a key with both `metadata:read` and `automations:read`."
Description, as the server wrote it List a Dutify reference-data enum (status types, custom-field types, view types, automation action/condition types, access levels, etc.). Returns the authoritative set of values the backend accepts — call this BEFORE guessing enum strings on a create/update payload to avoid 400s. Categories: - custom-field-types: Custom-field type catalogue: text, number, dropdown, date, money, file, rollup, formula, … Use the `identifier` from each row as the `fieldType` value when creating a custom field via /v1/lists/{id}/custom-fields or pm_create_custom_field. - custom-field-icon-options: Custom-field icon catalogue: supported iconNames, emojiNames, and defaultIconsByFieldType. Use one of these keys as the `emoji` value; keep custom-field names plain. Agent preference: choose a semantically matching emojiNames key when available (severity/urgency=fire, target/goal=direct_hit, launch=rocket, approval/success=white_check_mark, location=pushpin, budget=moneybag); use iconNames for structural/type affordances like CalendarBlank. - resource-view-types: Resource view types: list (1), board (2), table (3), dashboard (4), gantt (5), calendar (6), gallery (7), whiteboard (9). The numeric `typeId` is what /v1/views and view-config endpoints accept. - status-types: Status type enum — ACTIVE, DONE, CLOSED. Used when grouping tasks or filtering for visibility. - activity-types: Activity log event types — status_changed, task_created, comment_added, automation_executed, etc. - automation-action-types: Automation action types — SET_STATUS, SET_PRIORITY, SET_ASSIGNEES, ADD_COMMENT, etc. Use when building an automation rule. - automation-condition-types: Automation condition types (predicate categories) — STATUS, PRIORITY, DUE_DATE, CUSTOM_FIELD, etc. - automation-field-operators: Operators valid in automation condition predicates — equals, not_equals, greater_than, in, is_set, etc. - access-levels: Entity access levels — VIEW, COMMENT, EDIT, FULL — used in user/team access grants. - workspace-access-level-permissions: Workspace role → permission map (OWNER/ADMIN/MEMBER/GUEST). Tells you which capabilities each role grants. Auth: the resources are @PermitAll for anonymous callers, but the ApiKeyScopeFilter still gates API-key requests. The `metadata:read` scope covers custom-field-types / custom-field-icon-options / resource-view-types / status-types / activity-types / access-levels / workspace-access-level-permissions. The three automation-* categories live under /v1/automation/* and require `automations:read` instead. If the API key lacks the required scope the call returns 403 — pick a category your key covers, or have the user mint a key with both `metadata:read` and `automations:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_saved_filtersList the current user's saved filters for a list.No findings
Why it is in this group
- The name "pm_list_saved_filters" says "list": a word for reading.
Description, as the server wrote it List the current user's saved filters for a list. Filters are USER-scoped — they are not visible to other workspace members. API-key scope: `filters:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_sprint_groupsList all sprint groups in a space.No findings
Why it is in this group
- The name "pm_list_sprint_groups" says "list": a word for reading.
Description, as the server wrote it List all sprint groups in a space. Sprint groups are containers for sprints — each group has its own state machine (only one IN_PROGRESS sprint per group). Returns an array of SprintGroupDTO. API-key scope: `sprints:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_task_commentsList comments on a task by ref.Reads text others writeNo findings
Why it is in this group
- The name "pm_list_task_comments" says "list": a word for reading.
What it can reach
- untrusted-inputThe name "pm_list_task_comments" says "list" and "comment": it reads comments, which other people can write.
- untrusted-inputThe description's first sentence says "list" and "comment": it reads comments, which other people can write.
Description, as the server wrote it List comments on a task by ref. Cursor-paginated. API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_task_relationshipsList all relationships where the task is owner OR child.No findings
Why it is in this group
- The name "pm_list_task_relationships" says "list": a word for reading.
Description, as the server wrote it List all relationships where the task is owner OR child. Cursor-paginated. API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_task_typesReturn the workspace task-type catalogue (identifier, name, singularName, pluralName, iconKind, iconValue, color, sortOrder, origin SYSTEM/CUSTOM).No findings
Why it is in this group
- The name "pm_list_task_types" says "list": a word for reading.
Description, as the server wrote it Return the workspace task-type catalogue (identifier, name, singularName, pluralName, iconKind, iconValue, color, sortOrder, origin SYSTEM/CUSTOM). Use this to discover what types are available before creating/updating tasks, or to translate names to stable identifiers for the cascade-default endpoints. API-key scope: `workspaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_teamsList teams in the current workspace, paginated.No findings
Why it is in this group
- The name "pm_list_teams" says "list": a word for reading.
Description, as the server wrote it List teams in the current workspace, paginated. Each team carries identifier, name, alias, description, icon, color, and member list. Use pagination if there are many teams. API-key scope: `teams:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_time_entriesList time entries logged against a task.No findings
Why it is in this group
- The name "pm_list_time_entries" says "list": a word for reading.
Description, as the server wrote it List time entries logged against a task. `taskIdentifier` must be a stable identifier (tsk_…), not a task key. Supports page/size/sortColumn/sortDirection (page-style). API-key scope: `time:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_viewsList views at a given scope.No findings
Why it is in this group
- The name "pm_list_views" says "list": a word for reading.
Description, as the server wrote it List views at a given scope. scope is one of workspace/space/folder/list; scopeIdentifier is the UUID of the parent entity (omit for workspace scope — the MCP's configured workspace is used). Cursor-paginated. API-key scope: `views:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_webhook_deliveriesList recent delivery attempts for a webhook (most recent first).No findings
Why it is in this group
- The name "pm_list_webhook_deliveries" says "list": a word for reading.
Description, as the server wrote it List recent delivery attempts for a webhook (most recent first). Each entry includes the event type, response status, attempt count, and timestamps. Useful for diagnosing why a subscriber is missing events. Pagination uses `cursor` (or `page`) and `size` (max 100, default backend-defined). API-key scope: `webhooks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_webhooksList all webhook subscriptions registered in the current workspace.No findings
Why it is in this group
- The name "pm_list_webhooks" says "list": a word for reading.
Description, as the server wrote it List all webhook subscriptions registered in the current workspace. The HMAC `secret` is NOT included — only present in the original create response. API-key scope: `webhooks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_list_workspace_membersList members of the current workspace.No findings
Why it is in this group
- The name "pm_list_workspace_members" says "list": a word for reading.
Description, as the server wrote it List members of the current workspace. Workspace is taken from the MCP config — no need to pass it. RESPONSE IS A PAGINATED ENVELOPE, NOT AN ARRAY: {users: WorkspaceUserDTO[], totalCount, page, size, totalPages} — read members from `users` (treating the response itself as a list fails). FOOTGUN: `size` DEFAULTS TO 20 when omitted, so a single call silently returns only the first 20 members and no error — don't assume it's the full roster. To enumerate everyone, page (page is 0-based) until you have collected `totalCount`. `size` is capped at 100 and a value >100 is a 400, not clamped. Use `search` (case-insensitive substring on first/last name or email, applied before paging) to find a specific member instead of paging blindly. Side effect: updates the caller's last-active timestamp. API-key scope: `workspaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_read_activity_logRead the activity log for a scope.No findings
Why it is in this group
- The name "pm_read_activity_log" says "read": a word for reading.
Description, as the server wrote it Read the activity log for a scope. `scope` selects the entity type and `identifier` is that entity's identifier (use the workspace identifier when scope=workspace). `mode` is either 'full' (this entity AND everything beneath it) or 'own' (this entity only). Cursor-paginated. WARNING: every entry has a `data` field that is a JSON-encoded STRING — to inspect the payload you must double-parse it (parse the response, then JSON.parse(entry.data)). API-key scope: `activity_log:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
pm_search_tasksSearch tasks across the workspace with name-based filters.No findings
Why it is in this group
- The name "pm_search_tasks" says "search": a word for reading.
Description, as the server wrote it Search tasks across the workspace with name-based filters. status / priority / tag / taskType are repeatable (pass an array). assignee is an email or UUID. q is a free-text search over title + description. Returns a cursor-paginated page of LiteTaskResponse — pass nextCursor back as `cursor` to paginate. Present title linked to webUrl; show displayKey only when non-empty. key and identifier are API references, not display labels. API-key scope: `tasks:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
whoamiUnified Dutify whoami: fresh credential/workspace discovery.Reads private data1 finding
Why it is in this group
- The name "whoami" says "whoami": a word for reading.
What it can reach
- private-dataThe description's first sentence says "credential": it reads secrets.
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "Unified Dutify whoami: fresh credential/workspace discovery. Does not require a..."
Description, as the server wrote it Unified Dutify whoami: fresh credential/workspace discovery. Does not require a selected workspace or reserve quota.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_get_pageGet a wiki page by slug within a space.No findings
Why it is in this group
- The name "wiki_get_page" says "get": a word for reading.
Description, as the server wrote it Get a wiki page by slug within a space. Default format is Markdown (the body is returned under the `markdown` field); pass format="tiptap" for raw ProseMirror JSON. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:pages:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_get_public_settingsGet a space's PUBLIC-WEB publishing settings (PublicSpaceSettingsDTO): `isEnabled` (is the space published to the public internet), `customSlug` (public URL slug), `allowedEmojis`,…Reads text others writeNo findings
Why it is in this group
- The name "wiki_get_public_settings" says "get": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "get" and "web": it reads web pages, which anyone can write.
Description, as the server wrote it Get a space's PUBLIC-WEB publishing settings (PublicSpaceSettingsDTO): `isEnabled` (is the space published to the public internet), `customSlug` (public URL slug), `allowedEmojis`, `showReactions`, `showPageViews`, `showLastUpdated`, `showAuthor`, `viewMode` ("space"|"helpcenter"), `heroTitle`, `heroSubtitle`. This is SEPARATE from the space's `isPublic` flag, which is internal workspace visibility only. Requires space admin. API-key scope: `wiki:spaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_get_spaceFetch a single wiki space by key.No findings
Why it is in this group
- The name "wiki_get_space" says "get": a word for reading.
Description, as the server wrote it Fetch a single wiki space by key. Returns the WikiSpaceDTO (id, key, name, description, icon, color, cover image, visibility flags, permissions, timestamps). For the page tree inside the space, use wiki_get_space_with_pages instead. API-key scope: `wiki:spaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_get_space_with_pagesFetch a wiki space AND its complete page tree in one call.No findings
Why it is in this group
- The name "wiki_get_space_with_pages" says "get": a word for reading.
Description, as the server wrote it Fetch a wiki space AND its complete page tree in one call. Returns WikiSpaceWithPagesDTO — space metadata plus `pages` (a recursive tree of WikiPageTreeNodeDTO with slug, title, type=page|folder, hasChildren, children[], view count, top reactions, the caller's effectivePermission per node). Use this to render or traverse the whole space; for a single level (root or one parent's children) wiki_list_pages is lighter. API-key scope: `wiki:spaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_list_attachmentsList every attachment on a wiki page (WikiAttachmentDTO[]): id, pageId, filename, contentType, sizeBytes, status (pending|confirmed|failed), uploadedBy/At, confirmedAt.No findings
Why it is in this group
- The name "wiki_list_attachments" says "list": a word for reading.
Description, as the server wrote it List every attachment on a wiki page (WikiAttachmentDTO[]): id, pageId, filename, contentType, sizeBytes, status (pending|confirmed|failed), uploadedBy/At, confirmedAt. `pageId` is the page UUID (from wiki_get_space_with_pages tree node `id`, not the slug). Use to find an attachmentId to reference or delete. API-key scope: `wiki:attachments:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_list_pagesList wiki pages in a space.No findings
Why it is in this group
- The name "wiki_list_pages" says "list": a word for reading.
Description, as the server wrote it List wiki pages in a space. Without `parent` returns root-level pages; pass a parent slug to list that page's children. Response items have slug, title, status, type (page|folder), parentSlug, updatedAt — no bodies. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:pages:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_list_spacesList every wiki space the caller can see in the current workspace.No findings
Why it is in this group
- The name "wiki_list_spaces" says "list": a word for reading.
Description, as the server wrote it List every wiki space the caller can see in the current workspace. Each entry has the space's `key` (use this in subsequent calls), `name`, `description`, `effectivePermission` (view/edit/admin), and `canView`/`canEdit`/`canAdmin` booleans for quick gating. Call this first when an agent needs to figure out which space a wiki action should target. API-key scope: `wiki:spaces:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_retrieveSearch the wiki by MEANING and get back the most relevant PASSAGES (chunks) with citations and relevance scores.No findings
Why it is in this group
- The name "wiki_retrieve" says "retrieve": a word for reading.
Description, as the server wrote it Search the wiki by MEANING and get back the most relevant PASSAGES (chunks) with citations and relevance scores. Use this to GROUND or ANSWER a question from wiki content: it returns quotable chunkText plus the source page/section so you can cite it. Each result has pageSlug, pageTitle, spaceKey, spaceName, chunkIndex, headingPath (heading-path breadcrumb), chunkText, score (0..1, higher = more relevant), status and updatedAt. This is retrieval-augmented generation (RAG) over wiki content, NOT a page finder — to merely LOCATE or LIST pages by title/keyword use wiki_search. Defaults to the top 5 chunks; pass limit to widen. Fails open to keyword retrieval if the embedding provider is unavailable. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:search:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
wiki_searchFind wiki PAGES by title/keyword in the current workspace.No findings
Why it is in this group
- The name "wiki_search" says "search": a word for reading.
Description, as the server wrote it Find wiki PAGES by title/keyword in the current workspace. Returns a list of matching pages (slug, title, spaceKey, spaceName, excerpt, status, updatedAt) — no UUIDs, no full body. Use this to LOCATE or LIST pages (then call wiki_get_page to read one). To ANSWER a question FROM wiki content — i.e. get back quotable passages with citations and relevance scores — use wiki_retrieve instead. Optionally scope to a single space by passing spaceKey. Defaults to hybrid (keyword + semantic) ranking; pass mode to override. Page results include webUrl: a browser link requiring normal workspace access. Use it for citations; it does not make the page public. API-key scope: `wiki:search:read`.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
10472 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 8 outbound tools breaks every one.
- Reads private data11
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write119
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out8
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
{
"permissions": {
"deny": [
"mcp__dutify__hub_send_call_to_airtable",
"mcp__dutify__hub_send_call_to_clickup",
"mcp__dutify__hub_send_call_to_jira",
"mcp__dutify__pm_add_comment_reaction",
"mcp__dutify__pm_create_task_comment",
"mcp__dutify__pm_create_webhook",
"mcp__dutify__pm_send_invitation",
"mcp__dutify__pm_update_task_comment"
]
}
}Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
- Warnlist_accounts
The description names a tool "account" that this server does not list.
What this check looks forMatched text
description: "...me` (the label the caller passes as the `account` tool argument) and `workspace` (the workspac..."
- Warnpm_clone_view
The server marks "pm_clone_view" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "pm_clone_view" says "view": a word for reading.
- Warnpm_log_time
The server marks "pm_log_time" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "pm_log_time" says "log": a word for reading.
The server marks "hub_get_audio_url" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "hub_get_audio_url" says "get": a word for reading.
- Infowhoami
The description mentions "credential".
What this check looks forMatched text
description: "Unified Dutify whoami: fresh credential/workspace discovery. Does not require a..."
The description mentions "credential".
What this check looks forMatched text
description: "Unified Dutify find_my_workspace: fresh credential/workspace discovery. Does not require a..."
Show 2 more findingsShow fewer
- Infolist_workspaces
The description mentions "credential".
What this check looks forMatched text
description: "Unified Dutify list_workspaces: fresh credential/workspace discovery. Does not require a..."
The description is 2,731 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...rs, or have the user mint a key with both `metadata:read` and `automations:read`."
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 0.1.1. Values in angle brackets are yours to fill in.
claude mcp add --transport http dutify https://mcp.dutify.ai --header 'X-API-Key: <your-x-api-key>'claude mcp add --transport http dutify https://mcp.dutify.ai --header 'X-API-Key: <your-x-api-key>'Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__dutify__whoami",
"mcp__dutify__list_accounts",
"mcp__dutify__find_my_workspace",
"mcp__dutify__list_workspaces",
"mcp__dutify__list_boards",
"mcp__dutify__list_spaces",
"mcp__dutify__get_endpoint_examples",
"mcp__dutify__wiki_search",
"mcp__dutify__wiki_retrieve",
"mcp__dutify__wiki_list_pages",
"mcp__dutify__wiki_get_page",
"mcp__dutify__wiki_get_page_share",
"mcp__dutify__wiki_list_spaces",
"mcp__dutify__wiki_get_space",
"mcp__dutify__wiki_get_space_with_pages",
"mcp__dutify__wiki_get_public_settings",
"mcp__dutify__wiki_list_attachments",
"mcp__dutify__fr_list_requests",
"mcp__dutify__fr_get_request",
"mcp__dutify__fr_list_bugs",
"mcp__dutify__fr_get_bug",
"mcp__dutify__pm_get_workspace_context",
"mcp__dutify__pm_get_dashboard",
"mcp__dutify__pm_search_tasks",
"mcp__dutify__pm_get_task",
"mcp__dutify__pm_get_subtasks",
"mcp__dutify__pm_list_task_types",
"mcp__dutify__pm_list_task_comments",
"mcp__dutify__pm_list_task_relationships",
"mcp__dutify__pm_list_views",
"mcp__dutify__pm_get_view",
"mcp__dutify__pm_list_sprint_groups",
"mcp__dutify__pm_get_sprint",
"mcp__dutify__pm_get_sprint_tasks",
"mcp__dutify__pm_get_sprint_burndown",
"mcp__dutify__pm_list_webhooks",
"mcp__dutify__pm_get_webhook_usage",
"mcp__dutify__pm_get_webhook",
"mcp__dutify__pm_list_webhook_deliveries",
"mcp__dutify__pm_read_activity_log",
"mcp__dutify__pm_list_notifications",
"mcp__dutify__pm_count_unread_notifications",
"mcp__dutify__pm_list_time_entries",
"mcp__dutify__pm_list_saved_filters",
"mcp__dutify__pm_list_comment_reactions",
"mcp__dutify__pm_list_reference_data",
"mcp__dutify__pm_get_task_sharing",
"mcp__dutify__pm_get_tag",
"mcp__dutify__pm_list_teams",
"mcp__dutify__pm_get_team",
"mcp__dutify__pm_get_current_user",
"mcp__dutify__pm_get_notification_settings",
"mcp__dutify__pm_get_workspace_user_avatar_url",
"mcp__dutify__pm_list_automations_for_list",
"mcp__dutify__pm_list_automations_for_folder",
"mcp__dutify__pm_list_automations_for_space",
"mcp__dutify__pm_get_automation",
"mcp__dutify__pm_get_automation_audit",
"mcp__dutify__pm_list_workspace_members",
"mcp__dutify__pm_list_invitations",
"mcp__dutify__pm_list_import_jobs",
"mcp__dutify__pm_get_import_job",
"mcp__dutify__pm_describe_status_priority_level_endpoints",
"mcp__dutify__hub_get_workspace",
"mcp__dutify__hub_list_members",
"mcp__dutify__hub_get_custom_prompt",
"mcp__dutify__hub_get_preferred_integration",
"mcp__dutify__hub_get_default_workspace",
"mcp__dutify__hub_list_integrations",
"mcp__dutify__hub_get_recording_progress",
"mcp__dutify__hub_get_media_url",
"mcp__dutify__hub_get_preview_url",
"mcp__dutify__hub_list_calls",
"mcp__dutify__hub_count_calls",
"mcp__dutify__hub_get_call",
"mcp__dutify__hub_search_calls",
"mcp__dutify__hub_count_search_calls",
"mcp__dutify__hub_list_calendar_events",
"mcp__dutify__get_api_catalog"
],
"ask": [
"mcp__dutify__wiki_create_page",
"mcp__dutify__wiki_create_space",
"mcp__dutify__wiki_check_public_slug",
"mcp__dutify__wiki_request_attachment_upload",
"mcp__dutify__fr_create_request",
"mcp__dutify__fr_comment_request",
"mcp__dutify__fr_create_bug",
"mcp__dutify__fr_comment_bug",
"mcp__dutify__pm_create_task",
"mcp__dutify__pm_create_task_comment",
"mcp__dutify__pm_create_task_relationship",
"mcp__dutify__pm_create_space",
"mcp__dutify__pm_create_folder",
"mcp__dutify__pm_create_list",
"mcp__dutify__pm_create_custom_field",
"mcp__dutify__pm_create_view",
"mcp__dutify__pm_clone_view",
"mcp__dutify__pm_create_sprint_group",
"mcp__dutify__pm_create_sprint",
"mcp__dutify__pm_create_webhook",
"mcp__dutify__pm_log_time",
"mcp__dutify__pm_create_tag",
"mcp__dutify__pm_create_team",
"mcp__dutify__pm_create_automation",
"mcp__dutify__hub_get_audio_url"
],
"deny": [
"mcp__dutify__wiki_update_page",
"mcp__dutify__wiki_move_page",
"mcp__dutify__wiki_delete_page",
"mcp__dutify__wiki_enable_page_share",
"mcp__dutify__wiki_disable_page_share",
"mcp__dutify__wiki_update_space",
"mcp__dutify__wiki_delete_space",
"mcp__dutify__wiki_set_public_settings",
"mcp__dutify__wiki_confirm_attachment",
"mcp__dutify__wiki_delete_attachment",
"mcp__dutify__fr_set_request_status",
"mcp__dutify__fr_vote_request",
"mcp__dutify__fr_moderate_request",
"mcp__dutify__fr_delete_request",
"mcp__dutify__fr_set_bug_status",
"mcp__dutify__fr_set_bug_assignee",
"mcp__dutify__fr_set_bug_visibility",
"mcp__dutify__fr_toggle_bug_affected",
"mcp__dutify__fr_moderate_bug",
"mcp__dutify__fr_delete_bug",
"mcp__dutify__pm_update_task",
"mcp__dutify__pm_delete_task",
"mcp__dutify__pm_bulk_change_task_type",
"mcp__dutify__pm_update_task_comment",
"mcp__dutify__pm_delete_task_comment",
"mcp__dutify__pm_delete_task_relationship",
"mcp__dutify__pm_update_folder",
"mcp__dutify__pm_delete_folder",
"mcp__dutify__pm_update_list",
"mcp__dutify__pm_delete_list",
"mcp__dutify__pm_update_custom_field",
"mcp__dutify__pm_delete_custom_field",
"mcp__dutify__pm_update_view",
"mcp__dutify__pm_delete_view",
"mcp__dutify__pm_update_sprint",
"mcp__dutify__pm_delete_sprint",
"mcp__dutify__pm_start_sprint",
"mcp__dutify__pm_complete_sprint",
"mcp__dutify__pm_add_tasks_to_sprint",
"mcp__dutify__pm_remove_tasks_from_sprint",
"mcp__dutify__pm_update_webhook",
"mcp__dutify__pm_delete_webhook",
"mcp__dutify__pm_test_webhook",
"mcp__dutify__pm_replay_webhook_delivery",
"mcp__dutify__pm_mark_notification_read",
"mcp__dutify__pm_mark_all_notifications_read",
"mcp__dutify__pm_delete_time_entry",
"mcp__dutify__pm_save_filter",
"mcp__dutify__pm_delete_saved_filter",
"mcp__dutify__pm_add_comment_reaction",
"mcp__dutify__pm_remove_comment_reaction",
"mcp__dutify__pm_configure_task_sharing",
"mcp__dutify__pm_update_tag",
"mcp__dutify__pm_delete_tag",
"mcp__dutify__pm_update_team",
"mcp__dutify__pm_delete_team",
"mcp__dutify__pm_add_team_member",
"mcp__dutify__pm_remove_team_member",
"mcp__dutify__pm_update_current_user",
"mcp__dutify__pm_update_notification_channel",
"mcp__dutify__pm_update_automation",
"mcp__dutify__pm_delete_automation",
"mcp__dutify__pm_change_member_role",
"mcp__dutify__pm_remove_workspace_member",
"mcp__dutify__pm_transfer_workspace_ownership",
"mcp__dutify__pm_leave_workspace",
"mcp__dutify__pm_send_invitation",
"mcp__dutify__pm_cancel_invitation",
"mcp__dutify__pm_confirm_import_mappings",
"mcp__dutify__hub_set_custom_prompt",
"mcp__dutify__hub_set_preferred_integration",
"mcp__dutify__hub_set_default_workspace",
"mcp__dutify__hub_regenerate_summary",
"mcp__dutify__hub_reprocess_recording",
"mcp__dutify__hub_delete_call",
"mcp__dutify__hub_send_call_to_jira",
"mcp__dutify__hub_send_call_to_clickup",
"mcp__dutify__hub_send_call_to_airtable",
"mcp__dutify__hub_set_event_custom_prompt",
"mcp__dutify__hub_clear_event_custom_prompt",
"mcp__dutify__hub_set_series_custom_prompt",
"mcp__dutify__hub_clear_series_custom_prompt",
"mcp__dutify__hub_set_call_custom_prompt",
"mcp__dutify__hub_clear_call_custom_prompt",
"mcp__dutify__hub_lens_chat"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as dutify. Review it before you use it.
Capability tags behind 128 rules
- mcp__dutify__whoami private-data
- mcp__dutify__find_my_workspace private-data
- mcp__dutify__list_workspaces private-data
- mcp__dutify__wiki_create_page untrusted-input
- mcp__dutify__wiki_update_page untrusted-input
- mcp__dutify__wiki_move_page untrusted-input
- mcp__dutify__wiki_delete_page untrusted-input
- mcp__dutify__wiki_get_page_share untrusted-input
- mcp__dutify__wiki_enable_page_share untrusted-input
- mcp__dutify__wiki_disable_page_share untrusted-input
- mcp__dutify__wiki_create_space untrusted-input
- mcp__dutify__wiki_update_space untrusted-input
- mcp__dutify__wiki_delete_space untrusted-input
- mcp__dutify__wiki_get_public_settings untrusted-input
- mcp__dutify__wiki_set_public_settings untrusted-input
- mcp__dutify__wiki_request_attachment_upload untrusted-input
- mcp__dutify__wiki_confirm_attachment untrusted-input
- mcp__dutify__wiki_delete_attachment untrusted-input
- mcp__dutify__fr_create_request untrusted-input
- mcp__dutify__fr_set_request_status untrusted-input
- mcp__dutify__fr_comment_request untrusted-input
- mcp__dutify__fr_vote_request untrusted-input
- mcp__dutify__fr_moderate_request untrusted-input
- mcp__dutify__fr_delete_request untrusted-input
- mcp__dutify__fr_create_bug untrusted-input
- mcp__dutify__fr_set_bug_status untrusted-input
- mcp__dutify__fr_set_bug_assignee untrusted-input
- mcp__dutify__fr_set_bug_visibility untrusted-input
- mcp__dutify__fr_toggle_bug_affected untrusted-input
- mcp__dutify__fr_comment_bug untrusted-input
- mcp__dutify__fr_moderate_bug untrusted-input
- mcp__dutify__fr_delete_bug untrusted-input
- mcp__dutify__pm_get_workspace_context private-data
- mcp__dutify__pm_create_task untrusted-input
- mcp__dutify__pm_update_task untrusted-input
- mcp__dutify__pm_delete_task untrusted-input
- mcp__dutify__pm_bulk_change_task_type untrusted-input
- mcp__dutify__pm_list_task_comments untrusted-input
- mcp__dutify__pm_create_task_comment untrusted-input, outbound
- mcp__dutify__pm_update_task_comment untrusted-input, outbound
- mcp__dutify__pm_delete_task_comment untrusted-input
- mcp__dutify__pm_create_task_relationship untrusted-input
- mcp__dutify__pm_delete_task_relationship untrusted-input
- mcp__dutify__pm_create_space untrusted-input
- mcp__dutify__pm_create_folder untrusted-input
- mcp__dutify__pm_update_folder untrusted-input
- mcp__dutify__pm_delete_folder untrusted-input
- mcp__dutify__pm_create_list untrusted-input
- mcp__dutify__pm_update_list untrusted-input
- mcp__dutify__pm_delete_list untrusted-input
- mcp__dutify__pm_create_custom_field untrusted-input
- mcp__dutify__pm_update_custom_field untrusted-input
- mcp__dutify__pm_delete_custom_field untrusted-input
- mcp__dutify__pm_create_view untrusted-input
- mcp__dutify__pm_update_view untrusted-input
- mcp__dutify__pm_delete_view untrusted-input
- mcp__dutify__pm_clone_view untrusted-input
- mcp__dutify__pm_create_sprint_group untrusted-input
- mcp__dutify__pm_create_sprint untrusted-input
- mcp__dutify__pm_update_sprint untrusted-input
- mcp__dutify__pm_delete_sprint untrusted-input
- mcp__dutify__pm_start_sprint untrusted-input
- mcp__dutify__pm_complete_sprint untrusted-input
- mcp__dutify__pm_add_tasks_to_sprint untrusted-input
- mcp__dutify__pm_remove_tasks_from_sprint untrusted-input
- mcp__dutify__pm_create_webhook untrusted-input, outbound
- mcp__dutify__pm_update_webhook untrusted-input
- mcp__dutify__pm_delete_webhook untrusted-input
- mcp__dutify__pm_test_webhook untrusted-input
- mcp__dutify__pm_replay_webhook_delivery untrusted-input
- mcp__dutify__pm_mark_notification_read untrusted-input
- mcp__dutify__pm_mark_all_notifications_read untrusted-input
- mcp__dutify__pm_log_time untrusted-input
- mcp__dutify__pm_delete_time_entry untrusted-input
- mcp__dutify__pm_save_filter untrusted-input
- mcp__dutify__pm_delete_saved_filter untrusted-input
- mcp__dutify__pm_add_comment_reaction untrusted-input, outbound
- mcp__dutify__pm_list_comment_reactions untrusted-input
- mcp__dutify__pm_remove_comment_reaction untrusted-input
- mcp__dutify__pm_configure_task_sharing untrusted-input
- mcp__dutify__pm_create_tag untrusted-input
- mcp__dutify__pm_update_tag untrusted-input
- mcp__dutify__pm_delete_tag untrusted-input
- mcp__dutify__pm_create_team untrusted-input
- mcp__dutify__pm_update_team untrusted-input
- mcp__dutify__pm_delete_team untrusted-input
- mcp__dutify__pm_add_team_member untrusted-input
- mcp__dutify__pm_remove_team_member untrusted-input
- mcp__dutify__pm_get_current_user private-data, untrusted-input
- mcp__dutify__pm_update_current_user untrusted-input
- mcp__dutify__pm_get_notification_settings private-data, untrusted-input
- mcp__dutify__pm_update_notification_channel untrusted-input
- mcp__dutify__pm_get_workspace_user_avatar_url untrusted-input
- mcp__dutify__pm_list_automations_for_folder private-data
- mcp__dutify__pm_create_automation untrusted-input
- mcp__dutify__pm_update_automation untrusted-input
- mcp__dutify__pm_delete_automation untrusted-input
- mcp__dutify__pm_change_member_role untrusted-input
- mcp__dutify__pm_remove_workspace_member untrusted-input
- mcp__dutify__pm_transfer_workspace_ownership untrusted-input
- mcp__dutify__pm_leave_workspace untrusted-input
- mcp__dutify__pm_send_invitation untrusted-input, outbound
- mcp__dutify__pm_cancel_invitation untrusted-input
- mcp__dutify__pm_confirm_import_mappings untrusted-input
- mcp__dutify__pm_describe_status_priority_level_endpoints private-data
- mcp__dutify__hub_get_custom_prompt private-data
- mcp__dutify__hub_set_custom_prompt untrusted-input
- mcp__dutify__hub_set_preferred_integration untrusted-input
- mcp__dutify__hub_get_default_workspace private-data
- mcp__dutify__hub_set_default_workspace untrusted-input
- mcp__dutify__hub_regenerate_summary untrusted-input
- mcp__dutify__hub_reprocess_recording untrusted-input
- mcp__dutify__hub_get_audio_url untrusted-input
- mcp__dutify__hub_get_media_url untrusted-input
- mcp__dutify__hub_get_preview_url untrusted-input
- mcp__dutify__hub_delete_call untrusted-input
- mcp__dutify__hub_send_call_to_jira untrusted-input, outbound
- mcp__dutify__hub_send_call_to_clickup untrusted-input, outbound
- mcp__dutify__hub_send_call_to_airtable untrusted-input, outbound
- mcp__dutify__hub_list_calendar_events private-data
- mcp__dutify__hub_set_event_custom_prompt untrusted-input
- mcp__dutify__hub_clear_event_custom_prompt untrusted-input
- mcp__dutify__hub_set_series_custom_prompt untrusted-input
- mcp__dutify__hub_clear_series_custom_prompt untrusted-input
- mcp__dutify__hub_set_call_custom_prompt untrusted-input
- mcp__dutify__hub_clear_call_custom_prompt untrusted-input
- mcp__dutify__hub_lens_chat untrusted-input
- mcp__dutify__get_api_catalog untrusted-input
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/io.github.dutifyai/dutify/verify?hash=0fbf7f090d0670007e622d32b5f032641e6e21546e12246c2ecdee6e34280ac5" | jq -e '.changed == false'Pinned hash 0fbf7f090d06, from Oct 24, 2026, 19:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/io.github.dutifyai/dutify/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.github.dutifyai/dutify)Source: MCP Registry · repository. Synced Oct 24, 2026, 19:17 UTC.