Express adapter
The @mastra/express package provides a server adapter for running Mastra with Express.
For general adapter concepts (constructor options, initialization flow, etc.), see Server Adapters.
InstallationDirect link to Installation
Install the Express adapter and Express framework:
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/express@latest express
pnpm add @mastra/express@latest express
yarn add @mastra/express@latest express
bun add @mastra/express@latest express
Usage exampleDirect link to Usage example
import express from 'express'
import { MastraServer } from '@mastra/express'
import { mastra } from './mastra'
const app = express()
app.use(express.json()) // Required for body parsing
const server = new MastraServer({ app, mastra })
await server.init()
app.listen(4111, () => {
console.log('Server running on port 4111')
})
Express requires express.json() middleware for JSON body parsing. Add it before creating the MastraServer.
Constructor parametersDirect link to Constructor parameters
app:
mastra:
prefix?:
openapiPath?:
bodyLimitOptions?:
streamOptions?:
customRouteAuthConfig?:
tools?:
taskStore?:
mcpOptions?:
Differences from HonoDirect link to Differences from Hono
| Aspect | Express | Hono |
|---|---|---|
| Body parsing | Requires express.json() | Handled by framework |
| Context storage | res.locals | c.get() / c.set() |
| Middleware signature | (req, res, next) | (c, next) |
| Streaming | res.write() / res.end() | stream() helper |
| AbortSignal | Created from req.on('close') | c.req.raw.signal |
Adding custom routesDirect link to Adding custom routes
Add routes directly to the Express app:
const app = express()
app.use(express.json())
const server = new MastraServer({ app, mastra })
// Before init - runs before Mastra middleware
app.get('/early-health', (req, res) => res.json({ status: 'ok' }))
await server.init()
// After init - has access to Mastra context
app.get('/custom', (req, res) => {
const mastraInstance = res.locals.mastra
res.json({ agents: Object.keys(mastraInstance.listAgents()) })
})
app.listen(4111)
Routes added before init() run without Mastra context. Add routes after init() to access the Mastra instance and request context.
When you want Mastra-managed auth and route metadata such as requiresAuth, prefer registerApiRoute(). For raw Express routes mounted directly on app, use createAuthMiddleware():
import express from 'express'
import { createAuthMiddleware, MastraServer } from '@mastra/express'
import { mastra } from './mastra'
const app = express()
app.use(express.json())
const server = new MastraServer({ app, mastra })
await server.init()
app.get('/custom/protected', createAuthMiddleware({ mastra }), (req, res) => {
const user = res.locals.requestContext.get('user')
res.json({ user })
})
app.get('/custom/public', createAuthMiddleware({ mastra, requiresAuth: false }), (req, res) => {
res.json({ ok: true })
})
Accessing contextDirect link to Accessing context
In Express middleware and routes, access Mastra context via res.locals:
app.get('/custom', (req, res) => {
const mastra = res.locals.mastra
const requestContext = res.locals.requestContext
const abortSignal = res.locals.abortSignal
const agent = mastra.getAgent('myAgent')
res.json({ agent: agent.name })
})
Available properties on res.locals:
| Key | Description |
|---|---|
mastra | Mastra instance |
requestContext | Request context map |
abortSignal | Request cancellation signal |
tools | Available tools |
taskStore | Task store for A2A operations |
customRouteAuthConfig | Per-route auth overrides |
user | Authenticated user (if auth configured) |
Adding middlewareDirect link to Adding middleware
Add Express middleware before or after init():
const app = express()
app.use(express.json())
// Middleware before init
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`)
next()
})
const server = new MastraServer({ app, mastra })
await server.init()
// Middleware after init has access to Mastra context
app.use((req, res, next) => {
const mastra = res.locals.mastra
next()
})
Manual initializationDirect link to Manual initialization
For custom middleware ordering, call each method separately instead of init(). See manual initialization for details.
ExamplesDirect link to Examples
- Express Adapter - Basic Express server setup
RelatedDirect link to Related
- Server Adapters - Shared adapter concepts
- MastraServer Reference - Full API reference
- createRoute() Reference - Creating type-safe custom routes