← Documentation

Required Microsoft Graph permissions

All permissions are delegated — the add-in acts as the signed-in
coordinator and can never reach anything the coordinator can't. There are
no application permissions and no backend.

Requested at sign-in

ScopeUsed forWhy not less
Mail.ReadWriteRead the report message body/attachments; save the compose draft; draft the daily report and setup invitationsReading a draft's attachments requires more than Mail.Read
Mail.SendSend consolidated division emails; send the original report on publishSending is the product's job; drafts-only would break the workflow
ChannelMessage.SendPost one message per bill to Teams channelsThe narrowest channel-posting scope
ChannelMessage.Read.AllRead replies to the add-in's own bill posts, so divisions' cost estimates can be collected without re-typing (History → Harvest)Graph has no "replies to messages I posted" scope; this is the narrowest available that can read a thread
Sites.ReadWrite.AllRead LegislativeRoutingMatrix; write LegislativeAudit and BillTracker rowsGraph has no list-scoped delegated permission; see hardening below
Team.ReadBasic.AllList the teams you belong to, for the setup wizard's Team pickerRequired for /me/joinedTeams
Channel.ReadBasic.AllList a team's channels in the setup wizardRequired for /teams/{id}/channels
TeamworkTag.ReadRead a team's tags so a division's tag can be selectedRead-only

These are not requested at sign-in. The add-in asks for them at the
moment the action is taken, so a tenant that never grants them still gets
a fully working add-in everywhere else.

ScopeRequested whenIf refused
Sites.Manage.AllYou click Create my lists during setupCreate the three lists by hand in Microsoft Lists (schemas in the admin guide); everything else works
TeamworkTag.ReadWriteYou click ➕ Create the tag for this divisionCreate the tag in Teams (Manage team → Tags) and pick it from the dropdown
Why Sites.Manage.All is needed at all: Microsoft splits these precisely —
Sites.ReadWrite.All is *"edit or delete documents and list items"*, while
creating a list requires Sites.Manage.All, *"create or delete document
libraries and lists"*. The add-in only ever uses it to provision its own
three lists.

Hardening option

If security review balks at Sites.ReadWrite.All (it is delegated —
user's-reach-only — but broad), switch the app registration to
Sites.Selected and have the SharePoint admin grant the app access to
only the legislative site. No code changes required. Note that list
*creation* still needs Sites.Manage.All, so provision the three lists by
hand first if you take this route.

Gov tenants typically block user consent. One-time admin consent URL:


https://login.microsoftonline.com/organizations/adminconsent?client_id=0860a653-ddbd-4455-8bff-affda2a8879f

(Use the .us authority host for GCC High/DoD.)

What is never requested

No application permissions of any kind, no Directory.*, no
User.Read.All, no Mail.Read.Shared. The add-in cannot read other
people's mailboxes, the directory, or any Teams conversation it did not
itself post into — ChannelMessage.Read.All is used solely to follow
replies to the add-in's own bill posts, and only in channels the
signed-in coordinator already belongs to.

Audience

The app registration is AzureADMultipleOrgs — work or school accounts
only. Personal Microsoft accounts are not supported, because the Teams and
SharePoint scopes above are not available to them.