Amazon Q Developer CLIからMCPを経由してStrands Agentsを呼び出してみた(AIエージェント間通信)

technologies

  • HOME
  • BLOG
  • technologies
  • Amazon Q Developer CLIからMCPを経由してStrands Agentsを呼び出してみた(AIエージェント間通信)

From What is Model Context Protocol (MCP)? How it simplifies AI integrations compared to APIs

目次

  1. はじめに
  2. 本記事の対象読者
  3. LambdaでStrands Agentsを構築してみる
    1. 前提条件
    2. サンプルコードをダウンロードする
    3. CDKスタックをデプロイしてLambda関数を構築する
    4. Lambda関数を実行してAIエージェントが動作することを確認する
  4. AWS Lambda MCP ServerにLambdaを追加する
    1. Lambda関数を実行可能なIAMユーザを作成する
    2. AWS Lambda MCP ServerにLambda関数を追加する
  5. Amazon Q Developer CLIからMCP経由でStrands Agentsを呼び出してみる
  6. まとめ

1. はじめに

こんにちは!ベンジャミンの松延(まつのぶ)です!
AWS公式ブログにてオープンソースのAIエージェントSDKである「Strands Agents」が紹介されました。
Strands Agents SDKを使用することで、AIエージェントをプログラム上で簡単実装できるようになります。
Strands Agentsに関する概要は、「オープンソースのAIエージェントSDK「Strands Agents」をハンズオンしてみよう!」という記事を執筆していますので、ご確認ください。

Strands Agentsが発表されてまだ日が浅いのですが、少し踏み込んでみました。
Strands Agents公式を確認してみたところ、Lambda上でStrands Agentsを使用してAIエージェントを構築・実行することが可能とのことです。
また、AWS Lambda MCP Serverを使用すると、MCPを経由してAWSアカウント上のLambda関数を実行することが可能です。
つまり、Lambda上でStrands Agentsを使用してAIエージェントを構築してAWS Lambda MCP Serverに登録することで、Amazon Q Developer CLIからMCPを経由してAIエージェント(Strands Agents)を呼び出すことができます。AIエージェント同士で通信が可能になります。
本記事では、上記の実装方法についてシェアしていきたいと思います。


2. 本記事の対象読者

以下を対象読者としています。そのため、Amazon Q Developer CLIやMCP、Strands Agentsの概要については割愛させていただきます。
また、本記事のハンズオン中にAWS CDKを使用する場面がありますが、CDKに関する概要やcdk bootstrap等についての説明は割愛させていただきます。AWS CDKの概要等については、こちらの記事が参考になります。


3. LambdaでStrands Agentsを構築してみる

Strands Agents公式を確認してみたところ、Lambda上でStrands Agentsを使用してAIエージェントを構築・実行することが可能とのことです。
まずこちらをハンズオンしてみましょう!

1. 前提条件

  • オレゴンリージョン(us-west-2)のAmazon BedrockにてClaude 3.7 Sonnetが有効化されていること
  • 作業端末にてAWS CLIがインストールされており、AWS CLIで認証情報の設定が完了していること
  • 作業端末にてpipが25.1.1以上がインストールされていること

2. サンプルコードをダウンロードする

1. ハンズオン用のディレクトリを作成してください。

mkdir ~/Desktop/strands-agents-handson
cd ~/Desktop/strands-agents-handson

2. Strands Agentsのリポジトリをクローンしてください。

git clone https://github.com/strands-agents/docs.git

3. リポジトリをクローンした後、Lambda用のサンプルコードをコピーしましょう。

cp -r docs/docs/examples/cdk/deploy_to_lambda/ ./deploy_to_lambda
cd ./deploy_to_lambda

deploy_to_lambdaのディレクトリ構造は以下のようになっているかと思います。

deploy_to_lambda/
├── .gitignore
├── .mise.toml
├── README.md
├── bin/           # CDKアプリのエントリーポイントとデプロイスクリプトを含む
├── lib/           # TypeScriptでのCDKスタック定義を含む
├── lambda/        # Python Lambda関数のコードを含む
├── packaging/     # Lambdaデプロイメントアセットと依存関係を保存するディレクトリ
├── tsconfig.json
├── cdk.json
├── package.json
├── package-lock.json
└── requirements.txt

