Skip to main content
Glama
pcolazurdo

blog-zero-secrets-mcp

by pcolazurdo

AgentCore + Cognito Public Client MCP PoC

端到端概念验证,演示 MCP 服务器在 AgentCore 上的两种部署模式:

  1. 独立模式 — 运行时直接使用 Cognito JWT 认证(无网关)

  2. 网关模式 — 运行时位于 AgentCore Gateway 之后,使用 Cognito PKCE 入站认证和 IAM 出站认证

两种模式均使用公共 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 入站认证(Cognito PKCE)的 AgentCore Gateway

  • 通过 GATEWAY_IAM_ROLE(SigV4)指向运行时的网关目标

使用网关 URL 更新 .mcp.jsonclaude-mcp-config.json

步骤 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 脚本

Script

Description

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 服务器提供:

Tool

Description

add_numbers

将两个数字相加

multiply_numbers

将两个数字相乘

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