返回市场
样本云支出MCP服务器

样本云支出MCP服务器

作者:aws-samples12 星标更新:2025-05-28

项目介绍

用于理解云支出的MCP服务器示例

这是一个通过Cost Explorer获取AWS支出数据并通过Amazon Cloud Watch中的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 Cost Explorer MCP服务器]
    
    subgraph "AWS服务"
        MCPServer --> |API调用| CostExplorer[(AWS Cost Explorer)]
        MCPServer --> |API调用| CloudWatchLogs[(AWS CloudWatch日志)]
    end

您可以在本地运行MCP服务器并通过Claude桌面访问它,或者也可以在Amazon EC2上运行一个远程MCP服务器,并通过内置到LangGraph代理中的MCP客户端进行访问。

概述

此工具提供了一种方便的方式来分析和可视化AWS云支出数据,使用Anthropic的Claude模型作为交互界面。它作为一个MCP服务器,向Claude桌面暴露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代理)
  • [可选] 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/aws-samples/sample-cloud-spend-mcp-server
    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 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桌面配置

有两种方法可以将此工具与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_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"
      }
    }
  }
}

重要:将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桌面目前不支持远程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
  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_SERVER_HOSTNAME=YOUR_MCP_SERVER_EC2_HOSTNAME
python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME

使用Chainlit应用测试

此仓库中的app.py文件提供了一个Chainlit应用(聊天机器人),该应用创建了一个使用LangChain MCP适配器导入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'):提供过去7天按地区和用户的模型使用情况的每日分解
  4. get_bedrock_hourly_usage_stats(days=7, region='us-east-1', log_group_name='BedrockModelInvocationLogGroup'):提供过去7天按地区和用户的模型使用情况的每日每小时分解

示例查询

一旦通过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 Cost Explorer 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's 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://your-mcp-server-domain-name.com/sse通过HTTPS访问您的MCP客户端。

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

    python langgraph_agent_mcp_sse_client.py --host YOUR_MCP_SERVER_DOMAIN_NAME --port 443 
    

许可证

MIT许可证