Strands Agents Tools is a community-driven project that provides a powerful set of tools for your agents to use. It bridges the gap between large language models and practical applications by offering ready-to-use tools for file operations, system execution, API interactions, mathematical operations, and more.

✨ Features

  • 📁 File Operations - Read, write, and edit files with syntax highlighting and intelligent modifications
  • 🖥️ Shell Integration - Execute and interact with shell commands securely
  • 🧠 Memory - Store user and agent memories across agent runs to provide personalized experiences with both Mem0, Amazon Bedrock Knowledge Bases, Elasticsearch, and MongoDB Atlas
  • 🕸️ Web Infrastructure - Perform web searches, extract page content, and crawl websites with Tavily and Exa-powered tools
  • 🌐 HTTP Client - Make API requests with comprehensive authentication support
  • 💬 Slack Client - Real-time Slack events, message processing, and Slack API access
  • 🐍 Python Execution - Run Python code snippets with state persistence, user confirmation for code execution, and safety features
  • 🧮 Mathematical Tools - Perform advanced calculations with symbolic math capabilities
  • ☁️ AWS Integration - Seamless access to AWS services
  • 🖼️ Image Processing - Generate and process images for AI applications
  • 🎥 Video Processing - Use models and agents to generate dynamic videos
  • 🎙️ Audio Output - Enable models to generate audio and speak
  • 🔄 Environment Management - Handle environment variables safely
  • 📝 Journaling - Create and manage structured logs and journals
  • ⏱️ Task Scheduling - Schedule and manage cron jobs
  • 🧠 Advanced Reasoning - Tools for complex thinking and reasoning capabilities
  • 🐝 Swarm Intelligence - Coordinate multiple AI agents for parallel problem solving with shared memory
  • 🤖 Agent as Tool - Create nested agent instances with model switching support for multi-model workflows and specialized sub-tasks
  • 🔗 Multi-Agent Graph - Create and manage deterministic DAG-based multi-agent pipelines with output propagation and per-node model configuration
  • 🔌 Dynamic MCP Client - ⚠️ Dynamically connect to external MCP servers and load remote tools (use with caution - see security warnings)
  • 🔄 Multiple Tools per Turn - Call several other tools from one model response with Batch Tool
  • 🔍 Browser Tool - Tool giving an agent access to perform automated actions on a browser (chromium)
  • 📈 Diagram - Create AWS cloud diagrams, basic diagrams, or UML diagrams using python libraries
  • 📰 RSS Feed Manager - Subscribe, fetch, and process RSS feeds with content filtering and persistent storage
  • 🖱️ Computer Tool - Automate desktop actions including mouse movements, keyboard input, screenshots, and application management

[!IMPORTANT] The tools in this repository are experimental. Many of them grant agents powerful capabilities — executing code, accessing the file system, calling AWS APIs, connecting to external servers, and automating browsers and desktops — which carry real security implications. Any production use should be preceded by your own independent security review; see the Responsible AI guidance for best practices. Use of these tools is at your own risk.

📦 Installation

Quick Install

pip install strands-agents-tools

To install the dependencies for optional tools:

pip install "strands-agents-tools[mem0_memory, use_browser, rss, use_computer]"

Development Install

# Clone the repository
git clone https://github.com/strands-agents/tools.git
cd tools

# Create and activate virtual environment
python3 -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate

# Install in development mode
pip install -e ".[dev]"

# Install pre-commit hooks
pre-commit install

Tools Overview

Below is a comprehensive table of all available tools, how to use them with an agent, and typical use cases:

