Deep Agents can call any tool you define, any LangChain tool , and tools from any MCP server .
Pass them to create_deep_agent via the tools= parameter alongside the built-in harness tools for planning, file management, and subagent spawning.
Google
OpenAI
Anthropic
OpenRouter
Fireworks
Baseten
Ollama
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "google_genai:gemini-3.5-flash" ,
tools = [search, fetch_url, run_query],
)
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "openai:gpt-5.5" ,
tools = [search, fetch_url, run_query],
)
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "anthropic:claude-sonnet-4-6" ,
tools = [search, fetch_url, run_query],
)
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "openrouter:z-ai/glm-5.2" ,
tools = [search, fetch_url, run_query],
)
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "fireworks:accounts/fireworks/models/glm-5p2" ,
tools = [search, fetch_url, run_query],
)
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "baseten:zai-org/GLM-5.2" ,
tools = [search, fetch_url, run_query],
)
from deepagents import create_deep_agent
agent = create_deep_agent(
model = "ollama:north-mini-code-1.0" ,
tools = [search, fetch_url, run_query],
)
Pass any callable, such as plain functions, LangChain @tool-decorated functions, or tool dicts—directly to tools=.
Deep Agents infers the tool schema from the function signature and docstring, so you don’t need to define a separate schema in most cases.
Google
OpenAI
Anthropic
OpenRouter
Fireworks
Baseten
Ollama
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "google_genai:gemini-3.5-flash" ,
tools = [internet_search],
)
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "openai:gpt-5.5" ,
tools = [internet_search],
)
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "anthropic:claude-sonnet-4-6" ,
tools = [internet_search],
)
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "openrouter:z-ai/glm-5.2" ,
tools = [internet_search],
)
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "fireworks:accounts/fireworks/models/glm-5p2" ,
tools = [internet_search],
)
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "baseten:zai-org/GLM-5.2" ,
tools = [internet_search],
)
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
tavily_client = TavilyClient( api_key = os.environ[ "TAVILY_API_KEY" ])
def internet_search (
query : str ,
max_results : int = 5 ,
topic : Literal[ "general" , "news" , "finance" ] = "general" ,
include_raw_content : bool = False ,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results = max_results,
include_raw_content = include_raw_content,
topic = topic,
)
agent = create_deep_agent(
model = "ollama:north-mini-code-1.0" ,
tools = [internet_search],
)
For full details on defining and using LangChain tools (tool dicts, StructuredTool, return types, error handling, and more), see Tools .
Deep Agents fully support Model Context Protocol (MCP) , the open standard for connecting agents to external services. Load tools from any MCP server and pass them directly to create_deep_agent.
MCP is an open protocol that lets agents connect to a growing ecosystem of servers—databases, APIs, file systems, browsers, and more—through a standard interface. Instead of writing custom integration code for each service, you point Deep Agents at an MCP server and it gets all the tools that server exposes.
Install langchain-mcp-adapters to connect to MCP servers:
pip install langchain-mcp-adapters
Google
OpenAI
Anthropic
OpenRouter
Fireworks
Baseten
Ollama
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "google_genai:gemini-3.5-flash" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "openai:gpt-5.5" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "anthropic:claude-sonnet-4-6" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "openrouter:z-ai/glm-5.2" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "fireworks:accounts/fireworks/models/glm-5p2" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "baseten:zai-org/GLM-5.2" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main ():
client = MultiServerMCPClient(
{
"my_server" : {
"transport" : "http" ,
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_deep_agent(
model = "ollama:north-mini-code-1.0" ,
tools = tools,
)
result = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "Use the MCP server to help me." }]},
config = { "configurable" : { "thread_id" : "1" }},
)
asyncio.run(main())
For detailed configuration options — including stdio servers, OAuth authentication, tool filtering, and stateful sessions — see the full MCP guide .
In addition to the tools you provide, every Deep Agent comes with a built-in set of tools from the harness:
Tool Description lsList files in a directory read_fileRead file contents (with pagination and multimodal support) write_fileCreate a new file, or overwrite an existing one edit_filePerform exact string replacements in files deleteDelete a file, or a directory and its contents recursively globFind files matching a glob pattern grepSearch file contents executeRun shell commands (sandbox backends only) taskSpawn a subagent to handle a delegated task write_todosManage a structured todo list
The delete tool requires deepagents 0.7.a1 or newer. Recursive directory deletion requires 0.7.a2 or newer.
For a full breakdown of what each built-in tool does, see Harness overview .
Custom tools can return plain text or standard content blocks (text, images, audio, video, and files) when the selected model supports multimodal tool results. The built-in read_file tool also returns multimodal blocks for supported non-text file types.
Return a string for text-only results, or an ordered list of content blocks for text plus media or interleaved multimodal output. See Multimodal and Tool return values for examples and context-compression considerations.