13 人が閲覧(直近 30 日) AIエージェント・MCP

Strands Agentsとは?読み方・意味とPython SDKの使い方【1.62対応・2026年10月】

Strands Agentsとは?読み方・意味とPython SDKの使い方【1.62対応・2026年10月】

Strands Agents(ストランズ・エージェンツ)は、AWSが2025年5月16日に公開したオープンソースのAIエージェント開発SDKです。処理の流れを人が組み立てる代わりに、計画とツール選択をLLMに任せる「モデル駆動」の設計で、システムプロンプトとツールの一覧を渡せば数行で動くエージェントになります。ライセンスはApache-2.0、PythonとTypeScriptの2言語で提供されています。この記事では読み方と名前の由来を押さえたうえで、2026年10月21日公開のPython SDK 1.62.0を基準に、インストール、モデルの切り替え、MCP連携、構造化出力とセッション、マルチエージェントの選び方までをコード付きで説明します。コードはPython SDK 1.62.0で、LLMの応答を台本どおりに返す検証用モデルに差し替えてSDKの処理を確認しています。モデル切り替え例はオブジェクトの生成までの確認で、Bedrock・OpenAI・Ollamaへの実推論リクエストは検証範囲に含みません。

まとめ:Strands Agentsの要点

  • 正体:AWS製のオープンソースAIエージェントSDK。2025年5月16日公開、Apache-2.0。Python版は1.62.0(2026年10月21日)、TypeScript版は1.22.0が最新。
  • 読み方と由来:「ストランズ・エージェンツ」。DNAの2本の鎖(strand)のように、モデルとツールを結び付けるという命名。
  • 仕組み:LLMが考える、ツールを実行する、結果を見て再び考える、を終わるまで繰り返すエージェントループが中核。
  • 導入:pip install strands-agents(Python 3.10以上)。既定モデルはAmazon Bedrockのglobal.anthropic.claude-sonnet-4-6(us-west-2)。
  • モデル:Bedrock、Anthropic、OpenAI(ネイティブ対応)、Gemini、Ollama、LiteLLMなどへ、model=の1行で切り替えられる。
  • 注意点:別パッケージstrands-agents-toolsは2026年8月から段階的に非推奨化が進み、0.8.10では25本が非推奨。新規のコードはSDK本体の組込ツールか自作ツールで書く。
  • 選び方:手順をコードで固定したい業務はGraphやLangGraph、ツール呼び出し中心でモデルに判断を任せたい用途はStrands。

Strands Agentsの読み方と「strand」の意味

Strands Agentsの読み方と表記ゆれ

読み方は「ストランズ・エージェンツ」です。日本語の記事では「ストランズエージェント」「Strands Agent」と単数形で書かれることも多く、検索でもどちらの表記も使われています。公式の名称は複数形の「Strands Agents」で、製品群全体を指すときは単に「Strands」と呼ばれます。

英単語strandの意味とDNAに由来する名前

英単語のstrandには由来の異なる2つの語があります。Cambridge Dictionaryの語釈では、1つ目が「より合わせてひもやロープになる細い糸の1本」、2つ目が「岸・浜辺」で、後者の動詞形が「(交通手段やお金がなく)立ち往生させる」です。SDKの名前は1つ目の意味から来ています。

公開時のAWSのブログは「Like the two strands of DNA, Strands connects two core pieces of the agent together: the model and the tools.」と説明しています。DNAが2本の鎖で1つの構造になるように、モデルとツールを結び付けるという意味です。「Strandという単位で状態とアクションの連鎖を定義する」という解説を見かけることがありますが、公式の定義ではありません。コードで扱う中心はAgentクラスで、Strandという名前のクラスは存在しません。

モデル駆動のエージェントループで処理が進む仕組み

Strandsの中心はエージェントループ(Agent Loop)です。入力を受け取ると、SDKはシステムプロンプト、これまでの会話、使えるツールの説明をまとめてモデルに渡します。モデルが文章で答えればそこで終わり、ツールの呼び出しを返せばSDKがそのツールを実行し、結果を会話に足してもう一度モデルに渡します。これをモデルが文章の回答を返すまで繰り返します。

ツールを2回呼んでから回答する台本を検証用モデルに設定し、1.62.0で動かすと、モデルの呼び出しは3回、会話に積まれるメッセージは1件、3件、5件と増えていきました。分岐やループの制御をコードに書かず、どのツールをいつ使うかをモデルが決めるのがモデル駆動の意味です。裏を返すと、同じ入力でも手順が毎回同じになる保証はありません。処理順を必ず守らせたい業務には、後述のGraphで経路を固定するか、別のフレームワークを選ぶ判断が要ります。

