MCP Serverを呼び出すAIエージェントをMastraとAWS CDKで実装してみた
こんにちは、つくぼし(tsukuboshi0755)です!
最近MastraやMCP Serverに関する情報が増えてきており、いよいよAIエージェントの時代が到来したなと感じています。
今回はAWS上でMCP Serverを呼び出すMastraのAIエージェントを、ECS FargateとBedrockで動かすシステムを構築しました。
さらに本システムはCDKプロジェクトでデプロイする事で全てTypeScriptで完結するので、ご興味ある方はぜひご覧ください!
初めに
Mastraとは
Mastraは、AIエージェントの開発を迅速化させ、さまざまなタスクを自動化できるTypeScriptで記述するAIフレームワークです。
AIエージェントフレームワークとしては他にもLangGraphが代表的ですが、個人的にデフォルトでHonoベースのHTTPサーバによるプレイグラウンドが用意されており、簡単にGUI上で動作確認できるMastraの方が好みです。
以下のように、GitHub Starの数では短期間でMastraがLangGraphを追い抜いており、注目のフレームワークとなっています。
MCP(Model Context Protocol)とは
MCPとはModel Context Protocolの略で、AIエージェントが外部ツールやAPIと連携するための標準プロトコルです。
このプロトコルを用いる事で、AIエージェントは特定のタスクを実行するために必要な情報を外部から取得し、操作を行う事ができます。
MCP内部の仕組みについては、こちらの資料が分かりやすいので合わせてご覧ください!
システムの概要
リポジトリ
今回のシステムは以下のGitHubリポジトリで公開しています。
構成図
本システムは以下の構成で動作します。
ALBからのリクエストを受け取ったECS Fargate タスクであるMastraエージェントが、Bedrockモデルを呼び出します。
呼び出されたBedrockモデルは事前に登録されているPlaywright MCP Serverを通じて、リクエスト内のプロンプトを元にブラウザ操作のツールを呼び出し操作した上で、結果を返す仕組みとなっています。
本システムの特徴
CDKの採用
今回は開発言語をTypeScriptで統一させたく、CDKを用いてインフラを構築し、MastraエージェントをECS上で動作させる事にしました。
今回はtargetEnv
をスタック名で使用する形にした事で、複数環境で同時にデプロイできるようにしています。
AWSリソースとしては、ECSでよくある構成パターンがまとめられているL3コンストラクタであるecs_patterns
の内、ALB + ECS on Fargate を構築するApplicationLoadBalancedFargateService
を使用する事で実装を抽象化し、簡潔に記述しています。
またECSでMastraを稼働させるためには、ローカルで以下のよなDockerfileを元にコンテナイメージとしてビルド及びECRへのプッシュが必要です。
今回はcdk-docker-image-deploymentというCDKライブラリを用いて、上記作業をCDKデプロイ時に自動化する事を実現しています。
Bedrockの呼び出し
Mastraエージェントの実装方法として、Bedrockの生成AI基盤モデルを使用すると共に、ECS上でMastraをコンテナとして稼働させる事で、不要なAPIキーの削減とインフラコストのAWSへの一元化を実現しました。
Vercel社が提供する@ai-sdk/amazon-bedrock
を使用する事で、AWS認証情報(アクセスキー/シークレットアクセスキー/セッショントークン)を環境変数として渡す事でBedrockにアクセスできます。
また@aws-sdk/credential-providers
を併用する事で、AWS認証情報の代わりにIAMロールを使用してBedrockを呼び出す事ができます。
今回は環境変数のNODE_ENV
にproduction
が指定されているかを確認し、指定されていなければローカル検証用としてAWS認証情報を使用、逆に指定されていればECSタスク用としてAWSのIAMロールを使用するようにしています。
なおAWSクレジットを使用したい場合は、Bedrockで一般的なClaudeシリーズではクレジットとは別で請求されてしまうため、代わりにNovaシリーズのモデルを使用するのがオススメです。
AI SDKを用いたAmazon Bedrockへの接続方法の詳細については、以下のVercel公式ドキュメントも参考にしてください。
MCP Serverの登録
今回はMCP Serverのサンプルとして以下のPlaywright MCP Serverを使用し、ブラウザ操作の自動化を実現します。
このMCP ServerはAPIキーを必要としないため、キーの登録及び管理の手間なく検証を行う事ができます。
今回はオプションに--headless
を指定する事でブラウザをヘッドレスモードで起動しています。
なおディレクトリ構成及びプロンプトについては、以下のGitHubリポジトリを参考にしています。
検証手順
以下のREADMEのGetting Started項目の手順に沿ってシステムをセットアップする事で、数コマンドで簡単にAWS上にデプロイする事ができます。
環境構築/ローカル環境起動
事前にルートディレクトリでnpm install:all
を実行しておくと、webとinfraの両方のモジュールがインストールされます。
またapp/.env.development
ファイルを作成しAWS認証情報の登録する事で、ローカル環境でBedrockモデルを呼び出す事ができます。
ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
SESSION_TOKEN=XXXXXXXXXXXXXXXXXXXX
npm run mastra:dev
で、ローカル環境でMastraを起動しバックエンド側の動きを確認できます。
AWSデプロイ手順
npm run cdk:deploy
を実行すると、CDKが上記のパラメータを用いてAWS上にインフラをデプロイします。
(中略)
Outputs:
MastraMcpOnEcsStack.FargateServiceLoadBalancerDNSXXXXXXXX = mastra-alb-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com
MastraMcpOnEcsStack.FargateServiceServiceURLXXXXXXXX = http://mastra-alb-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com
(中略)
OutPutsに表示された該当URLをクリックすると、Mastraのエージェント画面が表示されます。
そのままPlaywright Browser Agent
を選択すると、以下のようなプロンプト入力画面が現れます。
なお初回はコンテナ内にブラウザがインストールされていないため、エージェントがMCP Serverを通じてplaywright_browser_install
ツールを使用します。
インストール後にブラウザを用いてエージェントが作業を実施します。
例えば以下のように質問を投げると、ブラウザからplaywright_browser_navigate
ツールによるナビゲートで検索を行った上で、返答が返ってきます。
(なお記事にアップロードできるGifが3MBに制限されているため、途中の待機時間を一部カットしているのでご了承下さい)
このような形で、AWS上でMastraで作成したAIエージェントを動作させる事ができました!
追記(2025/04/20)
同じ構成で、Playwright MCP Serverの代わりにAWS Documentation MCP Serverを呼び出すMastraエージェントを構築したので、もし良ければこちらもご参照ください!
以下の形で、AWSドキュメントを参照しながら回答を生成する事ができます。
まとめ
本記事ではMCP Serverを呼び出すMastraコンテナを、ECS FargateとBedrockで動かすシステムを構築しました。
今回のCDKプロジェクトは、app/src/mastra/mcp/index.ts
の内容を変える事で他のMCP Serverも呼び出す事ができます。
ぜひ自分の好きなMCP Serverを呼び出すMastraエージェントを作成してみてください!
以上、つくぼし(tsukuboshi0755)でした!
Discussion