deploy_to_lamba/lambda/agent_handler.pyにて、Strands AgentsでAIエージェントが定義されています。
サンプルコードでは、アメリカの各地域の天気情報を取得するためのAIエージェントが定義されています。

from strands import Agent
from strands_tools import http_request
from typing import Dict, Any

# Define a weather-focused system prompt
WEATHER_SYSTEM_PROMPT = """You are a weather assistant with HTTP capabilities. You can:

1. Make HTTP requests to the National Weather Service API
2. Process and display weather forecast data
3. Provide weather information for locations in the United States

When retrieving weather information:
1. First get the coordinates or grid information using https://api.weather.gov/points/{latitude},{longitude} or https://api.weather.gov/points/{zipcode}
2. Then use the returned forecast URL to get the actual forecast

When displaying responses:
- Format weather data in a human-readable way
- Highlight important information like temperature, precipitation, and alerts
- Handle errors appropriately
- Convert technical terms to user-friendly language

Always explain the weather conditions clearly and provide context for the forecast.
"""

def handler(event: Dict[str, Any], _context) -> str:
    weather_agent = Agent(
        system_prompt=WEATHER_SYSTEM_PROMPT,
        tools=[http_request],
    )

    response = weather_agent(event.get('prompt'))
    return str(response)

サンプルコードでは、CDKを用いてLambda関数がデプロイされるようです。

3. CDKスタックをデプロイしてLambda関数を構築する

1. CDKとTypeScriptを含むNode.jsの依存関係をインストールしてください。

npm install

2. Pythonの仮想環境を作成してください。

python -m venv .venv
source .venv/bin/activate  # Windowsの場合: .venv\Scripts\activate

3. Pythonの依存関係をインストールしてください。

pip install -r requirements.txt

4. Lambda関数用のPython依存関係をインストールしてください。
(pip 25.1.1未満だと以下コマンド実行時にエラーが発生することがあります。pip 25.1.1以上にアップデートしてください)

pip install -r requirements.txt --platform manylinux2014_aarch64 --target ./packaging/_dependencies --only-binary=:all:

5. Lambdaをパッケージ化してください。

python ./bin/package_for_lambda.py

Lambdaのパッケージが完了すると以下が表示されるかと思います。

Creating Lambda deployment package: /Users/matsunobu/Desktop/strands-agents-handson/deploy_to_lambda/packaging/app.zip
Creating ZIP files...
  Creating dependencies.zip...
  Creating app.zip...
Lambda deployment packages created successfully: dependencies.zip app.zip

6. AWS環境をブートストラップしましょう(まだ行なっていない場合)

npx cdk bootstrap --region us-west-2

7. CDKスタックをデプロイしましょう!

npx cdk deploy --region us-west-2

デプロイが完了するまで約1〜2分ほどかかります。

4. Lambda関数を実行してAIエージェントが動作することを確認する

1. 以下コマンドを実行してLambda関数を実行してみましょう。

aws lambda invoke --function-name AgentFunction \
      --region us-west-2 \
      --cli-binary-format raw-in-base64-out \
      --payload '{"prompt": "ニューヨークの今日の天気を教えてください。"}' \
      output.json

2. 出力結果を見てみましょう!

cat ./output.json

"\n\n# ニューヨーク市の今日の天気\n\n## 本日の天気概況\n**天気**: ほとんど晴れ (Mostly Sunny)\n**最高気温**: 66°F (約19°C)\n**風**: 北風、時速8〜13マイル (約13〜21 km/h)\n\n## 詳細予報\nニューヨーク市は今日、ほとんど晴れの穏やかな一日となっています。最高気温は66°F (約19°C)で、北風が時速8〜13マイル程度吹いています。\n\n## 今後の天気\n今夜は気温が下がり53°F (約12°C)前後となり、雲が増えて「ほとんど曇り (Mostly Cloudy)」の状態になる見込みです。東風が時速7〜10マイル程度吹く予報です。\n\n明日(水曜日)からは天気が崩れ、雨の可能性が高くなります。気温は56°F (約13°C)まで上がる見込みですが、雨の影響で体感温度は下がるでしょう。降水確率は70%となっています。\n\n## 週末の見通し\n週末に向けて天気は徐々に回復し、土曜日と日曜日は部分的に晴れる見込みです。日曜日の最高気温は67°F (約19°C)まで上昇する予報です。\n\n今日はお出かけに適した良い天気となっていますが、明日以降は傘をお持ちになることをお勧めします。\n"%  

