AgentSkillsCN

entra-graph-permissions

在涉及Microsoft Graph API的范围GUID、Entra ID(Azure AD)应用注册、requiredResourceAccess、管理员同意、oauth2PermissionScopes、appRoles等操作时,**务必**使用此技能。具体而言:在将Graph API权限写入代码时、复制粘贴GUID时、管理员同意失败时、出现AADSTS650051错误时、编辑Entra ID应用的清单时,以及在新项目中配置Graph API权限时。此举旨在防止因GUID复制粘贴失误而导致的10小时调试事故(2026-02)再次发生。**重要提示:在将Graph API的GUID写入文件之前,务必先参考此技能。**

SKILL.md
--- frontmatter
name: entra-graph-permissions
description: >-
  Microsoft Graph APIのスコープGUID、Entra ID (Azure AD) アプリ登録、requiredResourceAccess、
  admin consent、oauth2PermissionScopes、appRoles に関わる作業時に**必ず**使用すること。
  具体的には: Graph APIの権限をコードに書く時、GUIDをコピペする時、admin consentが失敗した時、
  AADSTS650051エラーが出た時、Entra IDアプリのマニフェストを編集する時、
  新しいプロジェクトでGraph API権限を設定する時。
  GUIDのコピペミスによる10時間のデバッグ事故(2026-02)の再発を防止する。
  **重要: Graph APIのGUIDをファイルに書く前に、必ずこのスキルを参照すること。**
allowed-tools: Bash(bash *)

Entra ID Graph API Permission Validator

いつこのスキルを使うか

以下のいずれかに該当する場合、作業開始前にこのスキルの内容を確認すること:

  • Graph APIの権限(スコープ/ロール)のGUIDをファイルに書こうとしている
  • requiredResourceAccessを含むJSON/YAML/Bicep/Terraformを編集しようとしている
  • admin consentの設定・実行・トラブルシュートをしている
  • AADSTS650051AADSTS系のエラーを調査している
  • Entra IDアプリのマニフェストを編集している
  • 新しいプロジェクトでMicrosoft Graph連携を設定している

プロジェクトやファイル形式は問わない。 deploy.yml、Bicep、Terraform、ARM Template、手書きのJSON、どれでも同じルールが適用される。

事故の教訓(2026-02)

deploy.ymlに書かれたGraph APIスコープのGUIDが8つ中6つ間違っていた。さらにClaudeがコメント(スコープ名)を追記した際もGUIDの正しさを検証せず、間違ったGUIDに間違ったコメントを付けた。コメント付きコードを「正しい」と信じて調査したため、原因特定に10時間以上を要した。

根本原則: GUIDは人間が読めない。コメントは検証の証拠ではない。唯一の検証方法はaz ad sp showの実行。

このスキルが行うこと

  • Graph APIスコープGUIDの正しさを検証する
  • deploy.ymlのpermissions.json編集時のガイドを提供する
  • Admin consent手順をガイドする

GUID検証(最重要)

Delegated Scope(type: "Scope")の検証

bash
az ad sp show \
  --id 00000003-0000-0000-c000-000000000000 \
  --query "oauth2PermissionScopes[?value=='Files.Read.All'].{id:id,value:value}" \
  -o json

Application Role(type: "Role")の検証

bash
az ad sp show \
  --id 00000003-0000-0000-c000-000000000000 \
  --query "appRoles[?value=='Sites.Selected'].{id:id,value:value}" \
  -o json

一括検証スクリプト

bash
# 引数でファイルを指定して検証
bash ~/.claude/skills/entra-graph-permissions/scripts/validate-graph-permissions.sh /path/to/deploy.yml

# カレントディレクトリの .github/workflows/deploy.yml を自動検出
cd ~/PrivateMiner && bash ~/.claude/skills/entra-graph-permissions/scripts/validate-graph-permissions.sh

必須ワークフロー

permissions.jsonを編集する場合

  1. 書く前に: 追加したいスコープ名でaz ad sp showを実行し、正しいGUIDを取得する
  2. 書いた後に: validate-graph-permissions.shを実行して全GUIDを検証する
  3. コメントを付ける場合: コメント内容をaz ad sp showの出力と照合する

admin consentを実施する場合

ステップ1: Delegated Permissionsのconsent

管理者アカウントでconsent URLにアクセス:

code
https://private-miner-dev.azurewebsites.net/auth/login?admin_consent=1

ステップ2: Sites.Selected(Application Role)のサイト単位権限付与

SlidePro機能で使用するSites.Selectedはapplication roleのため、admin consent後にさらにサイト単位の権限付与が必要。

consent状態の確認

bash
# サービスプリンシパルの確認
az ad sp list --filter "displayName eq 'Private Miner (dev)'" \
  --query "[0].{id:id,appId:appId}" -o json

# Permission Grantsの確認
SP_ID=$(az ad sp list --filter "displayName eq 'Private Miner (dev)'" --query "[0].id" -o tsv)
az rest --method GET --url "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/oauth2PermissionGrants"

admin consentが失敗する場合の調査手順

  1. まずGUIDを疑う — コメントが付いていても信用しない
  2. validate-graph-permissions.shを実行
  3. 全GUIDがPASSしたら、次にconsent手順・テナント設定を調査

「コードは正しいが手順が悪い」と結論づける前に、必ずGUIDの検証を完了すること。

正しいGUID一覧(2026年2月時点)

スコープ名GUID種類
User.Reade1fe6dd8-ba31-4d61-89e7-88639da4683dScope
Files.Read.Alldf85f4d6-205c-4ac5-a5ea-6bf408dba283Scope
Files.ReadWrite.All863451e7-0667-486c-a5d6-d135439485f0Scope
Sites.Read.All205e70e5-aba6-4c52-a976-6d2d46c48043Scope
GroupMember.Read.Allbc024368-1153-4739-b217-4326f2e966d0Scope
Team.ReadBasic.All485be79e-c497-4b35-9400-0e3fa7f2a5d4Scope
Channel.ReadBasic.All9d8982ae-4365-4f57-95e9-d6032a4c0b87Scope
ChannelMessage.Sendebf0f66e-9fb1-49e4-a278-222f76911cf4Scope
Sites.Selected883ea226-0bf2-4a8f-9f9d-92c9162a727dRole

注意: このテーブルも古くなる可能性がある。必ずaz ad sp showで検証すること。

.defaultスコープのadmin consentの挙動

scope=https://graph.microsoft.com/.defaultでadmin consentすると、requiredResourceAccessに登録された全スコープをまとめてconsentしようとする。1つでも無効なGUIDがあると、consent全体がAADSTS650051エラーで拒否される(全か無か)。

よくあるミス

ミス結果
GUIDのコピペでズレた別のスコープを指すか、存在しないGUIDになる
delegated scope用のGUIDをtype:"Role"で登録consent時にエラー
application role用のGUIDをtype:"Scope"で登録consent時にエラー
コメントのスコープ名を信用して検証しなかった間違いに気づかない

関連ドキュメント

  • Private Miner CLAUDE.md: ルール7「GUIDは必ず実機検証する」
  • Obsidianノート: 2026-02-04_Graph APIスコープGUIDの罠とadmin consentが失敗する原因.md
  • 検証スクリプト: ~/PrivateMiner/scripts/validate-graph-permissions.sh