Introducing Task Lists for Mastra Agents

Keep your agents on track through long-running, complex work.

Paul ScanlonPaul Scanlon·

Jun 23, 2026

·

2 min read

A TaskSignalProvider gives your agent a plan to follow. It creates a list and provides tools for marking items as pending, in_progress, or completed — keeping the agent on track through long-running, complex work.

A task list breaks the work into structured steps the agent can check off one by one. The agent surfaces the plan up front and outputs updates — so you can follow along while it works.

Task list updates use prompt-cacheable state signals persisted by your agent's Memory. TaskSignalProvider works with message history, working memory, or observational memory.

Get started

Add TaskSignalProvider to your agent's signals. It provides four task tools: task_write, task_update, task_complete, task_check:

note
Requires @mastra/core@1.42.0 or later, added in PR #17820.
TypeScriptsrc/mastra/agents/chef-michael-agent.ts
import { Agent } from "@mastra/core/agent";
import { Memory } from "@mastra/memory";
import { TaskSignalProvider } from "@mastra/core/signals";
import { webResearchTool } from "../tools/web-research";
 
export const chefMichaelAgent = new Agent({
  id: "chef-michael",
  name: "Chef Michael",
  instructions: "You are Chef Michael, a research-driven recipe assistant...",
  model: "anthropic/claude-opus-4-8",
  tools: { webResearchTool },
  memory: new Memory(),
  signals: [new TaskSignalProvider()]
});

Read task_ chunks from an agent's stream to surface the task list status and payload:

const stream = await agent.stream("How do I cook a roast chicken with all the trimmings?", {
  memory: { thread: "thread-123", resource: "user-123" }
});
 
for await (const chunk of stream.fullStream) {
  if (chunk.type === "tool-call" && chunk.payload.toolName?.startsWith("task_")) {
    console.log(chunk.payload.toolName);
    console.log(chunk.payload.args);
  }
}

Read the full task list from the threadState store using threadId:

const store = await mastra.getStorage().getStore("threadState");
const tasks = await store.getState({ threadId: "thread-123", type: "task" });
console.log(tasks);

For more information and full configuration options, see:

Share:
Paul Scanlon
Paul ScanlonTechnical Product Marketing Manager

Paul Scanlon sits between Developer Education and Product Marketing at Mastra. Previously, he was a Technical Product Marketing Manager at Neon and worked in Developer Relations at Gatsby, where he created educational content and developer experiences.

All articles by Paul Scanlon