关于 Yaw Labs AWS MCP
Yaw Labs AWS MCP 是一个在本地通过 AWS CLI 调用 AWS API 的 MCP 服务,面向使用 AI 助手管理 AWS 的开发者。它提供通用 API 调用、资源 CRUD、跨区域操作和 SSO 重新登录流程。
主要功能
- 01通过单一工具调用 AWS API
- 02跨 1,300 多种资源执行 CRUD
- 03预览资源变更并检查 IAM 权限
- 04跨区域及多账户批量操作
- 05查询 AWS 文档并运行批处理脚本
- 06通过设备码流程重新登录 SSO
适用场景
- 01让 AI 助手执行 AWS 服务操作
- 02预览资源更新后再应用
- 03在多个区域或账户重复操作
- 04在长时间工作流中刷新 SSO 登录
MCP 相关
该项目是本地 MCP 服务,供 MCP 客户端连接并调用 AWS CLI 支持的 API、资源管理及文档查询工具。通过 MCP 工具也可批量执行脚本工作流。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @yawlabs/aws-mcpAWS_PROFILEAWS profile used when a tool call omits `profile`. Any profile your aws CLI can use (SSO, credential_process, role chaining, static keys). Unset: AWS_DEFAULT_PROFILE, then `default`.AWS_REGIONRegion used when a tool call omits `region`. Unset: AWS_DEFAULT_REGION, then us-east-1 (a profile's own region setting is not read).本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
28收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| region | string | 否 | AWS 区域。默认为 $AWS_REGION 或 us-east-1。 |
| profile | string | 否 | AWS 配置文件名称。默认为 $AWS_PROFILE 或 'default'。 |
详细介绍
@yawlabs/aws-mcp
单击即可将其添加到本地 Yaw MCP 配置中,使其在每个 Yaw Terminal 会话中都可用。也可以在下方手动安装。
这是一款供 AI 助手使用的精简 AWS MCP:一个服务、一条配置项、内置 SSO 重新认证、对 1,300 多种资源类型提供通用 CRUD、实时文档查询,以及用于批量工作流的服务端脚本。
它是 AWS 官方 MCP 服务的替代方案,而非补充——两者都能调用任意 AWS API,因此同时运行会让模型获得两种重叠的方式来完成相同任务。(AWS 对自己的旧版服务也给出了相同建议:其设置指南建议移除它们,“以避免可能混淆 AI Agent 的工具冲突”。)二选一即可。两者覆盖范围重叠,但形式不同。客观比较如下:
- AWS MCP Server —— AWS 托管的服务,自 2026 年 5 月起正式发布,属于 Agent Toolkit for AWS。其优势包括由 AWS 团队精选的技能、服务端 Python 沙箱(
run_script),具备最新的 API 覆盖范围、只读无服务器故障排查能力(Lambdadiagnose、近期变更、X-Ray 跟踪摘要)、用于区分其调用与直接 API 调用的 IAM 条件键,以及按工具划分的 CloudWatch 指标。截至 2026 年 9 月,run_script是它调用 AWS API 的唯一通用方式——单次调用工具call_aws已被移除——因此每次调用,即使只是单次describe,模型都要编写 Python 脚本。端点运行在us-east-1和eu-central-1。有两种连接方式:- OAuth,通过 AWS Sign-in(自 2026 年 7 月起):无需安装任何内容——客户端会打开浏览器并直接连接到端点。每个会话绑定一个 IAM 角色,刷新有效期最长为 12 小时;主体需要拥有
signin:AuthorizeOAuth2Access和signin:CreateOAuth2Token权限。 - SigV4,通过使用
uv运行的本地代理(AWS 指南中的命令为uvx mcp-proxy-for-aws-cli@latest),并使用 AWS CLI 凭证签名(CLI 2.32.0+)。AWS 建议终端和 IDE 编码 Agent 使用此方式;这也是唯一支持在每次调用时切换配置文件的方式,且可切换的配置文件由代理启动时固定的允许列表决定。从 AWS CLI 2.35.0 起,aws configure agent-toolkit会自动将 SigV4 配置项(uvx mcp-proxy-for-aws@latest)写入 Agent 的 MCP 配置,键名为aws-mcp。
- OAuth,通过 AWS Sign-in(自 2026 年 7 月起):无需安装任何内容——客户端会打开浏览器并直接连接到端点。每个会话绑定一个 IAM 角色,刷新有效期最长为 12 小时;主体需要拥有
@yawlabs/aws-mcp(本服务)——通过 npm 安装,在本地使用你自己的awsCLI 和配置文件运行:只需一行npx命令,无需uv、代理或托管中转。它在 SSO 重新登录方面更具优势,尤其适用于aws sso login的浏览器跳转失败时(Windows 上尤为常见);每次工具调用执行一个 AWS 操作(aws_call接受service、operation和params,因此主机的审批提示会显示操作本身,而不是脚本);还提供便捷的 CCAPI CRUD 和试运行差异、多区域和多账户扇出、IAM 权限预检查,以及在需要批处理时使用的 JS 脚本工具(在进程内运行,并非安全沙箱——详见工具表)。它还内置 AWS 实时文档搜索和页面读取,因此无论选择哪种方案,都不需要另装文档服务——其覆盖内容与官方服务的search_documentation/read_documentation相同,但不包含其主题路由或技能结果。 真正能与任一选择搭配使用的 MCP,是awslabs/mcp中按服务划分的 MCP 服务,它们能实现通用 AWS API 工具无法做到的功能——Bedrock 的 Agentic 知识库检索就是最典型的例子(参见配套配置)。AWS 现在称该仓库已由 Agent Toolkit for AWS 接替;它仍可使用,也接受贡献,但其中一些 MCP 服务已弃用或被取代——包括其通用 AWS API 服务,因此添加前请先查看相应 MCP 服务的 README。
该服务力求妥善处理五件事:
- SSO 重新登录。 当会话中的令牌过期时,
aws sso login会尝试从子进程打开浏览器——在 Windows 上(有时也会在其他环境中),这类跳转会悄无声息地失败。你只能切换到终端,自己运行命令,然后再切回来。--no-browser设备代码流程解决了这个问题:助手会显示一个简短 URL 和代码,点击一次即可完成。(单独使用--no-browser已经不够了——AWS CLI 2.22.0 将 PKCE 授权码流程设为默认流程,而且不会打印短代码——因此此服务会将其与--use-device-code配合使用,并探测一次aws --version,以兼容 2.22 之前的 CLI。)此外,aws_refresh_if_expiring_soon还可以在较长的工作流开始前主动续期。AWS 的托管服务绕开了这个问题,而不是解决它。在其 OAuth 流程中,MCP 客户端会运行自己的浏览器登录,令牌会绑定到该客户端和该服务,因此机器上的其他程序无法受益;在其 SigV4 流程中,AWS 的故障排查表会让 SSO 用户自行运行aws sso login,然后重启 MCP 客户端。在这里,重新登录会刷新同一个~/.aws/sso/cache令牌,CLI、SDK 和机器上的所有其他工具读取的都是它。 - 调用任意 AWS API。
aws_call直接代理awsCLI。一个工具就能覆盖完整的 API 面——包括 AWS 明天新增的服务——无需打包 SDK,也不会造成每个服务都要单独配一组工具的泛滥。这并非空谈:2026 年 9 月新增的功能——AWS Batch 批量cancel-jobs/terminate-jobs(CLI 2.36.44)、STS 会话令牌大小字段(2.36.45)、Elastic Beanstalk 集群环境(2.36.47)、“Tunnel” VPC 终端节点(2.36.48)——只要本地awsCLI 支持,就能立即使用,无需升级@yawlabs/aws-mcp。如果 CLI 太旧,不支持某项操作,就会在发送任何内容之前拒绝该操作,并提示升级。aws_paginate处理分页的列表/描述操作,aws_multi_region并行地将同一操作分发到 N 个区域,JMESPathquery参数则可在服务端精简响应。应尽早使用这些工具,不要等到此服务的 5 MB 输出上限:MCP 宿主很快就会先行截断——Claude Code 会在 10,000 个令牌时发出警告,并且默认会将任何超过 25,000 个令牌的结果保存到文件中,供模型读回。 - 跨服务的通用 CRUD。
aws_resource_*(七个工具,包括用于预览试运行结果的aws_resource_diff)封装了 AWS Cloud Control API,因此,对于任何具有 CloudFormation 架构的控制平面资源,都可以使用同一生命周期——获取/列出/创建/更新/删除/查看状态:Lambda 函数、S3 存储桶、IAM 角色、SSM 参数、RDS 实例,以及 AWS 发布列表中的其余 1,300 种类型(并非每种类型都支持每种操作)。传入awaitCompletion: true,服务就会为你轮询异步创建/更新/删除操作,直到进入终止状态。AWS Labs 于 2026 年 3 月弃用了自己的 Cloud Control API MCP 服务,迁移指南也没有列出资源获取/列出/创建/更新/删除操作的直接替代方案:后继方案改为编写 CloudFormation 和 CDK。在数据平面上,DynamoDBget-item/query和 Bedrockconverse都是aws_call可以处理的普通操作(DynamoDB 的值仍保留在其类型化 JSON 中,如{"S": "..."}),Lambda 调用则有专用工具aws_lambda_invoke。有三类操作无法通过aws_call执行:将响应正文写入位置参数指定的输出文件的操作(S3get-object、Bedrockinvoke-model);CLI 手写的命令,这些命令未注册--cli-input-json(s3 cp/ls/sync、logs tail、cloudformation deploy);以及 CLI 完全未提供的事件流操作(Bedrockconverse-stream、invoke-agent、Agent 知识库检索)。 - 实时 AWS 文档。
aws_docs_search会查询与 docs.aws.amazon.com 搜索框相同的后端;aws_docs_read会获取文档页面并以分页 Markdown 格式返回。无需安装第二个 MCP 服务,Agent 就能发现新服务并查找准确的参数名称。 - 一次往返处理批量工作流。
aws_script会在node:vm上下文中运行一段简短的 JS 代码片段,并提供aws.call、aws.paginate、aws.paginateAll、aws.resource.*、aws.logsTail、aws.metricsQuery、aws.iamSimulate、aws.multiRegion、aws.assumeRole和aws.docs.{search,read}。最适合“列出 X、为每项获取 Y、返回 Z”这类原本需要调用 N 次工具的流水线。它与 AWS 的run_script(Python,在服务端沙箱中运行)思路相同;run_script目前是该服务调用 AWS API 的唯一通用方式。这里的aws_script则是批处理选项——使用原生 JS,在本地运行——单项操作则使用aws_call。
可选配套:AWS Labs 按服务划分的服务
对于通用 AWS API 工具无法完成的工作,可在此工具之外添加相关的 awslabs/mcp 服务。Bedrock 的 Agentic 知识库检索是最典型的情况:它会调用 AgenticRetrieveStream,这是 AWS CLI 命令表中未列出的事件流操作,因此任何基于 CLI 的工具——包括 aws_call——都无法访问它。(普通检索 bedrock-agent-runtime retrieve 是常规的 aws_call 操作。)这些是通过 uvx 运行的 Python 服务,并且工具名称与此工具没有重叠,因此可以轻松搭配使用:
{
"mcpServers": {
"aws": {
"command": "npx",
"args": ["-y", "@yawlabs/aws-mcp@latest"]
},
"aws-bedrock-kb": {
"command": "uvx",
"args": ["awslabs.bedrock-kb-retrieval-mcp-server@latest"],
"env": { "AWS_PROFILE": "my-profile", "AWS_REGION": "us-east-1" }
}
}
}
其 Agentic 工具适用于托管知识库,并且默认情况下,服务只会列出带有 mcp-multirag-kb=true 标签的知识库;其 README 介绍了标签和 IAM 权限。请勿使用旧版 awslabs.lambda-mcp-server:它的每个版本都已从 PyPI 撤回,而且这里已内置 Lambda 调用工具 aws_lambda_invoke。
何时选择此工具,而不是其他 AWS MCP
| 需求 | 最佳选择 |
|---|---|
仅通过 Node/npm 安装,在本地使用自己的 aws CLI 和配置文件运行(无需 uv、无需代理) | @yawlabs/aws-mcp |
| 本地不安装任何内容(远程服务,通过浏览器登录) | AWS MCP Server(OAuth) |
| 在 Windows 上重新登录 SSO 时遇到问题 / 浏览器交接故障,并为机器上的所有工具统一修复 | @yawlabs/aws-mcp(aws_login_start 设备码流程) |
每次工具调用执行一个 AWS 操作——审批提示会显示 service、operation 和 params,而不是脚本 | @yawlabs/aws-mcp(aws_call) |
| 跨 1,300 多种资源类型执行通用 CRUD 操作 | @yawlabs/aws-mcp(aws_resource_*) |
| 应用更新前先试运行 | @yawlabs/aws-mcp(aws_resource_diff) |
| 一次调用分发到多个区域 | @yawlabs/aws-mcp(aws_multi_region) |
| 一次调用对多个账户执行相同操作 | @yawlabs/aws-mcp(aws_multi_account) |
| 将 N 次工具调用批量合并为一次往返(JS) | @yawlabs/aws-mcp(aws_script) |
| 尝试操作前检查 IAM 权限 | @yawlabs/aws-mcp(aws_iam_simulate) |
| 在一个会话中跨账户 / 跨角色操作 | 任一方案——此服务每次调用都可以指定任意已配置的 profile,并通过 aws_assume_role 支持 STS 角色链;AWS 的服务每次调用只支持一个配置文件,且仅使用 SigV4,该配置文件必须在其代理启动时声明(OAuth 会话仅对应一个角色) |
| 在服务端执行沙盒化 Python 脚本 | AWS MCP Server(run_script) |
| 通过托管端点获取数日前仍为最新的 API 覆盖 | AWS MCP Server(run_script) |
| 由 AWS 团队精选的最佳实践技能 | AWS MCP Server(retrieve_skill) |
| 引导式 Lambda 故障排查(诊断、近期更改、跟踪摘要) | AWS MCP Server(无服务器能力) |
| 为基于 CLI 的工具无法访问的功能提供按服务划分的类型化辅助工具(Bedrock Agentic 知识库检索,……) | awslabs/mcp(按服务划分的服务) |
@yawlabs/aws-mcp 和 AWS 官方服务是二选一的方案——请选择最符合你需求的方案。awslabs/mcp 的按服务划分的服务可以与任一方案轻松搭配使用。
此服务借鉴了 AWS 官方服务的哪些功能
功劳应归于应得之人——这里有两项功能是根据 AWS 官方 MCP 服务设计的:
aws_script与官方服务的run_script类似:这是一种脚本工具,可将“列出 X、逐个获取 Y、返回 Z”的流程合并为一次往返调用。官方服务使用 Python,在服务端进行沙箱隔离,如今这是该服务唯一的通用 API 调用方式;本服务则原生使用 JS,在本服务自己的进程中运行——请参阅工具表中的信任说明——并与aws_call并存,而非取而代之。aws_docs_search/aws_docs_read的加入,让你无论选择哪个服务,都不必另行使用文档 MCP。它们涵盖的内容与官方服务的search_documentation/read_documentation相同——实时搜索和页面读取——但不包含其主题路由或技能结果。
其余功能——SSO 设备代码重新登录、支持试运行差异对比的 CCAPI CRUD、多区域扇出、IAM 前置检查——均为本服务独有。
工具
| 工具 | 功能 |
|---|---|
aws_whoami | 当前身份(账户、ARN)以及 SSO 令牌过期倒计时。请先调用此工具。 |
aws_login_start | 启动 aws sso login --no-browser --use-device-code,返回验证 URL、短代码和 sessionId。(对于早于 2.22.0 的 AWS CLI,会省略 --use-device-code,因为设备授权模式已是默认设置。) |
aws_login_complete | 阻塞等待 SSO 子进程完成(你需要在浏览器中进行身份验证),然后返回新身份。 |
aws_refresh_if_expiring_soon | 检查缓存的 SSO 令牌,并在剩余时间少于 thresholdMinutes 时(默认值为 10)自动启动刷新。一次往返即可完成“我的令牌是否即将过期?如果是,就重新登录。” |
aws_session_set | 为本次 MCP 会话的其余时间设置默认配置文件和/或区域。“切换到 prod”“使用 us-west-2”。 |
aws_session_get | 显示当前会话默认值,以及各值的来源(session/env/default)。 |
aws_session_clear | 移除会话配置文件/区域覆盖设置,让环境变量/默认值重新生效。不带参数时会清除两者。 |
aws_list_profiles | 列出 ~/.aws/config 中配置的配置文件,包括名称、区域和 SSO 元数据。在切换配置文件之前,或 SSO 错误提到一个你尚未见过的配置文件时使用。 |
aws_assume_role | 使用当前身份调用 STS AssumeRole,并将临时凭证保存为 ~/.aws/credentials 中的新配置文件(mcp-<sessionName>)。用于跨账户访问。密钥/会话令牌会保留在磁盘上,不会返回给模型。可选的 timeoutMs(默认 120s)用于处理较慢的 SAML/credential_process 冷启动。 |
aws_call | 运行任意 AWS API 操作。service: 's3api', operation: 'list-buckets',可选的 params(PascalCase JSON)和可选的 query(JMESPath)。返回解析后的 JSON。手写的 CLI 命令(s3 cp/ls/sync、logs tail)以及将响应流式写入文件的操作(s3api get-object、bedrock-runtime invoke-model、bedrock-agentcore invoke-agent-runtime、lambda invoke)永远不接受 --cli-input-json,因此 aws_call 无法调用它们;错误信息会说明原因并指出替代方式(aws_lambda_invoke、aws_logs_tail、bedrock-runtime converse 或 shell)。Waiter 可通过 operation: 'wait <name>' 使用。Blob 类型的参数需使用 base64。 |
aws_paginate | 获取分页列表/描述操作的一页结果。也支持 query。返回 nextToken/hasMore;使用令牌再次调用即可继续获取。 |
aws_logs_tail | 获取一个日志组中最新的 CloudWatch Logs 事件(通过 aws logs filter-log-events 调用 FilterLogEvents),支持 since、filterPattern 和流名称筛选条件;返回按时间从早到晚排列的 {timestamp, logStreamName, message} 对象。结果受 maxEvents 限制(默认值为 500,最大值为 10000):较繁忙的时间窗口会保留最新事件,并报告 truncated: true。在 AWS CLI 2.35.8+ 中,读取操作本身会在达到 maxEvents 后停止,因此截断时 totalEvents 为 null;较旧的 CLI 会扫描整个时间窗口并报告准确数量。接受调用所在区域中的日志组 ARN,并以 logGroupIdentifier 传入,因此跨账户监控账户可以使用源账户 ARN(需要 AWS CLI 2.9.15+)。 |
aws_logs_query | 端到端运行 CloudWatch Logs Insights 查询:调用 StartQuery,轮询 GetQueryResults 直到终止状态,然后返回行;一次调用即可完成,无需分别启动、轮询和解读状态。接受 logGroupNames(1-50 个,可为裸名称或 ARN)、queryString(Logs Insights QL,或通过 queryLanguage 使用 PPL),以及与 aws_metrics_query 相同的 startTime/endTime 格式;时间窗口最多为 90 天,limit 默认值为 1000。返回的行会将 API 的 [{field, value}] 对展平为普通对象,并附带 statistics(recordsMatched/recordsScanned/bytesScanned)。费用按扫描的未压缩字节数计算,因此应先缩小时间窗口,再考虑扩大范围。超时或客户端取消时,查询不会停止;会返回 queryId,结果可在 7 天内继续获取。 |
aws_metrics_query | 通过 GetMetricData 查询 CloudWatch 指标(现代的多指标/支持表达式的 API)。传入 queries: [{id, namespace, metricName, dimensions?, statistic?, period?}] 或基于表达式的查询;startTime/endTime 接受 ISO 8601 格式或相对时间简写('15m'、'1h'、'1d')。周期会根据时间范围自动选择。返回 {series: [{id, label?, timestamps, values, period?, statusCode?}], periodSeconds, profile, region, nextToken, hasMore, messages?}(完整的封装结构见 Stability)。 |
aws_resource_get | 通过 Cloud Control API 使用 typeName 和 identifier 读取 AWS 资源(例如 AWS::Lambda::Function 和函数名称)。返回解析后的 Properties。 |
aws_resource_list | 通过 CCAPI 分页列出指定类型的资源。每个条目返回 {identifier, properties},并附带 nextToken/hasMore。 |
aws_resource_create | 通过 CCAPI 创建 AWS 资源。此操作为异步操作,返回顶层的 requestToken 和 operationStatus。传入 awaitCompletion: true 可让服务端轮询至终止状态,并在一次调用中返回结果。 |
aws_resource_update | 通过 CCAPI 使用 RFC 6902 JSON Patch 更新 AWS 资源。异步操作及 awaitCompletion 的用法与创建操作相同。 |
aws_resource_delete | 通过 CCAPI 删除 AWS 资源。异步操作及 awaitCompletion 的用法与创建操作相同。此操作具有破坏性,请先确认 identifier。 |
aws_resource_status | 通过 requestToken 轮询异步 CCAPI 请求。返回当前状态,并将 operationStatus、identifier、errorCode、statusMessage 平铺到顶层(PENDING / IN_PROGRESS / SUCCESS / FAILED / CANCEL_*)。 |
aws_resource_diff | 对 CCAPI 更新执行试运行:获取当前状态,在内存中模拟 JSON Patch,并返回 {before, after, changes[]}。不会向 AWS 发送任何变更。支持 RFC 6902 的 add/remove/replace 子集;add 会自动创建缺失的对象父级,以匹配 CCAPI 的实际更新语义(因此即使 /Environment/Variables 尚不存在,像 /Environment/Variables/NEW_KEY 这样的补丁也能正常使用)。changes[i].after 反映第 i 个操作产生的结果(而非补丁完成后的最终状态),因此可以正确读取对同一路径执行的一系列操作。如果你想确认补丁是否会达到预期效果,请在调用 aws_resource_update 前先调用此工具。 |
aws_multi_region | 并行跨 N 个区域运行相同的 AWS 操作。结构与 aws_call 相同,但需传入 regions: string[]。返回 {region, ok, data?, error?}[],并附带 okCount/errorCount。部分失败属于预期情况(服务并非在所有区域都可用,权限也可能按区域限定)。每次调用最多支持 64 个区域,同时最多有 32 个请求在执行。 |
aws_multi_account | 并行跨 N 个账户运行相同的 AWS 操作,并在每个账户中担任 roleName。每个账户的凭证在整个调用期间都保留在内存中,并传递给该次启动的进程,不会写入 ~/.aws/credentials。与之相反,使用 aws_assume_role 循环要么会为每个账户写入一个配置节,要么会反复覆盖同一配置节(如果遍历过程中途失败,还会将有效密钥留在磁盘上)。返回结构与 aws_multi_region 相同,只是用 accountId 替代 region;同样包含 5 MB 总量上限,且 okCount/errorCount 会在截断前计算。部分失败属于预期情况:某些账户中可能不存在该角色。 |
aws_script | 运行一段简短的 JS 代码片段,用于编排其他工具并返回组合结果。沙箱提供 aws.call、aws.paginate、aws.paginateAll、aws.resource.{get,list,create,update,delete,status}、aws.logsTail、aws.metricsQuery、aws.iamSimulate、aws.multiRegion、aws.assumeRole、aws.docs.{search,read},以及标准 JS 内置对象(JSON、Math、Date、Promise 等)和 console。上下文中不会绑定 require/import/process/fs/fetch/定时器。**这不是安全边界:**脚本在此服务自身的进程中运行,且仍可从脚本内部访问主机全局对象,因此 aws_script 的权限严格高于其他工具——其他工具受 AWS 和你的 IAM 策略限制,而此工具不受这些限制。只传入你愿意在本机亲自运行的脚本文本,切勿传入来自日志行、资源标签或任何其他 AWS 响应的文本。适用于“列出 X、为每项获取 Y、返回 Z”这类原本需要 N 次往返的流水线。使用 return <value> 返回结果。 |
aws_iam_simulate | 模拟主体的 IAM 权限:主体 X 能否对资源 Z 执行操作 Y?此工具封装 iam simulate-principal-policy。每个(操作、资源)组合返回一条结果;如果省略 resources,则每个操作只返回一条资源为 * 的结果。结果包含 decision(allowed / explicitDeny / implicitDeny / unknown)、matchedStatementIds(决定结果的 IAM 语句)、missingContextValues(策略需要但你未提供的上下文键)、permissionsBoundaryDecision 和 organizationsDecision(AWS 按操作报告的值)。SCP 拒绝不会指出其语句,且仅由 SCP 引用的键不会报告为缺失——请在 contextEntries 中传入 aws:RequestedRegion 等值。“allowed”是必要条件,但并非充分条件:RCP、目标资源自身的策略、会话策略和 VPC 端点策略都不会纳入评估。请传入 IAM 角色 ARN,而非 aws_whoami 显示的 STS 会话 ARN。在有风险的操作之前使用,以避免收到 403;它可与 aws_call 失败后的 Suggestion 配合使用。调用方需要拥有 iam:SimulatePrincipalPolicy 权限。 |
aws_lambda_invoke | 同步调用 Lambda 函数,并返回其响应负载以及解码后的执行日志尾部。aws_call 从结构上无法执行此操作——aws lambda invoke 要求将响应正文作为必需的位置输出文件传入,并且会拒绝 --cli-input-json——因此这是无需再运行第二个(Python)MCP 服务即可使用的唯一 Lambda 调用方式。解码后的 logTail 将通常需要的“调用 → 查找日志组 → 获取日志尾部 → 希望日志窗口能覆盖它”流程合并为一次调用。非空的 functionError 表示函数的 HANDLER 抛出了异常:调用本身仍然成功,因此 ok 为 true,抛出的错误会出现在 payload 中。调用最多只会发送一次:此工具会关闭 CLI 的自动重试,因为重试会再次运行函数。timeoutMs 是等待函数的时长(默认值为 60s,最大为 900000)。被限流的调用并未运行,可以安全重试;发生超时后,错误信息会说明调用是否已发送。 |
aws_docs_search | 搜索 AWS 实时文档(即 docs.aws.amazon.com 搜索框背后的服务)。返回按相关度排序的 {title, url, summary, excerpt}。每条结果还包含本地计算的 lexicalMatch,响应则包含 queryTerms / termsMatchedNowhere / bestLexicalOverlap / lowRelevance——该服务总会返回一整页模糊匹配结果,且不会说明“没有合适的匹配项”,因此这些值是判断查询是否一无所获的唯一信号。可用于查找模型可能不熟悉的服务/API/概念的相关文档页面,例如新服务、近期变更的 API 和确切的参数名称。 |
aws_docs_read | 获取 https://docs.aws.amazon.com/...html 页面并以 Markdown 格式返回。会移除导航栏/Cookie 横幅/反馈等界面元素。长页面可通过 startIndex 和 maxLength 分页;响应会附带 hasMore 和 nextStartIndex。通常传入从 aws_docs_search 获取的 URL。 |
安装
添加到 MCP 客户端配置中(例如 .mcp.json):
{
"mcpServers": {
"aws": {
"command": "npx",
"args": ["-y", "@yawlabs/aws-mcp@latest"]
}
}
}
请保留键名 aws(不要使用 aws-mcp 以外的名称)。AWS 的 aws configure agent-toolkit 向导会使用 aws-mcp 注册其托管服务,并且会将已有的 aws-mcp 条目报告为已配置,而不会检查该条目运行的内容。
-y 标志可实现每次会话加载时自动更新:每次 MCP 客户端启动该服务时,npx 都会检查注册表中的最新 @yawlabs/aws-mcp,并在有更新时下载。首次在全新缓存中启动会增加约 100-500 ms;后续启动会使用 npm 缓存(元数据的典型新鲜度窗口:5 min),增加约 50 ms 或更少。服务启动后,工具调用不会产生自动更新开销——检查仅在启动或重新启动时触发。无需单独安装;-y 同时涵盖首次安装和后续更新。
如果你更愿意固定特定版本(不自动更新,但启动时完全没有开销),请全局安装,并将配置指向已安装的二进制文件:
npm install -g @yawlabs/aws-mcp
{
"mcpServers": {
"aws": {
"command": "aws-mcp"
}
}
}
需要新版本时,你必须手动运行 npm install -g @yawlabs/aws-mcp@latest。
会话示例
你让助手检查一个暂存存储桶,但 SSO 令牌刚好过期。助手会怎么做(以及你会看到什么):
You: "How many objects are in the staging-artifacts bucket right now?"
Claude: (calls aws_whoami) -> SSO session expired for profile 'staging'.
(calls aws_login_start with profile='staging')
"Your SSO token expired. Open
https://device.sso.us-east-1.amazonaws.com/
and enter code: ABCD-EFGH
I'll wait."
You: *click, authenticate in your browser*
Claude: (calls aws_login_complete with the sessionId)
(calls aws_call with service='s3api', operation='list-objects-v2',
params={ Bucket: 'staging-artifacts' },
query='KeyCount')
"There are 4,182 objects in staging-artifacts."
SSO 流程只需点击一次。无需切换上下文,想着“浏览器没打开,让我在终端里运行”。
对于更长的列表——任何可能超过 MCP 主机输出限制的内容(该限制远低于此服务的 5 MB 上限)——助手会使用 aws_paginate:
(calls aws_paginate with service='ec2', operation='describe-instances',
maxItems=50,
query='Reservations[].Instances[].{Id:InstanceId,State:State.Name}')
-> returns one page + a nextToken; Claude calls again until hasMore=false
query(JMESPath)会在服务端精简响应——如果只需要两个字段,典型的 describe-instances 结果会从数 MB 缩减到数 KB。
对于“创建此资源并在就绪时告知我”,aws_resource_create 配合 awaitCompletion: true,可将常见的“创建后轮询”循环合并为一次工具调用:
(calls aws_resource_create with
typeName='AWS::SSM::Parameter',
desiredState={Name: '/my/param', Type: 'String', Value: 'hello'},
awaitCompletion: true)
-> server polls get-resource-request-status until SUCCESS / FAILED / CANCEL_COMPLETE
and returns the terminal ProgressEvent in one call
aws_resource_update 和 aws_resource_delete 也采用相同的形式。省略 awaitCompletion(或将其设为 false),即可使用默认的触发后轮询行为——适合启动长时间运行的更新、稍后再查看的情况。
对于“应用之前先预览补丁”:
(calls aws_resource_diff with
typeName='AWS::Lambda::Function',
identifier='my-fn',
patchDocument=[{op: 'replace', path: '/MemorySize', value: 1024}])
-> returns { before: {MemorySize: 256, ...}, after: {MemorySize: 1024, ...},
changes: [{op: 'replace', path: '/MemorySize', before: 256, after: 1024}] }
不会向 AWS 发送任何更改;Agent 可以在调用 aws_resource_update 前验证补丁。
对于批处理工作流,aws_script 可将 N 次工具调用合并为一次:
(calls aws_script with code=`
const listed = await aws.resource.list({ typeName: "AWS::Lambda::Function" });
const big = [];
for (const r of listed.resources) {
const cfg = await aws.resource.get({
typeName: "AWS::Lambda::Function", identifier: r.identifier });
if (cfg.properties.MemorySize > 1024) {
big.push({ name: cfg.properties.FunctionName, mem: cfg.properties.MemorySize });
}
}
return big;
`)
-> one round-trip; the agent gets the filtered list without N intermediate tool calls
对于多区域读取:
(calls aws_multi_region with
service='ec2', operation='describe-instances',
regions=['us-east-1','us-west-2','eu-west-1'],
query='Reservations[].Instances[].InstanceId')
-> {okCount: 3, errorCount: 0, results: [{region, ok, data}, ...]}
要求
- Node.js 22+(或 oam.js——参见 运行时)
PATH中有 AWS CLI v2。所有与 AWS 通信的工具都会调用它(除aws_docs_*、aws_session_*和aws_list_profiles外),因此你安装的 CLI 决定了可访问的服务、操作和参数。不强制要求最低版本:- 建议使用 2.22.0+。 该版本新增了
--use-device-code,此服务需要它来确保 SSO 短代码流程正常工作。较旧的 2.x 版本仍可使用——服务会检测版本并进行适配。 - 基于 2.34.3 开发并测试。 CLI 本身会在发送请求前拒绝任何比你的 CLI 更新的内容:未知服务或操作会显示为“invalid choice”(错误随后会提示升级),新参数则显示为
Unknown parameter in input。对于通过 AWS 安装程序或安装脚本安装的 CLI,可使用aws update(CLI 2.36.0+)升级;否则请使用安装程序或你的软件包管理器。 - 安全性,截至 2026-09: CLI 2.35.3 或更高版本已修复所有已公布的 AWS CLI v2 安全公告(GHSA-747p-wmpv-9c78、CVE-2026-13769、CVE-2026-18654)。此服务无法触及任何受影响路径:这四个命令(
emr ssh/socks/put/get、codeartifact login、deploy register、iam create-virtual-mfa-device)都没有注册--cli-input-json,而aws_call只有通过它才会传递参数;第三项安全公告涉及选择启用的cli_history数据库,此服务从未启用该功能。不过,你确实会与计算机上的其他程序共用这个 CLI 安装。建议查看安全公告列表,确认是否有更新的公告:v2 以安装程序的形式发布,因此依赖项扫描器永远不会报告它。 - 不支持 AWS CLI v1;它于 2026-07-15 进入维护模式,并将于 2027-07-15 终止支持。
- 建议使用 2.22.0+。 该版本新增了
- CLI 已可使用的 AWS 配置文件——请参见 环境,了解如何选择配置文件。SSO / IAM Identity Center 配置文件还可以使用设备代码重新登录工具。
运行时
此服务可在 oam.js 和 Node 上未经修改地运行,并且
启动器绝不会在低于 0.18.0 的 oam 上提供服务,而是选择能找到的、
达到或高于该最低版本的最新 oam 二进制文件。已在 oam 0.18.0
(aarch64-pc-windows-msvc)上验证:完成列出全部 28 个工具的 MCP
握手、调用本地工具,以及下文所述的 aws_script 沙盒行为。
oam 0.18.0 是最低版本。 启动器会选择能找到的、达到或高于该版本的最新
oam,绝不会在更旧的版本上提供服务;如果找不到,则回退到 Node
(AWS_MCP_RUNTIME=oam 会将其变为硬性错误)。此处设置最低版本很重要:
0.9.0 之前的版本会通过 shell 执行 child_process.execFile 的参数,
会接受 exec 的 timeout 但忽略它,并会将 stdio: 'inherit' 当作
'pipe' 处理;而此服务几乎每次调用工具都会通过 shell 调用 aws CLI。
要在 oam 下运行,请将 MCP 客户端的 command 指向它:
{
"mcpServers": {
"aws": {
"command": "oam",
"args": ["run", "/path/to/aws-mcp/dist/index.js"],
"env": { "AWS_PROFILE": "my-sso-profile", "AWS_REGION": "us-west-2" }
}
}
}
请在自己的硬件上测量启动时间。 MCP 客户端每个会话都会冷启动一次此服务,
因此启动开销才是实际需要付出的成本。以下数据是在 oam 0.8.2 上测得的,
远早于当前的 0.18.0 最低版本,且此后未重新测试,因此请勿将其视为当前排名。
在完成 initialize + tools/list 握手的情况下,10 次预热运行的中位数:
| 运行时 | 冷启动 |
|---|---|
node dist/index.js | 359 ms |
oam run dist/index.js | 650 ms |
oam run src/index.ts(无需构建步骤) | 947 ms |
已发布的 aws-mcp 命令会优先使用它找到的最新 oam(见 Environment 中的 AWS_MCP_RUNTIME)。如果没有安装 oam,几乎不会产生额外开销:发现过程只检查文件是否存在,不会启动子进程;回退方案则会在 npm 已启动的 Node 进程内运行服务。不过,如果安装了 oam,该命令会先启动 Node,对找到的每个 oam 二进制文件运行 --version,以选出最新版本,然后才启动 oam,因此始终比使用上述配置直接将客户端指向 oam 更慢。AWS_MCP_RUNTIME=node 可完全跳过 oam。 |
对于此仓库,还有两处适合使用 oam;两者都需主动选择,且都不会影响已发布的 npm 包:
npm run check:oam—— 通过oam check进行类型检查(原生 TypeScript 7 tsgo)。实测耗时 约 1.0 秒,而tsc --noEmit耗时约 3.8-4.7 秒;两者解析相同的tsconfig.json,检查相同的文件(包括测试文件,这一点已通过在测试文件中故意加入类型错误,并确认两者都会报错验证)。npx tsc --noEmit仍是可移植的默认方案。npm run build:binary:oam—— 通过oam compile构建独立二进制文件。实测在 win32-arm64 上大小为 58.60 MB,其中包括约 493 KB 的嵌入式 V8 字节码。输出到bin/<platform>-<arch>/,由发布暂存脚本处理。如果重新分发此二进制文件,其中包含 oam 运行时,因此请随附 oam 的LICENSE、NOTICE和THIRD_PARTY_LICENSES.md。
源码有意保持与运行时无关:任何地方都没有 oam: 导入,测试也继续使用 node:test。这才确保 Node 回退方案确实可用,而非名义上的支持。
如果在 oam 下运行 aws_script,有一个值得注意的行为差异:Node 会在 node:vm 上下文中遵循 codeGeneration: { strings: false } 设置,因此 eval 和 Function 会抛出异常;oam 则不会,因此它们可以正常使用。针对 oam 0.18.0 重新测量后,这一差异依然存在——在沙箱内,oam 下的 eval('1+1') 返回 2,Function('return 7')() 返回 7;而在 Node 下,两者都会引发 EvalError,因此应将其视为长期存在的差异。不过,重要的隔离措施不受影响:在 oam 下,Function('return this')() 会返回一个全局对象,其中 process 和 require 均为 undefined;Function('return require') 则会抛出异常。因此,脚本无法通过在函数体中编写相同代码做不到的事来获益。aws_script 从来就不是安全边界(见其说明);真正的防护是被遮蔽的全局变量列表,而非该标志。
请注意,任何 oam 调用都会在工作目录的 oam/ 中写入字节码缓存;该目录已列入 .gitignore。
环境
| 变量 | 默认值 | 用途 |
|---|---|---|
AWS_PROFILE / AWS_DEFAULT_PROFILE | default | 工具调用未指定 profile 时使用的配置文件。AWS_DEFAULT_PROFILE 是旧版名称。如果两者均已设置,则优先使用 AWS_PROFILE,与 AWS CLI v2 一致(独立运行的 botocore 和 boto3 会优先检查 AWS_DEFAULT_PROFILE)。空值视为未设置。 |
AWS_REGION / AWS_DEFAULT_REGION | us-east-1 | 工具调用未指定 region 时使用的区域。如果两者均已设置,则优先使用 AWS_REGION。 |
AWS_SHARED_CREDENTIALS_FILE | ~/.aws/credentials | aws_assume_role 写入所创建配置文件的位置。会遵循此设置(并像 botocore 一样展开 ~),确保写入的文件与 CLI 后续读取的文件相同。 |
AWS_MCP_AWS_CLI | 未设置 | 要运行的 aws 可执行文件的绝对路径,用来替代在 PATH 中找到的版本。适用于从 GUI 启动的 MCP 宿主,因为它们通常不会继承 shell 的 PATH;而 AWS 推荐的安装程序现在默认将其安装到 macOS 和 Linux 上的 ~/.local/bin,此类宿主通常无法找到该目录。使用 command -v aws(macOS/Linux)或 where.exe aws(Windows)查找路径。在 Windows 上使用 Git Bash 时,请使用 where.exe aws,而不是 command -v aws:后者会输出 POSIX 风格的路径(/c/Program Files/...),此变量会拒绝该路径,因为它必须是原生绝对路径。此设置适用于所有调用以及 aws sso login。路径必须是绝对路径;在 Windows 上必须指向 aws.exe:没有 shell 就无法启动 .cmd 或 .bat 垫片。若设置的值无法使用,每次调用都会失败,并显示提及此变量的消息,而不会悄悄运行与你配置不同的 CLI。若未设置,服务会遍历 PATH 中的绝对路径目录;绝不会运行工作目录中的 aws。 |
已发布的 aws-mcp 命令运行的启动器(bin/aws-mcp.mjs,也是 npx @yawlabs/aws-mcp 启动的内容)还会读取另外两个变量。它们用于选择运行时,与 AWS 无关;若客户端直接指向 dist/index.js,则会绕过这两个变量。运行在 oam 上会带来哪些变化,请参阅运行时。
| 变量 | 默认值 | 用途 |
|---|---|---|
AWS_MCP_RUNTIME | auto | auto:如果启动器当前运行在 0.18.0 或更高版本的 oam 上,则在该 oam 上提供服务;否则,使用能找到的最新 0.18.0 或更高版本的 oam 二进制文件运行(参见 OAM_BIN);若没有,则使用 Node。如果 oam 宿主版本低于 0.18.0,它绝不会自行运行此服务,而是交由最新的可用 oam 运行;若没有,则交由 PATH 中的 Node 运行;两者都不存在时则报错退出。若 OAM_BIN 无法使用,stderr 会始终指出该变量;只有找不到可用 oam 时,才会指出被跳过的其他 oam 二进制文件。oam:行为相同,但不会回退到 Node,而是报错退出。node:始终使用 Node——在 npx 下进程内运行;客户端通过 oam run 启动命令时,则交由 PATH 中的 Node 运行。不区分大小写,其他任何值都按 auto 处理。 |
OAM_BIN | 未设置 | 优先于自动查找使用的 oam 二进制文件路径,版本必须为 0.18.0 或更高。如果文件不存在、版本较旧或无法运行,启动器会在 stderr 中说明,然后继续自动查找。自动查找会先检查设置了 OAM_INSTALL_DIR 时指定的目录(即 oam 安装程序的目标目录),然后检查已安装位置(Windows 上依次为 %LOCALAPPDATA%\oam\bin 和 ~/.oam/bin;其他系统上为 ~/.oam/bin),再检查 PATH;启动器会向找到的每个 oam 查询其版本,并使用版本最新的一个;若版本相同,则优先使用已安装的副本。在 Windows 上,只有 oam.exe 才算可用;绝不会运行 oam.cmd / oam.bat 垫片,找不到可用 oam 时会在 stderr 中指出该垫片。设置 AWS_MCP_RUNTIME=node 时,或当前已运行在 0.18.0 或更高版本的 oam 上时,此变量会被忽略。 |
服务在每次 aws 调用时设置的内容。 每个 aws 子进程都会获得以下设置,这些设置会覆盖你的 shell 和 ~/.aws/config 中的设置,因为每项都会改变本服务解析的输出:AWS_CLI_ERROR_FORMAT=enhanced(CLI 2.34.0 的 json/yaml/text/table 错误格式会移除 errorKind 分类所读取的 An error occurred (Code) 文本)、AWS_CLI_AUTO_PROMPT=off(自动提示需要控制台,从 MCP 主机发起的每次调用都会失败,包括 aws sso login)、AWS_CLI_OUTPUT_ENCODING=utf-8 和 PYTHONUTF8=1(在 Windows 上,否则 CLI 会使用 ANSI 代码页写入,遇到该代码页之外的任何字符都会失败);在 Windows 上还会设置 NoDefaultCurrentDirectoryInExePath=1(这样 CLI 自己的辅助程序,例如 session-manager-plugin,就绝不会从工作目录运行)。这些是环境变量而非标志,因此不认识其中某个变量的旧版 2.x CLI 会直接忽略它。一个副作用仅影响 Windows:在早于 2.25.0 的 CLI 上,PYTHONUTF8=1 还会让 CLI 以 UTF-8 读取 ~/.aws/config 和 ~/.aws/credentials,因此,以旧版 Windows 代码页保存的文件中若有非 ASCII 字符,就会导致解析失败——请将文件重新保存为 UTF-8,或更新 CLI。在 macOS 和 Linux 上,这里固定该设置没有影响,因为不存在需要切换的 ANSI 代码页:在 linux/arm64 上使用 aws-cli 2.36.49 测得,~/.aws/config 中的 cp1252 字节在 PYTHONUTF8 未设置、设为 =0 和 =1 时,以及在 LC_ALL=C 和 LC_ALL=POSIX 下,都会以相同方式导致解析失败;同一字符若以 UTF-8 编码,则在所有这些情况下都能解析。带有 params 的调用还会传入 --cli-binary-format base64,因此 blob 类型的 params 始终采用 base64 编码,无论你的配置如何。以下设置会有意沿用你的配置:重试模式和最大尝试次数、cli_timestamp_format(在 CLI 中只能通过配置设置;wire 会返回 epoch 数字而非 ISO 字符串)、cli_history,以及端点、代理和 CA 设置。 |
如果你通过 SAML(Okta / Azure AD / ADFS)或自定义的 credential_process 进行身份验证,请将 AWS_PROFILE 设置为对应配置文件。
每次调用都会先解析配置文件名称——显式的工具 profile 参数 -> 由 aws_session_set 设置的会话配置文件 -> $AWS_PROFILE -> $AWS_DEFAULT_PROFILE -> 字面值 default——然后将其作为 --profile <name> 传给 CLI。不存在“无配置文件”模式,只有一个例外:aws_multi_account 仅在其 sts:AssumeRole 调用中使用解析出的配置文件;随后,每个账户的操作都会使用该账户的角色凭证运行,不带 --profile 标志。在选定的配置文件中,CLI 自身的凭证链会照常解析:credential_process、SSO 会话(包括 sso_session 块和内联的 sso_start_url)、通过 source_profile / role_arn 进行角色链式切换、存储在 ~/.aws/credentials 中的静态密钥、容器凭证以及 IMDS。
例外——不会使用环境变量中的静态密钥。 由于始终会显式传入配置文件,botocore 会从凭证链中移除环境变量凭证提供程序,因此不会读取你在 shell 中导出的 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN。(容器凭证和 IMDS 不受影响——它们位于凭证链后续位置,不受配置文件限制。)如需使用静态密钥,请将其放入 ~/.aws/credentials 的某个配置文件段中,并将 AWS_PROFILE 指向该配置文件,而不是导出这些环境变量。
通过代理或使用私有 CA
aws_docs_search 和 aws_docs_read 会从此进程通过 HTTPS 获取内容,因此它们是企业网关会影响的两个工具。现在,报错会指出问题原因,而不是归咎于 AWS 后端;解决方法是在 MCP 配置中添加 env 条目——而不是在 shell 中导出变量,因为下面两个变量都在进程启动时读取,且 MCP 客户端会自行启动服务。
| 变量 | 用途 |
|---|---|
NODE_EXTRA_CA_CERTS | 存放网关 CA 证书的 PEM 文件路径;如果 TLS 拦截导致获取失败,并出现自签名或未知颁发者错误,请使用此变量。 |
NODE_USE_SYSTEM_CA=1 | 使用操作系统的证书存储,而不指定文件(Node 22.19+)。 |
HTTPS_PROXY / https_proxy | 用于获取内容的代理。在 Node 中,除非同时通过 NODE_USE_ENV_PROXY=1 或 --use-env-proxy 启用代理(Node 22.21+,也可在 NODE_OPTIONS 中指定),否则会忽略此变量;否则请求会直接发出,仅允许代理访问的网络则只会超时。在 oam 上运行时,无需启用代理即可使用此变量。 |
AWS CLI 是独立进程,有自己的规则,因此,在同一网关后使用 credential_process、SSO 登录或任何 aws_call,都遵循 AWS CLI 自身的代理配置(HTTP_PROXY / HTTPS_PROXY 和 AWS_CA_BUNDLE),而不是上面的 Node 变量。这类失败现在也会提供相应的解决方法。
如果调用未指定 profile,未调用 aws_session_set,AWS_PROFILE 和 AWS_DEFAULT_PROFILE 均未设置为非空值,并且 ~/.aws/config 和 ~/.aws/credentials 均未定义 default 配置文件,则 CLI 会因 ProfileNotFound 拒绝 --profile default,工具会将其报告为 no_creds 错误。请在 MCP 配置中将 AWS_PROFILE 设置为你平时使用的配置文件。
SSO 登录流程的工作原理
1. Claude calls aws_login_start({ profile: "prod" })
2. Server spawns: aws sso login --no-browser --use-device-code --profile prod
(--use-device-code keeps the CLI on the device grant; without it, 2.22.0+
prints an authorize URL with no short code to surface)
3. Server parses the URL + code from stdout, returns them to Claude
4. Claude surfaces: "Open https://device.sso.us-east-1.amazonaws.com/ and enter ABCD-EFGH"
5. You click — browser opens in your own user session — auth in ~10 seconds
6. Claude calls aws_login_complete({ sessionId })
7. Tool returns your new identity. Back to work.
令牌会缓存到 ~/.aws/sso/cache/<hash>.json,方式与常规的 aws sso login 相同,因此 AWS CLI、SDK 以及你设备上的所有其他工具都能自动读取它。
为什么此服务必须在本地运行(而不能运行在 mcp.hosting 上)
SSO 令牌存放在你的设备上的 ~/.aws/sso/cache/ 中。远程 MCP 服务无法读取这些令牌。因此,这是一个 stdio 服务,而不是托管服务。这是 AWS SSO 的限制,并非 mcp.hosting 的局限。
稳定性
从 1.0 版开始,此软件包遵循语义化版本规范。0.x 系列是稳定前的收紧阶段——重大变更会记录在 CHANGELOG.md 中,但不一定等到主版本号提升后才发布。
1.x 中稳定的内容(以下任何变更均为重大变更,必须提升主版本号):
-
工具名称——上文「工具」表格中列出的 28 个工具名称不会重命名或移除。
-
工具注解——
readOnlyHint、destructiveHint、idempotentHint、openWorldHint。这些注解会告知 MCP 主机如何限制调用;若无提示地更改它们,会破坏主机 UI。请注意保证方向:如果此前的注解低估了工具的能力,补丁版本可以收紧注解(使其更加谨慎)——v2.0.1 正是出于此原因,将aws_call、aws_multi_region和aws_resource_update的destructiveHint设为true。在主版本之外不会放宽这些注解。如果你的主机根据这些注解抑制确认提示,请将aws_call和aws_multi_region视为能够调用调用者的 IAM 身份有权限使用的任何 AWS API,包括删除操作。 -
必需输入字段——各工具的必需字段结构不会更改或移除。可能会添加新的可选字段。
-
各工具成功响应的信封结构——
{ok: true, data}响应中的data对象,具体如下:aws_call->{command, commandArgv, result}aws_paginate->{command, result, nextToken, hasMore}aws_multi_region->{service, operation, regionCount, okCount, errorCount, results: [{region, ok, data?, command?, error?, errorKind?, truncated?}]}(聚合响应有大小上限;超过预算的条目会保留region/ok,但移除data,并标记为truncated: true。错误条目绝不会被移除;okCount/errorCount在截断前计算,因此始终反映调用实际结果,而非截断后保留的内容。)aws_multi_account->{service, operation, roleName, accountCount, okCount, errorCount, results: [{accountId, ok, data?, command?, error?, errorKind?, truncated?}]};达到 5 MB 聚合上限时,还会包含truncated、truncatedAccounts和maxTotalResultBytes。字段与aws_multi_region一一对应,只是用accountId代替region;其中okCount/errorCount同样在截断前计算,因此反映调用实际结果,而非截断后保留的内容。重复的账户 ID 会合并,因此results.length可能小于accounts.length;请使用accountCount。凭证绝不会写入~/.aws/credentials,也不会出现在command、error或rawBody中。aws_whoami->{account, userId, arn, profile, region, ssoToken: {expiresAt, minutesLeft, startUrl?} | null}(如果缓存的令牌未记录startUrl,则省略该字段)aws_login_start->{sessionId, profile, verificationUrl, userCode, instructions, reused?}(为同一配置文件重新展示进行中的登录时,reused: true)aws_login_complete->{loggedIn, account, userId, arn, profile, region, ssoToken}(ssoToken结构与aws_whoami相同,包括可选的startUrl)aws_refresh_if_expiring_soon-> **根据分支返回两种结构之一:**当缓存令牌剩余时间超过thresholdMinutes时,返回{status: "ok", minutesLeft, expiresAt, profile};刷新正在进行时,返回{status: "refreshing", reason, sessionId, profile, verificationUrl, userCode, reused?, instructions}。请根据status判断。aws_assume_role->{profile, credentialsPath, expiration, assumedRoleArn, assumedRoleId, sourceProfile, hint, warning?}(仅当目标配置文件已存在且其三个凭证键被原位覆盖时,才会包含warning;若设置了AWS_SHARED_CREDENTIALS_FILE,credentialsPath会遵循该变量)aws_list_profiles->{configPath, profiles: [{name, region?, ssoStartUrl?, ssoRegion?, ssoSession?, isSso}]}aws_session_get/aws_session_set/aws_session_clear->{profile, region, profileSource, regionSource},其中*Source为"session" | "env" | "default"。三者返回相同结构(set/clear返回变更后的状态)。aws_resource_get->{command, typeName, identifier, properties, propertiesRaw?}aws_resource_list->{command, typeName, resources: [{identifier, properties, propertiesRaw?}], nextToken, hasMore}(如果某条条目的Properties字符串无法解析,就会随该条目返回propertiesRaw,与aws_resource_get一致)aws_resource_create/_update/_delete/_status-> 扁平化提升字段的结构{command, requestToken, operationStatus, identifier, errorCode, statusMessage, retryAfter, progressEvent};传入awaitCompletion: true时,还会包含awaited: {attempts, elapsedMs}块;若传入awaitCompletion: true但未返回可用于轮询的请求令牌,则会包含awaitSkipped字符串aws_resource_diff->{command, typeName, identifier, before, after, changes, changeCount}aws_logs_tail->{command, logGroupName, logGroupIdentifier, since, eventCount, totalEvents, truncated, events}。每个事件的结构为{timestamp, logStreamName, message}:timestamp是带毫秒的 ISO 8601 UTC 时间,message是原样返回的事件文本;如果事件返回时缺少这三个成员中的任何一个,相应值会为null,该事件会保留而非丢弃,因此eventCount与服务返回的事件数一致(实际的 CloudWatch 会发送全部三个字段;行为不同的端点可能不会)。events按时间从旧到新排列,最多包含maxEvents条(默认为 500),并保留最新事件;eventCount是events中的事件数,只有当窗口内事件数更多时,truncated才为true。totalEvents是工具读取完整个窗口时窗口内的事件数;若提前停止,则为null:在 AWS CLI 2.35.8+ 中,读取顺序为从新到旧,事件数超过maxEvents后就会停止,因此截断结果中的totalEvents为null;旧版 CLI 或忽略 FilterLogEvents 的startFromHead的端点会读取整个窗口并报告准确数量。logGroupName始终是纯组名;如果输入为 ARN,logGroupIdentifier是发送给 FilterLogEvents 的 ARN(会移除末尾的:*),否则为null。aws_logs_query->{command, startCommand, profile, region, queryId, status, queryLanguage, logGroupNames, startTime, endTime, fields, rows, rowCount, statistics, truncated, polled: {attempts, elapsedMs}}。在ok: true分支中,status始终为"Complete"——其他所有终止状态(Failed、Cancelled、Timeout、无法识别的状态或缺失状态)都会返回ok: false;maxWaitMs超时和客户端取消也会返回ok: false,两者都会在错误字符串中附带queryId,因为错误信封没有data。command是最后一次get-query-results调用,startCommand是start-query调用(其--cli-input-json负载会经过脱敏,因此不会回显查询文本)。rows是 API 的[{field, value}]数组展平为普通对象后的结果;非字符串值会变为null。fields按首次出现顺序列出所有字段名;logGroupNames是实际查询的解析后纯组名(输入为 ARN 时会提取并回显其名称)。响应未提供queryLanguage或statistics时,对应值为null。当rowCount达到有效的limit时,truncated为true。此工具在任何情况下都不会在 AWS 端停止查询。aws_metrics_query->{command, profile, region, startTime, endTime, periodSeconds, series: [{id, label?, timestamps, values, period?, statusCode?}], nextToken, hasMore, messages?: [{code?, value?}]}(messages为空时会省略;CloudWatch 返回或查询指定/继承了周期时,各序列会包含label/period/statusCode;除非 CloudWatch 截断了响应,否则nextToken为null且hasMore为false)aws_iam_simulate->{command, principalArn, summary: {allowed, denied, unknown, total}, results, marker, hasMore}(results对 IAM 的每个(action, resource)组合各包含一个条目,数据取自 IAM 的ResourceSpecificResults。未传入resources时,每个 action 返回一个resource: "*"条目;对于 AWS 不会按资源拆分结果的 action,则返回一个条目,其中包含 AWS 自身的EvalResourceName(*或该 action 的 ARN 模板)。summary统计条目数。若 AWS 未提供按资源的organizationsDecision和permissionsBoundaryDecision,则回退使用 AWS 的 action 级值;但allowed条目始终读取"allowed"。unknown统计缺失或无法识别决策的条目,避免将格式错误的响应静默归入denied。CLI 会自行处理 IAM 分页,因此首次调用会完整返回——hasMore: false、marker: null;只有从marker继续调用时,两者才会携带游标,此时summary仅统计该页。)aws_lambda_invoke->{command, statusCode, functionError, executedVersion, payload, logTail};仅当响应正文被截断时才会包含payloadTruncated: true(否则省略该字段,使其表示异常标记,而非大小报告)。logTail是函数的LogResult,且已完成 base64 解码。非空的functionError仍然属于ok: true:调用成功,但函数处理程序抛出了错误,抛出的错误位于payload中;调用失败(函数名称错误、无权限、限流或超时)才会返回ok: false。调用绝不会发送多次;errorKind: "timeout"表示未及时收到响应,错误消息会说明调用是否已发送(若已发送,函数可能已经运行或仍在运行)。aws_script->{result, logs, truncatedLogs, durationMs},其中result是脚本return的任意内容(任何可序列化为 JSON 的值,包括undefined)aws_docs_search->{query, count, results: [{title, url, summary?, excerpt?, lexicalMatch}], queryTerms, termsMatchedNowhere?, bestLexicalOverlap, lowRelevance, relevanceNote?}(只有当上游搜索后端返回summary/excerpt时才会包含这些字段。自 2.1.0 起提供的相关性字段由此服务在本地计算:查询词与结果标题/摘要/摘录之间的字面词汇重合度;它不是后端评分,也不是语义排名——只会为结果添加注解,不会重新排序。对于每个结果,lexicalMatch的结构为{overlap, matchedTerms, unmatchedTerms};若查询没有可评分的词,则为null,此时bestLexicalOverlap也为null,且省略termsMatchedNowhere。当最佳结果匹配的查询词不超过一半、任意查询词都未出现在任何结果中,或后端未返回结果时,lowRelevance为true。relevanceNote是对lowRelevance判定或无可评分查询词情况的文字说明;无需说明时省略。)aws_docs_read->{url, cached, content, startIndex, endIndex, totalLength, hasMore, nextStartIndex}
-
错误信封——
{ok: false, error: string, rawBody?: string, errorKind?: string, suggestion?: string}。error字符串面向用户;其措辞尽力而为(见下文),而errorKind是稳定的机器可读部分——请参见下文的枚举。suggestion提供针对已识别 AWS 错误代码的一行解决办法;该内容也会附加在error末尾,因此它是为程序化调用者提供的便利信息,而非额外信息。在传输中,错误结果是一个文本块,errorKind独占首行:先是errorKind: <kind>,接着换行,然后是Error: <message>,再空一行,最后是存在且未被消息引用的rawBody。未分类的失败会完全省略该行,并和之前一样直接以Error:开头。 -
errorKind枚举——"sso_expired" | "expired_creds" | "no_creds" | "invalid_creds" | "bad_input" | "spawn_failure" | "timeout" | "output_too_large" | "malformed_json" | "nonzero_exit" | "unexpected" | "cancelled"。它出现在两个不同的地方,规则各不相同。 在顶层错误信封中,对于每个封装awsCLI 调用的工具——aws_call、aws_paginate、aws_logs_tail、aws_logs_query、aws_metrics_query、aws_iam_simulate、aws_lambda_invoke、aws_assume_role、aws_whoami、aws_login_complete以及aws_resource_*系列。如果失败并未到达 CLI,则此处不会出现errorKind,也不会使用默认值:例如工具自身的输入验证、aws_docs_*的 HTTP 失败、客户端取消轮询。缺少errorKind时,应视为“未分类”,而不是nonzero_exit。在扇出工具
results数组的每个条目中——aws_multi_region和aws_multi_account。失败条目始终带有errorKind,包括从未到达 CLI 的失败:两个工具都会将自身拒绝的条目(格式错误的区域名称、不是 12 位数字的账户 ID)归类为bad_input,并将工作线程抛出异常的条目归类为unexpected。unexpected仅用于扇出场景——不会出现在顶层信封中;cancelled也是如此,它表示客户端在工作线程领取任务前取消了请求,因此该条目从未尝试执行。对于cancelled条目,没有任何内容发送到 AWS;已经运行的条目保留其实际结果,并且数组仍涵盖完整的请求集合,因此okCount/errorCount不会将已取消的扫描误认为规模更小但成功的扫描。可能会添加新变体(仅增补);现有变体不会重命名或改变用途。三种凭证类型有意区分,因为相应的补救措施各不相同:
no_creds表示未找到凭证,invalid_creds表示已解析出凭证,但 AWS 拒绝了它们(密钥轮换后常见),expired_creds表示临时会话已过期。expired_creds不区分来源——AWS 会为 SSO 派生的会话、aws_assume_role会话和 Web 身份会话返回相同的ExpiredToken包装,因此其消息会指出两种补救措施,而不会假定来源是 SSO;sso_expired仅用于明确指出 botocore 的 SSO 令牌提供程序的错误。malformed_json表示标准输出以{或[开头,但解析失败,即响应被截断,而非--query可以合法生成的标量输出。
尽力而为(可能在次要版本或补丁版本中更改):
- 错误消息措辞。 像“配置文件 'X' 的 SSO 会话已过期。请调用 aws_login_start...”这样的字符串可能会调整,以提高清晰度。应以
errorKind或结构化信封为依据,而不是使用正则表达式匹配error文本。 suggestion措辞——根据已识别的 AWS 错误代码生成的一行补救建议。是否提供建议取决于错误代码,但具体句子可能会调整;应根据errorKind分支判断,而不是依据这段文本。该建议也会在error的末尾重复出现,因此同时读取两者的调用方不得重复打印。rawBody内容——底层awsCLI 的原始标准错误/标准输出,仅用于诊断。其格式取决于你安装的版本所使用的 CLI 输出。command字符串——与结果一同显示的人类可读命令。参数数组的顺序和精确的脱敏占位符格式(<redacted len=N>)可能会变化。该字符串适用于运行服务的主机所用的 shell:POSIX shell,或 Windows 上的 PowerShell。它不适用于cmd.exe,因为无论如何引用,&、|和换行符都仍会生效;也不适用于 Windows 上的 Git Bash,因为包含单引号的值会丢失引号,导致传入的内容错误(Buckets[?Name=='prod'].Name是实际可能遇到的情况;它会变成无效的 JMESPath,而不是任何能运行的内容)。 请使用commandArgv,不要解析command。 每个携带command的信封也会携带commandArgv:同一调用的精确、未加引号的词元数组——第 0 项是显示的二进制文件,之后每个参数各占一项——并且会以相同方式进行脱敏,因为字符串是从数组生成的。服务器实际启动的就是它(整个过程中不会涉及 shell),因此无需拆解,也不会被你意料之外的 shell 重新解释。如果需要运行,请按你自己的 shell 语法重新加引号;字符串形式便于阅读,数组才是约定。- 工具的描述——呈现给模型的文字。收紧这些描述不会造成破坏性变更。
**弃用政策:**破坏稳定的结构需要提升主版本号。弃用会先在次版本中引入(旧结构继续有效,同时提供新结构),并计划在下一个主版本中移除。弃用和移除都会记录在 CHANGELOG.md 中。
开发
npm test 会运行单元测试和集成测试。集成测试套件会启动一个本地 fake-aws 子进程来模拟 AWS CLI——无需 AWS 凭证或网络访问。名为 *.realcli.test.ts 的测试套件会将 fake 与真实 CLI 进行对照:它们会驱动 PATH 上的 AWS CLI v2,连接到进程内运行于 127.0.0.1 的端点,使用临时密钥,并将其他所有地址路由到无响应的代理,因此不会有任何流量离开本机。只需启动 CLI 几次的测试会在每次 npm test 时运行;如果未安装 CLI v2,则会跳过。这些会等待真实超时和重试的测试还需要设置 AWS_MCP_REAL_CLI_TESTS=1,该变量由 release.sh 设置。只有由 AWS_MCP_LIVE_TESTS 环境变量控制、需要真实 AWS 凭证的实时测试,才会在标准的 npm test 运行中跳过。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。