Mastraとは?使い方と料金!TypeScript製のAIエージェントフレームワーク

AIエージェントを簡単に構築したい場合は、Mastraがおすすめです。

MastraとはTypeScriptで動作するAIエージェントを開発するためのフレームワークであり、APIを使用して複雑なエージェント構築を簡単にできます。

この記事では、Mastraの使い方や料金について解説します。

また、LangChainやLlamaIndexといった競合ツールとの違いもご紹介します。

目次

Mastraとは?TypeScript製AIエージェントフレームワークの概要

Mastraは、TypeScriptでAIエージェントを開発するためのオープンソースフレームワークです

LLM(大規模言語モデル)を活用し、対話型で自律的なAIエージェントの構築を容易にすることを目的としています。

エージェント開発に必要なワークフロー、RAG、評価などの機能が包括的に提供されており、Web技術との親和性が高い点が特長です。

MastraはVercel社のAI SDKを内部で利用しており、OpenAIのGPTやGoogleのGeminiなど、複数のLLMを切り替えて使用できます。

また、トレーシングや自動評価といったデバッグ支援機能も充実しており、高品質なエージェントを効率的に開発・検証することが可能です。

これにより、開発者は複雑なAIアプリケーションの開発を簡素化し、より迅速にサービスを構築できます。

Mastraの機能

まずはMastraの主な機能をご紹介します。

Agents

MastraにおけるAgentsとは、大規模言語モデルがタスクを達成するために、実行する一連のアクションを自律的に決定できるシステムです。

エージェントは、ツールやワークフロー、同期されたデータへアクセスする能力を持ち、これらを活用して外部システムとの対話や複雑なタスクを実行します

必要に応じて関数や外部APIを呼び出して情報を取得・処理することも可能です。

エージェントを作成する際は、Agentクラスを用いて以下のように定義します。

import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
 
export const myAgent = new Agent({
  name: "My Agent",
  instructions: "You are a helpful assistant.",
  model: openai("gpt-4o-mini"),
});

Tools

Toolsは、エージェントが特定のタスクを実行したり、外部情報にアクセスしたりする際に実行可能な関数です

Toolsには統合アクセスとパラメータ検証機能が組み込まれています。

単純なテキスト生成だけではなく、エージェントの能力を拡張することで、API、データベース、その他のシステムとの対話を可能にします。

ツールを作成するには、createTool関数を用います。

import { createTool } from "@mastra/core/tools";
import { z } from "zod";
 
const getWeatherInfo = async (city: string) => {
  // Replace with an actual API call to a weather service
  console.log(`Fetching weather for ${city}...`);
  // Example data structure
  return { temperature: 20, conditions: "Sunny" };
};
 
export const weatherTool = createTool({
  id: "Get Weather Information",
  description: `Fetches the current weather information for a given city`,
  inputSchema: z.object({
    city: z.string().describe("City name"),
  }),
  outputSchema: z.object({
    temperature: z.number(),
    conditions: z.string(),
  }),
  execute: async ({ context: { city } }) => {
    console.log("Using tool to fetch weather information for", city);
    return await getWeatherInfo(city);
  },
});

作成したツールは、Agentsで以下のようにして取り込めます。

import { weatherTool } from '../tools/weather-tool';

Workflows

Workflowsは、耐久性のあるグラフベースの状態管理システムです

複数のエージェントやツールを組み合わせ、一連のタスク処理の流れを定義し、自動で実行できます。

これにより、単一の呼び出しでは完結しない、より複雑で体系的なプロセスを構築することが可能になります。

宣言的な構文で処理フローを記述するため、可読性が高く、管理やデバッグが容易になる点も特長です。

順次実行する際は.then()を使用します。

import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
 
const step1 = createStep({...});
const step2 = createStep({...});
 
export const testWorkflow = createWorkflow({...})
  .then(step1)
  .then(step2)
  .commit();

ステップを並列に実行する場合は.parallel()を用います。

import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
 
const step1 = createStep({...});
const step2 = createStep({...});
 
export const testWorkflow = createWorkflow({...})
  .parallel([step1, step2])
  .commit();

条件分岐を作成するには.branch()を使います。

import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
 
const lessThanStep = createStep({...});
const greaterThanStep = createStep({...});
 
export const testWorkflow = createWorkflow({...})
  .branch([
    [async ({ inputData: { some_value } }) => some_value <= 9, lessThanStep],
    [async ({ inputData: { some_value } }) => some_value >= 10, greaterThanStep]
  ])
  .commit();

RAG

