Hermes Agent を読み解く — ツールシステム
連載「Hermes Agent を読み解く」第5回。
連載「Hermes Agent を読み解く」全10回
- [第1回 全体像と読み方]
- [第2回 コアの会話ループ]
- [第3回 状態管理とコンパクション]
- [第4回 記憶アーキテクチャと人格]
- [第5回 ツールシステム](本記事)
- [第6回 マルチエージェント並列]
- [第7回 Kanban 永続タスクボード]
- [第8回 接続層とインタフェース総覧]
- [第9回 拡張運用]
- [第10回 セキュリティと安全運用]
はじめに — 能力の棚卸し
ここまでで会話ループ・状態・記憶という「中枢」を見た。後半戦の入口として、エージェントの「手足」——ツールを棚卸しする。第1回で触れたとおり、tools/ 直下には 82 ファイルあるが、実際に呼べるツールは 71。今回はその 71 件を端折らず全部並べる。カタログとして手元に置けるようにするのが狙いだ。
1. 自己登録レジストリ
ツールは中央の名簿に手で登録されるのではない。各ツールモジュールが import される瞬間に registry.register(...) を呼んで自分を登録する——自己登録方式だ。
加えて、各ツールの可用性には 30 秒 TTL のキャッシュがかかる(tools/registry.py:121)。ツールが使えるかどうかの判定(check_fn)は資格情報や環境変数の有無を見るが、毎回評価すると重い。30 秒キャッシュで「直近の判定結果」を使い回す。
規模を改めて確定する。レジストリ登録ツールは 71、tools/ 直下は 82 ファイル、再帰すると 99(承認・URL 安全チェックなどの非ツールモジュールを含む)。「82 ツール」は誤り、というのが第1回からの一貫した注意点だ。
2. どんなツールがあるか(全 71 カタログ)
レジストリ実測の 71 件をカテゴリ別に全件並べる。各ツールは check_fn で資格情報/環境が揃った時だけ有効になる(例: Home Assistant 系は HASS_TOKEN、x_search は xAI 認証)。
Web / 検索(3)
| ツール | 説明 |
|---|---|
web_search |
Web 検索。既定で最大 5 件(タイトル / URL / 説明)を返す |
web_extract |
URL から本文を Markdown 抽出(PDF / arXiv も可) |
x_search |
xAI の X(Twitter) 検索(投稿 / プロフィール / スレッド。現在の議論・反応向け、既定 off) |
ビジョン / 生成(4)
| ツール | 説明 |
|---|---|
vision_analyze |
画像を会話に読み込む(URL / ローカル / dataURL)。ネイティブ vision モデルで視認 |
video_analyze |
動画(URL / ローカル)をマルチモーダルモデル(Gemini 等)で解析 |
image_generate |
テキストから高品質画像生成(バックエンド = FAL / OpenAI 等はユーザー設定) |
video_generate |
テキスト / 画像から動画生成(スキーマは実行時に動的構築) |
ターミナル / プロセス / ファイル(6)
| ツール | 説明 |
|---|---|
terminal |
シェルコマンド実行(Linux 環境、状態は通常永続)。cat / head / tail は使わず read_file を推奨 |
process |
terminal(background=true) の背景プロセス管理(list / poll / log 等) |
read_file |
行番号付きでファイル読取(ページング、cat / head / tail の代替) |
write_file |
ファイル全置換書き込み(親ディレクトリ自動作成、echo / heredoc の代替) |
patch |
ファイルの find-and-replace(9 戦略のファジー一致、sed / awk の代替) |
search_files |
内容検索 / ファイル名検索(ripgrep ベース、grep / find / ls の代替) |
ブラウザ自動操作(12)
| ツール | 説明 |
|---|---|
browser_navigate |
URL へ遷移しセッション初期化(他 browser_* の前提) |
browser_snapshot |
アクセシビリティツリーのテキスト snapshot(要素に @e1 等の ref ID) |
browser_click |
ref ID で要素クリック |
browser_type |
入力欄に ref 指定でタイプ(先にクリア) |
browser_scroll |
ページスクロール |
browser_back |
履歴を戻る |
browser_press |
キー押下(Enter / Tab / ショートカット) |
browser_get_images |
ページ内画像の URL / alt 一覧(vision 解析用) |
browser_vision |
スクリーンショットで視覚的に確認 |
browser_console |
コンソール出力 / JS エラー取得。expression 指定時はページ文脈で JS 評価もできる |
browser_cdp |
生の Chrome DevTools Protocol コマンド(エスケープハッチ) |
browser_dialog |
ネイティブダイアログ(alert / confirm / prompt)への応答 |
計画 / メモリ / セッション / 対話(4)
| ツール | 説明 |
|---|---|
todo |
セッション内タスクリスト管理(3 手順以上で推奨) |
memory |
セッション横断の永続メモリ保存(将来ターンに注入。簡潔に保つ) |
session_search |
ローカル SQLite の過去セッションを FTS5 検索(LLM 不使用) |
clarify |
ユーザーへ確認質問(選択式 / 自由記述) |
スキル(3)
| ツール | 説明 |
|---|---|
skills_list |
利用可能スキル一覧(名前 + 説明) |
skill_view |
スキル本文 / 付属スクリプト・テンプレートをロード |
skill_manage |
スキルの作成 / 更新 / 削除(手続き的記憶。~/.hermes/skills) |
実行 / 委譲 / 推論(3)
| ツール | 説明 |
|---|---|
execute_code |
Hermes ツールを呼べる Python 実行(3+ ツール呼びの round trip 削減) |
delegate_task |
隔離コンテキストでサブエージェント生成(独自の会話 / 端末 / ツールセット) |
mixture_of_agents |
難問を複数フロンティア LLM で協調(5 API 呼び = 参照 4 + 集約 1) |
音声 / スケジュール / 送信(3)
| ツール | 説明 |
|---|---|
text_to_speech |
テキスト → 音声(MEDIA: パスを返し、各プラットフォームが音声で配信) |
cronjob |
cron ジョブ管理(create / list / update / pause / resume / remove / trigger) |
send_message |
接続済みメッセージングプラットフォームへ送信 / 宛先一覧 |
Kanban(9)
HERMES_KANBAN_TASK 設定時のみ有効になる、永続タスクボード用の作業ツール群(詳細は第7回)。
| ツール | 説明 |
|---|---|
kanban_show |
タスクの全状態(本文 / 担当 / 親ハンドオフ / 過去試行 / コメント / イベント)を読む |
kanban_list |
タスク要約一覧(orchestrator がルーティング用に。担当 / 状態でフィルタ) |
kanban_complete |
タスク完了 + 構造化ハンドオフ(summary / result / metadata) |
kanban_block |
人間入力待ちで blocked へ(reason をボードに表示) |
kanban_heartbeat |
長時間処理中の生存シグナル |
kanban_comment |
スレッドへ恒久コメント追記 |
kanban_create |
新タスク作成(現タスクの子にも) |
kanban_link |
親 → 子依存エッジ追加(親 done まで子は ready にならない) |
kanban_unblock |
blocked を ready へ(orchestrator 限定) |
スマートホーム(4, Home Assistant)
| ツール | 説明 |
|---|---|
ha_list_entities |
エンティティ一覧(domain / area でフィルタ) |
ha_get_state |
単一エンティティの詳細状態(属性込み) |
ha_list_services |
制御用サービス(アクション)一覧 |
ha_call_service |
サービス呼び出しでデバイス制御 |
Discord(2)
| ツール | 説明 |
|---|---|
discord |
サーバの読み取り / 参加(メンバー検索 / メッセージ取得 / スレッド作成) |
discord_admin |
サーバ管理(チャンネル / ロール一覧、ピン、ロール付与) |
Feishu / Lark(5)
| ツール | 説明 |
|---|---|
feishu_doc_read |
文書の全文をプレーンテキストで読む |
feishu_drive_list_comments |
文書のコメント一覧 |
feishu_drive_list_comment_replies |
コメントスレッドの返信一覧 |
feishu_drive_reply_comment |
ローカル(引用テキスト)コメントへ返信 |
feishu_drive_add_comment |
文書全体コメントの新規追加 |
Spotify(7)
| ツール | 説明 |
|---|---|
spotify_playback |
再生制御 / 再生状態 / 最近再生 |
spotify_devices |
Connect デバイス一覧 / 再生転送 |
spotify_queue |
キュー確認 / 追加 |
spotify_search |
カタログ検索(曲 / アルバム / アーティスト / プレイリスト / 番組 / エピソード) |
spotify_playlists |
プレイリストの一覧 / 閲覧 / 作成 / 更新 / 編集 |
spotify_albums |
アルバムのメタ / トラック取得 |
spotify_library |
保存済みトラック / アルバムの一覧 / 保存 / 削除 |
Yuanbao 元宝(5)
| ツール | 説明 |
|---|---|
yb_query_group_info |
グループ(派 / Pai)の基本情報(名前 / オーナー / 人数) |
yb_query_group_members |
グループメンバー照会(@メンション / Bot 検出用) |
yb_send_dm |
グループ内ユーザーへ DM(メディア可、名前で解決) |
yb_search_sticker |
内蔵スタンプ(表情包)をキーワード検索 |
yb_send_sticker |
内蔵スタンプ送信 |
デスクトップ(1)
| ツール | 説明 |
|---|---|
computer_use |
macOS デスクトップを背景操作(スクショ / マウス / キーボード / スクロール / ドラッグ。カーソル / フォーカスを奪わない) |
合計は 71。内訳は Web 3 + ビジョン/生成 4 + 端末/ファイル 6 + ブラウザ 12 + 計画/対話 4 + スキル 3 + 実行/委譲 3 + 音声/スケジュール/送信 3 + Kanban 9 + HA 4 + Discord 2 + Feishu 5 + Spotify 7 + Yuanbao 5 + computer_use 1 = 71。
カタログを眺めて見えてくるのは、Hermes が「汎用コア + プラットフォーム別ツール束」という構造を取っていること。Web / ファイル / ブラウザ / 実行系がコアの汎用能力で、Discord / Feishu / Spotify / Yuanbao は特定サービス向けの束だ。後者は資格情報が無ければ check_fn で無効化され、71 件すべてが常に有効なわけではない。
3. ツールセットと分布
ツールは個別に有効化するだけでなく、ツールセットとしてまとめて扱える。TOOLSETS は 57 エントリ(機能系 33 + hermes-* サーフェス / プラットフォーム 24)。includes で他セットを合成でき、バッチ実行用には確率分布を持つ(学習データ生成で多様なツール構成をサンプリングするため。第9回)。全 57 の一覧は元マップ §4.2 を参照。
4. 承認ゲート
破壊的操作には承認ゲートがかかる。DANGEROUS_PATTERNS に rm -rf / sudo / git の force 系などが登録され、これらにマッチするコマンドは承認を要求する。ハードライン(必ず止める)と、--yolo によるバイパス(全承認をスキップ)の二極があり、後者は第10回で「最大級のリスク」として扱う。
5. SSRF / パストラバーサル / サンドボックス
- SSRF 対策: クラウドのメタデータ IP(169.254.169.254 など)を常時ブロック。URL を扱うツールが内部メタデータを盗まれる古典的攻撃を塞ぐ
-
パストラバーサル対策:
Path.resolve()+relative_to()でワークスペース外への脱出を防ぐ -
サンドボックス:
execute_codeから呼べる Hermes ツールは 7 種に制限。さらに timeout 300 秒 / 50 コール / 出力 50KB / 1 ツール結果 10KB の上限を持つ(code_execution_tool.py:61)
execute_code は「Python から Hermes ツールを呼ぶ」強力な口だけに、呼べるツールを 7 種に絞り、実行時間・回数・出力量に天井を設けている。便利さと攻撃面のトレードオフを、上限値で殴って解決している格好だ。
次回はツールの中でも別格の 2 つ——delegate_task と mixture_of_agents、マルチエージェント並列を掘る。
対応マップ章: §4 / 行番号は hermes update でずれうる
クイックイタレート株式会社
IoT / 電力監視 / AI / 衛星・無線通信 / システムインテグレーション/
ローカル LLM・エージェント基盤に関するお問い合わせはお気軽にどうぞ。