![[アップデート] AWS Agent Registry がプレビューリリースされました!](https://images.ctfassets.net/ct0aopd36mqt/7M0d5bjsd0K4Et30cVFvB6/5b2095750cc8bf73f04f63ed0d4b3546/AgentCore2.png?w=3840&fm=webp)
[アップデート] AWS Agent Registry がプレビューリリースされました!
はじめに
こんにちは、スーパーマーケットが大好きなコンサル部の神野です。
AIエージェントやMCP Serverの活用が進む中で、組織内で「誰がどんなエージェントを作ったのか」「どのMCP Serverが使えるのか」が把握しきれなくなってきていませんか。いわゆる野良エージェント・野良MCP Serverと問題が出てきそうです。
そんな課題にちょうど刺さるサービスとして、AWS Agent Registry がプレビュー公開されました。
Amazon Bedrock AgentCore の一機能で、エージェント・MCP Server・スキルを一元的に登録・検索・管理できるレジストリサービスです。
サービス名が「Amazon Bedrock AgentCore」配下なのに「AWS Agent Registry」という名前なのは若干気になりますね・・・
今回は実際にコンソールとSDKで触ってみたので、操作の流れを記載しました。
前提
- リージョン: us-east-1
- Python: 3.13
- boto3: 1.42.87 以上
AWS Agent Registry
ざっくり言うと、組織内のAIエージェントやMCPサーバー、スキルを登録・検索できるカタログサービスです。
公式ブログから引用します。
AWS Agent Registry を使用して、組織全体のエージェント、MCP サーバー、ツール、スキルを検出および管理するための一元化されたレジストリを作成できます。
レジストリにはレコード承認フローが組み込まれていて、無闇に登録されないようガバナンスを効かせることもできます。登録されたレコードは検索APIやMCP Server経由で検索できるので、個人が既に作られているスキルやエージェントを一覧で確認して再利用することもできるし、エージェントが実行時に必要なスキルやツールを動的に見つけるような使い方も考えられます。後者は検証してみたいと思います。
レジストリを作成する
Amazon Bedrock AgentCore のコンソールから「レジストリ」を開きます。

左のナビゲーションを見ると、レジストリは「探す」カテゴリに配置されています。構築・テスト・評価とは別の位置づけで、あくまで「検索・発見」のためのサービスという立ち位置ですね。
「レジストリを作成」ボタンを押すと、作成フォームが表示されます。

設定項目を見ていきます。
| 設定項目 | 説明 |
|---|---|
| 名前 | レジストリの識別名 |
| Search API 認証 | 検索APIの認証タイプ。IAMユーザーまたはJWTウェブトークンから選択 |
| レコード承認 | レジストリに登録する際に承認を必要とするかどうか。自動承認のオン/オフ |
認証タイプでJWTが選べるのは、AWS外のシステムからも検索できるようにするためでしょう。
今回はIAM認証、自動承認オフで進めてみます。承認フローがどう動くのか見てみたいので。
レコードを作成する
レジストリが作成できたので、次はレコードを登録していきます。レジストリの詳細画面はこんな感じです。

「MCP 経由でレジストリに接続」というセクションがあります。コンソール上のサンプルはboto3のコードですが、実はRegistry自体がMCPエンドポイントを持っていて、MCP Serverとして接続できます。これについては後ほど試してみます。
「レコードを作成」ボタンを押してみます。

レコードタイプは以下の4種類から選べます。
| タイプ | 説明 |
|---|---|
| MCP | MCP Serverの登録 |
| エージェント | エージェントの登録(A2Aプロトコル) |
| エージェントスキル | スキルの登録(マークダウン + JSON定義) |
| カスタム | 独自のプロトコルや形式での登録 |
エージェントの登録タイプがA2Aプロトコルのみというのはちょっと残念なところです。HTTPSエンドポイントなど他のプロトコルでも登録できると嬉しいのですが、今後のアップデートに期待ですね。
今回は「エージェントスキル」を選択しました。スキルドキュメントをマークダウンで記述し、スキル定義をJSONで記述する形式です。

スキル定義には公式スキーマが用意されていて、「Show official schema」で確認できます。
作成時のボタンが2つあるのがポイントです。「ドラフトとして作成」と「作成して承認のために送信」です。今回はドラフトとして作成してみます。
承認フローを試す
ドラフトとして作成されたレコードの詳細画面がこちらです。

ステータスが「ドラフト」になっていますね。右上の「更新ステータス」から承認フローに送信できます。
承認のために送信すると、レコード一覧画面でステータスが「承認待ち」に変わります。

合計送信数・承認待ち・承認済み・非推奨・拒否のサマリーが一覧の上部に表示されていて、レジストリ全体の状況が一目で分かるのはいいですね。
承認待ちのレコードを選択して「更新ステータス」を押すと、承認・拒否・非推奨の3つから選べます。

承認を選択すると、理由を入力するモーダルが表示されます。

これで承認完了です。ドラフト → 承認待ち → 承認済み という流れで、レコードのライフサイクルが管理されます。
ただ、ここで1つ気になった点があります。コンソール上では承認ボタンが普通に表示されていて、誰でも承認できてしまうように見えます。実運用を考えると、作成者と承認者の権限を分離したいところです。IAMで制御できるのか調べてみました。
IAMでの権限制御を調べてみた
AWS Service Authorization Reference で bedrock-agentcore のIAMアクションを確認したところ、レジストリ関連のアクションがきちんと分離されていました。
主なアクションは以下の通りです。
| IAMアクション | 種別 | 説明 |
|---|---|---|
bedrock-agentcore:CreateRegistryRecord |
Write | レコードの作成 |
bedrock-agentcore:SubmitRegistryRecordForApproval |
Write | レコードを承認フローに送信 |
bedrock-agentcore:UpdateRegistryRecordStatus |
Write | レコードステータスの更新(承認/拒否) |
bedrock-agentcore:GetRegistryRecord |
Read | レコードの取得 |
bedrock-agentcore:ListRegistryRecords |
List | レコードの一覧取得 |
bedrock-agentcore:SearchRegistryRecords |
Read | レコードの検索 |
CreateRegistryRecord と UpdateRegistryRecordStatus が別アクションになっているので、IAMポリシーで作成者と承認者のロールを分離できます。
例えば、開発者には作成・送信の権限だけを付与し、承認はチームリーダーのみに許可するといった運用が可能です。
{
"Effect": "Allow",
"Action": [
"bedrock-agentcore:CreateRegistryRecord",
"bedrock-agentcore:SubmitRegistryRecordForApproval",
"bedrock-agentcore:GetRegistryRecord",
"bedrock-agentcore:ListRegistryRecords"
],
"Resource": "*"
}
{
"Effect": "Allow",
"Action": [
"bedrock-agentcore:UpdateRegistryRecordStatus",
"bedrock-agentcore:GetRegistryRecord",
"bedrock-agentcore:ListRegistryRecords"
],
"Resource": "*"
}
ガバナンスの観点でIAMレベルで権限分離はできそうですね。
SDKで検索してみる
実際にboto3を使ってレジストリを操作してみます。ポイントとなる部分をピックアップして紹介します。
一覧取得は list_registry_records を使います。
control_client = boto3.client("bedrock-agentcore-control", region_name="us-east-1")
results = control_client.list_registry_records(registryId=REGISTRY_ID)
records = results.get("registryRecords") or []
検索は search_registry_records です。こちらはデータプレーン側のクライアントを使います。
agentcore_client = boto3.client("bedrock-agentcore", region_name="us-east-1")
results = agentcore_client.search_registry_records(
registryIds=[REGISTRY_ID],
searchQuery="my-skill",
maxResults=10,
)
records = results.get("registryRecords") or []
コード全体(sample.py)
"""Bedrock AgentCore レジストリの一覧取得・検索。"""
from __future__ import annotations
import argparse
import json
import os
import sys
import boto3
REGISTRY_ID = "fZrTo9ucpli8SLpV"
DEFAULT_SEARCH_MAX_RESULTS = 10
def _client_kwargs() -> dict[str, str]:
region = os.environ.get("AWS_REGION") or os.environ.get("AWS_DEFAULT_REGION")
if region:
return {"region_name": region}
return {}
def run_list(control_client) -> list:
all_records: list = []
next_token: str | None = None
while True:
req: dict = {"registryId": REGISTRY_ID}
if next_token:
req["nextToken"] = next_token
results = control_client.list_registry_records(**req)
all_records.extend(results.get("registryRecords") or [])
next_token = results.get("nextToken")
if not next_token:
break
return all_records
def run_search(agentcore_client, search_query: str, max_results: int) -> list:
results = agentcore_client.search_registry_records(
registryIds=[REGISTRY_ID],
searchQuery=search_query,
maxResults=max_results,
)
return results.get("registryRecords") or []
def main() -> None:
parser = argparse.ArgumentParser(
description="レジストリの全件一覧、または検索クエリでレコード検索。",
)
parser.add_argument(
"query",
nargs="?",
default=None,
help="検索文字列。指定すると search_registry_records。省略時は全件一覧。",
)
parser.add_argument(
"--max-results",
type=int,
default=DEFAULT_SEARCH_MAX_RESULTS,
metavar="N",
help=f"検索時の最大件数(1〜20、既定 {DEFAULT_SEARCH_MAX_RESULTS})。",
)
args = parser.parse_args()
kwargs = _client_kwargs()
control_client = boto3.client("bedrock-agentcore-control", **kwargs)
if args.query is not None:
q = args.query.strip()
if not q:
print("検索クエリが空です。", file=sys.stderr)
sys.exit(1)
mr = max(1, min(20, args.max_results))
agentcore_client = boto3.client("bedrock-agentcore", **kwargs)
records = run_search(agentcore_client, q, mr)
print("Search results:")
else:
records = run_list(control_client)
print("Registry records:")
print(json.dumps(records, indent=2, default=str))
if __name__ == "__main__":
main()
引数なしで実行すると全件一覧、引数ありで検索になります。
uv run sample.py
Registry records:
[
{
"registryArn": "arn:aws:bedrock-agentcore:us-east-1:xxx:registry/fZrTo9ucpli8SLpV",
"recordArn": "arn:aws:bedrock-agentcore:us-east-1:xxx:registry/fZrTo9ucpli8SLpV/record/41pcxdDoybRh",
"recordId": "41pcxdDoybRh",
"name": "record_kilq7",
"descriptorType": "AGENT_SKILLS",
"status": "APPROVED",
"createdAt": "2026-04-09 22:26:41.028679+00:00",
"updatedAt": "2026-04-09 22:28:11.002680+00:00"
}
]
先ほどコンソールで承認したレコードが APPROVED ステータスで返ってきていますね。
検索も試してみます。
uv run sample.py "my-skill"
Search results:
[
{
"registryArn": "arn:aws:bedrock-agentcore:us-east-1:xxx:registry/fZrTo9ucpli8SLpV",
"recordArn": "arn:aws:bedrock-agentcore:us-east-1:xxx:registry/fZrTo9ucpli8SLpV/record/41pcxdDoybRh",
"recordId": "41pcxdDoybRh",
"name": "record_kilq7",
"descriptorType": "AGENT_SKILLS",
"descriptors": {
"agentSkills": {
"skillMd": {
"inlineContent": "---\nname: my-skill\ndescription: Brief description of what this skill does.\n---\n# My Skill\n\nDescribe your skill's purpose, usage, and capabilities here.\n"
},
"skillDefinition": {
"schemaVersion": "0.1.0",
"inlineContent": "{}"
}
}
},
"status": "APPROVED",
"createdAt": "2026-04-09 22:26:41.028679+00:00",
"updatedAt": "2026-04-09 22:28:11.002680+00:00"
}
]
検索の場合は descriptors フィールドにスキルドキュメントやスキル定義の中身も返ってきました。どんなスキルが登録されているかしっかり確認できるようになっていますね。
Strands Agentsなどに動的にRegistryから取得したスキル定義を読み込ませる、といった使い方もできたりするのかしらとぼんやり気になったので今度検証してみたいと思います。
MCP Serverとして接続してみる
先ほどコンソールで触れた「MCP 経由でレジストリに接続」ですが、ドキュメントを確認したところ、RegistryはMCPエンドポイントを公開しています。
エンドポイントURLは以下の形式です。
https://bedrock-agentcore.<region>.amazonaws.com/registry/<registryId>/mcp
search_registry_records というツールが1つ提供されます。自然言語でレジストリ内のレコードを検索できます。
接続方法はIAM認証とOAuth(JWT)の2種類があります。今回はIAM認証で試してみます。IAM認証の場合は mcp-proxy-for-aws を経由して接続します。
プロジェクトの .mcp.json に以下の設定を追加します。
{
"mcpServers": {
"agent-registry": {
"type": "stdio",
"command": "uvx",
"args": [
"mcp-proxy-for-aws@latest",
"https://bedrock-agentcore.us-east-1.amazonaws.com/registry/<registryId>/mcp",
"--service",
"bedrock-agentcore",
"--region",
"us-east-1"
]
}
}
}
これでClaude Codeを再起動すると、agent-registry がMCP Serverとして認識されます。
実際に試してみると、つながりました

質問してみます。

しっかりと登録された情報が見れますね。組織としてどんなAIエージェント、MCPサーバーが登録されているか確認するのに便利そうですね。
EventBridge連携
RegistryはAmazon EventBridgeとも連携しています。
レコードが承認待ちになると Registry Record State changed to Pending Approval イベントがデフォルトのイベントバスに送信されます。これを使えば、承認待ちのレコードが登録されたらSlackに通知する、といったワークフローの自動化ができそうです。
| イベント | 発火タイミング |
|---|---|
Registry Record State changed to Pending Approval |
SubmitRegistryRecordForApproval API 呼び出し時 |
Registry State transitions from Creating to Ready |
Registry作成完了時 |
承認フローとEventBridgeの組み合わせは実運用を見据えた設計だなと感じます。
おわりに
コンソールでの操作はシンプルでした。レジストリ作成 → レコード登録 → 承認フローがそこまで迷わず操作できました。
承認フローが組み込みで用意されていて、IAMで権限分離もできるので良さそうだなと思いました。
一方で、エージェントの登録タイプがA2AプロトコルのみなのでHTTPSのエージェントも管理できると嬉しいですね。
とはいえ、野良エージェントや野良MCP Serverが増えていく中で、組織としてカタログ管理・ガバナンスを効かせたいというニーズには確実に応えてくれるサービスだと思います。今後のGA、そしてプロトコル対応の拡充に期待です。まだまだ触り尽くせていない機能がありそうなのでいっぱい触りたいです!
本記事が少しでも参考になりましたら幸いです。
最後までご覧いただきありがとうございました!