Tool Agent Usage Use Case
a2a_client provider = A2AClientToolProvider(known_agent_urls=["http://localhost:9000"]); agent = Agent(tools=provider.tools) Discover and communicate with A2A-compliant agents, send messages between agents
file_read agent.tool.file_read(path="path/to/file.txt") Reading configuration files, parsing code files, loading datasets
file_write agent.tool.file_write(path="path/to/file.txt", content="file content") Writing results to files, creating new files, saving output data
editor ⚠️ agent.tool.editor(command="view", path="path/to/file.py") Advanced file operations like syntax highlighting, pattern replacement, and multi-file edits Deprecated — see Deprecations
shell* ⚠️ agent.tool.shell(command="ls -la") Executing shell commands, interacting with the operating system, running scripts Deprecated — see Deprecations
http_request agent.tool.http_request(method="GET", url="https://api.example.com/data") Making API calls, fetching web data, sending data to external services
tavily_search agent.tool.tavily_search(query="What is artificial intelligence?", search_depth="advanced") Real-time web search optimized for AI agents with a variety of custom parameters
tavily_extract agent.tool.tavily_extract(urls=["www.tavily.com"], extract_depth="advanced") Extract clean, structured content from web pages with advanced processing and noise removal
tavily_crawl agent.tool.tavily_crawl(url="www.tavily.com", max_depth=2, instructions="Find API docs") Crawl websites intelligently starting from a base URL with filtering and extraction
tavily_map agent.tool.tavily_map(url="www.tavily.com", max_depth=2, instructions="Find all pages") Map website structure and discover URLs starting from a base URL without content extraction
exa_search agent.tool.exa_search(query="Best project management tools", text=True) Intelligent web search with auto mode (default) for optimal results, plus fast and deep search modes
exa_get_contents agent.tool.exa_get_contents(urls=["https://example.com/article"], text=True, summary={"query": "key points"}) Extract full content and summaries from specific URLs with live crawling fallback
python_repl* agent.tool.python_repl(code="import pandas as pd\ndf = pd.read_csv('data.csv')\nprint(df.head())") Running Python code snippets, data analysis, executing complex logic with user confirmation for security
calculator ⚠️ agent.tool.calculator(expression="2 * sin(pi/4) + log(e**2)") Performing mathematical operations, symbolic math, equation solving Deprecated — see Deprecations
code_interpreter code_interpreter = AgentCoreCodeInterpreter(region="us-west-2"); agent = Agent(tools=[code_interpreter.code_interpreter]) Execute code in isolated sandbox environments with multi-language support (Python, JavaScript, TypeScript), persistent sessions, and file operations
use_aws agent.tool.use_aws(service_name="s3", operation_name="list_buckets", parameters={}, region="us-west-2") Interacting with AWS services, cloud resource management
retrieve ⚠️ agent.tool.retrieve(text="What is STRANDS?") Retrieving information from Amazon Bedrock Knowledge Bases with optional metadata Deprecated — see Deprecations
nova_reels agent.tool.nova_reels(action="create", text="A cinematic shot of mountains", s3_bucket="my-bucket") Create high-quality videos using Amazon Bedrock Nova Reel with configurable parameters via environment variables
agent_core_memory agent.tool.agent_core_memory(action="record", content="Hello, I like vegetarian food") Store and retrieve memories with Amazon Bedrock Agent Core Memory service
mem0_memory agent.tool.mem0_memory(action="store", content="Remember I like to play tennis") Store user and agent memories across agent runs to provide personalized experience (tenant identity configured via Mem0MemoryTool or environment variables)
bright_data agent.tool.bright_data(action="scrape_as_markdown", url="https://example.com") Web scraping, search queries, screenshot capture, and structured data extraction from websites and different data feeds
memory ⚠️ agent.tool.memory(action="retrieve", query="product features") Store, retrieve, list, and manage documents in Amazon Bedrock Knowledge Bases with configurable parameters via environment variables Deprecated — see Deprecations
environment ⚠️ agent.tool.environment(action="list", prefix="AWS_") Managing environment variables, configuration management Deprecated — see Deprecations
generate_image_stability agent.tool.generate_image_stability(prompt="A tranquil pool") Creating images using Stability AI models
generate_image agent.tool.generate_image(prompt="A sunset over mountains") Creating AI-generated images for various applications
image_reader agent.tool.image_reader(image_path="path/to/image.jpg") Processing and reading image files for AI analysis
journal agent.tool.journal(action="write", content="Today's progress notes") Creating structured logs, maintaining documentation
think ⚠️ agent.tool.think(thought="Complex problem to analyze", cycle_count=3) Advanced reasoning, multi-step thinking processes Deprecated — see Deprecations
load_tool agent.tool.load_tool(path="path/to/custom_tool.py", name="custom_tool") Dynamically loading custom tools and extensions
swarm agent.tool.swarm(task="Analyze this problem", swarm_size=3, coordination_pattern="collaborative") Coordinating multiple AI agents to solve complex problems through collective intelligence
current_time ⚠️ agent.tool.current_time(timezone="US/Pacific") Get the current time in ISO 8601 format for a specified timezone Deprecated — see Deprecations
sleep ⚠️ agent.tool.sleep(seconds=5) Pause execution for the specified number of seconds, interruptible with SIGINT (Ctrl+C) Deprecated — see Deprecations
agent_graph agent.tool.agent_graph(agents=["agent1", "agent2"], connections=[{"from": "agent1", "to": "agent2"}]) Create and visualize agent relationship graphs for complex multi-agent systems
graph agent.tool.graph(action="create", graph_id="pipeline", topology={"nodes": [...], "edges": [...]}) Create and manage deterministic DAG-based multi-agent graphs using Strands SDK Graph implementation with per-node model configuration
cron* ⚠️ agent.tool.cron(action="schedule", name="task", schedule="0 * * * *", command="backup.sh") Schedule and manage recurring tasks with cron job syntax Does not work on Windows Deprecated — see Deprecations
slack ⚠️ agent.tool.slack(action="post_message", channel="general", text="Hello team!") Interact with Slack workspace for messaging and monitoring Deprecated — see Deprecations
speak agent.tool.speak(text="Operation completed successfully", style="green", mode="polly") Output status messages with rich formatting and optional text-to-speech
stop agent.tool.stop(message="Process terminated by user request") Gracefully terminate agent execution with custom message
handoff_to_user agent.tool.handoff_to_user(message="Please confirm action", breakout_of_loop=False) Hand off control to user for confirmation, input, or complete task handoff
use_llm agent.tool.use_llm(prompt="Analyze this data", system_prompt="You are a data analyst") Create nested AI loops with customized system prompts for specialized tasks
use_agent agent.tool.use_agent(prompt="Analyze this code", system_prompt="You are a code analyst.", model_provider="bedrock") Create nested agent instances with model switching, multi-model workflows, cost optimization, and specialized sub-tasks
workflow agent.tool.workflow(action="create", name="data_pipeline", steps=[{"tool": "file_read"}, {"tool": "python_repl"}]) Define, execute, and manage multi-step automated workflows
mcp_client agent.tool.mcp_client(action="connect", connection_id="my_server", transport="stdio", command="python", args=["server.py"]) ⚠️ SECURITY WARNING: Dynamically connect to external MCP servers via stdio, sse, or streamable_http, list tools, and call remote tools. This can pose security risks as agents may connect to malicious servers. Use with caution in production.
batch ⚠️ agent.tool.batch(invocations=[{"name": "current_time", "arguments": {"timezone": "Europe/London"}}, {"name": "stop", "arguments": {}}]) Call multiple other tools from one request. Deprecated — see Deprecations
browser browser = LocalChromiumBrowser(); agent = Agent(tools=[browser.browser]) Web scraping, automated testing, form filling, web automation tasks
diagram ⚠️ agent.tool.diagram(diagram_type="cloud", nodes=[{"id": "s3", "type": "S3"}], edges=[]) Create AWS cloud architecture diagrams, network diagrams, graphs, and UML diagrams (all 14 types) Deprecated — see Deprecations
rss ⚠️ agent.tool.rss(action="subscribe", url="https://example.com/feed.xml", feed_id="tech_news") Manage RSS feeds: subscribe, fetch, read, search, and update content from various sources Deprecated — see Deprecations
use_computer agent.tool.use_computer(action="click", x=100, y=200, app_name="Chrome") Desktop automation, GUI interaction, screen capture
search_video agent.tool.search_video(query="people discussing AI") Semantic video search using TwelveLabs' Marengo model
chat_video agent.tool.chat_video(prompt="What are the main topics?", video_id="video_123") Interactive video analysis using TwelveLabs' Pegasus model
mongodb_memory agent.tool.mongodb_memory(action="record", content="User prefers vegetarian pizza") Store and retrieve memories using MongoDB Atlas with semantic search via AWS Bedrock Titan embeddings (connection and namespace configured via MongoDBMemoryTool or environment variables)
elasticsearch_memory agent.tool.elasticsearch_memory(action="record", content="User prefers dark mode") Store and retrieve memories using Elasticsearch with semantic search via AWS Bedrock Titan embeddings (connection and namespace configured via ElasticsearchMemoryTool or environment variables)

