一个命令行界面和API,允许用户通过启用克劳德使用自然语言对话查询AWS成本管理器来分析和可视化AWS云支出数据。
495 查看 · 2026-07-07 更新
简介
一个命令行界面和API,允许用户通过启用克劳德使用自然语言对话查询AWS成本管理器来分析和可视化AWS云支出数据。
简介
一个命令行界面和API,允许用户通过启用克劳德使用自然语言对话查询AWS成本管理器来分析和可视化AWS云支出数据。
AWS Cost Explorer 和 Amazon Bedrock 模型调用日志 MCP 服务器和客户端
通过 Anthropic 的 MCP(模型控制协议) 从 Cost Explorer 获取 AWS 支出数据并通过 Amazon Cloud Watch 中的 模型调用日志 获取 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 客户端访问它。
演示视频
概述
该工具提供了一种方便的方式来分析和可视化 AWS 云支出数据,使用 Anthropic 的 Claude 模型作为交互界面。它作为一个 MCP 服务器,将 AWS Cost Explorer API 功能暴露给 Claude Desktop,允许您以自然语言询问有关 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:# 在 macOS 和 Linux 上 curl -LsSf https://astral.sh/uv/install.sh | sh# 在 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 # 在 ~/.aws/credentials 和 ~/.aws/config 中设置您的凭证如果您使用 AWS IAM Identity Center,请按照 文档 配置您的短期凭证
使用
前提条件
- 在 Amazon CloudWatch 中设置 模型调用日志。
- 确保使用的 IAM 用户/角色对 Amazon Cost Explorer 和 Amazon CloudWatch 具有完全只读访问权限,这是 MCP 服务器从这些服务检索数据所必需的。请参阅这里和这里,以获取您可以根据需要使用和修改的示例策略。
本地设置
使用 stdio 作为 MCP 的传输方式,MCP 服务器和客户端都在您的本地机器上运行。
启动服务器(本地)
使用以下命令运行服务器:
export MCP_TRANSPORT=stdio export BEDROCK_LOG_GROUP_NAME=YOUR_BEDROCK_CW_LOG_GROUP_NAME 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", "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", "MCP_TRANSPORT": "stdio" } } } }
重要:请用您实际的 AWS 凭证替换
YOUR_ACCESS_KEY_ID和YOUR_SECRET_ACCESS_KEY。切勿将实际凭证提交到版本控制系统中。
选项 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", "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 python server.py
- MCP 服务器将在 TCP 端口 8000 上开始监听。
- 在与您的 EC2 实例关联的安全组中配置入站规则,允许从您的本地机器(您正在运行 MCP 客户端/LangGraph 基于的应用程序的地方)到您的 EC2 实例的 TCP 端口 8000 的访问。
另请参阅关于运行“安全”远程 MCP 服务器的部分(参见 [#secure-remote-mcp-server]),即您的 MCP 客户端可以通过 HTTPS 连接到的服务器。
使用 CLI MCP 客户端测试
你可以使用 mcp_sse_client.py 脚本来测试你的远程 MCP 服务器。运行该脚本会打印出从 MCP 服务器获取的工具列表以及 get_bedrock_daily_usage_stats 工具的输出。
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_EC2_HOSTNAME python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME
使用 Chainlit 应用进行测试
此仓库中的 app.py 文件提供了一个 Chainlit 应用(聊天机器人),它创建了一个 LangGraph 代理,该代理使用 LangChain MCP Adapter 将 MCP 服务器提供的工具导入为 LangGraph 代理中的工具。然后,代理能够使用 LLM 来响应用户的问题,并根据需要使用可用的工具。因此,如果用户问诸如“在过去一周内我的 Bedrock 使用情况如何?”这样的问题,代理将通过远程 MCP 服务器使用可用的工具来回答这个问题。我们使用 Amazon Bedrock 提供的 Claude 3.5 Haiku 模型来驱动这个代理。
运行 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 支出是多少?"
- "显示我上个月成本最高的前五个 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 成本管理器 API 调用
- 格式化结果以便易于阅读
安全的“远程”MCP 服务器
我们可以使用 nginx 作为反向代理,以便为连接到 MCP 服务器提供一个 HTTPS 终端。远程 MCP 客户端可以通过 HTTPS 连接到 nginx,然后它可以在内部将流量代理到 http://localhost:8000。以下步骤描述了如何实现这一点。
-
Enable access to TCP port 443 from the IP address of your MCP client (your laptop, or anywhere) in the inbound rules in the security group associated with your EC2 instance.
-
You would need to have an HTTPS certificate and private key to proceed. Let's say you use
your-mcp-server-domain-name.comas the domain for your MCP server then you will need an SSL cert foryour-mcp-server-domain-name.comand it will be accessible to MCP clients ashttps://your-mcp-server-domain-name.com/sse. While you can use a self-signed cert but it would require disabling SSL verification on the MCP client, we DO NOT recommend you do that. If you are hosting your MCP server on EC2 then you could generate an SSL cert using no-ip or Let' Encrypt or other similar services. Place the SSL cert and private key files in/etc/ssl/certsand/etc/ssl/privatekeyfolders respectively on your EC2 machine. -
Install
nginxon your EC2 machine using the following commands.sudo apt-get install nginx sudo nginx -t sudo systemctl reload nginx -
Get the hostname for your EC2 instance, this would be needed for configuring the
nginxreverse proxy.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 -
Copy the following content into a new file
/etc/nginx/conf.d/ec2.conf. ReplaceYOUR_EC2_HOSTNAME,/etc/ssl/certs/cert.pemand/etc/ssl/privatekey/privkey.pemwith values appropriate for your setup.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; } } -
Restart
nginx.sudo systemctl start nginx -
Start your MCP server as usual as described in the remote setup section.
-
Your MCP server is now accessible over HTTPS as
https://your-mcp-server-domain-name.com/sseto your MCP client. -
On the client side now (say on your laptop or in your Agent) configure your MCP client to communicate to your MCP server as follows.
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_DOMAIN_NAME python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --port 443Similarly you could run the chainlit app to talk to remote MCP server over HTTPS.
export MCP_SERVER_URL=YOUR_MCP_SERVER_DOMAIN_NAME export MCP_SERVER_PORT=443 chainlit run app.py --port 8080Similarly you could run the LangGraph Agent to talk to remote MCP server over HTTPS.
python langgraph_agent_mcp_sse_client.py --host YOUR_MCP_SERVER_DOMAIN_NAME --port 443
许可证
致谢
- 本工具使用了 Anthropic 的 MCP 框架
- 由 AWS Cost Explorer API 支持
- 使用 FastMCP 构建服务器实现
- README 是通过将仓库的文本转储提供给 GitIngest 并由 Claude 生成的
服务配置
[{'mcpServers': {'aws_cost_explorer': {'args': ['--directory', '/path/to/aws-cost-explorer-mcp-server', 'run', 'server.py'], 'command': 'uv', 'env': {'AWS_ACCESS_KEY_ID': 'YOUR_ACCESS_KEY_ID', 'AWS_REGION': 'us-east-1', 'AWS_SECRET_ACCESS_KEY': 'YOUR_SECRET_ACCESS_KEY', 'BEDROCK_LOG_GROUP_NAME': 'YOUR_CLOUDWATCH_BEDROCK_MODEL_INVOCATION_LOG_GROUP_NAME', 'MCP_TRANSPORT': 'stdio'}}}}]
