Build, deploy, operate, and migrate AI agents on Amazon Bedrock AgentCore. The agentcore CLI (npm @aws/agentcore) manages the full lifecycle via CDK/CloudFormation.
There are two ways to run an agent:
| Mode | What it is | When |
|---|---|---|
| Harness (default since GA, June 2026) | Declarative managed agent: harness.json = model + tools + skills + memory + limits. No agent code, no container. agentcore create --defaults creates one. |
Persona + skills + standard tools cover the need |
| Runtime (code agent) | Your code (Strands/LangChain/ADK/OpenAI/VercelAI) deployed as CodeZip or Container | Custom orchestration, custom tool logic, middleware |
Start with a harness; agentcore export harness converts it to editable Strands code later if you outgrow the config (one-way door: code, unlike config, is yours to maintain).
Key Concepts
| Term | Meaning |
|---|---|
| Harness | First-class AWS resource (CreateHarness/UpdateHarness/InvokeHarness): a fully managed agent defined by config. In a CLI project: agentcore.json → harnesses[] + app/<name>/harness.json + system-prompt.md |
| Runtime | A deployed code agent — agentcore.json → runtimes[], code in app/<name>/ |
| Gateway | MCP tool router — routes agent tool calls to MCP servers, Lambda, API Gateway, HTTP passthrough, inference providers, web-search connector |
| Identity | Secret vault — API keys and OAuth credentials; can reference existing AWS Secrets Manager ARNs |
| Memory | Managed memory — strategies: SEMANTIC, SUMMARIZATION, USER_PREFERENCE, EPISODIC |
| Registry | Private catalog of agents/tools/skills with approval workflow |
Prerequisites
Run the bundled preflight before any workflow:
python3 scripts/preflight_check.py
Checks: Python ≥ 3.10, Node.js ≥ 20, uv (required for Python agents), AWS CLI + credentials, agentcore CLI ≥ 0.22 (npm install -g @aws/agentcore; upgrade with agentcore update), bedrock-agentcore-control namespace. Docker only for Container builds.
Core Lifecycle
agentcore create --defaults # New project with a default harness (interactive wizard without flags)
agentcore dev # Local dev server + browser-based agent inspector
agentcore validate # Validate agentcore/ config files
agentcore deploy # Deploy via CDK → CloudFormation stack AgentCore-<project>-default
agentcore invoke --harness <name> "test" # or --runtime <name> for code agents
agentcore logs / traces / status # Observability
agentcore exec -- <cmd> # Shell into a deployed agent container
Non-interactive create (all flags marked [non-interactive] in --help):
agentcore create --name <harness> --project-name <proj> --defaults \
--skip-git --output-dir <dir>
Project layout (ground truth, CLI 0.22.0):
<project>/
├── AGENTS.md # AI-assistant context written by the CLI
├── agentcore/
│ ├── agentcore.json # Flat resource arrays: runtimes[], harnesses[], memories[], credentials[], agentCoreGateways[], ...
│ ├── aws-targets.json # ARRAY of {name, account (12-digit string), region}
│ ├── .env.local # Gitignored secrets
│ ├── .llm-context/ # TypeScript schema types — the schema authority; read these before editing JSON by hand
│ └── cdk/ # CDK project (deps installed by create unless --skip-install)
└── app/
├── <harness>/ # harness.json + system-prompt.md (no code)
└── <agent>/ # main.py, pyproject.toml, model/, skills/, mcp_client/ (code agent)
Harness Workflows
Add/manage harnesses, tools, skills, memory; export to code. See references/harness.md for commands, harness.json schema, and skill sources (--path/--s3/--git/--aws-skills).
agentcore add harness --name <n> --system-prompt "<text>" [--tools ...] [--memory-mode managed ...]
agentcore add skill --harness <n> --path <dir> # skill dir with SKILL.md
agentcore add tool --harness <n> --type remote_mcp --name <t> --url <mcp-url>
agentcore export harness --name <n> | --arn <arn> # → editable Strands agent under app/
Migration from coding assistants
Migrate agents/skills/MCP/hooks from 15 assistant formats (Claude Code, Copilot, Cursor, …) to AgentCore. REQUIRED: follow references/migration.md — discovery scan, mapping rules, harness-first generation, deploy. Supporting docs: references/source-formats.md (detection), references/agentcore-mappings.md (mapping rules), references/migration-modes.md (deploy/teardown/errors).
python3 scripts/scan_configs.py --repo-root <path> --format json # → migration-inventory.json
python3 scripts/generate_project.py --inventory migration-inventory.json --output-dir ./agentcore-project --region us-east-1
Key Rules
- Harness-first — agents that are persona + skills + standard tools become harnesses (config), not code. Generate code runtimes only for custom logic.
.llm-context/is the schema authority — when editingagentcore.json/harness.jsonby hand, conform to the TypeScript types there, thenagentcore validate.- Never put secrets in generated files — API keys → Identity credentials (
agentcore add credential), or reference an existing Secrets Manager ARN. Non-secrets →envVars. - Renaming a resource destroys and recreates it — the
namefield is the CloudFormation logical ID. agentcore createmakes a NESTED./<project-name>/scaffold — it does not initialize in place. For pre-generated configs: create with--no-agent, then copyagentcore.json/aws-targets.json/app/into the scaffold. The scaffold includes CDKnode_modules(unless--skip-install); if deploy fails withtsc: not found, runnpm installinagentcore/cdk/.- Don't
add agentfor runtimes already inagentcore.json— fails with "already exists".addcommands are for adding NEW resources. - aws-targets.json is a JSON array —
[{"name","account","region"}],accountis the 12-digit ID string (notaccountId). - Naming: harness/agent names alphanumeric+underscores, start with letter, ≤48 chars; project names alphanumeric only, ≤23 chars; gateway names alphanumeric+hyphens.
- Default model is Claude — harness default
global.anthropic.claude-sonnet-4-6; code-agent template usesglobal.anthropic.claude-sonnet-4-5-20250929-v1:0. Nova (amazon.nova-lite-v1:0) remains a fallback if Anthropic model access isn't enabled in the account. - Streaming is the default entrypoint pattern —
async for event in agent.stream_async(...): yield event(the CLI's own template). The old "non-streaming only" workaround is obsolete. - Read EXPORT_NOTES.md after
export harness— it lists manual follow-ups the exporter couldn't automate. - Test with simple prompts first — verify deploy works before complex prompts.
Resolved Blockers (May → July 2026)
Limitations documented by earlier migrations that AWS has since fixed — do not re-apply old workarounds:
| Old blocker | Current state |
|---|---|
Console-created harnesses locked (no update-harness API) |
Harness GA: UpdateHarness API exists; agentcore export harness --arn <arn> converts any harness (incl. Console-created) to a CLI-managed code agent |
| Skills mountable only via Console UI | agentcore add skill --harness <n> --path/--s3/--git/--aws-skills |
| HITL gates had no mechanism | Gateway elicitation pass-through (form/URL modes); Step Functions harness integration with approval steps |
| Claude required use-case form; Nova Lite forced default | Claude Sonnet is the CLI default; LiteLLM + Bedrock Mantle add more providers |
Streaming yield broke CLI display |
Fixed — streaming is the default template pattern |
| Secrets had to be copied into Identity vault | Identity credential providers can reference existing Secrets Manager ARNs |
Error Handling
| Error | Action |
|---|---|
tsc: not found on deploy |
cd agentcore/cdk && npm install |
"already exists" from add agent |
Resource already in agentcore.json — edit the JSON instead |
| Deploy fails: stack already exists | aws cloudformation delete-stack --stack-name AgentCore-<project>-default |
ThrottlingException: Too many tokens per day |
Bedrock daily token quota — often 0 by default on new/restricted accounts even after model access is granted. Check aws service-quotas list-service-quotas --service-code bedrock --query "Quotas[?contains(QuotaName,'tokens per day')]"; request an increase via Service Quotas → Amazon Bedrock (AWS-approved, not instant) |
ModelNotAccessibleException |
Enable model access in Bedrock Console, or switch modelId to amazon.nova-lite-v1:0 |
agentcore create outputs nothing |
Invalid project name — alphanumeric only, ≤23 chars |
Harness invoke: fetch failed (UND_ERR_CONNECT_TIMEOUT) after ~10s |
Node fetch tries only the FIRST DNS record of bedrock-agentcore.<region>.amazonaws.com; if that IP is unreachable from your network it times out (curl/Python fall back to other records and work). Test per-IP with curl --resolve; fix DNS/egress or invoke via aws bedrock-agentcore invoke-agent-runtime |
| Stdio MCP server | No direct support — see MCP mapping in references/agentcore-mappings.md |
Bundled Resources
Scripts
scripts/preflight_check.py— verify all prerequisitesscripts/scan_configs.py— scan a repo for 15 AI-assistant config formats →migration-inventory.jsonscripts/generate_project.py— generate an AgentCore project (harnesses + code runtimes) from the inventoryscripts/invoke_harness.py— boto3 fallback foragentcore invoke --harnesswhen the CLI hitsfetch failed
References
references/harness.md— harness commands,harness.jsonschema, skills, export-to-codereferences/migration.md— the migration workflow (discover → parse → map → generate → deploy)references/source-formats.md— per-tool parsing rules for 15 assistant formatsreferences/agentcore-mappings.md— mapping rules: source artifacts → AgentCore equivalentsreferences/migration-modes.md— deploy workflow, validation, teardown, error tablereferences/security-iam.md— least-privilege execution role, confused-deputy protection, model-ARN scopingreferences/deployment-checklist.md—[BLOCKER]-gated checklist to run beforeagentcore deployreferences/templates/— templates foragentcore.json,harness.json,runtime-metadata.json,Dockerfile, registry records
Assets
assets/poc-cve-verify/— complete worked migration (harness + code runtime), withVERIFIED.md(live AWS run evidence)assets/iam-policies/— appliable least-privilege trust + permissions policy templates
Evals
evals/evals.json— regression scenarios (harness/code classification, stdio MCP, export-harness, quota, secrets) for self-testing the skill