* These tools do not work on Windows

Deprecations

The tools below are deprecated, and each row points to where that capability now lives.

When this package started, the SDK had no built-in way to do most of these things, so we shipped tools to fill the gap. Much of that is now native: the SDK reasons, injects context, manages memory, and runs tools concurrently on its own, and where a vendor maintains an official MCP server, that server will always track their API better than a wrapper here can. Keeping a second implementation alongside means two things to fix and two things to drift, so we would rather point you at the one that gets the attention.

More tools will follow as their capabilities land elsewhere, and this repository will eventually be archived. Nothing breaks suddenly — but migrating when a tool is first deprecated is easier than moving several at once later.

Deprecated tools keep working. Each one logs a warning when invoked starting in v0.8.6, and that warning becomes an error log in v0.9.0 — a louder signal for anyone who has not migrated, not a behavior change.

They are also marked with @typing_extensions.deprecated, so type checkers and IDEs flag usage before you run anything. To list what you still need to migrate, run mypy --enable-error-code deprecated over your project: it reports the from strands_tools import ... line for each deprecated tool, without invoking any of them. Prefer mypy here: pyright, with reportDeprecated enabled, reports direct calls such as calculator(expression=...) but not agent.tool.calculator(...), and it reaches the import line for only the three tools whose marker is not wrapped by @tool. Note that Python suppresses the resulting DeprecationWarning at runtime when the agent invokes a tool, which is why the log message exists as well.

