Taskr - Persistent Task Planning & Execution for AI Agents
Persistent cloud task planning and execution for OpenClaw. Create hierarchical task plans that survive session resets, span multiple agents, and let users re...
Persistent cloud task planning and execution for OpenClaw. Create hierarchical task plans that survive session resets, span multiple agents, and let users re...
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Taskr gives OpenClaw agents persistent, structured task management that lives outside the chat session. Plans survive context resets, can be resumed by any agent on any machine, and are always visible to the user via the Taskr web app, VS Code extension, or mobile.
Six things Taskr does for OpenClaw:
get_task transfers ownership automaticallytask_sync records work done before Taskr was active, closing gaps in historyopen, wip, done, skipped) give both agent and user an unambiguous, real-time picture of progressUse Taskr when:
Skip Taskr for:
Proactive default: For any substantial work, offer Taskr before starting:
"I'll plan this in Taskr first — you can review the task breakdown before I start. Sound good?"
Once Taskr is active, stay in Taskr. Don't abandon tasks mid-workflow. Incomplete tasks in the dashboard are confusing and break the audit trail.
Plan → Create → Create CONTEXT note → Review with user → Execute → Document → Repeat
create_task with taskListTitle to build the entire hierarchy in one callget_task → do the work → update_task status=done → repeatSingle-task discipline: Work on exactly one task at a time.
get_task sets you as owner (wip). Complete or skip before moving on.
Use
create_task with taskListTitle to create a new task list. Submit 1–100 tasks in a single call — always create the full hierarchy upfront so the user can review before execution begins.
Hierarchy positions:
"1", "2", "3" — top-level phases (direct children of the task list)"1.1", "1.2" — subtasks under phase 1"1.1.1" — deeper nesting (max 10 levels)Task types:
setup, analysis, implementation, validation, testing
Keep tasks focused. If a task feels too large to complete in one agent turn, break it into subtasks — at creation time or mid-execution via
create_task + parentId. Subtasks prevent context overload and make progress visible at the right granularity.
After creating a task list, always immediately create a CONTEXT note on the task list:
create_note(type="CONTEXT", title="[Task List] — Context", body="...", taskId="TL_...")
Call
get_task to acquire your next task. It automatically sets status to wip and assigns ownership. Use get_task — do not manually set tasks to wip.
task_list_id to continue the current task listtask_list_id=TL_... to switch to a different task listinclude_context=true for additional task context and notesbypass_task_id only for emergency task-switchingStatus mode (one task):
update_task(taskId="TS_...", status="done", ruleContext="RU-PROC-001")
Batch mode (title/description updates only — status NOT allowed in batch):
update_task(tasks=[{taskId, title?, description?}, ...], ruleContext="RU-PROC-001")
Statuses are checkpoints visible to both agent and user in real time. Use them with discipline.
| Status | Meaning |
|---|---|
| Ready to be worked on |
| Actively owned by an agent |
| Completed and verified |
| Deliberately not done — must create a FINDING note explaining why |
Completing the last child of a parent auto-marks the parent
done. You don't need to mark parents manually.
When you discover work outside the current task's scope:
create_task (parentId=current task), complete subtask, resumeUse
get_task_hierarchy to browse and review tasks — not get_task. Never call get_task just to look at structure.
| Scope | What it returns |
|---|---|
| All task lists. Use first for names only — avoids token bloat |
| Full nested hierarchy for one task list. Pass |
| A task and all its descendants. Pass |
Response path for
task_list scope: data.task_lists[0].tasks[0].children[]
Notes attach to tasks. A finding discovered during task 2.3 lives on task 2.3 — not floating at the project level. Any agent resuming work later has full context exactly where they need it. This is what keeps information from becoming fragmented.
Note types:
| Type | When to use |
|---|---|
| Background, goals, user preferences, decisions — create on TL_ immediately after task list creation |
| Discoveries, issues, blockers, insights encountered during work |
| Phase completions — only for phase-level tasks (tasks "1", "2", "3" — direct TL children). NOT for leaf tasks |
| Files created, modified, or deleted on the user's system |
| Anything that doesn't fit the above |
Note discipline:
update_notesearch_notes for prior context when resuming workskipped status always requires a FINDING note with the reasonTwo-step note discovery:
list_notes(taskId="TL_...", includeDescendants=true) — get IDs and titles (data.notes.notes[])get_note(noteId="NT_...") — fetch full content when neededUse
task_sync when work happened before Taskr was activated, or to retroactively close gaps in the task history. Three steps:
Step 1 — Survey (no args): lightweight summary of all task lists
task_sync(ruleContext="") → data.sync_check.task_lists[]: {id, name, status, task_count, done_count, open_count, wip_count}
Step 2 — Drill in (pass
task_list_id): flat list of all tasks with title, description, status, level
task_sync(task_list_id="TL_...", ruleContext="") → data.sync_drill_down.tasks[]: {id, task_number, title, description, status, level, parent_id}
Step 3 — Create done tasks (pass
items[]): creates tasks pre-marked as done
task_sync(items=[ { "action": "create_done", "title": "...", "parentId": "TS_or_TL_...", "description": "...", "type": "implementation" } ], ruleContext="")
Each item requires
action: "create_done" and title. parentId (TS_ or TL_) is required unless you provide taskListTitle to create a new task list — items without parentId default to that new list. Up to 50 items per call.
After syncing, attach CONTEXT or FINDING notes to the created tasks to capture the why behind the work.
Taskr state lives in the cloud — not in your context window. To resume work:
search_notes — find prior decisions, context, findingsget_task_hierarchy(scope="project", depth=0) — identify active task listsget_task(task_list_id="TL_...") — pick up ownership where work stoppedAny agent — different session, different machine, different model — can resume exactly where work stopped. The task list is the plan. Notes are the memory. Status is the state.
When credentials are missing:
Get credentials from user:
PR_00000000...)Configure via
:gateway.config.patch
{ "skills": { "entries": { "taskr": { "env": { "MCP_API_URL": "https://taskr.one/api/mcp", "MCP_PROJECT_ID": "<project-id>", "MCP_USER_API_KEY": "<api-key>" } } } } }
Verify: Call
tools/list and confirm create_task is present.
Users can create multiple projects for different work contexts.
For mcporter/other MCP clients:
mcporter config add taskr "$MCP_API_URL" \ --header "x-project-id=$MCP_PROJECT_ID" \ --header "x-user-api-key=$MCP_USER_API_KEY"
| Need | Tool |
|---|---|
| Create plan | (taskListTitle + tasks[]) |
| Add context to new task list | (type=CONTEXT, taskId=TL_) |
| Get next task | |
| Mark done | (taskId, status="done") |
| Mark skipped | (status="skipped") + (FINDING) |
| Browse task structure | |
| Add subtask mid-execution | (parentId=TS_or_TL_) |
| Document a finding | (type=FINDING, taskId=TS_) |
| Phase milestone note | (type=PROGRESS, taskId=TS_ phase task) |
| Retroactive history | (3-step) |
| Resume from prior session | → → |
| Find prior context | or |
ruleContext values: Pass the Rule ID from the schema (e.g.
RU-CTX-001, RU-PROC-001, RU-NOTE-001). Pass "" when the schema says "Leave this parameter blank."No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.