MastraとBraveSearch MCPを連携した際に上手くクエリが生成されない

こんにちは、ふくちです。
最近MCPが激バズワードとして語られていますね。

私も例に漏れず触れ始めており、ついでにMastraで簡単なアプリケーション開発に挑戦しています。

そんな中で上手くBraveSearch MCPが使えない、という事象に遭遇したのでメモとして残しておきます。
原因はあまりにも初歩的なミスだったのですが、原因特定に時間がかかったのでどなたかの助けになればと思います。

# 最初に結論
- 上手くいかない時は @mastra/core と @mastra/mcp のバージョンを確認しましょう
- 2025/04/10時点では、以下が最新です
    - @mastra/core: 0.8.1
    - @mastra/mcp: 0.3.8

# 事象
Mastraでエージェントを構築し、Brave Search MCPを使えるように設定していました。
実装は[Mastraの公式ドキュメント](https://mastra.ai/docs/agents/mcp-guide)と以下ブログを参考に行いました。

https://note.com/nike_cha_n/n/nbc7696f06eb8

```src/mastra/index.ts
import { Mastra } from "@mastra/core/mastra";
import { createLogger } from "@mastra/core/logger";

import { blogIdeaAgent } from "./agents";

export const mastra = new Mastra({
  agents: { blogIdeaAgent },
  logger: createLogger({
    name: "Mastra",
    level: "debug",
  }),
  telemetry: {
    // 省略
  },
});
```

```src/mastra/agents/index.ts
import { initializeBedrockClient } from "@/lib/bedrock-client";
import { Agent } from "@mastra/core/agent";
import { MCPConfiguration } from "@mastra/mcp";

const bedrock = initializeBedrockClient();

const mcp = new MCPConfiguration({
  id: "brave-search-mcp",
  servers: {
    // stdio example
    github: {
      command: "npx",
      args: ["-y", "@modelcontextprotocol/server-brave-search"],
      env: {
        BRAVE_API_KEY: process.env.BRAVE_API_KEY ?? "",
      },
    },
  },
});

export const blogIdeaAgent = new Agent({
  name: "Blog Idea Agent",
  instructions: `
      あなたはブログ執筆をサポートするエージェントです。toolsを駆使して情報を検索し、その情報を元にしてブログのネタや構成を考えてください。
      返答は日本語でしてください。
      
      <instructions>
      1. 情報収集フェーズ
      - github_brave_web_searchツールを使用して最新情報を検索してください。
      - ユーザーの入力から具体的な検索キーワードや質問文を抽出し、それをquery引数としてgithub_brave_web_searchツールへ渡してください。
      - 検索パラメータ:
        * query: 検索クエリ（必須）
        * country: 検索結果の国コード（例: JP, US）（オプション）
        * count: 返される検索結果の最大数（オプション）
        * search_lang: 検索言語（例: ja, en）（オプション）

      2. ブログ方針決定フェーズ
      - 検索結果を分析し、以下の要素を考慮してブログの方針を決定:
        * 対象読者層:
          - 初心者向け: ハンズオン形式、専門用語の平易な説明
          - 中級者向け: 実践的なTips、ベストプラクティス、パフォーマンス最適化
          - 上級者向け: アーキテクチャ設計、高度な技術解説、最新トレンドの深堀り
          - マネージャー向け: チーム開発の効率化、プロジェクト管理の視点
        * コンテンツの目的:
          - 教育・学習
          - 問題解決
          - 最新情報の共有
          - ベストプラクティスの提示

      3. ブログ構成作成フェーズ
      - 決定した方針に基づき、以下の要素を含むブログ構成を作成:
        * タイトル案（3-5個）
        * 導入部分の構成
        * メインコンテンツの章立て
        * 結論・まとめの方向性
        * 参考資料・リソースの提示方法
      </instructions>
`,
  model: bedrock("us.anthropic.claude-3-haiku-20240307-v1:0"),
  tools: await mcp.getTools(),
});

```

これでいざ質問…すると、以下のようにクエリが存在しない状態になってしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0637be16-89e4-400d-add5-d765d534c173.png)

