🧠

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フレームワークです。

https://mastra.ai/

AIエージェントフレームワークとしては他にもLangGraphが代表的ですが、個人的にデフォルトでHonoベースのHTTPサーバによるプレイグラウンドが用意されており、簡単にGUI上で動作確認できるMastraの方が好みです。

以下のように、GitHub Starの数では短期間でMastraがLangGraphを追い抜いており、注目のフレームワークとなっています。

https://x.com/yoshidashingo/status/1901281518426743076

MCP(Model Context Protocol)とは

MCPとはModel Context Protocolの略で、AIエージェントが外部ツールやAPIと連携するための標準プロトコルです。

https://modelcontextprotocol.io/

このプロトコルを用いる事で、AIエージェントは特定のタスクを実行するために必要な情報を外部から取得し、操作を行う事ができます。

MCP内部の仕組みについては、こちらの資料が分かりやすいので合わせてご覧ください!

https://dev.classmethod.jp/articles/shuntaka-mcp-study/

システムの概要

リポジトリ

今回のシステムは以下のGitHubリポジトリで公開しています。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws

構成図

本システムは以下の構成で動作します。

ALBからのリクエストを受け取ったECS Fargate タスクであるMastraエージェントが、Bedrockモデルを呼び出します。

呼び出されたBedrockモデルは事前に登録されているPlaywright MCP Serverを通じて、リクエスト内のプロンプトを元にブラウザ操作のツールを呼び出し操作した上で、結果を返す仕組みとなっています。

本システムの特徴

CDKの採用

今回は開発言語をTypeScriptで統一させたく、CDKを用いてインフラを構築し、MastraエージェントをECS上で動作させる事にしました。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws/blob/main/infra/lib/mastra-mcp-on-ecs-stack.ts

今回はtargetEnvをスタック名で使用する形にした事で、複数環境で同時にデプロイできるようにしています。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws/blob/main/infra/bin/mastra-mcp-on-ecs.ts

AWSリソースとしては、ECSでよくある構成パターンがまとめられているL3コンストラクタであるecs_patternsの内、ALB + ECS on Fargate を構築するApplicationLoadBalancedFargateServiceを使用する事で実装を抽象化し、簡潔に記述しています。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs_patterns.ApplicationLoadBalancedFargateService.html

またECSでMastraを稼働させるためには、ローカルで以下のよなDockerfileを元にコンテナイメージとしてビルド及びECRへのプッシュが必要です。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws/blob/main/app/Dockerfile

今回はcdk-docker-image-deploymentというCDKライブラリを用いて、上記作業をCDKデプロイ時に自動化する事を実現しています。

https://github.com/cdklabs/cdk-docker-image-deployment

Bedrockの呼び出し

Mastraエージェントの実装方法として、Bedrockの生成AI基盤モデルを使用すると共に、ECS上でMastraをコンテナとして稼働させる事で、不要なAPIキーの削減とインフラコストのAWSへの一元化を実現しました。

Vercel社が提供する@ai-sdk/amazon-bedrockを使用する事で、AWS認証情報(アクセスキー/シークレットアクセスキー/セッショントークン)を環境変数として渡す事でBedrockにアクセスできます。

また@aws-sdk/credential-providersを併用する事で、AWS認証情報の代わりにIAMロールを使用してBedrockを呼び出す事ができます。

今回は環境変数のNODE_ENVproductionが指定されているかを確認し、指定されていなければローカル検証用としてAWS認証情報を使用、逆に指定されていればECSタスク用としてAWSのIAMロールを使用するようにしています。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws/blob/main/app/src/mastra/agents/index.ts

なおAWSクレジットを使用したい場合は、Bedrockで一般的なClaudeシリーズではクレジットとは別で請求されてしまうため、代わりにNovaシリーズのモデルを使用するのがオススメです。

AI SDKを用いたAmazon Bedrockへの接続方法の詳細については、以下のVercel公式ドキュメントも参考にしてください。

https://sdk.vercel.ai/providers/ai-sdk-providers/amazon-bedrock

MCP Serverの登録

今回はMCP Serverのサンプルとして以下のPlaywright MCP Serverを使用し、ブラウザ操作の自動化を実現します。

https://github.com/microsoft/playwright-mcp

このMCP ServerはAPIキーを必要としないため、キーの登録及び管理の手間なく検証を行う事ができます。

今回はオプションに--headlessを指定する事でブラウザをヘッドレスモードで起動しています。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws/blob/main/app/src/mastra/mcp/index.ts

なおディレクトリ構成及びプロンプトについては、以下のGitHubリポジトリを参考にしています。

https://github.com/walnut-pro/mastra-playwright-mcp

検証手順

以下のREADMEのGetting Started項目の手順に沿ってシステムをセットアップする事で、数コマンドで簡単にAWS上にデプロイする事ができます。

https://github.com/tsukuboshi/mastra-playwright-mcp-with-aws/blob/main/README.md

環境構築/ローカル環境起動

事前にルートディレクトリで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エージェントを構築したので、もし良ければこちらもご参照ください!

https://github.com/tsukuboshi/mastra-awsdoc-mcp-with-aws

以下の形で、AWSドキュメントを参照しながら回答を生成する事ができます。

まとめ

本記事ではMCP Serverを呼び出すMastraコンテナを、ECS FargateとBedrockで動かすシステムを構築しました。

今回のCDKプロジェクトは、app/src/mastra/mcp/index.tsの内容を変える事で他のMCP Serverも呼び出す事ができます。

ぜひ自分の好きなMCP Serverを呼び出すMastraエージェントを作成してみてください!

以上、つくぼし(tsukuboshi0755)でした!

Discussion