Create a Domain Repo

One command. Full project. Ready for terraform init.


Run the Scaffolder

Open any terminal and paste:

bash <(curl -sL https://raw.githubusercontent.com/The-Cloud-Clockwork/tcc-aws-agent-platform/main/scripts/create-domain.sh)

It asks two questions:

Domain name (e.g., logistics, finops, healthcare): my-project
Org prefix (e.g., myco, acme): acme

That’s it. You get a full project at acme-my-project/.


What You Get

acme-my-project/
├── agents/                         ← Your AI agents (shared Docker image)
│   ├── Dockerfile
│   ├── pyproject.toml
│   ├── src/my_project_agents/
│   │   ├── app.py                  ← 5-line entrypoint (identical for all domains)
│   │   └── agent_configs.py        ← Register your prompt builders here
│   ├── blueprints/
│   │   ├── agents/
│   │   │   └── example-agent.yaml  ← Your first agent — edit this
│   │   ├── strategies/
│   │   └── workflows/
│   └── prompts/
│       └── my_project/
│           └── example-agent.txt   ← Your first system prompt — edit this
│
├── mcps/                           ← Your MCP tool servers (one Dockerfile each)
│   ├── blueprints/
│   └── example-service/
│       ├── Dockerfile
│       ├── pyproject.toml
│       └── src/.../server.py       ← Example MCP with a hello() tool
│
├── lambdas/                        ← Lambda functions for workflow steps
│   └── stubs/handler.py
│
├── infra/                          ← Terraform (consumes platform modules)
│   ├── main.tf                     ← 3 modules: platform → agents → workflows
│   ├── variables.tf                ← All variables with sensible defaults
│   ├── providers.tf                ← AWS provider configuration
│   ├── backend.tf                  ← S3 backend (edit the bucket name)
│   └── envs/
│       ├── dev.tfvars              ← Development config
│       ├── staging.tfvars          ← Staging config
│       └── production.tfvars       ← Production config
│
├── .gitignore
├── pyproject.toml
└── ruff.toml

~30 files, all wired together, git initialized with a first commit.


Deploy

1. Edit the state bucket

Open infra/backend.tf and replace the placeholder bucket name:

terraform {
  backend "s3" {
    bucket = "acme-my-project-infra"   # ← your actual S3 bucket
    key    = "terraform.tfstate"
    region = "us-east-1"               # ← your primary region
  }
}

2. Initialize Terraform

cd acme-my-project/infra
terraform init

This downloads the platform modules from GitHub.

3. Plan

terraform plan -var-file=envs/dev.tfvars

Review the resources that will be created: KMS keys, DynamoDB tables, SQS queue, S3 buckets, Gateway, Memory, ECR repo, CodeBuild project, and Runtime registration.

4. Apply

terraform apply -var-file=envs/dev.tfvars

5. Build the agent image

terraform apply -var-file=envs/dev.tfvars -var="build_enabled=true"

This builds the Docker image via CodeBuild and pushes to ECR.


Customize Your Agent

Edit the blueprint

Open agents/blueprints/agents/example-agent.yaml:

id: example-agent                          # ← rename to kebab-case
name: Example Agent                        # ← rename
version: "1.0.0"
prompt_ref: "my_project/example-agent"     # ← matches prompts/ path

# Switch provider by changing these two fields — no other changes needed.
# provider defaults to "bedrock". Use "litellm", "anthropic", or "vertex"
# for other inference backends.
model:
  provider: bedrock
  model_id: us.anthropic.claude-sonnet-4-20250514-v1:0
  temperature: 0.7
  max_tokens: 4096

runtime:
  type: agentcore
  network_mode: PRIVATE              # PRIVATE = runs inside your VPC
  idle_timeout_minutes: 15

tools: []                            # ← add MCP tools here

memory:
  strategies: []                     # ← add memory strategies here
  event_expiry_days: 30

Edit the system prompt

Open agents/prompts/my_project/example-agent.txt and write your agent’s personality and instructions.

Add tools

tools:
  - mcp: my-data-service-mcp
    tools: [query_data, get_report]
  - builtin: code_interpreter
    network_mode: PRIVATE

Add memory

memory:
  strategies:
    - type: SEMANTIC
      name: FactExtractor
      namespace: "{actorId}/facts/"
    - type: SUMMARY
      name: Summarizer
      namespace: "{actorId}/{sessionId}/summaries/"
  event_expiry_days: 30
  short_term_k: 5

Switch to a LiteLLM proxy

To use an OpenAI-compatible proxy instead of Bedrock, change the model block:

model:
  provider: litellm
  model_id: claude-sonnet-4-6        # name the proxy expects; passed through unchanged
  temperature: 0.7
  max_tokens: 4096
  base_url: ${LITELLM_BASE_URL}
  api_key_env: LITELLM_API_KEY

No other changes to the blueprint or handler are needed.


Add More Agents

  1. Create a new YAML file in agents/blueprints/agents/
  2. Create a matching prompt in agents/prompts/my_project/
  3. Run terraform apply — the platform creates all resources automatically

Each YAML file equals one agent runtime. No handler code changes required.


Add an MCP Server

  1. Create a blueprint in mcps/blueprints/my-service-mcp.yaml
  2. Create mcps/my-service/ with a Dockerfile and src/
  3. Add the MCP module to infra/main.tf:
module "mcps" {
  source     = "git::https://github.com/The-Cloud-Clockwork/tcc-aws-agent-platform.git//modules/agents?ref=v1.0.0"
  depends_on = [module.platform]

  resource_prefix = "${var.resource_prefix}-mcp"
  blueprint_dir   = "${path.module}/../mcps/blueprints"
  source_dir      = "${path.root}/../mcps"
  source_layout   = "polyrepo"
  polyrepo_suffix = "-mcp"
  # Wire platform outputs (same pattern as the agents module)
  gateway_id         = module.platform.gateway_id
  vpc_id             = module.platform.vpc_id
  private_subnet_ids = module.platform.private_subnet_ids
  data_kms_key_arn   = module.platform.data_kms_key_arn
}

The blueprint ID minus the suffix must match the subdirectory name. Blueprint my-service-mcp with suffix -mcp looks for mcps/my-service/Dockerfile.


Scaffolder CLI Options

Skip the interactive prompts with flags:

bash <(curl -sL https://raw.githubusercontent.com/The-Cloud-Clockwork/tcc-aws-agent-platform/main/scripts/create-domain.sh) \
  --name my-project \
  --prefix acme \
  --region us-east-1 \
  --bedrock-region us-west-2
Flag Default Description
--name (asks) Domain name
--prefix (asks) Org prefix
--region (asks) Primary AWS region
--bedrock-region (asks) Bedrock model region (may differ from primary)
--platform-ref main Git ref for platform module sources

Next Steps