The org already keeps its incident reports, asset registers, and site surveys in SharePoint. The Microsoft Graph connector turns any list into a live spatial layer — FeatureLayer, dynamic vector tiles, or OGC API Features — and lets operators edit it in place, with every write attributed to the signed-in identity and gated by SharePoint's own item-level permissions.
Pick a site, pick a list, and the connector materializes it into a local DuckDB snapshot served at the same FeatureServer path every other connector uses. All three facades work: ArcGIS FeatureLayer, dynamic vector tiles, and OGC API Features.
POST /api/sharepoint/profiles/{id}/refresh, with ?full=true for a complete re-pull after a schema change.// edits flow back through Microsoft Graph POST /sites/{site}/lists/{list}/items → add row PATCH .../items/{id} → edit cell DELETE .../items/{id} → delete marked // served locally like any other layer GET /api/spatial/{profileId}/FeatureServer/{layerIndex} POST /api/sharepoint/profiles/{id}/refresh?full=false GET /api/sharepoint/profiles/{id}/status ● signed in as operator@tenant · delta sync active
SharePoint lists store location five different ways. The connect dialog recognizes all of them — and you can override the detection when a column needs to be forced into a different mode.
Two numeric columns become point geometry — the most common shape for field-collected lists and form-driven data entry.
SharePoint's built-in Geolocation column type, flattened from its {Lat, Lon, Alt} structure into map-ready coordinates.
POINT(...), POLYGON(...), and friends — full geometries, not just points, parsed straight from a text field.
A GeoJSON geometry stored as text renders directly — handy for lists populated by other systems and integrations.
Address columns are geocoded through the in-app OpenAddresses/Nominatim geocoder, with results persisted to a secondary GeoPackage registered as its own SpatialSource.
Detection picked the wrong column? Override the shape and column in Step 5 of the connect dialog — for example, forcing Address mode on a Location column.
The Attribute Table, in-map Editor widget, and FeatureTable widget all hit the FeatureServer edit verbs, which detect the SharePoint-backed dataset and delegate every add, update, and delete to Microsoft Graph. After each write, the affected row refreshes in the local snapshot — no full re-pull.
POST, PATCH, and DELETE against the list's items endpoint; per-field edits are batched per row.SP.FieldGeolocationValue shape, using the same bearer token. Routing is decided per-write.userPrincipalName appears in SharePoint's item history. No service-account smudging.// one-time tenant setup — no client secret, ever flow Auth Code + PKCE (MSAL.NET, browser sign-in) redirect SPA → http://localhost scopes Sites.ReadWrite.All · User.Read (delegated) token DPAPI-encrypted (CurrentUser scope) writes attributed to signed-in operator perms SharePoint item-level ACLs enforced ● consent granted · 429s handled by Polly backoff
Built on Microsoft Entra ID delegated authentication — the operator's identity, not an app secret, is the credential for everything.
The Auth Code + PKCE flow replaces the secret with a one-time code. Sign-in happens in the operator's own browser; nothing secret is needed beyond their session.
The MSAL refresh token — the only long-lived credential — is DPAPI-encrypted to the Windows user account. Copying the profiles file to another machine or user grants nothing.
Every other external database connector is READ_ONLY at the DuckDB ATTACH boundary. SharePoint is the first where writes leave the local perimeter — by design, gated on the operator consenting Sites.ReadWrite.All.
One-time Entra ID app registration per tenant (shareable across operators); an admin grants consent once. Delta tokens expire after ~30 days — the snapshot then transparently rebuilds. MSAL's cached sign-in uses a 90-day sliding window before an interactive re-sign-in is requested.
Register the Entra ID app once, sign in with Microsoft, and every SharePoint list your operators can already see becomes a live, editable layer — with SharePoint keeping the audit trail.