返回市场
AWS成本探索器MCP服务器

AWS成本探索器MCP服务器

作者:aarora79126 星标更新:2025-04-14

项目介绍

AWS 成本探索器和 Amazon Bedrock 模型调用日志 MCP 服务器及客户端

这是一个通过 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 成本探索器 MCP 服务器深度解析

概览

此工具提供了一种方便的方式来分析和可视化 AWS 云花费数据,使用 Anthropic 的 Claude 模型作为交互界面。它作为一个 MCP 服务器,公开了 AWS 成本探索器 API 功能给 Claude 桌面,允许您以自然语言询问关于您的 AWS 花费的问题。

特性

  • Amazon EC2 花费分析:查看过去一天的 EC2 花费详细分解
  • Amazon Bedrock 花费分析:查看过去 30 天按地区、用户和模型的分解
  • 服务花费报告:分析过去 30 天所有 AWS 服务的花费
  • 详细成本分解:按天、地区、服务和实例类型获得细粒度的成本数据
  • 交互式界面:使用 Claude 通过自然语言查询您的成本数据

需求

  • Python 3.12
  • 具有成本探索器访问权限的 AWS 凭据
  • Anthropic API 访问权限(用于 Claude 集成)
  • [可选] Amazon Bedrock 访问权限(用于 LangGraph Agent)
  • [可选] Amazon EC2 用于运行远程 MCP 服务器

安装

  1. 安装 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"
    

    更多安装选项记录在这里:这里

  2. 克隆此仓库:(假设这将更新为指向 aws-samples?)

    git clone https://github.com/aarora79/aws-cost-explorer-mcp.git
    cd aws-cost-explorer-mcp
    
  3. 设置 Python 虚拟环境并安装依赖项:

    uv venv --python  3.12 && source .venv/bin/activate && uv pip install --requirement pyproject.toml
    
  4. 配置您的 AWS 凭据:

    mkdir -p ~/.aws
    # 在 ~/.aws/credentials 和 ~/.aws/config 中设置您的凭据
    

    如果您使用 AWS IAM 身份中心,请按照文档配置您的短期凭据

使用方法

前提条件

  1. 在 Amazon CloudWatch 中设置model invocation logs
  2. 确保正在使用的 IAM 用户/角色具有对 Amazon 成本探索器和 Amazon CloudWatch 的完全只读访问权限,这是 MCP 服务器从这些服务检索数据所必需的。 请参阅此处此处以获取您可以使用和修改的示例策略。
  3. 若要允许您的 MCP 服务器从其他账户访问 AWS 花费信息,在启动服务器时设置 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 桌面进行配置:

选项 1:使用 Docker

在您的 Claude 桌面配置文件中添加以下内容。根据您的操作系统,文件路径如下:

  • 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"
      }
    }
  }
}

重要提示:请替换 YOUR_ACCESS_KEY_IDYOUR_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 桌面目前不支持远程 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
  1. MCP 服务器将在 TCP 端口 8000 上开始监听。
  2. 在与您的 EC2 实例关联的安全组中配置入站规则,以允许从您的本地机器(您在此运行 MCP 客户端/LangGraph 基于的应用程序)到您的 EC2 实例的 TCP 端口 8000 访问。

参见“安全远程 MCP 服务器”部分,即您的 MCP 客户端可以通过 HTTPS 连接的服务器。

使用 CLI MCP 客户端测试

您可以使用 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

使用 Chainlit 应用测试

此仓库中的 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 可用的工具:

  1. get_ec2_spend_last_day():检索前一日的 EC2 花费数据
  2. get_detailed_breakdown_by_day(days=7):提供按地区、服务和实例类型的全面成本分析
  3. get_bedrock_daily_usage_stats(days=7, region='us-east-1', log_group_name='BedrockModelInvocationLogGroup'):提供按地区和用户的每日模型使用情况分解
  4. 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:用于部署的容器定义

添加新的成本分析工具

要扩展功能:

  1. server.py 中添加新函数
  2. 使用 @mcp.tool() 注解它们
  3. 实现 AWS 成本探索器 API 调用
  4. 格式化结果以便于阅读

安全“远程”MCP 服务器

我们可以使用 nginx 作为反向代理,从而提供一个 HTTPS 终端节点以连接到 MCP 服务器。远程 MCP 客户端可以通过 HTTPS 连接到 nginx,然后它可以在内部将流量代理到 http://localhost:8000。以下步骤描述了如何执行此操作。

  1. 在与您的 EC2 实例关联的安全组的入站规则中,允许从您的 MCP 客户端(您的笔记本电脑或其他任何地方)的 IP 地址访问 TCP 端口 443。

  2. 您需要有一个 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-ipLet' Encrypt 或其他类似服务生成 SSL 证书。将 SSL 证书和私钥文件分别放置在 EC2 机器上的 /etc/ssl/certs/etc/ssl/privatekey 文件夹中。

  3. 使用以下命令在您的 EC2 机器上安装 nginx

    sudo apt-get install nginx
    sudo nginx -t
    sudo systemctl reload nginx
    
  4. 获取您的 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
    
  5. 将以下内容复制到新文件 /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;
         }
     }
    
    
  6. 重新启动 nginx

    sudo systemctl start nginx
    
  7. 远程设置部分所述,正常启动您的 MCP 服务器。

  8. 您的 MCP 服务器现在可以通过 HTTPS 在 https://your-mcp-server-domain-name.com/sse 对您的 MCP 客户端可用。

  9. 现在在客户端方面(例如在您的笔记本电脑或代理中),配置您的 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 服务器通信。