AWS MCP Serversを使ってみた

# AWS MCP Serversが登場しました！

https://github.com/awslabs/mcp

## 概要

- AWS MCP Serversは、AWSのドキュメントやベストプラクティス等にアクセスできるサーバー群
- AWS MCP Serversを使用するとAWSのコスト分析やインフラ構成図の作成、自然言語でLambda実行などができる

# AWS MCP Serversの種類

- Core MCP Server
- AWS Documentation MCP Server
- Amazon Bedrock Knowledge Bases Retrieval MCP Server
- AWS CDK MCP Server
- Cost Analysis MCP Server
- Amazon Nova Canvas MCP Server
- AWS Diagram MCP Server
- AWS Lambda MCP Server
- AWS Terraform MCP Server

# 今回使用した環境

- OS： Ubuntu 24.04 LTS
- パッケージマネージャー：uv バージョン: 0.6.14
- aws-mcp：[2025.4.2025171004](https://github.com/awslabs/mcp/releases/tag/2025.4.2025171004)
- Roo Code：3.12.3
    - AIモデルは `Claude 3.5 Sonnet` を使用

# 事前準備

- uvのインストール
- Cline（AIエージェント）のMCP設定
- AWSクレデンシャルを設定（リンク参照）

https://qiita.com/ryome/items/ff2804be600cd5dcd61a

## uvのインストール

以下のコマンドを実行する

```
$ curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.6.14 x86_64-unknown-linux-gnu
no checksums to verify
installing to /home/【ユーザ名】/.local/bin
  uv
  uvx
everything's installed!
...etc
$ source $HOME/.local/bin/env
```

## ClineのMCP設定

- mcp.jsonにMCPを設定する

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/3c44b9a9-ff6d-428c-aca9-56c1cfd62f0c.png)

```json:mcp.json
{
  "mcpServers": {
    // この中にMCPサーバーを定義する
  }
}
```

# Core MCP Server

**MCP構成ファイルへの追加**：

```json
"awslabs.core-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.core-mcp-server@latest"],
  "env": {
    "FASTMCP_LOG_LEVEL": "ERROR",
    "MCP_SETTINGS_PATH": "あなたのMCP設定ファイルパス"
  },
  "disabled": false,
  "autoApprove": []
}
```

## どんなことができるの？
  - 他のAWS Labs MCPサーバの管理と連携
  - UVXのインストールをサポート
  - AWS Labs MCPサーバをオーケストレーションするための計画とガイダンスを提供
  - 一元的な設定管理

## 実践

### Core MCP Serverに他のMCPサーバーのセットアップをやってもらう

- プロンプト

```
Core MCP Serverを使用してAWS Documentation MCP Serverの設定を行ってください。
```

- AIの回答

```
AWS Documentation MCP Serverが正常に設定されたことを確認するために、
試験的にAWSのドキュメントを検索してみましょう。

引数
{
  "search_phrase": "AWS Lambda function URLs",
  "limit": 1
}
```

- AIの回答

```
応答
{
  "rank_order": 1, 
  "url": "https://docs.aws.amazon.com/lambda/latest/dg/urls-invocation.html", 
  "title": "Invoking Lambda function URLs - AWS Lambda", 
  "context": "Invoke your Lambda function through a dedicated HTTP(S) endpoint using a web browser, curl, Postman, or any HTTP client."
}

AWS Documentation MCP Serverの設定が完了しました。以下の機能が利用可能になりました：

read_documentation: AWSドキュメントページをマークダウン形式で取得
search_documentation: AWSドキュメントの検索
recommend: AWSドキュメントページのコンテンツレコメンデーション

これらの機能を使用して、AWSドキュメントに効率的にアクセスできるようになりました。

```

- `mcp.json` に以下の記載が追加されました！

```json:mcp.json
{
  "mcpServers": {
    ...etc
    "awslabs.aws-documentation-mcp-server": {
      "command": "uvx",
      "args": [
        "awslabs.aws-documentation-mcp-server@latest"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR",
      },
      "disabled": false,
      "autoApprove": [],
      "alwaysAllow": []
    }
  }
}
```

# AWS Documentation MCP Server

**MCP構成ファイルへの追加**：
```json
"awslabs.aws-documentation-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.aws-documentation-mcp-server@latest"],
  "env": {
    "FASTMCP_LOG_LEVEL": "ERROR"
  },
  "disabled": false,
  "autoApprove": []
}

```

