blog-zero-secrets-mcp
AgentCore + Cognito パブリッククライアント MCP 概念実証
AgentCore 上の MCP サーバーにおける2つのデプロイモードを実証するエンドツーエンドの概念実証:
スタンドアロン — Cognito JWT 認証を直接使用するランタイム(ゲートウェイなし)
ゲートウェイ — 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-runtimeagentcore 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 スクリプト
スクリプト | 説明 |
| Cognito ユーザープール + パブリッククライアント + テストユーザーを作成 |
| agentcore CLI を使用して MCP ランタイムをデプロイ(IAM 認証、ゲートウェイ用) |
| Control Plane API を使用してゲートウェイ + IAM ロール + ターゲットを作成 |
| 直接 JWT 認証でランタイムをデプロイ(スタンドアロン、ゲートウェイなし) |
| ゲートウェイをエンドツーエンドでテスト(非対話型) |
| ブラウザベースの PKCE ログインでゲートウェイをテスト |
| デプロイ済みランタイムを PKCE でテスト |
| PKCE 認証フローのみをテスト(ブラウザを開く) |
| MCP サーバーをローカルで開発実行 |
| すべてのインフラストラクチャを削除(ゲートウェイ、IAM ロール、Cognito ユーザープール) |
MCP ツール
サンプル MCP サーバーは以下を公開します:
ツール | 説明 |
| 2つの数値を加算します |
| 2つの数値を乗算します |
| 名前でユーザーに挨拶します |
| デプロイ情報とバージョン情報を返します |
| テキストを分析し基本統計を返します |
ゲートウェイ経由でアクセスする場合、ツール名にはターゲット名がプレフィックスとして付きます: 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 ファイルを参照してください。
This server cannot be deployed
Maintenance
Related MCP Connectors
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.
MCP-first control plane for ProAgentStore agents and private instances.
- StytchOAuthdev.stytch.mcp
The Stytch MCP server is a reference implementation that demonstrates remote MCP server authentication and authorization using Stytch Connected Apps. It provides OAuth 2.1-compliant authorization (including PKCE), Dynamic Client Registration, and validates Stytch-issued access tokens to enable AI agents to securely interact with external services through permissioned access, supporting scopes like openid, email, profile, and manage:project_data.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceDeploys a minimal MCP-compatible Python tool server on Amazon EKS that establishes an outbound WebSocket connection to an AgentCore Gateway. It exposes two tools (get_system_info and echo_data) for tool discovery and invocation through the MCP protocol.-
- AlicenseAqualityBmaintenanceLocal-first MCP server for per-agent key management, generating and using signing keys without external KMS.827 npm1MIT
- AlicenseNot gradedqualityDmaintenanceDemonstrates how to secure an MCP server with OAuth 2.1 using AWS Cognito, with support for dynamic client registration and client ID metadata documents.68MIT
- FlicenseNot gradedqualityDmaintenanceA production-ready MCP server that authenticates agents via OAuth 2.1 Bearer tokens, validates JWTs with JWKS, enforces tool-level scopes and roles, and logs the full delegation chain.-