Agents Build
AWSOfficialCreated by aws-agentcore
- Skill
- Workflow
- Cloud and DevOps
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The agents-build skill provides a structured workflow for adding advanced features to existing AgentCore projects. It acts as a central hub for configuring infrastructure and functional capabilities, such as cross-session memory, VPC connectivity, multi-agent delegation, and sandboxed code execution. The skill ensures project integrity by verifying the environment, checking for existing project configurations, and guiding the user through the appropriate implementation path based on their specific requirements.
What it does
- Adds cross-session memory to maintain user context.
- Configures VPC networking for secure access to private resources.
- Enables multi-agent systems with orchestrator-specialist patterns.
- Integrates browser and code interpreter tools for enhanced agent capabilities.
- Facilitates the migration of existing Bedrock Agents to AgentCore.
- Handles resource removal and project teardown.
When to use it
- When you need to expand an existing agent's functionality.
- When setting up private network connectivity for your agent.
- When transitioning from a single-agent to a multi-agent architecture.
- When you need to add sandboxed code execution or web browsing capabilities.
- When you need to clean up or remove specific agent resources.
Advantages
- Provides a consistent, guided workflow for complex configuration tasks.
- Prevents common errors by validating project context and naming conventions.
- Reduces manual setup time for infrastructure-heavy features like VPCs.
- Centralizes documentation and implementation steps for diverse agent capabilities.
Usage examples
- “add memory to my agent”
- The skill reads the project configuration and provides the necessary steps to implement cross-session memory storage.
- “I need to add a code interpreter to my agent”
- The skill guides you through the integration of the AgentCore Code Interpreter tool for sandboxed Python or JS execution.
- “how do I set up VPC connectivity?”
- The skill loads the VPC reference documentation and walks you through configuring subnets and security groups for your agent.
- “tear down my agent”
- The skill initiates the resource removal workflow to safely destroy the specified agent deployment.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/aws/agents-build/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip agents-build.zip -d .agents/skills
Documentation by aws-agentcore
build
Add capabilities to your AgentCore agent project.
When to use
Adding cross-session memory to your agent
Calling your deployed agent from a web app, mobile app, or backend service
Configuring VPC networking for private resources (RDS, internal APIs)
Building multi-agent systems with orchestrator/specialist patterns
Migrating an existing Bedrock Agent to AgentCore
Adding the Browser tool so the agent can navigate websites
Adding the Code Interpreter so the agent can execute code in a sandbox
Adding AgentCore Payments so the agent can pay for x402- or MPP-protected APIs, tools, or content
Removing resources from your project or tearing down a deployment
Do NOT use for:
Connecting to external tools/APIs via Gateway (OpenAPI specs, Lambda, MCP servers, credentials, policies) → use
agents-connectScaffolding a new project → use
agents-get-startedDeploying → use
agents-deploy
Input
$ARGUMENTS can be:
A capability: "memory", "integrate", "vpc", "multi-agent", "migrate", "browser", "code-interpreter", "payments", "teardown"
A description of what they want: "remember user preferences", "call from React app", "scrape a website", "run pandas in the agent", "delete my agent", "clean up resources"
Empty — the skill will determine the workflow from context
Process
Step 0: Verify CLI version
Run agentcore --version. This skill requires v0.9.0 or later.
If older: "Run agentcore update to get the latest version."
Step 1: Read project context
Read agentcore/agentcore.json to understand the current project — framework, existing resources, agent configuration.
If agentcore/agentcore.json is not found:
Check if the developer is in the wrong directory. Look for
agentcore/agentcore.jsonin parent directories (up to 3 levels). If found, tell them: "Found an AgentCore project at<path>. Are you working in that project?"If no project exists anywhere nearby, ask what capability they wanted to add. Then offer two paths:
"I can walk you through creating a project first and then adding CAPABILITY — want to do that?" (run the get-started flow inline, then continue with the build workflow)
"If you already have a project elsewhere,
cdinto it and try again."
Do not just say "go use agents-get-started" and stop — that loses the developer's context about what they actually wanted to do.
Step 2: Determine the workflow
Important disambiguation — before routing to a build reference, check if the prompt is actually a connect or debug concern:
If the phrase mentions external APIs, Lambda functions, OpenAPI specs, gateways, credentials, MCP servers, or policies → this is
agents-connect, not buildIf the developer says something is broken (wrong answers, errors, tool failures) → this is
agents-debug, not buildBuild is for adding new capabilities to a working project, not fixing broken ones
Based on the developer's prompt and $ARGUMENTS, load the appropriate reference:
| Developer intent | Reference to load |
|---|---|
| Add memory, remember things, user preferences, cross-session | references/memory.md |
| Call agent from app, invoke from code, streaming, SDK client, agent URL, execute shell in session | references/integrate.md |
| VPC, private network, RDS, internal API, subnet, security group | references/vpc.md |
| Multi-agent, orchestrator, specialist, A2A, delegation, agent handoff | references/multi-agent.md |
| Custom headers from caller to agent, header allowlist, tenant ID/correlation ID/trace propagation | references/request-headers.md |
| Migrate Bedrock Agent, import agent, move to AgentCore | references/migrate.md |
| Browser tool, web navigation, form filling, scraping, Nova Act, Playwright, live view | references/browser.md |
| Code Interpreter, execute code, sandbox, run Python/JS/TS, data analysis in agent, pandas | references/code-interpreter.md |
| Payments, pay for x402 or MPP content, 402 Payment Required, Machine Payments Protocol, WWW-Authenticate: Payment, microtransactions, paid API/tool, payment manager/connector | references/payments.md |
| Delete agent, remove resource, tear down, clean up, destroy, start fresh | references/teardown.md |
| Change model, switch model, use Haiku/Sonnet/Nova, different model | Inline — see "Changing the model" below |
If the developer asks about the difference between local dev and deployed (e.g., "why does my memory work after deploy but not locally?"), load references/local-vs-deployed.md alongside the specific workflow reference.
Read the matching file into context and follow its Process section step by step — do not summarize.
If the intent is ambiguous, ask the developer which capability they want to add.
Changing the model
The model is configured in app/<AgentName>/model/load.py (scaffolded by agentcore create). To change it:
Open
app/<AgentName>/model/load.pyChange the
model_idparameter in theBedrockModel()constructor
# Default (scaffolded by CLI)
return BedrockModel(model_id="global.anthropic.claude-sonnet-4-5-20250929-v1:0")
# Switch to Haiku for cost savings
return BedrockModel(model_id="us.anthropic.claude-3-5-haiku-20241022-v1:0")
# Switch to Nova Lite
return BedrockModel(model_id="amazon.nova-lite-v1:0")Cross-region inference profile prefixes (us., eu., apac., global.) control where inference runs. Use global. for maximum throughput, or a geographic prefix for data residency. Not all models support all prefixes — check the Bedrock inference profiles docs.
After changing the model:
Verify the model is enabled in your region: AWS Console → Amazon Bedrock → Model access
For cross-region profiles, enable in all destination regions
If using
agents-harden, update the IAM policy to scope to the new model ARNRun
agentcore devto test locally, thenagentcore deployto update the deployed agent
No agentcore.json change is needed — the model is configured in code, not in the project config.
Pre-flight: validate any --name before generating the CLI command
Whichever reference you load, most end up producing an agentcore add <resource> --name <something> command. The CLI fails late on invalid names — you'll see the error after walking through prompts, not before running the command. Validate up front:
| Resource | Max chars | Allowed | Starts with |
|---|---|---|---|
Agent (add agent) | 48 | alphanumeric + _ | letter |
| Memory, gateway, gateway-target, credential, evaluator, online-eval, policy, policy-engine, payment-manager, payment-connector | 48 | alphanumeric + _ | letter |
Count the characters before constructing the command. If the name is over the limit or contains hyphens, dots, or spaces, push back: "<name> is N characters / uses -, which the CLI rejects. How about <suggestion>?" Never run the command with an invalid name hoping the CLI message will be clear.
Note: agentcore create --name (the project name) has a stricter 23-char limit and does not allow underscores. That's covered in agents-get-started; if you see the developer re-running create, flag the 23-char limit specifically.
Output
Depends on the workflow — see the loaded reference for specific outputs.
Quality criteria
The correct reference was loaded based on the developer's intent
All output follows the loaded reference's quality criteria
Cross-references to other skills (agents-connect, agents-deploy) are included where relevant
Files
- ATTRIBUTION.mdAdded by AutoGineer1011 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md8.9 KiB
- references/browser.md10.0 KiB
- references/code-interpreter.md8.9 KiB
- references/integrate.md19.1 KiB
- references/local-vs-deployed.md4.2 KiB
- references/memory.md27.7 KiB
- references/migrate.md5.5 KiB
- references/multi-agent.md16.2 KiB
- references/payments.md71.4 KiB
- references/request-headers.md6.8 KiB
- references/teardown.md5.3 KiB
- references/vpc.md12.5 KiB
- scripts/process_payment_tool.pyScript7.0 KiB
- scripts/setup_payment_user.pyScript5.3 KiB
references/integrate.md
integrate
Help a developer call their deployed agent from an application.
When to use
Developer has a deployed agent and wants to call it from their app
Developer needs the agent URL and auth credentials
Developer wants to handle streaming responses from the agent
Developer needs to manage conversation sessions across multiple calls
Developer is building a frontend, backend service, or CLI that consumes the agent
Caller and agent are in different AWS accounts (cross-account invocation)
Do NOT use for:
Giving the agent tools to call external APIs → use
agents-connectDeploying the agent → use
agents-deployDebugging agent responses → use
agents-debugSecuring the agent endpoint for production → use
agents-harden(but this skill covers the client-side auth code)
Input
$ARGUMENTS can be:
A language or framework: "from React", "in Python", "Node.js backend"
An auth preference: "using IAM", "with JWT"
Empty — the skill will detect the project context and guide accordingly
Process
Step 1: Check deployment status
Read agentcore/agentcore.json to get the agent name. Then check if it's deployed:
agentcore status --type agentIf not deployed: "Your agent needs to be deployed before you can call it from an app. Run agentcore deploy first, or use the agents-deploy skill for guidance."
Do not proceed until the agent is deployed.
Step 2: Get the agent endpoint
agentcore fetch access --name <AgentName> --type agentThis returns:
Agent Runtime ARN — needed for SDK invocation
Endpoint URL — for direct HTTPS calls
Auth configuration — what auth method is configured
Note the auth type from the output. It determines how the client app authenticates.
Step 3: Determine auth method
Read the agent's authorizerType field from agentcore/agentcore.json (it's a top-level field on the runtime entry; JWT details live in the separate authorizerConfiguration object on the same runtime).
| Auth type | How the client authenticates | Best for |
|---|---|---|
| None (default) | IAM SigV4 signing on the request | Backend services with AWS credentials |
| AWS_IAM | IAM SigV4 signing on the request | Backend services, Lambda-to-agent calls |
| CUSTOM_JWT | Bearer token in Authorization header | Web/mobile apps with an identity provider |
If no authorizer is configured: The agent uses IAM auth by default. The calling identity needs bedrock-agentcore:InvokeAgentRuntime permission.
If CUSTOM_JWT: The client sends a JWT from the configured identity provider. The agent validates it against the discovery URL, allowed audience, and allowed clients configured during setup.
Step 4: Generate client code
Based on the developer's language preference (from $ARGUMENTS or ask), generate the appropriate client code.
Python (boto3) — IAM auth
import boto3
import json
from botocore.exceptions import ClientError
client = boto3.client("bedrock-agentcore", region_name="<REGION>")
try:
response = client.invoke_agent_runtime(
agentRuntimeArn="<AGENT_RUNTIME_ARN>",
qualifier="DEFAULT", # or a specific version number
payload=json.dumps({
"prompt": "Hello, what can you do?"
}).encode(),
runtimeSessionId="session-123", # reuse for multi-turn conversations
)
# Handle streaming response — response["response"] is a StreamingBody
stream = response["response"]
if hasattr(stream, "iter_lines"):
for line in stream.iter_lines():
if line:
print(line.decode(), end="", flush=True)
else:
# Some SDK versions return raw bytes — read all at once
content = stream.read()
print(content.decode() if isinstance(content, bytes) else content)
except ClientError as e:
code = e.response["Error"]["Code"]
if code == "AccessDeniedException":
# Missing bedrock-agentcore:InvokeAgentRuntime permission
raise RuntimeError("Caller lacks InvokeAgentRuntime permission") from e
elif code == "ValidationException":
# Wrong ARN, bad payload format, invalid session ID
raise RuntimeError(f"Invalid request: {e}") from e
elif code == "ThrottlingException":
# Retry with exponential backoff
raise
else:
raisePython (HTTPS) — JWT auth
import requests
AGENT_URL = "<ENDPOINT_URL>"
JWT_TOKEN = "<TOKEN_FROM_YOUR_IDP>"
response = requests.post(
AGENT_URL,
headers={
"Authorization": f"Bearer {JWT_TOKEN}",
"Content-Type": "application/json",
},
json={"prompt": "Hello, what can you do?"},
stream=True,
)
for chunk in response.iter_content(chunk_size=None):
print(chunk.decode(), end="", flush=True)JavaScript/TypeScript (AWS SDK) — IAM auth
import {
BedrockAgentCoreClient,
InvokeAgentRuntimeCommand,
} from "@aws-sdk/client-bedrock-agentcore";
const client = new BedrockAgentCoreClient({ region: "<REGION>" });
const response = await client.send(
new InvokeAgentRuntimeCommand({
agentRuntimeArn: "<AGENT_RUNTIME_ARN>",
qualifier: "DEFAULT",
payload: new TextEncoder().encode(
JSON.stringify({ prompt: "Hello, what can you do?" })
),
runtimeSessionId: "session-123",
})
);
// response.response is the streaming body
const decoder = new TextDecoder();
for await (const chunk of response.response) {
process.stdout.write(decoder.decode(chunk));
}JavaScript/TypeScript (fetch) — JWT auth
const AGENT_URL = "<ENDPOINT_URL>";
const JWT_TOKEN = "<TOKEN_FROM_YOUR_IDP>";
const response = await fetch(AGENT_URL, {
method: "POST",
headers: {
Authorization: `Bearer ${JWT_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ prompt: "Hello, what can you do?" }),
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
process.stdout.write(decoder.decode(value));
}Step 5: Session management
Explain how sessions work:
runtimeSessionId— pass the same value across multiple calls to maintain conversation contextGenerate a unique session ID per user conversation (e.g., UUID)
Sessions are server-side — the agent remembers the conversation history for that session ID
If you omit the session ID, each call is stateless (no conversation memory)
import uuid
# New conversation
session_id = str(uuid.uuid4())
# First turn
invoke(session_id, "What's the weather in Seattle?")
# Follow-up in same conversation
invoke(session_id, "What about tomorrow?")
# New conversation — new session
new_session_id = str(uuid.uuid4())
invoke(new_session_id, "Different topic entirely")Step 6: Protocol-specific guidance
Read the agent's protocol from agentcore/agentcore.json.
If HTTP (default): The patterns above apply directly.
If MCP: The agent exposes an MCP endpoint. Clients connect using the MCP protocol (Streamable HTTP). Point the developer to MCP client libraries for their language.
If A2A: The agent exposes an Agent-to-Agent endpoint with a card at /.well-known/agent-card.json. The calling agent discovers capabilities via the card and communicates over JSON-RPC 2.0. See references/multi-agent.md in this skill for A2A integration patterns.
Step 7: Integration patterns that look right but fail
Two patterns come up often enough in support cases to call out directly.
API Gateway /{proxy+} with a URL-encoded Runtime ARN. Fronting AgentCore Runtime with an API Gateway REST API whose resource is /{proxy+} and whose integration URI is the encoded runtime ARN appears to work — the deploy succeeds and short requests return. Longer requests fail at around 2 minutes with Integration closed connection prematurely in the logs, regardless of integrationTimeoutInMillis. HTTP_PROXY is a generic forwarding integration; it doesn't handle SigV4, streaming, or session semantics the way the SDK client does.
Use one of these instead:
Call Runtime directly from the client with the
bedrock-agentcoreSDK (Step 4 above). This is the intended path.Put a Lambda between API Gateway and Runtime if you need API Gateway for rate limiting, a public HTTPS endpoint, or other reasons. The Lambda receives the request, calls
invoke_agent_runtime, and streams the response back. The Lambda's execution role needsbedrock-agentcore:InvokeAgentRuntime. Be aware that API Gateway has a 29-second hard ceiling on synchronous responses — this works only for fast agents. For anything multi-step, use the direct SDK path instead.
Lambda-in-front for synchronous agent responses hits a short timeout ceiling. A Client → API Gateway → Lambda → Runtime chain caps at ~29 seconds because of the API Gateway synchronous response limit. Any agent that reasons, calls multiple tools, or uses a non-trivial model will exceed it. If you're hitting timeouts on a Lambda wrapping Runtime, the fix is usually to drop the Lambda and let the client call Runtime directly — Runtime supports streaming responses natively, which is typically the reason teams add a Lambda in the first place.
Step 8: Cross-account invocation
Calling an agent in a different AWS account than your caller uses standard AWS cross-account IAM patterns — no AgentCore-specific plumbing. The caller account assumes a role in the agent's account, gets temporary credentials, and uses them to sign the invoke request.
Setup in the agent's account (Account B):
Create an IAM role that trusts the caller account and has permission to invoke the runtime.
// Trust policy — who can assume this role
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<CALLER_ACCOUNT_ID>:root"},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {"sts:ExternalId": "<unique-external-id>"}
}
}]
}// Permissions policy — what this role can do
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "bedrock-agentcore:InvokeAgentRuntime",
"Resource": "arn:aws:bedrock-agentcore:<REGION>:<AGENT_ACCOUNT_ID>:runtime/<RUNTIME_NAME>-*"
}]
}Scope the Principal in the trust policy as narrowly as possible (a specific role ARN in the caller account rather than :root for anything beyond proof-of-concept). Use an ExternalId to prevent the confused deputy problem.
In the caller's app (Account A):
import boto3
import json
# Assume the role in Account B
sts = boto3.client("sts")
assumed = sts.assume_role(
RoleArn="arn:aws:iam::<AGENT_ACCOUNT_ID>:role/<ROLE_NAME>",
RoleSessionName="agent-invoker",
ExternalId="<unique-external-id>",
)
creds = assumed["Credentials"]
# Use the temporary credentials to invoke the runtime
agentcore = boto3.client(
"bedrock-agentcore",
region_name="<REGION>",
aws_access_key_id=creds["AccessKeyId"],
aws_secret_access_key=creds["SecretAccessKey"],
aws_session_token=creds["SessionToken"],
)
response = agentcore.invoke_agent_runtime(
agentRuntimeArn="arn:aws:bedrock-agentcore:<REGION>:<AGENT_ACCOUNT_ID>:runtime/<RUNTIME_NAME>",
qualifier="DEFAULT",
payload=json.dumps({"prompt": "hello"}).encode(),
runtimeSessionId="session-123",
)Production notes:
Cache the assumed-role credentials. They're valid for the session duration (default 1 hour). Re-assume when they're close to expiring, not on every request.
Boto3's
Sessionwith a profile usingrole_arnandsource_profilecan automate this if your caller environment supports AWS config profiles.assume_rolein code is the explicit version.If the caller is in a Lambda, ECS task, or EC2 instance, the execution/task role is what gets the AssumeRole permission. That role's trust policy is what gets listed in Account B's trust policy.
The runtime's own resource policy (if any) is separate from IAM. Typically you don't need a resource policy for cross-account — the IAM role in Account B is what grants access.
Running shell commands inside a live agent session (InvokeAgentRuntimeCommand)
Once an agent's session is running, you can execute shell commands inside that same session's microVM — same filesystem, same env, same network namespace — and stream the output back. This sits alongside InvokeAgentRuntime (which drives the agent's reasoning loop), not in place of it.
When this is useful:
Coding/devops agents where your app runs deterministic ops (git pull, build, test, file system inspection) instead of asking the LLM to reason about them
Seeding the session's filesystem before the agent runs (drop a dataset into
/tmp, then invoke the agent to analyze it)Debugging a stuck or misbehaving session — run
ps,ls,cat /tmp/logfrom outside without going through the agentAny workflow where you want the reliability of a scripted command and the context of a warm session
When it's the wrong tool:
Spawning new sessions to run arbitrary code for users — use the
code-interpreter.mdbuilt-in tool instead; it's purpose-built, sandboxed differently, and doesn't consume an agent's sessionRunning anything an unrelated caller shouldn't be able to do — commands execute with the runtime's execution role and filesystem
IAM permission required: bedrock-agentcore:InvokeAgentRuntimeCommand on the runtime ARN. This is a separate action from InvokeAgentRuntime — scope it explicitly to the callers who need it.
import boto3
client = boto3.client("bedrock-agentcore", region_name="<REGION>")
response = client.invoke_agent_runtime_command(
agentRuntimeArn="<AGENT_RUNTIME_ARN>",
qualifier="DEFAULT",
runtimeSessionId="session-123", # must be an existing session
command="ls -la /tmp && cat /tmp/status.json",
)
# Output streams back over HTTP/2 on response["response"]
for chunk in response["response"].iter_chunks():
print(chunk.decode(), end="", flush=True)Session must exist. InvokeAgentRuntimeCommand attaches to a running session; it won't create one. If the session has expired or never existed, the call fails. Invoke the agent first (to start the session), then use the session ID for subsequent command calls.
Same microVM, same filesystem. A file written by the command is visible to the agent on the next invoke, and vice versa. Use this to pre-load artifacts, then reason over them in the agent. Session isolation still applies — other sessions cannot see these files.
[!WARNING] InvokeAgentRuntimeCommand executes arbitrary shell commands inside a live agent session with the runtime's full execution role. Never grant bedrock-agentcore:InvokeAgentRuntimeCommand to the same principals that have bedrock-agentcore:InvokeAgentRuntime unless they explicitly need shell access. Always create a separate IAM policy for command execution. Always enable CloudTrail logging for InvokeAgentRuntimeCommand calls. If commands are constructed from user-supplied input, validate and sanitize — this is a command injection surface.
IAM separation: InvokeAgentRuntimeCommand is a distinct IAM action from InvokeAgentRuntime. Grant it only to the callers that need shell access — not to every identity that can invoke the agent. Minimal example:
{
"Effect": "Allow",
"Action": "bedrock-agentcore:InvokeAgentRuntimeCommand",
"Resource": "arn:aws:bedrock-agentcore:<REGION>:<YOUR_ACCOUNT_ID>:runtime/<RUNTIME_NAME>-*"
}Keep this in a separate IAM policy from the one that grants InvokeAgentRuntime. Attach it only to roles that explicitly need to run commands inside agent sessions.
Command injection: The code example above uses a hardcoded command string — intentionally. If your real usage constructs commands from user-supplied input, validate before passing: reject strings containing &&, ;, $(...), backticks, |, or other shell metacharacters. Passing unsanitized user input to InvokeAgentRuntimeCommand is a direct code execution vulnerability.
CloudTrail monitoring: Enable an EventBridge rule to alert on unexpected InvokeAgentRuntimeCommand calls:
aws events put-rule \
--name AgentCoreCommandExecution \
--event-pattern '{"source":["aws.bedrock-agentcore"],"detail-type":["AWS API Call via CloudTrail"],"detail":{"eventName":["InvokeAgentRuntimeCommand"]}}' \
--state ENABLEDA compromised caller with this permission can read/write the agent's filesystem, reach any network resource the agent can reach, and use the execution role's credentials — CloudTrail logging is the minimum detection baseline.
Reference integrations
Two common integration targets have published, reusable patterns you can start from instead of building the integration layer yourself.
Slack. Integrating Amazon Bedrock AgentCore with Slack walks through a reusable integration layer that brings any AgentCore agent into a Slack workspace. The architecture (API Gateway → Lambda → SQS → AgentCore) handles Slack's 3-second webhook timeout via asynchronous processing: one Lambda validates the Slack signature and returns immediately, another posts a "Processing..." placeholder, and a third invokes the agent and replaces the placeholder with the real response. The pattern maps Slack thread timestamps to AgentCore Memory session IDs and Slack user IDs to actor IDs, so conversation context persists in the same thread over time. The integration layer is decoupled from the agent — you swap in any agent (FinOps, DevOps, incident response) without touching the Slack infrastructure. Deploys with one cdk deploy.
Microsoft Teams. The same async-processing architecture (API Gateway → Lambda → queue → AgentCore) applies to Teams. See How Amazon Bedrock transforms Microsoft Teams conversations into actionable insights for Teams-specific setup (Bot Framework registration, bot channel configuration). If you've already built the Slack pattern above, the Teams version is primarily a different webhook validator and response formatter.
Both patterns handle the "webhook platform with short timeout" problem in the same way — the chat platform gets an immediate ack and a placeholder, the real agent call happens asynchronously, and the response replaces the placeholder when ready. If you're integrating a third chat platform not listed here, use either blog as a template.
Output
The agent's endpoint URL and ARN
Auth method explanation with client-side code
Working client code in the developer's preferred language
Session management guidance
Protocol-specific notes if applicable
Quality criteria
Client code uses the correct SDK client (
bedrock-agentcore, notbedrock-agent)Auth method matches what's configured on the agent
Streaming response handling is included (not just request/response)
Session ID pattern is explained
Code is complete and runnable — includes imports, error handling basics
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Needs an MCP server, Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- aws-agentcore
- Publisher
- AWS (Official)
- Source
- aws/agent-toolkit-for-aws · plugins/aws-agents/skills/agents-build · commit 0a218f8
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by aws-agentcore or AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download agents-build.zip