At a glance
Start
4005 in the default set, or on http://localhost:4000 when started alone. Sign-in and Graph v1.0 and beta share the port. Without a seed config there is one user ([email protected], Test User) in tenant 9188040d-6c67-4c5b-b112-36a304b66dad.
Using the Graph SDK
@microsoft/microsoft-graph-client attaches the token and follows @odata.nextLink only for https hosts. Start the emulator with an https base URL (it still listens on plain HTTP), list the host in customHosts, and end the middleware chain with a transport that sends each request to the HTTP listener:
--base-url.
Plain fetch or curl against http://localhost:4005/v1.0/... needs none of this. MSAL Node takes the emulator as its authority (<base>/<tenant_id> with the host in knownAuthorities) and a custom system.networkClient that sends its requests to the HTTP listener; src/__tests__/graph-sdk.ts has a complete one. The Kiota based @microsoft/msgraph-sdk works with @azure/identity given authorityHost (the emulator) and disableInstanceDiscovery: true on the credential, with adapter.baseUrl set to <base>/v1.0.
The package tests (graph-mail.sdk.test.ts, graph-users.sdk.test.ts, and graph-kiota.sdk.test.ts) run all three libraries against the emulator unchanged: client credentials and authorization code flows, a draft with an attachment, send, reply, delta, PageIterator, $batch, errors and MIME, and with the Kiota SDK a meeting invite and acceptance, calendarView with Prefer: outlook.timezone, getSchedule, contacts with a lambda filter, and a cancellation. The conformance scenarios in conformance/scenarios/sdk.ts go further: the Kiota SDK and the Graph JavaScript client run a mail workflow against a real Microsoft 365 test tenant, their traffic is recorded, and the emulator must reproduce every response.
Auth
- Access tokens are RS256 JWTs from this emulator’s token endpoint. Authorization code and refresh tokens are delegated: their
scpholds every Graph scope the user has consented to for the client, as in Entra ID, andhttps://graph.microsoft.com/.defaultgrants the client’sdelegated_permissions. Client credentials tokens are application tokens: they need a/.defaultscope (anything else isAADSTS1002012 invalid_scope) and carryrolesfrom the client’sapplication_permissions. A client without either list gets every modeled permission. - Each operation checks the least-privileged Graph permission,
scpfor delegated tokens androlesfor application tokens, with Graph’s error for each surface (403 Authorization_RequestDeniedon the directory,403 ErrorAccessDeniedon Exchange)./mewith an application token is400 BadRequest(/me request is only valid with delegated authentication flow.). - A missing, expired, revoked, or foreign token is
401 InvalidAuthenticationTokenwith aWWW-Authenticateheader. A token issued for another resource isAccess token validation failure. Invalid audience. - Without
graph.strict_auth: true, an opaque bearer token the emulator did not issue (any string such asBearer test) acts as the first seeded user with full access, so quick scripts work without an OAuth flow. JWTs are always verified, and a request without a token is always401. - A scope for another resource, such as
https://contoso.sharepoint.com/.default, gives a token for that resource. SharePoint tokens carryaud: 00000003-0000-0ff1-ce00-000000000000(the SharePoint app id), whether the scope names a tenant host or that id, as Entra issues them. Graph refuses them, and the SharePoint REST API takes only them. - Delegated directory writes (
POST /users,PATCHorDELETE /users/{id}on someone else) need the permission only. The emulator does not model Entra admin roles.
OAuth and OIDC
GET /.well-known/openid-configuration— Get OIDC discovery document: for the root issuerGET /:tenant/v2.0/.well-known/openid-configuration— Get tenant OIDC discovery documentGET /discovery/v2.0/keys— Get JSON Web Key Set (JWKS)GET /:tenant/discovery/v2.0/keys— Get tenant JSON Web Key Set (JWKS)GET /oauth2/v2.0/authorize— Authorize: shows the user pickerGET /:tenant/oauth2/v2.0/authorize— Authorize in tenant: shows the user pickerPOST /oauth2/v2.0/token— Exchange token: authorization code, refresh token, and client credentials grants;client_secret_post,client_secret_basic, orprivate_key_jwt(a certificate assertion)POST /:tenant/oauth2/v2.0/token— Exchange token in tenant: the same grants and client authenticationGET /oidc/userinfo— Get user info: OpenID ConnectGET /oauth2/v2.0/logout— End session: logoutGET /:tenant/oauth2/v2.0/logout— End session in tenant: logoutPOST /oauth2/v2.0/revoke— Revoke token
Authorization code flow
- Redirect the user to
/oauth2/v2.0/authorizewithclient_id,redirect_uri,scope,state, and optionallynonce,response_mode,code_challenge, andcode_challenge_method - The emulator renders a user picker page
- On selection, the emulator redirects to
redirect_uriwithcodeandstate(in the query, after#forresponse_mode=fragment, or as an auto-submitted form forform_post) - Exchange the code for tokens via
POST /oauth2/v2.0/token
Issuers
Each discovery document is its own issuer, and the tokens minted through its endpoints carry it:/{tenant}/v2.0/.well-known/openid-configuration(as on Entra ID) has issuer<base>/<tenant>/v2.0and tenant-scoped endpoints (/{tenant}/oauth2/v2.0/authorize,/{tenant}/oauth2/v2.0/token,/{tenant}/discovery/v2.0/keys,/{tenant}/oauth2/v2.0/logout). ID tokens from these endpoints haveiss<base>/<user's tenant>/v2.0, also throughcommon,organizations, andconsumers, whose documents name the default tenant./.well-known/openid-configuration(an emulator convenience; Entra ID has no root document) has issuer<base>and the root endpoints (/oauth2/v2.0/authorize, and so on). ID tokens from a sign-in that started at the root authorize endpoint haveiss<base>.
<base>/<tenant>/v2.0 (closest to production, where it is https://login.microsoftonline.com/<tenant>/v2.0) or <base>, and let it discover the endpoints. Hard-coding the root endpoints together with a tenant issuer fails the iss check.
PKCE
Includecode_challenge and code_challenge_method (plain or S256) in the authorization request, and code_verifier in the token exchange.
Client credentials
Request tokens for service-to-service flows usinggrant_type=client_credentials with scope=https://graph.microsoft.com/.default. Returns an access_token only (no refresh_token or id_token). The token carries the client’s application_permissions as Graph roles, and any scope other than /.default is invalid_scope (AADSTS1002012).
A scope for another resource, such as https://contoso.sharepoint.com/.default, gives a token for that resource whose roles come from resource_permissions for that resource URI. Without a grant there, the roles claim is left out, as Entra does.
Certificate credentials (private_key_jwt) work too: register the certificate’s public PEM in certificates and send client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer with a client_assertion signed by its key, with an x5t#S256 (or x5t) header naming the certificate and iss and sub set to the client id. MSAL’s clientCertificate option does this. The token gets appidacr: "2". Unknown certificates, bad signatures, or a mismatched issuer answer 401 invalid_client with the matching AADSTS code; five minutes of clock skew are tolerated.
strict_tenants: unknown directory ids get AADSTS90002 from the token endpoint
Refresh tokens
client_id and client_secret of the client that received the refresh token. Successful requests rotate the refresh token. Legacy refresh records without a stored client binding remain supported.
ID tokens
Theid_token is an RS256 JWT containing sub, oid, tid (tenant ID), email, name, preferred_username, ver (“2.0”), and optional nonce.
Signing key
ID tokens are signed with a key stored in emulator state (kid: baseline-microsoft-1), so they stay valid across snapshot restores and persisted restarts. Set microsoft.signing_key.private_jwk to an RSA private JWK to pin the key. See OIDC signing keys.
Microsoft Graph
Graph v1.0 and beta are served on the same port as sign-in, at/v1.0/... and /beta/.... Every Graph response carries request-id, client-request-id (echoed when sent), and @odata.context, and errors use Graph’s envelope: { "error": { "code", "message", "innerError": { "date", "request-id", "client-request-id" } } }.
What is emulated
The Graph surface is Outlook in one mailbox store, so a change made through one endpoint shows up in every related one (an invite is a calendar item and an Inbox message; declining removes the event and updates the organizer). Behavior was recorded from a real Microsoft 365 tenant and the recordings are replayed against the emulator on every test run (see Fidelity).- Directory:
/meand/userswith$select,$filter,$orderby,$search,$count,$topand$skiptokenunder Graph’s directory rules (default and advanced queries withConsistencyLevel: eventual),User.ReadBasic.Allfield limits, and user writes:POST /users,PATCH(self-service fields on/me),DELETE. - Mailboxes for every seeded user and shared mailbox, with the well-known folders (Inbox, Drafts, Sent Items, Deleted Items, Junk Email, Archive, Outbox and others), plus mailbox settings and master categories.
- Folders: list, get, create, update, delete, child folders, move, copy, permanentDelete, delta and
$count. - Messages:
- list, get,
$value(MIME), create (JSON or base64 MIME), update, delete, permanentDelete, move and copy; - delta queries per folder;
- flags, categories, importance, inference classification and internet message headers;
- change keys and etags that advance on every change.
- list, get,
- Sending:
send,sendMail, reply, replyAll and forward, plus theircreate*draft variants;- delivery into recipients’ Inboxes with threading (
conversationId,conversationIndex,In-Reply-To); - Sent Items copies, NDRs for unknown internal recipients, and read and not-read receipts;
- Inbox rules applied at delivery, automatic replies from
mailboxSettings, focused or other classification from per-sender overrides, and asynchronous post-delivery processing.
- Attachments: file and item attachments, inline images,
$value, and large file upload sessions with chunked PUTs to the upload URL. - Search folders (
mailSearchFolder): dynamic membership fromfilterQueryover source folders, counts, PATCH of the definition, and the errors for writes into a search folder. - Calendar:
- events CRUD on the default and secondary calendars, calendar groups,
calendarView,instancesandcalendarView/delta; - Windows and IANA time zones with DST,
Prefer: outlook.timezone, all-day events; - recurring series (all pattern and range types) expanded in the recurrence time zone, occurrence ids, exceptions and cancelled occurrences;
- meetings: invites delivered as
eventMessageRequestwith a tentative copy in each internal attendee’s calendar, accept, tentativelyAccept (with proposals), decline, cancel, forward, organizer updates and response tracking; getSchedule,findMeetingTimes(with room availability fromlocationConstraint),reminderView, dismiss and snooze, file and item attachments with upload sessions, and open extensions;$expand=microsoft.graph.eventMessage/eventfrom a meeting message to its calendar item.
- events CRUD on the default and secondary calendars, calendar groups,
- Calendar sharing:
calendarPermissionson any calendar. Sharees withCalendars.Read.SharedorCalendars.ReadWrite.Sharedreach exactly the shared calendars through/users/{owner}/..., and each share or role change sends the sharee a sharing message with a copy in the owner’s Sent Items. - Rooms and places:
/places/microsoft.graph.room,/places/microsoft.graph.roomList, rooms of a list, get and PATCH. Rooms are resource mailboxes: they appear in free/busy, accept a meeting request when free and decline it on a conflict, andfindMeetingTimeswithsuggestLocationoffers the free ones that belong to a room list. Requests more than 180 days out are declined. - Microsoft 365 groups:
/groups, members and owners,memberOfandtransitiveMemberOf, and the group calendar (/groups/{id}/events,/calendar,/calendarView) with the group as organizer. - Microsoft To Do: task lists, tasks, checklist items, linked resources, file attachments, delta and change notifications, with the optional Flagged Emails list synced from message flags. The retired beta
/outlook/tasks,taskFoldersandtaskGroupsread and write the same tasks. - Contacts: contacts and contact folders (with child folders) CRUD, computed
displayName,$filterincludingemailAddresses/any(...), delta, photos, open extensions and permanentDelete. - Lists and ids: every Windows time zone from
supportedTimeZones(or IANA withTimeZoneStandard=Iana),supportedLanguages, andtranslateExchangeIdsfor all five id types. - Inbox rules (
messageRules) and inference classification overrides. - OData:
$select,$filter(comparison, logical,startswith,contains, lambdaanyandallon collections such as recipients and categories),$orderbywith the same “inefficient filter” restrictions as Exchange;$top,$skip,$count,$search,$expand=attachments;- server-driven paging through
@odata.nextLink.
- Protocol:
/v1.0and/beta, case-insensitive segments, andusers('...')key syntax;$batchwithdependsOn;- Graph error bodies and the
request-id,client-request-idandx-ms-ags-diagnosticheaders; Prefer: IdType="ImmutableId"andoutlook.body-content-type.
- Change notifications:
/subscriptionsCRUD with the notification URL validation handshake (forlifecycleNotificationUrltoo) and the 10070 minute expiration limit. Notifications for created, updated and deleted messages, folders, events, contacts and To Do tasks are POSTed to your endpoint in the shapes recorded from the real service. - Identity and permissions:
- access tokens are RS256 JWTs with
scp(delegated) orroles(app-only);scpholds every scope the user has consented to for the client, as in Entra ID; - every operation checks the least-privileged Graph permission;
- app-only tokens get
/meerrors, and application access policies can restrict them to some mailboxes; - delegated access to other mailboxes follows
FullAccess,SendAsandSendOnBehalfgrants.
- access tokens are RS256 JWTs with
Directory queries
PATCH /me takes the self-service fields such as jobTitle, mobilePhone, businessPhones, officeLocation, and preferredLanguage.
Seeded users are the same records the sign-in picker shows, so a user’s Graph id is the oid in their ID token. /users takes $select, $filter, $top (1 to 999), $orderby, $count, $search, and pages with @odata.nextLink ($skiptoken). Filters follow Graph’s directory rules per property: a default query allows eq, in, and startswith on names, mail, and identifiers, and any() on businessPhones, proxyAddresses, and otherMails; ne, not, endsWith, range operators, sorting with a filter, and properties such as department or city need an advanced query (ConsistencyLevel: eventual plus $count=true or $search). Errors otherwise are Graph’s (Request_UnsupportedQuery, Directory_ExpiredPageToken). An app with only User.ReadBasic.All sees the basic profile fields. POST /users needs accountEnabled, displayName, mailNickname, userPrincipalName on a verified domain (a seeded user’s domain or one in verified_domains), and a passwordProfile whose password meets Entra’s complexity rule.
Mail lists and ids
Each user and shared mailbox has Graph’s distinguished folders (inbox, drafts, sentitems, deleteditems, archive, junkemail, outbox, and the rest) under msgfolderroot, and every mailbox route works under /me and under /users/{id | userPrincipalName}. Lists take Exchange’s OData rules, page with @odata.nextLink, and default to 10 items. As on Exchange, moving a message gives it a new id, every change gives it a new changeKey, and DELETE removes a message rather than moving it to Deleted Items.
Paths
Microsoft Graph (/v1.0 and /beta; {user} is me, users/{id} or users/{userPrincipalName}):
GET,PATCH /me;GET,POST /users;GET /users/$count;GET,PATCH,DELETE /users/{id}/{user}/memberOf[/microsoft.graph.group],/{user}/transitiveMemberOf[/microsoft.graph.group]/{user}/mailFolders[/{id}][/childFolders|/messages|/move|/copy|/permanentDelete],/{user}/mailFolders/delta/{user}/messages[/{id}],/{user}/mailFolders/{id}/messages/delta,/{user}/messages/{id}/$value/{user}/messages/{id}/{send|reply|replyAll|forward|createReply|createReplyAll|createForward|move|copy|permanentDelete}/{user}/sendMail/{user}/messages/{id}/attachments[/{id}][/$value],/{user}/messages/{id}/attachments/createUploadSession/{user}/messages/{id}/extensions[/{id}]/{user}/mailFolders/inbox/messageRules[/{id}],/{user}/inferenceClassification/overrides[/{id}]/{user}/mailboxSettings,/{user}/outlook/masterCategories,/{user}/outlook/supportedTimeZones,/{user}/outlook/supportedLanguages/{user}/translateExchangeIds/{user}/events[/{id}],/{user}/events/{id}/{accept|tentativelyAccept|decline|cancel|forward|dismissReminder|snoozeReminder|permanentDelete|instances|attachments|extensions}/{user}/calendar[/events|/calendarView|/getSchedule],/{user}/calendars[/{id}[/events|/calendarView]],/{user}/calendarGroups[/{id}[/calendars]]/{user}/calendarView[/delta],/{user}/findMeetingTimes,/{user}/reminderView(startDateTime='...',endDateTime='...')/{user}/contacts[/{id}[/photo|/extensions|/permanentDelete]],/{user}/contacts/delta/{user}/contactFolders[/{id}[/childFolders|/contacts]],/{user}/contactFolders/delta/{user}/calendar[s/{id}]/calendarPermissions[/{id}]/places/microsoft.graph.room,/places/microsoft.graph.roomList,/places/{list}/microsoft.graph.roomList/rooms,/places/{id|email}/groups[/{id}[/members|/owners]](GET, POST, PATCH, DELETE),/directory/deletedItems/{id},/groups/{id}/events[/{id}],/groups/{id}/calendar[/events|/calendarView],/groups/{id}/calendarView/{user}/todo/lists[/{id}[/tasks[/{id}[/checklistItems|/linkedResources|/attachments]]]],/{user}/todo/lists/delta,.../tasks/delta/beta/{user}/outlook/tasks[/{id}[/complete]],/beta/{user}/outlook/taskFolders[/{id}/tasks],/beta/{user}/outlook/taskGroups/subscriptions[/{id}]POST /$batch
docs/coverage.md lists every operation with its permissions and evidence.
Delivering mail in tests
Mail is deliveredgraph.delivery_delay_ms after a send (default 1000), as Exchange delivers asynchronously. Seed graph: { delivery_delay_ms: 0 } to deliver before the send call returns, or call flushTransport(store) from @deploybaseline/microsoft to deliver everything pending.
Programmatic use can deliver pending mail without waiting for the delay:
Fidelity
Behavior is specified as rules inconformance/spec/catalog.ts. Each rule is marked verified (a committed recording from a real Microsoft 365 test tenant backs it), observed (real service traffic recorded by others, see docs/research/), documented (from Microsoft documentation only) or assumed. The conformance suite replays every recorded scenario against the emulator and compares normalized responses step by step; it runs with the package tests. See conformance/README.md for the methodology, how to record against your own tenant, and docs/coverage.md for current results.
SharePoint and OneDrive
A stateful SharePoint Online served through Microsoft Graph (/v1.0, /beta) and the SharePoint REST API (/{site}/_api) from one state. A file written through Graph is readable through REST at once with the same ids, versions and permissions, and the reverse. SharePoint routes answer only after a site exists, from the seed config or the control plane; until then they answer like any path Graph does not know.
Seed config for SharePoint
application_permissions: Graph app rolescertificates: app-only REST needs a certificate credential, as in Entrahttps://contoso.sharepoint.comunderresource_permissions: SharePoint app rolesowners: Full Control; the first owner is the site collection adminmembers: Editgrants: Sites.Selected grants for an app
group (a group from groups: makes a group-connected team site), visitors, subsites, custom_script and grants ({app_id, roles, list?, item?}). Lists take template (genericList, documentLibrary or a template number), url, description, folders, files (path, content or content_base64, fields, author), items, versioning, permissions (break inheritance: {email: read|contribute|edit|design|full}) and columns of type text, note, number, currency, choice, multichoice, dateTime, dateOnly, boolean, person, personMulti, lookup or hyperlink (or a Graph columnDefinition under graph). The other sharepoint options are in the seed config table.
Tokens
- Graph: scope
https://graph.microsoft.com/.default(app) or Graph scopes (delegated), withSites.*andFiles.*permissions. - REST: scope
https://contoso.sharepoint.com/.default. The token audience is the SharePoint app id00000003-0000-0ff1-ce00-000000000000, as Entra issues it, and its roles or scopes are SharePoint’s (Sites.FullControl.All,AllSites.Manageand the rest). App-only REST refuses client secret tokens (401“Unsupported app only token.”) and accepts certificate assertions (see Client credentials).
Graph
- Sites:
/sites(search),/sites/root,/sites/{host}:/{path}, composite ids,/sites/getAllSites(), subsites, site columns, content types, and/sites/{id}/permissions(Sites.Selected grants). - Lists: lists, columns, content types (
addCopy), list permissions, and list items with typedfields,delta, versions (restoreVersion), permissions andcreateLink. - Drives:
/drives/{id}, a site’s/driveand/drives, a list’s/drive,/groups/{id}/drive, and drive search. - Drive items: by id or path (
root:/a/b.txt:), children,content(simple upload and download),createUploadSession,copywith a monitor URL, move and rename throughPATCH, versions,checkout,checkin,discardCheckout,publish,delta,search,createLink,inviteand permissions. - OneDrive:
/me/drive,/me/drives,/users/{id}/driveand/users/{id}/drivesaddress abusinessdrive namedOneDrive, the Documents library ofhttps://contoso-my.sharepoint.com/personal/{upn with _}, created on first use. Other delegated users get403 accessDenied. - Shares:
/shares/{id}foru!encoded sharing links and item URLs, withdriveItem,root,listItem,list,siteandpermission. - Search and notifications:
/search/queryfor sites, lists, list items, drives and drive items, and/subscriptionson drive roots and lists (updatedonly, as Graph documents), notified from the SharePoint change log.$batchcarries SharePoint answers with theirSPLogIdandCache-Controlheaders.
REST
contextinfo, web, site, lists, items, fields (addfield, CreateFieldAsXml), content types, folders, files (upload, $value, chunked StartUpload, ContinueUpload, FinishUpload and CancelUpload, SP.MoveCopyUtil), versions, check out and in, publish and content approval, attachments, role assignments and inheritance, effective permissions, site groups and users, recycle bin (both stages), GetChanges, GetListItemChangesSinceToken, RenderListDataAsStream, CAML GetItems, search, list webhooks and multipart $batch. Answers are JSON (odata=verbose, minimalmetadata or nometadata) or Atom when the Accept header names no JSON flavor. PnPjs works with spfi("<emulator origin>/sites/projects"), and the package tests run PnPjs and the Kiota Graph SDK (drives and sites) against the emulator.
Graph hands out download, upload session and copy monitor URLs on the SharePoint host, signed with tempauth and taking no Authorization header:
GET /sites/:site/_layouts/15/download.aspx— Download a file (alsoHEAD)PUT /_api/v2.0/drives/:driveId/items/:itemId/uploadSession— Upload a byte range to a session (GETreads its status, an emptyPOSTcommits a deferred session,DELETEcancels it)GET /_api/v2.0/monitor/:monitorId— Read a folder copy’s statusGET /sites/:site/_api/v2.0/drives/:driveId/items/:itemId— Read a file copy’s status (force303=1, the new item’s v2.0 URL)
Control plane
GET /_baseline/sharepoint— Summary of sites, lists, jobs and sessionsPOST /_baseline/sharepoint/sites— Provision a site, in the format of asitesentryPOST /_baseline/sharepoint/clock—{advance_ms},{freeze: true}or{real: true}; drives search lag, upload session expiry and copy jobsPOST /_baseline/sharepoint/jobs/run— Finish pending copy jobsPOST /_baseline/sharepoint/changes/trim—{keep_last: n}; older delta and change tokens then need a resyncGET /_baseline/sharepoint/faults— List fault rulesPOST /_baseline/sharepoint/faults— Add a fault rule:{api: graph|rest, method, path (regex), status, count, retry_after, code, message}DELETE /_baseline/sharepoint/faults— Remove every fault rule, or one with?id=GET /_baseline/sharepoint/snapshot— SharePoint state as JSONPOST /_baseline/sharepoint/restore— Replace SharePoint state with a snapshot
Behavior worth knowing
Graph permission ids are the base64 of the principal’s login name; SharePoint groups carry a
sharePointGroup facet and site collection administrators list as owners. invite adds a role assignment the invited user can use at once. File and folder names follow the service’s rules on each surface: Graph and REST refuse the same names with their own messages, REST methods that take a URL (Files/add(url=), folders/add) trim trailing dots and spaces while AddUsingPath refuses them, and a REST request path longer than 401 characters or holding *, <, > or ? answers 401 as the service’s web server does. Recycling, deleting or moving a list’s root folder acts on the list itself. With allow_subsite_creation: false, web/webs/add answers 400 InvalidOperationException.
Thirty-five SharePoint scenarios are recorded against a real tenant and replayed against the emulator. The operation inventory, generated coverage report, behavioral catalog with evidence, decisions and gap analysis are in docs/sharepoint.
Seed config
A sign-in only config:shared_mailboxes, mailbox_permissions, verified_domains, messages, rooms, room_lists, groups, and graph options. A fuller example:
application_permissions: Optional. Roles in client_credentials tokens; omit for every modeled permission.delegated_permissions: Optional. Scopes granted for “.default” delegated requests; omit for every modeled permission.visibility: Private groups are closed to non-membersdelivery_delay_ms: send to delivery delay; 0 delivers synchronouslystrict_auth: true rejects unknown bearer tokens with 401application_access_policies: restrict app-only clients to some mailboxes
Inspector
GET /— Inspector: the directory, mailboxes, subscriptions, and OAuth apps
Limits
- Timing of asynchronous Exchange processing is approximate.
- Directory query rules for
/users(which properties and operators need an advanced query) follow Microsoft’s documentation and are not recorded live. - Throttling, delta token expiry and application access policies are documented only and marked so in the coverage matrix.
- Not modeled: private event masking for sharees, delegate meeting forwarding, group conversations, room list based location search beyond the seeded rooms, and To Do list sharing.
$searchmatches KQL-style terms and properties directly. There is no search index, so no ranking and no indexing delay.- SharePoint: sites are created by seed config or the control plane, never through Graph (
POST /sitesis not a Graph v1.0 operation). Not modeled: the client object model (_vti_bin/client.svc), the SOAP services, the term store, hub sites, site pages and navigation, tenant administration andSP.AppContextSite. Those operations answer501.
Conformance
See CONFORMANCE.md for every provider.