ループの結果はAgentResultで返り、stop_reason(終了理由。通常はend_turn)、metrics.cycle_count(ループを回った回数)、ツールごとの呼び出し回数やトークン数を読めます。モデルが延々とツールを呼び続ける事態に備えて、1回の呼び出しごとに上限を付けられます。

from strands import Agent

agent = Agent()
result = agent(
    "この資料を要約して",
    limits={"turns": 5, "total_tokens": 10000},
)
if result.stop_reason == "limit_turns":
    print("ループの上限に達した")

台本どおりにツールを呼び続ける検証用モデルでturns=2を指定すると、モデルの呼び出しは2回で止まり、stop_reasonはlimit_turnsになりました。本番ではこの上限と終了理由をログに残すのが、費用と暴走を監視する出発点です。

Strands AgentsのPython導入と最小実装

Python 3.10以上の仮想環境とpip導入

PyPIのstrands-agentsはrequires_python >=3.10です。Python 3.9ではインストールできません。python3 --versionで使用するPythonが3.10以上であることを確認してから、仮想環境を作成します。

python3 -m venv .venv
source .venv/bin/activate
pip install 'strands-agents==1.62.0'

既定のモデルはAmazon Bedrockです。1.62.0のソースでは既定のモデルIDがglobal.anthropic.claude-sonnet-4-6、リージョン未指定時の既定がus-west-2になっています。動かす前に、AWSの認証情報とモデル呼び出し権限を設定します。商用リージョンではモデルアクセスは自動で有効になりますが、Anthropicモデルの初回利用には用途情報の提出が必要です。初回のサブスクリプションに必要なAWS Marketplace権限も確認してください。

@toolによる最小エージェントの実装

Python関数に@toolを付けるとツールになります。以下の天気ツールは接続方法を示すダミーで、都市にかかわらず「晴れ」を返します。実際の天気を取得する場合は、関数内を天気APIの呼び出しに置き換えます。型ヒントが入力の定義に、ドキュメント文字列がツールの説明としてモデルに渡るので、説明は具体的に書きます。

from strands import Agent, tool

@tool
def get_weather(city: str) -> str:
    """指定した都市の天気を返す。"""
    return f"{city}の天気は晴れです"

agent = Agent(
    system_prompt="あなたは天気を答えるアシスタントです。",
    tools=[get_weather],
)

result = agent("東京の天気は?")
print(result.stop_reason)          # end_turn
print(result.metrics.cycle_count)  # ループを回った回数

agent(...)は関数のように呼べます。既定では回答がストリーミングで標準出力に流れます。画面に出したくないときはAgent(callback_handler=None)にします。

strands-agents-toolsの非推奨と組込ツールへの移行

2025年の入門記事の多くはpip install strands-agents strands-agents-toolsで始まり、from strands_tools import calculatorを使っています。このツール集は2026年8月7日の0.8.6から非推奨化が進み、最新の0.8.10では、手元で数えるとcalculator、shell、http_request、python_repl、mcp_clientなど25本が非推奨の警告を出します。calculatorを実行すると「v0.9.0でエラーログになる」という警告が出ます。

代わりに使うのは、SDK本体に入った組込ツール(from strands.vended_tools import shell, http_request)です。2026年10月時点でshell、file_editor、http_request、web_fetch、python_repl、a2a_client、handoff_to_user、swarmなどがあります。古い記事のコードを写して動かす場合は、まずここを置き換えます。なおshellは任意のコマンドを実行できるため、計算だけを許していたcalculatorより権限が広くなります。計算だけさせたいなら、上の例のように自作の@toolで必要な処理だけを渡すほうが安全です。

Bedrock・OpenAI・Ollamaのモデル切り替え

モデルはAgent(model=...)に渡すプロバイダーで切り替えます。Bedrock以外は追加パッケージ(extras)が必要です。1.62.0のextrasと主な用途は次のとおりです。

プロバイダー 導入 主な用途
Amazon Bedrock 追加不要(既定) Claude・Llama・NovaなどをAWS上で
Anthropic [anthropic] Claude APIを直接
OpenAI [openai] Chat Completions・Responses API
Gemini [gemini] Gemini APIを直接
Ollama [ollama] ローカルモデルで検証
LiteLLM [litellm] 多数のプロバイダーを横断
その他 [mistral] [writer] [sagemaker] [llamaapi] 各社API・SageMakerエンドポイント
from strands import Agent
from strands.models import BedrockModel
from strands.models.openai import OpenAIModel   # pip install 'strands-agents[openai]'
from strands.models.ollama import OllamaModel   # pip install 'strands-agents[ollama]'

