Skip to main content
Mastra 1.0 is available 🎉 Read announcement

Configuration

Mastra Code is configured through project-level files, global settings, and environment variables. Configuration files live in .mastracode/ directories at the project and user levels.

Authentication
Direct link to Authentication

Mastra Code authenticates with AI providers through OAuth. Run /login in the TUI to start the flow.

Supported providers
Direct link to Supported providers

ProviderOAuth flowWhat you get
AnthropicClaude Max subscriptionAccess to Claude models via your subscription
OpenAIChatGPT Plus / CodexAccess to OpenAI models via your subscription

OAuth credentials are stored in auth.json alongside the database in the app data directory.

Model routing
Direct link to Model routing

For providers not covered by OAuth, Mastra Code uses Mastra's model router, which auto-detects API keys from environment variables:

export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
export GOOGLE_GENERATIVE_AI_API_KEY=...

MCP servers
Direct link to MCP servers

Mastra Code can connect to external MCP servers and make their tools available to the agent. Configure servers in JSON files:

PriorityPathScope
Highest.mastracode/mcp.jsonProject
~/.mastracode/mcp.jsonGlobal
Lowest.claude/settings.local.jsonProject (Claude Code compatible)

Project config overrides global config by server name. Claude Code settings are the lowest priority fallback.

MCP config format
Direct link to MCP config format

.mastracode/mcp.json
{
"mcpServers": {
"my-server": {
"command": "npx",
"args": ["-y", "@my-org/mcp-server"],
"env": {
"API_KEY": "your-key"
}
}
}
}

Each server entry requires a command field. The args and env fields are optional.

On startup, Mastra Code connects to all configured servers and reports the status:

MCP: 2 server(s) connected, 15 tool(s)

Tools from MCP servers are namespaced as serverName_toolName and appear in the agent's tool list alongside built-in tools.

Hooks
Direct link to Hooks

Hooks are user-configured shell commands that run at specific lifecycle events. Use hooks for custom validation, logging, notifications, or integration with external systems.

Hook config format
Direct link to Hook config format

.mastracode/hooks.json
{
"PreToolUse": [
{
"type": "command",
"command": "node scripts/validate-tool.js",
"matcher": {
"tool_name": "execute_command"
},
"timeout": 5000,
"description": "Validate shell commands before execution"
}
],
"PostToolUse": [
{
"type": "command",
"command": "node scripts/log-tool.js",
"description": "Log tool usage"
}
]
}

Hook events
Direct link to Hook events

EventWhen it firesCan block?
PreToolUseBefore a tool call executesYes
PostToolUseAfter a tool call completesNo
StopWhen the agent finishes a responseYes
UserPromptSubmitWhen the user sends a messageYes
SessionStartWhen a session beginsNo
SessionEndWhen a session endsNo
NotificationWhen the TUI fires a notificationNo

Hook I/O protocol
Direct link to Hook I/O protocol

Hook processes receive a JSON payload on stdin with context about the event:

{
"session_id": "thread-abc123",
"cwd": "/path/to/project",
"hook_event_name": "PreToolUse",
"tool_name": "execute_command",
"tool_input": { "command": "npm test" }
}

For blocking events (PreToolUse, Stop, UserPromptSubmit), the hook can respond on stdout with a JSON object:

{
"decision": "block",
"reason": "This command is not allowed"
}

Hook config locations
Direct link to Hook config locations

PriorityPathScope
Higher.mastracode/hooks.jsonProject (appended after global)
Lower~/.mastracode/hooks.jsonGlobal (runs first)

Global hooks run before project hooks. For the same event, all hooks execute in order.

Custom slash commands
Direct link to Custom slash commands

Define reusable prompt templates as markdown files. Mastra Code scans these directories for .md files:

PriorityPathScope
Highest.mastracode/commands/Project
.claude/commands/Project (Claude Code compatible)
~/.mastracode/commands/Global
Lowest~/.claude/commands/Global (Claude Code compatible)

Each command file can include YAML frontmatter with name and description fields:

.mastracode/commands/review.md
---
name: review
description: Review the current diff for issues
---
Review my current git diff. Look for bugs, security issues,
and violations of the project's coding standards.

The filename (or directory structure) determines the command name. For example, git/commit.md becomes /git:commit.

Commands support variables like $ARGUMENTS for positional args, @filename for file content injection, and !command for shell command output.

Skills
Direct link to Skills

