☁️ 技術調査 - AWS MCP Server
目次

⚠️ 非公開(zenn 未公開)

☁️ 技術調査 - AWS MCP Server

調査日: 2026-05-07 / 対象: マネージド版 AWS MCP Server (GA: 2026-05-06)

概要

AWS MCP Server は、AWS がフルマネージドで提供するリモート MCP (Model Context Protocol) サーバーです。Claude Code / Cursor / Kiro / Codex / Q Developer CLI などの MCP クライアントから、AWS の 15,000 以上の API を呼び出すための公式の接続面を提供します。2025 年 12 月の re:Invent で preview として発表され、2026 年 5 月 6 日に GA となりました。

このサービスの本質は、AI エージェントに AWS 操作を委譲する経路の標準化です。これまで設計者ごとにバラバラだった統制点 (クレデンシャル管理 / AI 由来の識別 / 監査) を、1 本のマネージドゲートウェイに集約できます。

GA 同日に上位概念として Agent Toolkit for AWS が発表されました。Agent Toolkit は「Agent Skills + AWS MCP Server + Agent Plugins」の 3 本柱で構成され、AWS MCP Server がその中核コンポーネントです。

関連技術との関係

技術 AWS MCP Server との関係
MCP プロトコル クライアント / サーバー間の通信規格。AWS MCP Server は MCP 準拠のリモートサーバーとして動作します
awslabs/mcp 自走 OSS 群 AWS が公開する 60+ のオープンソース MCP サーバー群。クライアント PC や自前コンテナで実行します。マネージド版とは別物です
IAM + コンテキストキー GA でグローバル条件コンテキストキー (aws:ViaAWSMCPService / aws:CalledViaAWSMCP) が追加されました
CloudTrail MCP Server 経由の全 API 呼び出しを Data event として自動記録します
MCP Proxy for AWS ローカルで起動する公式 OSS プロキシ。MCP クライアントの stdio を AWS Credential Provider Chain ベースの SigV4 署名付き HTTPS に変換します

特徴

GA 時点の基本仕様

項目 内容
エンドポイント https://aws-mcp.us-east-1.api.aws/mcp / https://aws-mcp.eu-central-1.api.aws/mcp (2 リージョン)
認証 SigV4 + MCP Proxy for AWS。IAM Identity Center (SSO) を推奨
提供ツール数 11 個 (Knowledge 6 種 + API 5 種)
Skills 動的取得 (retrieve_skill で runtime 解決)
課金 サーバー本体は無料。実行された AWS リソース + データ転送のみ
対応クライアント Claude Code / Claude Desktop / Cursor / Kiro / Kiro CLI / Codex / 任意の MCP 互換クライアント

提供ツール一覧

Knowledge ツール (6 種)

ツール名 機能
retrieve_skill AWS ドメイン固有の Skills (ワークフロー・ベストプラクティス・手順) を取得
search_documentation API リファレンス・ベストプラクティス・サービスガイド・Skills を横断検索 (GA から認証不要)
read_documentation AWS ドキュメントページを Markdown 形式で取得
recommend 関連トピックや閲覧頻度に基づくドキュメント推薦
list_regions 全 AWS リージョンの識別子と名称を取得
get_regional_availability サービス・機能・SDK API・CloudFormation リソースのリージョン別提供状況を確認

API ツール (5 種)

ツール名 機能
call_aws 15,000 以上の AWS API を認証・構文バリデーション付きで実行するユニバーサルゲートウェイ
suggest_aws_commands AWS API の説明と構文ヘルプを返す (新規 API も対応)
run_script サーバー側サンドボックスで Python を実行。IAM 権限を継承し並列 API 呼び出しに対応
get_presigned_url Amazon S3 の署名付き URL を生成
get_tasks call_awsrun_script が返した task ID のステータスをポーリング

IAM コンテキストキー

GA でグローバル条件コンテキストキーが正式に追加されました。

キー 用途
aws:ViaAWSMCPService true AWS MCP Server 経由の全リクエストに自動付与
aws:CalledViaAWSMCP aws-mcp.amazonaws.com 経由した MCP サーバーを識別

公式に確認できたグローバル条件コンテキストキーは上記 2 種です。同一 IAM プリンシパルでも「MCP 経由では書き込み禁止、人間の Bash 経由は許可」のチャネル別最小権限を設計できます。Preview 期に Service Authorization Reference に登場していた aws-mcp:InvokeMcp 等の独自 action については、GA 時点の公式ガイドが下流 IAM + コンテキストキーによる制御に重心を移しているため、新規設計ではコンテキストキーを起点に組み立てることを推奨します。

CloudTrail での監査

