Manual Install
Use this guide to manually build a standalone Mastra server step by step. In most cases, it's quicker to follow the Standalone Server Quickstart, which achieves the same result using the mastra create command. For existing projects, you can also use mastra init.
If you prefer not to use our automatic CLI tool, you can set up your project yourself by following the guide below.
Create a new project and change directory:
mkdir my-first-agent && cd my-first-agentInitialize a TypeScript project and install the following dependencies:
- npm
- pnpm
- yarn
- bun
npm init -y
npm install -D typescript @types/node mastra@beta
npm install @mastra/core@beta zod@^4pnpm init
pnpm add -D typescript @types/node mastra@beta
pnpm add @mastra/core@beta zod@^4yarn init -y
yarn add -D typescript @types/node mastra@beta
yarn add @mastra/core@beta zod@^4bun init -y
bun add -d typescript @types/node mastra@beta
bun add @mastra/core@beta zod@^4Add
devandbuildscripts to yourpackage.jsonfile:package.json{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "mastra dev",
"build": "mastra build"
}
}Create a
tsconfig.jsonfile:touch tsconfig.jsonAdd the following configuration:
tsconfig.json{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "bundler",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"noEmit": true,
"outDir": "dist"
},
"include": ["src/**/*"]
}infoMastra requires modern
moduleandmoduleResolutionsettings. UsingCommonJSornodewill cause resolution errors.Create an
.envfile:touch .envAdd your API key:
.envGOOGLE_GENERATIVE_AI_API_KEY=<your-api-key>noteThis guide uses Google Gemini, but you can use any supported model provider, including OpenAI, Anthropic, and more.
Create a
weather-tool.tsfile:mkdir -p src/mastra/tools && touch src/mastra/tools/weather-tool.tsAdd the following code:
src/mastra/tools/weather-tool.tsimport { createTool } from "@mastra/core/tools";
import { z } from "zod";
export const weatherTool = createTool({
id: "get-weather",
description: "Get current weather for a location",
inputSchema: z.object({
location: z.string().describe("City name"),
}),
outputSchema: z.object({
output: z.string(),
}),
execute: async () => {
return {
output: "The weather is sunny",
};
},
});infoWe've shortened and simplified the
weatherToolexample here. You can see the complete weather tool under Giving an Agent a Tool.Create a
weather-agent.tsfile:mkdir -p src/mastra/agents && touch src/mastra/agents/weather-agent.tsAdd the following code:
src/mastra/agents/weather-agent.tsimport { Agent } from "@mastra/core/agent";
import { weatherTool } from "../tools/weather-tool";
export const weatherAgent = new Agent({
id: "weather-agent",
name: "Weather Agent",
instructions: `
You are a helpful weather assistant that provides accurate weather information.
Your primary function is to help users get weather details for specific locations. When responding:
- Always ask for a location if none is provided
- If the location name isn't in English, please translate it
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
- Include relevant details like humidity, wind conditions, and precipitation
- Keep responses concise but informative
Use the weatherTool to fetch current weather data.
`,
model: "google/gemini-2.5-pro",
tools: { weatherTool },
});Create the Mastra entry point and register your agent:
touch src/mastra/index.tsAdd the following code:
src/mastra/index.tsimport { Mastra } from "@mastra/core";
import { weatherAgent } from "./agents/weather-agent";
export const mastra = new Mastra({
agents: { weatherAgent },
});You can now launch Studio and test your agent.
- npm
- pnpm
- yarn
- bun
npm run devpnpm run devyarn run devbun run dev