用途
infracost-price-lookup 用于在没有任何现成基础设施代码的情况下查询云资源的费用。它支持 Terraform 和 Infracost 所支持的任何资源类型,覆盖 AWS、GCP 和 Azure。当用户询问“X 要多少钱”这类价格问题时可以使用该技能。
该插件内置一个 MCP 服务器,暴露一个 price 工具。Agent 将一段 Terraform 片段作为字符串传入,工具返回按资源拆分的明细以及一个头条汇总——无需临时文件、无需 stdin 管道、无需解析 JSON。
前置设置
重要:在运行任何价格查询之前,需确认 Infracost CLI 已安装、用户已认证、且已选定组织。
检查 CLI 是否在 PATH 中:
infracost --version
若失败,应告知用户需按 https://www.infracost.io/docs/features/get_started/ 的说明安装 Infracost CLI。
检查用户是否已登录并选定了组织:
infracost auth whoami
若报告用户未认证,请用户在另一个终端窗口中运行 infracost auth login,并在完成后告知。不要自行尝试运行登录命令——它是交互式的。
该输出还会列出用户所属的组织。如果有多个组织且没有任何一个被标记为活跃(其 slug 旁有 ✔),whoami 会在底部打印 “No organization selected” 警告——看到该警告时,CLI 无法在非交互会话中为用户选择组织,后续命令会因“未选择组织”而失败。应询问用户本次会话想使用哪个组织,然后用以下方式之一应用其选择(按 Agent 使用场景的优先级排序):
- 在后续每条 infracost 命令上传递
--org <slug>——仅作用于当前调用。 - 或设置
export INFRACOST_CLI_ORG=<slug>,作用于当前 shell 会话的后续部分。 - 或运行一次
infracost org switch <slug>全局保存该选择(仅在用户明确希望更改默认值时),或运行infracost org switch <slug> --repo将其固定到当前仓库。
单组织用户无需此步骤——CLI 会自动选择。
若后续命令因“未选择组织”失败,错误信息会内联列出可用的 slug;此时回到上一步,用上述方法之一应用用户的选择后重试。
工作流程
1. 编写最小化的 Terraform
为用户所询问的资源合成一段简短的 Terraform 片段。规则:
- 仅保留最小配置——不要 backend、不要变量文件、不要 outputs、不要 data source。只需一个 provider 块和资源块。
- 包含影响计价的属性——实例类型、存储大小/类型、引擎版本、吞吐量、IOPS 等。这些是改变价格的开关,必须存在。
- 使用用户指定的配置——若用户要求“m5.xlarge 配 100GB gp3”,就照写;若用户问得笼统(“一个 RDS 实例多少钱?”),则选择合理的默认值并明确说明所选内容。
- 设置区域——使用用户要求的区域,或默认 us-east-1 并说明。
- 允许多个资源——若用户询问多种资源类型,将它们放进同一片段。
- 使用有意义的命名——如 aws_instance.web_server,而非 aws_instance.example,以便输出更易读。
2. 调用 price MCP 工具
将 Terraform 作为 iac 字段传入:
price(iac="""
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "m5.xlarge"
root_block_device {
volume_size = 100
volume_type = "gp3"
}
}
""")
非美元货币请传入 currency 字段(ISO 4217 代码——EUR、GBP、JPY、CAD、AUD 等):
price(iac="...", currency="EUR")
若用户未指定货币,工具使用组织配置的默认值(通常为 USD)。
3. 读取结果
price 返回:
- currency——当前使用的 ISO 代码。
- summary——头条计数(资源数量、月费用等)——与 scan 返回的结构相同。
- resources[]——传入的每个顶层资源一行,包含:
- name、type、is_supported、is_free
- total_monthly_cost——已跨费用组件及任何嵌套子资源预汇总(例如 EKS NodeGroup 的 LaunchTemplate + EBS 卷会折叠进父资源总额)。
- cost_components[]——按组件拆分(vCPU、存储、IOPS 等),含单位、单价、数量及月费用。
- tags、supports_tags、supports_default_tags、metadata(文件名 + 合成的 Terraform 中的行号)。
与 scan 不同,price 始终包含按资源的列表——因为 Agent 刚刚提交了 IaC,返回该列表的成本固定且很小。
4. 可选:用 inspect 工具深入分析
price 结果会像 scan 结果一样缓存在 MCP 会话中。若想以不同方式呈现数据(例如按类型分组、按成本取前 N),可调用任意 inspect_* 工具——它们默认都读取最新缓存结果:
- inspect_summary——同样的 summary 块,但通过 inspect 过滤管线重建(可投影到特定字段或按 project / provider 限定范围)。
- inspect_top_savings(n=5)——在已计价资源上的前 N 个 FinOps 节省机会(若有)。
- inspect_resources(group_by=["type"])——按类型、provider 等聚合资源列表。
当片段很小时,这些相比直接读取 resources[] 很少带来额外价值,但对于“这上面前 5 大节省会是什么?”这类追问很方便。
呈现结果
- 以月费用开头——这是用户想要的信息。
- 先给总月费用,再给按组件拆分。
- 指出基于用量的费用。某些条目(数据传输、请求等)取决于实际用量,使用的是典型默认假设。明确说明估算假设了什么。
- 说明区域。价格因区域而异——始终说明所用的区域。
- 被要求时并排比较。对于“m5.xlarge vs m5.2xlarge”之类问题,一次调用 price 并在 IaC 中同时放入两个资源,呈现对比表格。
- 呈现 FinOps 建议。若结果中显示适用的 FinOps 策略(例如“用 GP3 替代 GP2”“考虑 Graviton”),用潜在节省金额突出显示。
呈现示例:
AWS RDS MySQL — db.r5.xlarge, 100GB gp3
Region: us-east-1
Component
Monthly Cost
Instance (on-demand)
$365.00
Storage (100GB gp3)
$11.50
Total
$376.50
Usage-based costs (estimated):
I/O requests: ~$X/mo based on typical usage
Savings opportunity: Consider Graviton (db.r6g.xlarge) for 20% savings ($73/mo).
重要准则
- 不要提交任何生成的 Terraform——为 price 工具构建的片段是一次性的,绝不写入用户的工作区。
- 除非用户明确要求,否则不要修改 CLI 源代码——本技能用于使用 MCP 服务器。
- 若 price 返回类似“no organizations selected”或“not authenticated”的错误,请将可操作的信息转达给用户——不要盲目重试。MCP 服务器在启动时检查认证 + 组织;运行时错误意味着用户需要采取行动(infracost auth login、infracost org switch <slug>)。
- 若不确定用户所问内容对应的 Terraform 资源名,请查阅而非猜测——错误的资源类型不会产生任何计价数据。