使用 Amazon Bedrock AgentCore 构建交互式 MCP 应用
随着用户转向通过 ChatGPT、Claude 这类 AI 宿主(host,即承载 AI 对话的应用)来使用数字服务,企业需要一种方式,让自己的服务能在这些应用里以丰富的界面呈现,而不只是纯文本。同时还要避免把自己绑死在某一个宿主上。MCP Apps 和 Amazon Bedrock AgentCore 正好满足这两点需求。
MCP Apps 在模型上下文协议(Model Context Protocol,MCP)的基础上做了扩展,让交互式 HTML 组件可以直接在 AI 宿主内部渲染。Amazon Bedrock AgentCore 则是一个用于大规模构建、连接和优化智能体(agent)的平台,不限定框架或模型。针对 MCP Apps,AgentCore runtime 提供了一个安全、无服务器、会话隔离的宿主,原生支持 MCP;AgentCore Gateway 则通过一个安全端点把它暴露出来,兼容 MCP Apps 的宿主都能访问。这些通用的繁琐工作由 AgentCore 承担,开发者可以把精力放在业务逻辑和组件设计上。
本文将演示如何在 Amazon Bedrock AgentCore 上构建并部署一个带交互式 HTML 组件的 MCP App。由于 MCP Apps 是一个与宿主无关的标准,只要 AI 宿主支持 Apps 扩展,应用就能带来同样丰富的体验。在示例应用 Unicorn Rentals 中,用户可以浏览可租的独角兽、预订租赁、查看当前订单以及归还独角兽。无论在 ChatGPT、Claude 还是其他支持的宿主打 开 Unicorn Rentals,外观和使用体验都一致。
它是怎么运作的
在介绍架构之前,先看看应用的实际运行效果。Unicorn Rentals 以 MCP App 的形式部署,并连接到一个 AI 宿主。下面的示例使用 ChatGPT,但同一套服务端也能在 Claude 或其他支持 MCP Apps 扩展的宿主中运行。我们会依次走过四个步骤,从浏览全部独角兽到归还一只。
第 1 步:列出可租的独角兽
先问一句自然语言:「能列出所有独角兽吗?」宿主理解问题后,会为每只独角兽渲染一张交互式卡片,展示图片、名称、描述、时租价格和可用状态,而不是返回一串纯文本。
图 1:AI 宿主把可租用的独角兽渲染成一张张可交互的卡片。
第 2 步:预订独角兽
如果你看中的是 Stardust,只要说一句「我想预订 Stardust 独角兽」就能租下它。应用会记录这笔预订并立即确认,同时显示预订编号、日期、小时费率以及你预订的那只独角兽。
图 2:预订已确认,详情显示在对话中。
第 3 步:查看预订
想看看当前租了哪些,可以说「显示我的独角兽预订」。应用会返回正在生效的租借记录,以及已租时长和到目前为止产生的费用。这次返回的是纯文本而不是卡片,因为并不是每个请求都需要富交互界面。
图 3:当前租借记录以文本形式返回,而不是卡片。
第 4 步:归还独角兽
最后,说一句「我想归还我的独角兽」,租借就结束了。应用根据租借时长和小时费率算出总费用,并在对话中告知用户。
图 4:租借结束,总费用已告知。
你刚才看到的这些功能,全都由同一个 MCP 服务器提供。它运行在 Amazon Bedrock AgentCore 运行时上,前面由 AgentCore Gateway 作为统一入口。本文余下部分会介绍它是怎么搭起来的,以及如何自己部署一套。
方案概览
该方案把一个 MCP 应用部署在 Amazon Bedrock AgentCore 上,通过模型上下文协议(MCP,Model Context Protocol)对外暴露业务逻辑和可交互的 HTML 组件。用户与 AI 宿主交互,宿主按照 MCP Apps 模式渲染这些可交互的 HTML 组件。业务逻辑由一个专用的 AWS Lambda 函数实现,并用 Amazon DynamoDB 做数据持久化。下图展示了这些组件如何协同工作,把交互式组件呈现给 AI 宿主。
图 5:Amazon Bedrock AgentCore 上 MCP 应用的架构
把一个 MCP 应用注册到 AI 宿主时,流程如下:
- 你提供应用的相关信息,其中包括 MCP 服务器地址。
- AI 宿主向 AgentCore Gateway 暴露的 MCP 服务器地址发起 tools/list 和 resources/list 两个 MCP 调用。
MCP 服务器提供 list_unicorns、book_unicorn、view_bookings 和 return_unicorn 等工具,以及 unicorn-list 和 booking-confirmation 等资源,为每次响应提供组件 HTML。AWS WAF 通过 IP 允许列表和托管规则验证请求,AgentCore Gateway 再把它路由到 AgentCore 运行时。AgentCore Gateway 使用其 AWS Identity and Access Management (IAM) 执行角色调用 AgentCore 运行时。托管在其上的 MCP App 定义了 MCP 工具和 MCP 资源。MCP App 接收请求,并返回其中的工具或资源列表。AI 宿主可能会缓存这些信息,供后续使用。
用户从 AI 宿主访问独角兽租赁服务时,会经历以下过程。
阶段 1 — 工具调用
用户在 ChatGPT 或 Claude 等 AI 宿主中发出自然语言请求,例如“Show me all unicorns”。AI 宿主把请求转换成 MCP tools/call 消息(例如 list_unicorns),发送到 AgentCore Gateway 端点。AWS WAF 在请求到达 AgentCore Gateway 端点之前先做筛查。AgentCore Gateway 调用托管 MCP App 的 AgentCore 运行时。MCP App 收到请求后,把业务操作交给 Unicorn Rental Service AWS Lambda。AWS Lambda 对 DynamoDB 执行业务逻辑并返回结果。MCP App 把响应包装成 MCP 格式,返回给 AI 宿主。
阶段 2 — 组件渲染
如果工具关联了资源 URI(例如 ui://widget/unicorn-list),AI 宿主就会进入这个阶段。没有关联组件的工具,比如 view_bookings 和 return_unicorn,只返回纯文本内容,完全跳过这个阶段。宿主针对该 URI 发送 MCP resources/read 请求。请求经 AgentCore Gateway 到达 MCP App。MCP App 解析资源 URI,并返回自包含的组件 HTML。AI 宿主可能会缓存这些数据以提升性能。宿主在沙箱化的 iframe 中渲染 HTML,并通过 MCP Apps 生命周期注入工具响应里的结构化数据。
widget 从 Amazon CloudFront 获取所需图片,CloudFront 则以 Amazon Simple Storage Service(Amazon S3)作为源站。
使用 AgentCore runtime 构建 MCP 服务器
本节介绍 MCP 服务器的结构,以及 AgentCore runtime 如何托管它。
MCP App
这个方案里的 MCP App 是一个 TypeScript 应用,基于官方 @modelcontextprotocol/sdk 构建,并配合 @modelcontextprotocol/ext-apps 扩展,后者提供了一种标准方式,让 MCP 服务器可以下发交互式 widget。它作为一个 Express.js HTTP 服务器运行,由 AgentCore runtime 在内部管理。
MCP App 提供以下能力:
MCP 工具
应用注册了 list_unicorns、book_unicorn、view_bookings、return_unicorn 等 MCP 工具,供 AI 主机调用。工具通过 registerAppTool 注册,注册时提供工具名、工具配置,以及一个包含该工具业务逻辑的处理函数。
应用注册了 list_unicorns 工具。
它负责处理来自 AI 主机的 tools/list MCP 请求(用于发现工具)和 tools/call MCP 请求(用于调用工具)。工具配置里的 _meta.ui.resourceUri 字段告诉 AI 主机该渲染哪个 widget 来展示工具的响应。tools/call 响应中的 structuredContent 包含数据载荷,AI 主机在渲染 widget 时会把这些数据注入进去。
MCP App 资源
应用把 widget 注册为 MCP Resources,供 AI 主机使用。资源通过 registerAppResource 注册,注册时提供资源名、URI,以及一个返回 widget HTML 数据的处理函数。
应用注册了 unicorn-list-widget 资源。
它负责处理来自 AI 主机的 resources/list MCP 请求(用于发现资源)和 resources/read MCP 请求(用于获取 widget HTML)。
AgentCore runtime 上的 MCP App
这个方案把 MCP App 部署到 AgentCore runtime 上。构建过程会把 MCP App 的代码打包成一个 zip 文件,部署步骤再把它上传到 Amazon S3 存储桶,并创建一个引用它的 AgentCore runtime 资源。runtime 配置需要指定 NODE_22 环境、入口点和 MCP 协议模式。
AgentCore runtime 是一个安全、无服务器、专门为部署和运行 MCP 应用打造的托管环境,能根据请求量自动扩缩容。只要在配置里标明这是一个 MCP 服务器,AgentCore 就会启用针对该协议的优化。基于资源的策略用来限定哪些主体(principal)可以调用 runtime——在我们的方案中,策略只放行 AgentCore Gateway 的执行角色,其他主体一律拒绝。
通过 AgentCore Gateway 暴露 MCP 服务器
AgentCore runtime 支持 IAM(SigV4)和 OAuth 两种调用鉴权方式。这套方案在 runtime 前面放了一个 Amazon Bedrock AgentCore Gateway,这样外部 AI 主机就能通过同一个托管端点访问 MCP 服务器。Gateway 对进来的请求采用「无鉴权」模式接收,然后用自身的 IAM 执行角色、走 SigV4 去调用 runtime,调用方不需要自己处理 AWS 凭证。Gateway 端点由 AWS WAF 保护,启用了 IP 允许列表、托管威胁检测规则和限流。
业务逻辑层
业务逻辑由 AWS Lambda 函数实现,负责独角兽租赁业务的库存查询和预订操作,数据存在 Amazon DynamoDB。这个 Lambda 完全不感知 MCP。放在真实项目里,这一层可以是你已有的服务——跑在 Amazon Elastic Container Service(Amazon ECS)、Amazon Elastic Kubernetes Service(Amazon EKS)或其他计算服务上。关键在于,MCP 服务器只是一层很薄的协议适配器:你的核心业务逻辑留在原地,通过 HTTP 调用或 SDK 客户端这类标准方式接入 MCP 层即可。
部署演练
下面带你一步步部署这套方案。
前置条件
开始之前,请确认你已具备:
- 一个 AWS 账户,且有部署 AgentCore runtime 所需的权限。具体需要哪些 IAM 权限,见 IAM Permissions for AgentCore runtime。
- Node.js 22 或更高版本。
- 已安装并配置好 AWS Command Line Interface(AWS CLI)V2.0 或更高版本(通过
aws configure配置)。 - 全局安装 AWS Cloud Development Kit(AWS CDK)CLI。
有关操作说明,请参阅 AWS CDK 入门指南。
部署解决方案
部署过程使用单个 deploy.sh 脚本,由它统一完成构建和 CDK 堆栈部署。
第 1 步:下载解决方案代码:
git clone https://github.com/aws-samples/sample-agentcore-mcp-apps.git
cd sample-agentcore-mcp-apps
第 2 步:在 AWS 账户中部署所需资源。运行部署脚本,部署 CDK 堆栈:
bash deploy.sh
记下部署完成后输出的信息。连接 AI 主机时需要用到 GatewayResourceUrl。
从 AI 主机连接
这个 MCP 服务器实现了 MCP Apps 开放标准,所以其他支持 MCP Apps 扩展的 AI 主机也能连接,并渲染完整的交互式小组件体验。仓库中包含了针对特定 AI 主机的详细配置指南:
ChatGPT
打开 https://chatgpt.com/ ,点击用户头像,进入“插件”,再进入“开发者模式”,开启“开发者模式”。
进入“插件”,点击“新建插件”。
- 名称填
UnicornRentals - 描述填:“浏览独角兽、预订租赁、查看当前预订、归还独角兽。展示带价格和预订确认的丰富 UI 卡片”
- 连接地址填 CDK 输出中的
GatewayResourceUrl - 认证方式选“无认证”
点击“创建”。
Claude.ai
打开 https://claude.ai ,点击“自定义”,然后进入“连接器”。
点击“添加连接器”。
- 名称填
UnicornRentals - 远程 MCP 服务器 URL 填 CDK 输出中的
GatewayResourceUrl
点击“保存”。
生产部署注意事项
把这个方案推向生产环境时,需要考虑以下几点。
监控与可观测性:用 Amazon CloudWatch 监控 AgentCore Gateway 的请求指标、Unicorn Service Lambda 的调用情况,以及 AgentCore 运行时容器的健康状况。针对错误率和延迟阈值设置告警,并开启日志记录,跟踪 MCP 方法调用和响应时间。
成本优化:AgentCore 运行时按用量计费,费用取决于容器运行时长和调用次数。为了控制成本,根据实际需求合理配置容器的内存和 CPU,并依据预期流量模式调整 Lambda 的并发设置。
负责任的 AI:在信任边界处加入安全控制。在 MCP 服务器中用严格的 schema 校验工具参数,并在 Unicorn Service Lambda 中再次校验,确保业务逻辑不会信任未经校验的输入。
对于跨边界的非结构化文本,可以用 Amazon Bedrock Guardrails 过滤有害内容、屏蔽被禁止的话题,并在响应到达客户端之前,把个人身份信息(PII)等敏感数据抹掉。
清理资源
要删除 CDK 堆栈创建的所有资源,运行以下命令。
cd infrastructure/cdk
npx cdk destroy
后续步骤
想查看完整的源代码和部署说明,可以访问 aws-samples 里的 GitHub 仓库。你还可以把这个方案改造成自己的业务:把 Unicorn Rental Service 这个 Lambda 换成你自己的业务逻辑,再加些新工具和新组件就行。
结语
本文介绍了如何在 Amazon Bedrock AgentCore 运行时上搭建和部署带交互式组件界面的 MCP 服务器。整体架构思路是:在 AgentCore 运行时上放一层轻量的 MCP 协议层,把业务逻辑交给专门的 Lambda 函数处理,同时把自包含的组件 HTML 作为 MCP App 资源提供出去。整条链路通过 AgentCore Gateway 端点暴露,让你用很少的运维成本,就能得到一个可弹性伸缩的 MCP Apps 部署方案。
这套方案真正的价值,在于很多事你不需要自己去做。AgentCore 运行时把那些跟业务无关的繁琐工作都包了——扩缩容、会话隔离、健康监控、基础设施管理,你的团队就能专注在业务逻辑和用户体验上。你只需写一层轻量的协议适配器,让它对接现有服务,剩下的交给 AgentCore。
由于这套方案基于开放的 MCP Apps 标准,你的投入不会被绑死在某一款 AI 宿主上。同一台服务器、同一批工具、同一套交互组件,在其他支持 MCP Apps 扩展的宿主上也能用。一次开发,就能覆盖用户选择使用 AI 的任何地方。
另外,这个架构把协议处理和业务逻辑清晰地拆开了,你可以各自独立演进。换数据存储、加新工具、重做组件界面、接更多后端服务——这些改动都不需要重新设计部署架构。MCP 层保持轻量,服务保持可迁移,AgentCore 运行时负责让一切平稳运行。
作者简介
Dantis Stephen 是 AWS 英国区数据与 AI 团队的高级解决方案架构师,专注于为企业客户设计和交付生成式 AI 解决方案。
他全程亲手参与,覆盖从架构深度研讨、可上线的原型搭建,到把复杂负载从实验阶段推进到正式上线的各个环节。
Babs Khalidson
Babs 是 AWS 生成式 AI 创新中心(伦敦)的机器学习工程师,专注大语言模型微调、AI 智能体(Agent)开发以及模型部署方案。他在人工智能与机器学习领域有 6 年以上经验,涉足金融与云计算行业,能力覆盖从研究到生产部署的完整链条。