メインコンテンツまでスキップ

ツールシステム

TinyElf のツールシステムは、ToolRegistry がツールの登録と実行を管理し、TinyElfToolRegistryBuilder がセッション開始時に完全なツールセットを構築する役割を担います。各ツールは ITool インターフェースを実装しています。

ツール登録フロー

graph TB
Builder["TinyElfToolRegistryBuilder<br/>buildToolRegistry()"] --> Reg["ToolRegistry"]

Builder -->|"1. FileSystem"| FS["createFileSystemTools()<br/>Read, Write, Edit, ListDir, Glob, Grep"]
Builder -->|"2. Shell"| Shell["ShellTool<br/>Bash"]
Builder -->|"3. Web Search"| WS["setupWebSearch()<br/>WebSearch / NativeSearch"]
Builder -->|"4. Web Fetch"| WF["createWebFetchTool()<br/>WebFetch + summarizer"]
Builder -->|"5. Skills"| SK["SkillsTool + ReadSkillTool<br/>list_skills, read_skill"]
Builder -->|"6. SkillHub"| SH["SkillHubSearchTool + InstallTool<br/>skillhub_search, skillhub_install"]
Builder -->|"7. Sub-Agent"| SA["SpawnTool<br/>spawn_agent"]
Builder -->|"8. Sub-Agent Query"| SAQ["SubagentListTool + StatusTool"]
Builder -->|"9. Slash Command"| CMD["SlashCommandTool<br/>slash_command"]
Builder -->|"10. MCP"| MCP["loadMcpTools() + loadDirectMcpTools()<br/>mcp__*"]
Builder -->|"11. Session"| SS["SessionsSpawn/List/Send/History"]
Builder -->|"12. Control"| Ctrl["NotifyTool + SessionsYieldTool"]

FS --> Reg
Shell --> Reg
WS --> Reg
WF --> Reg
SK --> Reg
SH --> Reg
SA --> Reg
SAQ --> Reg
CMD --> Reg
MCP --> Reg
SS --> Reg
Ctrl --> Reg

ITool インターフェース

interface ITool {
readonly name: string; // ユニークなツール名(function_calling 用)
readonly description: string; // LLM が読めるツールの説明
readonly parameters: JsonSchema; // JSON Schema パラメータ定義
execute(params: Record<string, unknown>): Promise<string>;
}

ToolRegistry

class ToolRegistry {
register(tool: ITool): void;
registerAll(tools: ITool[]): void;
unregister(name: string): boolean;
get(name: string): ITool | undefined;
has(name: string): boolean;
getAll(): ITool[];
getNames(): string[];
getDefinitions(): ToolDefinition[]; // OpenAI function_calling 形式
createFiltered(allowedNames: string[]): ToolRegistry;
execute(toolCallId, toolName, params): Promise<ToolCallResult>;
}

実行フロー

  1. ツールを検索 → 見つからない場合はエラーを返す(利用可能なツール一覧を表示)
  2. パラメータの型変換 → LLM の一般的な型エラーを処理(string → number など)
  3. 必須パラメータのバリデーション → 欠落している場合はエラーを返す
  4. tool.execute(params) を呼び出す
  5. 出力の切り捨て → maxChars(デフォルト 50KB)を超えた場合に切り捨て、(truncated) マークを付加
  6. エラー出力にヒントを追記 → [Analyze the error above and try a different approach.]

ツールのフィルタリング

createFiltered() は、ホワイトリストに含まれるツールのみを持つ新しい ToolRegistry インスタンスを作成します。主な用途:

  • plan モードで読み取り専用ツールのみに制限
  • Agent 設定の allowedTools フィールド
  • Slash command の allowed-tools メタデータ

ツール一覧

FileSystem ツール

ツールクラス感度パラメータ説明
ReadReadFileTool安全path, offset?, limit?ファイル内容を読み取る(部分読み取りに対応)
WriteWriteFileTool要注意path, contentファイルを書き込む(作成または上書き)
EditEditFileTool要注意path, old_string, new_string, replace_all?文字列の精密な置換
ListDirListDirTool安全pathディレクトリの内容を一覧表示
GlobGlobTool安全pattern, path?ファイル名のパターンマッチング
GrepGrepTool安全pattern, path?, include?ファイル内容の検索

FileSystem ツールの特徴:

  • パスのサンドボックス:すべてのパスはワークスペースルートからの相対パスとして解決される
  • restrictToWorkspace 設定でワークスペース外へのアクセスを制御
  • Read は大きなファイル(128KB 超)を自動的に切り捨て、10MB 超は offset/limit が必要

Shell ツール

ツールクラス感度パラメータ説明
BashShellTool要注意commandシェルコマンドを実行

Shell ツールのセキュリティ機能:

  • コマンドブラックリスト(重大な拒否パターン):rm -rf /formatmkfsdiskpart など
  • 高リスクコマンドの警告:sudocurl | sh、パーミッション変更
  • ワークスペース外パスの検出
  • 出力制限:100KB
  • タイムアウト:デフォルト 2 分(execTimeout で変更可能)

Web ツール

ツールクラス感度パラメータ説明
WebSearchWebSearchServiceTool安全query, count?Web 検索
WebFetchWebFetchTool安全url, prompt?, raw?Web コンテンツの取得

WebFetch の特徴:

  • Readability を使用して記事本文を抽出
  • HTML → Markdown 変換(Turndown)
  • 4KB 超のコンテンツはバックグラウンドモデルで自動要約
  • タイムアウト 30 秒、最大レスポンス 5MB

Web 検索の 3 段階フォールバック:

  1. ネイティブ検索(Anthropic / OpenAI / Gemini / xAI 組み込み)
  2. WebSearchService(Tavily / Jina / Searxng)
  3. 利用不可

