CrewAI Tools 連携:Agent を「調べる・読む・実行する」状態にする

2 min read

Tool がない Agent は、理論は語れるのにキーボードがないエンジニアのようなものです。
話せるけど作れない。

よく使う組み込み Tool

  • SerperDevTool:Web 検索
  • FileReadTool:ファイル読み取り
  • FileWriterTool:ファイル書き込み
  • ScrapeWebsiteTool:Web ページ取得

Agent に Tool を付ける

from crewai import Agent
from crewai_tools import SerperDevTool
 
search_tool = SerperDevTool()
 
researcher = Agent(
    role="Researcher",
    goal="Find trustworthy sources about the topic",
    backstory="You validate facts before writing.",
    tools=[search_tool],
    allow_delegation=False,
    verbose=True,
)

💡 同じ search_tool は複数 Agent で共用できます。毎回作り直す必要はありません(DRY)。

カスタム Tool の最小テンプレート

from crewai.tools import BaseTool
from pydantic import BaseModel, Field
 
class QueryInput(BaseModel):
    keyword: str = Field(description="Search keyword")
 
class KeywordTool(BaseTool):
    name: str = "Keyword Tool"
    description: str = "Return a short explanation for a keyword."
    args_schema: type[BaseModel] = QueryInput
 
    def _run(self, keyword: str) -> str:
        return f"Result for: {keyword}"

Tool 設計の 4 原則

  1. 1 つのことだけやる:検索 Tool がついでに書き込みしない
  2. 説明を明確にするdescription に用途と入力を明記
  3. 入力を検証する:Pydantic で制約
  4. 返却形式を安定させる:後続 Task で扱いやすくする

よくあるエラー

現象 原因 修正
Tool が呼ばれない Task 側に使用条件がない Task 指示に「先に Tool を使う」を明記
引数が崩れる args schema が曖昧 Field(description=...) を追加
返却が使いづらい 自由文が散らかる 定型段落か JSON 文字列で返す

次へ

Tool の次は「出力の一貫性」です。
次回は Pydantic で出力を構造化します。
👉 構造化出力 Pydantic