Tool Suggested alternative Warning Error log
sleep from strands.vended_tools import sleep v0.8.6 v0.9.0
editor from strands.vended_tools import file_editor v0.8.6 v0.9.0
shell from strands.vended_tools import bash v0.8.6 v0.9.0
batch none needed — concurrent tool execution is the SDK default (docs) v0.8.6 v0.9.0
think native extended thinking via model reasoning config (docs) v0.8.6 v0.9.0
current_time ContextInjector (docs) v0.8.6 v0.9.0
memory MemoryManager + BedrockKnowledgeBaseStore (docs) v0.8.6 v0.9.0
retrieve MemoryManager + BedrockKnowledgeBaseStore(writable=False) (docs) v0.8.6 v0.9.0
calculator from strands.vended_tools import bash (run python3 -c with sympy) v0.8.6 v0.9.0
cron from strands.vended_tools import bash (manage crontab), or Amazon EventBridge Scheduler v0.8.6 v0.9.0
environment from strands.vended_tools import bash (inspect only, see notes) v0.8.6 v0.9.0
slack official Slack MCP server; slack_bolt for Socket Mode v0.8.6 v0.9.0
diagram no replacement — have the model write graphviz/mermaid/diagrams code directly v0.8.6 v0.9.0
rss no replacement — parse feeds directly with feedparser v0.8.6 v0.9.0
# Before
from strands import Agent
from strands_tools import editor, shell, sleep

agent = Agent(tools=[editor, shell, sleep])

# After
from strands import Agent
from strands.vended_tools import bash, file_editor, sleep

agent = Agent(tools=[bash, file_editor, sleep])

Behavior differences