bedrock = BedrockModel(model_id="global.anthropic.claude-sonnet-4-6", region_name="us-west-2")
openai_model = OpenAIModel(client_args={"api_key": "sk-..."}, model_id="gpt-5.6")
ollama = OllamaModel(host="http://localhost:11434", model_id="qwen3:8b")

agent = Agent(model=ollama)  # 差し替えるのはこの1行だけ

「StrandsでOpenAIは使えるか」という質問は多いですが、LiteLLMを挟まなくてもOpenAIModelで直接使えます。ツール定義やプロンプトはプロバイダーを替えてもそのまま使えるので、検証はOllama、本番はBedrockという使い分けもできます。複数のLLMを1つのAPIにまとめるプロキシを社内に置くなら、LiteLLMとは?複数LLMを1つのAPIで呼ぶProxyの構築手順とフォールバック・予算設定で構成を説明しています。

MCPサーバーのツール接続と読み込み

MCP(Model Context Protocol)のサーバーは、MCPClientをtoolsに渡すだけで使えます。接続、ツール一覧の取得、終了時の切断はAgentが管理します(公式のMCPツールの説明)。

import sys
from mcp import StdioServerParameters, stdio_client
from strands import Agent
from strands.tools.mcp import MCPClient

client = MCPClient(lambda: stdio_client(
    StdioServerParameters(command=sys.executable, args=["mcp_server.py"])
))

agent = Agent(tools=[client])  # 接続・ツール一覧の取得・切断はAgentが管理する
agent("2と3を足して")

次のコードを、クライアントを実行するディレクトリにmcp_server.pyとして保存します。接続先のMCPサーバーを自作するときは、使用するMCP SDKの版に注意してください。2026年10月時点でStrands 1.62.0と一緒に入るmcpパッケージは2.1.1で、2.xではFastMCPがMCPServerに改称されています。from mcp.server.fastmcp import FastMCPと書いた古いサーバーは、起動時にModuleNotFoundErrorで止まります。

from mcp.server.mcpserver import MCPServer  # mcp 2.x。1.x では from mcp.server.fastmcp import FastMCP

mcp = MCPServer("demo")

@mcp.tool()
def add(a: int, b: int) -> int:
    """2つの整数を足す"""
    return a + b

if __name__ == "__main__":
    mcp.run()

移行の判断はMCP Python SDK v2 移行:FastMCPからMCPServerへの書き換え手順と据え置き判断にまとめています。もう1つ、検証用のファイルをmcp.pyという名前で置くと、同じフォルダで起動したサーバーが本物のmcpパッケージの代わりにそのファイルを読み込み、接続に失敗します。ファイル名はパッケージ名と重ねないでください。

本番運用に向けた構造化出力・会話履歴・フックの設定

Pydanticモデルによる構造化出力の受け取り

回答をプログラムで扱うなら、文字列を解析せず構造化出力を使います。structured_output_modelにPydanticのクラスを渡すと、SDKがそのクラスをツールとしてモデルに見せ、検証済みのインスタンスをresult.structured_outputに入れて返します。

from pydantic import BaseModel
from strands import Agent

class Weather(BaseModel):
    city: str
    condition: str

agent = Agent(structured_output_model=Weather)
result = agent("次の架空の天気情報を構造化して:都市は東京、天気は晴れ")
print(result.structured_output.city)  # Weatherのインスタンスとして受け取れる

会話履歴の上限とセッションの永続化

会話が長くなるとモデルに渡すメッセージが増え続けます。SlidingWindowConversationManagerは直近の一定件数だけを残し、SummarizingConversationManagerは古い部分を要約して残します。プロセスを再起動しても会話を続けたい場合は、セッションマネージャーで保存先を指定します。

from strands import Agent
from strands.agent.conversation_manager import SlidingWindowConversationManager
from strands.session import SnapshotSessionManager
from strands.storage import LocalFileStorage

agent = Agent(
    conversation_manager=SlidingWindowConversationManager(window_size=20),
    session_manager=SnapshotSessionManager(
        session_id="user-1",
        storage=LocalFileStorage("./sessions/"),
    ),
)
agent("こんにちは")
# 同じsession_idでAgentを作り直すと、保存済みの会話が読み込まれる

1.62.0で試すと、同じsession_idで作り直したエージェントは前回の2件のメッセージを読み込んだ状態で始まりました。新しく書く単体エージェントでは、公式ガイドが推奨するSnapshotSessionManagerに保存先(LocalFileStorageなど)を渡します。以前からあるFileSessionManagerとS3SessionManagerも引き続き使え、SwarmやGraphのセッションはこちらで保存します。

