Catalog Overview

Complete reference for every built-in tool in shipit-agent — what each one does, when to use it, schema, examples, and configuration knobs.

5 min read
8 sections
Edit this page

shipit-agent ships with 25+ production-ready built-in tools organized into four categories. Every tool is opt-in (use only what you need), discoverable via tool_search, and follows the same Tool protocol so you can mix built-ins with custom tools without ceremony.

Quick navigation

Core tools

The runtime essentials. Web search, URL fetching, browser automation, semantic tool discovery, human-in-the-loop, planning.

web_search · open_url · playwright_browse · tool_search · ask_user · human_review · plan_task

Reasoning helpers

Tools that decompose, verify, and synthesize. Build prompts, check outputs, break problems apart, weigh options.

build_prompt · verify_output · decompose_problem · synthesize_evidence · decision_matrix · sub_agent

Code & files

Execute Python, manage workspace files, store memory facts, build artifacts.

bash · read_file · edit_file · write_file · glob_files · grep_files · run_code · workspace_files · memory · build_artifact

Tool prompt pages

Exact shipped prompt text and runtime notes for the main code-and-files tools.

bash · read_file · edit_file · write_file · glob_files · grep_files

Connectors

Third-party SaaS integrations with OAuth/API-key auth via CredentialStore.

gmail_search · google_drive · google_calendar · slack · linear · jira · notion · confluence · custom_api

Full alphabetical index

ToolCategoryPurpose
build_artifactCode & filesCreate named artifacts (markdown, JSON, code files) saved to workspace
ask_userCorePause and ask the user a structured question
bashCode & filesRun a bounded shell command from the configured project root
build_promptReasoningGenerate or refine a system prompt from goals + constraints
run_codeCode & filesRun Python or shell code in a sandboxed subprocess
confluenceConnectorSearch and create Confluence pages
custom_apiConnectorCall any configured HTTP API with custom auth
decision_matrixReasoningScore options against criteria, recommend the strongest
decompose_problemReasoningBreak a problem into workstreams, assumptions, risks
edit_fileCode & filesApply exact string replacement patches to an existing file
gmail_searchConnectorSearch, read, draft, and send Gmail messages
google_calendarConnectorSearch and list calendar events
google_driveConnectorSearch and list Drive files
human_reviewCorePause for human approval before continuing
jiraConnectorSearch and create Jira issues
linearConnectorSearch and create Linear issues
memoryCode & filesStore and retrieve persistent memory facts
notionConnectorSearch and create Notion pages
open_urlCoreFetch a URL with in-process Playwright + urllib fallback
plan_taskCoreGenerate a structured execution plan
playwright_browseCoreDrive a headless browser for JS-heavy or interactive pages
slackConnectorSearch and post Slack messages
sub_agentReasoningDelegate a focused subtask to a lightweight LLM call
synthesize_evidenceReasoningTurn observations into facts, inferences, gaps, recommendations
tool_searchCoreRank available tools by relevance to a query
verify_outputReasoningCheck whether content satisfies required criteria
web_searchCoreSearch the web via DuckDuckGo, Brave, Serper, Tavily, or Playwright
workspace_filesCode & filesRead, write, list, and inspect files in the workspace
read_fileCode & filesRead a file from the configured project root
write_fileCode & filesCreate or overwrite a file under the configured project root
glob_filesCode & filesFind files by glob pattern under the configured project root
grep_filesCode & filesSearch repository contents with ripgrep-style semantics

How tools are loaded

Three ways, pick whichever fits:

Way 1 — Everything at once:

python
from shipit_agent import Agent
from shipit_agent.llms import OpenAIChatLLM

agent = Agent.with_builtins(llm=OpenAIChatLLM(model="gpt-4o-mini"))
# All 25+ built-in tools registered automatically

Way 2 — Selective:

python
from shipit_agent import Agent, WebSearchTool, OpenURLTool, ToolSearchTool
from shipit_agent.llms import OpenAIChatLLM

agent = Agent(
    llm=OpenAIChatLLM(model="gpt-4o-mini"),
    tools=[WebSearchTool(),
        OpenURLTool(),
        ToolSearchTool(),],
)

Way 3 — Mix built-ins with custom tools:

python
from shipit_agent import Agent, FunctionTool, get_builtin_tools
from shipit_agent.llms import OpenAIChatLLM

def my_pricing_lookup(sku: str) -> str:
    """Look up internal product pricing by SKU."""
    return get_pricing_from_db(sku)

agent = Agent(
    llm=OpenAIChatLLM(model="gpt-4o-mini"),
    tools=[*get_builtin_tools(llm=OpenAIChatLLM(model="gpt-4o-mini")),
        FunctionTool.from_callable(my_pricing_lookup),],
)

How tools surface in events

Every tool call emits three events the runtime guarantees in this order:

bash
tool_called      → "Tool called: web_search"           (before execution)
tool_completed   → "Tool completed: web_search"        (on success)
tool_failed      → "Tool failed: web_search"           (on error or unknown tool)

Both tool_called and tool_completed carry the full arguments and output in their event payloads. See the Event types reference for the complete schema.

Bedrock tool-pairing safety

The runtime guarantees that every toolUse block in an assistant turn gets a paired toolResult block in the next user turn — even when:

  • A tool raises a non-retryable exception → synthetic error result is appended
  • The model hallucinates an unregistered tool name → synthetic "Error: tool X is not registered" result
  • The planner runs before the first LLM call → output is injected as a user-role context message, not an orphan tool-role result

This invariant is what makes multi-iteration tool loops on AWS Bedrock work reliably. See architecture for the full story.

Adding your own tool

Every tool implements three things: name, schema(), and run(context, **kwargs). See the custom tools guide for the full template, or the worked example in examples/05_custom_tool.py.

Where these are defined

Every built-in tool lives at shipit_agent/tools/<tool_name>/<tool_name>_tool.py. The implementation is small, readable, and a good template for your own tools — the Web search tool is ~150 lines including all five provider backends.