- Strands AgentsがBedrock Agents・Pydantic AIと何を分担する立ち位置か
- @toolデコレータによるツール定義とエージェントループの仕組み
- MCPサーバーをツールとして取り込む方法とマルチエージェント構成の考え方
- 確認日
- 2026年9月1日
- 検証環境
- Python 3.12 / strands-agents 0.x系 / Amazon Bedrock(Claude)・MCPサーバー連携での動作確認
- 対象読者
- Bedrock AgentsのAction Group定義の窮屈さを感じており、Pythonコードでより柔軟にエージェントの挙動を組み立てたいSE
Strands Agentsとは何か
(1) 以前Bedrock Agentsの回では、AWSコンソール上でAction Groupを定義するマネージドなエージェント構築を扱いました。Strands Agentsは、AWSがオープンソースとして公開しているPythonのエージェント構築SDKで、コードベースでエージェントのロジックをより直接的にコントロールしたい場合の選択肢です。
(2) 名前の通りBedrockとの親和性は高いものの、モデルプロバイダを特定のものに固定しない「モデル非依存」の設計になっており、Bedrock経由のClaudeだけでなく、他プロバイダのモデルに切り替えて動かすことも想定されています。Pydantic AIの回で扱った型安全なエージェント構築と近い系譜のフレームワークですが、Strands AgentsはAWSのエコシステム(Bedrock Guardrails、MCP等)との連携により重点を置いています。
| 観点 | Bedrock Agents | Pydantic AI | Strands Agents |
|---|---|---|---|
| 実行環境 | AWSマネージド | 自前ホスティング | 自前ホスティング |
| ツール定義 | Action Group(OpenAPIスキーマ) | @agent.toolデコレータ | @toolデコレータ |
| 出力の型付け | スキーマ定義に依存 | pydanticモデルで厳密指定 | 柔軟(構造化出力も可) |
| MCP連携 | 限定的 | 個別実装が必要 | 標準サポート |
最小構成のエージェント
from strands import Agent, tool
@tool
def get_stock_level(product_code: str) -> dict:
"""指定した商品コードの在庫数を取得する"""
stock_data = {"A-1001": 42, "A-1002": 0}
return {"product_code": product_code, "stock": stock_data.get(product_code, -1)}
agent = Agent(
model="anthropic.claude-sonnet-4-5",
tools=[get_stock_level],
system_prompt="あなたは在庫管理を支援するアシスタントです",
)
response = agent("A-1001の在庫状況を教えてください")
print(response) (3) @toolデコレータの書き味はMCPサーバー自作の回で扱ったFastMCPの@mcp.tool()とよく似ており、型ヒントとdocstringからツールのスキーマが自動生成されます。エージェントは、ユーザーからの問いかけに応じて必要なツールを自律的に選択・実行し、その結果を踏まえて最終応答を組み立てます。
Strands Agentsのエージェントループは「モデルへの問い合わせ→ツール呼び出しが必要か判断→必要なら実行して結果を返す→再度モデルへ」というシンプルな反復構造です。LangGraphのような複雑なグラフ構造を明示的に組む必要がなく、素直なツール呼び出し中心のエージェントであれば少ないコード量で実現できます。
MCPサーバーのツールとしての取り込み
(4) Strands Agentsは、外部のMCPサーバーが提供するツールを、あたかも自前のツールであるかのようにエージェントへ取り込む機能を標準で持っています。MCPサーバー自作の回で構築したサーバーを、そのまま接続できます。
from strands.tools.mcp import MCPClient
from mcp.client.stdio import stdio_client, StdioServerParameters
mcp_client = MCPClient(
lambda: stdio_client(
StdioServerParameters(command="uv", args=["run", "--directory", "/path/to/inventory-server", "python", "server.py"])
)
)
with mcp_client:
tools = mcp_client.list_tools_sync()
agent = Agent(model="anthropic.claude-sonnet-4-5", tools=tools)
response = agent("在庫が少ない商品を教えて")(5) 自作ツールと外部MCPサーバー由来のツールを、同じエージェントの中に混在させて使えます。社内システム連携用のMCPサーバーを一度作れば、Strands AgentsだけでなくClaude Desktopなど他のMCPクライアントからも使い回せる、という前回の記事で扱った利点がそのまま活きてきます。
構造化出力
(6) 最終応答をpydanticモデルとして受け取りたい場合、Pydantic AIの回と同様に出力の型を指定できます。
from pydantic import BaseModel
class IncidentSummary(BaseModel):
severity: str
summary: str
agent = Agent(model="anthropic.claude-sonnet-4-5", tools=[get_stock_level])
result = agent.structured_output(IncidentSummary, "障害内容を要約してください: ...")
print(result.severity)構造化出力とツール呼び出しを同一エージェントで多用すると、モデルが「ツールを呼ぶべきか、構造化出力に整形すべきか」の判断で迷い、意図しない挙動になることがあります。役割ごとにエージェントインスタンスを分ける設計の方が、挙動の予測がしやすくなります。
マルチエージェント構成
(7) Strands Agentsは、1つのエージェントを別のエージェントの「ツール」として登録する、Agents as Toolsというパターンをサポートしています。専門特化した複数のエージェントを組み合わせる構成です。
@tool
def inventory_specialist(query: str) -> str:
"""在庫に関する専門的な質問に回答する"""
sub_agent = Agent(model="anthropic.claude-sonnet-4-5", tools=[get_stock_level])
return str(sub_agent(query))
orchestrator = Agent(
model="anthropic.claude-sonnet-4-5",
tools=[inventory_specialist],
system_prompt="必要に応じて専門エージェントに問い合わせて回答してください",
) (8) この構成は、Bedrock Agentsのマルチエージェントコラボレーション機能に近い発想ですが、コードとして直接オーケストレーションロジックを書けるため、条件分岐やリトライの制御が自由に組み込めます。
Bedrockへのデプロイ
(9) 開発したエージェントを本番運用する場合、Lambda関数としてパッケージ化し、Lambda Powertoolsの回で扱ったような構造化ログ・トレーシングを組み込みつつ、API Gateway経由で公開する構成が一般的です。ECS/Fargateで常駐プロセスとして動かす選択肢もあり、レイテンシ要件や実行時間の長さに応じて使い分けます。
自作MCPサーバーと組み合わせたエージェントを検証したところ、「在庫が少ない商品を教えて」という自然文の指示に対し、MCPサーバー側のツールが自動的に呼び出され、在庫データを踏まえた回答が生成されることを確認しました。自作ツールと変わらない体験でMCPツールを扱えています。
マルチエージェント構成では、サブエージェントの応答をそのまま上位エージェントが信頼して処理を進めるため、サブエージェント側の出力にも入力検証やGuardrails(Bedrock Guardrailsの回参照)を適用しておくことが重要です。信頼できない外部データを扱うツールでは特に注意してください。
まとめ
(10) Strands Agentsは、Bedrock Agentsのマネージドな手軽さとPydantic AIのようなコードベースの柔軟性の中間に位置し、特にMCPサーバーとの連携を前提にした設計が特徴です。Bedrock AgentsやMCPサーバー自作、Pydantic AIで扱ってきたエージェント構築の知見を組み合わせながら、用途に応じて使い分けていくのがおすすめです。
- Strands Agents公式ドキュメント - https://strandsagents.com/
- Strands Agents GitHubリポジトリ - https://github.com/strands-agents/sdk-python
- Model Context Protocol公式ドキュメント - https://modelcontextprotocol.io/
対応モデルプロバイダやAPIは活発に更新されているため、実装前に公式ドキュメントで最新のバージョン情報を確認してください。