The replacements are not drop-in equivalents. Check these before migrating:

  • shellbash: the SDK tool routes commands through the agent's configured sandbox and is stateless — each call runs in a fresh shell, so variables and the working directory do not persist between calls. It does not provide PTY support or batched parallel/sequential command execution.
  • editorfile_editor: supports view, create, str_replace, and insert. The pattern_replace, find_line, and undo_edit commands have no SDK equivalent.
  • sleepsleep: the maximum duration is set with make_sleep(max_duration=...) and defaults to 60 seconds, replacing the MAX_SLEEP_SECONDS environment variable which defaulted to 300 seconds.
  • batch — you can drop it. The SDK runs tool calls concurrently by default via ConcurrentToolExecutor, which also keeps tracing, metrics, and hooks intact. See Tool executors.
  • think → extended thinking — reasoning is now a model capability rather than a tool, so you configure it once instead of prompting for it. It is single-pass, so if you were relying on cycle_count to refine across passes, or on tool calls inside the reasoning loop, that pattern moves into your own orchestration. Config is per provider — see Amazon Bedrock.
  • current_timeContextInjector — the date is context, not something the agent should have to ask for, so injecting it means it is always fresh and the model cannot forget to call it. The trade-off is that your code picks the timezone; if you need the model to choose one per call, the official MCP time server still does that. See ContextInjector.
  • memory / retrieve → memory stores — memory is a first-class SDK concept now, so stores plug into the agent and inject context automatically instead of waiting to be called. store/retrieve become add/search. list, get, and delete are not part of the store protocol, so keep them as backend-native tools via get_tools(). One thing to know: the store returns relevance scores but does not filter on them, so if you relied on retrieve's default score >= 0.4 floor, apply it yourself. See Bedrock Knowledge Base store and Custom stores.
  • calculatorshell — run python3 -c with sympy for the same symbolic math. Worth being explicit: shell runs whatever it is given, whereas this tool checked expressions against an allowlist first. If you are evaluating untrusted input, put a sandbox behind the shell tool or keep your own validation in front of it.
  • cronshellcrontab through the shell tool covers scheduling on a host. Two things to plan for: the shell is sandbox-routed, so under Docker or SSH your jobs land in an environment that may not have a cron daemon, and you will be composing crontab lines yourself rather than using structured list/add/remove/edit actions. For scheduling that outlives the host, Amazon EventBridge Scheduler is usually the better fit.
  • environmentshellenv and printenv cover reading. Setting is genuinely different: a child shell cannot change the agent's own process environment, so variables need to be set where the agent is launched, or passed per call. If you were leaning on PROTECTED_VARS or secret masking, that guarding moves to your side.
  • slack → Slack's official MCP server — Slack maintains it, so it tracks their API directly, and it uses OAuth rather than long-lived tokens. It exposes a curated tool set rather than this tool's passthrough to any Web API method, and being request/response it does not cover Socket Mode or real-time events — slack_bolt remains the right tool for event listeners. Endpoint and setup: docs.slack.dev/ai/mcp-server.
  • diagram — no direct replacement, and that is deliberate: this tool was a wrapper over graphviz and the diagrams package, and a capable model writes that code well on its own. The wrapper mostly added a layer to keep in sync.
  • rss — no direct replacement. Fetching and parsing a feed is a few lines of feedparser, and the subscription list was a JSON file. If you were using feed HTTP Basic auth or the stored subscriptions, those move into your code.

💻 Usage Examples

File Operations

from strands import Agent
from strands_tools import file_read, file_write, editor

agent = Agent(tools=[file_read, file_write, editor])

agent.tool.file_read(path="config.json")
agent.tool.file_write(path="output.txt", content="Hello, world!")
agent.tool.editor(command="view", path="script.py")

Dynamic MCP Client Integration

⚠️ SECURITY WARNING: The Dynamic MCP Client allows agents to autonomously connect to external MCP servers and load remote tools at runtime. This poses significant security risks as agents can potentially connect to malicious servers and execute untrusted code. Use with extreme caution in production environments.

This tool is different from the static MCP server implementation in the Strands SDK (see MCP Tools Documentation) which uses pre-configured, trusted MCP servers.

from strands import Agent
from strands_tools import mcp_client

agent = Agent(tools=[mcp_client])

# Connect to a custom MCP server via stdio
agent.tool.mcp_client(
    action="connect",
    connection_id="my_tools",
    transport="stdio",
    command="python",
    args=["my_mcp_server.py"]
)

# List available tools on the server
tools = agent.tool.mcp_client(
    action="list_tools",
    connection_id="my_tools"
)