Skills are structured instruction files that the agent loads automatically based on trigger conditions. They provide domain-specific guidance without manually pasting instructions.

Mastra Code scans these directories for skills:

PriorityPathScope
Highest.mastracode/skills/Project
.claude/skills/Project (Claude Code compatible)
~/.mastracode/skills/Global
Lowest~/.claude/skills/Global (Claude Code compatible)

Each skill is a directory containing a SKILL.md file with instructions and trigger descriptions. Skills installed via symlinks (e.g., from npx skills add) are automatically resolved.

Agent instructions
Direct link to Agent instructions

Mastra Code loads project-specific instructions from AGENTS.md or CLAUDE.md files and injects them into the agent's system prompt. This is how you can customize the agent's behavior for your project.

Lookup order
Direct link to Lookup order

For project instructions (first match wins):

  1. AGENTS.md or CLAUDE.md in the project root
  2. .claude/AGENTS.md or .claude/CLAUDE.md
  3. .mastracode/AGENTS.md or .mastracode/CLAUDE.md

For global instructions (first match wins):

  1. ~/.claude/AGENTS.md or ~/.claude/CLAUDE.md
  2. ~/.mastracode/AGENTS.md or ~/.mastracode/CLAUDE.md
  3. ~/.config/claude/AGENTS.md or ~/.config/claude/CLAUDE.md
  4. ~/.config/mastracode/AGENTS.md or ~/.config/mastracode/CLAUDE.md

AGENTS.md takes priority over CLAUDE.md when both exist at the same location.

Database
Direct link to Database

Mastra Code uses LibSQL (SQLite) for persistence. Threads, messages, state, token usage, and observational memory are all stored in the database.

Database location
Direct link to Database location

By default, the database is stored in the platform-specific app data directory:

PlatformPath
macOS~/Library/Application Support/mastracode/mastra.db
Linux~/.local/share/mastracode/mastra.db
Windows%APPDATA%/mastracode/mastra.db

Remote database
Direct link to Remote database

Connect to a remote Turso database for cross-device thread sharing:

.mastracode/database.json
{
"url": "libsql://your-db.turso.io",
"authToken": "your-auth-token"
}

Database config resolution
Direct link to Database config resolution

PrioritySource
1MASTRA_DB_URL + MASTRA_DB_AUTH_TOKEN environment variables
2.mastracode/database.json (project)
3~/.mastracode/database.json (global)
4Local file database (default)

Observational memory
Direct link to Observational memory

Observational memory (OM) uses background agents to maintain a dense log of observations and reflections about the conversation, providing long-term context that persists across sessions.

OM scope
Direct link to OM scope

Control whether observations are scoped to individual threads or shared across all threads for a project:

ScopeBehavior
thread (default)Observations are private to each conversation thread
resourceObservations are shared across all threads for the same project

Configure the scope through:

  1. MASTRA_OM_SCOPE environment variable ("thread" or "resource")
  2. .mastracode/database.json → omScope field
  3. ~/.mastracode/database.json → omScope field

OM model settings
Direct link to OM model settings

The observer and reflector models default to google/gemini-2.5-flash. Override them per-thread through the /settings panel or in the harness state.

OM thresholds
Direct link to OM thresholds

ThresholdDefaultDescription
Observation threshold30,000 tokensToken count that triggers an observation pass
Reflection threshold40,000 tokensToken count that triggers a reflection pass

Environment variables
Direct link to Environment variables

VariableDescription
MASTRA_DB_URLLibSQL database URL (e.g., libsql://... or file:./data.db)
MASTRA_DB_AUTH_TOKENAuth token for remote LibSQL database
MASTRA_DB_PATHOverride the local database file path
MASTRA_USER_IDOverride the auto-detected user identity
MASTRA_RESOURCE_IDOverride the auto-detected project resource ID
MASTRA_OM_SCOPEObservational memory scope (thread or resource)
DEFAULT_OM_MODEL_IDDefault model for OM observer and reflector
TAVILY_API_KEYEnable Tavily-powered web search and extract tools

Resource ID override
Direct link to Resource ID override

Resource IDs determine how threads are grouped. By default, Mastra Code generates one from the Git remote URL or filesystem path. Override it to share threads across repositories or isolate threads within a monorepo:

.mastracode/database.json
{
"resourceId": "my-custom-project-id"
}

You can also set MASTRA_RESOURCE_ID as an environment variable. Two users who set the same resource ID share threads and observations for that resource.