NestJS Adapter
The @mastra/nestjs package provides a NestJS module for running Mastra with the Express-based NestJS platform.
It is intentionally Express-only for v1. If Nest is bootstrapped with a different HTTP adapter, MastraModule throws during startup instead of attempting a partial integration.
For general adapter concepts, see Server Adapters.
InstallationDirect link to Installation
Install the NestJS adapter and ensure your app uses the Express platform:
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/nestjs@latest
pnpm add @mastra/nestjs@latest
yarn add @mastra/nestjs@latest
bun add @mastra/nestjs@latest
Usage exampleDirect link to Usage example
import { Module } from '@nestjs/common'
import { MastraModule } from '@mastra/nestjs'
import { mastra } from './mastra'
@Module({
imports: [
MastraModule.register({
mastra,
}),
],
})
export class AppModule {}
MastraModule registers a catch-all controller (@All('*')). If it is imported before your app modules, it can intercept unrelated routes and return 404s. To avoid conflicts, import MastraModule last or mount it under a dedicated prefix (e.g., /api/v1/mastra).
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
async function bootstrap() {
const app = await NestFactory.create(AppModule)
await app.listen(3000)
}
bootstrap()
By default, Mastra routes mount under /api. Use prefix to change it.
Module optionsDirect link to Module options
mastra:
prefix?:
rateLimitOptions?:
shutdownOptions?:
bodyLimitOptions?:
streamOptions?:
tracingOptions?:
contextOptions?:
customRouteAuthConfig?:
tools?:
taskStore?:
mcpOptions?:
auth?:
Async registrationDirect link to Async registration
import { Module } from '@nestjs/common'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { MastraModule } from '@mastra/nestjs'
import { Mastra } from '@mastra/core/mastra'
@Module({
imports: [
ConfigModule.forRoot(),
MastraModule.registerAsync({
imports: [ConfigModule],
useFactory: (config: ConfigService) => ({
mastra: new Mastra({
agents: {
greeter: {
name: 'greeter',
description: 'Greets the user',
model: config.get('MASTRA_MODEL', 'openai/gpt-4o-mini'),
},
},
}),
prefix: config.get('MASTRA_PREFIX', '/api'),
}),
inject: [ConfigService],
}),
],
})
export class AppModule {}
Accessing MastraDirect link to Accessing Mastra
Use the MASTRA token or MastraService in your services:
import { Injectable, Inject } from '@nestjs/common'
import { MASTRA, MastraService } from '@mastra/nestjs'
import type { Mastra } from '@mastra/core/mastra'
@Injectable()
export class AgentService {
constructor(@Inject(MASTRA) private readonly mastra: Mastra) {}
}
@Injectable()
export class WorkflowService {
constructor(private readonly mastraService: MastraService) {}
}
MCP routesDirect link to MCP routes
MCP endpoints are exposed under the API prefix:
POST /api/mcp/:serverId/mcpGET /api/mcp/:serverId/ssePOST /api/mcp/:serverId/messages
Health routesDirect link to Health routes
Operational endpoints stay unprefixed on purpose for infrastructure compatibility:
GET /healthGET /readyGET /info