# Call a tool from the MCP server
result = agent.tool.mcp_client(
    action="call_tool",
    connection_id="my_tools",
    tool_name="calculate",
    tool_args={"x": 10, "y": 20}
)

# Connect to a SSE-based server
agent.tool.mcp_client(
    action="connect",
    connection_id="web_server",
    transport="sse",
    server_url="http://localhost:8080/sse"
)

# Connect to a streamable HTTP server
agent.tool.mcp_client(
    action="connect",
    connection_id="http_server",
    transport="streamable_http",
    server_url="https://api.example.com/mcp",
    headers={"Authorization": "Bearer token"},
    timeout=60
)

# Load MCP tools into agent's registry for direct access
# ⚠️ WARNING: This loads external tools directly into the agent
agent.tool.mcp_client(
    action="load_tools",
    connection_id="my_tools"
)
# Now you can call MCP tools directly as: agent.tool.calculate(x=10, y=20)

Shell Commands

Note: shell does not work on Windows.

from strands import Agent
from strands_tools import shell

agent = Agent(tools=[shell])

# Execute a single command
result = agent.tool.shell(command="ls -la")

# Execute a sequence of commands
results = agent.tool.shell(command=["mkdir -p test_dir", "cd test_dir", "touch test.txt"])

# Execute commands with error handling
agent.tool.shell(command="risky-command", ignore_errors=True)

HTTP Requests

from strands import Agent
from strands_tools import http_request

agent = Agent(tools=[http_request])

# Make a simple GET request
response = agent.tool.http_request(
    method="GET",
    url="https://api.example.com/data"
)

# POST request with authentication
response = agent.tool.http_request(
    method="POST",
    url="https://api.example.com/resource",
    headers={"Content-Type": "application/json"},
    body=json.dumps({"key": "value"}),
    auth_type="Bearer",
    auth_token="your_token_here"
)

# Convert HTML webpages to markdown for better readability
response = agent.tool.http_request(
    method="GET",
    url="https://example.com/article",
    convert_to_markdown=True
)

Tavily Search, Extract, Crawl, and Map

from strands import Agent
from strands_tools.tavily import (
    tavily_search, tavily_extract, tavily_crawl, tavily_map
)

# For async usage, call the corresponding *_async function with await.
# Synchronous usage 
agent = Agent(tools=[tavily_search, tavily_extract, tavily_crawl, tavily_map])

# Real-time web search
result = agent.tool.tavily_search(
    query="Latest developments in renewable energy",
    search_depth="advanced",
    topic="news",
    max_results=10,
    include_raw_content=True
)

# Extract content from multiple URLs
result = agent.tool.tavily_extract(
    urls=["www.tavily.com", "www.apple.com"],
    extract_depth="advanced",
    format="markdown"
)

# Advanced crawl with instructions and filtering
result = agent.tool.tavily_crawl(
    url="www.tavily.com",
    max_depth=2,
    limit=50,
    instructions="Find all API documentation and developer guides",
    extract_depth="advanced",
    include_images=True
)

# Basic website mapping
result = agent.tool.tavily_map(url="www.tavily.com")

Exa Search and Contents

from strands import Agent
from strands_tools.exa import exa_search, exa_get_contents

agent = Agent(tools=[exa_search, exa_get_contents])

# Basic search (auto mode is default and recommended)
result = agent.tool.exa_search(
    query="Best project management software",
    text=True
)

# Company-specific search when needed
result = agent.tool.exa_search(
    query="Anthropic AI safety research",
    category="company",
    include_domains=["anthropic.com"],
    num_results=5,
    summary={"query": "key research areas and findings"}
)

# News search with date filtering
result = agent.tool.exa_search(
    query="AI regulation policy updates",
    category="news",
    start_published_date="2024-01-01T00:00:00.000Z",
    text=True
)

# Get detailed content from specific URLs
result = agent.tool.exa_get_contents(
    urls=[
        "https://example.com/blog-post",
        "https://github.com/microsoft/semantic-kernel"
    ],
    text={"maxCharacters": 5000, "includeHtmlTags": False},
    summary={
        "query": "main points and practical applications"
    },
    subpages=2,
    extras={"links": 5, "imageLinks": 2}
)

