mcpField
A
AWS Cost Explorer and Amazon Bedrock Model Invocation Logs MCP Server & Client

AWS Cost Explorer and Amazon Bedrock Model Invocation Logs MCP Server & Client

本地服务
github.com/aarora79云与基础设施12680 周前更新

关于 AWS Cost Explorer and Amazon Bedrock Model Invocation Logs MCP Server & Client

这是一个 MCP 服务,用于通过 Cost Explorer 和 Amazon Bedrock 模型调用日志分析 AWS 支出。适合希望用自然语言查询云成本与 Bedrock 用量的用户。项目同时提供基于 LangGraph 的客户端示例。

主要功能

  1. 01查询 EC2 前一日支出
  2. 02按区域、服务和实例类型细分成本
  3. 03分析 Bedrock 按区域、用户和模型的用量
  4. 04支持通过跨账户角色查询其他账户

适用场景

  1. 01询问上个月各服务的成本变化
  2. 02查看 Bedrock 最近一周的每日或每小时用量
  3. 03通过 LangGraph Agent 远程查询 AWS 支出

MCP 相关

该项目是一个 MCP 服务,以 stdio 或 SSE 传输方式运行,向 Claude Desktop 等 MCP 客户端暴露成本与用量查询工具,并附带 LangGraph 客户端示例。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

AWS Cost Explorer 和 Amazon Bedrock 模型调用日志 MCP 服务与客户端

一个通过 Anthropic 的 MCP(Model Control Protocol),在 Amazon CloudWatch 中通过 模型调用日志获取 AWS 支出数据(通过 Cost Explorer)和 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 客户端访问。

🚨只要 MCP 服务使用的 IAM 角色能够在其他账户中代入角色,你也可以使用此 MCP 服务获取其他账户的 AWS 支出信息🚨

演示视频

AWS Cost Explorer 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/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
    # 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 服务需要这些权限才能从相应服务检索数据。 你可以参考此处和此处的示例策略,并根据需要进行修改。
  3. 若要允许 MCP 服务访问其他账户的 AWS 支出信息,请在启动服务时设置 CROSS_ACCOUNT_ROLE_NAME 参数。之后,你可以在与 Agent 交互时提供另一个账户的 AWS 账户 ID,Agent 会将该账户 ID 传递给服务。
本地设置

MCP 使用 stdio 作为传输方式,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 # can be ignored if you do not want AWS spend info from other accounts
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_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"
      }
    }
  }
}

IMPORTANT:将 YOUR_ACCESS_KEY_ID 和 YOUR_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 Desktop 目前不支持远程 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 # can be ignored if you do not want AWS spend info from other accounts
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 工具的输出。

# set the hostname for your MCP server
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_EC2_HOSTNAME
# or localhost if your MCP server is running locally
# MCP_SERVER_HOSTNAME=localhost 
AWS_ACCOUNT_ID=AWS_ACCOUNT_ID_TO_GET_INFO_ABOUT # if set to empty or if the --aws-account-id switch is not specified then it gets the info about the AWS account MCP server is running in
python mcp_sse_client.py --host $MCP_SERVER_HOSTNAME --aws-account-id $AWS_ACCOUNT_ID
使用 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 证书和私钥。假设你将 your-mcp-server-domain-name.com 用作 MCP 服务的域名,那么你需要为 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
    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 服务通信。

    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 $MCP_SERVER_HOSTNAME --port 443 --aws-account-id $AWS_ACCOUNT_ID
    

许可证

MIT 许可证

致谢

  • 此工具使用 Anthropic 的 MCP 框架
  • 由 AWS Cost Explorer API 提供支持
  • 使用 FastMCP 构建服务端实现
  • 本 README 是将仓库的文本转储通过 GitIngest 提供给 Claude 后生成的

评论

支持 Markdown

第一次接触 MCP?

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

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