フィールド
eventSource aws-mcp.us-east-1.api.aws (または eu-central-1)
eventName CallTool
eventCategory Data (Data Event として記録)
eventType AwsMcpEvent (MCP 専用イベントタイプ)
mcpEventDetails sessionId / mcpProtocolVersion / serverVersion / mcpServerName / executionTimeMs

プロンプト本文は CloudTrail に残りません。発話レベルの監査が必要な場合は MCP クライアント側のセッションログを別途保存します。

Preview からの主な変化点

  1. IAM コンテキストキーの正式化 (Preview 期は別ロールが必要だったが、コンテキストキーで同一プリンシパルから絞り込める)
  2. ドキュメント取得の認証不要化 (search_documentation / read_documentation が匿名利用可能)
  3. トークン消費の削減 (ツール定義・応答の slim 化)
  4. Agent SOP から Agent Skills へ移行
  5. run_script ツールの追加 (サーバー側 Python サンドボックス)

代替アプローチとの比較

アプローチ クレデンシャル流路 認可境界 監査の粒度 ベンダーロックインリスク
AWS MCP Server (マネージド) クライアントが SigV4 署名。MCP サーバーは credentials を保持しない IAM + コンテキストキーで AI 経由を識別 CloudTrail Data event + mcpEventDetails MCP 仕様の breaking change への追従は AWS 任せ。SLA 未公開
awslabs/mcp 自走 OSS サーバープロセスが ~/.aws/credentials を保持 IAM のみ。AI 識別は session tag を自前付与 CloudTrail に通常 API として記録。MCP 経由の識別は弱い Apache-2.0 OSS。脆弱性対応も自前
Bash + aws CLI 直叩き シェルセッションの ~/.aws/credentials IAM のみ CloudTrail のみ LLM が組み立てた任意文字列を shell が実行するリスクが最大
Q Developer CLI AWS Builder ID / IAM Identity Center Q CLI が MCP クライアント CloudTrail + Q セッションログ AWS サービスへの依存度が高い
Lambda + Step Functions Lambda 実行ロール (静的) IAM ロール固定 + Step Functions 入力 JSON CloudTrail + Step Functions 履歴 エージェント的な柔軟性は劣る

構造

システムコンテキスト図

プロンプト指示 MCP protocolstdio HTTPS SigV4 リクエストaws ViaAWSMCPService true 認可済み呼び出し ツール呼び出し記録AwsMcpEvent メトリクス送信 クレデンシャル提供 人間の開発者 AI エージェントMCP 互換クライアント AWS MCP ServerManaged Remote IAMGlobal ConditionContext Keys AWS APIs15000+ オペレーション CloudTrailData Events CloudWatchAWS-MCP namespace IAM Identity CenterSSO
要素名 説明
人間の開発者 AI エージェントへの自然言語指示と AWS 操作方針の意思決定
AI エージェント MCP クライアントとして動作し、ツール呼び出しを生成・実行
AWS MCP Server MCP プロトコルの受信と AWS API への変換・転送。AWS がフルマネージドで運用
IAM + Global Condition Context Keys aws:ViaAWSMCPService / aws:CalledViaAWSMCP の評価による認可制御
AWS APIs EC2 / S3 / Lambda 等 15,000+ API エンドポイント群
CloudTrail Data Events MCP 経由の全ツール呼び出しを AwsMcpEvent として自動記録
CloudWatch スループット / エラー率 / レイテンシのメトリクス収集
IAM Identity Center AI エージェントクライアントへの短命クレデンシャル提供

コンテナ図

クライアント側 ローカル AWS MCP Server Managed AWS プラットフォーム HTTPS SigV4 SigV4 リクエスト AwsMcpEvent メトリクス stdio Knowledge 系 call_aws run_script get_tasks task_id 発行 MCP クライアントAI エージェント本体 MCP Proxy for AWSSigV4 ブリッジ MCP Server EndpointHTTPS StreamableHTTP Tool Dispatcherツール振り分け Skills RegistrySkills 動的解決 call_aws BridgeAPI 変換 転送 run_script SandboxPython 実行環境 Task Manager非同期タスク管理 IAM Context Key認可エンジン AWS APIs CloudTrail CloudWatch
要素名 説明
MCP クライアント AI エージェント本体。stdio で Proxy に接続
MCP Proxy for AWS stdio と HTTPS+SigV4 の変換。AWS Credential Provider Chain で署名
MCP Server Endpoint HTTPS リクエスト受信。MCP プロトコル処理の入口
Tool Dispatcher ツール名に応じて Knowledge / API / Sandbox / Task に振り分け
Skills Registry 動的 Skills の保持・解決
call_aws Bridge MCP ツール呼び出しを SigV4 署名付き AWS API リクエストに変換・転送
run_script Sandbox サーバー側 Python 実行環境。複数 API の横断処理を担当
Task Manager 長時間タスクの非同期管理
IAM 認可エンジン aws:ViaAWSMCPService 等を評価し最終的な認可判断
CloudTrail MCP イベントの永続記録
CloudWatch 運用メトリクスの収集・集計