読みにくいのですが、問題なく出力できています!
また、CloudWatch Logsにもログ出力されています。


4. AWS Lambda MCP ServerにLambdaを追加する

AWS Lambda MCP Serverを使用すると、MCPを経由してAWSアカウント上のLambda関数を実行することが可能です。
AWS Lambda MCP Serverにさきほど作成したLambda関数を追加しましょう!
事前にLambda関数を実行することが可能なIAMユーザを作成しておき、AWS CLIのプロファイルに指定する必要があります。

1. Lambda関数を実行可能なIAMユーザを作成する

1. AWSマネジメントコンソール上部の検索エリアに[IAM]と入力して、IAMホーム画面を開いてください

2. IAM画面左側の[アクセス管理] > [ユーザー]を選択して、IAMユーザ一覧画面を表示してください。

3. [ユーザーの作成]を選択してください。

4. ユーザ詳細画面にて以下を設定し、[次へ]を選択してください。

項目名設定値
ユーザー名strands-agents-handson-lambda
AWSマネジメントコンソールへのユーザーアクセスを提供するチェックなし

5. 今回はハンズオンのためLambdaへのフルアクセス権限を付与してIAMユーザを作成してください。
(※)実際にシステム構築する際は、AWSベストプラクティスである「最小権限の原則」に従い、必要な権限のみ付与するようにしてください。

6. IAMユーザ作成後、該当IAMユーザの詳細画面からアクセスキーを発行しましょう。
[セキュリティ認証情報]タブの[アクセスキー]セクションにて、[アクセスキーを作成]を選択してください。

7. ユースケースを選択して、[次へ]を選択してください。

8. 説明タグは省略して[アクセスキーを作成]を選択してください。

9. アクセスキーをダウンロードし外部に漏れないように厳重に保管してください。

10. ターミナルを開き、以下コマンドを実行してください。

vim ~/.aws/credentials

11. 以下をコピー&ペーストして保存し、vimエディタを閉じてください。(:wqコマンド実行で、保存・vimエディタを閉じます)

[strands-agents-handson-lambda]
aws_access_key_id=<IAMユーザのアクセスキー>
aws_secret_access_key=<IAMユーザのシークレットアクセスキー>
region=us-west-2

12. 以下コマンドを実行しAWS STS認証を実行しておきます。

aws sts get-caller-identity --profile strands-agents-handson-lambda

以下のような結果が返却されてきている場合は、正常に認証が成功しています。

{
    "UserId": "<ユーザID>",
    "Account": "<AWSアカウントID>",
    "Arn": "arn:aws:iam::<AWSアカウントID>:user/strands-agents-handson-lambda"
}

補足となりますが、IAMユーザのアクセスキー等を使用せずにIAMロールを使用して認証設定することも可能です。IAMロールを使用した認証設定方法については、こちらの記事が参考になります。

2. AWS Lambda MCP ServerにLambda関数を追加する

1. Amazon Q Developer CLIのMCP設定ファイルを作成してください。

mkdir ~/Desktop/strands-agents-handson/.amazonq
cd ~/Desktop/strands-agents-handson/.amazonq
touch mcp.json

2. MCP設定ファイル(.amazonq/mcp.json)を開き、以下をコピー&ペーストして保存してください。

{
  "mcpServers": {
    "awslabs.lambda-mcp-server": {
        "command": "uvx",
        "args": ["awslabs.lambda-mcp-server@latest"],
        "env": {
            "AWS_PROFILE": "strands-agents-handson-lambda",
            "AWS_REGION": "us-west-2",
            "FUNCTION_PREFIX": "AgentFunction"
        }
     }
  }
}

