AWS Cost Explorer and Amazon Bedrock Model Invocation Logs MCP Server & Client について
Cost Explorer と Amazon Bedrock のモデル呼び出しログを使い、AWS の支出を分析する MCP サーバーです。クラウドコストや Bedrock の利用状況を自然言語で確認したい利用者向けです。LangGraph ベースのクライアント例も含まれます。
主な機能
- 01前日の EC2 支出の取得
- 02リージョン・サービス・インスタンスタイプ別の内訳
- 03リージョン・ユーザー・モデル別の Bedrock 利用状況
- 04IAM ロールによるクロスアカウント照会
活用シーン
- 01月ごとにコストが増減したサービスの確認
- 02過去 1 週間の Bedrock の日次・時間別利用量の確認
- 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 支出情報を取得することもできます🚨
デモ動画
概要
このツールは、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
インストール
-
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-mcp -
Python 仮想環境をセットアップし、依存関係をインストールします:
uv venv --python 3.12 && source .venv/bin/activate && uv pip install --requirement pyproject.toml -
AWS 認証情報を設定します:
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 サーバーとクライアントは、どちらもローカルマシン上で実行されます。
サーバーの起動(ローカル)
次のコマンドでサーバーを実行します:
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
- MCP サーバーは TCP ポート 8000 でリッスンを開始します。
- 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 が使用できる以下のツールを公開します。
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'):リージョンとユーザー別に、モデルの使用状況を日ごとに集計します。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:デプロイ用のコンテナ定義
新しいコスト分析ツールの追加
機能を拡張するには、次の手順に従います。
server.pyに新しい関数を追加します@mcp.tool()でアノテーションを付けます- AWS Cost Explorer API 呼び出しを実装します
- 結果を読みやすい形式に整えます
セキュアな「リモート」MCP サーバー
nginx をリバースプロキシとして使用すると、MCP サーバーへの接続用に HTTPS エンドポイントを提供できます。リモート MCP クライアントは HTTPS 経由で 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 nginx -
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 -
次の内容を新しいファイル
/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; } } -
nginxを再起動します。sudo systemctl start nginx -
リモートセットアップのセクションで説明したとおり、通常の方法で MCP サーバーを起動します。
-
これで、MCP クライアントから MCP サーバーに HTTPS 経由で
https://your-mcp-server-domain-name.com/sseとしてアクセスできます。 -
クライアント側(ノートパソコン、またはエージェント)で、次のように 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
ライセンス
謝辞
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