コンポーネント図 (MCP Proxy for AWS の内部)

stdio TransportMCP 受信層 SigV4 SignerAWS 署名処理 Credential Provider Chaincredentials env SSO role Read-Only Filterread-only フラグ制御 Metadata InjectorAWS_REGION 注入 HTTPS Clientタイムアウト管理
要素名 説明
stdio Transport MCP クライアントからの JSON-RPC 受信
SigV4 Signer リクエストへの AWS Signature Version 4 署名付与
Credential Provider Chain 認証情報の解決順序管理 (~/.aws/credentials → 環境変数 → SSO → assume-role)
Read-Only Filter readOnlyHint=true でないツールを無効化するガード
Metadata Injector MCP リクエストにキーバリューを付加
HTTPS Client 上流への HTTPS 送信とタイムアウト制御

コンポーネント図 (Tool Dispatcher の内部)

Tool Routeraws プレフィックス解決 Knowledge Handlerretrieve_skillsearch_documentationread_documentationrecommend list_regionsget_regional_availability API Handlercall_awssuggest_aws_commandsget_presigned_url Script Handlerrun_script Task Handlerget_tasks
要素名 説明
Tool Router aws___ プレフィックスを受けて適切なハンドラへルーティング
Knowledge Handler Skills / ドキュメント / リージョン情報の検索・取得
API Handler call_aws から SigV4 Bridge への変換と API 提案・プリサインド URL 生成
Script Handler Python コードをサンドボックスで実行
Task Handler 非同期タスクのステータスポーリング対応

コンポーネント図 (IAM Context Key 注入と CloudTrail 記録)

AWS MCP Server Managed IAM 認可層 監査層 コンテキストキー付与 AwsMcpEvent 記録 sessionId 埋め込み IAM Context Key Injectoraws ViaAWSMCPService trueaws CalledViaAWSMCP CloudTrail Event PublisherAwsMcpEvent CallTool Session Context HoldersessionId Condition Key EvaluatorBool StringEquals 評価 Policy EngineDeny Allow 判定 CloudTrail Data StoreeventCategory DataeventSource aws-mcp
要素名 説明
IAM Context Key Injector MCP 経由の全リクエストに自動でコンテキストキーを付与
CloudTrail Event Publisher ツール呼び出しを CloudTrail Data イベントとして発行
Session Context Holder クライアントセッション ID を保持し監査レコードに埋め込み
Condition Key Evaluator IAM ポリシーの Condition ブロックでコンテキストキーを評価
Policy Engine Deny / Allow の最終判定
CloudTrail Data Store eventSource: aws-mcp.<region>.api.aws でフィルタ可能な永続ストア

データ

概念モデル

クライアント側 AWS MCP Server AWS 基盤 呼び出す 自動注入 記録 認証 SigV4 参照する 認可条件 含む requestParameters に保存 responseElements に保存 IAM Principal Session Tool Skill IAM Context Key AWS API Call CloudTrail Data Event mcpEventDetails
エンティティ 説明
IAM Principal AWS MCP Server を呼び出すユーザー/ロール
Session MCP Proxy for AWS が確立するクライアント接続単位
Tool AWS MCP Server が提供する機能単位 (11 個)
Skill Tool から動的取得される手順・ベストプラクティスの知識単位
IAM Context Key MCP 経由リクエストに自動付与されるグローバルコンテキストキー
AWS API Call call_awsrun_script が実行する AWS サービス API 呼び出し
CloudTrail Data Event MCP の全ツール呼び出しを記録するイベント
mcpEventDetails CloudTrail Data Event に埋め込まれる MCP 固有の詳細フィールド群

情報モデル

