AWS コストエクスプローラーと Amazon Bedrock モデル呼び出しログ MCP サーバーとクライアント
Cost Explorer経由でAWS支出データを取得し、 AnthropicのMCP(モデル制御プロトコル)を介してAmazon Cloud WatchのModel invocation logs経由でAmazon Bedrockの使用状況データを取得するためのMCPサーバー。HTTPS経由でMCPサーバーを実行する方法については、 「安全な」リモートMCPサーバーのセクションを参照してください。
MCP サーバーをローカルで実行し、Claude デスクトップ経由でアクセスすることもできますし、Amazon EC2 上でリモート MCP サーバーを実行し、LangGraph エージェントに組み込まれた MCP クライアント経由でアクセスすることもできます。
🚨MCP サーバーが使用する IAM ロールが他のアカウントでロールを引き受けることができる限り、この MCP サーバーを使用して他のアカウントから AWS 支出情報を取得することもできます🚨
デモビデオ

概要
このツールは、AnthropicのClaudeモデルをインタラクティブなインターフェースとして利用し、AWSクラウド支出データを分析・可視化する便利な方法を提供します。MCPサーバーとして機能し、AWS Cost Explorer API機能をClaude Desktopに公開することで、AWS支出に関する自然言語での質問が可能になります。
Related MCP server: AWS CLI MCP Server
特徴
Amazon EC2 支出分析: 過去 1 日間の EC2 支出の詳細な内訳を表示します。
Amazon Bedrock 支出分析: 過去 30 日間の地域、ユーザー、モデル別の内訳を表示
サービス支出レポート: 過去 30 日間のすべての AWS サービスでの支出を分析します
詳細なコストの内訳: 日、地域、サービス、インスタンスタイプごとに詳細なコストデータを取得します
インタラクティブインターフェース: Claude を使用して、自然言語でコストデータを照会します。
要件
Python 3.12
Cost Explorer へのアクセス権限を持つ AWS 認証情報
Anthropic API アクセス (Claude 統合用)
[オプション] Amazon Bedrock アクセス (LangGraph Agent 用)
[オプション] リモート MCP サーバーを実行するための Amazon EC2
インストール
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"追加のインストールオプションについては、ここを参照してください。
このリポジトリをクローンします: (これが aws-samples を指すように更新されると想定しています)
git clone https://github.com/aarora79/aws-cost-explorer-mcp.git cd aws-cost-explorer-mcpPython 仮想環境をセットアップし、依存関係をインストールします。
uv venv --python 3.12 && source .venv/bin/activate && uv pip install --requirement pyproject.tomlAWS 認証情報を設定します。
mkdir -p ~/.aws # Set up your credentials in ~/.aws/credentials and ~/.aws/configAWS IAM Identity Centerを使用する場合は、ドキュメントに従って短期認証情報を設定してください。
使用法
前提条件
Amazon CloudWatch でモデル呼び出しログを設定します。
使用するIAMユーザー/ロールに、Amazon Cost ExplorerとAmazon CloudWatchへの完全な読み取り専用アクセス権があることを確認してください。これは、MCPサーバーがこれらのサービスからデータを取得するために必要です。要件に応じて使用および変更できるサンプルポリシーの例については、 こちらとこちらを参照してください。
MCP サーバーが他のアカウントの AWS 支出情報にアクセスできるようにするには、サーバーの起動時に
CROSS_ACCOUNT_ROLE_NAMEパラメータを設定します。これで、エージェントと対話するときに別のアカウントの AWS アカウント ID を指定できるようになり、エージェントはアカウント ID をサーバーに渡します。
ローカルセットアップ
MCP のトランスポートとしてstdio使用し、MCP サーバーとクライアントの両方がローカル マシン上で実行されます。
サーバーの起動(ローカル)
次を使用してサーバーを実行します。
クロードデスクトップ構成
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。
重要:
YOUR_ACCESS_KEY_IDとYOUR_SECRET_ACCESS_KEYを実際のAWS認証情報に置き換えてください。実際の認証情報をバージョン管理にコミットしないでください。
オプション2: UVを使用する(Dockerなし)
Docker を使用せずにサーバーを直接実行したい場合は、UV を使用できます。
ディレクトリ パスをシステム上のリポジトリへの実際のパスに置き換えてください。
リモートセットアップ
MCPのトランスポートとしてsseを使用します。MCPサーバーはEC2上にあり、クライアントはローカルマシン上で実行されます。Claude Desktopは現時点ではリモートMCPサーバーをサポートしていないことに注意してください(GitHubのissueをご覧ください)。
サーバーの起動(リモート)
上記と同じ手順で、Amazon EC2 上でリモート MCP サーバーを起動できます。MCP_TRANSPORT MCP_TRANSPORT sse (サーバー側イベント)に設定してください(以下を参照)。MCPは JSON-RPC 2.0 をワイヤフォーマットとして使用するため、プロトコル自体には認可と認証が含まれません( 。
次を使用してサーバーを実行します。
MCP サーバーは TCP ポート 8000 でリッスンを開始します。
EC2 インスタンスに関連付けられたセキュリティ グループでイングレス ルールを構成して、ローカル マシン (MCP クライアント/LangGraph ベースのアプリを実行している場所) から EC2 インスタンスへの TCP ポート 8000 へのアクセスを許可します。
また、 「安全な」リモート MCP サーバー(つまり、MCP クライアントが HTTPS 経由で接続できるサーバー) の実行に関するセクションも参照してください。
CLI MCPクライアントによるテスト
mcp_sse_client.pyスクリプトを使用して、リモート MCP サーバーをテストできます。このスクリプトを実行すると、MCP サーバーで利用可能なツールのリストと、 get_bedrock_daily_usage_statsツールの出力が表示されます。
Chainlitアプリでテスト
このリポジトリのapp.pyファイルは、Chainlit アプリ(チャットボット)を提供します。このアプリはLangChain MCP Adapterを使用して、MCP サーバーが提供するツールを LangGraph エージェントのツールとしてインポートする LangGraph エージェントを作成します。エージェントは LLM を使用してユーザーの質問に回答し、必要に応じて利用可能なツールを使用します。例えば、ユーザーが「過去 1 週間の Bedrock の使用状況はどうでしたか? 」といった質問をした場合、エージェントはリモート MCP サーバー経由で利用可能なツールを使用してその質問に答えます。このエージェントの動作には、Amazon Bedrock から利用可能な Claude 3.5 Haiku モデルを使用しています。
次を使用して Chainlit アプリを実行します。
localhost:8080でブラウザ ウィンドウが開き、チャットボットを使用して AWS の支出に関する詳細を取得できるようになります。
利用可能なツール
サーバーは、Claude が使用できる次のツールを公開します。
get_ec2_spend_last_day(): 前日のEC2支出データを取得しますget_detailed_breakdown_by_day(days=7): リージョン、サービス、インスタンスタイプごとにコストの包括的な分析を提供します。get_bedrock_daily_usage_stats(days=7, region='us-east-1', log_group_name='BedrockModelInvocationLogGroup'): リージョンおよびユーザー別のモデル使用状況の 1 日あたりの内訳を提供します。get_bedrock_hourly_usage_stats(days=7, region='us-east-1', log_group_name='BedrockModelInvocationLogGroup'): リージョンおよびユーザー別のモデル使用状況の 1 日あたりおよび 1 時間あたりの内訳を提供します。
クエリの例
MCP 対応インターフェースを介して Claude に接続すると、次のような質問をすることができます。
「過去数週間のBedrockの支出について教えてください」
「昨日の EC2 の支出はいくらでしたか?」
「先月のコスト上位 5 つの AWS サービスを表示してください」
「過去14日間の地域別の支出を分析する」
「どのインスタンスタイプに最もコストがかかっていますか?」
「前月比で最もコストが増加したサービスはどれですか?」
Docker サポート
コンテナ化されたデプロイメント用の Dockerfile が含まれています。
発達
プロジェクト構造
server.py: MCP ツールを使用したメインサーバーの実装pyproject.toml: プロジェクトの依存関係とメタデータDockerfile: デプロイメント用のコンテナ定義
新しいコスト分析ツールの追加
機能を拡張するには:
server.pyに新しい関数を追加する@mcp.tool()で注釈を付けるAWS Cost Explorer API呼び出しを実装する
読みやすいように結果をフォーマットする
安全な「リモート」MCPサーバー
nginxリバースプロキシとして使用することで、MCPサーバーへの接続にHTTPSエンドポイントを提供できます。リモートMCPクライアントはHTTPS経由でnginxに接続し、nginxはトラフィックを内部的にhttp://localhost:8000にプロキシします。以下の手順でその方法を解説します。
EC2 インスタンスに関連付けられたセキュリティ グループの受信ルールで、MCP クライアント (ラップトップ、または任意の場所) の IP アドレスからの TCP ポート 443 へのアクセスを有効にします。
続行するには、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フォルダにそれぞれ配置してください。次のコマンドを使用して、EC2 マシンに
nginxをインストールします。sudo apt-get install nginx sudo nginx -t sudo systemctl reload nginxEC2 インスタンスのホスト名を取得します。これは、
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以下の内容を新しいファイル
/etc/nginx/conf.d/ec2.conf``YOUR_EC2_HOSTNAMEコピーします。YOUR_EC2_HOSTNAME、/etc/ssl/certs/cert.pemcerts/cert.pem、/etc//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; } }nginxを再起動します。sudo systemctl start nginxリモート セットアップセクションで説明されているように、通常どおり MCP サーバーを起動します。
これで、MCP クライアントから
https://your-mcp-server-domain-name.com/sseとして、MCP サーバーに HTTPS 経由でアクセスできるようになりました。次に、クライアント側 (ラップトップまたはエージェント内) で、次のように MCP クライアントが MCP サーバーと通信するように構成します。
MCP_SERVER_HOSTNAME=YOUR_MCP_SERVER_DOMAIN_NAME 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 --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