关于 AWS Cost Explorer and Amazon Bedrock Model Invocation Logs MCP Server & Client
这是一个 MCP 服务,用于通过 Cost Explorer 和 Amazon Bedrock 模型调用日志分析 AWS 支出。适合希望用自然语言查询云成本与 Bedrock 用量的用户。项目同时提供基于 LangGraph 的客户端示例。
主要功能
- 01查询 EC2 前一日支出
- 02按区域、服务和实例类型细分成本
- 03分析 Bedrock 按区域、用户和模型的用量
- 04支持通过跨账户角色查询其他账户
适用场景
- 01询问上个月各服务的成本变化
- 02查看 Bedrock 最近一周的每日或每小时用量
- 03通过 LangGraph Agent 远程查询 AWS 支出
MCP 相关
该项目是一个 MCP 服务,以 stdio 或 SSE 传输方式运行,向 Claude Desktop 等 MCP 客户端暴露成本与用量查询工具,并附带 LangGraph 客户端示例。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
AWS Cost Explorer 和 Amazon Bedrock 模型调用日志 MCP 服务与客户端
一个通过 Anthropic 的 MCP(Model Control Protocol),在 Amazon CloudWatch 中通过 模型调用日志获取 AWS 支出数据(通过 Cost Explorer)和 Amazon Bedrock 使用数据的 MCP 服务。请参阅“安全的”远程 MCP 服务部分,了解如何通过 HTTPS 运行 MCP 服务。
flowchart LR
User([User]) --> UserApp[User Application]
UserApp --> |Queries| Host[Host]
subgraph "Claude Desktop"
Host --> MCPClient[MCP Client]
end
MCPClient --> |MCP Protocol over HTTPS| MCPServer[AWS Cost Explorer MCP Server]
subgraph "AWS Services"
MCPServer --> |API Calls| CostExplorer[(AWS Cost Explorer)]
MCPServer --> |API Calls| CloudWatchLogs[(AWS CloudWatch Logs)]
end
你可以在本地运行 MCP 服务,并通过 Claude Desktop 访问;也可以在 Amazon EC2 上运行远程 MCP 服务,并通过 LangGraph Agent 内置的 MCP 客户端访问。
🚨只要 MCP 服务使用的 IAM 角色能够在其他账户中代入角色,你也可以使用此 MCP 服务获取其他账户的 AWS 支出信息🚨
演示视频
概述
此工具使用 Anthropic 的 Claude 模型作为交互界面,提供了一种便捷的方式来分析和可视化 AWS 云支出数据。它作为 MCP 服务运行,向 Claude Desktop 提供 AWS Cost Explorer API 功能,让你可以用自然语言询问 AWS 支出情况。
功能
- Amazon EC2 支出分析:查看过去一天的 EC2 支出详细明细
- Amazon Bedrock 支出分析:查看过去 30 天按区域、用户和模型划分的支出明细
- 服务支出报告:分析过去 30 天所有 AWS 服务的支出
- 详细成本明细:按日期、区域、服务和实例类型获取细粒度成本数据
- 交互式界面:通过 Claude 使用自然语言查询成本数据
要求
- Python 3.12
- 具有 Cost Explorer 访问权限的 AWS 凭证
- Anthropic API 访问权限(用于 Claude 集成)
- [可选] Amazon Bedrock 访问权限(用于 LangGraph Agent)
- [可选] 用于运行远程 MCP 服务的 Amazon EC2
安装
-
安装
uv:# On macOS and Linux curl -LsSf https://astral.sh/uv/install.sh | sh# On Windows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"其他安装选项见此处文档。
-
克隆此仓库:(假设之后会更新为指向 aws-samples?)
git clone https://github.com/aarora79/aws-cost-explorer-mcp.git cd aws-cost-explorer-mcp -
设置 Python 虚拟环境并安装依赖项:
uv venv --python 3.12 && source .venv/bin/activate && uv pip install --requirement pyproject.toml -
配置 AWS 凭证:
mkdir -p ~/.aws # Set up your credentials in ~/.aws/credentials and ~/.aws/config如果你使用 AWS IAM Identity Center,请按照文档配置短期凭证。
使用方法
先决条件
- 在 Amazon CloudWatch 中设置模型调用日志。
- 确保所用 IAM 用户/角色对 Amazon Cost Explorer 和 Amazon CloudWatch 具有完整的只读访问权限;MCP 服务需要这些权限才能从相应服务检索数据。 你可以参考此处和此处的示例策略,并根据需要进行修改。
- 若要允许 MCP 服务访问其他账户的 AWS 支出信息,请在启动服务时设置
CROSS_ACCOUNT_ROLE_NAME参数。之后,你可以在与 Agent 交互时提供另一个账户的 AWS 账户 ID,Agent 会将该账户 ID 传递给服务。
本地设置
MCP 使用 stdio 作为传输方式,MCP 服务和客户端都在本地计算机上运行。
启动服务(本地)
运行以下命令启动服务:
export MCP_TRANSPORT=stdio
export BEDROCK_LOG_GROUP_NAME=YOUR_BEDROCK_CW_LOG_GROUP_NAME
export CROSS_ACCOUNT_ROLE_NAME=ROLE_NAME_FOR_THE_ROLE_TO_ASSUME_IN_OTHER_ACCOUNTS # can be ignored if you do not want AWS spend info from other accounts
python server.py
Claude Desktop 配置
有两种方式可在 Claude Desktop 中配置此工具:
选项 1:使用 Docker
将以下内容添加到 Claude Desktop 配置文件中。根据你的操作系统,文件位于以下路径:
- macOS:~/Library/Application Support/Claude/claude_desktop_config.json。
- Windows:%APPDATA%\Claude\claude_desktop_config.json。
- Linux:~/.config/Claude/claude_desktop_config.json。
{
"mcpServers": {
"aws-cost-explorer": {
"command": "docker",
"args": [ "run", "-i", "--rm", "-e", "AWS_ACCESS_KEY_ID", "-e", "AWS_SECRET_ACCESS_KEY", "-e", "AWS_REGION", "-e", "BEDROCK_LOG_GROUP_NAME", "-e", "MCP_TRANSPORT", "-e", "CROSS_ACCOUNT_ROLE_NAME", "aws-cost-explorer-mcp:latest" ],
"env": {
"AWS_ACCESS_KEY_ID": "YOUR_ACCESS_KEY_ID",
"AWS_SECRET_ACCESS_KEY": "YOUR_SECRET_ACCESS_KEY",
"AWS_REGION": "us-east-1",
"BEDROCK_LOG_GROUP_NAME": "YOUR_CLOUDWATCH_BEDROCK_MODEL_INVOCATION_LOG_GROUP_NAME",
"CROSS_ACCOUNT_ROLE_NAME": "ROLE_NAME_FOR_THE_ROLE_TO_ASSUME_IN_OTHER_ACCOUNTS",
"MCP_TRANSPORT": "stdio"
}
}
}
}
IMPORTANT:将
YOUR_ACCESS_KEY_ID和YOUR_SECRET_ACCESS_KEY替换为你实际的 AWS 凭证。切勿将实际凭证提交到版本控制系统。
选项 2:使用 UV(不使用 Docker)
如果你更愿意直接运行服务而不使用 Docker,可以使用 UV:
{
"mcpServers": {
"aws_cost_explorer": {
"command": "uv",
"args": [
"--directory",
"/path/to/aws-cost-explorer-mcp-server",
"run",
"server.py"
],
"env": {
"AWS_ACCESS_KEY_ID": "YOUR_ACCESS_KEY_ID",
"AWS_SECRET_ACCESS_KEY": "YOUR_SECRET_ACCESS_KEY",
"AWS_REGION": "us-east-1",
"BEDROCK_LOG_GROUP_NAME": "YOUR_CLOUDWATCH_BEDROCK_MODEL_INVOCATION_LOG_GROUP_NAME",
"CROSS_ACCOUNT_ROLE_NAME": "ROLE_NAME_FOR_THE_ROLE_TO_ASSUME_IN_OTHER_ACCOUNTS",
"MCP_TRANSPORT": "stdio"
}
}
}
}
请务必将目录路径替换为系统上仓库的实际路径。
远程配置
使用 sse 作为 MCP 的传输方式,MCP 服务运行在 EC2 上,客户端运行在本地计算机上。请注意,Claude Desktop 目前不支持远程 MCP 服务(参见此 GitHub 问题)。
启动服务(远程)
按照上述相同说明,即可在 Amazon EC2 上启动远程 MCP 服务。请确保将 MCP_TRANSPORT 设置为 sse(服务器发送事件),如下所示。请注意,MCP 使用 JSON-RPC 2.0 作为线路格式,因此协议本身不包含授权和身份验证(参见此 GitHub 问题),请勿通过 MCP 发送或接收敏感数据。
使用以下命令运行服务:
export MCP_TRANSPORT=sse
export BEDROCK_LOG_GROUP_NAME=YOUR_BEDROCK_CW_LOG_GROUP_NAME
export CROSS_ACCOUNT_ROLE_NAME=ROLE_NAME_FOR_THE_ROLE_TO_ASSUME_IN_OTHER_ACCOUNTS # can be ignored if you do not want AWS spend info from other accounts
python server.py
- MCP 服务将开始监听 TCP 端口 8000。
- 在与 EC2 实例关联的安全组中配置入站规则,允许从本地计算机(运行 MCP 客户端/基于 LangGraph 的应用)访问 EC2 实例的 TCP 端口 8000。
另请参阅关于运行“安全”远程 MCP 服务的章节,即 MCP 客户端可通过 HTTPS 连接的服务。
使用 CLI MCP 客户端测试
你可以使用 mcp_sse_client.py 脚本测试远程 MCP 服务。运行此脚本会打印 MCP 服务提供的工具列表,以及 get_bedrock_daily_usage_stats 工具的输出。
# set the hostname for your MCP server
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_EC2_HOSTNAME
# or localhost if your MCP server is running locally
# MCP_SERVER_HOSTNAME=localhost
AWS_ACCOUNT_ID=AWS_ACCOUNT_ID_TO_GET_INFO_ABOUT # if set to empty or if the --aws-account-id switch is not specified then it gets the info about the AWS account MCP server is running in
python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --aws-account-id $AWS_ACCOUNT_ID
使用 Chainlit 应用测试
此仓库中的 app.py 文件提供了一个 Chainlit 应用(聊天机器人)。该应用会创建一个 LangGraph Agent,使用 LangChain MCP Adapter 将 MCP 服务提供的工具导入为 LangGraph Agent 中的工具。随后,Agent 可以使用大模型回答用户的问题,并根据需要使用可用工具。因此,如果用户提出“我最近一周的 Bedrock 用量情况如何?”之类的问题,Agent 就会通过远程 MCP 服务使用可用工具来回答。我们使用 Amazon Bedrock 提供的 Claude 3.5 Haiku 模型为此 Agent 提供支持。
使用以下命令运行 Chainlit 应用:
chainlit run app.py --port 8080
浏览器窗口应会在 localhost:8080 打开,你可以使用聊天机器人了解 AWS 费用详情。
可用工具
此服务会公开以下工具供 Claude 使用:
get_ec2_spend_last_day():获取前一天的 EC2 支出数据get_detailed_breakdown_by_day(days=7):按区域、服务和实例类型提供全面的费用分析get_bedrock_daily_usage_stats(days=7, region='us-east-1', log_group_name='BedrockModelInvocationLogGroup'):按区域和用户提供模型用量的每日明细。get_bedrock_hourly_usage_stats(days=7, region='us-east-1', log_group_name='BedrockModelInvocationLogGroup'):按区域和用户提供模型用量的逐日逐小时明细。
示例查询
通过启用了 MCP 的界面连接到 Claude 后,你可以提出如下问题:
- “帮我了解过去几周的 Bedrock 支出”
- “我昨天的 EC2 支出是多少?”
- “列出过去一个月按成本排名前 5 的 AWS 服务”
- “分析过去 14 天各区域的支出”
- “哪些实例类型的费用最高?”
- “哪些服务的月环比成本增幅最大?”
Docker 支持
项目包含一个用于容器化部署的 Dockerfile:
docker build -t aws-cost-explorer-mcp .
docker run -v ~/.aws:/root/.aws aws-cost-explorer-mcp
开发
项目结构
server.py:包含 MCP 工具的主服务实现pyproject.toml:项目依赖和元数据Dockerfile:用于部署的容器定义
添加新的成本分析工具
扩展功能的方法:
- 在
server.py中添加新函数 - 使用
@mcp.tool()为其添加注解 - 实现 AWS Cost Explorer API 调用
- 格式化结果,使其易于阅读
安全的“远程”MCP 服务
我们可以使用 nginx 作为反向代理,为连接 MCP 服务提供 HTTPS 端点。远程 MCP 客户端可以通过 HTTPS 连接到 nginx,然后由它将流量代理到内部的 http://localhost:8000。以下步骤介绍了具体操作方法。
-
在与 EC2 实例关联的安全组入站规则中,允许来自 MCP 客户端 IP 地址(你的笔记本电脑或其他位置)访问 TCP 端口 443。
-
继续操作前,你需要准备 HTTPS 证书和私钥。假设你将
your-mcp-server-domain-name.com用作 MCP 服务的域名,那么你需要为your-mcp-server-domain-name.com准备 SSL 证书,MCP 客户端可通过https://your-mcp-server-domain-name.com/sse访问服务。虽然你可以使用自签名证书,但这需要在 MCP 客户端上禁用 SSL 验证,我们不建议这样做。如果 MCP 服务托管在 EC2 上,你可以使用 no-ip、Let's Encrypt 或其他类似服务生成 SSL 证书。将 SSL 证书和私钥文件分别放在 EC2 机器上的/etc/ssl/certs和/etc/ssl/privatekey文件夹中。 -
使用以下命令在 EC2 机器上安装
nginx。sudo apt-get install nginx sudo nginx -t sudo systemctl reload nginx -
获取 EC2 实例的主机名,配置
nginx反向代理时需要用到它。TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") && curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/public-hostname -
将以下内容复制到新文件
/etc/nginx/conf.d/ec2.conf中。将YOUR_EC2_HOSTNAME、/etc/ssl/certs/cert.pem和/etc/ssl/privatekey/privkey.pem替换为适合你配置的值。server { listen 80; server_name YOUR_EC2_HOSTNAME; # Optional: Redirect HTTP to HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name YOUR_EC2_HOSTNAME; # Self-signed certificate paths ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/privatekey/privkey.pem; # Optional: Good practice ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { # Reverse proxy to your local app (e.g., port 8000) proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } -
重启
nginx。sudo systemctl start nginx -
按照远程设置部分中的说明,像往常一样启动 MCP 服务。
-
现在,你的 MCP 客户端可以通过 HTTPS 地址
https://your-mcp-server-domain-name.com/sse访问 MCP 服务。 -
接下来,在客户端上(例如你的笔记本电脑或 Agent 中)配置 MCP 客户端,使其按如下方式与 MCP 服务通信。
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_DOMAIN_NAME AWS_ACCOUNT_ID=AWS_ACCOUNT_ID_TO_GET_INFO_ABOUT # 如果设置为空或未指定 --aws-account-id 开关,则会获取运行 MCP 服务的 AWS 账户信息 python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --port 443 --aws-account-id $AWS_ACCOUNT_ID同样,你也可以运行 chainlit 应用,通过 HTTPS 与远程 MCP 服务通信。
export MCP_SERVER_URL=YOUR_MCP_SERVER_DOMAIN_NAME export MCP_SERVER_PORT=443 chainlit run app.py --port 8080同样,你也可以运行 LangGraph Agent,通过 HTTPS 与远程 MCP 服务通信。
python langgraph_agent_mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --port 443 --aws-account-id $AWS_ACCOUNT_ID
许可证
致谢
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