Session : string: sessionId : string: mcpProtocolVersion : string: serverVersion : string: mcpServerName Tool : string: name : string: category : string: description : bool: readOnlyHint Skill : string: name : string: domain : string: content IamPrincipal : string: principalType : string: arn : string: accountId IamContextKey : bool: viaAWSMCPService : string: calledViaAWSMCP AwsApiCall : string: service : string: action : string: region : map: requestParams CloudTrailEvent : string: eventVersion : string: eventCategory : string: eventType : string: eventSource : string: eventName : string: eventTime : string: awsRegion : string: sourceIPAddress : string: requestID : string: eventID : bool: readOnly : string: recipientAccountId : list: resources RequestParameters : string: method : map: params : string: id ResponseElements : list: content : bool: isError ContentItem : string: type : string: text McpEventDetails : string: sessionId : string: mcpProtocolVersion : string: serverVersion : string: mcpServerName : int: executionTimeMs 認証 呼び出す 参照 自動注入 認可条件 生成 requestParameters 1 1 responseElements 1 1 mcpEventDetails 1 1 content 1 1..* params として保存
エンティティ 説明
Session MCP クライアントとサーバー間のセッション。sessionId が CloudTrail と MCP クライアントログの突合キー
Tool AWS MCP Server が公開するツール単位。readOnlyHint フラグでプロキシの --read-only モードと連動
Skill retrieve_skill で動的取得される手順書
IamPrincipal 呼び出し元の IAM 識別子。CloudTrail の userIdentity ブロックに対応
IamContextKey 全 MCP リクエストに自動付与されるコンテキストキー
AwsApiCall call_aws / run_script が実行する下流 AWS API
CloudTrailEvent eventType: AwsMcpEvent / eventCategory: Data で識別される MCP 専用イベント
RequestParameters MCP リクエストの複製
ResponseElements ツール応答
ContentItem content リストの各要素
McpEventDetails CloudTrail イベントに埋め込まれる MCP 固有サブオブジェクト

構築方法

前提条件

項目 要件
AWS CLI 2.32.0 以上 (aws login を使う場合)
uv / uvx Python パッケージランナー
AWS アカウント IAM Identity Center (SSO) を有効化 (推奨)
ネットワーク https://aws-mcp.us-east-1.api.aws または eu-central-1 への HTTPS アウトバウンド
対応 OS macOS / Linux / Windows

IAM Identity Center 事前設定 (推奨)

  1. AWS マネジメントコンソールで IAM Identity Center を有効化
  2. 管理者ユーザーを作成し、最小権限の Permission Set を割り当て
  3. aws configure sso または aws login でローカル CLI を認証

mcp-proxy-for-aws のインストール

uvx (推奨)

# uv のインストール (macOS / Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# 起動確認
uvx mcp-proxy-for-aws@latest --help

ローカル clone (バージョン固定)

git clone https://github.com/aws/mcp-proxy-for-aws.git
cd mcp-proxy-for-aws
uv run mcp_proxy_for_aws/server.py https://aws-mcp.us-east-1.api.aws/mcp

Docker (公式 ECR イメージ)

docker pull public.ecr.aws/mcp-proxy-for-aws/mcp-proxy-for-aws:latest

主要 CLI フラグ

フラグ 説明 デフォルト
endpoint MCP エンドポイント URL (必須位置引数)
--region SigV4 署名に使う AWS リージョン AWS_REGION 環境変数
--profile 使用する AWS 認証プロファイル AWS_PROFILE 環境変数
--metadata MCP リクエストに注入する key=value ペア --region から自動注入
--read-only readOnlyHint=true のないツールを無効化 False
--retries 上流へのリトライ回数 0
--tool-timeout ツール呼び出し 1 回の最大秒数 300
--timeout 全操作のタイムアウト秒数 180
--connect-timeout 接続タイムアウト秒数 60
--read-timeout 読み取りタイムアウト秒数 120
--write-timeout 書き込みタイムアウト秒数 180
--log-level ログレベル INFO
--disable-telemetry テレメトリ収集を無効化 False
--service SigV4 署名のサービス名 自動推定

バージョン確認

uvx mcp-proxy-for-aws@latest --version

利用方法

必須パラメータ

パラメータ 値・説明 必須
transport stdio Yes
endpoint https://aws-mcp.<region>.api.aws/mcp Yes
--metadata AWS_REGION=<region> AWS API 操作のデフォルトリージョン 推奨
--profile <profile> 使用する AWS プロファイル名 No
--region <region> SigV4 署名に使うリージョン No
--read-only 書き込み系ツールを無効化 No

IAM Identity Center 認証

aws login (推奨, 15 分ごと自動ローテーション)

aws login
# ブラウザが開きマネジメントコンソールと同じ認証情報でサインイン。最大 12 時間有効

aws configure sso (推奨)

aws configure sso
aws sso login --profile my-sso-profile
aws sts get-caller-identity --profile my-sso-profile

Static IAM Access Key (非推奨)

aws configure
# 90 日ごとのローテーションが必要。自動更新なし

Cross-account Assume-Role

# ~/.aws/config
[profile my-role]
role_arn = arn:aws:iam::123456789012:role/MyRole
source_profile = default
region = us-east-1
uvx mcp-proxy-for-aws@latest https://aws-mcp.us-east-1.api.aws/mcp \
  --profile my-role \
  --metadata AWS_REGION=ap-northeast-1

各 MCP クライアントへの接続設定

Claude Desktop

{
  "mcpServers": {
    "aws-mcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy-for-aws@latest",
        "https://aws-mcp.us-east-1.api.aws/mcp",
        "--metadata", "AWS_REGION=ap-northeast-1"
      ]
    }
  }
}

Claude Code (CLI)

