Skip to content

Vended Tools

Vended tools are pre-built tools included directly in the Strands Harness SDK for common agent tasks like file operations, shell commands, HTTP requests, and persistent notes.

They ship as part of the SDK package and are updated alongside it. See Versioning & Maintenance for how changes are communicated and what level of backwards compatibility they maintain.

Each tool is imported from its own subpath under @strands-agents/sdk/vended-tools, with no additional packages required:

import { Agent } from '@strands-agents/sdk'
import { bash } from '@strands-agents/sdk/vended-tools/bash'
import { edit } from '@strands-agents/sdk/vended-tools/edit'
import { httpRequest } from '@strands-agents/sdk/vended-tools/http-request'
import { notebook, makeNotebook } from '@strands-agents/sdk/vended-tools/notebook'
const agent = new Agent({
tools: [bash, edit, httpRequest, notebook],
})
ToolDescriptionSupported in
EditMake in-place changes to a text filePython, TypeScript (Node.js)
File Editor (deprecated)View, create, and edit filesPython, TypeScript (Node.js)
ReadRead a file as numbered text or a media blockPython, TypeScript (Node.js)
WriteCreate or overwrite a text file with the full provided contentPython, TypeScript (Node.js)
HTTP RequestMake HTTP requests to external APIsPython, TypeScript (Node.js 22+, browsers)
NotebookManage persistent text notebooksPython, TypeScript (Node.js, browsers)
BashExecute shell commands with persistent sessionsPython, TypeScript (Node.js, Unix/Linux/macOS)
MCP RouterConnect to Model Context Protocol servers on a developer-set allowlistPython, TypeScript (Node.js)
SleepPause execution for a bounded, cancellable durationPython, TypeScript (Node.js, browsers)
Handoff to UserPause the agent loop and surface a message to the userPython, TypeScript (Node.js, browsers)
StopGracefully end the agent loop when the task is completePython, TypeScript (Node.js, browsers)
Web FetchFetch a URL and return cleaned markdown for a model to readPython, TypeScript (Node.js)
A2A ClientDiscover and send messages to remote A2A-protocol agentsPython, TypeScript (Node.js, browsers)
Python REPLExecute Python code through the agent’s sandboxPython, TypeScript (Node.js, Unix/Linux/macOS)
SubagentDelegate a self-contained task to a child agentPython, TypeScript (Node.js, browsers)
SwarmSpin up a team of agents that collaborate via the swarm patternPython, TypeScript (Node.js, browsers)
GraphRun a team of sub-agents as a directed acyclic graph designed by the modelPython, TypeScript (Node.js, browsers)

The subagent, swarm, and graph tools let the model configure child agents at runtime. They use axis policies to control how much freedom the model has over each parameter. Import them from strands.multiagent@strands-agents/sdk/multiagent.

  • Inherit()new Inherit(): the child inherits the parent’s value. Hidden from the model.
  • Fixed(value)new Fixed(value): you pin the value. Hidden from the model.
  • Open()new Open(): the model writes a free-form string value.
  • Choice([...], multiple=True)new Choice([...], true): the model picks from a set you define (one value, or several when multiple is set).

Use Option inside a Choice to map model-facing names to runtime values. Bundle axis defaults into a Preset that the model selects via agent_type. When the model omits both agent_type and instructions, the child uses default_presetdefaultPreset, or the first preset if none is set.

import { Agent } from '@strands-agents/sdk'
import { Choice, Fixed, Inherit, Open, Preset } from '@strands-agents/sdk/multiagent'
import { bash } from '@strands-agents/sdk/vended-tools/bash'
import { httpRequest } from '@strands-agents/sdk/vended-tools/http-request'
import { makeSubagent } from '@strands-agents/sdk/vended-tools/subagent'
const delegate = makeSubagent({
presets: {
researcher: new Preset({
instructions: 'You research topics on the web and cite your sources.',
description: 'web research',
}),
summarizer: new Preset({
instructions: 'You condense documents into short bullet summaries.',
description: 'summarize a document',
}),
},
defaultPreset: 'researcher',
instructions: new Open(), // model writes the child's system prompt
tools: new Fixed(['http_request']), // child can only make HTTP requests
model: new Inherit(), // child runs on the parent's model
context: new Choice(['none', 'no_tools']), // model picks how much history to share
})
const agent = new Agent({ tools: [bash, httpRequest, delegate] })
await agent.invoke(
'Have a subagent summarize the latest Node.js release notes, then run the tests.'
)

Tools that accept axis policies use a default builder to turn resolved specs into child agents. By default, it produces child agents that inherit the parent’s tools, model, and interventions, so a child’s tool calls go through the same approval and authorization checks as the parent’s. Each child gets context_manager="auto"contextManager: 'auto' (unless its model is stateful) in place of the parent’s context-management tools, and accesses the parent’s long-term memory through inherited memory tools.

To replace the default builder, pass any callable that takes an AgentSpec and returns an Agent. A custom builder decides everything the child inherits, including interventions.

import { Agent } from '@strands-agents/sdk'
import type { AgentSpec } from '@strands-agents/sdk/multiagent'
import { httpRequest } from '@strands-agents/sdk/vended-tools/http-request'
import { makeSubagent } from '@strands-agents/sdk/vended-tools/subagent'
// Each child gets the resolved instructions and only the HTTP request tool
const delegate = makeSubagent({
builder: (spec: AgentSpec) =>
new Agent({
name: spec.name,
systemPrompt: spec.instructions,
tools: [httpRequest],
}),
})
const agent = new Agent({ tools: [delegate] })

Combine vended tools in one agent to cover a multi-step workflow:

import { Agent } from '@strands-agents/sdk'
import { bash } from '@strands-agents/sdk/vended-tools/bash'
import { fileEditor } from '@strands-agents/sdk/vended-tools/file-editor'
import { notebook } from '@strands-agents/sdk/vended-tools/notebook'
const agent = new Agent({
tools: [bash, fileEditor, notebook],
systemPrompt: [
'You are a software development assistant.',
'When given a feature to implement:',
'1. Use the notebook tool to create a plan with a checklist of steps',
'2. Work through each step, checking them off as you go',
'3. Use the bash tool to run tests and verify your changes',
].join('\n'),
})
// Agent plans the work, implements it, and tracks progress
await agent.invoke(
'Add input validation to the createUser function in src/users.ts. ' +
'It should reject empty names and invalid email formats.'
)

Vended tools ship as part of the SDK and are updated alongside it. Report bugs and feature requests in the GitHub repository.

Tool names are stable and will not change. In minor versions, a tool’s description, spec, or parameters may be updated to improve effectiveness. These changes are noted in SDK release notes. Pin your SDK version and test after upgrades if your workflows depend on specific tool behavior.