도구
도구 (Tools)
Deep Agents를 커스텀 함수, API, 데이터베이스, 그리고 모든 MCP 서버에 연결하세요.
Deep Agents는 여러분이 정의한 모든 도구, 모든 LangChain 도구, 그리고 모든 MCP 서버의 도구를 호출할 수 있어요. 파일 관리와 서브에이전트 생성을 위한 내장 harness 도구와 함께 tools= 파라미터로 create_deep_agent에 전달하면 됩니다.
const agent = await createDeepAgent({ model: "google-genai:gemini-3.6-flash", tools: [search, fetchUrl, runQuery], });
```ts OpenAI theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
import { createDeepAgent } from "deepagents";
const agent = await createDeepAgent({
model: "openai:gpt-5.5",
tools: [search, fetchUrl, runQuery],
});
import { createDeepAgent } from "deepagents";
const agent = await createDeepAgent({
model: "anthropic:claude-sonnet-5",
tools: [search, fetchUrl, runQuery],
});
import { createDeepAgent } from "deepagents";
const agent = await createDeepAgent({
model: "openrouter:z-ai/glm-5.2",
tools: [search, fetchUrl, runQuery],
});
import { createDeepAgent } from "deepagents";
const agent = await createDeepAgent({
model: "fireworks:accounts/fireworks/models/glm-5p2",
tools: [search, fetchUrl, runQuery],
});
import { createDeepAgent } from "deepagents";
const agent = await createDeepAgent({
model: "baseten:zai-org/GLM-5.2",
tools: [search, fetchUrl, runQuery],
});
import { createDeepAgent } from "deepagents";
const agent = await createDeepAgent({
model: "ollama:north-mini-code-1.0",
tools: [search, fetchUrl, runQuery],
});
커스텀 도구 (Custom tools)
평범한 함수, LangChain @tool 데코레이터가 붙은 함수, 또는 도구 딕셔너리 같은 호출 가능한 객체를 tools=에 직접 전달하세요. Deep Agents는 함수 시그니처와 docstring에서 도구 스키마를 추론하므로, 대부분의 경우 별도의 스키마를 정의할 필요가 없습니다.
const internetSearch = tool( async ({ query, maxResults = 5, topic = "general", includeRawContent = false, }: { query: string; maxResults?: number; topic?: "general" | "news" | "finance"; includeRawContent?: boolean; }) => { const tavilySearch = new TavilySearch({ maxResults, tavilyApiKey: proces...KEY, includeRawContent, topic, }); return await tavilySearch._call({ query }); }, { name: "internet_search", description: "Run a web search", schema: z.object({ query: z.string().describe("The search query"), maxResults: z.number().optional().default(5), topic: z .enum(["general", "news", "finance"]) .optional() .default("general"), includeRawContent: z.boolean().optional().default(false), }), }, );
const agent = createDeepAgent({ model: "google-genai:gemini-3.6-flash", tools: [internetSearch], });
```ts OpenAI theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
import { tool } from "langchain";
import { TavilySearch } from "@langchain/tavily";
import { createDeepAgent } from "deepagents";
import { z } from "zod";
const internetSearch = tool(
async ({
query,
maxResults = 5,
topic = "general",
includeRawContent = false,
}: {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeRawContent?: boolean;
}) => {
const tavilySearch = new TavilySearch({
maxResults,
tavilyApiKey: proces...KEY,
includeRawContent,
topic,
});
return await tavilySearch._call({ query });
},
{
name: "internet_search",
description: "Run a web search",
schema: z.object({
query: z.string().describe("The search query"),
maxResults: z.number().optional().default(5),
topic: z
.enum(["general", "news", "finance"])
.optional()
.default("general"),
includeRawContent: z.boolean().optional().default(false),
}),
},
);
const agent = createDeepAgent({
model: "openai:gpt-5.5",
tools: [internetSearch],
});
import { tool } from "langchain";
import { TavilySearch } from "@langchain/tavily";
import { createDeepAgent } from "deepagents";
import { z } from "zod";
const internetSearch = tool(
async ({
query,
maxResults = 5,
topic = "general",
includeRawContent = false,
}: {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeRawContent?: boolean;
}) => {
const tavilySearch = new TavilySearch({
maxResults,
tavilyApiKey: proces...KEY,
includeRawContent,
topic,
});
return await tavilySearch._call({ query });
},
{
name: "internet_search",
description: "Run a web search",
schema: z.object({
query: z.string().describe("The search query"),
maxResults: z.number().optional().default(5),
topic: z
.enum(["general", "news", "finance"])
.optional()
.default("general"),
includeRawContent: z.boolean().optional().default(false),
}),
},
);
const agent = createDeepAgent({
model: "anthropic:claude-sonnet-5",
tools: [internetSearch],
});
import { tool } from "langchain";
import { TavilySearch } from "@langchain/tavily";
import { createDeepAgent } from "deepagents";
import { z } from "zod";
const internetSearch = tool(
async ({
query,
maxResults = 5,
topic = "general",
includeRawContent = false,
}: {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeRawContent?: boolean;
}) => {
const tavilySearch = new TavilySearch({
maxResults,
tavilyApiKey: proces...KEY,
includeRawContent,
topic,
});
return await tavilySearch._call({ query });
},
{
name: "internet_search",
description: "Run a web search",
schema: z.object({
query: z.string().describe("The search query"),
maxResults: z.number().optional().default(5),
topic: z
.enum(["general", "news", "finance"])
.optional()
.default("general"),
includeRawContent: z.boolean().optional().default(false),
}),
},
);
const agent = createDeepAgent({
model: "openrouter:z-ai/glm-5.2",
tools: [internetSearch],
});
import { tool } from "langchain";
import { TavilySearch } from "@langchain/tavily";
import { createDeepAgent } from "deepagents";
import { z } from "zod";
const internetSearch = tool(
async ({
query,
maxResults = 5,
topic = "general",
includeRawContent = false,
}: {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeRawContent?: boolean;
}) => {
const tavilySearch = new TavilySearch({
maxResults,
tavilyApiKey: proces...KEY,
includeRawContent,
topic,
});
return await tavilySearch._call({ query });
},
{
name: "internet_search",
description: "Run a web search",
schema: z.object({
query: z.string().describe("The search query"),
maxResults: z.number().optional().default(5),
topic: z
.enum(["general", "news", "finance"])
.optional()
.default("general"),
includeRawContent: z.boolean().optional().default(false),
}),
},
);
const agent = createDeepAgent({
model: "fireworks:accounts/fireworks/models/glm-5p2",
tools: [internetSearch],
});
import { tool } from "langchain";
import { TavilySearch } from "@langchain/tavily";
import { createDeepAgent } from "deepagents";
import { z } from "zod";
const internetSearch = tool(
async ({
query,
maxResults = 5,
topic = "general",
includeRawContent = false,
}: {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeRawContent?: boolean;
}) => {
const tavilySearch = new TavilySearch({
maxResults,
tavilyApiKey: proces...KEY,
includeRawContent,
topic,
});
return await tavilySearch._call({ query });
},
{
name: "internet_search",
description: "Run a web search",
schema: z.object({
query: z.string().describe("The search query"),
maxResults: z.number().optional().default(5),
topic: z
.enum(["general", "news", "finance"])
.optional()
.default("general"),
includeRawContent: z.boolean().optional().default(false),
}),
},
);
const agent = createDeepAgent({
model: "baseten:zai-org/GLM-5.2",
tools: [internetSearch],
});
import { tool } from "langchain";
import { TavilySearch } from "@langchain/tavily";
import { createDeepAgent } from "deepagents";
import { z } from "zod";
const internetSearch = tool(
async ({
query,
maxResults = 5,
topic = "general",
includeRawContent = false,
}: {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeRawContent?: boolean;
}) => {
const tavilySearch = new TavilySearch({
maxResults,
tavilyApiKey: proces...KEY,
includeRawContent,
topic,
});
return await tavilySearch._call({ query });
},
{
name: "internet_search",
description: "Run a web search",
schema: z.object({
query: z.string().describe("The search query"),
maxResults: z.number().optional().default(5),
topic: z
.enum(["general", "news", "finance"])
.optional()
.default("general"),
includeRawContent: z.boolean().optional().default(false),
}),
},
);
const agent = createDeepAgent({
model: "ollama:north-mini-code-1.0",
tools: [internetSearch],
});
LangChain 도구를 정의하고 사용하는 방법(도구 딕셔너리, StructuredTool, 반환 타입, 오류 처리 등)에 대한 자세한 내용은 Tools를 참조하세요.
MCP 도구 (MCP tools)
MCP는 에이전트가 데이터베이스, API, 파일 시스템, 브라우저 등 점점 늘어나는 서버 생태계에 표준 인터페이스 하나로 연결되게 해주는 개방형 프로토콜입니다. 각 서비스마다 커스텀 통합 코드를 작성하는 대신, Deep Agents를 MCP 서버에 연결하면 그 서버가 노출하는 모든 도구를 가져옵니다.
MCP 서버에 연결하려면 @langchain/mcp-adapters를 설치하세요:
npm install @langchain/mcp-adapters
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({ my_server: { transport: "http", url: "http://localhost:8000/mcp", }, });
const tools = await client.getTools();
const agent = await createDeepAgent({ model: "google-genai:gemini-3.6-flash", tools, });
const result = await agent.invoke({ messages: [{ role: "user", content: "Use the MCP server to help me." }], });
```ts OpenAI theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
import { createDeepAgent } from "deepagents";
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({
my_server: {
transport: "http",
url: "http://localhost:8000/mcp",
},
});
const tools = await client.getTools();
const agent = await createDeepAgent({
model: "openai:gpt-5.5",
tools,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Use the MCP server to help me." }],
});
import { createDeepAgent } from "deepagents";
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({
my_server: {
transport: "http",
url: "http://localhost:8000/mcp",
},
});
const tools = await client.getTools();
const agent = await createDeepAgent({
model: "anthropic:claude-sonnet-5",
tools,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Use the MCP server to help me." }],
});
import { createDeepAgent } from "deepagents";
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({
my_server: {
transport: "http",
url: "http://localhost:8000/mcp",
},
});
const tools = await client.getTools();
const agent = await createDeepAgent({
model: "openrouter:z-ai/glm-5.2",
tools,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Use the MCP server to help me." }],
});
import { createDeepAgent } from "deepagents";
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({
my_server: {
transport: "http",
url: "http://localhost:8000/mcp",
},
});
const tools = await client.getTools();
const agent = await createDeepAgent({
model: "fireworks:accounts/fireworks/models/glm-5p2",
tools,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Use the MCP server to help me." }],
});
import { createDeepAgent } from "deepagents";
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({
my_server: {
transport: "http",
url: "http://localhost:8000/mcp",
},
});
const tools = await client.getTools();
const agent = await createDeepAgent({
model: "baseten:zai-org/GLM-5.2",
tools,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Use the MCP server to help me." }],
});
import { createDeepAgent } from "deepagents";
const { MultiServerMCPClient } = await import("@langchain/mcp-adapters");
const client = new MultiServerMCPClient({
my_server: {
transport: "http",
url: "http://localhost:8000/mcp",
},
});
const tools = await client.getTools();
const agent = await createDeepAgent({
model: "ollama:north-mini-code-1.0",
tools,
});
const result = await agent.invoke({
messages: [{ role: "user", content: "Use the MCP server to help me." }],
});
stdio 서버, OAuth 인증, 도구 필터링, 상태 유지 세션을 포함한 자세한 구성 옵션은 전체 MCP 가이드를 참조하세요.
내장 harness 도구 (Built-in harness tools)
여러분이 제공하는 도구 외에도 모든 Deep Agent에는 harness에서 제공하는 내장 도구 세트가 함께 제공됩니다:
| 도구 | 설명 |
|---|---|
ls |
디렉터리의 파일을 나열합니다. |
read_file |
파일 내용을 읽습니다(페이지네이션과 멀티모달 지원). |
write_file |
새 파일을 만듭니다. |
edit_file |
파일에서 정확한 문자열 치환을 수행합니다. |
glob |
glob 패턴과 일치하는 파일을 찾습니다. |
grep |
파일 내용을 검색합니다. |
execute |
셸 명령을 실행합니다(샌드박스 백엔드 전용). |
task |
위임된 작업을 처리할 서브에이전트를 생성합니다. |
write_todos로 구조화된 작업 계획을 추가하려면 TodoListMiddleware로 옵트인하세요. 작업 계획을 참조하세요.
각 내장 도구가 무엇을 하는지에 대한 전체 설명은 Harness 개요를 참조하세요.
멀티모달 도구 출력 (Multimodal tool outputs)
커스텀 도구는 선택한 모델이 멀티모달 도구 결과를 지원할 때 일반 텍스트 또는 표준 콘텐츠 블록(텍스트, 이미지, 오디오, 비디오, 파일)을 반환할 수 있습니다. 내장 read_file 도구도 지원되는 비텍스트 파일 유형에 대해 멀티모달 블록을 반환합니다.
텍스트 전용 결과에는 문자열을 반환하고, 텍스트+미디어 또는 혼합 멀티모달 출력에는 콘텐츠 블록의 정렬된 목록을 반환하세요. 예시와 컨텍스트 압축 고려 사항은 Multimodal과 도구 반환 값을 참조하세요.
더 알아보기
- 이 문서를 MCP로 연결하면 Claude, VSCode 등에서 실시간 답변을 받을 수 있어요.
- GitHub에서 이 페이지 편집하기 또는 이슈 제출하기.