claude mcp add-json aws-mcp --scope user \
  '{"command":"uvx","args":["mcp-proxy-for-aws@latest","https://aws-mcp.us-east-1.api.aws/mcp","--metadata","AWS_REGION=ap-northeast-1"]}'

Cursor IDE (.cursor/mcp.json)

{
  "mcpServers": {
    "aws-mcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy-for-aws@latest",
        "https://aws-mcp.us-east-1.api.aws/mcp",
        "--metadata", "AWS_REGION=ap-northeast-1"
      ]
    }
  }
}

Kiro CLI / Kiro IDE

{
  "mcpServers": {
    "aws-mcp": {
      "command": "uvx",
      "timeout": 100000,
      "transport": "stdio",
      "args": [
        "mcp-proxy-for-aws@latest",
        "https://aws-mcp.us-east-1.api.aws/mcp",
        "--metadata", "AWS_REGION=ap-northeast-1"
      ]
    }
  }
}

Codex (~/.codex/config.toml)

[mcp_servers.aws_mcp]
command = "uvx"
args = [
  "mcp-proxy-for-aws@latest",
  "https://aws-mcp.us-east-1.api.aws/mcp",
  "--metadata", "AWS_REGION=ap-northeast-1"
]
startup_timeout_sec = 60

接続テスト

Kiro CLI で:

/tools
/mcp

プロンプトで「利用可能な AWS リージョンを一覧してください」と入力すると、aws___list_regions が呼ばれます。

基本的な Tool 呼び出し例

S3 バケット一覧

{
  "tool": "aws___call_aws",
  "arguments": {
    "service": "s3",
    "operation": "list_buckets",
    "region": "ap-northeast-1"
  }
}

ドキュメント検索

{
  "tool": "aws___search_documentation",
  "arguments": {
    "query": "S3 bucket policy configuration",
    "topic": "s3"
  }
}

Python サンドボックスで複数 API を横断集計

{
  "tool": "aws___run_script",
  "arguments": {
    "code": "import boto3\nfor region in ['ap-northeast-1', 'us-east-1']:\n    client = boto3.client('lambda', region_name=region)\n    resp = client.list_functions()\n    print(f'{region}: {len(resp[\"Functions\"])} functions')"
  }
}

長時間タスクのポーリング

{
  "tool": "aws___get_tasks",
  "arguments": {
    "task_id": "<前の呼び出しで返された task_id>"
  }
}

read-only モード

AWS MCP Server に「read-only フラグ」は存在しません。read-only 制御は IAM ポリシーと aws:ViaAWSMCPService コンテキストキーで行います。

MCP 経由の破壊的操作をすべて拒否

{
  "Effect": "Deny",
  "Action": [
    "s3:DeleteBucket",
    "s3:DeleteObject",
    "ec2:TerminateInstances",
    "rds:DeleteDBInstance"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "aws:ViaAWSMCPService": "true"
    }
  }
}

特定 MCP サーバー経由の操作のみ拒否

{
  "Effect": "Deny",
  "Action": ["s3:DeleteBucket", "s3:DeleteObject"],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:CalledViaAWSMCP": "aws-mcp.amazonaws.com"
    }
  }
}

mcp-proxy-for-aws の --read-only フラグ

uvx mcp-proxy-for-aws@latest \
  https://aws-mcp.us-east-1.api.aws/mcp \
  --read-only \
  --metadata AWS_REGION=ap-northeast-1

ただし IAM 側のガードと併用することを推奨します。

運用

CloudTrail Data Event の確認方法

AWS MCP Server を経由したツール呼び出しは CloudTrail Data Event として記録されます。Trail のデフォルトでは Management Event のみが記録されるため、MCP ツール呼び出しを Trail / Lake に保存するには「Data event selector」で aws-mcp リソースタイプを明示的に追加します。Event history (90 日) では Data Event は閲覧できない点にも注意します。

フィールド
eventSource aws-mcp.us-east-1.api.aws または eu-central-1
eventName CallTool
eventCategory Data
eventType AwsMcpEvent

Athena クエリ例

-- 直近 24 時間の MCP ツール呼び出し
SELECT
  eventtime,
  json_extract_scalar(requestparameters, '$.method') AS tool_name,
  json_extract_scalar(mcpeventdetails, '$.sessionId') AS session_id,
  json_extract_scalar(mcpeventdetails, '$.executionTimeMs') AS exec_ms,
  readonly
FROM cloudtrail_logs
WHERE eventsource = 'aws-mcp.us-east-1.api.aws'
  AND eventname = 'CallTool'
  AND eventtime > date_add('hour', -24, now())
ORDER BY eventtime DESC;
-- 書き込み操作のみ抽出
SELECT eventtime, useridentity,
       json_extract_scalar(requestparameters, '$.method') AS tool_name
