# MastraServer The `MastraServer` abstract class is the base for all server adapters. Extend this class to create adapters for frameworks other than Hono or Express. ## Import ```typescript import { MastraServer } from '@mastra/server/server-adapter'; ``` ## Type parameters ```typescript MastraServer ``` | Parameter | Description | | ----------- | ------------------------------------------------ | | `TApp` | Framework app type (e.g., `Hono`, `Application`) | | `TRequest` | Framework request type | | `TResponse` | Framework response/context type | ## Constructor ```typescript constructor(options: MastraServerOptions) ``` ### Options **app:** (`TApp`): Framework app instance **mastra:** (`Mastra`): Mastra instance **prefix?:** (`string`): Route path prefix (e.g., \`/api/v2\`) (Default: `''`) **openapiPath?:** (`string`): Path to serve OpenAPI spec (Default: `''`) **bodyLimitOptions?:** (`BodyLimitOptions`): Request body size limits **streamOptions?:** (`StreamOptions`): Stream redaction config (Default: `{ redact: true }`) **customRouteAuthConfig?:** (`Map`): Per-route auth overrides **tools?:** (`Record`): Available tools for the server **taskStore?:** (`InMemoryTaskStore`): Task store for A2A (Agent-to-Agent) operations **mcpOptions?:** (`MCPOptions`): MCP transport options for serverless environments ## Abstract methods These methods must be implemented by adapters: ### registerContextMiddleware() Attach Mastra context to every request. ```typescript abstract registerContextMiddleware(): void ``` **Context to attach:** - `mastra` - Mastra instance - `requestContext` - Request-scoped context - `tools` - Available tools - `abortSignal` - Request cancellation signal ### registerAuthMiddleware() Register authentication and authorization middleware. ```typescript abstract registerAuthMiddleware(): void ``` ### registerRoute() Register a single route with the framework. ```typescript abstract registerRoute( app: TApp, route: ServerRoute, options: { prefix?: string } ): Promise ``` ### getParams() Extract parameters from the request. ```typescript abstract getParams( route: ServerRoute, request: TRequest ): Promise<{ urlParams: Record; queryParams: Record; body: unknown; }> ``` ### sendResponse() Send response based on route type. ```typescript abstract sendResponse( route: ServerRoute, response: TResponse, result: unknown ): Promise ``` ### stream() Handle streaming responses. ```typescript abstract stream( route: ServerRoute, response: TResponse, result: unknown ): Promise ``` ## Instance methods ### init() Initialize the server by registering all middleware and routes. ```typescript async init(): Promise ``` Calls in order: 1. `registerContextMiddleware()` 2. `registerAuthMiddleware()` 3. `registerRoutes()` ### registerRoutes() Register all Mastra routes. ```typescript async registerRoutes(): Promise ``` ### getApp() Get the framework app instance. ```typescript getApp(): T ``` ### parsePathParams() Validate path parameters with the route's Zod schema. ```typescript async parsePathParams( route: ServerRoute, params: Record ): Promise> ``` ### parseQueryParams() Validate query parameters with the route's Zod schema. ```typescript async parseQueryParams( route: ServerRoute, params: Record ): Promise> ``` ### parseBody() Validate request body with the route's Zod schema. ```typescript async parseBody( route: ServerRoute, body: unknown ): Promise ``` ### registerOpenAPIRoute() Register an endpoint that serves the OpenAPI specification. ```typescript async registerOpenAPIRoute( app: TApp, config: OpenAPIConfig, options: { prefix?: string } ): Promise ``` ## Protected methods ### mergeRequestContext() Merge request context from multiple sources (query params and body). ```typescript protected mergeRequestContext(options: { paramsRequestContext?: Record; bodyRequestContext?: Record; }): RequestContext ``` ## Types ### BodyLimitOptions ```typescript interface BodyLimitOptions { maxSize: number; onError: (error: unknown) => unknown; } ``` ### StreamOptions ```typescript interface StreamOptions { redact?: boolean; } ``` ### MCPOptions ```typescript interface MCPOptions { serverless?: boolean; sessionIdGenerator?: () => string; } ``` | Property | Description | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `serverless` | When `true`, runs MCP in stateless mode without session management. Use for serverless environments like Cloudflare Workers or Vercel Edge. | | `sessionIdGenerator` | Custom function to generate session IDs. | ## Example ```typescript import { MastraServer, ServerRoute } from '@mastra/server/server-adapter'; import type { Mastra } from '@mastra/core'; export class MyServer extends MastraServer { registerContextMiddleware(): void { this.app.use('*', (req, res, next) => { res.locals.mastra = this.mastra; next(); }); } registerAuthMiddleware(): void { const auth = this.mastra.getServer()?.auth; if (!auth) return; // Implement auth } async registerRoute(app, route, { prefix }) { // Implement route registration } async getParams(route, request) { return { urlParams: request.params, queryParams: request.query, body: request.body, }; } async sendResponse(route, response, result) { return response.json(result); } async stream(route, response, result) { // Implement streaming } } ``` ## Related - [Server Adapters](https://mastra.ai/docs/server/server-adapters) - Using adapters - [Custom Adapters](https://mastra.ai/docs/server/custom-adapters) - Creating custom adapters - [createRoute()](https://mastra.ai/reference/server/create-route) - Creating custom routes