AgentCoreゲートウェイには、オプションで「ツールを検索するツール」を追加することができます。
一見さんお断りな雰囲気を醸し出す機能ですが、
AgentCoreゲートウェイは複数のターゲット(MCPサーバーやLambdaなど)を束ねることができる
→束ねまくるとツールが山盛りになる
→山盛りのツール定義をLLMに渡すとコンテキストを占拠しちゃう
→山盛りのツールから必要なツールだけを検索できるようにしよう
という機能です。
この機能を、Strands Agentsと組み合わせてやってみました。
AgentCoreゲートウェイの作成
マネジメントコンソールから作成します。
まずはTavilyのAPIキーをアイデンティティにセットしてください。(キャプチャ忘れました、すいません。)
そのうえで、「ゲートウェイ」メニューから、「ゲートウェイを作成」をクリックします。
「ツール検索ツール」はデフォルトでは無効化されています。有効化するには「追加設定」を開き、「Enable semantic search」にチェックを入れます。
次画面で認証方式を選びます。今回は「IAM」を選びました。
ターゲットタイプは「統合」を選び、プロバイダーを閲覧ボタンからTavilyを選びます。事前に作成したアイデンティティのAPIキーを選びます。
ウィザードを進めてAgentCoreゲートウェイを作成します。ゲートウェイIDをコピーしておきましょう。
Strands Agentsを作成
それではStrands Agentsを作ります。
プロジェクトを作成し、ライブラリーを導入します。
uv init app --python 3.13
cd app
uv add strands-agents mcp-proxy-for-aws python-dotenv
環境依存の設定を.envに記載します。今回必要なのは機密情報ではないので堂々と.envを使います。
.envに機密情報を書いてはいけません。
.envをコーディングエージェントに渡さない方法を考えるのではありません。.envに機密情報を書かない方法を考えるのです。
話がそれました。必要な環境変数はこれらです。
AWS_PROFILE=default
AWS_REGION=ap-northeast-1
MODEL_ID=jp.anthropic.claude-haiku-4-5-20251001-v1:0
GATEWAY_ID=gateway-quick-start-a17bf8-gfukq098dw
必要なライブラリーをインポートしつつ、環境変数を読み取ります。
AgentCoreゲートウェイの認証にIAMを使うので、そこをいい感じにしてくれる「MCP Proxy for AWS」を使ったMCPクライアントを生成します。
「ツール検索ツール」を作成します。「context=True」をセットすると、tool_contextパラメーターとしてエージェントのコンテキストが取得できます。
クエリーを使って、AgentCoreゲートウェイのツール検索ツール(x_amz_bedrock_agentcore_search)を呼び出します。
search_result["structuredContent"]の中身はこんな感じです。 複数見つかることもあります。
{
"tools": [
{
"inputSchema": {
...
},
"name": "target-quick-start-d7b17d___TavilySearchExtract",
"description": "ExtractwebpagecontentfromURLsusingTavilyExtract"
},
{
"inputSchema": {
...
},
"name": "target-quick-start-d7b17d___TavilySearchPost",
"description": "ExecuteasearchqueryusingTavilySearch"
}
]
}
見つかったツール名から、ツールの情報を取得します。
そしてこのツールをエージェントのツールとして追加します。(ここの処理が必要なのでcontext=Trueにしたのです)
最後にツール実行結果を返却します。
これで「ツール検索ツール」ができました。あとはこのツールを付与したAgentを作って実行します。
ModelCallToolLogger()フックは、モデル呼び出し時点のツール情報を出力するフックとして、以下を追加してます。
class ModelCallToolLogger:
def register_hooks(self, registry: HookRegistry) -> None:
registry.add_callback(BeforeModelCallEvent, self.log_tools)
def log_tools(self, event: BeforeModelCallEvent) -> None:
tool_names = event.agent.tool_names
print(f"tools: count={len(tool_names)} names={tool_names}")
tools: count=1 names=['tool_search']
tools: count=3 names=['tool_search', 'target-quick-start-68c876___TavilySearchExtract', 'target-quick-start-68c876___TavilySearchPost']
tools: count=3 names=['tool_search', 'target-quick-start-68c876___TavilySearchExtract', 'target-quick-start-68c876___TavilySearchPost']
Bedrock AgentCore の最新情報をまとめました:
<略>
2回目のモデル呼び出し(多分ToolResultを送ってる)から、ツールが3つに増えてますね!





