MastraからTavily MCP Serverを呼び出す

# 前書き

![rectangle_large_type_2_7a9de768745d8342e5fa82e392966642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/fc7da237-69e2-46f1-b2bf-cb716617f9a2.png)

皆様はTavilyを使ってますでしょうか？
最新情報の検索が可能で、LLMとの連携も容易に実現できるツールです。

私は個人的にAmazon Bedrock Agentを構築する際、アクショングループにTavily APIを利用可能なLambda関数をツールとして登録し、最新情報検索を実行させることが多いです。

最近、Mastraの検索ツールとしてTavilyを導入したいと考えていましたが、APIスキーマを毎回記述するのは煩雑であるため、代替手段としてMCPを使って呼び出し方法を検証しました。

# MastraとTavily MCPとの連携

### プロジェクト初期化

```bash
npx create-mastra@latest
```

選択肢はいくつかありますが、基本的にはAgentsのコンポーネントをチェックする必要があるだけで、他は任意の設定で問題ありません。

```bash
Need to install the following packages:
create-mastra@0.2.3
Ok to proceed? (y) y

┌  Mastra Create
│
◇  What do you want to name your project?
│  mastra-mcp
│
◇  Project created
│
◇  npm dependencies installed
│
◇  mastra installed
│
◇  @mastra/core installed
│
◇  .gitignore added
│
└  Project created successfully


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

```
Amazon Bedrockプロバイダーを追加する(任意)


```bash
cd mastra-mcp

npm install @ai-sdk/amazon-bedrock
```

Mastraのmcpライブラリをインストール

```bash
npm install @mastra/mcp@latest
```

### MCP用Agentの作成

Tavily公式が以下のMCPリポジトリを公開しています。基本的にはこのリポジトリから呼び出し設定をコピーして使用します。

https://github.com/tavily-ai/tavily-mcp

Agentの説明はTavilyのAPIドキュメントからパラメーターを引用しました。基本的に`query`パラメータがあれば動作します。

https://docs.tavily.com/documentation/api-reference/endpoint/search#authorization-authorization

```typescript:src/mastra/agents/mcpAgent.ts
import { createAmazonBedrock } from "@ai-sdk/amazon-bedrock";
import { Agent } from "@mastra/core/agent";
import { MCPConfiguration } from "@mastra/mcp";

const bedrock = createAmazonBedrock({
  region: "ap-northeast-1",
  accessKeyId: "xxxx",
  secretAccessKey: "xxxx",
  sessionToken: "xxxx",
});

const mcp = new MCPConfiguration({
  servers: {
    tavily: {
      command: "npx",
      args: ["-y", "tavily-mcp@0.1.4"],
      env: {
        TAVILY_API_KEY: "tvly-xxx-xxxx", // Tavilyにログイン後に取得可能です
      },
    },
  },
});

export const mcpAgent = new Agent({
  name: "MCP Agent",
  instructions: `
      あなたはウェブ検索ができるエージェントです。

      【情報を求められた場合】
      webSearchToolを使用してウェブ検索を実行してください。webSearchToolは以下のパラメータを受け付けます：
      - query: 検索クエリ（必須）
      - topic: 検索カテゴリ (オプション) generalとnewsを使用できる

      回答は常に簡潔ですが情報量を保つようにしてください。ユーザーの質問に直接関連する情報を優先して提供してください。
  `,
  model: bedrock("anthropic.claude-3-5-sonnet-20240620-v1:0"),
  tools: await mcp.getTools(),
});

```

MCP AgentをMastraに登録

```diff_typescript:src/mastra/index.ts
import { Mastra } from "@mastra/core/mastra";
import { createLogger } from "@mastra/core/logger";
import { weatherWorkflow } from "./workflows";
import { weatherAgent } from "./agents";
+ import { mcpAgent } from "./agents/mcpAgent";

export const mastra = new Mastra({
  workflows: { weatherWorkflow },
+  agents: { weatherAgent, mcpAgent },
  logger: createLogger({
    name: "Mastra",
    level: "info",
  }),
});

```

これで設定は完了です。サーバーを起動して実際に使用してみましょう。

```bash
npm run dev
```

`http://localhost:4111/`にアクセスすると、MCP Agentが追加されていることが確認できます。

![03A51386-5B9C-43B7-BE57-F9DECD04DB3A_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/44133620-e9f6-4eef-b042-2d78bf51d0d7.jpeg)

このエージェントを選択した状態で、最近発生したタイの地震について質問したところ、最新情報を適切に回答してくれました。

![517F5BFB-D10D-4004-963B-EBC125B9A76C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/d39c4fc9-150a-4beb-a509-6741cf3b421c.jpeg)

トレースを確認すると、ユーザー入力を適切に変換し、パラメータも正しく使用していることがわかります。

![3BE39703-AF1B-43B9-870D-C986759C6544.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/197a6441-5c1d-4b2d-964f-8d2e6982f9a6.jpeg)