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 について

Cost Explorer と Amazon Bedrock のモデル呼び出しログを使い、AWS の支出を分析する MCP サーバーです。クラウドコストや Bedrock の利用状況を自然言語で確認したい利用者向けです。LangGraph ベースのクライアント例も含まれます。

主な機能

  1. 01前日の EC2 支出の取得
  2. 02リージョン・サービス・インスタンスタイプ別の内訳
  3. 03リージョン・ユーザー・モデル別の Bedrock 利用状況
  4. 04IAM ロールによるクロスアカウント照会

活用シーン

  1. 01月ごとにコストが増減したサービスの確認
  2. 02過去 1 週間の Bedrock の日次・時間別利用量の確認
  3. 03LangGraph エージェントからのリモートでの AWS 支出照会

MCP 対応

stdio または SSE で動作する MCP サーバーで、Claude Desktop などの MCP クライアントにコストと利用量の照会ツールを提供します。LangGraph クライアントの例も同梱されています。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

AWS Cost Explorer and Amazon Bedrock Model Invocation Logs MCP サーバー&クライアント

Anthropic の MCP(Model Control Protocol) を通じて、Cost Explorer 経由で AWS の支出データを取得し、Amazon Cloud Watch 経由で Amazon Bedrock の使用状況データを Model invocation logs から取得する 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 エージェントに組み込まれた MCP クライアント経由でアクセスすることもできます。

🚨MCP サーバーが他のアカウントのロールを引き受けられる IAM ロールを使用している限り、この MCP サーバーを使って他のアカウントの AWS 支出情報を取得することもできます🚨

デモ動画

AWS Cost Explorer MCP サーバーの詳細解説

概要

このツールは、Anthropic の Claude モデルを対話型インターフェイスとして使用し、AWS クラウドの支出データを簡単に分析、可視化する方法を提供します。MCP サーバーとして機能し、AWS Cost Explorer API の機能を Claude Desktop に公開するため、AWS の支出について自然言語で質問できます。

機能

  • Amazon EC2 の支出分析:直近 1 日分の EC2 支出の詳細な内訳を確認できます
  • Amazon Bedrock の支出分析:直近 30 日分のリージョン、ユーザー、モデル別の内訳を確認できます
  • サービス別支出レポート:直近 30 日分のすべての AWS サービスにわたる支出を分析できます
  • 詳細なコスト内訳:日、リージョン、サービス、インスタンスタイプ別のきめ細かなコストデータを取得できます
  • 対話型インターフェイス:Claude を使って、自然言語でコストデータを問い合わせることができます

要件

  • Python 3.12
  • Cost Explorer にアクセスできる AWS 認証情報
  • Anthropic API へのアクセス(Claude との統合用)
  • [任意] Amazon Bedrock へのアクセス(LangGraph エージェント用)
  • [任意] リモート 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 パラメーターを設定します。その後、エージェントとのやり取りで別のアカウントの AWS アカウント ID を指定すると、エージェントがそのアカウント 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 で設定する方法は 2 つあります:

オプション 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"
      }
    }
  }
}

重要: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"
      }
    }
  }
}

ディレクトリのパスを、お使いのシステム上のリポジトリの実際のパスに置き換えてください。

リモートでのセットアップ

MCP のトランスポートには sse を使用します。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 経由で接続できるサーバー)の実行については、「安全なリモート MCP サーバー」のセクションも参照してください。

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 アプリ(チャットボット)を提供します。このアプリは、LangChain MCP Adapter を使用して、MCP サーバーが提供するツールを LangGraph エージェントのツールとしてインポートする LangGraph エージェントを作成します。エージェントは LLM を使ってユーザーの質問に答え、必要に応じて利用可能なツールを使用できます。たとえば、ユーザーが「過去 1 週間の 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 サービス別の利用料金トップ 5 を表示してください」
  • 「過去 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' 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 クライアントから MCP サーバーに HTTPS 経由で https://your-mcp-server-domain-name.com/sse としてアクセスできます。

  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 サーバーと通信できます。

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

ライセンス

MIT ライセンス

謝辞

  • このツールは Anthropic の MCP フレームワークを使用しています
  • AWS Cost Explorer API を利用しています
  • サーバーの実装には FastMCP を使用しています
  • README は、GitIngest 経由でリポジトリのテキストダンプを Claude に提供して生成しました

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。