Generated banner for Agents Build
Generated logo for Agents Build

Agents Build

AWSOfficialCreated by aws-agentcore

  • Skill
  • Workflow
  • Cloud and DevOps
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Use to extend an existing agent project with memory, app integration, VPC, multi-agent, migration, model, browser, code interpreter, payments, or resource removal. Triggers: "add memory", "remember across sessions", "call agent from app", "invoke agent from code", "agent auth", "streaming", "VPC", "VPC connectivity", "can't reach from VPC", "multi-agent", "A2A", "A2A auth", "orchestrator not delegating", "specialist not called", "migrate Bedrock Agent", "migration issue", "change model", "browser tool", "code interpreter", "delete agent", "tear down", "agentcore remove", "cross-account memory", "add payments capability to my agent", "wire payments plugin", "integrate x402 payments with the agent I'm building", "add MPP payments", "Machine Payments Protocol". External APIs via Gateway: use agents-connect. New project: use agents-get-started. CLI/dev-server errors: use agents-debug. Runtime x402/MPP payments: use agents-pay. Migration-specific Strands vs LangGraph routes here.
— the description by aws-agentcore

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

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/aws/agents-build/download
  2. Unzip 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-connect

  • Scaffolding a new project → use agents-get-started

  • Deploying → 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:

  1. Check if the developer is in the wrong directory. Look for agentcore/agentcore.json in parent directories (up to 3 levels). If found, tell them: "Found an AgentCore project at <path>. Are you working in that project?"

  2. 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, cd into 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 build

  • If the developer says something is broken (wrong answers, errors, tool failures) → this is agents-debug, not build

  • Build 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 intentReference to load
Add memory, remember things, user preferences, cross-sessionreferences/memory.md
Call agent from app, invoke from code, streaming, SDK client, agent URL, execute shell in sessionreferences/integrate.md
VPC, private network, RDS, internal API, subnet, security groupreferences/vpc.md
Multi-agent, orchestrator, specialist, A2A, delegation, agent handoffreferences/multi-agent.md
Custom headers from caller to agent, header allowlist, tenant ID/correlation ID/trace propagationreferences/request-headers.md
Migrate Bedrock Agent, import agent, move to AgentCorereferences/migrate.md
Browser tool, web navigation, form filling, scraping, Nova Act, Playwright, live viewreferences/browser.md
Code Interpreter, execute code, sandbox, run Python/JS/TS, data analysis in agent, pandasreferences/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/connectorreferences/payments.md
Delete agent, remove resource, tear down, clean up, destroy, start freshreferences/teardown.md
Change model, switch model, use Haiku/Sonnet/Nova, different modelInline — 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:

  1. Open app/<AgentName>/model/load.py

  2. Change the model_id parameter in the BedrockModel() 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 ARN

  • Run agentcore dev to test locally, then agentcore deploy to 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:

ResourceMax charsAllowedStarts with
Agent (add agent)48alphanumeric + _letter
Memory, gateway, gateway-target, credential, evaluator, online-eval, policy, policy-engine, payment-manager, payment-connector48alphanumeric + _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

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-connect

  • Deploying the agent → use agents-deploy

  • Debugging agent responses → use agents-debug

  • Securing 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 agent

If 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 agent

This 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 typeHow the client authenticatesBest for
None (default)IAM SigV4 signing on the requestBackend services with AWS credentials
AWS_IAMIAM SigV4 signing on the requestBackend services, Lambda-to-agent calls
CUSTOM_JWTBearer token in Authorization headerWeb/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:
        raise
Python (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 context

  • Generate 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-agentcore SDK (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 needs bedrock-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 Session with a profile using role_arn and source_profile can automate this if your caller environment supports AWS config profiles. assume_role in 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/log from outside without going through the agent

  • Any 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.md built-in tool instead; it's purpose-built, sandboxed differently, and doesn't consume an agent's session

  • Running 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 ENABLED

A 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, not bedrock-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