AWS DevOps Agent × MCP|そのまま使えるMCPサーバの雛形を作ってみました

AWS DevOps Agent × MCP|そのまま使えるMCPサーバの雛形を作ってみました

2026.04.04

1. はじめに

製造ビジネステクノロジー部の平内(SIN)です。

AWS DevOps Agent は、AWSリソースの異常検知や根本原因分析を自動化する強力なツールです。このエージェントの調査能力をさらに拡張できる仕組みとして、Model Context Protocol(MCP)との連携がサポートされています。

MCPサーバーを接続することで、外部の監視ツールや、独自の運用データソースなど、AWSの標準サービス外のデータもエージェントの調査対象に組み込むことができます。

ただし、AWS DevOps AgentにMCPサーバーを接続するには、以下の要件を満たす必要があります。

  • トランスポートプロトコルとして Streamable HTTP を使用
  • 認証方式として OAuth 2.0認証フロー(クライアント認証情報フローまたは3LOフロー)または APIキー/トークンベースの認証 を使用

これらの要件を満たすMCPサーバーを一から構築するのは、少し手間がかかります。そこで今回は、CDKで簡単にデプロイできるMCPサーバの雛形を作成してみました。

https://github.com/furuya02/mcp-server-aws-devops

本記事では、この雛形の構成と使い方を解説します。なお、雛形として実装したMCPは、システムのメンテナンススケジュールを返すシンプルなものです。実際のプロジェクトでは、この雛形をベースに独自のツールを追加して拡張していただければと思います。

補足: AWS DevOps Agentは、2026年4月3日(日本時間)にGA(一般提供)されました。GA前は「プライベート接続未対応」という制約がありましたが、現在はプライベート接続も可能になっています。本記事は、インターネット経由でグローバルに接続するものです。

2. 構成

本プロジェクトでは、CDKデプロイ時のスイッチで2種類の認証方式を切り替えてデプロイできます。

(1) API Key 認証

API Key認証は、シンプルな構成で素早くデプロイできる方式です。

001

クライアントからのリクエストは、API Gatewayでx-api-keyヘッダーの値を検証し、有効なAPIキーを持つリクエストのみがLambda関数に転送されます。

作成されるAWSリソース:

リソース 説明
Lambda関数 MCPサーバー本体(Python 3.12)
API Gateway REST API(APIキー認証)
API Key APIキー認証用
Usage Plan スロットリング設定(rate: 100, burst: 200)

(2) OAuth 2.0 認証(Client Credentials Flow)

OAuth 2.0認証は、よりセキュアな認証が必要な場合に選択する方式です。

002

クライアントは、まずCognitoからアクセストークンを取得し、そのトークンをAuthorizationヘッダーに含めてAPIを呼び出します。API GatewayのCognito Authorizerがトークンを検証し、有効なトークンを持つリクエストのみがLambda関数に転送されます。

作成されるAWSリソース:

リソース 説明
Lambda関数 MCPサーバー本体(Python 3.12)
API Gateway REST API(Cognito Authorizer)
Cognito User Pool OAuth 2.0 IdP
Cognito Domain トークンエンドポイント用
Resource Server スコープ定義(mcp.invoke
App Client Client Credentials Flow用

3. 認証方式の違い

2つの認証方式の特徴を比較します。用途に応じて適切な方式を選択してください。

(1) 概要比較

項目 API Key OAuth 2.0(Cognito)
複雑さ シンプル やや複雑
トークン有効期限 なし(永続) あり(リフレッシュ可能)
セキュリティ 基本的 高い
ユースケース 開発・検証環境、内部API 本番環境、セキュリティ要件が高い場合

(2) フローの比較

API Key認証のフロー:

031

OAuth 2.0認証のフロー:

032

OAuth 2.0認証では、クライアントは事前にCognitoからアクセストークンを取得する必要があります。このトークンには有効期限(デフォルト60分)があり、期限切れの場合は再取得が必要です。

(3) 選択の指針

API Keyを選ぶ場合:

  • 開発・テスト環境での利用
  • 内部システム間の連携
  • シンプルさを優先したい場合

OAuth 2.0を選ぶ場合:

  • 本番環境での利用
  • セキュリティ要件が高い場合
  • トークンの有効期限管理が必要な場合

4. 環境構築

(1) 前提条件

デプロイには以下の環境が必要です。

  • Node.js 18以上
  • Docker(Lambda関数のバンドリングに使用)
  • AWS CLI(設定済み)
  • pnpm(または npm)

(2) リポジトリのクローン

git clone https://github.com/furuya02/mcp-server-aws-devops.git
cd mcp-server-aws-devops
cd cdk
pnpm install

(3) デプロイ

API Key認証の場合

cdk deploy

OAuth 2.0認証の場合:

cdk deploy -c authType=oauth

デプロイが完了すると、以下のような出力が表示されます。

Outputs:
mcp-server-sample.ApiKeyId = xxxxxxxxxx
mcp-server-sample.AuthType = api-key
mcp-server-sample.GetApiKeyCommand = aws apigateway get-api-key --api-key xxxxxxxxxx --include-value --query 'value' --output text
mcp-server-sample.McpApiEndpoint = https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prd/mcp
mcp-server-sample.McpApiUrl = https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prd/
mcp-server-sample.McpFunctionArn = arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:mcp-server-sample-mcp

✨  Total time: 81.19s

出力されたMcpApiEndpointがMCPサーバーのエンドポイントURLです。

5. 動作確認(API Key認証)

最初に「API Key認証」でデプロイした場合の動作確認方法を説明します。

(1) Lambda関数の確認

MCPの本体となるLambda関数(mcp-server-sample-mcp)がデプロイされ、API Gatewayのトリガーが設定されています。

003

トリガーは以下の4種類が設定されています。

ステージ メソッド 用途
prd GET 本番用GETエンドポイント
prd POST 本番用POSTエンドポイント
test-invoke-stage GET API Gatewayコンソールのテスト用
test-invoke-stage POST API Gatewayコンソールのテスト用

(2) API Gatewayのリソース構成

004

API Gatewayには以下のリソースが作成されます。

パス メソッド 用途 統合先
/ OPTIONS ルートパスのCORSプリフライト MOCK
/mcp POST JSON-RPCリクエスト送信 Lambda
/mcp GET SSEストリーム確立 Lambda
/mcp OPTIONS /mcpのCORSプリフライト MOCK

MCP(Model Context Protocol)のStreamable HTTPトランスポートでは、POSTとGETの両方が必要です。

  • POST /mcp: JSON-RPCリクエスト(initialize、tools/list、tools/call)の送信に使用
  • GET /mcp: SSE(Server-Sent Events)ストリームの確立に使用

OPTIONSメソッドは、ブラウザが異なるオリジンからAPIを呼ぶ際のCORSプリフライトリクエストに応答するためのものです。CDKのdefaultCorsPreflightOptionsで自動設定されています。

(3) API Keyの確認

005

API Keyは使用量プランで関連付けされています。

006

APIキーの値は、デプロイ時に出力されたGetApiKeyCommandを実行して取得できます。

aws apigateway get-api-key --api-key <ApiKeyId> --include-value --query 'value' --output text

(4) Postmanでの確認

Postmanを使用してMCPサーバーの動作を確認できます。

ヘッダー設定:

ヘッダー
Content-Type application/json
x-api-key <取得したAPIキー>

リクエストボディ(ツール一覧取得):

{
    "jsonrpc": "2.0",
    "method": "tools/list",
    "id": 1
}

007

レスポンスとして、登録されているツールの一覧が返されます。

(5) MCP Inspectorでの確認

MCP Inspectorを使用すると、ツールの一覧確認や実行テストをGUIで行えます。

Step 1: 接続設定

項目
Transport Type Streamable HTTP
URL https://<api-id>.execute-api.ap-northeast-1.amazonaws.com/prd/mcp
Connection Type Via Proxy

Step 2: Custom Headersの設定

  1. Authenticationセクションを展開
  2. Custom Headersの「+ Add」をクリック
  3. 以下を入力
Header Name Header Value
x-api-key <APIキーの値>
  1. トグルがONになっていることを確認

Step 3: 接続

Connectボタンをクリックして接続します。接続に成功すると、Toolsタブでツール一覧(get_scheduleなど)が表示されます。

008

(6) AWS DevOps AgentへのMCPサーバー登録

MCPサーバーの登録は、AWS DevOps Agentのエージェントスペースで行います。

Step 1: エージェントスペースを開く

009

Step 2: MCPサーバーの追加

010

011

Step 3: 接続情報の入力

MCPサーバーのURLとAPI Keyを入力します。

012

013

Step 4: ツールの選択

「MCPサーバーツールを選択」の画面で、使用するツールをチェックします。サンプルではget_scheduleのみが提供されています。

014

Step 5: Webhookの設定(スキップ)

Webhookは今回使用しないので、そのまま進めます。

015

Step 6: 登録完了

016

これでMCPサーバーの登録が完了しました。

6. 動作確認(OAuth 2.0認証)

続いて「OAuth 2.0認証」でデプロイした場合の動作確認方法を説明します。API Key認証と重複する部分については省略します。

(1) Lambda関数

認証はAPI Gateway側で実施されるため、デプロイされるLambda関数は「API Key認証」のときと同じです。

(2) API Gateway

作成されるリソース(/mcpエンドポイントのPOST、GET、OPTIONSメソッド)は「API Key認証」の場合と同じですが、認証方式が異なります。

API Key認証との違い:

項目 API Key認証 OAuth 2.0認証
認証タイプ NONE(apiKeyRequired: true) COGNITO_USER_POOLS
オーソライザー なし Cognito User Pools Authorizer
認証ヘッダー x-api-key Authorization: Bearer <JWT>
スコープ検証 なし mcp-server-sample-api/mcp.invoke

Cognito User Pools オーソライザー:

020

項目
オーソライザー名 mcp-server-sample-cognito-authorizer
タイプ COGNITO_USER_POOLS
IDソース Authorizationヘッダー

メソッドの認証設定:

021

認可スコープが設定されているため、クライアントはトークン取得時にmcp-server-sample-api/mcp.invokeスコープを含める必要があります。スコープが含まれていないトークンでアクセスすると、403 Forbiddenが返されます。

(3) Cognito

OAuth 2.0認証では、Cognitoに以下のリソースが作成されます。

ユーザープール:

022

項目
ユーザープール名 mcp-server-sample-user-pool

アプリケーションクライアント:

023

項目
クライアント名 mcp-server-sample-app-client
認証フロー client_credentials(クライアント認証情報フロー)
アクセストークン有効期限 60分

クライアント認証情報フロー(client_credentials)は、サーバー間通信に適した認証方式で、ユーザーの介入なしにアクセストークンを取得できます。

リソースサーバー:

024

025

項目
リソースサーバー識別子 mcp-server-sample-api
スコープ名 mcp.invoke
完全なスコープ名 mcp-server-sample-api/mcp.invoke

(4) Postmanでの確認

OAuth 2.0認証では、API Key認証と異なり、まずCognitoからアクセストークンを取得する必要があります。

Step 1: アクセストークンの取得

Cognitoのトークンエンドポイントにリクエストを送信してアクセストークンを取得します。

エンドポイント:

POST https://<cognito-domain>.auth.ap-northeast-1.amazoncognito.com/oauth2/token

ヘッダー:

ヘッダー
Content-Type application/x-www-form-urlencoded
Authorization Basic <Base64(client_id:client_secret)>

ボディ(x-www-form-urlencoded):

キー
grant_type client_credentials
scope mcp-server-sample-api/mcp.invoke

レスポンス例:

{
    "access_token": "eyJraWQiOiJ...",
    "expires_in": 3600,
    "token_type": "Bearer"
}

026

Step 2: MCP APIの呼び出し

取得したアクセストークンを使用してMCP APIを呼び出します。

ヘッダー:

ヘッダー
Content-Type application/json
Authorization Bearer <access_token>

ボディ:

{
    "jsonrpc": "2.0",
    "method": "tools/list",
    "id": 1
}

027

(5) MCP Inspectorでの確認

MCP Inspector v0.21.1は「public client」として設計されており、Client Credentials Flow(client_secretを使用する認証)には対応していません。そのため、事前にトークンを取得してCustom Headersに手動設定する方法で接続します。

Step 1: アクセストークンの取得

curlコマンドでCognitoからアクセストークンを取得します。

curl -s -X POST "https://<cognito-domain>.auth.ap-northeast-1.amazoncognito.com/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "<client_id>:<client_secret>" \
  -d "grant_type=client_credentials&scope=mcp-server-sample-api/mcp.invoke"

レスポンスのaccess_tokenの値をコピーしておきます。

Step 2: MCP Inspectorで接続

項目
Transport Type Streamable HTTP
URL https://<api-id>.execute-api.ap-northeast-1.amazonaws.com/prd/mcp
Connection Type Via Proxy

Custom Headers:

Header Name Header Value
Authorization Bearer <取得したトークン>

033

注意: アクセストークンの有効期限は60分です。期限切れの場合はStep 1から再度トークンを取得してください。

(6) AWS DevOps AgentへのMCPサーバー登録

OAuth 2.0認証の場合、認証設定のみがAPI Key認証と異なります。

認証フローの選択:

「OAuthクライアント認証情報」を選択します。

029

認証情報の入力:

  • クライアントID: Cognitoアプリクライアントから取得
  • クライアントシークレット: Cognitoアプリクライアントから取得
  • 交換URL: https://<cognito-domain>.auth.ap-northeast-1.amazoncognito.com/oauth2/token

030

7. AWS DevOps AgentでMCPサーバを利用した調査

MCPサーバーを登録したら、実際にAWS DevOps Agentで調査を行ってみましょう。

(1) スキルの登録

MCPサーバーを利用するには、エージェントスペースでスキルを登録し、呼び出しのルールを伝える必要があります。

「調査」開始時に必ず実行するとしておくことで、調査に毎回利用されるようになります。

017

018

(2) 調査の実行

調査を実行すると、エージェントが最初にMCPサーバーから情報を取得していることを確認できます。

019

サンプル実装では、get_scheduleツールがメンテナンススケジュール情報を返すため、エージェントは「システムのメンテナンス予定」を考慮した調査を行うことができます。

例えば、障害調査の際に「このタイミングでメンテナンス作業が予定されていた」という情報があれば、根本原因の特定に役立てることができます。

8. Lambda実装

最後に、MCPの本体として実装したLambda関数について紹介します。

(1) 使用ライブラリ

本プロジェクトでは、AWS Labs が提供する awslabs.mcp_lambda_handler ライブラリを使用しています。

pip install awslabs.mcp-lambda-handler

このライブラリは、Lambda上でMCPサーバーを構築するためのフレームワークで、以下の機能を提供します。

機能 説明
Streamable HTTP MCP仕様のStreamable HTTPトランスポートをサポート
ツール定義 @mcp.tool()デコレータで簡単にツールを定義
型検証 関数の引数・戻り値の型を自動検証
JSON-RPC処理 プロトコル準拠のリクエスト/レスポンス処理

(2) 基本的な実装パターン

MCPサーバーの実装は非常にシンプルです。

from awslabs.mcp_lambda_handler import MCPLambdaHandler

# MCPサーバーを初期化
mcp = MCPLambdaHandler(
    name="service-operations-mcp",
    version="1.0.0",
)

@mcp.tool()
def get_schedule() -> str:
    """
    サービス運用のスケジュールを取得します。
    """
    # スケジュールデータを返す処理
    ...

def handler(event, context):
    return mcp.handle_request(event, context)

ポイント:

  • 関数名がそのままツール名になる(snake_case)
  • docstringの最初の段落がツールの説明(description)になる
  • 型ヒントからinputSchemaが自動生成される

(3) サンプル実装の詳細

サンプルとして実装しているget_scheduleツールは、JSON形式のメンテナンススケジュール情報を返します。

{
  "schedules": [
    {
      "id": "maintenance-001",
      "start": "2025-04-01T00:00:00+0900",
      "end": "2025-04-01T02:00:00+0900",
      "title": "SSL Certificate Renewal",
      "description": "Renewing SSL certificates.",
      "status": "scheduled"
    },
    {
      "id": "maintenance-002",
      "start": "2025-04-05T02:00:00+0900",
      "end": "2025-04-05T04:00:00+0900",
      "title": "Security Patch",
      "description": "Applying security patches.",
      "status": "scheduled"
    }
  ],
  "timezone": "Asia/Tokyo",
  "last_updated": "2025-03-15T00:00:00+09:00"
}

実際のプロジェクトでは、このサンプルを参考に独自のツールを追加してください。例えば以下のようなツールが考えられます。

  • 外部監視システムからのアラート情報取得
  • チケット管理システムからのインシデント情報取得
  • 独自のメトリクスデータベースからの情報取得

完全な実装コードは、GitHubリポジトリの cdk/lambda_python/index.py を参照してください。

https://github.com/furuya02/mcp-server-aws-devops/blob/main/cdk/lambda_python/index.py

(4) Lambda特有の考慮事項

Lambda上でMCPサーバーを運用する際の考慮事項をまとめます。

項目 推奨値
タイムアウト 30秒以上(API Gatewayの29秒より長く)
メモリ 256MB〜512MB(基本的なMCPサーバーの場合)
ランタイム Python 3.12

9. 最後に

本記事では、AWS DevOps Agent用のMCPサーバーをCDKで簡単にデプロイできるMCPサーバの雛形を作成してみましたが、作業を通じて、以下のような知見を得ることが出来ました。

  • AWS DevOps AgentのMCPサーバー要件(Streamable HTTP、認証方式)を満たす実装方法
  • API Key認証とOAuth 2.0認証の2種類の認証方式の実装と使い分け
  • awslabs.mcp_lambda_handlerライブラリを使用したシンプルなMCPサーバー実装

作成したプロジェクトは、MCPサーバーの雛形として、最小限の構成で動作するサンプル実装です。

この雛形をベースに、実際のプロジェクトで拡張利用されると嬉しいです。

  • 独自のツール追加(外部システムとの連携など)
  • エラーハンドリングの強化
  • ログ出力の最適化(本番環境では機密情報のフィルタリングが必要)

コードはGitHubで公開しています。ぜひご活用ください。

https://github.com/furuya02/mcp-server-aws-devops

この記事をシェアする

関連記事