退職・異動の人事データを起点に、各SaaSのアカウントと権限の残りをエージェントが確かめ、停止漏れの一覧と停止依頼票を作る
人事が退職・異動を登録するたびに、その人が使っていたSaaSを台帳から割り出し、エージェントが各SaaSのアカウントと権限がまだ残っていないかを確かめます。止めるべきものは停止漏れの一覧にし、SaaSの管理者あての停止依頼票を作ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- IT・SaaS/人材/広告/金融
- 対象部門
- 人事/情報システム
- 対象業務
- 内容確認・チェック/台帳・マスタ管理
- 主な課題
- 人手が足りない/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- エージェント
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 人事部が人事システムに退職・異動を登録し、情報システム部へメールで知らせる
- 担当者がメールを読み、対象者の氏名、社員番号、最終出社日または異動日、異動先を確かめる
- SaaSの利用者の台帳と過去の申請記録から、その人が使っていたSaaSを洗い出す
- SaaSごとに管理画面を開き、その人のアカウントが残っているか、どの権限を持っているかを見る
- 異動なら、異動先で要らない権限がどれかを、異動先の部署の標準の権限と見比べて決める
- 止めるべきアカウントと外すべき権限を表にし、SaaSの管理者ごとに停止依頼のメールを書く
- 停止が終わったら、管理者からの返信を見て台帳を直す
- 人人事部が人事システムに退職・異動を登録する
- 自動登録をきっかけに n8n のワークフローが動き、対象者の社員番号、メールアドレス、日付、異動先を取る
- 自動SaaSの利用者の台帳と申請記録から、その人が使っていたSaaSの候補を出す
- 自動エージェントが、読み取り専用の道具で各SaaSのアカウントと権限を1つずつ確かめる
- 自動ID管理の基盤のサインインの記録から、台帳に無いSaaSの利用の手がかりを探す
- 自動退職か異動か、日付を過ぎたかで、ワークフローが規則で `must_stop` / `must_revoke` / `keep` / `unverified` を付ける
- 自動`must_stop` と `must_revoke` について、SaaSの管理者ごとに停止依頼票の下書きを作る
- 人情報システム部の担当者が一覧を見て、`unverified` のものを管理画面で確かめる
- 人停止依頼票を確かめてSaaSの管理者へ送る。止めるのは管理者
- 自動停止の期限を過ぎたら、同じ道具で状態を確かめ直し、残っていれば担当者に知らせる
各工程の詳しい説明を読む
- 人事部が人事システムに退職・異動を登録し、情報システム部へメールで知らせる
- 担当者がメールを読み、対象者の氏名、社員番号、最終出社日または異動日、異動先を確かめる
- SaaSの利用者の台帳と過去の申請記録から、その人が使っていたSaaSを洗い出す
- SaaSごとに管理画面を開き、その人のアカウントが残っているか、どの権限を持っているかを見る
- 異動なら、異動先で要らない権限がどれかを、異動先の部署の標準の権限と見比べて決める
- 止めるべきアカウントと外すべき権限を表にし、SaaSの管理者ごとに停止依頼のメールを書く
- 停止が終わったら、管理者からの返信を見て台帳を直す
(a)止め忘れたアカウントが残る。 3番目の洗い出しは、台帳と申請記録を頼りにしています。台帳に載っていない使い方(部署で勝手に始めた無料プランや、共用のアカウント)は、ここで漏れます。 漏れたアカウントは、次の棚卸しまで誰も気づきません。
(b)SaaSごとに見る場所が違う。 管理画面の作りはSaaSの数だけあり、「停止」「無効」「アーカイブ」「削除」の意味もそれぞれ違います。画面で「停止済み」に見えても、管理者の権限だけが残っていることがあります。
(c)異動の確認がいちばん難しい。 退職なら全部止めれば済みますが、異動は残す権限と外す権限を分ける必要があります。異動元の部署の共有フォルダや、SFAの顧客データの閲覧権限が、異動後も残りやすくなります。
(d)発生のたびに1人1時間かかる。 40件で月40.0時間です。繁忙期にはまとめて処理するようになり、発生から確認までの日数が延びます。
- 【人】 人事部が人事システムに退職・異動を登録する
- 【自動】 登録をきっかけに n8n のワークフローが動き、対象者の社員番号、メールアドレス、日付、異動先を取る
- 【自動】 SaaSの利用者の台帳と申請記録から、その人が使っていたSaaSの候補を出す
- 【自動】 エージェントが、読み取り専用の道具で各SaaSのアカウントと権限を1つずつ確かめる
- 【自動】 ID管理の基盤のサインインの記録から、台帳に無いSaaSの利用の手がかりを探す
- 【自動】 退職か異動か、日付を過ぎたかで、ワークフローが規則で
must_stop/must_revoke/keep/unverifiedを付ける - 【自動】
must_stopとmust_revokeについて、SaaSの管理者ごとに停止依頼票の下書きを作る - 【人】 情報システム部の担当者が一覧を見て、
unverifiedのものを管理画面で確かめる - 【人】 停止依頼票を確かめてSaaSの管理者へ送る。止めるのは管理者
- 【自動】 停止の期限を過ぎたら、同じ道具で状態を確かめ直し、残っていれば担当者に知らせる
4番目と6番目を分けているのが、この設計の要点です。 エージェントは「このSaaSにこの人のアカウントがあり、この権限を持っている」という事実を集めるだけで、止めるべきかどうかは規則が決めます。 退職日の翌日に全部止める、異動は異動先の標準の権限表に無いものを外す、という規則は会社の決まりで、後から変わるからです。
10番目の確かめ直しで、依頼を出しっぱなしにしません。 依頼を送ったことと、止まったことは別です。
02今回想定するシステム構成
人事システム(退職・異動の登録) │ ▼【トリガー】登録の通知(Webhook)/毎朝の定時実行(取りこぼしの拾い直し) n8n のワークフロー ├──▶ 対象者の情報を取る(社員番号・メール・日付・異動先) ├──▶ SaaSの利用者の台帳・申請記録から候補のSaaSを出す ▼ n8n AI Agent ノード(Tools Agent)+ Claude API │ 道具(すべて読み取り専用) │ ・Entra ID のユーザーを引く(Microsoft Graph) │ ・Google Workspace のユーザーを引く(Directory API) │ ・管理APIのあるSaaSの利用者を引く(HTTP Request の道具) │ ・SaaSの台帳と部署の標準の権限表を引く ▼ Code ノード ── 規則で判定(must_stop / must_revoke / keep / unverified) ▼ 停止漏れの一覧(SaaSごと・対象者ごと) ├──▶ 停止依頼票の下書き(SaaSの管理者ごと) └──▶【人が確認して送付】→ 期限後に再確認
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n(AI Agent ノード) | Make、Zapier、Power Automate |
| 生成AI | Claude API | OpenAI API、Gemini API |
| ID管理 | Microsoft Entra ID(Microsoft Graph) | Google Workspace(Directory API) |
| 台帳 | SaaSの利用者の台帳・部署の標準の権限表 | IT資産管理の製品 |
| 通知 | 社内チャット・メール | チケット管理の製品 |
人事システム、ID管理の基盤、SaaSの台帳は、新しく足すものではありません。 足すのは、台帳に「そのSaaSに管理APIがあるか」「利用者を何で引くか(メール/社員番号)」「管理者は誰か」の3列と、部署ごとの標準の権限表です。この2つの整備が最初の準備作業になります。
中心に置くのは、n8n の AI Agent ノードの Tools Agent です。 外部の道具やAPIを使って情報を取り、タスクに応じてどの道具を使うかを判断するとされています。道具はサブノードとしてつなぎ、HTTP リクエストの道具も選べます。繰り返しの上限(Max Iterations)は既定で10です。
エージェントにする理由は、確かめる順番が人によって違うからです。 ある人は3種類、別の人は12種類のSaaSを使っています。メールアドレスで見つからなければ社員番号で引き直す、Entra ID に無ければ Google Workspace を見る、という引き直しの判断が要ります。決まった順に全部の道具を呼ぶワークフローでは、この引き直しが書けません。
判定をエージェントの外に出すのは、止める理由を規則に置くためです。 エージェントが集めた事実を Code ノードに渡し、日付の比較と権限表との突き合わせで判定を決めます。
03どうやって実装するのか
処理の起点を決める
人事システムに退職・異動が登録されたことを起点にします。 人事システムが登録の通知を Webhook で送れるなら、それを n8n で受けます。送れない場合は、人事システムから毎朝出力される退職・異動の一覧を読みます。
Webhook を使う場合も、毎朝の定時実行を残します。 通知が届かなかった登録を拾い直すためです。毎朝、前日までに登録された退職・異動と、処理済みの記録を突き合わせ、処理されていないものだけを流します。
確かめる日は1回ではありません。 退職は登録した日に一度、最終出社日の翌日にもう一度確かめます。登録の時点ではまだアカウントを使っているのが正常で、止まっていないことが問題になるのは最終出社日を過ぎてからです。 異動も、異動日の前と後で2回確かめます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 退職・異動の登録 | 社員番号、氏名、メール、種別(退職/異動)、最終出社日または異動日、異動元と異動先の部署 | 人事システム |
| SaaSの利用者の台帳 | SaaS名、利用者、管理APIの有無、利用者を引く鍵、管理者 | 情報システム部の台帳 |
| 申請記録 | いつ、誰が、どのSaaSのどの権限を申請したか | 申請の記録 |
| 部署の標準の権限表 | 部署ごとに、どのSaaSのどの権限を持つのが標準か | 情報システム部と各部署で作る表 |
| 各SaaSの状態 | アカウントの有無、停止の状態、権限、最後のログイン | ID管理の基盤と各SaaSの管理API |
質を決めるのは、台帳の「利用者を引く鍵」の列です。 SaaSによって、利用者をメールアドレスで引けるもの、独自のIDでしか引けないもの、表示名でしか探せないものがあります。鍵が分かっていれば、エージェントは最初から正しい引き方で道具を呼べます。
部署の標準の権限表は、異動のためだけに要ります。 異動先の標準に無い権限が、外す候補になります。この表が無いと、異動の確認は「全部残っている」としか言えません。
データの取得方法を決める
エージェントに渡す道具は4つで、すべて読み取りだけです。
| 道具 | 何を引くか | 使うAPI |
|---|---|---|
get_entra_user | アカウントの有無、accountEnabled、部署、最終の退職日時 | Microsoft Graph のユーザー取得 |
get_google_user | suspended、archived、lastLoginTime、isAdmin | Google Workspace の Directory API |
get_saas_user | 管理APIのあるSaaSでの、アカウントの有無と権限 | 各SaaSの管理API(HTTP Request の道具) |
get_ledger | 台帳の行、申請記録、部署の標準の権限表 | 情報システム部の台帳 |
Microsoft Graph のユーザー取得は、既定では一部のプロパティしか返しません。 既定で返るのは表示名やメールなど限られたもので、それ以外は $select でプロパティを指定する必要があるとされています。accountEnabled や部署は、$select に書かないと返りません。
アクセス許可は、アプリケーションの許可で User.Read.All が最小とされています。 退職日時の employeeLeaveDateTime を読むには User-LifeCycleInfo.Read.All が別に要るとされています。accountEnabled の読み書きの最小の組み合わせは User.EnableDisableAccount.All と User.Read.All とされていますが、この構成は書き込みをしないので、書き込みの許可は付けません。 読み取りに要る許可は、自社の環境で確かめてください。
ユーザーが存在しなければ、404 Not Found が返るとされています。これは「アカウントが無い」という情報で、エラーではありません。道具の側で 404 を not_found という結果に直してから、エージェントに返します。
Google Workspace の Directory API では、ユーザーの suspended が停止の状態を表します。 suspensionReason は suspended が真の場合だけ返り、lastLoginTime は ISO 8601 形式の日時とされています。スーパー管理者かどうかの isAdmin、委任管理者かどうかの isDelegatedAdmin もあります。停止されていても管理者の印が残っていないかは、この2つで見ます。
Directory API には、delete、update、signOut などのメソッドもあります。 道具に割り当てる認証情報は読み取りの範囲に限り、get と list 以外を呼べない形にします。
AIへ渡す前に整形する
- 対象者の鍵をそろえる … 社員番号、メールアドレス、旧姓のメールアドレス、別名を1つの表にまとめます
- 候補のSaaSを絞る … 台帳と申請記録から、その人が使っていたSaaSを出します。全社で使うSaaSは、台帳に無くても必ず候補に入れます
- 日付の段階を決める … 最終出社日または異動日と、今日の日付を比べ、「前」か「後」かを決めます
- 標準の権限表を引く … 異動なら、異動元と異動先の部署の標準の権限を取ります
- API の無いSaaSを分ける … 台帳で管理APIが無いものは、エージェントに回さず
unverifiedの候補にします - 同じ人の重複を除く … 異動と退職が同じ月に続けて登録された場合は、新しいほうだけを流します
1番目を軽く見ないでください。 結婚などでメールアドレスが変わった人は、古いアドレスでSaaSに登録されたままのことがあります。新しいアドレスで引いて「無い」と出ても、古いアドレスで残っています。
3番目の日付の段階は、エージェントに渡さず、ワークフローが決めます。 日付の比較をエージェントに任せると、最終出社日の前に「止まっていない」と判定することがあります。
AIに処理させる
させるのは、候補のSaaSごとに正しい道具と引き方を選び、アカウントと権限の状態を集めて、決まった形で返すことだけです。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 道具の選択 | 台帳の鍵に合わせて、どの道具をどの引数で呼ぶかを決める | 鍵が分からなければ unverified |
| 引き直し | メールで見つからなければ社員番号・旧アドレスで引き直す | 全部で見つからなければ not_found |
| 状態の読み取り | 有効か停止か、どの権限か、最後のログインはいつか | 値が返らなければ unknown |
| 手がかりの報告 | 台帳に無いSaaSを、ID管理の基盤のサインインの記録から挙げる | 挙げるだけ。確かめたことにしない |
| 停止依頼票の下書き | must_stop と must_revoke の行から、管理者ごとの文面を作る | 規則が付けた判定をそのまま使う |
| させないこと | 理由 |
|---|---|
| アカウントを止める・権限を外す | 止めるかどうかは会社の決まりと管理者の判断。道具を持たせない |
| 止めるべきかの判定 | 規則が決める。退職日・異動日と権限表で機械的に決まる |
| 見つからなかったSaaSを「問題なし」にする | 見つからないことと、無いことは違う |
| 異動後に残す権限の範囲を決める | 部署の標準の権限表と、異動先の上長が決める |
| 台帳を書き換える | 台帳の直しは停止の後に人が行う |
3行目がいちばん起きやすい失敗です。 道具が何も返さなかったとき、エージェントは「このSaaSにアカウントはありません」とまとめたくなります。引き方が誤っていただけのアカウントが、そのまま残ります。
指示内容を固定する
あなたは情報システム部で、退職・異動した社員のSaaSのアカウントが
残っていないかを確かめる担当です。止める作業はしません。確かめるだけです。
【対象者】{employee} ← 社員番号・メール・旧アドレス・種別・日付・部署
【候補のSaaS】{candidate_saas} ← 台帳の行(利用者を引く鍵・管理APIの有無)
【日付の段階】{phase} ← before_last_day / after_last_day
【進め方】
1. 候補のSaaSを1つずつ確かめてください。台帳にある「利用者を引く鍵」で
道具を呼んでください。
2. 見つからないときは、社員番号、旧アドレスの順に引き直してください。
それでも見つからなければ found を not_found にしてください。
3. Entra ID と Google Workspace は、候補に無くても必ず確かめてください。
4. 返った値だけを書いてください。値が返らない項目は unknown にしてください。
【厳守事項】
- 見つからなかったことを「アカウントは無い」と言い換えないでください。
not_found と、どの鍵で引いたかをそのまま書いてください。
- 停止済みに見えても、管理者の権限(isAdmin、isDelegatedAdmin、
各SaaSの管理者ロール)が残っていれば、その値を書いてください。
- 止めるべきかどうかを書かないでください。判定は後で行います。
- 道具が返した値を推測で補わないでください。
- 台帳に無いSaaSの手がかりは hints に挙げるだけにしてください。
- 同じ道具を同じ引数で2回呼ばないでください。
「見つからなかったことを、無いと言い換えない」を明記しないと、まとめの文で消えます。 道具の結果には not_found と書かれていても、最後の要約で「残っているアカウントはありませんでした」と書きます。禁じるのは、要約の段階での言い換えそのものです。
「同じ道具を同じ引数で2回呼ばない」は、繰り返しの上限のためです。 Max Iterations の既定は10です。候補のSaaSが多い人では、同じ呼び出しを繰り返すと、全部を確かめる前に上限に届きます。 上限は、候補の数に合わせて広げます。
出力形式を固定する
エージェントの出力は、出力パーサーで次の形の JSON に固定します。
{
"employee_id": "",
"event": "leave | transfer",
"phase": "before_last_day | after_last_day",
"checks": [
{
"saas": "",
"lookup_key_used": "email | employee_id | old_email",
"found": "found | not_found | unverified",
"account_state": "active | suspended | archived | deleted | unknown",
"roles": [],
"admin_role_remaining": "yes | no | unknown",
"last_login": "",
"evidence": ""
}
],
"hints": [ { "saas": "", "source": "", "detail": "" } ]
}
1つ目の理由は、事実と判定を別の層に置けることです。 checks はエージェントが埋め、判定は Code ノードが規則で付けます。
| 条件 | 判定 |
|---|---|
退職で、最終出社日の後に active または admin_role_remaining が yes | must_stop |
異動で、異動先の標準の権限表に無い権限が roles にある | must_revoke |
| 上のどちらにも当たらない | keep |
found が not_found または unverified、account_state が unknown | unverified(人が見る) |
2つ目は、lookup_key_used で引き方を後から確かめられることです。 not_found の行を人が見るとき、どの鍵で引いて見つからなかったのかが分かれば、別の鍵で引き直すだけで済みます。
3つ目は、admin_role_remaining を独立の欄にしたことです。 停止済みでも管理者の印が残っているものは、ほかの欄に埋もれると見落とします。
Tools Agent では、決まった出力の形を求める設定を有効にすると、出力パーサー(Structured など)をつなぐ必要があるとされています。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 人事システム | Webhook または毎朝の一覧の読み取り | 退職・異動の登録を受ける |
| Microsoft Entra ID | Microsoft Graph(読み取りの許可のみ) | ユーザーの状態を引く |
| Google Workspace | Directory API(読み取りの範囲のみ) | ユーザーの停止の状態と管理者の印を引く |
| 管理APIのあるSaaS | HTTP Request の道具(読み取りのみ) | 利用者の有無と権限を引く |
| 台帳 | 表の読み取り | 候補のSaaS、鍵、管理者、標準の権限表 |
| 社内チャット・メール | n8n の送信ノード | 一覧の通知と、承認後の停止依頼票の送付 |
どのつなぎ先にも、書き込みの権限を渡しません。 停止の API を呼べる認証情報を n8n に置かないことが、エージェントが止めてしまう経路を物理的に無くす方法です。
停止依頼票の送付は、人の承認を挟みます。 n8n には、AI Agent が特定の道具を実行する前に人の承認を求める仕組みがあり、Slack、Microsoft Teams、Gmail、Microsoft Outlook などで承認の依頼を送れるとされています。承認すればAIが指定した入力で道具が実行され、拒否すれば取り消されて実行されないとされています。依頼票を送る道具にこの承認を付け、担当者が文面と宛先を確かめてから送ります。
人が確認する
人が見るのは、判定が付いた一覧の全件です。 件数は月40件で、1件の一覧は数行から十数行です。
unverifiedを先に見る … 管理APIの無いSaaSと、見つからなかったもの。管理画面で直接確かめますmust_stopとmust_revokeの根拠を確かめる …evidenceを読み、止める対象が正しい人か、同姓同名の別人でないかを見ますhintsを見る … 台帳に無いSaaSの手がかり。本当に使っていたら台帳に足し、確かめる対象に加えます- 停止依頼票を承認して送る … 宛先の管理者と期限を確かめます
- 判定を覆したら記録する …
keepをmust_stopにした、またはその逆の理由を残します
2番目の「別人でないか」を省かないでください。 同じ表示名の社員がいる会社では、表示名で引くSaaSで別人のアカウントが返ることがあります。別人のアカウントを止める依頼は、その人の業務を止めます。
例外に対処する
| 起きること | 対応 |
|---|---|
| SaaSに管理APIが無い | unverified。担当者が管理画面で確かめる |
| どの鍵で引いても見つからない | not_found として unverified に回す。「無い」とは扱わない |
Microsoft Graph が 404 を返す | 道具の側で not_found に直して返す |
| API の認証が切れている | そのSaaSを unverified にし、担当者に認証の更新を知らせる |
| 同じ表示名の利用者が複数返る | 自動で選ばない。候補を全部書いて unverified |
| Max Iterations に届いた | 確かめ終わったSaaSだけを返し、残りを unverified にする |
| 退職の取り消し、異動日の変更 | 人事システムの登録を読み直し、依頼票の送付を止める |
| 共用のアカウントに対象者の名前がある | 止めない。パスワードの変更の要否を管理者に確かめる依頼にする |
| 停止の期限を過ぎても残っている | 再確認で見つけ、担当者と管理者に知らせる |
上から3行目までが大半を占めます。 どれも AI の問題ではなく、台帳の鍵と管理APIの有無の問題です。 unverified の理由を数えれば、台帳のどこを直せばよいかが分かります。
記録を残す
- 退職・異動の登録の内容と、受け取った日時
- 候補にしたSaaSの一覧と、その根拠(台帳の行・申請記録)
- エージェントが呼んだ道具、引数、返った結果の順番
checksの JSON と、Code ノードが付けた判定- 停止依頼票の文面、承認した人、送った日時
- 停止の期限後の再確認の結果
- 人が判定を覆した記録と、その理由
3つ目は、AI Agent ノードの Return Intermediate Steps で出力に含められます。 どの道具をどの順で呼んだかが残り、「なぜこのSaaSは見つからなかったのか」を後から追えます。
最後の行は、規則を直す材料になります。 同じ種類の覆しが続くなら、判定の規則か標準の権限表のほうが実態と合っていません。
04実装レベルの3段階
半自動化で、1件60分が35分程度になります。 ID管理の基盤の確認は自動になりますが、個別ログインのSaaSは管理画面を開く作業が残ります。本格構成で15分になり、この段階が本記事の想定です。 差が大きいのは、個別ログインのSaaSのうち、管理APIのあるものを道具にできるからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、台帳の鍵が誤っているSaaSが先に分かります。
05工数削減シミュレーション
導入後 40件 × 15分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社員数が数百名以上で、業務で使うSaaSが20種類を超え、部署ごとに使うSaaSが違う会社。退職と異動が毎月数十件あり、情報システム部門が人事からの連絡を受けて各SaaSの管理画面を1つずつ開いて確かめている場合。ID管理の基盤(Microsoft Entra ID や Google Workspace)に全員のアカウントがあり、各SaaSの利用者を台帳で持っている、または作れる場合。停止そのものは各SaaSの管理者が行う体制がある場合。
- 使っているSaaSが数種類で、ID管理の基盤からのシングルサインオンで停止が自動的に届いている場合。SaaSの利用者の台帳がなく、誰がどのSaaSを使っているかを誰も把握していない場合(先に台帳づくりが要る)。退職・異動が月に数件で、担当者が手で確かめて足りる場合。なお、アカウントを止めるか残すか、異動後に残す権限の範囲の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の退職・異動から10件を選ぶ(うち数件は、後から停止漏れが見つかったものを入れる)
- その10人について、台帳の行と申請記録を1つの表にする
- 手元の生成AIの画面に表を貼り、「この人が使っていた可能性のあるSaaSを挙げ、それぞれ何の鍵で利用者を引けばよいかを書いてください。台帳に無いものは分けてください」と指示する
- 担当者が、出てきた一覧のとおりに管理画面を開いて確かめる
- 当時の確認の結果と、後から見つかった停止漏れと突き合わせる
停止漏れが後から見つかったものを必ず入れてください。 確かめたいのは、当時の洗い出しで漏れたSaaSが、候補に挙がるかどうかです。
| 出てきた内容 | 判断 |
|---|---|
| 当時漏れたSaaSが候補に挙がった | 道具をつないでエージェントにする段階に進む |
| 台帳に無いSaaSは挙がらなかった | 台帳の整備が先。 サインインの記録を手がかりに足す |
| 引く鍵が分からないSaaSが多い | 台帳に鍵の列を足す。AI の問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 見つからなかったSaaSを「無い」とまとめる | not_found を unverified として人に回す。 指示にも明記する |
| 最終出社日の前に「止まっていない」と判定する | 日付の段階はワークフローが決め、判定は規則で行う |
Graph で accountEnabled や部署が返らない | 既定では一部しか返らない。$select で指定する |
| 退職日時が読めない | employeeLeaveDateTime は別の許可が要る |
| 停止済みでも管理者の印が残る | isAdmin・isDelegatedAdmin・各SaaSの管理者ロールを別の欄で見る |
| 旧アドレスで登録されたアカウントを見落とす | 対象者の鍵に旧アドレスと別名を入れ、引き直させる |
| 同姓同名の別人を止める依頼を出す | 表示名だけで引くSaaSは自動で選ばず、unverified にする |
| 候補が多い人で繰り返しの上限に届く | Max Iterations の既定は10。候補の数に合わせて広げ、同じ呼び出しを禁じる |
| エージェントが止めてしまう | 書き込みの認証情報を n8n に置かない |
| 停止依頼を出しっぱなしにする | 期限後に同じ道具で再確認する |
| 異動の外す権限が決まらない | 部署の標準の権限表を先に作る |
| 台帳に無いSaaSが漏れる | hints を毎回見て、使っていたら台帳に足す |
上の2行が、この構成の失敗のほとんどです。 どちらも「残っていない」と言ってしまう方向の誤りで、画面で見る担当者なら起こさない誤りを、機械に寄せたことで新しく起こします。 見つからないことを見つからないまま人に回す設計が、運用に乗るかを決めます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社員の氏名、社員番号、メールアドレス、退職・異動の事実と日付、部署、各SaaSでの権限と最後のログインの日時です。退職の事実は、社内でも知る人を限る情報です。
- 道具に書き込みの権限を渡さない … Directory API にも Microsoft Graph にも、停止や削除のメソッドがあります。認証情報を読み取りの範囲に限り、エージェントから呼べる経路を作らないことが、誤って止める事故を防ぐ一番確実な方法です
- 止める判断を人に残す … アカウントを止めるのは各SaaSの管理者で、止めるかどうかの決まりは会社の規程です。 この構成が出すのは、残っているという事実と、依頼の下書きまでです
- 生成AIに渡す範囲を絞る … 道具の結果のうち、判定に要る欄だけを渡します。氏名は社員番号に置き換えて渡す設計にもできます
- 退職の情報の見える範囲を限る … 一覧と通知の送り先は、情報システム部の担当者と各SaaSの管理者に限ります。社内チャットの共有の場に流さないでください
- API の認証情報を守る … 25種類のSaaSの管理APIの認証情報が1か所に集まります。n8n の認証情報の保管と、それを見られる人を限ります
- ログを残す期間を決める … 道具の呼び出しの記録には、退職者の権限とログインの日時が残ります。社内の規程に合わせて保存期間を決めます
誤りが起きた場合のリスクは、停止漏れを「問題なし」と判定して残すことと、別人のアカウントを止める依頼を出すことの2つです。 前者は not_found を無いと扱うと起き、後者は表示名だけで引いて自動で選ぶと起きます。どちらも「確かめられなかったものを人に回す」で防げるので、そこだけは設計で守ります。
10まず何から始めるか
1週目:台帳に3つの列を足す
SaaSの利用者の台帳に、「管理APIの有無」「利用者を引く鍵」「管理者」の列を足します。25種類すべてを一度に埋める必要はありません。利用者の多い上位10種類から埋めます。
2週目:10件で試す
先月の退職・異動から10件を選び、手元の生成AIに台帳を貼って候補のSaaSを挙げさせます。当時漏れたSaaSが挙がるかを最優先で見ます。
3週目:判定の規則と標準の権限表を決める
退職の何日後までに止めるのか、異動で何を外すのかを、人事部と各部署と決めます。 部署の標準の権限表は、異動の多い部署から作ります。
4週目:人事の登録から ID管理の基盤の確認までをつなぐ
n8n で人事システムの登録を受け、Entra ID と Google Workspace の状態を引いて一覧にするところまで作ります。この時点では AI Agent を使わず、一覧だけを見ます。
2か月目: 管理APIのあるSaaSを読み取り専用の道具にし、AI Agent ノードにつないで checks を出します。判定は Code ノードで付け、unverified の件数を毎週数えます。3か月目以降: 停止依頼票の下書きと承認、期限後の再確認を足し、1件60分が何分になったかを実測します。unverified の理由を台帳の直しで減らし、停止漏れが次の棚卸しで見つからなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Tools Agent が外部の道具やAPIを使い、タスクに応じてどの道具を使うかを判断すること。道具のサブノードをつなぐこと(HTTP リクエストの道具を含む)。Max Iterations の既定が10。Return Intermediate Steps。決まった出力の形を求める場合に出力パーサーをつなぐこと | n8n Docs: Tools Agent | 2026-09-29 |
| AI Agent が道具を実行する前に人の承認を求められること。承認で AI が指定した入力で実行され、拒否で取り消されること。Slack、Microsoft Teams、Gmail、Microsoft Outlook などで承認の依頼を送れること | n8n Docs: Human-in-the-loop for tools | 2026-09-29 |
ユーザー取得が既定では一部のプロパティしか返さず、他は $select で指定すること。アプリケーションの許可の最小が User.Read.All であること。employeeLeaveDateTime に User-LifeCycleInfo.Read.All が要ること。accountEnabled の読み書きの最小の組み合わせが User.EnableDisableAccount.All と User.Read.All であること。ユーザーが存在しなければ 404 Not Found を返すこと | Microsoft Learn: ユーザーを取得する(Microsoft Graph v1.0) | 2026-09-29 |
ユーザーの suspended、suspended が真の場合だけ返る suspensionReason、archived、ISO 8601 形式の lastLoginTime、isAdmin、isDelegatedAdmin。get、list、update、delete、signOut などのメソッドがあること | Google for Developers: Directory API Users リソース | 2026-09-29 |
アカウントを止める期限と、異動後に残す権限の範囲は、自社の規程で決めてください。 本記事は公開仕様で確認できた範囲だけを扱っています。各SaaSの管理APIで何が引けるかは、SaaSごとに確かめてください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0379)についてのご相談はこちらから。
