Skip to main content
Tools extend what agents can do—letting them fetch real-time data, execute code, query external databases, and take actions in the world. Under the hood, tools are callable functions with well-defined inputs and outputs that get passed to a chat model. The model decides when to invoke a tool based on the conversation context, and what input arguments to provide.
For details on how models handle tool calls, see Tool calling.

Create tools

Basic tool definition

The simplest way to create a tool is with the @tool decorator. By default, the function’s docstring becomes the tool’s description that helps the model understand when to use it:
Type hints are required as they define the tool’s input schema. The docstring should be informative and concise to help the model understand the tool’s purpose.
Server-side tool use: Some chat models feature built-in tools (web search, code interpreters) that are executed server-side. See Server-side tool use for details.
Prefer snake_case for tool names (e.g., web_search instead of Web Search). Some model providers have issues with or reject names containing spaces or special characters with errors. Sticking to alphanumeric characters, underscores, and hyphens helps to improve compatibility across providers.

Customize tool properties

Custom tool name

By default, the tool name comes from the function name. Override it when you need something more descriptive:

Custom tool description

Override the auto-generated tool description for clearer model guidance:

Advanced schema definition

Define complex inputs with Pydantic models or JSON schemas:

Reserved argument names

The following parameter names are reserved and cannot be used as tool arguments. Using these names will cause runtime errors. To access runtime information, use the ToolRuntime parameter instead of naming your own arguments config or runtime.

Access context

Tools are most powerful when they can access runtime information like conversation history, user data, and persistent memory. This section covers how to access and update this information from within your tools. Tools can access runtime information through the ToolRuntime parameter, which provides:

Short-term memory (State)

State represents short-term memory that exists for the duration of a conversation. It includes the message history and any custom fields you define in your graph state.
Add runtime: ToolRuntime to your tool signature to access state. This parameter is automatically injected and hidden from the LLM - it won’t appear in the tool’s schema.

Access state

Tools can access the current conversation state using runtime.state:
The runtime parameter is hidden from the model. For the example above, the model only sees pref_name in the tool schema.

Update state

Use Command to update the agent’s state. This is useful for tools that need to update custom state fields:
When tools update state variables, consider defining a reducer for those fields. Since LLMs can call multiple tools in parallel, a reducer determines how to resolve conflicts when the same state field is updated by concurrent tool calls.

Context

Context provides immutable configuration data that is passed at invocation time. Use it for user IDs, session details, or application-specific settings that shouldn’t change during a conversation. Access context through runtime.context:

Long-term memory (Store)

The BaseStore provides persistent storage that survives across conversations. Unlike state (short-term memory), data saved to the store remains available in future sessions. Access the store through runtime.store. The store uses a namespace/key pattern to organize data:
For production deployments, use a persistent store implementation like PostgresStore instead of InMemoryStore. See the memory documentation for setup details.

Stream writer

Stream real-time updates from tools during execution. This is useful for providing progress feedback to users during long-running operations. Use runtime.stream_writer to emit custom updates:
If you use runtime.stream_writer inside your tool, the tool must be invoked within a LangGraph execution context. See Streaming for more details.

ToolNode

ToolNode is a prebuilt node that executes tools in LangGraph workflows. It handles parallel tool execution, error handling, and state injection automatically.
For custom workflows where you need fine-grained control over tool execution patterns, use ToolNode instead of create_agent. It’s the building block that powers agent tool execution.

Basic usage

Tool return values

You can choose different return values for your tools:
  • Return a string for human-readable results.
  • Return an object for structured results the model should parse.
  • Return a Command with optional message when you need to write to state.

Return a string

Return a string when the tool should provide plain text for the model to read and use in its next response.
Behavior:
  • The return value is converted to a ToolMessage.
  • The model sees that text and decides what to do next.
  • No agent state fields are changed unless the model or another tool does so later.
Use this when the result is naturally human-readable text.

Return an object

Return an object (for example, a dict) when your tool produces structured data that the model should inspect.
Behavior:
  • The object is serialized and sent back as tool output.
  • The model can read specific fields and reason over them.
  • Like string returns, this does not directly update graph state.
Use this when downstream reasoning benefits from explicit fields instead of free-form text.

Return a Command

Return a Command when the tool needs to update graph state (for example, setting user preferences or app state). You can return a Command with or without including a ToolMessage. If the model needs to see that the tool succeeded (for example, to confirm a preference change), include a ToolMessage in the update, using runtime.tool_call_id for the tool_call_id parameter.
Behavior:
  • The command updates state using update.
  • Updated state is available to subsequent steps in the same run.
  • Use reducers for fields that may be updated by parallel tool calls.
Use this when the tool is not just returning data, but also mutating agent state.

Error handling

Configure how tool errors are handled. See the ToolNode API reference for all options.

Route with tools_condition

Use tools_condition for conditional routing based on whether the LLM made tool calls:

State injection

Tools can access the current graph state through ToolRuntime:
For more details on accessing state, context, and long-term memory from tools, see Access context.

Prebuilt tools

LangChain provides a large collection of prebuilt tools and toolkits for common tasks like web search, code interpretation, database access, and more. These ready-to-use tools can be directly integrated into your agents without writing custom code. See the tools and toolkits integration page for a complete list of available tools organized by category.

Server-side tool use

Some chat models feature built-in tools that are executed server-side by the model provider. These include capabilities like web search and code interpreters that don’t require you to define or host the tool logic. Refer to the individual chat model integration pages and the tool calling documentation for details on enabling and using these built-in tools.