FROM cloudtrail_logs
WHERE eventsource = 'aws-mcp.us-east-1.api.aws'
  AND readonly = false
ORDER BY eventtime DESC;

プロンプト本文は CloudTrail に記録されません。MCP クライアントのセッションログを別途保存し、sessionId で突合します。

Athena 列名について: CloudTrail JSON のフィールド名は mcpEventDetails ですが、CloudTrail SerDe 経由で作成された Athena テーブルでは小文字化された mcpeventdetails 列としてマッピングされます。組織で利用する DDL の SerDe / 列名定義に合わせて参照してください。

CloudWatch Metrics

2026-03 の Preview 拡張モニタリングで AWS-MCP namespace のメトリクスが追加されました。GA 時点では公式仕様の網羅的なリファレンスが未公開のため、以下のメトリクス名・閾値・CloudFormation アラーム例は運用設計の出発点として参考にし、実環境では AWS Console の CloudWatch メトリクス一覧で実際に発行されているメトリクス名を確認したうえで採用してください。記載は確定情報ではありません。

メトリクス名 (想定) 単位 推奨閾値 用途
ToolInvocationCount Count ツール呼び出し総量。急増は予期しないエージェントループの検知
ToolErrorRate Percent > 5% でアラーム 認証エラー・タイムアウト・権限不足の統合エラー率
ToolResponseTokens Count > 20,000 でウォーニング 25K token 上限への接近を早期検知
ThrottledRequests Count > 0 が連続 5 分でアラーム 呼び出し先 AWS API のスロットリング
SessionCount Count 同時セッション数
ToolExecutionDurationMs Milliseconds p99 > 60,000ms でアラーム proxy 側 --tool-timeout 前に検知

CloudFormation アラーム例

McpHighErrorRateAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmName: aws-mcp-high-error-rate
    Namespace: AWS-MCP
    MetricName: ToolErrorRate
    Statistic: Average
    Period: 300
    EvaluationPeriods: 2
    Threshold: 5
    ComparisonOperator: GreaterThanThreshold
    TreatMissingData: notBreaching

セッション ID と MCP クライアントログの突合

CloudTrail には mcpEventDetails.sessionId が記録されますが、プロンプト本文は保存されません。

# ツール起動ごとに sessionId を RoleSessionName に埋め込む例
sts.assume_role(
    RoleArn='arn:aws:iam::111122223333:role/AgentDataRole',
    RoleSessionName=f'agent-{mcp_session_id[:28]}',
    Tags=[
        {'Key': 'McpSessionId', 'Value': mcp_session_id},
        {'Key': 'AccessType',   'Value': 'AI'},
    ]
)

インシデント調査の手順書に「CloudTrail の sessionId → MCP クライアントログの同 sessionId エントリ → プロンプト全文の取得」フローを明記します。

認証セッションのローテーション

方式 自動更新 セッション有効期間 推奨度
aws login 15 分ごと自動ローテーション 最大 12h 最推奨
aws configure sso キャッシュリフレッシュトークンでサイレント更新 既定 1h (最大 12h) 推奨
aws configure (static key) 自動更新なし 無期限 非推奨
Cross-account AssumeRole AWS SDK が透過的にリフレッシュ ロールセッション上限 (既定 1h) 状況に応じて

ExpiredTokenException が頻発する場合は aws login への切り替えを優先します。Static key はエージェント用ロールで使わない方針が原則です。

ベストプラクティス

IAM Context Keys を活用した最小権限設計

MCP 経由でのみ削除系 API を拒否

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyDestructiveViaMCP",
      "Effect": "Deny",
      "Action": [
        "s3:DeleteBucket",
        "s3:DeleteObject",
        "ec2:TerminateInstances",
        "rds:DeleteDBInstance",
        "iam:DeleteUser",
        "iam:DeleteRole"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:CalledViaAWSMCP": "aws-mcp.amazonaws.com"
        }
      }
    }
  ]
}

SCP / Permission Boundary でゲートを敷く

SCP: エージェント用ロールは MCP 経由でのみ使える

{
  "Sid": "AgentRoleMcpOnly",
  "Effect": "Deny",
  "Action": "*",
  "Resource": "*",
  "Condition": {
    "ArnLike": {
      "aws:PrincipalArn": "arn:aws:iam::*:role/AgentRole-*"
    },
    "Bool": {
      "aws:ViaAWSMCPService": "false"
    }
  }
}

Permission Boundary: エージェント用ロールの最大権限を ReadOnly に封じ込め

{
  "Sid": "AgentMaxPermissions",
  "Effect": "Allow",
  "Action": [
    "ec2:Describe*",
    "s3:Get*",
    "s3:List*",
    "cloudwatch:Get*",
    "cloudwatch:List*",
    "logs:Describe*",
    "logs:Get*",
    "logs:Filter*"
  ],
  "Resource": "*"
}

