Use when building or working with Mastra agents - establishes best practices for agent development, tool creation, and workflow orchestration
Core principle: Build composable, observable, and testable AI agents.
Always use when:
Don't use for:
When creating a new agent, use TodoWrite to track:
import { Agent } from '@mastra/core';
const agent = new Agent({
name: 'descriptive-name',
instructions: 'Clear, specific instructions',
model: {
provider: 'ANTHROPIC',
name: 'claude-sonnet-4-5',
},
tools: { /* ... */ },
});
📚 More details: reference.md | https://mastra.ai/docs/agents/
import { z } from 'zod';
const tool = {
id: 'descriptive-id',
description: 'What this tool does',
inputSchema: z.object({
param: z.string().describe('Parameter description'),
}),
execute: async ({ context }) => {
try {
const result = await operation();
return { success: true, data: result };
} catch (error) {
logger.error('Operation failed', { error, context });
return { success: false, error: error.message };
}
},
};
📚 More examples: examples.md | https://mastra.ai/docs/tools/
import { Workflow } from '@mastra/core';
const workflow = new Workflow({
name: 'workflow-name',
triggerSchema: z.object({ input: z.string() }),
});
workflow
.step({ id: 'step1', execute: async () => { /* ... */ } })
.then({ id: 'step2', execute: async () => { /* ... */ } })
.commit();
📚 More examples: examples.md | https://mastra.ai/docs/workflows/
| Excuse | Reality |
|---|---|
| "Agent instructions don't need to be specific" | Vague instructions → unpredictable behavior |
| "Error handling adds complexity" | Unhandled errors → crashed agents |
| "We can add observability later" | Can't debug what you can't observe |
| "Tool schemas are optional" | Invalid inputs → runtime failures |
When integrating external services, use TodoWrite to track:
// Unit test for tools
describe('myTool', () => {
it('should handle valid input', async () => {
const result = await myTool.execute({
context: { param: 'test' },
mastra: mockMastra,
});
expect(result.success).toBe(true);
});
});
// Integration test for agents
describe('myAgent', () => {
it('should respond to queries', async () => {
const response = await myAgent.generate([
{ role: 'user', content: 'test query' }
]);
expect(response.role).toBe('assistant');
});
});
📚 More examples: examples.md
Every agent must have:
1. Clear purpose and instructions
2. Type-safe tools with validation
3. Error handling and observability
4. Tests covering key scenarios
Follow these principles for reliable, maintainable Mastra agents.