A sample MCP server for understanding cloud spend について
Cost Explorer で AWS のコストを調べ、CloudWatch のモデル呼び出しログから Bedrock の使用量を分析する Python 製 MCP サーバーです。ローカルの stdio とリモートの SSE に対応しています。
主な機能
- 01前日の EC2 支出の取得
- 02リージョン・ユーザー別の Bedrock 使用量
- 03日付・サービス別のコスト内訳
- 04ローカル stdio とリモート SSE
- 05Docker デプロイ対応
活用シーン
- 01前日の EC2 コストの確認
- 02Bedrock モデル使用量の分析
- 03AWS サービス間の支出比較
- 04リモート MCP クライアントからのコスト照会
MCP 対応
AWS Cost Explorer と CloudWatch の使用量分析ツールを MCP クライアントに公開します。ローカルでは 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 エージェントに組み込まれた 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
インストール
-
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/aws-samples/sample-cloud-spend-mcp-server 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 のトランスポートとしてstdioを使用します。MCP サーバーとクライアントはどちらもローカルマシン上で実行されます。
サーバーの起動(ローカル)
次のコマンドでサーバーを実行します:
export MCP_TRANSPORT=stdio
export BEDROCK_LOG_GROUP_NAME=YOUR_BEDROCK_CW_LOG_GROUP_NAME
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_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"
}
}
}
}
ディレクトリパスを、お使いのシステム上にあるリポジトリの実際のパスに置き換えてください。
リモートのセットアップ
MCP のトランスポートとして sse を使用します。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
- MCP サーバーは TCP ポート 8000 でリッスンを開始します。
- EC2 インスタンスに関連付けられたセキュリティグループで、ローカルマシン(MCP クライアント/LangGraph ベースのアプリを実行しているマシン)から EC2 インスタンスの TCP ポート 8000 へのアクセスを許可するインバウンドルールを設定します。
HTTPS 経由で MCP クライアントが接続できるサーバー、つまり「セキュアな」リモート MCP サーバーの実行については、こちらのセクションも参照してください。
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 アプリ(チャットボット)を提供します。このアプリは、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 の支出はいくらでしたか?」
- 「過去 1 か月間の 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's Encrypt、または同様のサービスを使って SSL 証明書を生成できます。EC2 マシン上のそれぞれ/etc/ssl/certsフォルダーと/etc/ssl/privatekeyフォルダーに、SSL 証明書ファイルと秘密鍵ファイルを配置します。 -
次のコマンドを使用して、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://your-mcp-server-domain-name.com/sseで HTTPS 接続できるようになります。 -
クライアント側(ノートパソコンまたはエージェント上など)で、次のように 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 エージェントを実行して、HTTPS 経由でリモート MCP サーバーと通信できます。
python langgraph_agent_mcp_sse_client.py --host YOUR_MCP_SERVER_DOMAIN_NAME --port 443
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。