検索拡張生成(RAG)とは、外部の知識ベースから関連情報を検索し、その情報を基にLLMが回答を生成する仕組みです。

独自のデータソースを活用することで、 AI エージェントの回答をより正確にすることができます。

また、LLMが元々持たない専門知識や最新情報にも対応できるようになります。

MastraのRAGシステムでは、文書を処理し埋め込むための標準化されたAPIや、埋め込みと検索のパフォーマンスを追跡するための可観測性などを提供します

Integrations

Integrationsは、Mastraをさまざまな外部サービスやライブラリと接続するための機能です

サードパーティサービス用の自動生成されたAPIクライアントであり、エージェントのツールやワークフローのステップとして使用できます。

設定画面が分かりやすいため、難しい知識がなくても利用可能です。

Evals

Evalsは、開発したAIエージェントのパフォーマンスや品質を体系的にテスト・評価するためのフレームワークです

AIの出力にはランダム性があり、同じ入力であっても結果が変わってしまうことがあります。

そこで、Evalsによってエージェントの品質を測定するための定量化可能な基準を提供します。

各評価は0~1の正規化されたスコアを返し、ログに記録して比較可能です。

また、評価は独自のプロンプトやスコアリング関数でカスタマイズできます。

Memory

Memoryは、AIエージェントが過去の対話内容や情報を記憶し、文脈を維持するための機能です

これにより、通常は直近のやり取りしか覚えられないLLMが、セッションをまたいで情報を保持し、より自然で連続性のある対話を実現できます。

Mastraは、現在の文脈を扱うワーキングメモリと、過去の対話履歴をベクトル検索で動的に思い出すセマンティックメモリという階層的なシステムを採用しています。

記憶した内容はLibSQLを用いて永続化することも可能で、エージェントはユーザーとの関係性を長期にわたって学習・維持することが可能です。

Mastraの料金プラン

Mastra自体はオープンソースであり、無料で利用可能です。

ただし、Mastraを利用するためのLLMについては各サービスのAPI料金がかかります。

Mastraで利用できる主要なAIモデルと、その100万トークンあたりの料金は以下の通りです。

モデル入力キャッシュされた入力出力
gpt-4.1(OpenAI)2.00ドル0.50ドル8.00ドル
Gemini 2.5 Flash(Google)0.30ドル0.075ドル2.50ドル
Claude Sonnet 4(Anthropic)3.00ドル3.75ドル15ドル

OpenAIのGPTやGoogleのGemini、AnthropicのClaudeなど、主要なAIモデルは利用可能です。

他にも、GroqやCerebrasのAPIキーも利用できます。

コストが気になる場合、gpt-4.1 miniなど、小型モデルを使用することでAPI料金を節約することができます

また、API料金は入力トークン数によるため、プロンプトを分かりやすく簡潔にすることも節約につながります。

Mastraの使い方|インストールから起動まで

続いて、Mastraの使い方を解説します。

Mastraのインストール手順は以下の通りです。

STEP
Node.jsのインストール

Mastraを動かすにはバージョン20.0以上のNode.jsが必要です

まずは公式サイトからNode.jsのインストーラをダウンロードしましょう。

ダウンロードしたインストーラを起動してNode.jsをインストールします。

STEP
APIキーを取得

好みの各AIサービスのAPIキーを取得します。

この記事では、OpenAIをAPIキーを取得して進めます。

公式サイトからAPIキーを作成し、取得します。

取得したAPIキーはコピーして安全な場所に保管し、他の人に知られないように気を付けてください。

STEP
Mastraのプロジェクトを作成

ターミナルで以下のコマンドを実行してMastraのプロジェクトを作成します。

npx create-mastra@latest

このコマンドを実行すると、プロジェクト名や使用するAIモデルなどが聞かれるため、答えていくことでMastraのセットアップが完了します

以下の表示が出ると、準備完了です。

作成されたプロジェクトファイルの構成は以下のようになっています。

フォルダ内容
src/mastraコアアプリケーションフォルダ
src/mastra/agentsエージェントの設定と定義
src/mastra/toolsカスタムツールの定義
src/mastra/workflowsワークフローの定義
src/mastra/index.tsMastraのメイン設定ファイル
.env環境変数
package.jsonNode.jsプロジェクトのメタデータ・スクリプト・依存関係
tsconfig.jsonTypeScriptコンパイラの設定
STEP
APIキーの追加

インストール時にAPIキーを指定しなかった場合は.envファイルにAPIキーを追加します。

OPENAI_API_KEY=<your-api-key>