## どんなことができるの？
  - 公式のAWS検索APIを使用してドキュメントを検索する
  - AWSドキュメントページの内容に関する推奨事項を取得する
  - ドキュメントをMarkdown形式に変換する

## 実践

### AppSyncのJavaScriptリゾルバの使い方を聞いてみる

- プロンプト

```
AppSyncのJavaScriptリゾルバーでAuroraにCRUDを行う方法について教えてください。
SELECT, INSERT, UPDATE, DELETE全て教えてください。
```

<details><summary>AIの回答</summary>
AppSyncのJavaScriptリゾルバーでAuroraデータベースに対するCRUD操作について説明します：

1. **SELECT（読み取り）操作**
```javascript
import { select, createMySQLStatement, toJsonObject } from '@aws-appsync/utils/rds';

export function request(ctx) {
  const { id } = ctx.args;
  return createMySQLStatement(select({
    table: 'users',
    columns: ['id', 'name', 'email'],
    where: { id: { eq: id } }
  }));
}

export function response(ctx) {
  const { error, result } = ctx;
  if (error) {
    return util.appendError(error.message, error.type, result);
  }
  return toJsonObject(result)[0][0];
}
```

2. **INSERT（作成）操作**
```javascript
import { insert, createMySQLStatement, toJsonObject } from '@aws-appsync/utils/rds';

export function request(ctx) {
  const { input: values } = ctx.args;
  const insertStatement = insert({ 
    table: 'users', 
    values,
    // MySQLの場合、selectを組み合わせて挿入したデータを取得
    returning: '*'  // PostgreSQLの場合はreturningが使える
  });
  return createMySQLStatement(insertStatement);
}

export function response(ctx) {
  const { error, result } = ctx;
  if (error) {
    return util.appendError(error.message, error.type, result);
  }
  return toJsonObject(result)[0][0];
}
```

3. **UPDATE（更新）操作**
```javascript
import { update, createMySQLStatement, toJsonObject } from '@aws-appsync/utils/rds';

export function request(ctx) {
  const { input: { id, ...values } } = ctx.args;
  return createMySQLStatement(update({
    table: 'users',
    values,
    where: { id: { eq: id } },
    returning: ['id', 'name', 'email']  // PostgreSQLの場合
  }));
}

export function response(ctx) {
  const { error, result } = ctx;
  if (error) {
    return util.appendError(error.message, error.type, result);
  }
  return toJsonObject(result)[0][0];
}
```

4. **DELETE（削除）操作**
```javascript
import { remove, createMySQLStatement, toJsonObject } from '@aws-appsync/utils/rds';

export function request(ctx) {
  const { id } = ctx.args;
  return createMySQLStatement(remove({
    table: 'users',
    where: { id: { eq: id } },
    returning: ['id']  // PostgreSQLの場合
  }));
}

export function response(ctx) {
  const { error, result } = ctx;
  if (error) {
    return util.appendError(error.message, error.type, result);
  }
  return { id: ctx.args.id };
}
```

重要なポイント：

1. セキュリティ
- パラメータは必ずバインド変数として渡し、SQLインジェクションを防止
- 適切なエラーハンドリングを実装

2. データベース固有の機能
- PostgreSQLでは`returning`句が使用可能
- MySQLでは挿入後のデータ取得に別のSELECT文が必要

3. ユーティリティ関数の活用
- `toJsonObject`でレスポンスデータを適切な形式に変換
- `select`、`insert`、`update`、`remove`などの補助関数で安全なSQL文を生成

4. 条件指定
   - `where` 句で使用可能な演算子:
     - `eq`: 等しい, `ne`: 等しくない
     - `lt`: より小さい, `le`: 以下
     - `gt`: より大きい, `ge`: 以上
     - `contains`: LIKE
     - `beginsWith`: 前方一致
     - `between`: 範囲指定

</details>

### AWSの問題を解いてもらう

- 問題は以下の4問を採用

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Sample-Questions.pdf

- プロンプト（SAPのサンプル問題）

