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:
@mastra/core@1.42.0 or later, added in PR #17820.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:
