Skip to main content
Glama
pcolazurdo

blog-zero-secrets-mcp

by pcolazurdo

AgentCore + Cognito パブリッククライアント MCP 概念実証

AgentCore 上の MCP サーバーにおける2つのデプロイモードを実証するエンドツーエンドの概念実証:

  1. スタンドアロン — Cognito JWT 認証を直接使用するランタイム(ゲートウェイなし)

  2. ゲートウェイ — Cognito PKCE インバウンド認証と IAM アウトバウンド認証を備えた AgentCore Gateway の背後にあるランタイム

どちらのモードもパブリック Cognito クライアント(client_secret なし)を PKCE によるユーザー認証に使用します。

アーキテクチャ

モード A: スタンドアロン(直接 JWT 認証を使用するランタイム)

Claude Code / Kiro
    │ PKCE → Cognito Hosted UI → browser
    │ Bearer JWT
    ▼
AgentCore Runtime (CUSTOM_JWT validates token)
    │
    ▼
MCP Server (FastMCP, Python)

モード B: ゲートウェイ(推奨)

Claude Code / Kiro
    │ PKCE → Cognito Hosted UI → browser
    │ Bearer JWT
    ▼
AgentCore Gateway (CUSTOM_JWT validates token)
    │ SigV4 (gateway IAM role)
    ▼
AgentCore Runtime (AWS_IAM auth)
    │
    ▼
MCP Server (FastMCP, Python)

ゲートウェイモードでは以下を提供します:

  • 集中認証(ゲートウェイがすべての JWT 検証を処理)

  • 複数ターゲットにわたるツール検出とセマンティック検索

  • プロトコルレベルの MCP ルーティング

  • 関心の分離(ランタイムはユーザー認証を認識する必要がない)

Related MCP server: local-kms-mcp-server

プロジェクト構造

.
├── server/
│   ├── cognitopocmcp/              # Runtime deployed via agentcore CLI
│   │   ├── app/cognito_poc_mcp/
│   │   │   └── main.py            # FastMCP server with sample tools
│   │   └── agentcore/             # agentcore CLI config
│   ├── mcp_server.py              # MCP server source (standalone mode)
│   └── requirements.txt
├── src/
│   ├── config.mjs                 # Shared config (project name, region, helpers)
│   ├── auth.mjs                   # PKCE auth module (no secrets!)
│   ├── mcp-server.mjs             # Stdio MCP server (proxy mode)
│   └── test-auth.mjs              # Standalone auth flow test
├── scripts/
│   ├── setup-cognito.mjs          # Creates Cognito pool + public client + user
│   ├── deploy.sh                  # Deploys runtime (standalone mode, with JWT auth)
│   ├── deploy-infrastructure.mjs  # Creates gateway + IAM role + target (gateway mode)
│   ├── test-gateway.mjs           # Tests gateway end-to-end
│   ├── test-deployed.mjs          # Tests standalone runtime end-to-end
│   └── teardown-cognito.mjs       # Deletes all infrastructure
├── .env                           # Generated by setup (Cognito config)
├── .mcp.json                      # Generated by deploy-infra (gateway URL + OAuth)
├── claude-mcp-config.json         # Same as .mcp.json (for copying to Claude/Kiro)
└── package.json

前提条件

# AWS CLI + credentials configured
aws sts get-caller-identity

# Node.js 20+
node --version

# AgentCore CLI
npm install -g @aws/agentcore

# Python 3.10+ (for the MCP server)
python3 --version

クイックスタート: ゲートウェイモード(推奨)

ステップ 1: 依存関係のインストール

npm install

ステップ 2: Cognito インフラストラクチャの作成

npm run setup

シークレットなしのパブリックアプリクライアント、ホスト型 UI、テストユーザー(testuser / TestPass123!)を備えた Cognito ユーザープールを作成します。設定は .env に保存されます。

ステップ 3: ランタイムのデプロイ

npm run deploy-runtime

agentcore CLI を使用して MCP サーバーを AgentCore Runtime にデプロイします。ランタイムはデフォルトの IAM 認証を使用します(ゲートウェイがユーザーを認証します)。

ステップ 4: ゲートウェイのデプロイ

npm run deploy-infra

以下を作成します:

  • ゲートウェイ用の IAM ロール(ランタイムを呼び出す権限を持つ)

  • CUSTOM_JWT インバウンド認証を備えた AgentCore Gateway(Cognito PKCE)

  • GATEWAY_IAM_ROLE(SigV4)を介してランタイムを指すゲートウェイターゲット

.mcp.json と claude-mcp-config.json をゲートウェイ URL で更新します。

ステップ 5: テスト

npm run test-gateway

テストユーザーを使用して Cognito 経由で非対話的に認証し、以下を確認します:

  • 未認証リクエストが拒否されること(401)

  • MCP セッションの初期化

  • 検出されたツールの一覧表示

  • ツールの呼び出し(greet_user、add_numbers、get_server_info)

ステップ 6: Claude Code / Kiro への接続

生成された設定をコピーします:

# For Kiro — .mcp.json is already in the project root
# For Claude Code
cp claude-mcp-config.json ~/.claude/mcp.json

設定は次のようになります:

{
  "mcpServers": {
    "cognito-poc": {
      "type": "http",
      "url": "https://<gateway-id>.gateway.bedrock-agentcore.<region>.amazonaws.com/mcp",
      "oauth": {
        "clientId": "<public-client-id>",
        "callbackPort": 8976
      }
    }
  }
}

最初のツール呼び出し時に、Claude/Kiro は Cognito ログイン用のブラウザを開きます。その後、トークンはキャッシュされ、自動的に更新されます。

クイックスタート: スタンドアロンモード

ゲートウェイが不要で、ランタイムに JWT 認証を直接処理させたい場合:

npm run setup         # Create Cognito pool
npm run deploy        # Deploy runtime with CUSTOM_JWT auth
npm run test-deployed # Test via PKCE (opens browser)

npm スクリプト

スクリプト

説明

npm run setup

Cognito ユーザープール + パブリッククライアント + テストユーザーを作成

npm run deploy-runtime

agentcore CLI を使用して MCP ランタイムをデプロイ(IAM 認証、ゲートウェイ用)

npm run deploy-infra

Control Plane API を使用してゲートウェイ + IAM ロール + ターゲットを作成

npm run deploy

直接 JWT 認証でランタイムをデプロイ(スタンドアロン、ゲートウェイなし)

npm run test-gateway

ゲートウェイをエンドツーエンドでテスト(非対話型)

npm run test-gateway -- --pkce

ブラウザベースの PKCE ログインでゲートウェイをテスト

npm run test-deployed

デプロイ済みランタイムを PKCE でテスト

npm run test-auth

PKCE 認証フローのみをテスト(ブラウザを開く)

npm run test-local

MCP サーバーをローカルで開発実行

npm run teardown

すべてのインフラストラクチャを削除(ゲートウェイ、IAM ロール、Cognito ユーザープール)

MCP ツール

サンプル MCP サーバーは以下を公開します:

ツール

説明

add_numbers

2つの数値を加算します

multiply_numbers

2つの数値を乗算します

greet_user

名前でユーザーに挨拶します

get_server_info

デプロイ情報とバージョン情報を返します

analyze_text

テキストを分析し基本統計を返します

ゲートウェイ経由でアクセスする場合、ツール名にはターゲット名がプレフィックスとして付きます: mcp-runtime___add_numbers。

クリーンアップ

npm run teardown

これにより以下が削除されます:

  • AgentCore Gateway(ターゲット + ゲートウェイ)

  • ゲートウェイ IAM ロール

  • Cognito ユーザープール

  • ローカルファイル(.env、.mcp.json、claude-mcp-config.json)

AgentCore Runtime は削除されません(agentcore CLI で個別に管理)。削除するには:

cd server/cognitopocmcp && agentcore destroy

主要な概念

ゼロシークレット認証

  • Cognito パブリッククライアント: GenerateSecret: false — クライアントシークレットは存在しません

  • PKCE(code_challenge + code_verifier)が共有シークレットなしでリクエスターを証明します

  • client_id のみがローカルに保存されます(公開識別子であり、資格情報ではありません)

  • トークンはメモリ内に保持され、1時間の有効期限と自動更新が設定されます

ゲートウェイアウトバウンド認証

ゲートウェイは独自の IAM ロール(SigV4)を使用してランタイムに対して認証します。これにより、ゲートウェイとランタイム間の OAuth マシン間フローの複雑さが回避されます。IAM ロールには、ランタイム ARN にスコープされた bedrock-agentcore:* 権限があります。

移植性

すべての環境固有の値は実行時に導出されます:

  • AWS アカウント ID: STS.GetCallerIdentity で解決

  • ゲートウェイ URL: .mcp.json から読み取り(deploy-infra で生成)

  • ランタイム ARN: agentcore のデプロイ状態から読み取り

  • プロジェクト定数: src/config.mjs に集中管理

別のアカウント/リージョンにデプロイするには、AWS 認証情報を設定してセットアップ手順を再実行するだけです。

セキュリティ

セキュリティ問題の報告については、CONTRIBUTING を参照してください。

ライセンス

このライブラリは MIT-0 ライセンスの下でライセンスされています。LICENSE ファイルを参照してください。

Related MCP Connectors

Related MCP Servers