```
ある会社が、Amazon API Gateway、AWS Lambda 関数、Amazon Cognito、Amazon DynamoDB を 
使用するサーバーレスモバイルアプリケーションを実行しています。トラフィックが急増すると、ユーザーか
ら、断続的にシステム障害が発生しているとの報告があります。API Gateway API エンドポイントが、 
有効なリクエストに対して HTTP ステータスコード 502 (Bad Gateway) エラーを返しています。  
この問題を解決するソリューションはどれですか。 

A) Lambda 関数の同時実行クォータを増やす。ConcurrentExecutions メトリクスがクォータに近づいた 
ときに通知アラートを送信するように Amazon CloudWatch を設定する。 
B) API Gateway API エンドポイントの 1 秒あたりのトランザクションクォータに関する通知アラートを 
設定する。クォータに達したときにクォータを増やす Lambda 関数を作成する。 
C) 複数の AWS リージョンの Amazon Cognito ユーザープールにユーザーをシャーディングして、 
ユーザー認証のレイテンシーを低減する。 
D) DynamoDB の強力な整合性のある読み込みを使用して、クライアントアプリケーションが常に最新の 
データを受信できるようにする。 
```

- AIの回答（SAPのサンプル問題）

```
正解は A) です。

理由：

502 Bad Gatewayエラーが発生する主な原因は、トラフィック急増時にLambda関数の同時実行制限に達することです。

この解決策には2つの重要な要素があります：

同時実行クォータの増加：トラフィック急増時にも対応できるよう、処理能力を向上
CloudWatch監視の設定：問題が発生する前に予防的に対応可能
他の選択肢はいずれも502エラーの根本的な原因（Lambda関数の同時実行制限）に対処していません：

B) API Gatewayのクォータは、この問題の原因ではありません
C) Cognitoのシャーディングは認証の問題に対処するもので、502エラーとは無関係です
D) DynamoDBの読み込み設定は、データの一貫性に関するもので、502エラーとは無関係です
```

- 問題の解答（SAPのサンプル問題）

```
4) A – Amazon API Gateway は、AWS Lambda 関数が同時実行クォータを超えると、HTTP ステータスコード 
502 (Bad Gateway) エラーを断続的に返します。この場合、API Gateway はリクエストが多すぎるとステータ
スコード 429 エラーを返すため、オプション B は正しくありません。エラーは認証プロセス中ではなく、 
API Gateway API エンドポイントの呼び出し中に発生するため、オプション C は正しくありません。 
古いデータによって Bad Gateway エラーは発生しないため、オプション D は正しくありません。 
```

# AWS CDK MCP Server

- **追加の前提条件**：
  - `npm install -g aws-cdk`コマンドでAWS CDK CLIをインストール

**MCP構成ファイルへの追加**：
```json
"awslabs.cdk-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.cdk-mcp-server@latest"],
  "env": {
    "FASTMCP_LOG_LEVEL": "ERROR"
  },
  "disabled": false,
  "autoApprove": []
}
```

## どんなことができるの？
  - AWS CDKプロジェクトの分析と支援
  - CDKコンストラクトの推奨
  - Infrastructure as Code（IaC）のベストプラクティスの提供

## 実践

### AIにCDKを分析してもらう！

- 今回利用したサンプルコード（AWS CDKのECSサンプル（TypeScript））

https://github.com/aws-samples/aws-cdk-examples/tree/main/typescript/ecs

- プロンプト

```
@/aws-cdk-ecs-example 
現在のCDKプロジェクトの構成に問題がないかAWS CDK MCP Serverを使用して分析してください。
```

- AIの回答

```
AWS CDKプロジェクトの分析結果と推奨事項：

1. プロジェクト構造の評価：
- 適切なモジュール分割がされており、各サービスパターンが個別のディレクトリに分かれています
- Cluster、ECS Service、Fargateなど、論理的な分類で整理されています

2. セキュリティの観点：
- VPCの設定でAZを2つに制限している点は、リソースクォータ管理の観点で適切です
- ただし、CDK Nagによるセキュリティチェックが実装されていない可能性があります
  
3. 改善推奨点：
- Lambda PowertoolsによるObservabilityの実装が必要です
- タスク定義でコンテナイメージを直接指定せず、ECRリポジトリの参照を推奨します
- ApplicationLoadBalancedFargateServiceの設定で以下を追加することを推奨します：
  - メモリとCPUの明示的な指定
  - AutoScalingの設定
  - ヘルスチェックの詳細設定
  - カスタムVPCエンドポイントの設定

4. ベストプラクティス適用状況：
- AWS Solutions Constructsのパターンを活用できています
- 基本的なインフラストラクチャ定義は適切に実装されています
- ただし、環境変数やシークレット管理の実装が必要かもしれません

5. 運用面の推奨事項：
- CloudWatch Logsの統合
- X-Rayトレーシングの有効化
- リソースタグ付けの実装
```

# AWS Diagram MCP Server

