![[レポート]Nova Sonic、Bedrock AgentCore、MCPを活用したエージェント型音声チャットアプリの構築 (AIM302) #AWSreInvent](https://images.ctfassets.net/ct0aopd36mqt/4pUQzSdez78aERI3ud3HNg/fe4c41ee45eccea110362c7c14f1edec/reinvent2025_devio_report_w1200h630.png?w=3840&fm=webp)
[レポート]Nova Sonic、Bedrock AgentCore、MCPを活用したエージェント型音声チャットアプリの構築 (AIM302) #AWSreInvent
こんにちは、AI事業本部の洲崎です。
AWS re:Invent 2025に参加しています!
今回は「Build Agentic Voice Chat with Nova Sonic, Bedrock AgentCore, MCP & more(AIM302)」というワークショップに参加してきました。
ワークショップ概要
このワークショップでは、Amazon Nova Sonicを使った音声入力と、Bedrock Knowledge BasesやAgentCoreを組み合わせたエージェント型の音声チャットシステムを構築しました。
ワークショップの内容は以下で公開されているため、詳細な手順はそちらをご参照ください。
このブログでは実際に構築してみた体験や感想をお伝えします。
構築した画面
ワークショップで構築した画面はこちらです。
試しに「Start Conversation」を押して、マイクに「hello」と話しかけると、リアルタイムで音声による返信が返ってきました。

右側の「Events」パネルでは、リアルタイムでやり取りされるJSONログを確認することができます。

Tool Use:日時取得
Nova SonicのTool Use機能を利用して、「今の時間は?」と聞いてみると、正確な情報が返ってきました。

参考までに、ツールが組み込まれているコードの一部は以下です。
UTC時刻を取得し、曜日と日時を含む形式で返却する内容です。
# Simple toolUse to get system time in UTC
if toolName == "getdatetool":
from datetime import datetime, timezone
result = datetime.now(timezone.utc).strftime('%A, %Y-%m-%d %H-%M-%S')
Knowledge Basesとの連携
次に、Bedrock Knowledge Basesと連携してRAGを試してみます。
データソースの同期
ワークショップではすでに環境が用意されているため、「同期」をクリックしてデータソースを最新化します。

マネジメントコンソールでのテスト
マネジメントコンソール上で、モデルを設定してテストを行います。

RAGテスト
テストで問題がなければ、Nova Sonicで「What is Amazon Nova?」と聞いてみます。
すると、Knowledge Bases経由でデータを参照して回答してくれました。

参考までに、実装コードの一部を紹介します。
ツールが呼ばれた際、クエリを受け取ってKnowledge Basesから関連情報を検索します。
ツール呼び出し部分
# Bedrock Knowledge Bases (RAG)
if toolName == "getkbtool":
result = kb.retrieve_kb(content)
Knowledge Bases検索の実装
def retrieve_kb(query):
results = []
# Bedrock Agent Runtimeでナレッジベースを検索
response = bedrock_agent_runtime.retrieve(
knowledgeBaseId=KB_ID,
retrievalConfiguration={
'vectorSearchConfiguration': {
'numberOfResults': 1, # 取得件数
'overrideSearchType': 'SEMANTIC', # セマンティック検索
}
},
retrievalQuery={
'text': query
}
)
# 検索結果からテキストを抽出
if "retrievalResults" in response:
for r in response["retrievalResults"]:
results.append(r["content"]["text"])
return results
この実装により、ユーザーの質問に対して関連するドキュメントを動的に取得し、LLMに渡すことができます。
MCPとの連携
最後に、MCPを使った外部サービス連携を試してみます。
MCP設定
右上の設定ボタンからMCPの設定を行います。

今回はAWS Location Service MCP サーバーを利用します。
ツール定義は以下です。
{
"toolSpec": {
"name": "locationMcpTool",
"description": "Access location services to find places, addresses, nearby locations.",
"inputSchema": {
"json": JSON.stringify({
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The function name to search the location service. One of: search_places, get_place, search_nearby, reverse_geocode",
},
"query": {
"type": "string",
"description": "The search query to find relevant information"
}
},
"required": ["query"]
}
)
}
}
}
テスト実行
「What is the largest shopping mall in New York City?」と質問してみます。
すると、場所を検索して、New York Cityの近くにあるショッピングモールを教えてくれました。

最後に
音声入力から始まり、RAGやMCPなどの複数のツールを組み合わせて回答を得る一連の流れを体験できました。
これらの技術の組み合わせはとても強力だと感じました。音声エージェントを作る際には参考にしてみてください。
また、ワークショップ自体はRAGやMCP以外にも、StrandsAgentとの統合や、AgentCoreのマルチエージェント実装もあるので、興味がある方はぜひ試してみてください。
ではまた!AI事業本部の洲崎でした。