BraveSearch MCPにはqueryが必要パラメータであると記載されているのですが、これが存在しないため、検索できないという状態です。
>- brave_web_search
>    - Execute web searches with pagination and filtering
>    - Inputs:
>      - **query (string): Search terms**
>      - count (number, optional): Results per page (max 20)
>      - offset (number, optional): Pagination offset (max 9)

https://github.com/modelcontextprotocol/servers/tree/main/src/brave-search

Langfuseでトレースを確認すると、確かにどこにも設定されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/1186b569-f0bd-46c2-803a-f2314db45c75.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/a2d2a132-88ee-49fa-837e-186871593d35.png)

# 原因特定(?)
ログを参照してデバッグしていると、args配下にqueryが設定されるとわかりました。
```terminal
// ターミナルで確認

DEBUG (github_brave_web_search): Executing tool github_brave_web_search
    runId: "<生成されたid>"
    description: "Performs a web search using the Brave Search API, ideal for general queries, news, articles, and online content. Use this for broad information gathering, recent events, or when you need diverse web sources. Supports pagination, content filtering, and freshness controls. Maximum 20 results per request, with offset for pagination. "
    args: {
      "query": "",
      "count": 
    }
```

Claudeに聞くとバージョン確認してみて、と言われたので確認すると…
```terminal
$ npm view @mastra/mcp

@mastra/mcp@0.3.8 | ISC | deps: 5 | versions: 113
Model Context Protocol (MCP) client implementation for Mastra, providing seamless integration with MCP-compatible AI models and tools.

dependencies:
@mastra/core: ^0.8.1              date-fns: ^4.1.0                  uuid: ^11.1.0                     
@modelcontextprotocol/sdk: ^1.7.0 exit-hook: ^4.0.0                 

dist-tags:
alpha: 0.3.9-alpha.0                     latest: 0.3.8                            
beta: 0.1.0                              storage: 0.0.0-storage-20250225005900    
commonjs: 0.0.0-commonjs-20250227130920 
```

```terminal
$ npm list @mastra/core         
nextjs-mastra-agent@0.1.0 /project/path
├── @mastra/core@0.7.0
└─┬ @mastra/mcp@0.3.8
  └── @mastra/core@0.8.1
```

**なんかバージョンミスってそうですね…(@mastra/core@0.7.0がある)**

ということでこれを最新の0.8.1にしてあげたところ、上手く動作するようになりました。
```package.json
"dependencies": {
  "@mastra/core": "^0.8.1",
  "@mastra/mcp": "^0.3.8",
}
```
↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0aee5479-83af-4f60-853e-336361c585d8.png)

Langfuseで確認すると、argsの中にqueryが存在していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0dbb6223-4e05-49b8-b050-aa907945ccc0.png)

ということで、バージョン管理が原因でした。ちゃんちゃん♪

# こんなことになってしまった原因
最初に `npx mastra@latest init` でプロジェクトを作成したのですが、
その時の**デフォルト設定が@mastra/core@0.7.0**でした。

その一方で、@mastra/mcpは上記コマンドではインストールされないため、`npm install @mastra/mcp@latest`を実行する必要がありました。

これが原因でそれぞれのバージョンがズレてしまっていた、ということでした。
~~いやこんなん気づかんて…~~

# まとめ
原因だけ見るとなんでこんなところでミスったんや…という感じですが、正直かなり詰まりました。
というのも、これはAgentとMCPの連携部分で問題が起こっており、自身のコードをどうこうするという次元ではないからです。

AgentがBraveSearch MCPを使用する際に必要なqueryを出力してほしいのですが、実装で特に設定できるわけではなく、Agentへのinstruction内で指定するしかないため、かなり八方塞がり感がありました。

今回はバージョン管理が間違えていただけですが、もしも他の原因だった場合、原因の特定が難しそうです。
LLMアプリ開発において、フレームワーク側のバグなのか、LLM側の挙動コントロールができていないのか、というところでかなり悩みそうだなぁということを痛感する経験となりました。

これからもLLMアプリを作って、そこの経験値を溜めていければ良いなと思います！