**MCP構成ファイルへの追加**：
```json
"awslabs.aws-diagram-mcp-server": {
  "command": "uvx",
      "args": ["awslabs.aws-diagram-mcp-server"],
  "env": {
    "FASTMCP_LOG_LEVEL": "ログレベル" // ERROR等
  },
  "autoApprove": [],
  "disabled": false
}
```

## どんなことができるの？
  - Pythonコードを使用してAWSアーキテクチャ、シーケンス図、フローチャート、クラス図を作成できます
  - 図の外観、レイアウト、およびスタイルをカスタマイズできます
  - セキュアな図の生成を保証するためにコードスキャンを実行できます

## 実践

### AIにインフラ構成図を書いてもらう

先ほどのCDKと同じプロジェクトのインフラ構成図を書いてもらう。

- プロンプト

```
@/aws-cdk-ecs-example 
上記のCDKのインフラ構成図を作成してください。
```

- AIの回答

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/7f8061b0-f633-4fcd-8c86-7678daf003cf.png)

# Cost Analysis MCP Server

**MCP構成ファイルへの追加**：
```json
"awslabs.cost-analysis-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.cost-analysis-mcp-server@latest"],
  "env": {
    "FASTMCP_LOG_LEVEL": "ERROR",
    "AWS_PROFILE": "あなたのAWSプロファイル"
  },
  "disabled": false,
  "autoApprove": []
}
```

## どんなことができるの？
- AWSのコスト分析ができます
- 自然言語でコストデータを問い合わせることができます
- コストレポートとインサイトを生成することができます

## 実践

### AIにコスト分析をしてもらう

先ほどのCDKと同じプロジェクトのコスト分析をしてもらう。

- プロンプト

```
@/aws-cdk-ecs-example 
上記のCDKのインフラ構成はどのくらいの料金がかかるか計算してください。
```

- AIの回答

```
AWS ECS Example の月間予想コスト内訳は以下の通りです：

### 1. AWS Fargate コスト
- vCPU (2 vCPU)
  - 単価: $0.0505600/vCPU/時
  - 月間コスト: $0.0505600 × 2 vCPU × 24時間 × 30日 = $72.80
- メモリ (4 GB)
  - 単価: $0.0055300/GB/時
  - 月間コスト: $0.0055300 × 4 GB × 24時間 × 30日 = $15.93
- Fargate 合計: $88.73/月

### 2. Application Load Balancer
- ALB基本料金: $0.0225/時
- 月間コスト: $0.0225 × 24時間 × 30日 = $16.20

### 3. Amazon EFS
- 標準ストレージ (100GB想定)
- 単価: $0.30/GB/月
- 月間コスト: $0.30 × 100GB = $30.00

### 合計月間コスト: 約 $134.93 (約 ¥20,240)

コスト最適化のための推奨事項：
1. Fargateの代わりにEC2インスタンスの使用を検討（約40%のコスト削減の可能性）
2. 夜間や休日のワークロードが少ない時間帯にAutoScalingで縮小
3. EFSの使用量を定期的に監視し、不要なデータを削除

※ 注意事項：
- データ転送コストは含まれていません
- 実際のコストは使用パターンによって変動します
- 為替レート: 1ドル=150円で計算
```

# AWS Terraform MCP Server

**MCP構成ファイルへの追加**：
```json
{
  "mcpServers": {
    "awslabs.terraform-mcp-server": {
      "command": "uvx",
      "args": ["awslabs.terraform-mcp-server@latest"],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
```

## どんなことができるの？
  - Security-First Development Workflowを提供します
  - Checkovとの統合が可能です
    - `Checkov` は、IaCファイルを静的に解析し、セキュリティやコンプライアンス上のミスコンフィギュレーションをデプロイ前に検出するCLI ツール
  - AWSおよびAWSCCプロバイダーのドキュメントにアクセスできます
  - AWS-IA GenAIモジュールを利用できます
    - `AWS‑IA GenAI` は、AWSの生成AIサービス（主に Amazon Bedrock）をコードベースで簡単にデプロイ・構築できるコンポーネント群
  - Terraformのワークフローを実行できます

## 実践

### AIにCDKのコードをTerraformに直してもらう

- プロンプト

```
@/aws-cdk-ecs-example 
上記のコードをTerraformに直してください。
```

- AIの回答

