はじめに
「山田さんからのメールに返信して」
そう言うだけで、AIエージェントがメールを取得し、カレンダーで空きを確認し、返信案を作成してくれます。承認ボタンを押せば送信完了。
これが、私の日常になりました。
メールの確認、Slackの未返信チェック、Notionでのタスク管理、会議準備、週次レビュー。こうした業務を、AIエージェントとの対話で処理できるようにしています。
ただし、Claude Codeはそのままでは「コーディング」はしてくれますが、「オフィスワーク」はしてくれません。「メールをチェックして」と頼んでも、Gmailにアクセスする手段を持っていないからです。
この問題を解決するために、私はCLIツールとSkillを組み合わせる方法を使いました。各種サービスを操作するCLIツールを自作し、その使い方をSkillとして定義する。さらにn8nによる定期ワークフローと組み合わせることで、多層的な自動化システムを構築しています。
本記事では、AIエージェントで業務を自動化するためのアーキテクチャと考え方を解説します。紹介するツールは公開していないため、そのまま使えるわけではありませんが、同様のシステムを構築する際の参考になれば幸いです。
なお、本記事で紹介する「AIエージェントとの協働」の背景にある考え方は、拙著『AIエージェント 人類と協働する機械』(リックテレコム)で詳しく解説しています。AIエージェントの本質や、人間との協働パターンについて興味のある方は、あわせてご覧ください。
1. システムの全体像
1.1 アーキテクチャ
私が実践しているアーキテクチャは以下のような構成です。
ポイントは、AIエージェントが「何をすべきか」の判断基準を持ち、実行はCLIに委譲するという役割分担です。
AIエージェントは:
- ユーザーの意図を理解する
- SKILL.mdの判断基準に従って計画を立てる
- 必要なCLIコマンドを組み立てて実行する
- 結果を整理してユーザーに報告する
CLIツールは:
- 特定のサービスへのアクセスを抽象化する
- コマンドラインオプションで細かい制御を可能にする
- 構造化された出力を返す
この構成により、AIエージェントに対して「メールをチェックして」「会議の準備をして」「週次レビューをまとめて」といった抽象的な指示を出すだけで、複数のサービスを横断した複雑な処理が実行されます。
1.2 3つのレイヤー構造
AIエージェントを活用した業務システムは、複数のレイヤーに跨って構成されます。
Layer 1: データ/サービスレイヤー
最下層には、データベースや外部SaaSがあります。これらへのアクセスは、CLI(noti, slakky, gog)やSQLのように、ミニマムで柔軟なQueryインターフェースと堅牢なCommandインターフェースで設計されていることが望ましいです。
- Query: データの検索・取得。柔軟なフィルタ、ソート、フォーマット指定
- Command: データの作成・更新・削除。明確な入力と確実な実行
この分離により、上位レイヤーから安全に呼び出せます。
Layer 2: ワークフローレイヤー
中間層には、n8nのようなワークフローツールがあります。固定的で繰り返しになる作業は、このレイヤーで構築します。
- 毎時のメール分類と通知
- 予定登録時の自動色付け
- 議事録の自動作成(tldv APIからNotionに自動同期)
- 定時のリマインド送信
プログラミングインターフェースを持つため、条件分岐やエラーハンドリングも組み込めます。一度作れば、人間の介入なしに動き続けます。
私が以前紹介した「しらせくん」は、まさにこのレイヤーで動いています。
Layer 3: 対話レイヤー
最上層には、AIエージェントとの対話があります。繰り返しだが、もう少しソフトな日常業務は、slash commandやエージェントとの対話で処理します。
- 「今来たメールをチェックして」→ 判断を含む確認作業
- 「会議の準備をして」→ 複数ソースからの情報収集
- 「提案された日付でカレンダーの空きを確認して、返信案を作成して」→ 確認を挟む実行
Layer 2と異なり、人間との対話を前提とします。AIが判断し、人間が承認する。この協働パターンが、Layer 3の特徴です。
レイヤー間の使い分け
| 特性 | Layer 1 | Layer 2 | Layer 3 |
|---|---|---|---|
| 実行頻度 | 随時 | 定期・イベント駆動 | 随時 |
| 人間の関与 | なし | なし | あり(対話) |
| 柔軟性 | 高(パラメータ次第) | 中(事前定義) | 高(自然言語) |
| 適する作業 | 単純なCRUD | 定型の自動化 | 判断を含む作業 |
重要なのは、すべてをAIエージェントでやろうとしないことです。
定型作業はLayer 2(ワークフロー)で自動化し、AIエージェントは判断が必要な作業に集中させる。この使い分けが、効率的なシステム設計のカギです。
1.3 なぜMCPではなくCLIなのか
AIエージェントと外部サービスを連携させる方法として、MCP(Model Context Protocol)があります。MCPを使えば、AIが直接サービスのAPIを呼び出せます。
しかし、MCPには課題があります。
コンテキスト消費が大きい
MCPはツールの定義(スキーマ)をすべてコンテキストに含める必要があります。たとえば、Notion MCPサーバーを使うと、データベース操作、ページ操作、ブロック操作など、数十のツール定義がコンテキストを占有します。
複数のサービス(Notion、Slack、Gmail、Calendar...)をMCPで接続すると、ツール定義だけで数千トークンを消費してしまいます。
なお、Claude Codeのアップデートで、MCPのコンテクスト量消費が増えると、ツール検索に一元化されるような仕組みが投入されていますが、それでもなおコンテクスト量の消費は課題に見えます。
柔軟性の制限
MCPのツールは、あらかじめ定義された操作しかできません。「このフィルタ条件でクエリしたい」「この形式で出力したい」といった細かいカスタマイズが難しく、業務に合わせた調整がしにくいです。
CLI連携のメリット
一方、CLIツール経由の連携には以下のメリットがあります。
- コンテキスト消費が最小限: CLIツールは「Bashでコマンドを実行する」という1つのツール定義だけで済みます。具体的なコマンドはプロンプトやスキルに書けばよく、ツール定義のオーバーヘッドがありません。
- 柔軟なカスタマイズ: CLIツールは自分で作っているので、業務に合わせた機能を自由に追加できます。
- 組み合わせの自由度: UnixのパイプやリダイレクトのようにCLIツールを組み合わせられます。AIエージェントが複数のコマンドを順番に実行し、前の結果を次の処理に渡すことで、複雑なワークフローを柔軟に構築できます。
# AIエージェントが生成するアドホックなパイプライン例
noti database query tasks --json | jq '.[] | select(.priority == "高")' | ...
Mike Gancarzの『UNIXという考え方』では、インターフェースを「対話的(interactive)」と「非束縛的(non-captive)」に分類しています。CLIのような非束縛的インターフェースは、AIエージェントとの連携でメリットが大きいです。AIは複数のコマンドを組み合わせ、条件分岐を挟み、結果を加工する。こうした複雑な処理を、対話的インターフェースでは実現しにくいからです。
2. 活用事例
ここからは、複数のツールを組み合わせた活用事例を紹介します。単体のツールでは難しい、文脈を理解した判断や横断的な情報収集が可能になります。
2.1 メールへの返信作成
メールの分類と優先度判定は、n8nワークフロー(しらせくん)が毎時実行し、返信が必要なものをSlackに通知してくれます。AIエージェントの出番は、その返信を作成するときです。
「山田さんからの日程変更メールに返信したい」
AIエージェントは以下のコマンドを実行します:
# メール内容の取得
gog gmail search "from:yamada" --account work@example.co.jp
gog gmail thread <thread_id> --account work@example.co.jp
# カレンダーの空き確認
gog calendar events --from 2026-02-10 --to 2026-02-10
山田さん(ABC社)からのメール:
> 来週2/10(月)10:00からの定例ですが、
> 11:00開始に変更をお願いできますでしょうか。
カレンダーを確認しました:
- 2/10 10:00-11:00: 空き
- 2/10 11:00-12:00: 空き
11:00開始で問題ありません。
返信案:
---
山田さま
ご連絡ありがとうございます。
11:00開始で承知いたしました。
引き続きよろしくお願いいたします。
---
送信してよろしいですか?
承認後、AIエージェントが送信を実行します:
gog gmail send --to yamada@abc-corp.co.jp --subject "Re: 来週のMTGについて" \
--body "山田さま\n\nご連絡ありがとうございます。..."
AIエージェントの動作フロー
ポイントはカレンダーとメールを横断して判断することです。日程調整メールなら自動でカレンダーを確認し、空き状況を踏まえた返信案を提示してくれます。
2.2 Slack未返信確認
メールの次はSlackです。
「Slackの未返信を確認して」
## Slack未返信確認
### 高優先度(要返信)
1. **#proj-abc** @自分 (昨日 18:30)
> 来週の定例、火曜から水曜に変更できますか?
→ 日程確認の質問。返信必要。
2. **DM: 佐藤さん** (今日 8:15)
> 先日の資料、いつ頃共有いただけますか?
→ 期限付き依頼。返信必要。
### 中優先度(確認のみ)
3. **#invoice** 田中さん (昨日 17:00)
> ABC社さまの請求書、送付完了しました
→ 報告のみ。確認済みでOK。
### 対応不要
- **#error** n8n通知 (今日 3:00) - 自動通知
- **#tweet** 投稿通知 (今日 8:05) - 自動通知
AIエージェントの動作フロー
Slackチェックも複数ステップを自動実行しています。
/slack-check スキルが動き、以下のように整理してくれます。