# Structured summary with JSON schema
result = agent.tool.exa_get_contents(
    urls=["https://example.com/article"],
    summary={
        "query": "main findings and recommendations",
        "schema": {
            "type": "object",
            "properties": {
                "main_points": {"type": "string", "description": "Key points from the article"},
                "recommendations": {"type": "string", "description": "Suggested actions or advice"},
                "conclusion": {"type": "string", "description": "Overall conclusion"},
                "relevance": {"type": "string", "description": "Why this matters"}
            },
            "required": ["main_points", "conclusion"]
        }
    }
)

Python Code Execution

Note: python_repl does not work on Windows.

from strands import Agent
from strands_tools import python_repl

agent = Agent(tools=[python_repl])

# Execute Python code with state persistence
result = agent.tool.python_repl(code="""
import pandas as pd

# Load and process data
data = pd.read_csv('data.csv')
processed = data.groupby('category').mean()

processed.head()
""")

Code Interpreter

from strands import Agent
from strands_tools.code_interpreter import AgentCoreCodeInterpreter

# Create the code interpreter tool
bedrock_agent_core_code_interpreter = AgentCoreCodeInterpreter(region="us-west-2")
agent = Agent(tools=[bedrock_agent_core_code_interpreter.code_interpreter])

# Create a session
agent.tool.code_interpreter({
    "action": {
        "type": "initSession",
        "description": "Data analysis session",
        "session_name": "analysis-session"
    }
})

# Execute Python code
agent.tool.code_interpreter({
    "action": {
        "type": "executeCode",
        "session_name": "analysis-session",
        "code": "print('Hello from sandbox!')",
        "language": "python"
    }
})

Swarm Intelligence

from strands import Agent
from strands_tools import swarm

agent = Agent(tools=[swarm])

# Create a collaborative swarm of agents to tackle a complex problem
result = agent.tool.swarm(
    task="Generate creative solutions for reducing plastic waste in urban areas",
    swarm_size=5,
    coordination_pattern="collaborative"
)

# Create a competitive swarm for diverse solution generation
result = agent.tool.swarm(
    task="Design an innovative product for smart home automation",
    swarm_size=3,
    coordination_pattern="competitive"
)

# Hybrid approach combining collaboration and competition
result = agent.tool.swarm(
    task="Develop marketing strategies for a new sustainable fashion brand",
    swarm_size=4,
    coordination_pattern="hybrid"
)

Use AWS

from strands import Agent
from strands_tools import use_aws

agent = Agent(tools=[use_aws])

# List S3 buckets
result = agent.tool.use_aws(
    service_name="s3",
    operation_name="list_buckets",
    parameters={},
    region="us-east-1",
    label="List all S3 buckets"
)

# Get the contents of a specific S3 bucket
result = agent.tool.use_aws(
    service_name="s3",
    operation_name="list_objects_v2",
    parameters={"Bucket": "example-bucket"},  # Replace with your actual bucket name
    region="us-east-1",
    label="List objects in a specific S3 bucket"
)

# Get the list of EC2 subnets
result = agent.tool.use_aws(
    service_name="ec2",
    operation_name="describe_subnets",
    parameters={},
    region="us-east-1",
    label="List all subnets"
)

Retrieve Tool

from strands import Agent
from strands_tools import retrieve

agent = Agent(tools=[retrieve])

# Basic retrieval without metadata
result = agent.tool.retrieve(
    text="What is artificial intelligence?"
)

# Retrieval with metadata enabled
result = agent.tool.retrieve(
    text="What are the latest developments in machine learning?",
    enableMetadata=True
)

# Using environment variable to set default metadata behavior
# Set RETRIEVE_ENABLE_METADATA_DEFAULT=true in your environment
result = agent.tool.retrieve(
    text="Tell me about cloud computing"
    # enableMetadata will default to the environment variable value
)

Batch Tool

import os
import sys

from strands import Agent
from strands_tools import batch, http_request, use_aws

