白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

MastraでMCPが使えるコンソールアプリを作ろう(前編)

こんばんは。
夏が来た感じがしますね。実はまだ梅雨も来ていませんが。

さて、Claude CodeやらCursorやら最近はひたすらにAIエージェントブームですね。
特にMCPが流行りだして、その勢いはどんどん加速しているように思います。

ただ、バックグラウンド実行も増えてきているものの、基本的にはユーザのアクションをトリガにしたインタラクティブな使い方になっています。
cronや各種クラウドサービスのスケジュール機能を使って特定の時間にトリガされる、いわゆるバッチのようなアプリケーションが自然言語で指示できてもいいんじゃないかと思い、今回はMastraを使ってエージェントアプリを作ってみます。

ちなみに、ちょうどこの記事を書いている途中でGeminiアプリがスケジュールアクション機能を導入するというニュースを見かけました。微妙な気持ちですが、ニーズはあっているということでね。

Mastraってなんだ

MastraはTypeScriptで作られたオープンソースのAIエージェントフレームワークです。

github.com

利用者数でLangChainを超えたみたいに言われることがありますが、実際に越えているのはLangChainファミリーのエージェントフレームワークであるLangGraphですね。並べてみるとわかりますが、こんな感じです。

でも十分すごいとは思います。
TypeScriptだとLangChain.jsという選択肢もあるんですが、Python版に比べるとどうしても開発が遅れるところはありますし、選択肢を増やすのはいいことだと思うので今回触っていきます。

プロジェクトを作る

mastra.ai

最近のTypeScriptプロジェクトだとおなじみのcreate~系がMastraにもちゃんとあって、そのものずばりcreate-mastraです。はい。わかりやすくていいですね。

npx create-mastra@latest

聞かれる内容としてはプロジェクト名、ソースを置くパス、エージェントとワークフローどっち使うか(両方も選べる)、ツール使うか、LLMのプロバイダ、APIキー入力するか、サンプルは必要か、MastraのMCPサーバの設定を入れるかという感じです。
お好みですが、今回はこんな感じで。

┌  Mastra Init
│
◇  Where should we create the Mastra files? (default: src/)
│  src/
│
◇  Choose components to install:
│  Agents
│
◇  Add tools?
│  Yes
│
◇  Select default provider:
│  Google
│
◇  Enter your google API key?
│  Skip for now
│
◇  Add example
│  Yes
│
◇  Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)
│  VSCode

.envにAPIキーを設定して、weather-agent.tsのモデルを変更して(私は'gemini-2.5-flash-preview-05-20'にしましたが、そのときどきのいい感じのもので)、

npm run dev

とすればあっという間にプレイグラウンドが開きます。
(最初からUIもセットで作ってくれるのもいいですね)

これだけでお天気情報を教えてくれるチャットアプリの完成です。
ちなみにAdd exampleをNoにするとすごくシンプルなプロジェクト構成になるので、Yes版と比較すると何がどうなっているのかがわかりやすいです。

コンソールで動かす

結局WebのUIで操作するのかと思ったかもしれませんが、サーバを立ち上げなくても作成したエージェントは普通に使えるので安心してください。WebUIとどちらでも使えるのでお得ですね。

もちろんトランスパイルしてnodeコマンドで実行してもいいのですが、TypeScriptファイルをそのまま実行してしまいたいのでtsxを入れておきましょう。
ts-nodeでももちろんOKですが、最近はtsxのほうが流行りらしいので。いや、bunのほうが人気なのかな…。

npm i -D tsx

.envから環境変数を読みたいので.envも入れておきます。

npm i dotenv

MastraのGitHubリポジトリにはexamplesというディレクトリがあるので、その中を参考にしつつ、src/index.tsを作ります。
getAgentの引数はちゃんと補完されるし、存在しないエージェントを指定するとエラーになるのが素敵ですね。

import 'dotenv/config';
import { mastra } from './mastra';

async function main() {
    const agent = mastra.getAgent('weatherAgent');
    const result = await agent.generate('今日の東京の天気は?');
    console.log(result.text);
}

main();

package.jsonのscriptsにこんな感じに追加して、

"index": "npx tsx src/index.ts"

実行するとこんな感じです。

npm run index

> mastra_sample@1.0.0 index
> npx tsx src/index.ts

東京の天気は、現在の気温が20.5℃で、体感温度は21.1℃です。湿度は74%で、風速は9.3m/s、突風は41m/sです。天気は主に晴れです。

いい感じですね。もっと全然暑いですけど。
というか41m/sの突風ってなんだ。すごいことになってるぞ。

続くよ

ちょっと長くなりそうなので、今回はここまで。
後編に続きます。

shironeko.hateblo.jp

GitHubリポジトリはこちら。

github.com