Model Context Protocol(MCP)正在快速成为 AI Agent 调用外部工具的标准协议,但把 MCP 服务器从开发环境推向生产,问题立刻浮现:谁有权调用哪个工具?调用日志怎么追踪?敏感数据会不会被 Agent 不小心外泄?散落在各处的 API Key 又该怎么统一管理?
Amazon Bedrock AgentCore Gateway 正是为了解决这些痛点而生——它部署在 MCP 客户端与 MCP 服务器之间,像一个带审计、鉴权和凭证保险箱的智能反向代理,把原本需要每个 MCP 服务器各自实现的安全与运维能力,收拢到一个中心化网关。
MCP 生产化的四大难题
先看没有网关时,企业部署 MCP 服务器会遇到什么:
- 访问控制粗放——MCP 协议本身没有细粒度权限模型,客户端连上服务器就能调用所有工具。不同团队、不同 Agent 应该只能访问各自被授权的工具集合,但原生 MCP 做不到。
- 可观测性缺失——哪个 Agent 在什么时间调了哪个工具、返回了什么结果?没有统一日志,排查问题只能靠各服务器自己打印的 stdout。
- 数据外泄风险——Agent 可能把内部数据库查询结果直接喂给外部 LLM,敏感字段在不知不觉中流出。MCP 服务器本身没有内置防泄漏机制。
- 凭证管理碎片化——每个 MCP 服务器各自存储自己调下游 API 用的 Key,轮换、审计、权限回收全靠人工,规模大了根本管不住。
AgentCore Gateway 把这四件事一次性收进网关层处理,MCP 服务器本身只需要专注实现工具逻辑。
网关的工作原理
AgentCore Gateway 的定位很清晰:MCP 客户端不直连 MCP 服务器,而是连网关;网关再代理到后端 MCP 服务器集群。 在这个代理过程中,网关完成四件事:
- 鉴权与授权——客户端请求先过网关的 OAuth 2.0 / IAM 鉴权,再按策略决定能访问哪些工具。
- 凭证注入——后端 MCP 服务器需要的 API Key、数据库密码等,由网关从 AWS Secrets Manager 或 IAM Role 动态获取并注入请求,服务器本身不再存储任何凭证。
- 调用审计——每次工具调用的入参、出参、耗时、调用者身份,网关统一记录到 CloudWatch Logs / CloudTrail,团队维度可观测。
- 数据防护——网关可对返回内容做字段级过滤或脱敏,阻断敏感数据流向未经授权的客户端。
这意味着 MCP 服务器开发者只需要实现 tools/list 和 tools/call 的业务逻辑,安全与运维全部上移到网关。
实操:把一个 MCP 服务器接入 AgentCore Gateway
下面用一个最小示例演示完整流程。假设你有一个查询内部知识库的 MCP 服务器,想通过网关对外暴露,且只允许特定团队访问。
第一步:创建 AgentCore Gateway
aws bedrock-agentcore create-gateway \
--gateway-name knowledge-base-gateway \
--role-arn arn:aws:iam::123456789012:role/AgentCoreGatewayRole \
--auth-type IAM \
--region us-east-1
AgentCoreGatewayRole 需要具备以下权限:
- 读取 Secrets Manager 中存储的后端 API Key
- 写 CloudWatch Logs
- 调用你注册的 MCP 服务器对应的下游资源
第二步:注册 MCP 服务器到网关
aws bedrock-agentcore create-gateway-mcp-server \
--gateway-id myGatewayId \
--mcp-server-name internal-kb-server \
--server-url https://kb-mcp.internal.example.com:8080/sse \
--description "查询内部知识库的 MCP 服务器" \
--credential-provider-type SECRETS_MANAGER \
--secrets-manager-secret-id kb-api-key-secret \
--region us-east-1
关键参数说明:
--server-url:你的 MCP 服务器 SSE 端点地址。网关通过 SSE 协议与后端 MCP 服务器通信。--credential-provider-type SECRETS_MANAGER:告诉网关从 Secrets Manager 取凭证,而不是让 MCP 服务器自己持有 Key。--secrets-manager-secret-id:存储后端 API Key 的 Secret ID。
第三步:配置工具级访问策略
网关支持按工具名做白名单授权。以下策略只允许 search-team 调用 search_knowledge_base 工具,禁止访问 delete_document:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789012:role/search-team-role" },
"Action": "bedrock-agentcore:InvokeMcpTool",
"Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/myGatewayId/mcp-server/internal-kb-server/tool/search_knowledge_base"
},
{
"Effect": "Deny",
"Principal": { "AWS": "arn:aws:iam::123456789012:role/search-team-role" },
"Action": "bedrock-agentcore:InvokeMcpTool",
"Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/myGatewayId/mcp-server/internal-kb-server/tool/delete_document"
}
]
}
第四步:客户端通过网关调用
MCP 客户端不再直连 kb-mcp.internal.example.com,而是连网关提供的统一端点:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
# 通过网关端点连接,而非直连 MCP 服务器
# 网关地址在 create-gateway 返回结果中获取
gateway_url = "https://agentcore-gateway.us-east-1.amazonaws.com/gateway/myGatewayId/sse"
# 使用 boto3 签名请求(IAM 鉴权模式)
import boto3
session = boto3.Session()
credentials = session.get_credentials()
# 实际项目中可使用 AWS 提供的 MCP Gateway SDK,
# 它会自动处理 SigV4 签名和 SSE 连接
# 这里展示核心调用逻辑
async with ClientSession(gateway_url, auth_headers={
"X-Amz-Security-Token": credentials.token,
"Authorization": f"AWS4-HMAC-SHA256 Credential=...",
}) as client:
# 只能看到被授权的工具
tools = await client.list_tools()
print(f"可用工具: {[t.name for t in tools.tools]}")
# 调用搜索工具——凭证由网关自动注入到后端服务器
result = await client.call_tool("search_knowledge_base", {
"query": "Q3 营收数据",
"limit": 5
})
print(result)
运行前需要:
- 确保本机 AWS CLI 已配置好
search-team-role的凭证(或通过环境变量/实例角色获取)。 - 安装
mcpPython SDK:pip install mcp。 - 网关的 IAM 鉴权需要 SigV4 签名,生产环境建议直接用 AWS 提供的 MCP Gateway 客户端 SDK,避免手写签名逻辑。
凭证管理的实际收益
把凭证从 MCP 服务器剥离出来,收益不只是"少存一个 Key":
| 场景 | 无网关 | 有网关 |
|---|---|---|
| Key 轮换 | 逐个服务器改配置、重启 | Secrets Manager 自动轮换,网关实时取新值,服务器无感知 |
| 权限回收 | 删除服务器上的 Key,但可能还有缓存 | IAM Policy 一条 Deny 即刻生效 |
| 跨团队共享 | 各团队各自存 Key,副本散落 | 网关按角色注入,团队永远不接触原始凭证 |
| 审计谁用了什么 Key | 只能看服务器日志,无法关联到调用者身份 | CloudTrail 记录调用者 IAM 身份 + 所用凭证 |
数据防护:网关层的脱敏过滤
AgentCore Gateway 还支持对 MCP 工具返回内容做字段级脱敏。例如知识库返回的文档中包含员工社保号,网关可以在代理层自动将这类字段替换为 ***REDACTED***,Agent 永远看不到原始值。
配置方式是在网关策略中附加数据过滤规则(具体语法以 AWS 官方文档为准):
{
"dataProtection": {
"redactionRules": [
{
"fieldPattern": "ssn|social_security_number",
"action": "REDACT",
"replacement": "***REDACTED***"
},
{
"fieldPattern": "internal_ip_address",
"action": "MASK",
"maskChar": "x",
"keepPrefix": 2
}
]
}
}
这样即便后端 MCP 服务器返回了完整数据,网关在转发给客户端前会自动清洗,从架构层面堵住数据外泄通道。
上线前的检查清单
把 MCP 服务器接入 AgentCore Gateway 之前,建议逐项确认:
- MCP 服务器已剥离所有硬编码凭证——改用环境变量引用或完全依赖网关注入,确保服务器代码中不再出现任何 API Key。
- 网关 IAM Role 权限最小化——只赋予读取所需 Secret、写日志、调用特定下游资源的权限,不做宽泛授权。
- 工具级策略已覆盖所有敏感操作——写操作、删除操作、批量导出操作必须显式 Deny 不需要的团队。
- 数据脱敏规则已覆盖已知敏感字段——至少包含 PII(姓名、身份证、手机号)和内部网络信息(IP、主机名)。
- CloudWatch Logs 日志保留期已设置——根据合规要求配置保留天数,避免审计日志过早过期。
- 客户端 SDK 版本兼容——确认使用的 MCP Gateway 客户端 SDK 支持你网关配置的鉴权类型(IAM 或 OAuth 2.0)。
权衡与边界
AgentCore Gateway 不是万能的,有几个现实边界需要正视:
- 额外延迟——请求多经过一层代理,典型增加 10-30ms。对实时交互场景影响不大,但对高频细粒度工具调用(比如每秒数十次的向量检索)需要做延迟测试。
- 网关可用性——所有 MCP 调用都依赖网关存活,网关成为单点。AWS 托管服务本身有多区域冗余,但你仍需在客户端侧设计重试与降级逻辑。
- 脱敏规则的维护成本——敏感字段模式需要持续更新,新业务引入新字段类型时,脱敏规则容易滞后。建议把规则纳入代码审查流程,而非只靠运维手动配置。
- 只覆盖 MCP 协议——如果你的 Agent 还通过非 MCP 方式调用外部服务(比如直调 REST API),那些路径不在网关保护范围内,需要另行治理。
总的来说,AgentCore Gateway 把 MCP 生产化中最棘手的安全与运维问题收拢到了一个可控的平面。对于已经在内部部署了多个 MCP 服务器、且需要跨团队共享的团队,它是一个值得优先评估的方案——先把凭证和权限收进来,再逐步补上脱敏和审计规则,比在每个 MCP 服务器里各自造轮子要高效得多。