
mastra-best-practices
Mastra architectural patterns. Covers agent vs workflow choice, project structure, TypeScript ES2022 requirements, API keys setup, and accessing via mastra.getAgent/getWorkflow.
Mastra architectural patterns. Covers agent vs workflow choice, project structure, TypeScript ES2022 requirements, API keys setup, and accessing via mastra.getAgent/getWorkflow.
Mastra Best Practices
Quick reference for Mastra conventions. See mastra.ai/docs for details.
Agent vs Workflow
| Use | When |
|---|---|
| Agent | Open-ended tasks (support, research) - reasons, decides tools, retains memory |
| Workflow | Defined sequences (pipelines, approvals) - orchestrates specific steps in order |
TypeScript Config (Required)
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "bundler"
}
}
Critical: CommonJS causes errors. Must use ES2022.
Project Structure
src/mastra/
├── tools/ # Custom tools
├── agents/ # Agent configs
├── workflows/ # Workflows
└── index.ts # Mastra instance
Environment Variables
OPENAI_API_KEY=...
ANTHROPIC_API_KEY=...
GOOGLE_GENERATIVE_AI_API_KEY=...
Quick Reference
Basic Agent
new Agent({
id: 'my-agent',
name: 'My Agent',
instructions: 'You are helpful',
model: 'openai/gpt-4o',
tools: { myTool } // optional
})
Basic Workflow
createWorkflow({
id: 'my-workflow',
inputSchema: z.object({ input: z.string() }),
outputSchema: z.object({ output: z.string() })
})
.then(step1)
.commit()
Structured Output
const response = await agent.generate('Extract: John, 30', {
structuredOutput: {
schema: z.object({
name: z.string(),
age: z.number()
})
}
})
console.log(response.object) // Access via .object property
Streaming
const stream = await agent.stream('Tell a story')
for await (const chunk of stream.fullStream) {
console.log(chunk)
}
Key Conventions
- Use
mastra.getAgent('name')/mastra.getWorkflow('name')not direct imports - Always use env vars for API keys
- ES2022 modules required (not CommonJS)
- Test with Studio:
npm run dev→ http://localhost:4111
Resources
You Might Also Like
Related Skills

coding-agent
Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.
openclaw
add-uint-support
Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
pytorch
at-dispatch-v2
Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
pytorch
skill-writer
Guide users through creating Agent Skills for Claude Code. Use when the user wants to create, write, author, or design a new Skill, or needs help with SKILL.md files, frontmatter, or skill structure.
pytorch
implementing-jsc-classes-cpp
Implements JavaScript classes in C++ using JavaScriptCore. Use when creating new JS classes with C++ bindings, prototypes, or constructors.
oven-sh
implementing-jsc-classes-zig
Creates JavaScript classes using Bun's Zig bindings generator (.classes.ts). Use when implementing new JS APIs in Zig with JSC integration.
oven-sh