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 ルーティング
関心の分離(ランタイムはユーザー認証を認識する必要がない)
プロジェクト構造
.
├── 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 installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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 server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pcolazurdo/blog-zero-secrets-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server