envプロパティに含める各種設定値については以下になります。

設定項目説明
AWS_PROFILEAWS CLIで指定するプロファイル名
(今回は、strands-agents-handson-lambdaを指定)
AWS_REGION実行されるLambda関数が所属しているリージョン
(今回は、オレゴンリージョン(us-west-2)を指定)
FUNCTION_PREFIX実行対象のLambda関数名
(今回は、サンプルCDK実行時にデプロイされたLambda関数(AgentFunction)を指定)

これでAWS Lambda MCP Serverに対してLambda関数を追加することができました!

5. Amazon Q Developer CLIからMCP経由でStrands Agentsを呼び出してみる

ようやくここまでできたので、Amazon Q Developer CLIからMCP経由でStrands Agentsを呼び出してみましょう!

1. 以下ディレクトリ上でq chatコマンドを実行し、Amazon Q Developer CLIを起動してください。

cd ~/Desktop/strands-agents-handson
q chat

すると、以下のような表示がされます。

✓ awslabslambda_mcp_server loaded in 5.12s
✓ 1 of 1 mcp servers initialized
    ⢠⣶⣶⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⣿⣶⣦⡀⠀
 ⠀⠀⠀⣾⡿⢻⣿⡆⠀⠀⠀⢀⣄⡄⢀⣠⣤⣤⡀⢀⣠⣤⣤⡀⠀⠀⢀⣠⣤⣤⣤⣄⠀⠀⢀⣤⣤⣤⣤⣤⣤⡀⠀⠀⣀⣤⣤⣤⣀⠀⠀⠀⢠⣤⡀⣀⣤⣤⣄⡀⠀⠀⠀⠀⠀⠀⢠⣿⣿⠋⠀⠀⠀⠙⣿⣿⡆
 ⠀⠀⣼⣿⠇⠀⣿⣿⡄⠀⠀⢸⣿⣿⠛⠉⠻⣿⣿⠛⠉⠛⣿⣿⠀⠀⠘⠛⠉⠉⠻⣿⣧⠀⠈⠛⠛⠛⣻⣿⡿⠀⢀⣾⣿⠛⠉⠻⣿⣷⡀⠀⢸⣿⡟⠛⠉⢻⣿⣷⠀⠀⠀⠀⠀⠀⣼⣿⡏⠀⠀⠀⠀⠀⢸⣿⣿
 ⠀⢰⣿⣿⣤⣤⣼⣿⣷⠀⠀⢸⣿⣿⠀⠀⠀⣿⣿⠀⠀⠀⣿⣿⠀⠀⢀⣴⣶⣶⣶⣿⣿⠀⠀⠀⣠⣾⡿⠋⠀⠀⢸⣿⣿⠀⠀⠀⣿⣿⡇⠀⢸⣿⡇⠀⠀⢸⣿⣿⠀⠀⠀⠀⠀⠀⢹⣿⣇⠀⠀⠀⠀⠀⢸⣿⡿
 ⢀⣿⣿⠋⠉⠉⠉⢻⣿⣇⠀⢸⣿⣿⠀⠀⠀⣿⣿⠀⠀⠀⣿⣿⠀⠀⣿⣿⡀⠀⣠⣿⣿⠀⢀⣴⣿⣋⣀⣀⣀⡀⠘⣿⣿⣄⣀⣠⣿⣿⠃⠀⢸⣿⡇⠀⠀⢸⣿⣿⠀⠀⠀⠀⠀⠀⠈⢿⣿⣦⣀⣀⣀⣴⣿⡿⠃
 ⠚⠛⠋⠀⠀⠀⠀⠘⠛⠛⠀⠘⠛⠛⠀⠀⠀⠛⠛⠀⠀⠀⠛⠛⠀⠀⠙⠻⠿⠟⠋⠛⠛⠀⠘⠛⠛⠛⠛⠛⠛⠃⠀⠈⠛⠿⠿⠿⠛⠁⠀⠀⠘⠛⠃⠀⠀⠘⠛⠛⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠿⢿⣿⣿⣋⠀⠀
 ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠿⢿⡧

