MastraStorage
MastraStorage
provides a unified interface for managing:
- Suspended Workflows: the serialized state of suspended workflows (so they can be resumed later)
- Memory: threads and messages per
resourceId
in your application - Traces: OpenTelemetry traces from all components of Mastra
- Eval Datasets: scores and scoring reasons from eval runs

Mastra provides different storage providers, but you can treat them as interchangeable. Eg, you could use libsql in development but postgres in production, and your code will work the same both ways.
Configuration
Mastra can be configured with a default storage option:
import { Mastra } from "@mastra/core/mastra";
import { LibSQLStore } from "@mastra/libsql";
const mastra = new Mastra({
storage: new LibSQLStore({
url: "file:./mastra.db",
}),
});
If you do not specify any storage
configuration, Mastra will not persist data across application restarts or deployments. For any
deployment beyond local testing you should provide your own storage
configuration either on Mastra
or directly within new Memory()
.
Data Schema
Messages
Stores conversation messages and their metadata. Each message belongs to a thread and contains the actual content along with metadata about the sender role and message type.
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
){ format: 2, parts: [...] }
user | assistant
The message content
column contains a JSON object conforming to the MastraMessageContentV2
type, which is designed to align closely with the AI SDK UIMessage
message shape.
type
.Querying Messages
Messages are stored in a V2 format internally, which is roughly equivalent to the AI SDK’s UIMessage
format. When querying messages using getMessages
, you can specify the desired output format, defaulting to v1
for backwards compatibility:
// Get messages in the default V1 format (roughly equivalent to AI SDK's CoreMessage format)
const messagesV1 = await mastra.getStorage().getMessages({ threadId: 'your-thread-id' });
// Get messages in the V2 format (roughly equivalent to AI SDK's UIMessage format)
const messagesV2 = await mastra.getStorage().getMessages({ threadId: 'your-thread-id', format: 'v2' });
Storage Providers
Mastra supports the following providers:
- For local development, check out LibSQL Storage
- For production, check out PostgreSQL Storage
- For serverless deployments, check out Upstash Storage