特に便利なのは、アシスタントが既に対応しているかどうかをスレッドまで見て判断してくれる点です。表面的な未読だけでなく、文脈を理解した上で「返信が必要か」を判定します。
実際に20件のメンションを確認した結果、「返信が必要なもの: なし」という結論になることも多いです。すべて自動通知か、既に対応済みか、情報共有のみだったためです。
この 「返信不要」という判断を自動でしてくれるのが、手動確認との大きな違いです。
2.3 過去の意思決定の確認
Notionに蓄積された議事録から、過去の意思決定を引き出すこともできます。
「ABC社の請求書、いくらで合意したっけ?」
議事録を検索しました。
## ABC社 請求関連の決定事項
### 2026-01-15 営業MTG
- 月額顧問料: XX万円(税別)
- 支払いサイト: 月末締め翌月末払い
- 初回請求: 2月末
### 2025-12-20 契約更新MTG
- 2026年度も継続で合意
- 料金据え置き
---
請求書を作成しますか?
使用ツールの連携
noti database query → 議事録DBから検索
noti page get → 該当ページの詳細取得
「あの件、どうなったっけ?」という曖昧な質問にも、Notionの議事録を横断検索して回答してくれます。人間の記憶に頼らず、過去の意思決定を正確に引き出せるのは大きなメリットです。
3. ツールとスキルの構成
3.1 CLIツール一覧
業務に必要なサービス操作のために、複数のCLIツールを用意しています。
自作ツール
| ツール | 用途 | 技術 |
|---|---|---|
noti |
Notion操作 | TypeScript + Notion API |
slakky |
Slack操作 | TypeScript + Slack API |
contacts |
連絡先管理 | TypeScript + SQLite |
messup |
Messenger操作 | TypeScript + Playwright |
n8ncli |
n8nワークフロー管理 | TypeScript + n8n API |
外部ツール
| ツール | 用途 |
|---|---|
gog |
Google Workspace操作(gogcli.sh) |
代表例: noti(Notion操作)
Notion操作のためのCLIツールです。(GitHub)
# データベースクエリ
noti database query <db_id> --filter "ステータス!=完了" --sort "期限:asc"
# エイリアス設定(頻繁にアクセスするDBに名前をつける)
noti alias set tasks <db_id>
noti database query tasks
Claude Codeのスキルとして登録すると、自然言語でNotionを操作できます。
「今日のタスクを教えて」
## タスク一覧(未完了)
| タスク | 期限 | 優先度 | ステータス |
|--------|------|--------|----------|
| ABC社提案書レビュー | 今日 | 高 | 進行中 |
| Qiita記事執筆 | 明日 | 中 | 未着手 |
| 経費精算 | 今週中 | 低 | 未着手 |
内部的には noti database query <db_id> --filter "ステータス!=完了" が実行されています。データベースIDやプロパティ名を覚える必要はありません。スキルに業務固有の情報を書いてあるからです。
slakky(Slack操作)
Slack操作のためのCLIツールです。メッセージの投稿、検索、メンション確認、スレッド取得などをコマンドラインから実行できます。
# チャンネル一覧
slakky channels
# メッセージ投稿
slakky post <channel> "<message>"
# スレッド返信
slakky reply <channel> <thread_ts> "<message>"
# メンション確認
slakky mentions --limit 20
# 未読確認
slakky unreads
# メッセージ検索
slakky search "<query>"
自然言語での操作例:
「#generalに『今日の定例は15時からです』と投稿して」
投稿しました:
- チャンネル: #general
- メッセージ: 今日の定例は15時からです
- 時刻: 2026-02-03 10:30
スキルには「メンションは <@USER_ID> 形式で書く」「アシスタントのIDはUXXXXXXXX」といった業務固有の知識が書いてあるので、「田中さんにメンションして」と言えば適切な形式に変換してくれます。
contacts(連絡先管理)
名刺交換した連絡先を管理するためのCLIツールです。ローカルのSQLiteデータベースに連絡先を保存し、高速な検索を実現しています。
# 連絡先検索
contacts search "田中"
# 連絡先追加
contacts add --name "佐藤花子" --company "XYZ株式会社" --email "sato@xyz.co.jp"
# Google Contactsからインポート
contacts import google-contacts.csv
# Eightからインポート
contacts import eight-export.csv
Google ContactsやNotionにも連絡先機能はありますが、以下の理由でローカルDBを選択しました。
- 高速な検索: ローカルDBは数ミリ秒で応答
- オフライン動作: ネットワーク不要
- 複数ソースの統合: Google Contacts、名刺管理アプリなどからインポート
自然言語での検索例:
「ABC社の田中さんの連絡先を教えて」
## 田中一郎
**会社:** 株式会社ABC
**役職:** 開発部長
**メール:** tanaka@abc-corp.co.jp
**電話:** 03-1234-5678
**タグ:** クライアント, エンジニア
**メモ:** 2024年から技術顧問契約。毎週定例MTG。
messup(Messenger操作)
仕事関係の一部のやり取りでFacebook Messengerを使っていますが、MessengerにはパブリックAPIがありません。そこで、Playwrightでブラウザを自動操作するCLIツールを自作しました。
大量送信などはできない仕組みになっており、あくまでブラウザ操作を代行してメッセージの確認と応答のために使うものです。
# ログイン(初回のみ)
messup login
# 会話一覧
messup list
# メッセージ読み取り
messup read <conversation_id>
# メッセージ送信
messup send <conversation_id> "メッセージ"
自然言語での操作例:
「Messengerの未読メッセージをまとめて、返信案を考えて」
AIエージェントは以下のコマンドを実行します:
# 未読のある会話を取得
messup list --unread
# 各会話の詳細を取得
messup read <conversation_id>
## 未読メッセージまとめ
### 取引先 佐藤さん (今日 9:30)
来週の打ち合わせ、オンラインでも大丈夫ですか?
→ 返信案: 「オンラインで問題ありません。こちらのMeets URLでいかがでしょうか?」
### 友人 田中 (昨日 22:30)
来週の飲み会、参加できる?
→ 返信案: 「参加します!場所決まったら教えて」
---
これらの返信を送信しますか?
使う側はPlaywrightのことを意識する必要はありません。Skillには、1PasswordのCLI(op)を使ってログイン時に安全に認証情報をやり取りする方法が書かれています。
n8ncli(n8nワークフロー管理)
n8nワークフローの管理のためのCLIツールです。ワークフローのエクスポート、インポート、有効化/無効化、実行履歴の確認などを実行できます。
n8nは普段GUIで使っていますが、バックアップや細かな修正、新しい機能を一気に作るときには、ワークフローをJSON形式で管理するのがおすすめです。
# ワークフロー一覧
n8ncli wf ls --active true --table
# ワークフロー詳細
n8ncli wf get <workflow_id>
# エクスポート
n8ncli wf export <workflow_id> -o workflow.json
# インポート(リストア)
n8ncli wf import workflow.json
# 有効化/無効化
n8ncli wf activate <workflow_id>
n8ncli wf deactivate <workflow_id>
# 実行履歴
n8ncli exec ls --limit 10
gog(Google Workspace操作)
Google Workspace操作には、gogというCLIツールを使っています。Gmail、Calendar、Drive、Sheetsなどを統一的に操作できます。
「今週の予定を教えて」
gog calendar events --from 2026-02-03 --to 2026-02-07
## 今週の予定 (2/3〜2/7)
### 2/3 (月)
- 10:00-11:00 ABC社定例 [コンサル]
- 14:00-15:00 社内MTG [内部]
### 2/4 (火)
- 終日 移動日(大阪出張)[移動]
### 2/5 (水)
- 13:00-14:00 登壇: AI活用セミナー [イベント]
- 18:00-20:00 懇親会 [会食]
### 2/6 (木)
- 予定なし
### 2/7 (金)
- 11:00-12:00 XYZ社定例 [コンサル]
予定には自動で色分けがされています。これはn8nワークフロー(しらせくん)がAIで予定を分類し、Google Calendarの色を更新しているからです。
3.2 スキルの役割
スキルはCLIツールとAIエージェントをつなぐ「判断基準」です。
| スキル | 対応ツール | 主な操作 |
|---|---|---|
/noti |
noti(自作) | タスク、議事録、記事管理 |
/slakky |
slakky(自作) | メッセージ、メンション確認 |
/contacts |
contacts(自作) | 名刺情報管理 |
/messup |
messup(自作) | 家族連絡 |
/n8ncli |
n8ncli(自作) | ワークフロー管理 |
/gog |
gog(外部) | メール、カレンダー、ドライブ |
定型業務はコマンドとして定義しています。
| コマンド | 内容 | 使用ツール |
|---|---|---|
/mail-check |
両アカウントの未読確認 + 優先度分類 | gog |
/slack-check |
未返信メッセージ確認 + 対応要否判定 | slakky |
3.3 n8nワークフローのGit管理
すべてのn8nワークフローはJSONファイルとしてエクスポートし、Gitリポジトリで管理しています。
# 全ワークフローをエクスポート
n8ncli wf export --all --output workflows/
# Git管理
git add workflows/
git commit -m "Backup n8n workflows"
これにより、以下のメリットがあります。
- バージョン管理: 変更履歴を追跡できる
- レビュー: ワークフローの変更をPRでレビューできる
- 復元: 問題が起きたら以前のバージョンに戻せる
- ドキュメント化: リポジトリがワークフローの一覧になる
- AIとの連携: CLIからの実行テストや、n8nスキルを用いた新規ワークフロー作成ができる
- デバッグ: 実行エラーをAIに読ませて、修正案を提示させることもできる
リポジトリ構成例
officework/
├── n8n-workflows/ # n8nワークフローのJSON
│ ├── CLAUDE.md # ワークフロー操作の判断基準
│ ├── README.md # ワークフロー一覧と説明
│ ├── 01-email-check.json
│ ├── 02-schedule.json
│ ├── 03-tweet-post.json
│ └── ...
├── .claude/
│ ├── skills/ # Claude Codeスキル
│ └── commands/ # ルーティンコマンド
└── docs/ # 業務ドキュメント
├── notion-databases.md
└── slack-channels.md
4. 業務を言語化する
4.1 判断基準の言語化
スキルの本質は業務の判断基準の言語化です。
「重要なメールを教えて」と言われたとき、AIは「重要」の定義を知りません。しかし、SKILL.mdに以下のように書いておけば、一貫した判断ができます。
## 返信必要と判定するメール
- 送信者がクライアント一覧に存在する
- 件名に「ご確認」「お願い」「至急」を含む
- 本文に期限が明示されている
## 返信不要と判定するメール
- 送信者が noreply@ で始まる
- 松野さんがスレッドで既に返信している
- Slack, GitHub, Calendar からの自動通知
4.2 業務知識のカプセル化
「アシスタントのSlack IDは何か」「タスク一覧のNotion IDは何か」といった業務固有の知識は、すべてスキルにカプセル化されています。
使う側は「田中さんにメンションして」と言えばいい。IDを覚える必要はありません。
4.3 一貫性の担保
人間が毎回判断すると、日によってブレます。疲れているときは雑になるし、余裕があるときは丁寧になる。
スキルに判断基準を書いておけば、AIは常に同じ基準で判断します。これは品質の一貫性という点で大きなメリットです。
4.4 小さく始める
いきなり全部を自動化しようとしないでください。まずは一番面倒な定型業務を一つ選びましょう。
私の場合は「空いている予定の回答」でした。「来週のどこかで打ち合わせできますか?」というメールに返信するたびに、カレンダーを開いて空きを確認し、またメールに戻って返信を書く。この往復が面倒でした。
カレンダーとメールを横断する作業は、AIエージェントの得意分野です。
4.5 例外を許容する
完璧を目指さないでください。「90%は自動判定で、10%は自分で判断」で十分です。
AIの判定が間違っていたら、その都度修正すればいい。修正が多い判定基準は、SKILL.mdを更新すればいい。
5. 運用から得た学び
このシステムを作り、運用する中で得た学びをまとめます。
5.1 レイヤー分離の重要性
最初はしらせくん(n8n)の業務も含めて「AIエージェントですべてやろう」と考えていました。しかし、実際に運用してみると、それは非効率でした。
定型作業はワークフローに任せる
「毎朝8時にメールを分類してSlackに通知」のような固定的な作業は、n8nで組んだ方が確実です。AIエージェントは毎回コンテキストを消費しますが、n8nは決められた処理を淡々と実行します。
繰り返しの処理や大量のデータ処理は、AIエージェントは苦手です。一方、ワークフローはそういった処理が得意です。
これらのワークフローもほとんど自動で作成・デプロイできるため思いついた順に自動化していくことができます。
AIエージェントは判断が必要な場面で使う
「このメールは返信すべきか」「この会議に必要な情報は何か」といった判断を含む作業こそ、AIエージェントの出番です。
レイヤーを分けることで、それぞれの強みを活かせます。
5.2 CLIインターフェースの設計原則
CLIツールを作る際に意識したのは、QueryとCommandの分離です。
- Query: データを取得する。副作用なし。柔軟なフィルタとフォーマット
- Command: データを変更する。明確な入力と確実な実行
この分離があると、AIエージェントが安心してQueryを実行できます。「間違えて削除してしまった」という事故を防げます。
また、CLIの出力は構造化を意識しました。JSON出力をサポートすることで、AIが結果を正確にパースできます。人間向けの整形出力と、プログラム向けのJSON出力を切り替えられるようにしています。
5.3 すべてをAIエージェントでやらない
AIは万能ではありません。特に以下の作業は、AIエージェントより専用ツールの方が適しています。
AIエージェントに必要な処理を作らせてでも、これらの処理は確実な処理にしておくべきです。
AIエージェントは、既存のソフトウェアよりももう少し柔らかい領域でこそ真価を発揮します。既存のソフトウェアのように結晶化して、繰り返す価値があるものであれば、既存のソフトウェア的なアプローチにまかせるべきです。
- 定期実行: cron、n8nの方が確実
- 大量データ処理: SQLやスクリプトの方が高速
- リアルタイム監視: 専用のモニタリングツールの方が適切
AIエージェントは「判断を含む作業を、人間の代わりに実行する」ことに特化させる。それ以外は、適切なツールに任せる。この割り切りが大事です。
5.4 判断基準は進化する
最初に書いたSKILL.mdは、運用しながら更新し続けています。
- 「この条件でも高優先度にすべきだった」→ 条件を追加
- 「この判定は厳しすぎた」→ 条件を緩和
- 「新しいクライアントが増えた」→ リストを更新
判断基準は一度書いて終わりではありません。運用しながら育てていくものです。
5.5 人間のレビューを残す
効率を追求しすぎて、人間のチェックを完全になくすのは危険です。
私のシステムでは、以下の場面で必ず人間の確認を挟んでいます。
- メールの送信前
- Slackへの返信前
- タスクの完了マーク
- 請求書の送付
「AIが判断し、人間が承認する」このパターンを基本にすることで、ミスを防ぎつつ効率化を実現しています。
おわりに
AIエージェントとの協働で最も重要なのは、自分の仕事の判断基準を言語化することです。「何を重要と判断するか」「何を優先するか」「何を無視していいか」。これを明確にできれば、AIは忠実に再現してくれます。毎日、毎時間、疲れることなく。
本記事で紹介したシステムは、私の業務に合わせたものです。あなたの業務には、あなたの判断基準があるはずです。まずは「面倒だけど、パターンがある」業務を一つ選んで、その判断基準を言葉にしてみてください。AIとの協働は、そこから始まります。







