这是一个通过 Cost Explorer 获取 AWS 花费数据并通过 Amazon CloudWatch 中的模型调用日志(Model invocation logs)获取 Amazon Bedrock 使用数据的 MCP 服务器。该服务器使用 Anthropic 的 MCP(模型控制协议)进行通信。请参阅“安全远程 MCP 服务器”部分了解如何通过 HTTPS 运行您的 MCP 服务器。
flowchart LR
User([用户]) --> UserApp[用户应用程序]
UserApp --> |查询| Host[主机]
subgraph "Claude 桌面"
Host --> MCPClient[MCP 客户端]
end
MCPClient --> |HTTPS 上的 MCP 协议| MCPServer[AWS 成本探索器 MCP 服务器]
subgraph "AWS 服务"
MCPServer --> |API 调用| CostExplorer[(AWS 成本探索器)]
MCPServer --> |API 调用| CloudWatchLogs[(AWS CloudWatch 日志)]
end
您可以在本地运行 MCP 服务器并通过 Claude 桌面访问它,或者也可以在 Amazon EC2 上运行一个远程 MCP 服务器,并通过内置到 LangGraph Agent 中的 MCP 客户端访问它。
🚨 您还可以使用此 MCP 服务器从其他账户获取 AWS 花费信息,只要 MCP 服务器使用的 IAM 角色能够在这些其他账户中承担角色即可 🚨
此工具提供了一种方便的方式来分析和可视化 AWS 云花费数据,使用 Anthropic 的 Claude 模型作为交互界面。它作为一个 MCP 服务器,公开了 AWS 成本探索器 API 功能给 Claude 桌面,允许您以自然语言询问关于您的 AWS 花费的问题。
安装 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 身份中心,请按照文档配置您的短期凭据
CROSS_ACCOUNT_ROLE_NAME 参数,现在您可以在与代理交互时提供另一个账户的 AWS 账户 ID,然后代理会将账户 ID 传递给服务器。使用 stdio 作为 MCP 的传输方式,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 # 如果不需要从其他账户获取 AWS 花费信息,则可以忽略
python server.py
有两种方式可以将此工具与 Claude 桌面进行配置:
在您的 Claude 桌面配置文件中添加以下内容。根据您的操作系统,文件路径如下:
{
"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"
}
}
}
}
重要提示:请替换
YOUR_ACCESS_KEY_ID和YOUR_SECRET_ACCESS_KEY为您实际的 AWS 凭据。切勿将实际凭据提交到版本控制系统。
如果您希望直接运行服务器而不使用 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 桌面目前不支持远程 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 # 如果不需要从其他账户获取 AWS 花费信息,则可以忽略
python server.py
参见“安全远程 MCP 服务器”部分,即您的 MCP 客户端可以通过 HTTPS 连接的服务器。
您可以使用 mcp_sse_client.py 脚本测试您的远程 MCP 服务器。运行此脚本将打印 MCP 服务器提供的工具列表以及 get_bedrock_daily_usage_stats 工具的输出。
# 设置您的 MCP 服务器主机名
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_EC2_HOSTNAME
# 或者如果您的 MCP 服务器在本地运行,则为 localhost
# MCP_SERVER_HOSTNAME=localhost
AWS_ACCOUNT_ID=AWS_ACCOUNT_ID_TO_GET_INFO_ABOUT # 如果设置为空或未指定 --aws-account-id 开关,则获取 MCP 服务器运行所在的 AWS 账户的信息
python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --aws-account-id $AWS_ACCOUNT_ID
此仓库中的 app.py 文件提供了一个 Chainlit 应用(聊天机器人),该应用创建了一个使用 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,您可以询问如下问题:
包含一个 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() 注解它们我们可以使用 nginx 作为反向代理,从而提供一个 HTTPS 终端节点以连接到 MCP 服务器。远程 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 证书,并且它可以通过 https://your-mcp-server-domain-name.com/sse 对 MCP 客户端可用。虽然您可以使用自签名证书,但这需要禁用 MCP 客户端上的 SSL 验证,我们不建议这样做。如果您在 EC2 上托管您的 MCP 服务器,您可以使用 no-ip 或 Let' 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;
# 可选:将 HTTP 重定向到 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name YOUR_EC2_HOSTNAME;
# 自签名证书路径
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/privatekey/privkey.pem;
# 可选:良好的实践
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# 反向代理到您的本地应用(例如,端口 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 客户端可用。
现在在客户端方面(例如在您的笔记本电脑或代理中),配置您的 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 服务器通信。