# Example usage of the batch with http_request and use_aws tools
agent = Agent(tools=[batch, http_request, use_aws])

result = agent.tool.batch(
    invocations=[
        {"name": "http_request", "arguments": {"method": "GET", "url": "https://api.ipify.org?format=json"}},
        {
            "name": "use_aws",
            "arguments": {
                "service_name": "s3",
                "operation_name": "list_buckets",
                "parameters": {},
                "region": "us-east-1",
                "label": "List S3 Buckets"
            }
        },
    ]
)

Video Tools

from strands import Agent
from strands_tools import search_video, chat_video

agent = Agent(tools=[search_video, chat_video])

# Search for video content using natural language
result = agent.tool.search_video(
    query="people discussing AI technology",
    threshold="high",
    group_by="video",
    page_limit=5
)

# Chat with existing video (no index_id needed)
result = agent.tool.chat_video(
    prompt="What are the main topics discussed in this video?",
    video_id="existing-video-id"
)

# Chat with new video file (index_id required for upload)
result = agent.tool.chat_video(
    prompt="Describe what happens in this video",
    video_path="/path/to/video.mp4",
    index_id="your-index-id"  # or set TWELVELABS_PEGASUS_INDEX_ID env var
)

AgentCore Memory

from strands import Agent
from strands_tools.agent_core_memory import AgentCoreMemoryToolProvider


provider = AgentCoreMemoryToolProvider(
    memory_id="memory-123abc",  # Required
    actor_id="user-456",        # Required
    session_id="session-789",   # Required
    namespace="default",        # Required
    region="us-west-2"          # Optional, defaults to us-west-2
)

agent = Agent(tools=provider.tools)

# Create a new memory
result = agent.tool.agent_core_memory(
    action="record",
    content="I am allergic to shellfish"
)

# Search for relevant memories
result = agent.tool.agent_core_memory(
    action="retrieve",
    query="user preferences"
)

# List all memories
result = agent.tool.agent_core_memory(
    action="list"
)

# Get a specific memory by ID
result = agent.tool.agent_core_memory(
    action="get",
    memory_record_id="mr-12345"
)

Browser

from strands import Agent
from strands_tools.browser import LocalChromiumBrowser

# Create browser tool
browser = LocalChromiumBrowser()
agent = Agent(tools=[browser.browser])

# Simple navigation
result = agent.tool.browser({
    "action": {
        "type": "navigate",
        "url": "https://example.com"
    }
})

# Initialize a session first
result = agent.tool.browser({
    "action": {
        "type": "initSession",
        "session_name": "main-session",
        "description": "Web automation session"
    }
})

Handoff to User

from strands import Agent
from strands_tools import handoff_to_user

agent = Agent(tools=[handoff_to_user])

# Request user confirmation and continue
response = agent.tool.handoff_to_user(
    message="I need your approval to proceed with deleting these files. Type 'yes' to confirm.",
    breakout_of_loop=False
)

# Complete handoff to user (stops agent execution)
agent.tool.handoff_to_user(
    message="Task completed. Please review the results and take any necessary follow-up actions.",
    breakout_of_loop=True
)

Use Agent (Agent as Tool)

from strands import Agent
from strands_tools import use_agent

agent = Agent(tools=[use_agent])

# Basic usage - inherits parent agent's model
result = agent.tool.use_agent(
    prompt="Tell me about the advantages of tool-building in AI agents",
    system_prompt="You are a helpful AI assistant specializing in AI development concepts."
)

# Use a different model provider for specialized tasks
result = agent.tool.use_agent(
    prompt="Calculate 2 + 2 and explain the result",
    system_prompt="You are a helpful math assistant.",
    model_provider="bedrock",
    model_settings={
        "model_id": "us.anthropic.claude-sonnet-4-20250514-v1:0"
    },
    tools=["calculator"]
)

# Use environment variables to determine model
import os
os.environ["STRANDS_PROVIDER"] = "ollama"
os.environ["STRANDS_MODEL_ID"] = "qwen3:4b"
result = agent.tool.use_agent(
    prompt="Analyze this code",
    system_prompt="Yo