フックによるツール呼び出しの記録・制止

フックを使うと、ループの各段階に処理を差し込めます。たとえばBeforeToolCallEventでcancel_toolに理由を入れると、そのツールは実行されず、理由がエラーの結果としてモデルに返ります。

from strands import Agent, tool
from strands.hooks import BeforeToolCallEvent

@tool
def delete_file(path: str) -> str:
    """ファイルを削除する"""
    ...

BLOCKED = {"delete_file"}

def guard(event: BeforeToolCallEvent):
    if event.tool_use["name"] in BLOCKED:
        event.cancel_tool = "このツールは承認なしでは実行できません"

agent = Agent(tools=[delete_file])
agent.hooks.add_callback(BeforeToolCallEvent, guard)

モデル駆動のエージェントにファイル削除や送金のような戻せない操作を持たせるなら、プロンプトで「使うな」と頼むのではなく、このようにコードで止めます。人の承認を挟みたい場合は、組込のhandoff_to_userツールや、承認フローを提供する介入(interventions)の仕組みも用意されています。

マルチエージェントの5パターンと選定基準

複数のエージェントを組み合わせるパターンは、「次にどのエージェントが動くかを誰が決めるか」で選びます。

パターン 次を決めるのは 向く用途
Agents as Tools 親エージェント(モデル) 翻訳・要約など専門役への委譲
Swarm 各エージェント(モデル) 担当を引き継ぎながら進む問い合わせ対応
Graph 開発者のコード レビューと修正の反復など経路が決まった処理
Workflow 開発者が定義したDAG 依存関係のあるタスクの並列実行
A2A プロトコル越しの相手 別サービス・別実装のエージェント連携

Agents as Toolsは、子エージェントを呼ぶ関数を@toolにするだけで作れます。SwarmとGraphはSDKのstrands.multiagentにあるクラスで、Workflowはstrands-agents-toolsのworkflowツールとして提供されています。

from strands import Agent
from strands.multiagent import Swarm, GraphBuilder

# Swarm:次に誰へ渡すかをモデルが handoff_to_agent ツールで決める
researcher = Agent(name="researcher", system_prompt="調査担当")
writer = Agent(name="writer", system_prompt="執筆担当")
swarm = Swarm([researcher, writer])  # 既定 max_handoffs=20・execution_timeout=900秒

# Graph:経路をコードで固定する
draft = Agent(name="draft", system_prompt="下書きを書く")
review = Agent(name="review", system_prompt="下書きをレビューする")
b = GraphBuilder()
b.add_node(draft, "draft")
b.add_node(review, "review")
b.add_edge("draft", "review")
b.set_entry_point("draft")
b.set_max_node_executions(10)  # 指定しないと上限なしの警告が出る
graph = b.build()
result = graph("Strands Agentsの紹介文を書く")

上限の設定は省かないでください。Swarmの既定値はmax_handoffs=20、max_iterations=20、全体で900秒、1エージェント300秒です。Graphはset_max_node_executionsやset_execution_timeoutを指定しないと、1.62.0では「上限なしで実行される」という警告が出ます。経路にループを含むGraphでは、実行回数や時間の上限で処理量を制限できます。ただし、各ノード内のモデル呼び出し回数、トークン数、ツール利用料によって費用は変わるため、これだけで金額の上限は保証できません。サービスをまたいでエージェント同士をつなぐA2Aの仕様はA2A(Agent2Agent)プロトコルとは?v1.0の仕組み・MCPとの違い・実装手順で解説しています。

LangGraph・LangChain・Mastraとの違いと選び方

違いの軸は、制御の流れを人が書くか、モデルに任せるかです。

フレームワーク 言語 流れの決め方
Strands Agents Python・TypeScript モデルがループで決める
LangGraph Python・JS 状態グラフをコードで定義
LangChain Python・JS 部品をつないだチェーンとエージェント
Mastra TypeScript TS向けのエージェントとワークフロー

分岐、人の承認、失敗時の巻き戻しを1ステップずつ制御したいなら、LangGraphでAIエージェントを実装する手順のように状態グラフで書くほうが挙動を説明しやすくなります。Bedrockを使い、ツール呼び出しが中心の調査・対話型エージェントを作るなら、既定のBedrockプロバイダーと@toolで構成できるStrandsを選びます。公式ドキュメントにもLangGraphからの移行ガイドがあり、StateGraphをStrandsのGraphへ、チェックポインターをセッションマネージャーへ置き換える対応が示されています。

TypeScriptで書くなら、StrandsのStrands Agents TypeScript SDKの使い方のほか、MastraやLangChain.jsも候補です。主要8種を同じ条件で並べた比較はAIエージェントフレームワークとは?主要8種の比較・動作コード・選定基準にあります。