この記事ではOpenAIのAPIキーを使っていますが、AnthropicのAPIキーを使用する場合はANTHROPIC_API_KEY、Geminiを使用する場合はGOOGLE_GENERATIVE_AI_API_KEYなど、使用するAPIに合ったものを記述しましょう。

STEP
開発用サーバーの起動

cdコマンドで作成したプロジェクトに移動し、以下のコマンドを実行してMastraの開発用サーバーを起動します。

npm run dev

起動すると、http://localhost:4111でサーバーが実行されます。

MastraのAIエージェント実践チュートリアル

ここでは、Mastraを使って実際にAIエージェントを作成するチュートリアルを示します。

コードは、デフォルトの天気情報を提供する気象アシスタントを例にしています。

STEP
ツールの作成

まずはエージェントが外部から天気情報を取得するためのツールを作成します。

今回は天気情報を取得するOpen-Meteoという無料のAPIを使用しています。

const getWeather = async (location: string) => {
  const geocodingUrl = `https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(location)}&count=1`;
  const geocodingResponse = await fetch(geocodingUrl);
  const geocodingData = (await geocodingResponse.json()) as GeocodingResponse;

  if (!geocodingData.results?.[0]) {
    throw new Error(`Location '${location}' not found`);
  }

  const { latitude, longitude, name } = geocodingData.results[0];

  const weatherUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&current=temperature_2m,apparent_temperature,relative_humidity_2m,wind_speed_10m,wind_gusts_10m,weather_code`;

  const response = await fetch(weatherUrl);
  const data = (await response.json()) as WeatherResponse;

  return {
    temperature: data.current.temperature_2m,
    feelsLike: data.current.apparent_temperature,
    humidity: data.current.relative_humidity_2m,
    windSpeed: data.current.wind_speed_10m,
    windGust: data.current.wind_gusts_10m,
    conditions: getWeatherCondition(data.current.weather_code),
    location: name,
  };
};

また、Mastra のエージェントはJSONスキーマまたはZodスキーマを使用して型定義することで、構造化されたデータを返すことが可能です

ここでは、Zodスキーマを使用しています。

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({
    temperature: z.number(),
    feelsLike: z.number(),
    humidity: z.number(),
    windSpeed: z.number(),
    windGust: z.number(),
    conditions: z.string(),
    location: z.string(),
  }),
  execute: async ({ context }) => {
    return await getWeather(context.location);
  },
});

このコードでは、createTool関数を用いて、入力された都市名について現在の気温や風速などを返すツールを実装し、weatherToolとしてエクスポートしています。

STEP
エージェントを定義

続いてエージェントを定義します。

Mastra でエージェントを定義するには、Agentクラスを使います。

また、ここで先ほど作成したツールも渡すことが可能です。

import { openai } from '@ai-sdk/openai';
import { Agent } from '@mastra/core/agent';
import { Memory } from '@mastra/memory';
import { LibSQLStore } from '@mastra/libsql';
import { weatherTool } from '../tools/weather-tool';

export const weatherAgent = new 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: openai('gpt-4o-mini'),
  tools: { weatherTool },
  memory: new Memory({
    storage: new LibSQLStore({
      url: 'file:../mastra.db', // path is relative to the .mastra/output directory
    }),
  }),
});

なお、主な設定項目は以下のようになっています。

設定項目内容
nameエージェント名
instructionsエージェントに与えるシステムメッセージ
model使用するモデル
tools使用するツール

また、memoryを使うことで、会話履歴の保存が可能となります。

STEP
ワークフローを構築

次にワークフローを構築します。

ワークフローでは、createStep関数でステップを定義し、入力・出力スキーマとビジネスロジックを指定します。

const fetchWeather = createStep({
  id: 'fetch-weather',
  description: 'Fetches weather forecast for a given city',
  inputSchema: z.object({
    city: z.string().describe('The city to get the weather for'),
  }),
  outputSchema: forecastSchema,
  execute: async ({ inputData }) => {
    if (!inputData) {
      throw new Error('Input data not found');
    }

    const geocodingUrl = `https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(inputData.city)}&count=1`;
    const geocodingResponse = await fetch(geocodingUrl);
    const geocodingData = (await geocodingResponse.json()) as {
      results: { latitude: number; longitude: number; name: string }[];
    };

    if (!geocodingData.results?.[0]) {
      throw new Error(`Location '${inputData.city}' not found`);
    }

    const { latitude, longitude, name } = geocodingData.results[0];

    const weatherUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&current=precipitation,weathercode&timezone=auto,&hourly=precipitation_probability,temperature_2m`;
    const response = await fetch(weatherUrl);
    const data = (await response.json()) as {
      current: {
        time: string;
        precipitation: number;
        weathercode: number;
      };
      hourly: {
        precipitation_probability: number[];
        temperature_2m: number[];
      };
    };

