blog-zero-secrets-mcp
AgentCore + Cognito Public Client MCP PoC
Сквозная проверка концепции, демонстрирующая два режима развертывания MCP-сервера на AgentCore:
Standalone — Runtime с прямой аутентификацией через JWT Cognito (без шлюза)
Gateway — Runtime за шлюзом AgentCore с входящей аутентификацией PKCE Cognito и исходящей аутентификацией IAM
Оба режима используют публичный клиент Cognito (без client_secret) с PKCE для аутентификации пользователей.
Архитектура
Режим A: Standalone (Runtime с прямой аутентификацией JWT)
Claude Code / Kiro
│ PKCE → Cognito Hosted UI → browser
│ Bearer JWT
▼
AgentCore Runtime (CUSTOM_JWT validates token)
│
▼
MCP Server (FastMCP, Python)Режим B: Gateway (рекомендуется)
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)Режим Gateway обеспечивает:
Централизованную аутентификацию (шлюз обрабатывает всю проверку JWT)
Обнаружение инструментов и семантический поиск по нескольким целевым ресурсам
Маршрутизацию MCP на уровне протокола
Разделение ответственности (Runtime не нужно знать об аутентификации пользователей)
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Быстрый старт: режим Gateway (рекомендуется)
Шаг 1: Установка зависимостей
npm installШаг 2: Создание инфраструктуры Cognito
npm run setupСоздает пользовательский пул Cognito с публичным клиентом приложения (без секрета), доменом hosted UI и тестовым пользователем (testuser / TestPass123!). Конфигурация сохраняется в .env.
Шаг 3: Развертывание Runtime
npm run deploy-runtimeРазвертывает MCP-сервер в AgentCore Runtime с использованием agentcore CLI. Runtime использует аутентификацию IAM по умолчанию (шлюз будет аутентифицировать пользователей).
Шаг 4: Развертывание шлюза
npm run deploy-infraСоздает:
Роль IAM для шлюза (с разрешением на вызов Runtime)
Шлюз AgentCore с входящей аутентификацией
CUSTOM_JWT(PKCE Cognito)Целевой ресурс шлюза, указывающий на Runtime через
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. После этого токены кэшируются и обновляются автоматически.
Быстрый старт: режим Standalone
Если вам не нужен шлюз и вы хотите, чтобы Runtime обрабатывал аутентификацию 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 + публичного клиента + тестового пользователя |
| Развертывание MCP Runtime через agentcore CLI (аутентификация IAM, для шлюза) |
| Создание шлюза + роли IAM + целевого ресурса через Control Plane API |
| Развертывание Runtime с прямой аутентификацией JWT (standalone, без шлюза) |
| Сквозное тестирование шлюза (неинтерактивный режим) |
| Тестирование шлюза с входом через PKCE в браузере |
| Тестирование standalone Runtime через PKCE |
| Тестирование только потока аутентификации PKCE (открывает браузер) |
| Локальный запуск MCP-сервера для разработки |
| Удаление всей инфраструктуры (шлюз, роль IAM, пул Cognito) |
Доступные MCP-инструменты
Пример MCP-сервера предоставляет:
Инструмент | Описание |
| Сложение двух чисел |
| Умножение двух чисел |
| Приветствие пользователя по имени |
| Возврат информации о развертывании и версии |
| Анализ текста и возврат базовой статистики |
При доступе через шлюз имена инструментов получают префикс с именем целевого ресурса: mcp-runtime___add_numbers.
Очистка
npm run teardownЭто удаляет:
Шлюз AgentCore (целевые ресурсы + шлюз)
Роль IAM шлюза
Пользовательский пул Cognito
Локальные файлы (
.env,.mcp.json,claude-mcp-config.json)
Runtime AgentCore НЕ удаляется (управляется отдельно через agentcore CLI). Чтобы удалить его:
cd server/cognitopocmcp && agentcore destroyКлючевые концепции
Аутентификация без секретов
Публичный клиент Cognito:
GenerateSecret: false— секрет клиента не существуетPKCE (
code_challenge+code_verifier) подтверждает запрашивающую сторону без общего секретаЛокально сохраняется только
client_id(публичный идентификатор, не учетные данные)Токены хранятся в памяти со сроком действия 1 час + автоматическое обновление
Исходящая аутентификация шлюза
Шлюз аутентифицируется в Runtime с использованием собственной роли IAM (SigV4). Это позволяет избежать сложности потоков OAuth между машинами (machine-to-machine) между шлюзом и Runtime. Роль IAM имеет разрешение bedrock-agentcore:*, ограниченное ARN Runtime.
Переносимость
Все значения, зависящие от окружения, получаются во время выполнения:
ID аккаунта AWS: определяется через
STS.GetCallerIdentityURL шлюза: читается из
.mcp.json(создается командойdeploy-infra)ARN Runtime: читается из состояния развертывания 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.-