本番デプロイの選択肢と採用を見送る場面

Strandsは公開時点で、Amazon Q Developer、AWS Glue、VPC Reachability AnalyzerなどAWS社内のチームが本番で使っていると公表されていました。pypistatsでは、2026年10月30日時点で直近1か月のダウンロードが約3,711万回です。GitHubのリポジトリは2026年にstrands-agents/harness-sdkへ集約され、Python版とTypeScript版、完成品のエージェント「Strands harness」が同じリポジトリで開発されています。harnessの導入はStrands Harnessとは?pip導入から本番構成までPythonの実装手順を解説を参照してください。

Strandsのエージェントは自分のプロセス内で動くため、置き場所は自分で選びます。公式の本番運用ガイドはAmazon Bedrock AgentCore Runtime、AWS Lambda、Fargate、App Runner、EKS、EC2への手順を載せています。セッションの分離とスケールをマネージドに任せたいならAgentCore Runtime、短い単発の処理ならLambdaが候補です。AgentCoreの構成はAgentCore Gatewayと AgentCore APIの使い方とBedrock AgentCoreハーネスGAとは?仕組み・料金・導入判断を解説で扱っています。トレースとメトリクスはOpenTelemetryで出せる(extrasは[otel])ので、前述のAgentResultの値とあわせて監視に載せます。

採用を見送るべき場面もはっきりしています。1回のLLM呼び出しで済み、ツール連携やセッション管理も不要な要約・分類では、APIの直接呼び出しで十分です。Strandsでもモデルが最初の応答で終了すれば呼び出しは1回なので、SDKの導入だけで推論回数や費用が必ず増えるわけではありませんが、依存パッケージと版の追従が増える分、BedrockやOpenAIのAPIを直接呼ぶほうが保守は軽くなります。承認順や処理順を監査で説明する必要がある基幹業務は、モデル駆動のループを中心に据えず、Graphで経路を固定するか、LangGraphのような状態グラフで書きます。Strandsはリリースが週1回前後と速く、1.36.0(2026年4月)でのa2a_client_factoryの非推奨や、tools パッケージの非推奨化のように変更も続いているため、本番ではstrands-agents==1.62.0のように版を固定し、更新前にリリースノートを確認します。AWS上のエージェント開発を設計から相談したい場合は、一創のAIエージェント開発でも支援しています。

よくある質問

Strands Agentsの読み方は?

「ストランズ・エージェンツ」です。日本語では「ストランズエージェント」とも書かれます。名前はDNAの鎖(strand)に由来し、モデルとツールを結び付けるという意味です。

Strands Agentsは無料で使えますか?

SDKはApache-2.0のオープンソースで無料です。モデルの利用料(BedrockやOpenAIのAPI料金)は別にかかります。Ollamaでローカルモデルを使えば、API料金なしで試せます。

strands-agents-toolsは今もインストールが必要ですか?

新しく書くコードでは必須ではありません。0.8.10ではcalculatorやshellなど25本が非推奨で、移行先はSDK本体の組込ツール、メモリなどのSDK機能、各サービスの公式MCPサーバーなどに分かれます。置き換え後に権限や動作が変わるツールもあります。Workflowツールなど、まだtools側にしか無いものを使う場合だけ入れます。

TypeScriptでも使えますか?

使えます。npmの@strands-agents/sdkが2026年4月30日に1.0になり、2026年10月時点の最新は1.22.0です。導入手順はTypeScript SDKの解説記事にまとめています。

LangGraphとどちらを選ぶべきですか?

手順をコードで厳密に決めたいならLangGraph、ツール呼び出し中心で判断をモデルに任せたいならStrandsです。Strands側にもGraphがあるため、全体はモデル駆動にして一部だけ経路を固定する組み方もできます。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.11.09 テックブログ エディオン不正アクセス第2報:カード番号の対象確認とログ・決済画面の改ざん対策
  2. 2026.11.10 テックブログ ニトリの情報漏洩:最大3,762万件の対象確認となりすまし連絡の見分け方
  3. 2026.11.10 テックブログ Claude Fable 5.2とは:料金・破壊的変更4点とFable 5.1からの移行手順【2026年11月】
  4. 2025.04.30 テックブログ IMSIキャッチャー(偽基地局)とは?2Gフォールバックの手口と日本での対策
  5. 2026.11.09 テックブログ LANSCOPE不正アクセス第2報:製品への影響と偽連絡の確認、停止中のライセンス認証の窓口

RELATED POSTS 関連記事

目次