Taskhold
com.taskhold/taskholdtaskhold.comstreamable-httpv1.0.3Scanned
Task list for you and your coding agents: what's next, live progress per step, ask when blocked.
22 tools: 3 can delete or cancel things, 12 change things and 7 only read.
- Reads private data · 1
- Reads text others write · 0
- Can send data out · 0
- 1 finding
Tools listed without sign-in. Remote posture
Anlyon alternative
15 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.
22 tools
Deletes or cancels 3Claude Code: deny
taskhold_planAdd ordered steps (subtasks) to a task so the person sees a checklist; the progress bar fills as steps finish.No findings
Why it is in this group
- The description's first verb is "add": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Add ordered steps (subtasks) to a task so the person sees a checklist; the progress bar fills as steps finish. taskhold_begin already does this for new work. For an existing task: taskhold_start it, then taskhold_plan. Steps don't nest. Returns the task's whole step list with ids. Fails on an unknown task_id, on a step (plan its parent) or past 200 steps per task. Planning a done task adds todo steps but leaves it done; taskhold_start it to reopen.
Annotations the server declares
- title: Plan task steps
- readOnlyHint: false
- destructiveHint: true
- openWorldHint: false
taskhold_updateUpdate a task's title, description, priority or project.No findings
Why it is in this group
- The name "taskhold_update" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Update a task's title, description, priority or project. Only fields you pass change; status goes through taskhold_start, taskhold_complete and taskhold_block. Returns the task as it is now. Fails on an unknown task_id, a project_id that doesn't exist (pass project by name instead) or an invalid project name.
Annotations the server declares
- title: Edit a task
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
taskhold_update_projectChange a project's name, description or color.No findings
Why it is in this group
- The name "taskhold_update_project" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Change a project's name, description or color. Only fields you pass change. Returns the project as it is now. Fails on an unknown project (it is never created here), on a name another project already has, or with nothing to change.
Annotations the server declares
- title: Edit a project
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
Changes things 12Claude Code: ask
taskhold_add_noteAdd a note to a task: findings, decisions, what you tried.No findings
Why it is in this group
- The name "taskhold_add_note" says "add": a word for a change.
Description, as the server wrote it Add a note to a task: findings, decisions, what you tried. The person reads these. Notes are append-only and shown oldest first (taskhold_get shows the latest 10). Returns a one-line confirmation; an unknown task_id fails with "Task not found".
Annotations the server declares
- title: Add a note
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
taskhold_beginStart work in one call: files a new task (or takes an existing one with task_id), plans its steps, marks it in progress and starts the first step.No findings
Why it is in this group
- The description's first verb is "start": a word for a change.
Description, as the server wrote it Start work in one call: files a new task (or takes an existing one with task_id), plans its steps, marks it in progress and starts the first step. Use this whenever the person asks for something: it puts the request on their board with a checklist and a progress bar. Returns the task id, the numbered steps with ids, the step now running and a cursor for taskhold_updates. Every event of the call (created, planned, started) carries the agent label. On a task already under way it appends the steps. Fails without title or task_id, on an unknown task_id (get one from taskhold_list) or on a step (begin its parent, or taskhold_start the step).
Annotations the server declares
- title: Begin a task
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
taskhold_blockMark a task (or step) blocked when you can't continue without the person (a decision, missing info, access).No findings
Why it is in this group
- The description's first verb is "mark": a word for a change.
Description, as the server wrote it Mark a task (or step) blocked when you can't continue without the person (a decision, missing info, access). Returns the question and the exact taskhold_updates call to wait with. Write the reason as one question they can answer from the board in a line, e.g. "Decide: drop the legacy column or keep it nullable?". When the answer is a choice, pass 2-4 short options (and recommended, the index of the one you'd pick, 0 = first): the person answers with one tap and the reply reads Reply to "<question>": chose "<option>". if_no_answer says what you'll do if nobody answers. The board shows it under Needs you and their reply arrives as a note. Then wait for it with taskhold_updates {task_id, since, wait: 50}; keep working on anything that doesn't depend on it meanwhile. If the reply doesn't settle it, block again with a narrower question; don't guess. Blocking an already-blocked task asks the new question instead, and the earlier question stays in the task's history; an unknown task_id fails with "Task not found".
Annotations the server declares
- title: Block a task with a question
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
taskhold_completeMark a task or step done, with a summary of what you did and, optionally, a structured outcome: files changed (with +/- line counts), checks run (pass/fail/skip), links (PR, commit…No findings
Why it is in this group
- The description's first verb is "mark": a word for a change.
Description, as the server wrote it Mark a task or step done, with a summary of what you did and, optionally, a structured outcome: files changed (with +/- line counts), checks run (pass/fail/skip), links (PR, commit, branch, deploy, doc), follow-up task ids, risks and how the person can verify it. The person sees it as a What changed card; a step's outcome rolls up to its task. When the person should look at the work, pass needs_review: true with outcome.verify (how you checked it): the task lands in their Ready for review queue. Completing a step tells you the next one; start_next: true also starts it, and finish_task: true on the last open step closes the task too (with the same summary) in one call. For a step it returns steps done, the task's bar and the next step's id (or, after the last step, a reminder to complete the task). Completing a task closes its open steps. Repeating it on a task that is already done changes nothing and keeps the first summary (add more with taskhold_add_note); an unknown task_id fails with "Task not found", an invalid outcome fails without changing anything.
Annotations the server declares
- title: Complete a task
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
taskhold_createFile work for later: a bug, a refactor, a follow-up you aren't doing now (it lands in To Do).No findings
Why it is in this group
- The name "taskhold_create" says "create": a word for a change.
Description, as the server wrote it File work for later: a bug, a refactor, a follow-up you aren't doing now (it lands in To Do). To file and start work at once, use taskhold_begin. Pass parent_task_id to add one step to an existing task (taskhold_plan for several). Returns the new id, status (todo) and priority. Fails if parent_task_id isn't found or is itself a step (steps don't nest), if project_id doesn't exist (pass project by name instead), or at the account's task ceiling.
Annotations the server declares
- title: Create a task
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
taskhold_create_from_todoCreate a task from a TODO comment in code, keeping the file path and line number (label todo-from-code plus any labels you pass; priority as in taskhold_create; use taskhold_create…No findings
Why it is in this group
- The name "taskhold_create_from_todo" says "create": a word for a change.
Description, as the server wrote it Create a task from a TODO comment in code, keeping the file path and line number (label todo-from-code plus any labels you pass; priority as in taskhold_create; use taskhold_create for anything else). Returns the new task with its id and code location. Fails at the account's task ceiling or on an invalid project name.
Annotations the server declares
- title: Create a task from a TODO
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
taskhold_create_projectCreate a project (a group of tasks, usually one per repo).No findings
Why it is in this group
- The name "taskhold_create_project" says "create": a word for a change.
Description, as the server wrote it Create a project (a group of tasks, usually one per repo). Optional: any tool that takes project creates it on first use. Returns the existing project if one has this name (case-insensitive), without changing it: the reply says if your description or color wasn't applied (taskhold_update_project changes them). Says whether it was created, restored or already existed, plus its id. Fails on an invalid name or at the account's project ceiling (the error says what to do).
Annotations the server declares
- title: Create a project
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
taskhold_progressMove the person's progress bar during a long step or a task without steps: percent, or current and total (e.g.No findings
Why it is in this group
- The description's first verb is "move": a word for a change.
Description, as the server wrote it Move the person's progress bar during a long step or a task without steps: percent, or current and total (e.g. 12 of 40 files), plus a short message about what's happening now. On a task with steps, the steps drive the bar: numbers you send for the task go to its running step. Call at milestones, every few minutes at most. Returns the task's progress bar and, on a task with steps, which step your numbers went to. Fails without percent, total or message, on an unknown task_id, or past the per-minute limit (the error says when to retry).
Annotations the server declares
- title: Report progress
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
taskhold_set_priorityChange a task's priority.No findings
Why it is in this group
- The name "taskhold_set_priority" says "set": a word for a change.
Description, as the server wrote it Change a task's priority. Returns the task title and new priority; an unknown task_id fails with "Task not found".
Annotations the server declares
- title: Set priority
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
taskhold_startMark a task or step in progress when you begin it.No findings
Why it is in this group
- The name "taskhold_start" says "start": a word for a change.
Description, as the server wrote it Mark a task or step in progress when you begin it. Starting a step also starts its task. For new work, taskhold_begin files, plans and starts in one call. Returns the id, status and the next step's id when it has steps. Safe to repeat; it also resumes a blocked or done task. An unknown task_id fails with "Task not found".
Annotations the server declares
- title: Start a task
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
taskhold_unblockMove a blocked task back to todo once the blocker is resolved (taskhold_start resumes it directly).No findings
Why it is in this group
- The description's first verb is "move": a word for a change.
Description, as the server wrote it Move a blocked task back to todo once the blocker is resolved (taskhold_start resumes it directly). Returns the task with status todo. A task that isn't blocked is left as it is and the reply says its status; an unknown task_id fails with "Task not found".
Annotations the server declares
- title: Unblock a task
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
taskhold_updatesWhat the person changed since you last looked: replies (notes), new tasks, priority changes, unblocks.1 finding
Why it is in this group
- The name "taskhold_updates" says "update": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "taskhold_updates" 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,"openWorldHint":false}; The name "taskhold_updates" says "update": a word for a change.
Description, as the server wrote it What the person changed since you last looked: replies (notes), new tasks, priority changes, unblocks. Call when you resume, between steps, and after blocking (with wait, to hold until the reply lands). Pass the cursor from the previous call (or from taskhold_begin / taskhold_block) as since. Your own changes are hidden unless include_agent is true. Returns one line per change, oldest first (time, who, task, what changed, task id), then the cursor for next time; with nothing new it says so and still gives a cursor. An unknown project returns no changes; an unknown task_id fails with "Task not found".
Annotations the server declares
- title: Get the person's updates
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
Only reads 7Show 7 read-only tools
taskhold_getGet one task with its full description, steps (subtasks), progress, labels and the latest notes.Reads private dataNo findings
Why it is in this group
- The name "taskhold_get" 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 one task with its full description, steps (subtasks), progress, labels and the latest notes. Returns status, priority, project, the numbered steps with ids (each with its description and, once done, its summary), up to 10 latest notes, the completion summary and what changed (files, checks, links, risks, how to verify) when it was reported. An unknown task_id fails with "Task not found"; get a valid id from taskhold_list (status "all") or taskhold_search.
Annotations the server declares
- title: Get a task
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
taskhold_get_currentGet the task in progress (in this project when you pass project), with its steps and the next one to do.No findings
Why it is in this group
- The name "taskhold_get_current" says "get": a word for reading.
Description, as the server wrote it Get the task in progress (in this project when you pass project), with its steps and the next one to do. Call this at the start of a session. Returns the most recently active in-progress task, its numbered steps with ids (with descriptions and the summaries of done steps), the next step's id and the latest 3 notes (taskhold_get shows 10); with nothing in progress (or an unknown project) it says so and names taskhold_begin and taskhold_list.
Annotations the server declares
- title: Get current tasks
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
taskhold_get_summaryTask counts by status, priority and who added them (human or agent).No findings
Why it is in this group
- The name "taskhold_get_summary" says "get": a word for reading.
Description, as the server wrote it Task counts by status, priority and who added them (human or agent). Returns the total and one list per grouping; counts top-level tasks only, not steps.
Annotations the server declares
- title: Get a summary
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
taskhold_listList top-level tasks, one line each, grouped by status.No findings
Why it is in this group
- The name "taskhold_list" says "list": a word for reading.
Description, as the server wrote it List top-level tasks, one line each, grouped by status. Pass project to see one repo's work. Each line has status, title, steps done, progress and id; steps aren't listed (taskhold_get shows them). An unknown project name returns no tasks and is not created.
Annotations the server declares
- title: List tasks
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
taskhold_list_labelsList the account's labels, one name per line.No findings
Why it is in this group
- The name "taskhold_list_labels" says "list": a word for reading.
Description, as the server wrote it List the account's labels, one name per line. Labels are created by passing them to taskhold_create or taskhold_begin.
Annotations the server declares
- title: List labels
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
taskhold_list_projectsList projects with their open work, one line each.No findings
Why it is in this group
- The name "taskhold_list_projects" says "list": a word for reading.
Description, as the server wrote it List projects with their open work, one line each. You rarely need this: every tool takes project as a name. Each line has the name, open counts (working, blocked, todo) and id.
Annotations the server declares
- title: List projects
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
taskhold_searchSearch tasks and steps by text in the title or description (case-insensitive, up to 100 tasks scanned).No findings
Why it is in this group
- The name "taskhold_search" says "search": a word for reading.
Description, as the server wrote it Search tasks and steps by text in the title or description (case-insensitive, up to 100 tasks scanned). Returns matching lines grouped by status, with ids (a step names the task it belongs to), or a line saying nothing matched.
Annotations the server declares
- title: Search tasks
- readOnlyHint: true
- destructiveHint: false
- 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.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged untrusted-input or outbound.
- Reads private data1
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write0
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Remote posture
What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.
Looked at Oct 29, 2026, 21:44 UTC, unchanged since Oct 29, 2026. No credentials were sent and no tool was called. What is looked at.
- Reachable
- yes
- HTTP status of an anonymous initialize
- 200
- tools/list served without credentials
- yes
- Tools that change things, listed without credentials
- 14
- Protocol version
- 2025-06-18
- WWW-Authenticate on 401
- not observed
- resource_metadata in WWW-Authenticate
- not observed
- RFC 9728 protected resource metadata
- not observed
- Authorization servers
- not observed
- Legacy HTTP+SSE transport
- no
- Dynamic client registration
- not observed
- Client ID metadata documents
- not observed
- WarnThe whole server
The endpoint served tools/list without credentials, and the list has 14 tools that change things (14 write). Whether a call also works without credentials was not tested: tools are never called.
What this check looks forMatched text
https://taskhold.com/api/mcp: tools/list returned 21 tools to an anonymous client, including taskhold_begin (write), taskhold_create (write), taskhold_plan (write), taskhold_progress (write), taskhold_create_from_todo (write) and 9 more
Posture changes
- Oct 29, 2026
- HTTP status of an anonymous initialize: 401 to 200
- tools/list served without credentials: no to yes
- Tools that change things, listed without credentials: 0 to 14
- Protocol version: none to 2025-06-18
- WWW-Authenticate on 401: no to not observed
Findings
Matches of fixed checks, with the text they matched.
- Warntaskhold_updates
The server marks "taskhold_updates" 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,"openWorldHint":false}; The name "taskhold_updates" says "update": a word for a change.
History
Changes to its tool definitions and to its remote endpoint, newest first.
PostureRemote posture changed. HTTP status of an anonymous initialize: 401 -> 200; tools/list served without credentials: no -> yes; Tools that change things, listed without credentials: 0 -> 14 (and 2 more).View diff
- HTTP status of an anonymous initialize: 401 to 200
- tools/list served without credentials: no to yes
- Tools that change things, listed without credentials: 0 to 14
- Protocol version: none to 2025-06-18
- WWW-Authenticate on 401: no to not observed
Install
Pinned to version 1.0.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http taskhold https://taskhold.com/api/mcpclaude mcp add --transport http taskhold https://taskhold.com/api/mcpRun 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__taskhold__taskhold_list",
"mcp__taskhold__taskhold_get",
"mcp__taskhold__taskhold_get_current",
"mcp__taskhold__taskhold_search",
"mcp__taskhold__taskhold_list_projects",
"mcp__taskhold__taskhold_list_labels",
"mcp__taskhold__taskhold_get_summary"
],
"ask": [
"mcp__taskhold__taskhold_begin",
"mcp__taskhold__taskhold_create",
"mcp__taskhold__taskhold_progress",
"mcp__taskhold__taskhold_create_from_todo",
"mcp__taskhold__taskhold_start",
"mcp__taskhold__taskhold_complete",
"mcp__taskhold__taskhold_block",
"mcp__taskhold__taskhold_unblock",
"mcp__taskhold__taskhold_add_note",
"mcp__taskhold__taskhold_set_priority",
"mcp__taskhold__taskhold_updates",
"mcp__taskhold__taskhold_create_project"
],
"deny": [
"mcp__taskhold__taskhold_plan",
"mcp__taskhold__taskhold_update",
"mcp__taskhold__taskhold_update_project"
]
}
}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 taskhold. Review it before you use it.
Capability tags behind 1 rule
- mcp__taskhold__taskhold_get private-data
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/com.taskhold/taskhold/verify?hash=cdaf6b4d3236e743b42b70ed0f1e8596af1b35ffc81085cd444439d064aef39b" | jq -e '.changed == false'Pinned hash cdaf6b4d3236, from Oct 31, 2026, 17:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/com.taskhold/taskhold/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/com.taskhold/taskhold)Source: MCP Registry. Synced Oct 31, 2026, 17:17 UTC.