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 не нужно знать об аутентификации пользователей)
Структура проекта
.
├── 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 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