Mastra の AgentNetwork を使って「複数エージェントと MCPサーバーの組み合わせ」を試す

## はじめに

直近で以下を試していた 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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d9923852-abca-4500-b2e4-34f5e75545d9.png)


#### Mastra の AgentNetwork に関する補足

以下の Mastra の公式ドキュメントを見ると、「AgentNetwork」は現状は実験的な機能になるようです。

●AgentNetwork（実験的）
　https://mastra.ai/ja/reference/networks/agent-network
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1e4c3f82-3cc0-4227-90bb-4396f8842964.png)



## 下準備

ここから実際に試していきます。
そのための下準備として、以下を進めます。


### create-mastra を使った準備

以下のコマンドを実行してベースを作ります。

```zsh
npx create-mastra
```

このコマンドを実行して設定する内容は、以下のとおりです。

プロジェクト名： my-mastra-app
その他の設定：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/466d7e47-54f5-4717-9705-0eb1cd64556a.png)


インストールなどが終わった後は `my-mastra-app/src/mastra` フォルダに以下の内容の index.ts と空のフォルダ（agents）が作成されました。

```typescript
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` 直下の構成は以下となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/99fad8de-6790-4c09-b675-e9e049f2848b.png)


この後にコードを実装するファイルは、以下 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` フォルダ内で以下を実行し、パッケージをインストールしておきます。

```zsh
npm i @mastra/mcp
```


### APIキーの設定

今回、参照している記事で以下に書かれている APIキーの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/dc110b0c-1ef9-47ec-800c-69761c4ce300.png)

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 の実装は以下のとおりです。全体をまとめた内容を記載したという感じになりました。

```javascript: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](https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking) を使うための設定を書く形にしています。
※ 以前、[VS Code（GitHub Copilot agent mode）と組み合わせて試したことがある](https://qiita.com/youtoy/items/92cb8a0cd845043229dc) MCPサーバーだったりします
　

```javascript:agents/index.js
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」となっているようでした。これが上記の挙動の原因のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a022de0f-0839-4ef4-abd0-6733b36d63a3.png)

今回、Agent.generate() は使わないので、その maxSteps を AIエージェントのコンストラクタに設定しています。ドキュメントを見ると、[以下](https://mastra.ai/ja/reference/agents/agent#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF)のオプションに書けば良さそうだったので、デフォルト値の倍の値（10）を指定して試してみています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5bd82205-edfd-4667-b0d4-c2abe16d2ba1.png)


#### mastra/network直下の index.js

 mastra/network直下の index.js の実装は以下のとおりです。2つのエージェントへの振り分けの説明を `instructions` に書いています。


```javascript:network/index.js
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` フォルダで実行して、サーバーを起動します。

```zsh
npm run dev
```


### ブラウザからアクセスして試す

起動したサーバーに、ブラウザでアクセスします。

http://localhost:4111/ にアクセスすると、 http://localhost:4111/agents を開いた状態になり、以下のページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d78205b9-dc85-42cf-91d4-dee49e849690.png)

このページの右側に、先ほど実装した 2つのエージェントが表示されています。

ここから 2つのエージェントのそれぞれをクリックして、個々のエージェントとのやりとりをすることもできますが、今回は AgentNetwork によるやりとりを試します。

#### AgentNetwork のページにアクセスする

http://localhost:4111/networks にアクセスします。そうすると以下の内容が表示されるので、右側にある「Multi Agent Network」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a4c44216-2666-4860-8c52-1df72ef8ee5d.png)


#### 「Multi Agent Network」のページでシンプルな内容を送る

http://localhost:4111/networks/Multi_Agent_Network/chat というページが開きチャット画面が出てくるので、試しにチャットで「あなたは誰？」という内容を送ってみました。そうすると「simpleAgent」による回答が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/716ae903-8993-44da-9a01-20c7aff90970.png)



#### 熟考して回答してもらう（1つ目）

次に『「AIについての 1段落での説明」を、熟考して答えて。』という内容を送ってみます。そうすると、「sequentialThinkingAgent」からの回答が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1f6d98d1-f7bd-4988-be68-fe26cb9c3397.png)


またログ出力で、以下の Sequential Thinking MCP Server を使った処理が行われていることが確認できました（1段階だけですが...）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8baaf779-1578-484d-acc2-b4502bf223f6.png)



#### 熟考して回答してもらう（2つ目）

次に『「AIについての 10歳に分かるシンプルな説明」を、熟考して答えて。』という内容も試してみました。得られた回答は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e72b0081-3147-41d1-ac90-05343fba70ea.png)


ログ出力を確認したところ、以下の Sequential Thinking MCP Server を使った 4段階の処理が行われていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b35770b5-fa2a-4bd2-a1b4-f06d2fcd14b7.png)


とりあえず、どれも意図した挙動になっていそうです。


## おわりに

今回、Mastra の AgentNetwork を使って「複数エージェントと MCPサーバーの組み合わせ」を試しました。自分がチャットで送った内容によって、エージェントが使い分けられ、なおかつ MCPサーバーのツールを使えるようにしたエージェントは、そのツールを使った回答をしたことも確認できました。

別途、Mastra の AgentNetwork を使った複数エージェントの使い分けを、色々と試していければと思います。