はじめに
直近で以下を試していた Mastra に関する記事です。
●Mastra でシンプルな MCPクライアント・MCPホストの機能を作って Node.js で実行(自作MCPサーバーと組み合わせる) - Qiita
https://qiita.com/youtoy/items/062165c2918cfdbc5590
●Mastra でシンプルな自作サーバー + シンプルな自作クライアントなどでサーバー経由でエージェントを使う(OpenAI との組み合わせ) - Qiita
https://qiita.com/youtoy/items/0911983e548a14533943
今回の内容
今回、以下の記事で見かけた 「AgentNetwork(Networks)による複数エージェントの利用」 と、さらに上記の過去のお試しで少し試した 「MPCサーバーの利用(※ ただし自作ではないもの)」 とを組み合わせてみました。
Mastra の AgentNetwork について書かれた記事
●【Mastra】ハンズオンで学ぶAIエージェント構築ガイド|そばこ
https://note.com/sobaco_san/n/ne5aad2027853
Mastra の AgentNetwork に関する補足
以下の Mastra の公式ドキュメントを見ると、「AgentNetwork」は現状は実験的な機能になるようです。
●AgentNetwork(実験的)
https://mastra.ai/ja/reference/networks/agent-network
下準備
ここから実際に試していきます。
そのための下準備として、以下を進めます。
create-mastra を使った準備
以下のコマンドを実行してベースを作ります。
npx create-mastra
このコマンドを実行して設定する内容は、以下のとおりです。
プロジェクト名: my-mastra-app
その他の設定:
インストールなどが終わった後は my-mastra-app/src/mastra
フォルダに以下の内容の index.ts と空のフォルダ(agents)が作成されました。
import { Mastra } from '@mastra/core';
export const mastra = new Mastra()
ファイル・フォルダの作成
ここで my-mastra-app/src/mastra
フォルダ内に network
フォルダを追加しておきます。さらに上記の index.ts を index.js に変更したり、空のフォルダ 2つに index.js を作成しました。
その結果、my-mastra-app/src/mastra
直下の構成は以下となりました。
この後にコードを実装するファイルは、以下 3つがある状態です。
- 3つの「index.js」
- my-mastra-app/src/mastra/index.js
- my-mastra-app/src/mastra/agents/index.js
- my-mastra-app/src/mastra/network/index.js
パッケージのインストール
今回は MCPサーバーを使うので、さらに my-mastra-app
フォルダ内で以下を実行し、パッケージをインストールしておきます。
npm i @mastra/mcp
APIキーの設定
今回、参照している記事で以下に書かれている APIキーの設定を行います。
OpenAI の APIキーを設定してください。
コードの実装
ここから、先ほど用意した 3つの index.js の中身を作っていきます。
参考にした情報
ここからの実装を進めるにあたり、参考にした記事を掲載します。
(これらと合わせて、さらに上で掲載していた記事も参照しました)
●mastra/examples/agent-network/src/mastra/network/index.ts
https://github.com/mastra-ai/mastra/blob/main/examples/agent-network/src/mastra/network/index.ts
●mastra/examples/agent-network/src/mastra/agents/index.ts
https://github.com/mastra-ai/mastra/blob/main/examples/agent-network/src/mastra/agents/index.ts
3つのファイルの実装内容
実装した内容を、以下に列挙していきます。
mastra直下の index.js
mastra直下の index.js の実装は以下のとおりです。全体をまとめた内容を記載したという感じになりました。
import { Mastra } from "@mastra/core";
import { simpleAgent, sequentialThinkingAgent } from "./agents";
import { multiAgentNetwork } from "./network";
export const mastra = new Mastra({
agents: {
simpleAgent,
sequentialThinkingAgent,
},
networks: {
multiAgentNetwork,
},
});
mastra/agents直下の index.js
次は AIエージェントを実装した、mastra/agents直下の index.js です。この中に、Sequential Thinking MCP Server を使うための設定を書く形にしています。
※ 以前、VS Code(GitHub Copilot agent mode)と組み合わせて試したことがある MCPサーバーだったりします
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { openai } from "@ai-sdk/openai";
const mcp = new MCPClient({
servers: {
sequentialThinking: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-sequential-thinking"],
},
},
});
const toolsets = await mcp.getToolsets();
export const simpleAgent = new Agent({
name: "simpleAgent",
instructions: "ユーザーの質問にシンプルな返答をしてください。",
model: openai("gpt-4o"),
});
export const sequentialThinkingAgent = new Agent({
name: "sequentialThinkingAgent",
instructions: `
熟考が必要な質問に回答してください。
その際はsequentialThinkingツールを使ってください。`,
model: openai("gpt-4o"),
tools: await mcp.getTools(),
defaultGenerateOptions: { maxSteps: 10 },
});
上記の最後に書いている「defaultGenerateOptions: { maxSteps: 10 }
」というオプションについて少しだけ補足します。
今回実装したものを軽く試した際、この Sequential Thinking MCP Server を使った処理の最終出力が得られなかったことがありました。ログを見ると、裏で 5段階の出力が行われていて、そこで処理が止まっていた感じでした。
その辺りの挙動に関わりそうな内容を調べてみたところ、AIエージェントの Agent.generate() に maxSteps というオプションがあり、そのデフォルト値が「5」となっているようでした。これが上記の挙動の原因のようです。
今回、Agent.generate() は使わないので、その maxSteps を AIエージェントのコンストラクタに設定しています。ドキュメントを見ると、以下のオプションに書けば良さそうだったので、デフォルト値の倍の値(10)を指定して試してみています。
mastra/network直下の index.js
mastra/network直下の index.js の実装は以下のとおりです。2つのエージェントへの振り分けの説明を instructions
に書いています。
import { AgentNetwork } from "@mastra/core/network";
import { openai } from "@ai-sdk/openai";
import { simpleAgent, sequentialThinkingAgent } from "../agents";
export const multiAgentNetwork = new AgentNetwork({
name: "Multi Agent Network",
model: openai("gpt-4o"),
agents: [simpleAgent, sequentialThinkingAgent],
instructions: `
熟考が必要な質問はsequentialThinkingAgentに転送してください。
それ以外の一般的な質問はsimpleAgentに転送してください。`,
});
処理を実行する
この後、サーバーを起動して、実装した内容を動かして試してみます。
サーバーの起動
以下のコマンドを my-mastra-app
フォルダで実行して、サーバーを起動します。
npm run dev
ブラウザからアクセスして試す
起動したサーバーに、ブラウザでアクセスします。
http://localhost:4111/ にアクセスすると、 http://localhost:4111/agents を開いた状態になり、以下のページが表示されます。
このページの右側に、先ほど実装した 2つのエージェントが表示されています。
ここから 2つのエージェントのそれぞれをクリックして、個々のエージェントとのやりとりをすることもできますが、今回は AgentNetwork によるやりとりを試します。
AgentNetwork のページにアクセスする
http://localhost:4111/networks にアクセスします。そうすると以下の内容が表示されるので、右側にある「Multi Agent Network」をクリックします。
「Multi Agent Network」のページでシンプルな内容を送る
http://localhost:4111/networks/Multi_Agent_Network/chat というページが開きチャット画面が出てくるので、試しにチャットで「あなたは誰?」という内容を送ってみました。そうすると「simpleAgent」による回答が返ってきました。
熟考して回答してもらう(1つ目)
次に『「AIについての 1段落での説明」を、熟考して答えて。』という内容を送ってみます。そうすると、「sequentialThinkingAgent」からの回答が返ってきました。
またログ出力で、以下の Sequential Thinking MCP Server を使った処理が行われていることが確認できました(1段階だけですが...)。
熟考して回答してもらう(2つ目)
次に『「AIについての 10歳に分かるシンプルな説明」を、熟考して答えて。』という内容も試してみました。得られた回答は以下のとおりです。
ログ出力を確認したところ、以下の Sequential Thinking MCP Server を使った 4段階の処理が行われていることが確認できました。
とりあえず、どれも意図した挙動になっていそうです。
おわりに
今回、Mastra の AgentNetwork を使って「複数エージェントと MCPサーバーの組み合わせ」を試しました。自分がチャットで送った内容によって、エージェントが使い分けられ、なおかつ MCPサーバーのツールを使えるようにしたエージェントは、そのツールを使った回答をしたことも確認できました。
別途、Mastra の AgentNetwork を使った複数エージェントの使い分けを、色々と試していければと思います。