Claude Desktop 使用 Amazon Bedrock 中的模型时,回答仍受模型知识截止时间限制。要让它查询实时网页,不能只把一个搜索 API 地址塞进提示词,而应把搜索能力封装成受控工具,并在桌面客户端与外部网络之间建立可认证、可审计的边界。
Amazon Bedrock AgentCore Gateway 可以承担这层边界:向 Claude Desktop 暴露工具接口,将调用转发给 Web 搜索目标,并通过 JWT 验证进入网关的请求。AWS IAM Identity Center 可负责员工身份登录,Amazon Cognito 则可用于 OAuth 流程和 JWT 签发。
网关不是搜索引擎,而是安全控制面
一条典型调用链可以设计成:
Claude Desktop
│ MCP / HTTPS
▼
本地 OAuth 客户端或 MCP 连接器
│ Authorization: Bearer <JWT>
▼
Amazon Bedrock AgentCore Gateway
│ 经过授权的工具调用
▼
Web Search API、Lambda 或内部搜索服务
这里有三个边界需要分清:
- 用户认证:确认发起请求的是哪位员工。Identity Center 适合承接组织账号与单点登录。
- 令牌签发与验证:一种可落地的安排是让 Cognito 完成 OAuth 授权流程并签发 JWT,再让 AgentCore Gateway 验证签名、签发者、有效期和客户端声明。
- 目标端凭证:搜索服务所需的 API Key、IAM 权限或其他凭证应由网关或后端持有,不能下发给 Claude Desktop。
因此,用户拿到的 JWT 只代表“允许调用搜索工具”,并不等于获得搜索供应商的密钥。撤销用户访问权、限制客户端和集中记录工具调用也会更容易。
把身份链路配置正确
具体控制台字段会随区域和服务版本变化,但配置时应围绕以下约束展开:
- 在 Cognito 中创建面向桌面应用的公共客户端,使用 Authorization Code + PKCE,不在客户端保存密钥。
- 按组织的身份体系,把 IAM Identity Center 登录接入相应的联合身份流程。
- 在 AgentCore Gateway 中配置 Cognito 的 JWT issuer 或 discovery 信息,并限制允许的客户端及 scope。
- 为搜索工具设置独立权限,例如
web-search/read,避免一个普通登录令牌获得所有网关工具的调用权。 - 将搜索 API 凭证保存在 Secrets Manager、目标 Lambda 的环境配置或其他服务端密钥存储中。
JWT 校验不能只做 Base64 解码。网关至少应检查:
- 签名是否来自受信任的 JWKS;
iss是否为预期签发者;exp、nbf等时间声明是否有效;scope或自定义权限声明是否包含搜索权限;- token 类型是否正确;
aud或client_id是否与网关策略匹配。
尤其要注意,某些 Cognito access token 使用 client_id 表示客户端,而不一定按开发者预期提供 aud。策略应根据实际 token 类型配置,不能照搬 ID token 的校验规则。面向 API 调用时通常应使用 access token,而不是拿 ID token 代替授权凭证。
先用命令行验证网关
下面是一个可直接改造的冒烟测试。它假设网关提供 MCP 风格的 Streamable HTTP 入口,并支持无状态的 tools/call 请求。请把 GATEWAY_URL、JWT 和工具名替换成实际部署值;如果网关要求先执行 initialize 或维护 Mcp-Session-Id,则需要按返回头补充会话处理。
cat > test-web-search.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
: "${GATEWAY_URL:?Set GATEWAY_URL, for example https://gateway.example.com/mcp}"
: "${ACCESS_TOKEN:?Set ACCESS_TOKEN to a short-lived Cognito access token}"
payload='{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "web_search",
"arguments": {
"query": "Amazon Bedrock AgentCore Gateway latest documentation",
"max_results": 5
}
}
}'
curl --fail-with-body --silent --show-error --no-buffer \
--request POST "$GATEWAY_URL" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--header "Accept: application/json, text/event-stream" \
--data "$payload"
EOF
chmod +x test-web-search.sh
export GATEWAY_URL='https://replace-with-your-gateway.example/mcp'
export ACCESS_TOKEN='replace-with-a-short-lived-access-token'
./test-web-search.sh
测试时不要只检查 HTTP 200,还要确认三件事:无 token 返回 401,权限不足返回 403,合法 token 只能调用被允许的工具。如果过期 token 仍能成功,说明入口认证或缓存策略存在问题。
搜索工具最好返回结构化结果,而不是一整段无法追踪来源的文本。例如:
{
"results": [
{
"title": "Result title",
"url": "https://example.com/page",
"snippet": "A short extract from the page",
"published_at": "2025-01-15T09:00:00Z"
}
]
}
稳定的 title、url、snippet 和时间字段能帮助模型生成引用,也便于后端去重和审计。
将网关接入 Claude Desktop
如果部署的 AgentCore Gateway 暴露 MCP 兼容端点,可以使用支持远程 MCP 的本地连接器。下面配置仅适合开发验证,假设本机已经安装 Node.js,并由 mcp-remote 将 Claude Desktop 的本地 stdio 调用转成远程 HTTPS 请求。
{
"mcpServers": {
"secure-web-search": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://replace-with-your-gateway.example/mcp",
"--header",
"Authorization: Bearer ${WEB_SEARCH_JWT}"
],
"env": {
"WEB_SEARCH_JWT": "replace-with-a-short-lived-access-token"
}
}
}
}
不同版本连接器对环境变量展开和 OAuth 的支持可能不同,运行前应核对其参数格式。静态写入 JWT 只适合短时间联调,因为 token 到期后连接会失效,而且桌面配置文件可能被备份或同步。
生产环境更合理的方式是使用支持 Authorization Code + PKCE 的本地认证辅助程序:打开系统浏览器完成 Identity Center 登录,将 refresh token 放入操作系统钥匙串,并在调用网关前自动刷新 access token。不要把客户端密钥、搜索 API Key 或长期 refresh token直接写进 Claude Desktop 配置。
Web 搜索带来的风险不止是身份认证
JWT 保护的是“谁能调用工具”,却不能保证网页内容可信。搜索结果可能包含提示注入、恶意指令、虚假信息和诱导访问的 URL。建议在搜索目标或网关后端增加以下约束:
- 只返回文本摘要和规范化 URL,不让网页内容直接控制工具调用;
- 限制单次结果数、抓取大小、重定向次数和执行时间;
- 对私有地址、云元数据地址和内网域名做出站拦截,防止 SSRF;
- 对高风险域名使用允许列表或拒绝列表;
- 在日志中记录用户、工具、时间、查询摘要和响应状态,但避免记录完整 JWT 与敏感查询;
- 提示模型把网页视为不可信数据,并要求答案附带来源;
- 对搜索供应商设置超时、重试上限、并发限制和成本配额。
还应把用户输入与工具参数分开验证。比如 max_results 应由服务端限制在一个合理范围内,不能因为模型传入 10000 就执行高成本抓取。
上线前检查清单
接入时可以按以下顺序推进:
- [ ] 搜索目标只暴露必要参数,并返回带 URL 的结构化结果;
- [ ] Cognito 桌面客户端启用 Authorization Code + PKCE,且不使用客户端密钥;
- [ ] AgentCore Gateway 校验签名、issuer、有效期、客户端和 scope;
- [ ] 无 token、错误 scope、过期 token 和错误 issuer 都有明确拒绝测试;
- [ ] 搜索供应商凭证仅存在于服务端;
- [ ] Claude Desktop 端具备安全的 token 刷新与本地存储机制;
- [ ] 出站访问、速率、超时、结果数量和日志脱敏均有限制;
- [ ] 模型回答保留来源,并明确区分搜索事实与模型推断。
这套设计的价值不只是让 Claude Desktop “能上网”。更重要的是,它把实时搜索变成一个有身份、有权限、有审计记录的企业工具。代价是需要维护 OAuth、令牌刷新和搜索目标,但相比把外部 API Key 直接交给桌面客户端,这个边界更清晰,也更适合组织内部推广。