╭──────────────── Did you know? ─────────────────╮
│                                                                              │
│     You can resume the last conversation from your current directory by      │
│                        launching with q chat --resume                        │
│                                                                              │
╰────────────────────────────────────────╯

/help all commands  •  ctrl + j new lines  •  ctrl + s fuzzy search
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
> 

2. 以下チャットコマンドを実行して、AWS Lambda MCP Serverが登録されていることを確認します。

> /tools

Tool                                            Permission
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Built-in:
- fs_read                                       * trusted
- fs_write                                      * not trusted
- use_aws                                       * trust read-only commands
- report_issue                                  * trusted
- execute_bash                                  * trust read-only commands

awslabslambda_mcp_server (MCP):
- awslabslambda_mcp_server___lambda_function    * not trusted

awslabslambda_mcp_server___lambda_functionが登録されていますね!

3. では、以下チャットコマンドを実行してみましょう!

> --prompt "ニューヨークの今日の天気について教えてください"

もしくは以下でも大丈夫です。

> ニューヨークの今日の天気について教えてください。(パラメータはprompt)

補足ですが、チャットコマンド末尾に「–prompt」「(パラメータはprompt)」と指示しているのは、Lambda関数(agent_handler.py)のevent引数にてpromptが指定されているためです。

def handler(event: Dict[str, Any], _context) -> str:
    weather_agent = Agent(
        system_prompt=WEATHER_SYSTEM_PROMPT,
        tools=[http_request],
    )

    response = weather_agent(event.get('prompt')) # こちらでpromptをパラメータとして受け取る
    return str(response)

以下のようにAWS Lambda MCP Serverを使用して、天気予報エージェント(Strands Agents)を呼び出そうとしています。

> --prompt "ニューヨークの今日の天気について教えてください"
ニューヨークの今日の天気情報を取得するために、天気予報エージェントを呼び出します。


🛠️  Using tool: lambda_function from mcp server awslabslambda_mcp_server
 ⋮ 
 ● Running lambda_function with the param:
 ⋮  {
 ⋮    "arguments": {
 ⋮      "parameters": {
 ⋮        "prompt": "ニューヨークの今日の天気について教えてください"
 ⋮      }
 ⋮    },
 ⋮    "name": "lambda_function"
 ⋮  }
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

4. 以下チャットコマンド(yes)を実行してください。

> y

すると、以下のように天気情報を返却してくれました!

 ⋮ 
 ● Completed in 26.98s


# ニューヨークの今日の天気

## 今日の天気概要
• **天気**: ほとんど晴れ (Mostly Sunny)
• **最高気温**: 66°F (約19°C)
• **風**: 北風、時速8〜13マイル (約13〜21 km/h)
• **降水確率**: 記載なし(低い可能性)

## 詳細予報
今日のニューヨークはほとんど晴れの良い天気です。最高気温は66°F(約19°C)で、北風が時速8〜13マイル(約13〜21 km/h)で吹く見込みです。雨の予報はありません。

## 週間天気の傾向
明日(水曜日)から天気が崩れ、雨が降り始める可能性が高くなります。明日の最高気温は56°F(約13°C)で、降水確率は70%です。木曜日も雨が続く見込みです。天気が回復するのは週末になりそうです。

今日はニューヨークでの外出には良い天気ですが、明日以降は雨具の準備をお勧めします。

> 

Lambda関数のログ上(CloudWatch Logs)にもAIエージェントのやり取りが記録されています。

Amazon Q Developer CLIからAWS Lambda MCP Serverを経由してLambdaを実行しAIエージェント(Strands Agents)の実行ができています。AIエージェント間で通信できていますね!


6. まとめ

Amazon Q Developer CLIからAWS Lambda MCP Serverを経由してLambdaを実行しAIエージェント(Strands Agents)の実行が可能であることを確認できました。AIエージェント間で通信できることは、アイデア次第でかなり応用できることがわかりました!実務の業務改善や実案件に活かしていきたいです!

Related posts