1. はじめに
Amazon Bedrock AgentCore GatewayのWeb Search Toolを、ローカルPC上のPythonから呼び出してみました。
今回はLLMやAgentCore Runtimeとは連携せず、次の処理だけを確認します。
-
tools/listでWeb Search Toolを取得する -
tools/callで検索を実行する - 検索結果のタイトル、URL、公開日、概要を表示する
日本語での検索については注意が必要そうなので、
記事後半で検索に日本語というワードを入れた結果と入れなかった結果を比較として記載しています。
2. MCPについて
MCP Server/MCP Clientについて念のため、記載しておきます。
知ってるよという方は「4. 検証構成」まで飛ばしていただいて問題ありません。
MCPは、AIアプリケーションと外部ツールを接続するためのプロトコルです。
主な構成要素は次の3つです。
| 要素 | 役割 |
|---|---|
| MCP Host | ユーザーが操作するアプリケーション |
| MCP Client | MCP Serverとの通信を担当 |
| MCP Server | ToolやResourceを公開 |
一般的な構成は次のようになります。
ユーザー
↓
MCP Host
↓
MCP Client
↓
MCP Server
↓
Tool
今回、CursorのMCP機能は直接使用していません。
Cursor
└─ Pythonスクリプト
└─ AgentCore Gateway
└─ Web Search Tool
そのため、今回のPythonスクリプトが簡易的なMCP Client相当の役割を持っています。
CursorへMCP Serverを直接登録した場合は、CursorがMCP Hostになり、その内部のMCP ClientがServerへ接続する構成になります。
3. 前提条件
今回の検証では、以下を事前に準備しています。
AWS環境
- AWSアカウントを利用できること
-
us-east-1リージョンを利用できること - AgentCore Gatewayを作成・管理できるIAM権限があること
- Gateway実行時に
bedrock-agentcore:InvokeGatewayを使用できること - Gateway用のIAMサービスロールを作成、または自動作成できること
今回はIAM Identity CenterのPermission Setを使用しました。
ローカル環境
- Python 3.9以上
- AWS CLI v2
- IAM Identity Center用のAWS CLIプロファイル
- Cursor
Cursorは必須ではなく、VS Codeや通常のPowerShellでも実行できます。
IAM Identity Centerの設定
今回使用したプロファイルは、Cursor側で事前設定済みです。
aws configure sso
4. 検証構成
Windows PC
└─ Cursor
└─ Python
│ IAM認証 / SigV4
│ MCP tools/list・tools/call
▼
Amazon Bedrock AgentCore Gateway
└─ Web Search Tool
検証環境は以下です。
| 項目 | 内容 |
|---|---|
| OS | Windows |
| エディタ | Cursor |
| 言語 | Python |
| AWS認証 | IAM Identity Center |
| リージョン | us-east-1 |
| Gateway認証 | IAM |
| MCPバージョン | 2025-03-26 |
5. AgentCore Gatewayの作成
Amazon Bedrock AgentCore > ゲートウェイ からゲートウェイを作成します
主な設定は以下です。
特に記載していないところはデフォルト・無効にしています。
Step 1.Define gateway details
| 項目 | 設定 |
|---|---|
| Gateway name | 任意の名前 |
| Semantic search | 有効 |
| Exception level debugging | 有効(PoC中のみ。確認後は無効化) |
| Supported versions | 2025-03-26 |
| IAMサービスロール | 新規作成 |
| WAF | Do not enable security protections(個人PoCのため。) |
Semantic searchは無効でも問題ありません。処理結果には大きく影響しないです。
Exception level debuggingは検証時のトラブルシューティング目的で有効にしています。
詳細なエラー情報がレスポンスへ含まれるため、本番利用や第三者へ公開する環境では無効化してください。
今回は動作確認を目的としたPoC構成です。
本番環境では、各組織のセキュリティ要件に従ってWAF、監査ログ、IAM権限などを別途設計してください。
Step 2.Configure Inbound Identity
| 項目 | 設定 |
|---|---|
| Inbound Identity details | IAM 許可を使用 |
Step 3.Add targets
| 項目 | 設定 |
|---|---|
| Select a target protocol | MCP target |
| ターゲットタイプ | Connectors |
| Pre-configured targets | Web Search tool |
Step 4.Review and create
確認画面なのでそのままゲートウェイを作成で大丈夫です
作成後、以下がREADYになることを確認します。
Gateway status:READY
Target status:READY
6. ローカル環境の準備
今回は、Windows上のCursorからPythonスクリプトを実行します。
Cursor自体のMCP機能は使用せず、PythonスクリプトからAgentCore GatewayのMCPエンドポイントへ直接リクエストを送信します。
6.1 作業フォルダを作成する
今回は以下のフォルダを使用しました。
C:\workspace\agentcore-web-search-poc
Cursorでフォルダを開きます。
File
→ Open Folder
→ C:\workspace\agentcore-web-search-poc
その後、Cursor上でPowerShellターミナルを開きます。
Terminal
→ New Terminal
6.2 Python仮想環境を作成する
プロジェクト専用の仮想環境を作成します。
py -m venv .venv
仮想環境を有効化します。
.\.venv\Scripts\Activate.ps1
PowerShellの実行ポリシーでエラーになる場合は、現在のターミナルだけ一時的に許可します。
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv\Scripts\Activate.ps1
有効化されると、プロンプトの先頭に(.venv)が表示されます。
(.venv) PS C:\workspace\agentcore-web-search-poc>
6.3 必要なライブラリをインストールする
python -m pip install boto3 requests
今回使用するライブラリの役割は以下です。
| ライブラリ | 用途 |
|---|---|
boto3 |
AWS SSOプロファイルから認証情報を取得 |
botocore |
AgentCore GatewayへのリクエストをSigV4署名 |
requests |
GatewayのMCPエンドポイントへHTTPリクエストを送信 |
botocoreはboto3の依存ライブラリとしてインストールされます。
6.4 AWS SSOへログインする
今回は、事前に作成済みのAWS CLIプロファイルを使用しました。
プロファイルをまだ作成していない場合は、先に以下を実行します。
aws configure sso
ログインします。
aws sso login --profile <AWS_PROFILE>
認証状態を確認します。
aws sts get-caller-identity --profile <AWS_PROFILE>
アカウントIDとロールARNが返れば、SSO認証は完了です。
6.5 環境変数を設定する
CursorのPowerShellターミナルで以下を設定します。
$env:AWS_PROFILE="<AWS_PROFILE>"
$env:AWS_REGION="us-east-1"
$env:AGENTCORE_GATEWAY_URL="https://<GATEWAY_ID>.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp"
AGENTCORE_GATEWAY_URLには、AgentCore Gatewayの詳細画面に表示される、末尾が/mcpのURLを指定します。
環境変数を確認します。
$env:AWS_PROFILE
$env:AWS_REGION
$env:AGENTCORE_GATEWAY_URL
これらの環境変数は、現在のPowerShellターミナルを閉じると消えます。
6.6 .gitignoreを作成する
プロジェクト直下に.gitignoreを作成します。
.venv/
__pycache__/
*.pyc
.env
.env.*
最終的なフォルダ構成は以下です。
agentcore-web-search-poc
├─ .gitignore
├─ .venv
└─ test_web_search.py
7. PythonからWeb Searchを実行する
7.1 処理の流れ
今回のPythonスクリプトでは、以下の処理を行います。
AWS SSOプロファイルから認証情報を取得
↓
AgentCore Gateway向けのHTTPリクエストをSigV4署名
↓
tools/listで利用可能なツールを取得
↓
WebSearchツールの名前を特定
↓
tools/callでWeb検索を実行
↓
検索結果をタイトル・URL・公開日・概要に整形
AgentCore Gatewayが公開するツール名は、ターゲット名などによって変わる可能性があります。
そのため、Web Search Toolの名前をコードへ固定せず、最初にtools/listを実行して取得しています。
7.2 Pythonコード
test_web_search.pyを作成し、以下を記載します。
コードを表示
import json
import os
import sys
from typing import Any
import boto3
import requests
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
REGION = os.getenv("AWS_REGION", "us-east-1")
AWS_PROFILE = os.getenv("AWS_PROFILE")
GATEWAY_URL = os.getenv("AGENTCORE_GATEWAY_URL")
# Gateway作成時に指定したMCPバージョン
MCP_PROTOCOL_VERSION = "2025-03-26"
# AgentCore GatewayのSigV4サービス名
SIGV4_SERVICE = "bedrock-agentcore"
def parse_mcp_response(
response: requests.Response,
) -> dict[str, Any]:
"""JSONまたはSSE形式のMCPレスポンスを解析する。"""
content_type = response.headers.get("content-type", "")
if "text/event-stream" not in content_type:
return response.json()
events: list[dict[str, Any]] = []
for line in response.text.splitlines():
if not line.startswith("data:"):
continue
value = line.removeprefix("data:").strip()
if not value or value == "[DONE]":
continue
events.append(json.loads(value))
if not events:
raise RuntimeError(
"SSEレスポンス内にJSONデータがありません。\n"
f"Response:\n{response.text}"
)
return events[-1]
def invoke_gateway(
payload: dict[str, Any],
) -> dict[str, Any]:
"""IAM認証でAgentCore Gatewayを呼び出す。"""
if not GATEWAY_URL:
raise RuntimeError(
"環境変数AGENTCORE_GATEWAY_URLが設定されていません。"
)
session = boto3.Session(
profile_name=AWS_PROFILE or None,
region_name=REGION,
)
credentials = session.get_credentials()
if credentials is None:
raise RuntimeError(
"AWS認証情報を取得できません。"
"aws sts get-caller-identityを確認してください。"
)
body = json.dumps(
payload,
ensure_ascii=False,
separators=(",", ":"),
).encode("utf-8")
headers = {
"Accept": "application/json, text/event-stream",
"Content-Type": "application/json",
"MCP-Protocol-Version": MCP_PROTOCOL_VERSION,
}
aws_request = AWSRequest(
method="POST",
url=GATEWAY_URL,
data=body,
headers=headers,
)
SigV4Auth(
credentials.get_frozen_credentials(),
SIGV4_SERVICE,
REGION,
).add_auth(aws_request)
response = requests.post(
GATEWAY_URL,
data=body,
headers=dict(aws_request.headers.items()),
timeout=90,
)
print(f"HTTP status: {response.status_code}")
if not response.ok:
print("Response:")
print(response.text)
response.raise_for_status()
return parse_mcp_response(response)
def list_tools() -> list[dict[str, Any]]:
"""Gatewayが公開しているMCPツールを取得する。"""
response = invoke_gateway(
{
"jsonrpc": "2.0",
"id": "list-tools-request",
"method": "tools/list",
"params": {},
}
)
print("\n=== tools/list response ===")
print(json.dumps(response, ensure_ascii=False, indent=2))
tools = response.get("result", {}).get("tools", [])
if not tools:
raise RuntimeError(
"ツールを取得できませんでした。"
"GatewayとTargetのステータスを確認してください。"
)
return tools
def call_web_search(
tool_name: str,
query: str,
max_results: int = 3,
) -> dict[str, Any]:
"""Web Search Toolを実行する。"""
return invoke_gateway(
{
"jsonrpc": "2.0",
"id": "web-search-request",
"method": "tools/call",
"params": {
"name": tool_name,
"arguments": {
"query": query,
"maxResults": max_results,
},
},
}
)
def print_search_results(
response: dict[str, Any],
) -> None:
"""検索結果を読みやすい形式で表示する。"""
content = response.get("result", {}).get("content", [])
if not content:
raise RuntimeError("検索結果がありません。")
raw_text = content[0].get("text", "")
try:
search_data = json.loads(raw_text)
except json.JSONDecodeError:
print("\n=== Search Result ===")
print(raw_text)
return
search_results = search_data.get("results", [])
if not search_results:
print(
json.dumps(
search_data,
ensure_ascii=False,
indent=2,
)
)
return
print("\n=== Search Results ===")
for index, item in enumerate(search_results, start=1):
title = item.get("title", "(タイトルなし)")
url = item.get("url", "(URLなし)")
published_date = item.get("publishedDate")
summary = item.get("text", "")
print(f"\n[{index}] {title}")
print(f"URL: {url}")
if published_date:
print(f"公開日: {published_date}")
if summary:
shortened_summary = summary[:300]
suffix = "..." if len(summary) > 300 else ""
print(f"概要: {shortened_summary}{suffix}")
def main() -> None:
print("=== Configuration ===")
print(f"Region : {REGION}")
print(f"AWS profile : {AWS_PROFILE or '(default)'}")
print(f"Gateway URL : {GATEWAY_URL}")
print()
tools = list_tools()
print("\n=== Available tools ===")
for tool in tools:
print(f"- {tool.get('name')}")
# ターゲット名とWebSearchが組み合わされたツールを優先する
web_search_tool = next(
(
tool
for tool in tools
if tool.get("name", "").endswith("___WebSearch")
),
None,
)
# 環境によって名前が異なる場合のフォールバック
if web_search_tool is None:
web_search_tool = next(
(
tool
for tool in tools
if "websearch" in tool.get("name", "").lower()
),
None,
)
if web_search_tool is None:
raise RuntimeError(
"tools/listの結果から"
"Web Search Toolを特定できませんでした。"
)
tool_name = web_search_tool["name"]
print(f"\nWeb Search tool: {tool_name}")
print("\n=== Web Search execution ===")
result = call_web_search(
tool_name=tool_name,
query="Amazon Bedrock AgentCoreの情報",
max_results=3,
)
print_search_results(result)
if __name__ == "__main__":
try:
main()
except Exception as exc:
print(f"\nERROR: {exc}", file=sys.stderr)
sys.exit(1)
6.3 コードのポイント
AWS認証情報をソースコードへ書かない
AWSのアクセスキーやセッショントークンはコードに記載していません。
session = boto3.Session(
profile_name=AWS_PROFILE or None,
region_name=REGION,
)
AWS CLIのSSOプロファイルから、一時的な認証情報を取得しています。
リクエストをSigV4署名する
AgentCore GatewayのInbound AuthにはIAMを設定したため、HTTPリクエストをAWS Signature Version 4で署名します。
SigV4Auth(
credentials.get_frozen_credentials(),
"bedrock-agentcore",
REGION,
).add_auth(aws_request)
最初にtools/listを実行する
{
"method": "tools/list"
}
Gatewayが公開しているツール名や入力スキーマを取得します。
今回の環境では、複数のツールが表示されました。
x_amz_bedrock_agentcore_search
web-search-tool___WebSearch
今回呼び出すのは、作成したターゲット名とWebSearchが組み合わされた以下のツールです。
web-search-tool___WebSearch
tools/callで検索を実行する
{
"method": "tools/call",
"params": {
"name": "web-search-tool___WebSearch",
"arguments": {
"query": "Amazon Bedrock AgentCoreの情報",
"maxResults": 3
}
}
}
queryに検索キーワード、maxResultsに取得する検索結果数を指定します。
8. 実行結果
8.1 スクリプトを実行する
CursorのPowerShellから実行します。
python .\test_web_search.py
8.2 出力例
検索結果は以下のように表示されました。
出力結果を表示
=== Configuration ===
Region : us-east-1
AWS profile : <AWS_PROFILE>
Gateway URL : https://<GATEWAY_ID>.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp
HTTP status: 200
=== tools/list response ===
{
"jsonrpc": "2.0",
"id": "list-tools-request",
"result": {
"tools": [
...
]
}
}
=== Available tools ===
- x_amz_bedrock_agentcore_search
- web-search-tool___WebSearch
Web Search tool: web-search-tool___WebSearch
=== Web Search execution ===
HTTP status: 200
=== Search Results ===
[1] Amazon Bedrock AgentCore
URL: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html
公開日: unknown
概要: Overview What is Amazon Bedrock AgentCore? Amazon Bedrock AgentCore is an agentic platform for building, deploying, and operating highly effective agents securely at scale using any framework and foundation model...
[2] Amazon Bedrock AgentCore - AWS
URL: https://aws.amazon.com/bedrock/agentcore/
公開日: 03:34PM, Wednesday, July 15 2026, PDT
概要: Amazon Bedrock AgentCore The platform for production AI agents. Any framework. Any model. Secure at scale. One platform to build, connect and optimize agents...
[3] caylent.com
URL: https://caylent.com/blog/aws-reinvent-2025-every-ai-announcement-including-amazon-nova-2-and-kiro
公開日: 06:22PM, Thursday, July 30 2026, PDT
概要: | participant_name | Amazon Bedrock AgentCore |
| participant_type | product |
| participant_context | AI agent orchestration platform |
...
8.3 出力内容の見方
=== Search Results ===`に表示されている部分がWeb Search Toolから返された検索結果です。
Web Search Tool検索結果
=== Search Results ===
[1] Amazon Bedrock AgentCore
URL: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html
公開日: unknown
概要: Overview What is Amazon Bedrock AgentCore? Amazon Bedrock AgentCore is an agentic platform for building, deploying, and operating highly effective agents securely at scale using any framework and foundation model...
[2] Amazon Bedrock AgentCore - AWS
URL: https://aws.amazon.com/bedrock/agentcore/
公開日: 03:34PM, Wednesday, July 15 2026, PDT
概要: Amazon Bedrock AgentCore The platform for production AI agents. Any framework. Any model. Secure at scale. One platform to build, connect and optimize agents...
[3] caylent.com
URL: https://caylent.com/blog/aws-reinvent-2025-every-ai-announcement-including-amazon-nova-2-and-kiro
公開日: 06:22PM, Thursday, July 30 2026, PDT
概要: | participant_name | Amazon Bedrock AgentCore |
| participant_type | product |
| participant_context | AI agent orchestration platform |
| 項目 | 内容 |
|---|---|
| タイトル | 検索結果のページタイトル |
| URL | 検索結果の参照先 |
| 公開日 | Web Search Toolが取得した公開日時 |
| 概要 | クエリに関連するページ内の抜粋 |
publishedDateが取得できない場合は、unknownとなることがあります。
また、概要にはページ本文だけでなく、表形式やメタデータに近い内容が含まれる場合もありました。
今回はWeb Search Tool単体を呼び出しているため、検索結果の翻訳、要約、回答生成は行われていません。
9. 日本語クエリの比較
次の2つのクエリを比較しました。
クエリA
Amazon Bedrock AgentCoreの日本語情報
検索結果
=== Search Results ===
[1] Amazon Bedrock AgentCore – AWS
URL: https://aws.amazon.com/jp/bedrock/agentcore/?sc_channel=el
公開日: 05:23PM, Thursday, November 13 2025, PST
概要: Amazon Bedrock AgentCore あらゆるフレームワークとモデルを使用して、安全かつ大規模にエージェントを構築、デプロイ、運用するためのエージェンティックプラットフォーム Amazon Bedrock AgentCore とは何ですか? Amazon Bedrock AgentCore は、高機能エージェントを安全かつ大規模に構築、デプロイ、運用できるエージェントプラットフォームです。AgentCoreを使用すると、エージェントがツールやデータを横断してアクションを実行できるように簡単に設定できます。また、低レイテンシーで長時間エージェントを安全に実行し、本番環境でエージェン...
[2] Amazon Bedrock AgentCore に関するよくある質問
URL: https://aws.amazon.com/jp/bedrock/agentcore/faqs/
公開日: 04:18PM, Wednesday, July 15 2026, PDT
概要: Amazon Bedrock AgentCore に関するよくある質問 - Runtime - Code Interpreter - 全般 すべて開く Amazon Bedrock AgentCore は、高機能エージェントを安全かつ大規模に構築、デプロイ、運用できるエージェントプラットフォームです。AgentCore を使用すると、エージェントをより迅速に構築できるほか、エージェントはツールやデータを横断してアクションを実行できるようになります。また、低レイテンシーで長時間エージェントを安全に実行し、本番環境でエージェントをモニタリングできます。これらすべてをインフラストラクチャの管理なしで...
[3] caylent.com
URL: https://caylent.com/blog/aws-reinvent-2025-every-ai-announcement-including-amazon-nova-2-and-kiro
公開日: 06:22PM, Thursday, July 30 2026, PDT
概要: | participant_name | Amazon Bedrock AgentCore |
| participant_type | product |
| participant_context | AI agent orchestration platform |
| latest_ts | 2026-05-27 |
| latest_url | https://caylent.com/blog/aws-reinvent-2025-every-ai-announcement-including-amazon-nova-2-and-kiro |
| source_domain | cay...
クエリB
Amazon Bedrock AgentCoreの情報
検索結果
=== Search Results ===
[1] Amazon Bedrock AgentCore
URL: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html
公開日: unknown
概要: Overview What is Amazon Bedrock AgentCore? Amazon Bedrock AgentCore is an agentic platform for building, deploying, and operating highly effective agents securely at scale using any framework and foundation model...
[2] Amazon Bedrock AgentCore - AWS
URL: https://aws.amazon.com/bedrock/agentcore/
公開日: 03:34PM, Wednesday, July 15 2026, PDT
概要: Amazon Bedrock AgentCore The platform for production AI agents. Any framework. Any model. Secure at scale. One platform to build, connect and optimize agents...
[3] caylent.com
URL: https://caylent.com/blog/aws-reinvent-2025-every-ai-announcement-including-amazon-nova-2-and-kiro
公開日: 06:22PM, Thursday, July 30 2026, PDT
概要: | participant_name | Amazon Bedrock AgentCore |
| participant_type | product |
| participant_context | AI agent orchestration platform |
比較結果
| 順位 | 「日本語情報」を指定 | 「情報」のみ |
|---|---|---|
| 1 | AWS公式日本語ページ | AWS公式英語ドキュメント |
| 2 | AWS公式日本語FAQ | AWS公式英語ページ |
| 3 | 英語の第三者サイト | 英語の第三者サイト |
確認できた傾向
今回の結果では、クエリに日本語情報を含めることで、AWS公式の日本語ページが上位に表示されました。
一方、クエリ自体を日本語で書いただけでは、英語ページが上位になりました。
日本語でクエリを書く
≠ 日本語ページだけが返る
「日本語情報」を明示する
→ 日本語ページが上位になる傾向
ただし、日本語情報を指定しても英語ページは含まれました。
日本語ページだけを利用したい場合は、次のような追加対応が必要です。
- クエリに対象ドメインを含める
- 取得後にURLのドメインを判定する
- Gatewayやアプリケーション側でドメインを制御する
また、Web Search Tool単体では翻訳や回答生成は行いません。
返されるのは、検索結果のタイトル、URL、公開日、関連する抜粋です。
10. コスト
Web Searchは、検索クエリ単位の従量課金です。
今回の1回の実行では、主に以下が発生します。
tools/list:1回
tools/call:1回
Web Search:1回
概算では、1検索あたり約0.007 USDにGateway API料金が少額加算されます。
今回のような数回のPoCであれば、費用は数円程度です。
検索結果が長文でも、Web Search料金が文字数やトークン数で増えるわけではありません。
今回はBedrockの基盤モデルを呼び出していないため、LLMのトークン料金も発生していません。
11. まとめ
AgentCore GatewayへWeb Search Toolを追加し、Cursor上のPythonからMCP形式でWeb検索を実行できました。
今回確認できた内容は以下です。
- AgentCore GatewayはリモートMCP Serverとして利用できる
- Pythonから
tools/listとtools/callを実行できる - IAM Identity Centerの認証情報でGatewayを呼び出せる
- Web Search Toolからタイトル、URL、公開日、概要を取得できる
- 日本語クエリでも日本語ページだけが返るとは限らない
-
日本語情報を明示すると日本語ページが上位になる傾向があった
次は、AgentCore GatewayをCursorのMCP設定へ直接登録し、CursorをMCP HostとしてWeb Search Toolを利用する構成とかも試してみたいと思います。