bash 経由の credential 流出を SCP で遮断

aws:ViaAWSMCPService は MCP 経由のリクエストにのみ付与されます。エージェントが bash ツールを保有している場合、bash 経由の aws CLI 呼び出しにはこのキーが付きません。

防御は 2 段構えで行います。

  1. MCP クライアント設定でエージェントから bash ツールを剥奪
  2. SCP で「AgentRole は ViaAWSMCPService=false の場合に Deny」を組織レベルで強制

read-only ガードレールの二重化

mcp-proxy-for-aws--read-only フラグは readOnlyHint=true が付いていないツールを無効化しますが、フラグだけに頼る運用は不十分です。Issue #2820 で報告されている通り、--read-only 適用時に公開ツールが極端に絞られすぎる UX 問題があります。

[クライアント設定]
  --read-only フラグ → ツールレベルの第一防衛線

[IAM ポリシー (エージェント用ロール)]
  ReadOnlyAccess + 削除/書き込み系の明示 Deny → 認可レベルの最終防衛線

段階導入

Phase 1: sandbox (検証環境)
  - エージェント用 IAM Role を新設
  - Permission Boundary で *Read* / *Describe* / *List* 系に限定
  - Claude Code から call_aws で動作確認
  - CloudTrail で eventSource=aws-mcp.* が記録されることを確認

Phase 2: staging
  - Permission Boundary を「read 全部 + 限定的 write」に拡張
  - aws:ViaAWSMCPService=true を Condition に明示した Deny ポリシー追加
  - SCP で「AgentRole は MCP 経由のみ」を強制
  - sessionId と CloudTrail の突合をインシデントドリルで確認

Phase 3: 本番 (限定スコープ)
  - IaC / 監査 / ドキュメント検索系から先行導入
  - run_script は stable な集計・ヘルスチェックから
  - プロンプト全文ログを Claude Code 側でローテーション保存し S3 に転送
  - 破壊的操作は Step Functions / Lambda 型に留置

マネージド版 + awslabs/mcp 自走 OSS の使い分け

ユースケース 推奨構成 理由
汎用 AWS API 呼び出し マネージド版 aws:ViaAWSMCPService が自動付与。CloudTrail Data Event で監査可能
AWS ドキュメント・スキル検索 マネージド版 search_documentation / retrieve_skill が安定
EKS / ECS 専用オペレーション awslabs/mcp (eks/ecs-mcp-server) マネージド版のカバレッジ外
DocumentDB / Redshift awslabs/mcp データベース専用 MCP がスキーマ理解で優位
IaC 生成 (CDK / Terraform) awslabs/mcp (aws-iac-mcp-server) terraform-mcp-server は 2026-03 に非推奨化
データソブリンティ要件 (AP リージョン) awslabs/mcp (自走) マネージド版は us-east-1 / eu-central-1 のみ

コンテキストキーが効くのはマネージド版経由のみです。自走 OSS を併用する場合は Session Tag (aws:PrincipalTag/AccessType=AI) を自前で付与し CloudTrail での識別を補います。

トラブルシューティング

