PURPOSEBUILT SYSTEMS LLC · Microsoft verified publisher (MPN 7123774) · Last updated July 26, 2026
This page answers the questions IT security reviewers ask about our Microsoft 365 add-ins — written for the reviewer, not the marketer. Every claim below is verifiable from the served source code (unminified, publicly readable on this site) and from each app's Microsoft Entra consent prompt.
Delegated Microsoft Graph scopes only. No application permissions. No ".All" mailbox
scopes. No access to other users' mailboxes, ever. Add-in manifest permission shown in parentheses.
| Add-in | Delegated Graph scopes | What they're for |
|---|---|---|
| Reply All with Attachments (manifest: ReadItem) |
Mail.ReadWrite |
Create the reply-all draft and copy the original attachments onto it. Drafts only — the user sends. |
| Biweekly Activity Report (manifest: ReadItem) |
Calendars.Read, Mail.ReadWrite |
Read the user's own calendar/mail to build the report; optionally save it as a draft. |
| Auto Contacts (manifest: ReadItem) |
Mail.Read, Contacts.ReadWrite |
Read senders/signatures; create or enrich the user's own contacts. |
| Waiting On (manifest: ReadItem) |
Mail.ReadWrite |
Scan the user's own sent/received mail for unanswered asks; create nudge drafts. |
| Attachment Librarian (manifest: ReadItem) |
Mail.Read (read-only) |
Index attachment metadata only — file contents are never downloaded. |
| Public Records Packager (manifest: ReadItem) |
Mail.Read, Files.ReadWrite |
Search the user's own mail; write records bundles to the user's own OneDrive. |
| Travel Desk (manifest: ReadItem) |
Files.ReadWrite.All, Mail.ReadWrite |
Append rows to the org's shared travel planner (files the user can already reach — delegated scopes grant no new access); create the authorization email as a draft. |
| Legislative Report Router (manifest: ReadWriteItem) |
Mail.ReadWrite, Mail.Send, ChannelMessage.Send,
ChannelMessage.Read.All, Sites.ReadWrite.All,
Team.ReadBasic.All, Channel.ReadBasic.All,
TeamworkTag.ReadRequested only on use: Sites.Manage.All,
TeamworkTag.ReadWrite |
Parse bill reports; post to Teams channels and send division emails — only after explicit
user confirmation; read routing rules from, and write audit records to, the customer's own
SharePoint lists.
ChannelMessage.Read.All reads divisions' replies to the add-in's own bill
posts, so cost estimates need not be retyped — Graph offers no "replies to messages I
posted" scope, and it reads only channels the signed-in coordinator already belongs to.
Team.ReadBasic.All / Channel.ReadBasic.All populate the setup
wizard's team and channel pickers. Two scopes are requested only at the moment the
feature is used, so a tenant that never grants them still has a working add-in:
Sites.Manage.All to create the add-in's own three lists (Microsoft splits this
from Sites.ReadWrite.All, which cannot create a list), and
TeamworkTag.ReadWrite to create a division's Teams tag during guided setup.
Sites.Selected hardening available on request. |
| Roster Auditor (manifest: ReadItem) |
Group.Read.All, Group.ReadWrite.All, Mail.ReadWrite,
Calendars.Read, OnlineMeetings.Read,
OnlineMeetingArtifact.Read.All |
Read the rosters of groups the signed-in user belongs to; scan their own sent mail for
group sends and bounce notifications; draft re-engagement email. Teams attendance reports are
available only for meetings the user organised — the add-in cannot observe anyone
else's meetings. Group.ReadWrite.All is used solely to remove a member from a
Microsoft 365 group the user owns, after a two-step confirmation; classic distribution lists
are read-only in Graph and are handled by CSV export instead. |
| Successor Console (manifest: ReadItem) |
Mail.Read, Mail.Read.Shared, Files.ReadWrite.All |
Read an inherited or shared mailbox the user has already been granted Full Access to by IT — the delegated scope grants no new access on its own — and write the resulting knowledge pack to the organisation's own OneDrive or SharePoint. Extraction is deterministic and verbatim with source links; the add-in makes no AI calls. |
Microsoft Entra ID via MSAL Nested App Authentication — Microsoft's current, supported pattern for Outlook add-ins. No legacy Exchange tokens, no EWS, no basic auth anywhere in the suite; the 2026 retirement of legacy token patterns requires no changes to these apps. Tenant admins can require and grant admin consent centrally; each app is a multi-tenant Entra application from a verified publisher, so the consent prompt shows the verified checkmark.
Because the add-ins have no publisher-side activity, the complete audit surface is the customer's own Microsoft 365 audit log: every operation an add-in performs is a delegated Graph call by the signed-in user, attributable to the app's application ID in the unified audit log (Microsoft Purview). Monitoring an add-in = filtering audit records by its app ID. There is no side channel to instrument.
We answer security review questionnaires quickly — most controls resolve to "no publisher infrastructure exists." Contact Matthew@purposebuilt.systems. Vulnerability reports: same address, and thank you.