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 ルーティング

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

プロジェクト構造

.
├── 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.jsonclaude-mcp-config.json をゲートウェイ URL で更新します。

ステップ 5: テスト

npm run test-gateway

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

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

  • MCP セッションの初期化

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

  • ツールの呼び出し(greet_useradd_numbersget_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.jsonclaude-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 ファイルを参照してください。

-
license - not tested
-
quality - not tested
C
maintenance

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

View all MCP Connectors

Latest Blog Posts

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