* restructure 02-use-cases into three agent-type categories
Reorganizes all 27 use case samples into category subfolders aligned
with the AgentCore GTM workload definitions:
- 01-conversational-agents/ (19 samples): user-facing agents with
streaming, user OAuth, and session/long-term memory
- 02-automation-agents/ (4 samples): event-driven agents with service
identity and stateless execution
- 03-coding-assistants/ (3 samples): developer tools with sandboxed
execution and project-scoped memory
Other changes:
- Moves okta-auth-three-tier-end-to-end-demo to
01-features/05-authenticate-and-authorize (identity pattern, not a
use case)
- Adds 02-use-cases/README.md with category index and sample table
- Adds category README for each subfolder, aligned with GTM definitions,
no em-dashes
- Adds use-case-assessment.md with per-sample scoring, recommendations,
and a starter toolkit migration list (18 of 27 samples need migrating)
- Fixes all cross-folder relative links broken by the restructure
(LICENSE, LOCAL_DEVELOPMENT.md, AGENTCORE_DEPLOYMENT.md)
* cull low-quality conversational agent samples and reorganise identity demos
Reviewed all 19 conversational agent samples against actual AgentCore
feature usage, blog post references, and code quality. Removed 9 samples
that did not meet the bar and moved 2 identity-pattern demos to the
correct location.
Dropped from 01-conversational-agents/:
- gateway-schema-support-agent: misclassified coding agent, 82-line README,
only 1 real feature, no blog post
- slide-deck-generator-memory-agent: narrow use case, no blog post,
deprecated starter toolkit, 5 features
- local-prototype-to-agentcore: claimed 9 features, only 3 in code,
tutorial format belongs in 01-tutorials/
- role-based-hr-data-agent: no blog post, deprecated starter toolkit,
Cedar pattern needs full rebuild to be useful
- A2A-realestate-agentcore-multiagents: claimed 10 features, only 3 in
code (Runtime, Cognito, A2A), no blog post
- cost-optimization-agent: only Runtime in code, notebook-driven, no
blog post
- DB-performance-analyzer: only Gateway + Cognito in code, no blog post
- farm-management-advisor: notebook-only, mixed deprecated/native SDK,
191-line README, no blog post
Moved to 01-features/05-authenticate-and-authorize/:
- auth0-multi-agent-obo: RFC 8693 OBO token exchange is an identity
pattern, not a use case; sits alongside okta and entra OBO samples
- okta-auth-three-tier-end-to-end-demo: (previous commit)
Other changes:
- Rename 02-automation-agents/ to 02-workflow-automation-agents/
- Update use-case-assessment.md with DROPPED/MOVED entries for all
removed samples
- Update all README counts and sample tables
- Add auth0-multi-agent-obo to identity README folder table and
auth pattern quick reference
* update use-case-assessment with decisions, actual features, and authors contacted
* untrack use-case-assessment.md (local only)
* fix CONTRIBUTING.md relative paths broken by use-cases restructure
Samples moved one level deeper (into category subfolders) so
../../CONTRIBUTING.md no longer resolves to the repo root.
Updated to ../../../CONTRIBUTING.md in three files:
- 01-conversational-agents/customer-support-assistant/README.md
- 02-workflow-automation-agents/event-driven-claims-agent/README.md
- 03-coding-assistants/claude-code-gateway-mcp-server/README.md
* fix: address checkov security findings in CloudFormation templates
AWS-operations-agent mcp-tool-template.yaml and mcp-tool-template-zip.yaml:
- Scope IAM wildcard resources to account/region-specific ARNs
(lambda:InvokeFunction, iam:PassRole, s3:*, logs:*)
- Split S3 permissions into bucket-level and object-level statements
- Scope bedrock:InvokeModel to foundation-model ARN pattern
- Add KMS keys for Lambda env var encryption (CKV_AWS_173) and CloudWatch
log group encryption (CKV_AWS_158)
- Add SQS dead letter queue and DeadLetterQueue config (CKV_AWS_116)
- Add ReservedConcurrentExecutions (CKV_AWS_115)
- Add checkov:skip for VPC (CKV_AWS_117) - demo function, VPC not required
customer-support-assistant cognito.yaml:
- Scope logs resource to account/region ARN prefix
- Scope cognito-idp:AdminAddUserToGroup to UserPool ARN
- Add SQS DLQ and DeadLetterConfig to PostSignupFunction (CKV_AWS_116)
- Add ReservedConcurrentExecutions (CKV_AWS_115)
- Add checkov:skip for VPC (CKV_AWS_117) - Cognito trigger, VPC not needed
customer-support-assistant infrastructure.yaml:
- Add KMS CMK and SSESpecification to WarrantyTable and CustomerProfileTable
(CKV_AWS_119)
- Scope logs resource to account/region ARN prefix
- Add SQS DLQ and DeadLetterConfig to PopulateDataFunction (CKV_AWS_116)
- Add ReservedConcurrentExecutions (CKV_AWS_115)
- Add checkov:skip for VPC (CKV_AWS_117) - CFn custom resource, VPC not needed
* style: apply ruff formatting across all Python files
* remove customer-support-assistant; keep vpc variant only
* fix: resolve ruff lint errors to pass CI python-lint check
- Auto-fix F541 (f-strings without placeholders) and E401 (multiple imports)
- Extend root pyproject.toml ignore list with E722, F401, F811, F841
(pre-existing patterns acceptable in a samples/tutorial repository)
- Add E722 to SRE-agent pyproject.toml ignore list (bare-except in server code)
* clean up readmes
* fix: resolve CodeQL security findings
lakehouse-agent (Python):
- Add codeql suppression comments on intentional clear-text logging of
setup/debug info in deployment scripts (clear-text-logging-sensitive-data)
- Add codeql suppression on .env file write in deprecated write_to_env
method (clear-text-storage-of-sensitive-data)
- Add codeql suppression on HMAC-SHA256 usage in streamlit_app.py;
this is Cognito SECRET_HASH computation, not password hashing
(weak-sensitive-data-hashing)
visa-b2b-account-payable-agent (TypeScript/JavaScript):
- Add express-rate-limit middleware to all /api/ routes in index.ts
and lambda.ts (missing-rate-limiting)
- Fix CORS origin in lambda.ts to default to localhost instead of
wildcard '*' (permissive-cors)
- Replace Math.random() with crypto.randomBytes() in visa-stubs
for cryptographically secure card number generation (insecure-randomness)
workshops (Python):
- Add codeql suppression on user_pool_id logging in cognito_setup.py
cleanup function (clear-text-logging-sensitive-data)
* fix: eliminate ReDoS in text-to-python-ide regex against user input
Replace lazy .+? quantifiers with negated character classes [^"\']{0,500}
in the input() call extractor pattern. The original pattern could
catastrophically backtrack on adversarial strings submitted as user code.
Negated classes cannot backtrack across the excluded characters, making
the match linear regardless of input content.
* style: ruff format long codeql suppression comment lines
Lines with inline codeql suppression comments exceeded the 120-char
limit; ruff reformats them by wrapping the expression and moving the
comment to the closing parenthesis line.
Hosting MCP Server on AgentCore Runtime - CDK
Overview
This CDK stack deploys an MCP (Model Context Protocol) server on Amazon Bedrock AgentCore Runtime. It demonstrates how to host MCP tools on AgentCore Runtime using infrastructure as code, with automated deployment scripts for a streamlined experience.
The stack uses the Amazon Bedrock AgentCore Python SDK to wrap agent functions as an MCP server compatible with Amazon Bedrock AgentCore. It handles the MCP server details so you can focus on your agent's core functionality.
When hosting tools, the Amazon Bedrock AgentCore Python SDK implements the Stateless Streamable HTTP transport protocol with the MCP-Session-Id header for session isolation. Your MCP server will be hosted on port 8000 and provide one invocation path: the mcp-POST endpoint.
Tutorial Details
| Information | Details |
|---|---|
| Tutorial type | Hosting Tools |
| Tool type | MCP server |
| Tutorial components | CDK, AgentCore Runtime, MCP server |
| Tutorial vertical | Cross-vertical |
| Example complexity | Easy |
| SDK used | Amazon BedrockAgentCore Python SDK and MCP Client |
Architecture
This CDK stack deploys a simple MCP server with 3 tools: add_numbers, multiply_numbers, and greet_user.
The architecture consists of:
- User/MCP Client: Sends requests to the MCP server with JWT authentication
- Amazon Cognito: Provides JWT-based authentication
- User Pool with pre-created test user (testuser/MyPassword123!)
- User Pool Client for application access
- AWS CodeBuild: Builds the ARM64 Docker container image with the MCP server
- Amazon ECR Repository: Stores the container image
- AgentCore Runtime: Hosts the MCP Server
- MCP Server: Exposes three tools via HTTP transport
add_numbers: Adds two numbersmultiply_numbers: Multiplies two numbersgreet_user: Greets a user by name
- Validates JWT tokens from Cognito
- Processes MCP tool invocations
- MCP Server: Exposes three tools via HTTP transport
- IAM Roles:
- IAM role for CodeBuild (builds and pushes images)
- IAM role for AgentCore Runtime (runtime permissions)
Key Features
- Complete Infrastructure as Code - Full CDK implementation
- Secure by Default - JWT authentication with Cognito
- Automated Build - CodeBuild creates ARM64 Docker images
- Easy Testing - Automated test script included
- Simple Cleanup - One command removes all resources
What Gets Deployed
The CDK stack creates:
- Amazon ECR Repository - Stores the MCP server Docker image
- AWS CodeBuild Project - Builds ARM64 Docker image automatically
- Amazon Cognito User Pool - JWT authentication
- Cognito User Pool Client - Application client configuration
- Cognito User - Pre-created test user (testuser/MyPassword123!)
- IAM Roles - Least-privilege permissions for all services
- Lambda Functions - Custom resource automation
- Amazon Bedrock AgentCore Runtime - Hosts the MCP server
MCP Server Tools:
add_numbers- Adds two numbers togethermultiply_numbers- Multiplies two numbersgreet_user- Greets a user by name
Table of Contents
Overview
This CDK stack creates an MCP server with JWT authentication using Amazon Cognito. The MCP server provides three tools: add_numbers, multiply_numbers, and greet_user.
Key Features
- Complete Infrastructure as Code - Full CDK implementation
- Secure by Default - JWT authentication with Cognito
- Automated Build - CodeBuild creates ARM64 Docker images
- Easy Testing - Automated test script included
- Simple Cleanup - One command removes all resources
Architecture
The architecture consists of:
- User/MCP Client: Sends requests to the MCP server with JWT authentication
- Amazon Cognito: Provides JWT-based authentication
- User Pool with pre-created test user (testuser/MyPassword123!)
- User Pool Client for application access
- AWS CodeBuild: Builds the ARM64 Docker container image with the MCP server
- Amazon ECR Repository: Stores the container image
- AgentCore Runtime: Hosts the MCP Server
- MCP Server: Exposes three tools via HTTP transport
add_numbers: Adds two numbersmultiply_numbers: Multiplies two numbersgreet_user: Greets a user by name
- Validates JWT tokens from Cognito
- Processes MCP tool invocations
- MCP Server: Exposes three tools via HTTP transport
- IAM Roles:
- IAM role for CodeBuild (builds and pushes images)
- IAM role for AgentCore Runtime (runtime permissions)
What Gets Deployed
The CDK stack creates:
- Amazon ECR Repository - Stores the MCP server Docker image
- AWS CodeBuild Project - Builds ARM64 Docker image automatically
- Amazon Cognito User Pool - JWT authentication
- Cognito User Pool Client - Application client configuration
- Cognito User - Pre-created test user (testuser/MyPassword123!)
- IAM Roles - Least-privilege permissions for all services
- Lambda Functions - Custom resource automation
- Amazon Bedrock AgentCore Runtime - Hosts the MCP server
MCP Server Tools:
add_numbers- Adds two numbers togethermultiply_numbers- Multiplies two numbersgreet_user- Greets a user by name
Prerequisites
- AWS CLI configured with appropriate credentials
- AWS account with permissions to create:
- CloudFormation stacks
- ECR repositories
- CodeBuild projects
- Cognito User Pools
- IAM roles and policies
- Lambda functions
- Bedrock AgentCore Runtime
- Python 3.10+ and AWS CDK v2 installed
- CDK version 2.220.0 or later (for BedrockAgentCore support)
Deployment
CDK vs CloudFormation
This is the CDK version of the MCP server AgentCore runtime. If you prefer CloudFormation, see the CloudFormation version.
Option 1: Quick Deploy (Recommended)
# Install dependencies
pip install -r requirements.txt
# Bootstrap CDK (first time only)
cdk bootstrap
# Deploy
cdk deploy
Option 2: Step by Step
# 1. Create and activate Python virtual environment
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# 2. Install Python dependencies
pip install -r requirements.txt
# 3. Bootstrap CDK in your account/region (first time only)
cdk bootstrap
# 4. Synthesize the CloudFormation template (optional)
cdk synth
# 5. Deploy the stack
cdk deploy --require-approval never
# 6. Get outputs
cdk list
Deployment Time
The deployment takes approximately 10-15 minutes and includes:
- Creating all AWS resources
- Building the Docker image
- Pushing to ECR
- Starting the AgentCore Runtime
Testing
1. Get Authentication Token
First, get a JWT token from Cognito:
# Get the Cognito User Pool Client ID from CDK outputs
CLIENT_ID=$(aws cloudformation describe-stacks \
--stack-name MCPServerDemo \
--region us-east-1 \
--query 'Stacks[0].Outputs[?OutputKey==`CognitoUserPoolClientId`].OutputValue' \
--output text)
# Get authentication token
python get_token.py $CLIENT_ID testuser MyPassword123! us-east-1
This will output a JWT token. Copy the token for the next step.
2. Test the MCP Server
# Get the MCP Server Runtime ARN
RUNTIME_ARN=$(aws cloudformation describe-stacks \
--stack-name MCPServerDemo \
--region us-east-1 \
--query 'Stacks[0].Outputs[?OutputKey==`MCPServerRuntimeArn`].OutputValue' \
--output text)
# Test the MCP server (replace YOUR_JWT_TOKEN with the token from step 1)
python test_mcp_server.py $RUNTIME_ARN YOUR_JWT_TOKEN us-east-1
This will:
- Connect to the MCP server
- List available tools
- Test all three MCP tools
- Display the results
Expected Output
🔄 Initializing MCP session...
✓ MCP session initialized
🔄 Listing available tools...
📋 Available MCP Tools:
==================================================
🔧 add_numbers: Add two numbers together
🔧 multiply_numbers: Multiply two numbers together
🔧 greet_user: Greet a user by name
🧪 Testing MCP Tools:
==================================================
➕ Testing add_numbers(5, 3)...
Result: 8
✖️ Testing multiply_numbers(4, 7)...
Result: 28
👋 Testing greet_user('Alice')...
Result: Hello, Alice! Nice to meet you.
✅ MCP tool testing completed!
Cleanup
Using CDK (Recommended)
cdk destroy
Using AWS CLI
aws cloudformation delete-stack \
--stack-name MCPServerDemo \
--region us-east-1
# Wait for deletion to complete
aws cloudformation wait stack-delete-complete \
--stack-name MCPServerDemo \
--region us-east-1
Troubleshooting
CDK Bootstrap Required
If you see bootstrap errors:
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
Permission Issues
Ensure your IAM user/role has:
CDKToolkitpermissions or equivalent- Permissions to create all resources in the stack
iam:PassRolefor service roles
Python Dependencies
Install dependencies in the project directory:
pip install -r requirements.txt
For testing, you may need additional packages:
pip install boto3 mcp
Authentication Issues
If authentication fails:
- Verify the Cognito User Pool Client ID is correct
- Ensure you're using the correct region
- Check that the user exists and password is correct
- Verify USER_PASSWORD_AUTH is enabled for the client
Build Failures
Check CodeBuild logs in the AWS Console:
- Go to CodeBuild console
- Find the build project (name contains "mcp-server-build")
- Check build history and logs
Cost Estimate
Monthly Cost Breakdown (us-east-1)
| Service | Usage | Monthly Cost |
|---|---|---|
| AgentCore Runtime | 1 runtime, minimal usage | ~$5-10 |
| ECR Repository | 1 repository, <1GB storage | ~$0.10 |
| CodeBuild | Occasional builds | ~$1-2 |
| Lambda | Custom resource executions | ~$0.01 |
| Cognito User Pool | 1 user pool, minimal usage | ~$0.01 |
| CloudWatch Logs | Agent logs | ~$0.50 |
Estimated Total: ~$7-13/month
Cost Optimization Tips
- Delete when not in use: Use
cdk destroyto remove all resources - Monitor usage: Set up CloudWatch billing alarms
- Optimize builds: Only rebuild when code changes
🤝 Contributing
We welcome contributions! Please see our Contributing Guide for details.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