そしてcreateWorkflowでステップを構成し、実行フローを定義します。

const weatherWorkflow = createWorkflow({
  id: 'weather-workflow',
  inputSchema: z.object({
    city: z.string().describe('The city to get the weather for'),
  }),
  outputSchema: z.object({
    activities: z.string(),
  }),
})
  .then(fetchWeather)
  .then(planActivities);

最後に.commit()で完了し、エクスポートします。

weatherWorkflow.commit();
export { weatherWorkflow };
STEP
エージェントとワークフローを登録

エージェントの定義及びワークフローの構築が完了したら、src/mastra/index.tsにそれらを登録します。

import { Mastra } from '@mastra/core/mastra';
import { PinoLogger } from '@mastra/loggers';
import { LibSQLStore } from '@mastra/libsql';
import { weatherWorkflow } from './workflows/weather-workflow';
import { weatherAgent } from './agents/weather-agent';

export const mastra = new Mastra({
  workflows: { weatherWorkflow },
  agents: { weatherAgent },
  storage: new LibSQLStore({
    // stores telemetry, evals, ... into memory storage, if it needs to persist, change to file:../mastra.db
    url: ":memory:",
  }),
  logger: new PinoLogger({
    name: 'Mastra',
    level: 'info',
  }),
});
STEP
実行

以下のコマンドを入力し、エージェントを実行します。

npm run dev

実行すると、ローカルホストでサーバーが起動します。

表示されたURLをクリックすることで、サーバーにアクセスできます。

実際にプロンプトを入力してみましょう。

以下は、東京の天気を質問した際の解答です。

現在の東京の天気や風速などを教えてくれていることが分かります。

Mastraと競合ツールとの違い

Mastraと似たツールとして、LangChainやLlamaIndexがあります。

最後に、Mastraとそれらの競合ツールとの違いを解説します。

MastraとLangChainの違い

MastraとLangChainの最も大きな違いは、設計思想と主要な開発言語にあります。

LangChainは開発言語がPython中心であり、非常に多機能で自由度が高い一方、コードが複雑化しやすい側面があります。

あわせて読みたい
LangChainとは?RAGの使い方!日本語対応と商用利用も解説 LangChainは大規模言語モデル(LLM)をより効率的に活用するためのフレームワークです。 さまざまな外部リソースと連携してLLMの応答を強化でき、RAGへの応用も可能です。 また、LangChain Agentsという機能では、自律的に考えてアクションを実行することもできます。 この記事では、LangChainの使い方やRAGの流れ、日本語対応状況や商用利用の可否について解説します。

対照的にMastraはTypeScriptで動作し、Web開発との親和性を最大限に高めているのが特長です。

Mastraは宣言的な構文を用いてエージェントやワークフローをシンプルかつ構造的に記述できるため、学習コストが比較的低く、直感的な開発が可能です。

一方LangChainは、よりコードベースで柔軟なコンポーネントの組み合わせを重視しています。

そのため、Web開発者が迅速にAIエージェントを構築したい場合はMastraが、Python環境で豊富な機能を細かく制御したい場合はLangChainが適していると言えるでしょう

MastraとLlamaIndexの違い

MastraとLlamaIndexは、フレームワークが主眼を置く領域が異なります。

LlamaIndexはRAGに特化したデータ中心のフレームワークであり、外部ドキュメントの取り込み、インデックス作成、情報の取得といった機能に優れています。

一方でMastraは、RAGを重要な機能の一つとして内包しつつも、より汎用的なAIエージェントの構築を目指すフレームワークです。

Mastraの核心は、RAGを含む様々なツールを駆使して自律的にタスクを計画・実行するエージェントそのものにあります。

したがって、RAGを用いた簡単なAIアプリケーションの開発が目的ならLlamaIndex、RAGを機能の一部として利用する自律型エージェント開発が目的ならMastraが適しています

まとめ

Mastraを使うことで、API連携をして簡単にAIエージェントを作成できるようになります

Mastra自体はオープンソースであり、無料で利用可能です。

ただし、各種サービスのAPI料金はかかるため、エージェントによっては小型モデルを使用することで料金を節約する必要があるでしょう。

LLMを用いたAIエージェントを短期間で作成したいという方は、Mastraの使用を検討してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次