# 症状 原因 対処
1 bash 経由で AWS API を叩いてしまい IAM Context Key が付かない エージェントが bash ツールを持っており MCP より bash を選択 MCP クライアント設定で bash を除外し、SCP で AgentRole を ViaAWSMCPService=false の場合に Deny
2 InvalidSignatureException / UnrecognizedClientException mcp-proxy-for-aws のバージョンが古く SigV4 署名の service / region が不一致 uvx mcp-proxy-for-aws@latest で最新版を使う
3 ExpiredTokenException が頻発 static access key または短命 STS トークンを使用中 aws login または aws configure sso に切り替え
4 25K token 上限超過でツール応答が reject される list 系をページネーションなしで呼んだ call_aws の引数に --max-items / --page-size を指定。または run_script の paginator で件数制御
5 --read-only 指定時に使えるツールが 1 個になる readOnlyHint=true が付いていないツールが全て無効化される (Issue #2820) --read-only フラグは使わず IAM 側で ReadOnlyAccess + Deny の二重化で制御
6 prompt injection によりツールが意図しない API を呼び出す 処理対象に隠しプロンプトが埋め込まれていた 入力サニタイズ、削除系 API の IAM Deny、ツール呼び出し前に人間の確認
7 アジア太平洋リージョンで latency が大きい エンドポイントは us-east-1 / eu-central-1 の 2 拠点のみ latency 許容度の高いユースケースに限定
8 run_script が巨大なレスポンスを返す スクリプト内でページネーションせず全件取得 スクリプト内に件数上限を組み込む。または S3 に書き出して get_presigned_url でダウンロード
9 call_aws の応答に task ID が返り結果が取れない 長時間処理は同期完了せず非同期 task ID を返す仕様 get_tasks ツールでポーリング (10–30 秒間隔)
10 旧 aws-api/knowledge-mcp-server と tool 名が競合 マネージド版と自走 OSS が同時登録 公式ガイドに従い旧サーバーを削除してからマネージド版を設定

bash 経由 API と IAM Context Key 欠落の構造

問題の構造:
  エージェントが bash で aws s3 ls を実行
  → aws:ViaAWSMCPService = (付与されない)
  → IAM Deny ポリシーの "StringEquals aws:CalledViaAWSMCP" が不一致
  → Deny が発火せず通過

対処の優先順位:
  1. MCP クライアントの tool permission 設定で bash を除外する (最優先)
  2. SCP で "AgentRole は ViaAWSMCPService=false で Deny" を組織レベルで強制
  3. bash が除外できない場合は Session Policy で AssumeRole ごとに権限を絞る

25K token 上限超過の対処

# run_script でページネーション制御する例
import boto3

client = boto3.client('ec2', region_name='ap-northeast-1')
paginator = client.get_paginator('describe_instances')
results = []
for page in paginator.paginate(PaginationConfig={'MaxItems': 20, 'PageSize': 10}):
    for reservation in page['Reservations']:
        results.extend(reservation['Instances'])
    if len(results) >= 20:
        break
print(f"取得件数: {len(results)}")

prompt injection 防御チェックリスト

入力層:
  - 処理対象テキストに「aws」「cli」「execute」「run」を含む疑わしい命令形を検出
  - 外部 URL / ファイル / Issue 本文は要約してから渡す

IAM 層:
  - 削除/変更系 API を aws:CalledViaAWSMCP で Deny
  - ToolInvocationCount 急増アラームを有効化

クライアント層:
  - write 系ツール呼び出し前に人間の確認ステップを挟む

反証エビデンスの統合

CVE と MCP 全体のセキュリティ

  • 誤解: 「AWS managed MCP Server に切り替えれば OSS の脆弱性から解放される」
  • 反証: コミュニティ実装やサードパーティ MCP サーバー (例: CVE-2025-5277 は alexei-led/aws-mcp-server のコマンドインジェクション) で CVE が複数報告されています。AWS マネージド版自体の脆弱性ではありませんが、MCP プロトコル自体の STDIO 設計欠陥や OWASP MCP Top 10 はマネージド版にも適用されます
  • 推奨: マネージド版採用で OSS の直接的脆弱性リスクは下がりますが「MCP = 安全」とは言い切れません。本番導入前にペネトレーションテストを実施します

aws:ViaAWSMCPService の有効範囲

  • 誤解: 「aws:ViaAWSMCPService=true を Condition に付ければ AI 経由の全操作を IAM でコントロールできる」
  • 反証: bash / CLI 経由ではこのキーは付きません。prompt injection で呼び出されたツールには正規の MCP セッション経由でも true が付くため、「MCP = 安全な意図」を前提にした設計は危険です
  • 推奨: aws:ViaAWSMCPService は識別シグナルとして使い、bash 剥奪 + SCP + Permission Boundary の多層防御として設計します

CloudTrail だけでは監査が閉じない

  • 誤解: 「CloudTrail Data Event を有効にすれば MCP 経由の操作を完全に監査できる」
  • 反証: プロンプト本文は CloudTrail に記録されません。SOC 2 / HIPAA / PCI-DSS には CloudTrail だけでは不十分です
  • 推奨: インシデント対応手順に「sessionId で CloudTrail と MCP クライアントログを突合」ステップを必ず組み込み、プロンプト全文の長期保管パイプラインを事前に整備します

プロトコル互換性リスク

  • 誤解: 「AWS がマネージドで管理しているので MCP プロトコルの変更に影響されない」
  • 反証: MCP 仕様 2025-06-18 改訂で JSON-RPC batching が削除されました (breaking change)。AWS 側の追従タイムラインや SLA は未公開です
  • 推奨: 本番環境ではバージョンを pin し、テスト環境で互換性を確認してから更新します。MCP プロトコルの major version 変更を追跡する変更管理プロセスを整備します

まとめ

AWS MCP Server (Managed) の GA は、AI エージェントに AWS 操作を委譲する経路を「公式の接続面」へ標準化する転換点です。IAM コンテキストキー (aws:ViaAWSMCPService / aws:CalledViaAWSMCP) と CloudTrail Data Event を軸に、bash 剥奪 / SCP / Permission Boundary との多層防御を組み合わせることで、エージェント由来の AWS 操作を統制しつつ運用できます。

この記事が少しでも参考になった、あるいは改善点などがあれば、ぜひリアクションやコメント、SNS でのシェアをいただけると励みになります!

参考リンク