mcpField
A
A sample MCP server for understanding cloud spend

A sample MCP server for understanding cloud spend

本地服务
github.com/aws-samples云与基础设施1474 周前更新

关于 A sample MCP server for understanding cloud spend

这是一个 Python MCP 服务,可通过 Cost Explorer 查看 AWS 成本,并从 CloudWatch 模型调用日志分析 Bedrock 用量。支持本地 stdio 使用和远程 SSE 部署,供 MCP 客户端进行成本分析。

主要功能

  1. 01查询前一天的 EC2 支出
  2. 02按区域和用户分析 Bedrock 用量
  3. 03按日期和服务拆分成本
  4. 04支持本地 stdio 和远程 SSE
  5. 05支持 Docker 部署

适用场景

  1. 01查看前一天的 EC2 成本
  2. 02分析 Bedrock 模型用量
  3. 03比较各 AWS 服务支出
  4. 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

安装

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

    其他安装选项请参阅此处的文档。

  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
    # Set up your credentials in ~/.aws/credentials and ~/.aws/config
    

    如果使用 AWS IAM Identity Center,请按照文档配置短期凭证。

使用方法

先决条件
  1. 在 Amazon CloudWatch 中设置模型调用日志。
  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 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
  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 应用(聊天机器人),它会创建一个 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 使用:

  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 支出是多少?”
  • “列出过去一个月成本最高的 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:用于部署的容器定义
添加新的成本分析工具

要扩展功能:

  1. 在 server.py 中添加新函数
  2. 使用 @mcp.tool() 为其添加注解
  3. 实现 AWS Cost Explorer API 调用
  4. 格式化结果,使其易于阅读

安全的“远程”MCP 服务

我们可以使用 nginx 作为反向代理,为连接到 MCP 服务提供 HTTPS 端点。远程 MCP 客户端可以通过 HTTPS 连接到 nginx,然后由它将流量代理到内部的 http://localhost:8000。以下步骤说明了如何操作。

  1. 在与 EC2 实例关联的安全组入站规则中,允许来自 MCP 客户端(你的笔记本电脑或任意位置)IP 地址的 TCP 443 端口访问。

  2. 继续操作前,你需要准备 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 文件夹中。

  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;
    
     # 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;
         }
     }
    
    
  6. 重启 nginx。

    sudo systemctl start nginx
    
  7. 按照远程设置部分的说明,像往常一样启动 MCP 服务。

  8. 现在,你的 MCP 服务可通过 HTTPS 地址 https://your-mcp-server-domain-name.com/sse 供 MCP 客户端访问。

  9. 现在,在客户端一侧(例如你的笔记本电脑或 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 
    

许可证

MIT 许可证

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。