关于 A sample MCP server for understanding cloud spend
这是一个 Python MCP 服务,可通过 Cost Explorer 查看 AWS 成本,并从 CloudWatch 模型调用日志分析 Bedrock 用量。支持本地 stdio 使用和远程 SSE 部署,供 MCP 客户端进行成本分析。
主要功能
- 01查询前一天的 EC2 支出
- 02按区域和用户分析 Bedrock 用量
- 03按日期和服务拆分成本
- 04支持本地 stdio 和远程 SSE
- 05支持 Docker 部署
适用场景
- 01查看前一天的 EC2 成本
- 02分析 Bedrock 模型用量
- 03比较各 AWS 服务支出
- 04通过远程 MCP 客户端查询成本数据
MCP 相关
该服务向 MCP 客户端提供 AWS Cost Explorer 和 CloudWatch 用量分析工具。本地连接使用 stdio,远程连接支持 SSE。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
用于了解云支出的示例 MCP 服务
通过 Anthropic 的 MCP(Model Control Protocol),使用 Cost Explorer 获取 AWS 支出数据,并通过 Amazon Cloud Watch 中的 Model invocation logs 获取 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 客户端访问。
概述
此工具提供了一种便捷方式,可使用 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/aws-samples/sample-cloud-spend-mcp-server 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 服务需要这些权限才能从这些服务中检索数据。 请参阅此处和此处,查看可根据需求使用和修改的策略示例。
本地设置
使用 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_PROFILE", "-e", "AWS_REGION", "-e", "BEDROCK_LOG_GROUP_NAME", "-e", "MCP_TRANSPORT", "aws-cost-explorer-mcp:latest" ],
"env": {
"AWS_PROFILE": "YOUR_AWS_PROFILE_NAME",
"AWS_REGION": "us-east-1",
"BEDROCK_LOG_GROUP_NAME": "YOUR_CLOUDWATCH_BEDROCK_MODEL_INVOCATION_LOG_GROUP_NAME",
"MCP_TRANSPORT": "stdio"
}
}
}
}
IMPORTANT:将
YOUR_AWS_PROFILE_NAME替换为实际的 AWS 配置文件名称。此配置文件应在~/.aws/credentials和~/.aws/config文件中配置。
选项 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_PROFILE": "YOUR_AWS_PROFILE_NAME",
"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 issue)。
启动服务(远程)
按照上述相同说明,即可在 Amazon EC2 上启动远程 MCP 服务。请确保将 MCP_TRANSPORT 设置为 sse(服务器发送事件),如下所示。请注意,MCP 使用 JSON-RPC 2.0 作为线缆格式,因此协议本身不包含授权和身份验证机制(参见此 GitHub issue),请勿通过 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 服务的章节,即 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 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 证书和私钥。假设你的 MCP 服务域名为
your-mcp-server-domain-name.com,则需要为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 python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --port 443同样,你也可以运行 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 YOUR_MCP_SERVER_DOMAIN_NAME --port 443
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。