サブエージェントツール

ツールクラス感度パラメータ説明
spawn_agentSpawnTool要注意prompt, agent?, model?, background?, maxIterations?, permissionMode?, tools?サブエージェントを起動
subagent_listSubagentListTool安全なしアクティブなサブエージェントを一覧表示
subagent_statusSubagentStatusTool安全runIdサブエージェントの状態を照会

セッションツール

ツールクラス感度パラメータ説明
SessionsSpawnSessionsSpawnTool要注意prompt, agentId?, title?新しいセッションを作成
SessionsListSessionsListTool安全limit?, offset?セッション一覧を表示
SessionsSendSessionsSendTool要注意sessionId, messageセッションにメッセージを送信
SessionsHistorySessionsHistoryTool安全sessionId, limit?セッション履歴を表示
SessionsYieldSessionsYieldTool安全messageAgent ループを終了してメッセージを返す

Skills ツール

ツールクラス感度パラメータ説明
list_skillsSkillsTool安全なし利用可能なすべての Skill を一覧表示
read_skillReadSkillTool安全nameSkill の内容を読み取る
skillhub_searchSkillHubSearchTool安全queryコミュニティ Skill を検索
skillhub_installSkillHubInstallTool安全skillIdコミュニティ Skill をインストール

MCP ツール

ツールクラス感度パラメータ説明
mcp__<server>__<tool>動的生成要注意MCP サーバーが定義外部 MCP ツール

MCP ツールは 3 つのアプローチで読み込まれます:

  1. ユーザー MCPmcpServerIds)— 設定 → MCP で設定した stdio/http/sse サーバーに McpService 経由で接続
  2. 組み込み MCPMcpProviderRegistry で自動組み立て)— すべての組み込み MCP ハンドラーをプロセス内で動作させ、createSdkMcpServer で SDK ラップし、TinyElf が ITool として登録。CLI は中央の BuiltinMcpHttpServer HTTP ブリッジ経由でアクセス。各 Agent から見える MCP は Provider の isEligible(ctx) によって決定(Agent 設定の builtinMcpServers フィールドは cleanup-legacy-mcp(2026-05-19)で削除済み)
  3. ダイレクト MCPdirectMcpServers)— Agent 設定で宣言された stdio MCP(ローカル Python ツールを呼び出すようなユーザーシナリオ向け)

制御ツール

ツールクラス感度パラメータ説明
NotifyNotifyTool安全title, body?デスクトップ通知を送信
slash_commandSlashCommandTool安全command, args?Slash コマンドを実行

ツールの感度分類

private static readonly SAFE_TOOLS = new Set([
'Read', 'ListDir', 'Glob', 'Grep',
'WebSearch', 'WebFetch',
'list_skills', 'read_skill',
'Notify', 'SessionsYield', 'SessionsHistory',
]);

分類ルール:

  • SAFE_TOOLS セットに含まれる → 確認を求めない
  • acceptEdits モードでは、WriteEdit も確認を求めない
  • その他すべてのツール(MCP ツールを含む)→ 確認が必要

ツールの継承

サブエージェントは親 Agent から一部のツールを継承できます:

const inheritableToolNames = new Set([
'list_skills', 'read_skill', 'slash_command'
]);
// + mcp__ で始まるすべての MCP ツール

主要ファイル

ファイルパス説明
ITool インターフェースtinyelf/tools/ToolInterface.tsツールの基底インターフェース
ToolRegistrytinyelf/tools/ToolRegistry.tsツールレジストリ
ToolRegistryBuildertinyelf/TinyElfToolRegistryBuilder.tsツールビルダー
FileSystemToolstinyelf/tools/FileSystemTools.tsFileSystem ツール群
ShellTooltinyelf/tools/ShellTool.tsShell ツール
WebToolstinyelf/tools/WebTools.tsWebFetch
WebSearchServiceTooltinyelf/tools/WebSearchServiceTool.tsWebSearch
SpawnTooltinyelf/tools/SpawnTool.tsサブエージェントツール
SessionToolstinyelf/tools/SessionTools.tsセッション管理ツール群
SkillsTooltinyelf/tools/SkillsTool.tsSkills ツール
SkillHubToolstinyelf/tools/SkillHubTools.tsSkillHub ツール群
McpToolAdaptertinyelf/tools/McpToolAdapter.tsMCP ツールアダプター
NotifyTooltinyelf/tools/NotifyTool.ts通知ツール
YieldTooltinyelf/tools/YieldTool.tsループ終了ツール
SubagentToolstinyelf/tools/SubagentTools.tsサブエージェント照会ツール群
SlashCommandTooltinyelf/tools/SlashCommandTool.tsSlash コマンド

すべてのパスは packages/desktop/app/main/services/agent-core/engine/ からの相対パスです。

拡張ポイント

  • 新しいツールの追加ITool インターフェースを実装 → TinyElfToolRegistryBuilder に登録
  • 感度の変更TinyElfAgentLoop.SAFE_TOOLS セットに追加または削除
  • カスタムツールの継承inheritableToolNames セットを変更
  • MCP ツールの読み込みMcpToolAdapter で新しい MCP トランスポートに対応

関連モジュール

モジュールパス関係
TinyElfAgentLooptinyelf/TinyElfAgentLoop.tsツール実行の呼び出し元
ExecutionFirewallplatform/security/ExecutionFirewall.tsFileSystem ツールのパスチェック
McpServicecapabilities/tools/mcp-users/McpService.tsMCP ツールのソース
SkillsLoadertinyelf/skills/SkillsLoader.tsSkills ツールの依存
SubagentManagertinyelf/tools/SpawnTool.tsspawn_agent の依存