```
AWS CDKのECSクラスターの例をTerraformに変換しました。
主な変換内容は以下の通りです：

1. VPCとサブネットの作成（2つのAZ）
2. ECSクラスターの作成
3. Auto Scaling Groupの作成（ARM64インスタンスを使用）
4. ECS Capacity Providerの設定

作成されたファイル構成：
- main.tf: メインのリソース定義
- variables.tf: 変数定義
- outputs.tf: 出力定義
- provider.tf: AWSプロバイダーの設定

使用方法：
cd aws-terraform-ecs-example
terraform init
terraform plan
terraform apply

```

生成されたコードは以下

- フォルダ構成

```
aws-terraform-ecs-example
├── LICENSE
├── README.md
├── main.tf
├── outputs.tf
├── provider.tf
└── variables.tf
```

https://github.com/ryomeblog/aws-terraform-ecs-example

# AWS Lambda MCP Server

**MCP構成ファイルへの追加**：
```json
"awslabs.lambda-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.lambda-mcp-server@latest"],
  "env": {
    "AWS_PROFILE": "あなたのAWSプロファイ",
    "AWS_REGION": "リージョン",
    "FUNCTION_PREFIX": "関数プレフィックス", // 今回はこれを使用
    "FUNCTION_LIST": "関数名1, 関数名2",
    "FUNCTION_TAG_KEY": "タグキー",
    "FUNCTION_TAG_VALUE": "タグ値"
  }
}
```

- Lambdaを事前に作成しておく必要があります
  - `mcp.json` の `FUNCTION_PREFIX` に関数名を入れておく

![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e07cd3a1-7c60-4873-adc1-5cec62f760b6.png)

## どんなことができるの？
  - MCPクライアントとAWS Lambda関数の間の橋渡しとして機能し、基盤モデル（FMs）がLambda関数をツールとしてアクセスして実行できるようにします
  - Lambda関数の説明は、MCPがツールを記述するために使用され、いつ（関数は何を提供するのか？）およびどのように（どのパラメータが必要か？どの構文か？）それを使用するかについて、基盤モデルを導く必要があります

### つまり、、、
  - 簡単にLambdaが実行できます
  - 自然言語でLambdaが実行できます

## 実践

### AIにLambdaの呼び出しをしてもらう

- プロンプト

```
Lambda関数のAWS-MCP-TESTを実行してください。
```
- AIの回答

```
Lambda関数AWS-MCP-TESTを実行し、以下の結果を得ました：

ステータスコード: 200
レスポンス: "Hello from Lambda!" 正常に実行が完了しました。
```

### AIにLambdaを経由して検索してもらう

LambdaにDynamoDBから値を取得する処理を加えLambda動かせるか検証

- プロンプト

```
LambdaからcustomerIdが1番の顧客データを取得してください。
```

- AIの回答

```
customerID: 1の顧客データは以下の通りです：

{
  "customerId": "1",
  "name": "山田太郎",
  "age": 30,
  "email": "yamada@example.com"
}
```


# Amazon Bedrock Knowledge Base Retrieval MCP Server

**MCP構成ファイルへの追加**：
```json
"awslabs.bedrock-kb-retrieval-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.bedrock-kb-retrieval-mcp-server@latest"],
  "env": {
    "AWS_PROFILE": "あなたのAWSプロファイル",
    "AWS_REGION": "リージョン",
    "FASTMCP_LOG_LEVEL": "ERROR"
  },
  "disabled": false,
  "autoApprove": []
}
```

## どういうことができるの？
  - ナレッジベースとそのデータソースの発見
  - 自然言語でのナレッジベースへのクエリ
  - データソースによる結果のフィルタリング
  - 結果の再ランキング

# Amazon Nova Canvas MCP Server

**MCP構成ファイルへの追加**：
```json
"awslabs.nova-canvas-mcp-server": {
  "command": "uvx",
  "args": ["awslabs.nova-canvas-mcp-server@latest"],
  "env": {
    "AWS_PROFILE": "あなたのAWSプロファイル",
    "AWS_REGION": "リージョン",
    "FASTMCP_LOG_LEVEL": "ログレベル" // ERROR等
  },
  "disabled": false,
  "autoApprove": []
}
```

- Amazon BedrockのAmazon Nova Canvasモデルの有効化が必要

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/2296467a-5929-4e1e-a0cf-d478bc18833d.png)

## どういうことができるの？
  - テキストに基づいた画像の生成を、カスタマイズ可能なパラメータを用いて行うことができます
  - 特定の色パレットを用いた、色に基づいた画像の生成が可能です
  - 生成された画像を保存するためのワークスペース統合を提供します