> ## Documentation Index
> Fetch the complete documentation index at: https://docs.prisme.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# SharePoint

> SharePoint sites, document libraries, files, lists and permissions from Agent Creator agents and Builder workflows, via Microsoft Graph with per-user Microsoft Entra OAuth

<img src="https://mintcdn.com/prismeai/107CJC0iC0TOqNad/images/connectors/sharepoint.svg?fit=max&auto=format&n=107CJC0iC0TOqNad&q=85&s=b958760e9a8b5b4507660e1db1f8a6e1" alt="SharePoint" width="96" height="96" noZoom style={{ float: "left", marginRight: "1.25rem", marginBottom: "0.5rem" }} data-path="images/connectors/sharepoint.svg" />

The SharePoint app provides read/write access to Microsoft SharePoint Online and OneDrive through the [Microsoft Graph](https://learn.microsoft.com/en-us/graph/overview) REST API (v1.0): sites, document libraries (drives), files and folders, SharePoint lists, sharing permissions, and the Azure AD directory. It can also read Excel `.xlsx` workbooks and Word `.docx` documents **natively**: cell values and document text are parsed in-process, with no download, OCR or external extraction service. It can be consumed two ways: as a remote MCP server that **Agent Creator** agents call as tools, or as a Builder app whose instructions you call directly from DSUL. The MCP surface groups every operation into **nine entity tools** (`sites`, `drives`, `items`, `search`, `permissions`, `lists`, `directory`, `workbook`, `documents`), each driven by an `action` argument, and runs in the **tenant app-instance context** (it resolves the installing workspace's own credentials). Authentication is per-user and supports several modes:

* **Per-user OAuth2 (central client)** (`oauthCentral`, recommended): one Microsoft Entra OAuth Application is registered once by the platform maintainer; every end user signs in with their own Microsoft account. Nothing to register per tenant: each workspace just installs the app and clicks *Connect*.
* **Per-user OAuth2 (tenant client)** (`oauth`): paste your own Entra application (client) ID/secret in the connector config app. Each user signs in with their own account against your client (PKCE authorization-code flow).
* **Application (client credentials)** (`clientCredentials`): an Entra app with **application** Graph permissions and admin consent, acting without an interactive sign-in. Best for back-office / service automations and content indexing.
* **Direct access token** (`accessToken`): a caller-managed Microsoft Graph access token, used as-is with no exchange.

<CardGroup cols={3}>
  <Card title="Sites & files" icon="folder-tree">
    Discover sites and subsites, browse document libraries and folders, read/create/move/copy files, get pre-signed download URLs, thumbnails and versions, and read Excel `.xlsx` workbooks and Word `.docx` documents natively (cell values, full text)
  </Card>

  <Card title="Lists, search & permissions" icon="list">
    Query and write SharePoint lists and list items, run Microsoft Search across drives and sites, and inspect or manage sharing permissions for access-aware RAG
  </Card>

  <Card title="Flexible per-user auth" icon="key">
    Per-user Microsoft Entra OAuth (central or tenant client), application client-credentials, or a direct access token
  </Card>
</CardGroup>

## Video tutorial

This four-minute tutorial walks through the four ways to use this connector, from the simplest to the most advanced: connecting your own Microsoft account from a chat, adding the SharePoint Next capability to an agent in Agent Creator, controlling authentication and authorized agents from a Builder workspace (with a `searchSites` automation), and declaring the platform OAuth client as an administrator.

Use the buttons in the top-right corner of the player to switch the narration language and the subtitles. The sections on the left are clickable. Screens show the English interface; narration and subtitles are available in English and French.

<div className="pv-host not-prose" data-base="/tutorials/sharepoint/" data-tutorial="eyJ2ZXJzaW9uIjoxLCJsYW5ncyI6WyJlbiIsImZyIl0sImRlZmF1bHRfbGFuZyI6ImVuIiwibGFiZWxzIjp7ImVuIjoiRW5nbGlzaCIsImZyIjoiRnJhbsOnYWlzIn0sInVpIjp7ImVuIjp7ImZvb3RlciI6IlByaXNtZS5haSDCtyBTaGFyZVBvaW50IE5leHQgY29ubmVjdG9yIn0sImZyIjp7ImZvb3RlciI6IlByaXNtZS5haSDCtyBDb25uZWN0ZXVyIFNoYXJlUG9pbnQgTmV4dCJ9fSwiY292ZXIiOnsiZW4iOnsiZXllYnJvdyI6IlByaXNtZS5haSDCtyBDb25uZWN0b3JzIiwidGl0bGUiOiJTaGFyZVBvaW50IGluIFByaXNtZS5haSIsInN1YiI6IkZyb20gY2hhdCB0byBhZG1pbmlzdHJhdGlvbjogZm91ciBsZXZlbHMgb2YgdXNlLiIsInBpbGwiOiJTYW5kYm94IMK3IGd1aWRlZCBkZW1vIn0sImZyIjp7ImV5ZWJyb3ciOiJQcmlzbWUuYWkgwrcgQ29ubmVjdGV1cnMiLCJ0aXRsZSI6IlNoYXJlUG9pbnQgZGFucyBQcmlzbWUuYWkiLCJzdWIiOiJEdSBjaGF0IMOgIGwnYWRtaW5pc3RyYXRpb24sIHF1YXRyZSBuaXZlYXV4IGQndXNhZ2UuIiwicGlsbCI6IlNhbmRib3ggwrcgZMOpbW8gZ3VpZMOpZSJ9fSwidmlkZW8iOnsic3JjIjoibWVkaWEvdmlkZW8ubXA0Iiwid2lkdGgiOjE5MjAsImhlaWdodCI6MTIwMCwiZHVyYXRpb24iOjIyMS45NX0sInJhdGVzIjpbMSwwLjc1LDEuMjUsMS41XSwidm9pY2VzIjp7ImVuIjp7IjEiOiJtZWRpYS92b2ljZV9lbi5tcDMiLCIwLjc1IjoibWVkaWEvdm9pY2VfZW5fMC43NS5tcDMiLCIxLjI1IjoibWVkaWEvdm9pY2VfZW5fMS4yNS5tcDMiLCIxLjUiOiJtZWRpYS92b2ljZV9lbl8xLjUubXAzIn0sImZyIjp7IjEiOiJtZWRpYS92b2ljZV9mci5tcDMiLCIwLjc1IjoibWVkaWEvdm9pY2VfZnJfMC43NS5tcDMiLCIxLjI1IjoibWVkaWEvdm9pY2VfZnJfMS4yNS5tcDMiLCIxLjUiOiJtZWRpYS92b2ljZV9mcl8xLjUubXAzIn19LCJzdWJ0aXRsZXMiOnsiZW4iOiJ0cmFja3Mvc3Vic19lbi5qc29uIiwiZnIiOiJ0cmFja3Mvc3Vic19mci5qc29uIn0sImNoYXB0ZXJzIjp7ImVuIjoidHJhY2tzL2NoYXB0ZXJzX2VuLmpzb24iLCJmciI6InRyYWNrcy9jaGFwdGVyc19mci5qc29uIn0sImJyYW5kIjp7ImxvZ29fY29sb3IiOiJicmFuZC9sb2dvLWNvbG9yLnBuZyIsImxvZ29fd2hpdGUiOiJicmFuZC9sb2dvLXdoaXRlLnBuZyIsIm1hcmtfbGlnaHRfYmx1ZSI6ImJyYW5kL21hcmstbGlnaHQtYmx1ZS5wbmciLCJ0aXRsZV9mb250IjoiYnJhbmQvUGxheS1Cb2xkLnR0ZiIsImNvbG9ycyI6eyJjb3Zlcl9iZyI6IiMxRTUwRDIiLCJjb3Zlcl9tYXJrIjoiIzREOEJFRSIsImNvdmVyX2V5ZWJyb3ciOiIjOURCNEVFIiwiY292ZXJfc3VidGl0bGUiOiIjQzlEOEY3IiwiY292ZXJfcGlsbF9iZyI6IiNGRkZGRkYiLCJjb3Zlcl9waWxsX3RleHQiOiIjMjA1QkUxIiwicGFnZV9iZyI6IiNGRkZGRkYiLCJzdXJmYWNlIjoiI0Y4RkFGRCIsInN1cmZhY2VfYmx1ZSI6IiNFN0VFRkQiLCJib3JkZXIiOiIjRTRFN0VEIiwicHJpbWFyeSI6IiMyMDVCRTEiLCJpbmsiOiIjMTUxQjI0IiwiYm9keSI6IiM1MzVBNkEiLCJtdXRlZCI6IiM2OTcwN0YiLCJhY2NlbnRfb3JhbmdlIjoiI0U5NzEzMiIsImFjY2VudF9ncmVlbiI6IiMxRjhBNEMiLCJhY2NlbnRfdGVhbCI6IiMwRTdDNjYiLCJhY2NlbnRfcHVycGxlIjoiIzZBM0RCQiIsImFjY2VudF9yZWQiOiIjQzAzOTJCIn19LCJ0cmFja3MiOnsiZW4iOnsiY2hhcHRlcnMiOlt7InN0YXJ0IjowLjAsImVuZCI6Ni4zNCwia2luZCI6ImNvdmVyIiwic3RlcCI6MCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiUHJpc21lLmFpIMK3IENvbm5lY3RvcnMiLCJ0aXRsZSI6IlNoYXJlUG9pbnQgaW4gUHJpc21lLmFpIiwic3ViIjoiRnJvbSBjaGF0IHRvIGFkbWluaXN0cmF0aW9uOiBmb3VyIGxldmVscyBvZiB1c2UuIiwidXJsIjoiIn0seyJzdGFydCI6Ni4zNCwiZW5kIjozOC4zOSwia2luZCI6InN0ZXAiLCJzdGVwIjoxLCJzdGVwcyI6MTQsInNlY3Rpb24iOiJDaGF0IiwidGl0bGUiOiJDb25uZWN0IHlvdXIgYWNjb3VudCBmcm9tIHRoZSBjaGF0Iiwic3ViIjoiQW4gYWdlbnQgd2l0aCB0aGUgU2hhcmVQb2ludCBjb25uZWN0b3Igb2ZmZXJzIE9BdXRoIHNpZ24taW4sIHRoZW4gYW5zd2VycyB3aXRoIHlvdXIgZmlsZXMuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYy9zaGFyZXBvaW50In0seyJzdGFydCI6MzguMzksImVuZCI6NTQuNjYsImtpbmQiOiJzdGVwIiwic3RlcCI6Miwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiQ3JlYXRlIGFuIGFnZW50Iiwic3ViIjoiQ3JlYXRpb24gd2l6YXJkOiB0eXBlLCBuYW1lLCBtb2RlbCwgaW5zdHJ1Y3Rpb25zLiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2FwcHMvYWdlbnQtZmFjdG9yeSJ9LHsic3RhcnQiOjU0LjY2LCJlbmQiOjY4LjQ1LCJraW5kIjoic3RlcCIsInN0ZXAiOjMsInN0ZXBzIjoxNCwic2VjdGlvbiI6IkFnZW50IENyZWF0b3IiLCJ0aXRsZSI6IkFkZCB0aGUgU2hhcmVQb2ludCBOZXh0IGNhcGFiaWxpdHkiLCJzdWIiOiJPbmUgY2xpY2sgaW4gdGhlIGNhcGFiaWxpdHkgY2F0YWxvZywgbm90aGluZyB0byBjb25maWd1cmUuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9hZ2VudC1mYWN0b3J5In0seyJzdGFydCI6NjguNDUsImVuZCI6ODUuOTcsImtpbmQiOiJzdGVwIiwic3RlcCI6NCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiSXQgd29ya3MgcmlnaHQgYXdheSIsInN1YiI6IkluIHRoZSBQbGF5Z3JvdW5kLCB0aGUgYWdlbnQgY29ubmVjdHMgYW5kIGxpc3RzIHRoZSBTaGFyZVBvaW50IHNpdGVzLiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2FwcHMvYWdlbnQtZmFjdG9yeSJ9LHsic3RhcnQiOjg1Ljk3LCJlbmQiOjkzLjM3LCJraW5kIjoic3RlcCIsInN0ZXAiOjUsInN0ZXBzIjoxNCwic2VjdGlvbiI6IkFnZW50IENyZWF0b3IiLCJ0aXRsZSI6IlJlbW92ZSB0aGUgY2FwYWJpbGl0eSIsInN1YiI6IlRyYXNoLCBjb25maXJtOiB0aGUgYWdlbnQgbm8gbG9uZ2VyIGhhcyBhY2Nlc3MgdG8gU2hhcmVQb2ludC4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9hcHBzL2FnZW50LWZhY3RvcnkifSx7InN0YXJ0Ijo5My4zNywiZW5kIjoxMDYuMTUsImtpbmQiOiJzdGVwIiwic3RlcCI6Niwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWR2YW5jZWQgQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiV2h5IGdvIHRocm91Z2ggdGhlIGJ1aWxkZXI/Iiwic3ViIjoiQSBkZWRpY2F0ZWQgd29ya3NwYWNlIGdpdmVzIGNvbnRyb2wgb3ZlciBhdXRoZW50aWNhdGlvbjogc2VydmljZSB0b2tlbiwgeW91ciBvd24gRW50cmEgYXBwLCBhdXRob3JpemVkIGFnZW50cy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MTA2LjE1LCJlbmQiOjExNS4yMiwia2luZCI6InN0ZXAiLCJzdGVwIjo3LCJzdGVwcyI6MTQsInNlY3Rpb24iOiJBZHZhbmNlZCBBZ2VudCBDcmVhdG9yIiwidGl0bGUiOiJJbnN0YWxsIFNoYXJlUG9pbnQgTmV4dCIsInN1YiI6IlRoZSB3b3Jrc3BhY2UgQXBwIFN0b3JlLCB0aGVuIHRoZSBjb25uZWN0b3IncyBjb25maWd1cmF0aW9uIHBhZ2UuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYnVpbGRlciJ9LHsic3RhcnQiOjExNS4yMiwiZW5kIjoxMzAuNDQsImtpbmQiOiJzdGVwIiwic3RlcCI6OCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWR2YW5jZWQgQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiQ29ubmVjdGlvbiBtb2RlcyIsInN1YiI6IlBsYXRmb3JtIE9BdXRoIGNsaWVudCwgeW91ciBvd24gRW50cmEgYXBwLCBjbGllbnQgY3JlZGVudGlhbHMgKHNlcnZpY2UgdG9rZW4pIG9yIGFjY2VzcyB0b2tlbi4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MTMwLjQ0LCJlbmQiOjE0OC4xNiwia2luZCI6InN0ZXAiLCJzdGVwIjo5LCJzdGVwcyI6MTQsInNlY3Rpb24iOiJBZHZhbmNlZCBBZ2VudCBDcmVhdG9yIiwidGl0bGUiOiJNQ1AgYW5kIGF1dGhvcml6ZWQgYWdlbnRzIiwic3ViIjoiVGhlIE1DUCBlbmRwb2ludCBpcyBleHBvc2VkOyBvbmx5IGNoZWNrZWQgYWdlbnRzIG1heSBjYWxsIGl0LiBUaGVuIMKrIEluc3RhbGwgY2FwYWJpbGl0eSDCuy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MTQ4LjE2LCJlbmQiOjE2NC40OCwia2luZCI6InN0ZXAiLCJzdGVwIjoxMCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWR2YW5jZWQgQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiQmFjayBpbiBBZ2VudCBDcmVhdG9yIiwic3ViIjoiVGhlIGNhcGFiaWxpdHkgYXBwZWFycyBvbiB0aGUgYXV0aG9yaXplZCBhZ2VudCwgd2hpY2ggYW5zd2VycyByaWdodCBhd2F5LiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2FwcHMvYWdlbnQtZmFjdG9yeSJ9LHsic3RhcnQiOjE2NC40OCwiZW5kIjoxNzUuMzgsImtpbmQiOiJzdGVwIiwic3RlcCI6MTEsInN0ZXBzIjoxNCwic2VjdGlvbiI6IkJ1aWxkZXIiLCJ0aXRsZSI6IkNvbm5lY3QgZnJvbSB0aGUgd29ya3NwYWNlIiwic3ViIjoiVGhlIGNvbm5lY3RlZCBhY2NvdW50IHNlcnZlcyBhdXRvbWF0aW9ucyBhbmQgc2NoZWR1bGVkIHJ1bnMuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYnVpbGRlciJ9LHsic3RhcnQiOjE3NS4zOCwiZW5kIjoxOTcuMzksImtpbmQiOiJzdGVwIiwic3RlcCI6MTIsInN0ZXBzIjoxNCwic2VjdGlvbiI6IkJ1aWxkZXIiLCJ0aXRsZSI6IkEgU2hhcmVQb2ludCBhdXRvbWF0aW9uIiwic3ViIjoiRXZlcnkgR3JhcGggb3BlcmF0aW9uIGJlY29tZXMgYW4gaW5zdHJ1Y3Rpb246IGhlcmUgc2VhcmNoU2l0ZXMgd2l0aCDCqyAqIMK7LiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2J1aWxkZXIifSx7InN0YXJ0IjoxOTcuMzksImVuZCI6MjA0LjcyLCJraW5kIjoic3RlcCIsInN0ZXAiOjEzLCJzdGVwcyI6MTQsInNlY3Rpb24iOiJCdWlsZGVyIiwidGl0bGUiOiJSdW4iLCJzdWIiOiJzZWFyY2hTaXRlcyB0aGVuIGEgbG9vcDogdGhlIGxpc3Qgb2Ygc2l0ZSBuYW1lcy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MjA0LjcyLCJlbmQiOjIyMS45NSwia2luZCI6InN0ZXAiLCJzdGVwIjoxNCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWRtaW5pc3RyYXRvciIsInRpdGxlIjoiVGhlIHBsYXRmb3JtIE9BdXRoIGNsaWVudCIsInN1YiI6IkluIHRoZSBjb25uZWN0b3IncyB3b3Jrc3BhY2UsIHRoZSBhZG1pbmlzdHJhdG9yIGRlY2xhcmVzIG9uY2UgdGhlIEVudHJhIGNsaWVudCBzaGFyZWQgYnkgZXZlcnlvbmUuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9zaGFyZXBvaW50LW5leHQifV0sInN1YnMiOlt7InN0YXJ0IjowLjQsImVuZCI6NS42OCwidGV4dCI6IlNoYXJlUG9pbnQgaW4gUHJpc21lIGRvdCBBIEkuIEknbGwgc2hvdyB5b3UgZm91ciB3YXlzIHRvIHVzZSBpdCwgZnJvbSB0aGUgc2ltcGxlc3QgdG8gdGhlIG1vc3QgYWR2YW5jZWQuIn0seyJzdGFydCI6Ni4zNiwiZW5kIjoxMC4xNCwidGV4dCI6IkxldmVsIG9uZTogdGhlIGNoYXQuIEkgb3BlbiBhbiBhZ2VudCB0aGF0IGhhcyB0aGUgU2hhcmVQb2ludCBjb25uZWN0b3IuIn0seyJzdGFydCI6MTAuNDQsImVuZCI6MTMuNywidGV4dCI6IkluIHRoZSBUb29scyBtZW51LCBTaGFyZVBvaW50IHNheXMgYSBjb25uZWN0aW9uIGlzIHJlcXVpcmVkLiJ9LHsic3RhcnQiOjE1LjA5LCJlbmQiOjE3LjM3LCJ0ZXh0IjoiSSBhc2sgaXQgZm9yIHRoZSBmaWxlcyBpbiBteSBPbmVEcml2ZS4ifSx7InN0YXJ0IjoxOS4xNywiZW5kIjoyMi4yMywidGV4dCI6IlRoZSBhZ2VudCBvZmZlcnMgdG8gY29ubmVjdCBteSBhY2NvdW50LiBJIGNsaWNrIENvbm5lY3QuIn0seyJzdGFydCI6MjMuMzQsImVuZCI6MjcuMTEsInRleHQiOiJNaWNyb3NvZnQgY29uZmlybXMgdGhlIGNvbm5lY3Rpb24sIGFuZCB0aGUgYWdlbnQgY2FycmllcyBvbiBieSBpdHNlbGYuIn0seyJzdGFydCI6MjguOTEsImVuZCI6MzAuODYsInRleHQiOiJIZXJlIGlzIHRoZSBjb250ZW50IG9mIG15IE9uZURyaXZlLiJ9LHsic3RhcnQiOjMyLjk2LCJlbmQiOjM3LjQ4LCJ0ZXh0IjoiVGhlIFRvb2xzIG1lbnUgbm93IHNob3dzIHRoZSBjb25uZWN0ZWQgYWNjb3VudCwgd2hpY2ggSSBjYW4gZGlzY29ubmVjdCBhdCBhbnkgdGltZS4ifSx7InN0YXJ0IjozOC40NCwiZW5kIjo0MS4yLCJ0ZXh0IjoiTGV2ZWwgdHdvOiBBZ2VudCBDcmVhdG9yLiBJIGNyZWF0ZSBhIG5ldyBhZ2VudC4ifSx7InN0YXJ0Ijo0My40MSwiZW5kIjo0NS44NiwidGV4dCI6IkkgcGljayB0aGUgQXNzaXN0YW50IHR5cGUsIHdoaWNoIGNhbiB1c2UgdG9vbHMuIn0seyJzdGFydCI6NDcuMjUsImVuZCI6NDkuMTUsInRleHQiOiJJIGdpdmUgaXQgYSBuYW1lLCB0aGVuIGluc3RydWN0aW9ucy4ifSx7InN0YXJ0Ijo1MS4yNSwiZW5kIjo1Mi43NiwidGV4dCI6IkFuZCBJIGNyZWF0ZSB0aGUgYWdlbnQuIn0seyJzdGFydCI6NTQuOTMsImVuZCI6NTguNzEsInRleHQiOiJJbiB0aGUgQ2FwYWJpbGl0aWVzIHRhYiwgSSBvcGVuIHRoZSBjYXRhbG9nIGFuZCBzZWFyY2ggZm9yIFNoYXJlUG9pbnQuIn0seyJzdGFydCI6NTkuNjEsImVuZCI6NjIuMzUsInRleHQiOiJUaGUgZm9ybSBpcyBhbHJlYWR5IGZpbGxlZCBpbjogSSBqdXN0IGNsaWNrIEFkZC4ifSx7InN0YXJ0Ijo2NC4zOCwiZW5kIjo2NS43MiwidGV4dCI6IlRoZSBjYXBhYmlsaXR5IGlzIGFkZGVkLiJ9LHsic3RhcnQiOjY4LjQ4LCJlbmQiOjcwLjU4LCJ0ZXh0IjoiSSB0ZXN0IGl0IHJpZ2h0IGF3YXkgaW4gdGhlIFBsYXlncm91bmQuIn0seyJzdGFydCI6NzIuMzgsImVuZCI6NzQuNjksInRleHQiOiJJIGFzayB3aGljaCBTaGFyZVBvaW50IHNpdGVzIEkgY2FuIGFjY2Vzcy4ifSx7InN0YXJ0Ijo3Ni45MiwiZW5kIjo4MC41NSwidGV4dCI6IlRoZSBjb25uZWN0aW9uIGJlbG9uZ3MgdG8gZWFjaCBhZ2VudCwgc28gSSBjb25uZWN0IGFnYWluLCBpbiBvbmUgY2xpY2suIn0seyJzdGFydCI6ODEuNzUsImVuZCI6ODQuMDcsInRleHQiOiJUaGUgYWdlbnQgbGlzdHMgdGhlIHNpdGVzIEkgaGF2ZSBhY2Nlc3MgdG8uIn0seyJzdGFydCI6ODYuNDcsImVuZCI6ODguNzIsInRleHQiOiJUbyByZW1vdmUgYWNjZXNzLCBJIGRlbGV0ZSB0aGUgY2FwYWJpbGl0eS4ifSx7InN0YXJ0Ijo5MC40NCwiZW5kIjo5Mi40NiwidGV4dCI6IkkgY2xpY2sgdGhlIHRyYXNoIGljb24sIGFuZCBjb25maXJtLiJ9LHsic3RhcnQiOjkzLjQyLCJlbmQiOjk5LjgxLCJ0ZXh0IjoiTGV2ZWwgdGhyZWU6IHRoZSBidWlsZGVyLiBZb3UgZ28gdGhlcmUgd2hlbiB5b3UgbmVlZCBhIHNlcnZpY2UgdG9rZW4sIGZvciBqb2JzIHdpdGhvdXQgYSB1c2VyLCBvciB5b3VyIG93biBFbnRyYSBhcHBsaWNhdGlvbi4ifSx7InN0YXJ0IjoxMDIuNjIsImVuZCI6MTA1LjI1LCJ0ZXh0IjoiSSBjcmVhdGUgYSB3b3Jrc3BhY2UgY2FsbGVkIETDqW1vIFNoYXJlUG9pbnQuIn0seyJzdGFydCI6MTA3LjE3LCJlbmQiOjExMC41NywidGV4dCI6IkZyb20gSW1wb3J0cywgSSBvcGVuIHRoZSBBcHAgU3RvcmUgYW5kIGluc3RhbGwgU2hhcmVQb2ludCBOZXh0LiJ9LHsic3RhcnQiOjExMS41NCwiZW5kIjoxMTMuMzIsInRleHQiOiJIZXJlIGlzIGl0cyBjb25maWd1cmF0aW9uIHBhZ2UuIn0seyJzdGFydCI6MTE1LjcyLCJlbmQiOjExNy41NywidGV4dCI6IlRoZXJlIGFyZSBmb3VyIGNvbm5lY3Rpb24gbW9kZXMuIn0seyJzdGFydCI6MTE3LjgyLCJlbmQiOjEyMC4xOSwidGV4dCI6Ik9BdXRoIHdpdGggeW91ciBvd24gRW50cmEgYXBwbGljYXRpb24sIn0seyJzdGFydCI6MTIwLjQ5LCJlbmQiOjEyNC44OSwidGV4dCI6ImNsaWVudCBjcmVkZW50aWFscywgd2hpY2ggaXMgdGhlIHNlcnZpY2UgdG9rZW4sIG9yIGEgZGlyZWN0IGFjY2VzcyB0b2tlbi4ifSx7InN0YXJ0IjoxMjUuMTksImVuZCI6MTI4LjU0LCJ0ZXh0IjoiSSBrZWVwIHRoZSBwbGF0Zm9ybSBPQXV0aCBjbGllbnQsIHdpdGhvdXQgZmlsbGluZyBpbiBhbnl0aGluZy4ifSx7InN0YXJ0IjoxMzEuNjQsImVuZCI6MTM0LjgyLCJ0ZXh0IjoiVGhlIGNvbm5lY3RvciBleHBvc2VzIGFuIE1DUCBzZXJ2ZXI6IGhlcmUgaXMgaXRzIGFkZHJlc3MuIn0seyJzdGFydCI6MTM2LjI5LCJlbmQiOjEzOS4zNSwidGV4dCI6IkZvciBzZWN1cml0eSwgb25seSB0aGUgYWdlbnRzIGNoZWNrZWQgaGVyZSBjYW4gY2FsbCBpdC4ifSx7InN0YXJ0IjoxNDEuMDIsImVuZCI6MTQzLjEzLCJ0ZXh0IjoiSSBhdXRob3JpemUgdGhlIGFnZW50IE1lcyBkb2N1bWVudHMuIn0seyJzdGFydCI6MTQ0LjkzLCJlbmQiOjE0Ny4yNiwidGV4dCI6IkFuZCBJIGluc3RhbGwgdGhlIGNhcGFiaWxpdHkgb24gdGhpcyBhZ2VudC4ifSx7InN0YXJ0IjoxNDguNjYsImVuZCI6MTUxLjQzLCJ0ZXh0IjoiQmFjayBpbiBBZ2VudCBDcmVhdG9yLCBJIG9wZW4gdGhlIGFnZW50LiJ9LHsic3RhcnQiOjE1Mi4zMywiZW5kIjoxNTYuMTMsInRleHQiOiJUaGUgU2hhcmVQb2ludCBOZXh0IGNhcGFiaWxpdHkgaXMgdGhlcmUsIGluc3RhbGxlZCBmcm9tIHRoZSBidWlsZGVyLiJ9LHsic3RhcnQiOjE1Ny41NSwiZW5kIjoxNTkuMDgsInRleHQiOiJJIHRlc3QgaXQgaW4gdGhlIFBsYXlncm91bmQuIn0seyJzdGFydCI6MTYwLjg4LCJlbmQiOjE2My4zOCwidGV4dCI6Ikl0IGFuc3dlcnMgcmlnaHQgYXdheSwgd2l0aCB0aGUgbGlzdCBvZiBzaXRlcy4ifSx7InN0YXJ0IjoxNjQuNTgsImVuZCI6MTY4LjY2LCJ0ZXh0IjoiTGV2ZWwgZm91cjogYXV0b21hdGlvbnMuIEluIHRoZSB3b3Jrc3BhY2UsIEkgY29ubmVjdCBteSBNaWNyb3NvZnQgYWNjb3VudC4ifSx7InN0YXJ0IjoxNzAuMjIsImVuZCI6MTczLjQ2LCJ0ZXh0IjoiSXQncyBjb25uZWN0ZWQ6IHRoaXMgdG9rZW4gd2lsbCBhbHNvIHNlcnZlIHNjaGVkdWxlZCBydW5zLiJ9LHsic3RhcnQiOjE3NS40OCwiZW5kIjoxNzYuOTYsInRleHQiOiJJIGNyZWF0ZSBhbiBhdXRvbWF0aW9uLiJ9LHsic3RhcnQiOjE3Ny40MSwiZW5kIjoxODAuNywidGV4dCI6IkV2ZXJ5IFNoYXJlUG9pbnQgb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSBhcyBhbiBpbnN0cnVjdGlvbi4ifSx7InN0YXJ0IjoxODIuNzksImVuZCI6MTg0LjMxLCJ0ZXh0IjoiSSBzZWFyY2ggZm9yIHNlYXJjaFNpdGVzLiJ9LHsic3RhcnQiOjE4NC43LCJlbmQiOjE4Ni41MywidGV4dCI6IkkgYWRkIGl0LCB0aGVuIHN3aXRjaCB0byBZQU1MLiJ9LHsic3RhcnQiOjE4Ni44MywiZW5kIjoxOTEuNDUsInRleHQiOiJJIHBhc3RlIHRoZSBibG9jazogc2VhcmNoU2l0ZXMgd2l0aCBhIHN0YXIsIHRoZW4gYSBsb29wIHRoYXQgY29sbGVjdHMgZWFjaCBzaXRlJ3MgbmFtZS4ifSx7InN0YXJ0IjoxOTMuMzQsImVuZCI6MTk1LjI1LCJ0ZXh0IjoiSSBzYXZlLCBhbmQgZ28gYmFjayB0byB0aGUgZ3JhcGggdmlldy4ifSx7InN0YXJ0IjoxOTguMjUsImVuZCI6MTk5LjQ1LCJ0ZXh0IjoiSSBydW4gdGhlIGF1dG9tYXRpb24uIn0seyJzdGFydCI6MjAwLjc4LCJlbmQiOjIwMi41MSwidGV4dCI6IkFuZCBoZXJlIGlzIHRoZSBsaXN0IG9mIHNpdGVzLiJ9LHsic3RhcnQiOjIwNS4yMiwiZW5kIjoyMDkuNTQsInRleHQiOiJGaW5hbGx5LCB0aGUgYWRtaW5pc3RyYXRvciBzaWRlOiBJIG9wZW4gdGhlIGNvbm5lY3RvcidzIHdvcmtzcGFjZS4ifSx7InN0YXJ0IjoyMDkuNzksImVuZCI6MjE1LjM2LCJ0ZXh0IjoiVGhpcyBpcyB3aGVyZSB0aGUgYWRtaW5pc3RyYXRvciBkZWNsYXJlcywgb25jZSBhbmQgZm9yIGFsbCwgdGhlIHBsYXRmb3JtIE9BdXRoIGNsaWVudCB1c2VkIGJ5IGV2ZXJ5b25lLiJ9LHsic3RhcnQiOjIxNi41NiwiZW5kIjoyMjEuMDUsInRleHQiOiJBbmQgdGhpcyBidXR0b24gcHVibGlzaGVzIHRoZSBjb25uZWN0b3IgdG8gdGhlIG9yZ2FuaXphdGlvbidzIGNhcGFiaWxpdHkgY2F0YWxvZy4ifV19LCJmciI6eyJjaGFwdGVycyI6W3sic3RhcnQiOjAuMCwiZW5kIjo2LjM0LCJraW5kIjoiY292ZXIiLCJzdGVwIjowLCJzdGVwcyI6MTQsInNlY3Rpb24iOiJQcmlzbWUuYWkgwrcgQ29ubmVjdGV1cnMiLCJ0aXRsZSI6IlNoYXJlUG9pbnQgZGFucyBQcmlzbWUuYWkiLCJzdWIiOiJEdSBjaGF0IMOgIGwnYWRtaW5pc3RyYXRpb24sIHF1YXRyZSBuaXZlYXV4IGQndXNhZ2UuIiwidXJsIjoiIn0seyJzdGFydCI6Ni4zNCwiZW5kIjozOC4zOSwia2luZCI6InN0ZXAiLCJzdGVwIjoxLCJzdGVwcyI6MTQsInNlY3Rpb24iOiJVc2FnZSBwYXIgY2hhdCIsInRpdGxlIjoiQ29ubmVjdGVyIHNvbiBjb21wdGUgZGVwdWlzIGxlIGNoYXQiLCJzdWIiOiJVbiBhZ2VudCBkb3TDqSBkdSBjb25uZWN0ZXVyIFNoYXJlUG9pbnQgcHJvcG9zZSBsYSBjb25uZXhpb24gT0F1dGgsIHB1aXMgcsOpcG9uZCBhdmVjIHZvcyBmaWNoaWVycy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9jL3NoYXJlcG9pbnQifSx7InN0YXJ0IjozOC4zOSwiZW5kIjo1NC42Niwia2luZCI6InN0ZXAiLCJzdGVwIjoyLCJzdGVwcyI6MTQsInNlY3Rpb24iOiJBZ2VudCBDcmVhdG9yIiwidGl0bGUiOiJDcsOpZXIgdW4gYWdlbnQiLCJzdWIiOiJBc3Npc3RhbnQgZGUgY3LDqWF0aW9uIDogdHlwZSwgbm9tLCBtb2TDqGxlLCBpbnN0cnVjdGlvbnMuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9hZ2VudC1mYWN0b3J5In0seyJzdGFydCI6NTQuNjYsImVuZCI6NjguNDUsImtpbmQiOiJzdGVwIiwic3RlcCI6Mywic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiQWpvdXRlciBsYSBjYXBhY2l0w6kgU2hhcmVQb2ludCBOZXh0Iiwic3ViIjoiVW4gY2xpYyBkYW5zIGxlIGNhdGFsb2d1ZSBkZSBjYXBhY2l0w6lzLCBhdWN1bmUgY29uZmlndXJhdGlvbi4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9hcHBzL2FnZW50LWZhY3RvcnkifSx7InN0YXJ0Ijo2OC40NSwiZW5kIjo4NS45Nywia2luZCI6InN0ZXAiLCJzdGVwIjo0LCJzdGVwcyI6MTQsInNlY3Rpb24iOiJBZ2VudCBDcmVhdG9yIiwidGl0bGUiOiLDh2EgbWFyY2hlIHRvdXQgZGUgc3VpdGUiLCJzdWIiOiJEYW5zIGxlIFBsYXlncm91bmQsIGwnYWdlbnQgc2UgY29ubmVjdGUgZXQgbGlzdGUgbGVzIHNpdGVzIFNoYXJlUG9pbnQuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9hZ2VudC1mYWN0b3J5In0seyJzdGFydCI6ODUuOTcsImVuZCI6OTMuMzcsImtpbmQiOiJzdGVwIiwic3RlcCI6NSwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWdlbnQgQ3JlYXRvciIsInRpdGxlIjoiUmV0aXJlciBsYSBjYXBhY2l0w6kiLCJzdWIiOiJDb3JiZWlsbGUsIGNvbmZpcm1hdGlvbiA6IGwnYWdlbnQgbidhIHBsdXMgYWNjw6hzIMOgIFNoYXJlUG9pbnQuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9hZ2VudC1mYWN0b3J5In0seyJzdGFydCI6OTMuMzcsImVuZCI6MTA2LjE1LCJraW5kIjoic3RlcCIsInN0ZXAiOjYsInN0ZXBzIjoxNCwic2VjdGlvbiI6IkFnZW50IENyZWF0b3IgYXZhbmPDqSIsInRpdGxlIjoiUG91cnF1b2kgcGFzc2VyIHBhciBsZSBidWlsZGVyID8iLCJzdWIiOiJVbiB3b3Jrc3BhY2UgZMOpZGnDqSBkb25uZSBsYSBtYWluIHN1ciBsJ2F1dGhlbnRpZmljYXRpb24gOiBzZXJ2aWNlIHRva2VuLCBhcHAgRW50cmEgcHJvcHJlLCBhZ2VudHMgYXV0b3Jpc8Opcy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MTA2LjE1LCJlbmQiOjExNS4yMiwia2luZCI6InN0ZXAiLCJzdGVwIjo3LCJzdGVwcyI6MTQsInNlY3Rpb24iOiJBZ2VudCBDcmVhdG9yIGF2YW5jw6kiLCJ0aXRsZSI6Ikluc3RhbGxlciBTaGFyZVBvaW50IE5leHQiLCJzdWIiOiJBcHAgU3RvcmUgZHUgd29ya3NwYWNlLCBwdWlzIGxhIHBhZ2UgZGUgY29uZmlndXJhdGlvbiBkdSBjb25uZWN0ZXVyLiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2J1aWxkZXIifSx7InN0YXJ0IjoxMTUuMjIsImVuZCI6MTMwLjQ0LCJraW5kIjoic3RlcCIsInN0ZXAiOjgsInN0ZXBzIjoxNCwic2VjdGlvbiI6IkFnZW50IENyZWF0b3IgYXZhbmPDqSIsInRpdGxlIjoiTGVzIG1vZGVzIGRlIGNvbm5leGlvbiIsInN1YiI6IkNsaWVudCBPQXV0aCBkZSBsYSBwbGF0ZWZvcm1lLCB2b3RyZSBhcHAgRW50cmEsIGNsaWVudCBjcmVkZW50aWFscyAoc2VydmljZSB0b2tlbikgb3UgYWNjZXNzIHRva2VuLiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2J1aWxkZXIifSx7InN0YXJ0IjoxMzAuNDQsImVuZCI6MTQ4LjE2LCJraW5kIjoic3RlcCIsInN0ZXAiOjksInN0ZXBzIjoxNCwic2VjdGlvbiI6IkFnZW50IENyZWF0b3IgYXZhbmPDqSIsInRpdGxlIjoiTUNQIGV0IGFnZW50cyBhdXRvcmlzw6lzIiwic3ViIjoiTCdlbmRwb2ludCBNQ1AgZXN0IGV4cG9zw6kgOyBzZXVscyBsZXMgYWdlbnRzIGNvY2jDqXMgcGV1dmVudCBsJ2FwcGVsZXIuIFB1aXMgwqsgSW5zdGFsbGVyIGxhIGNhcGFjaXTDqSDCuy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MTQ4LjE2LCJlbmQiOjE2NC40OCwia2luZCI6InN0ZXAiLCJzdGVwIjoxMCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWdlbnQgQ3JlYXRvciBhdmFuY8OpIiwidGl0bGUiOiJDw7R0w6kgQWdlbnQgQ3JlYXRvciIsInN1YiI6IkxhIGNhcGFjaXTDqSBhcHBhcmHDrnQgc3VyIGwnYWdlbnQgYXV0b3Jpc8OpLCBxdWkgcsOpcG9uZCBhdXNzaXTDtHQuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9hZ2VudC1mYWN0b3J5In0seyJzdGFydCI6MTY0LjQ4LCJlbmQiOjE3NS4zOCwia2luZCI6InN0ZXAiLCJzdGVwIjoxMSwic3RlcHMiOjE0LCJzZWN0aW9uIjoiVXNhZ2UgYnVpbGRlciIsInRpdGxlIjoiU2UgY29ubmVjdGVyIGRlcHVpcyBsZSB3b3Jrc3BhY2UiLCJzdWIiOiJMZSBjb21wdGUgY29ubmVjdMOpIHNlcnQgYXV4IGF1dG9tYXRpc2F0aW9ucyBldCBhdXggZXjDqWN1dGlvbnMgcGxhbmlmacOpZXMuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYnVpbGRlciJ9LHsic3RhcnQiOjE3NS4zOCwiZW5kIjoxOTcuMzksImtpbmQiOiJzdGVwIiwic3RlcCI6MTIsInN0ZXBzIjoxNCwic2VjdGlvbiI6IlVzYWdlIGJ1aWxkZXIiLCJ0aXRsZSI6IlVuZSBhdXRvbWF0aXNhdGlvbiBTaGFyZVBvaW50Iiwic3ViIjoiVG91dGVzIGxlcyBvcMOpcmF0aW9ucyBHcmFwaCBkZXZpZW5uZW50IGRlcyBpbnN0cnVjdGlvbnMgOiBpY2kgc2VhcmNoU2l0ZXMgYXZlYyDCqyAqIMK7LiIsInVybCI6InNhbmRib3gucHJpc21lLmFpL2J1aWxkZXIifSx7InN0YXJ0IjoxOTcuMzksImVuZCI6MjA0LjcyLCJraW5kIjoic3RlcCIsInN0ZXAiOjEzLCJzdGVwcyI6MTQsInNlY3Rpb24iOiJVc2FnZSBidWlsZGVyIiwidGl0bGUiOiJFeMOpY3V0ZXIiLCJzdWIiOiJzZWFyY2hTaXRlcyBwdWlzIHVuZSBib3VjbGUgOiBsYSBsaXN0ZSBkZXMgbm9tcyBkZSBzaXRlcy4iLCJ1cmwiOiJzYW5kYm94LnByaXNtZS5haS9idWlsZGVyIn0seyJzdGFydCI6MjA0LjcyLCJlbmQiOjIyMS45NSwia2luZCI6InN0ZXAiLCJzdGVwIjoxNCwic3RlcHMiOjE0LCJzZWN0aW9uIjoiQWRtaW5pc3RyYXRldXIiLCJ0aXRsZSI6IkxlIGNsaWVudCBPQXV0aCBkZSBsYSBwbGF0ZWZvcm1lIiwic3ViIjoiRGFucyBsZSB3b3Jrc3BhY2UgZHUgY29ubmVjdGV1ciwgbCdhZG1pbmlzdHJhdGV1ciBkw6ljbGFyZSB1bmUgZm9pcyBsZSBjbGllbnQgRW50cmEgcGFydGFnw6kgcGFyIHRvdXMuIiwidXJsIjoic2FuZGJveC5wcmlzbWUuYWkvYXBwcy9zaGFyZXBvaW50LW5leHQifV0sInN1YnMiOlt7InN0YXJ0IjowLjQsImVuZCI6NS44NCwidGV4dCI6IlNoYXJlUG9pbnQgZGFucyBQcmlzbWUgcG9pbnQgQSBJLiBKZSB2b3VzIG1vbnRyZSBxdWF0cmUgZmHDp29ucyBkZSBsJ3V0aWxpc2VyLCBkZSBsYSBwbHVzIHNpbXBsZSDDoCBsYSBwbHVzIGF2YW5jw6llLiJ9LHsic3RhcnQiOjYuMzYsImVuZCI6MTAuMTEsInRleHQiOiJQcmVtaWVyIG5pdmVhdSA6IGxlIGNoYXQuIEonb3V2cmUgdW4gYWdlbnQgcXVpIGRpc3Bvc2UgZHUgY29ubmVjdGV1ciBTaGFyZVBvaW50LiJ9LHsic3RhcnQiOjEwLjQ0LCJlbmQiOjEzLjkzLCJ0ZXh0IjoiRGFucyBsZSBtZW51IE91dGlscywgU2hhcmVQb2ludCBpbmRpcXVlIHF1J3VuZSBjb25uZXhpb24gZXN0IHJlcXVpc2UuIn0seyJzdGFydCI6MTUuMDksImVuZCI6MTcuMzYsInRleHQiOiJKZSBsdWkgZGVtYW5kZSBsZXMgZmljaGllcnMgZGUgbW9uIE9uZURyaXZlLiJ9LHsic3RhcnQiOjE5LjE3LCJlbmQiOjIyLjU4LCJ0ZXh0IjoiTCdhZ2VudCBtZSBwcm9wb3NlIGRlIGNvbm5lY3RlciBtb24gY29tcHRlLiBKZSBjbGlxdWUgc3VyIFNlIGNvbm5lY3Rlci4ifSx7InN0YXJ0IjoyMy4zNCwiZW5kIjoyNi4yNiwidGV4dCI6Ik1pY3Jvc29mdCB2YWxpZGUgbGEgY29ubmV4aW9uLCBldCBsJ2FnZW50IHJlcHJlbmQgdG91dCBzZXVsLiJ9LHsic3RhcnQiOjI4LjkxLCJlbmQiOjMwLjUsInRleHQiOiJWb2lsw6AgbGUgY29udGVudSBkZSBtb24gT25lRHJpdmUuIn0seyJzdGFydCI6MzIuOTYsImVuZCI6MzcuNDksInRleHQiOiJMZSBtZW51IE91dGlscyBhZmZpY2hlIG1haW50ZW5hbnQgbGUgY29tcHRlIGNvbm5lY3TDqSwgcXVlIGplIHBldXggZMOpY29ubmVjdGVyIMOgIHRvdXQgbW9tZW50LiJ9LHsic3RhcnQiOjM4LjQ0LCJlbmQiOjQxLjY5LCJ0ZXh0IjoiRGV1eGnDqG1lIG5pdmVhdSA6IEFnZW50IENyZWF0b3IuIEplIGNyw6llIHVuIG5vdXZlbCBhZ2VudC4ifSx7InN0YXJ0Ijo0My40MSwiZW5kIjo0Ni4zOCwidGV4dCI6IkplIGNob2lzaXMgbGUgdHlwZSBBc3Npc3RhbnQsIHF1aSBzYWl0IHV0aWxpc2VyIGRlcyBvdXRpbHMuIn0seyJzdGFydCI6NDcuMjUsImVuZCI6NDkuNDUsInRleHQiOiJKZSBsdWkgZG9ubmUgdW4gbm9tLCBwdWlzIGRlcyBpbnN0cnVjdGlvbnMuIn0seyJzdGFydCI6NTEuMjUsImVuZCI6NTIuMzQsInRleHQiOiJFdCBqZSBjcsOpZSBsJ2FnZW50LiJ9LHsic3RhcnQiOjU0LjkzLCJlbmQiOjU4LjQ3LCJ0ZXh0IjoiRGFucyBsJ29uZ2xldCBDYXBhY2l0w6lzLCBqJ291dnJlIGxlIGNhdGFsb2d1ZSBldCBqZSBjaGVyY2hlIFNoYXJlUG9pbnQuIn0seyJzdGFydCI6NTkuNjEsImVuZCI6NjIuNTgsInRleHQiOiJMZSBmb3JtdWxhaXJlIGVzdCBkw6lqw6AgcmVtcGxpIDogaWwgc3VmZml0IGRlIGNsaXF1ZXIgc3VyIEFqb3V0ZXIuIn0seyJzdGFydCI6NjQuMzgsImVuZCI6NjYuNTUsInRleHQiOiJMYSBjYXBhY2l0w6kgZXN0IG1haW50ZW5hbnQgYWpvdXTDqWUgw6AgbCdhZ2VudC4ifSx7InN0YXJ0Ijo2OC40OCwiZW5kIjo3MC40OCwidGV4dCI6IkplIHRlc3RlIHRvdXQgZGUgc3VpdGUgZGFucyBsZSBQbGF5Z3JvdW5kLiJ9LHsic3RhcnQiOjcyLjM4LCJlbmQiOjc1LjEyLCJ0ZXh0IjoiSmUgZGVtYW5kZSBxdWVscyBzaXRlcyBTaGFyZVBvaW50IG1lIHNvbnQgYWNjZXNzaWJsZXMuIn0seyJzdGFydCI6NzYuOTIsImVuZCI6ODAuMDMsInRleHQiOiJMYSBjb25uZXhpb24gZXN0IHByb3ByZSDDoCBjaGFxdWUgYWdlbnQgOiBqZSBtZSByZWNvbm5lY3RlLCBlbiB1biBjbGljLiJ9LHsic3RhcnQiOjgxLjc1LCJlbmQiOjg0LjAsInRleHQiOiJMJ2FnZW50IGxpc3RlIGxlcyBzaXRlcyBhdXhxdWVscyBqJ2FpIGFjY8Oocy4ifSx7InN0YXJ0Ijo4Ni40NywiZW5kIjo4OC43MywidGV4dCI6IlBvdXIgcmV0aXJlciBsJ2FjY8OocywgamUgc3VwcHJpbWUgbGEgY2FwYWNpdMOpLiJ9LHsic3RhcnQiOjkwLjQ0LCJlbmQiOjkyLjQ3LCJ0ZXh0IjoiSmUgY2xpcXVlIHN1ciBsYSBjb3JiZWlsbGUsIGV0IGplIGNvbmZpcm1lLiJ9LHsic3RhcnQiOjkzLjQyLCJlbmQiOjEwMC41LCJ0ZXh0IjoiVHJvaXNpw6htZSBuaXZlYXUgOiBsZSBidWlsZGVyLiBPbiB5IHBhc3NlIHF1YW5kIG9uIGEgYmVzb2luIGQndW4gc2VydmljZSB0b2tlbiwgcG91ciBkZXMgdHJhaXRlbWVudHMgc2FucyB1dGlsaXNhdGV1ciwgb3UgZGUgc2EgcHJvcHJlIGFwcGxpY2F0aW9uIEVudHJhLiJ9LHsic3RhcnQiOjEwMi42MiwiZW5kIjoxMDUuMTcsInRleHQiOiJKZSBjcsOpZSB1biBlc3BhY2UgZGUgdHJhdmFpbCwgRMOpbW8gU2hhcmVQb2ludC4ifSx7InN0YXJ0IjoxMDcuMTcsImVuZCI6MTEwLjYxLCJ0ZXh0IjoiRGVwdWlzIGxlcyBpbXBvcnRzLCBqJ291dnJlIGwnQXBwIFN0b3JlIGV0IGonaW5zdGFsbGUgU2hhcmVQb2ludCBOZXh0LiJ9LHsic3RhcnQiOjExMS41NCwiZW5kIjoxMTMuMjIsInRleHQiOiJWb2ljaSBzYSBwYWdlIGRlIGNvbmZpZ3VyYXRpb24uIn0seyJzdGFydCI6MTE1LjcyLCJlbmQiOjExNy40OSwidGV4dCI6IklsIHkgYSBxdWF0cmUgbW9kZXMgZGUgY29ubmV4aW9uLiJ9LHsic3RhcnQiOjExNy44MiwiZW5kIjoxMTkuOTcsInRleHQiOiJPQXV0aCBhdmVjIHZvdHJlIHByb3ByZSBhcHBsaWNhdGlvbiBFbnRyYSwifSx7InN0YXJ0IjoxMjAuNDksImVuZCI6MTI0LjExLCJ0ZXh0IjoiY2xpZW50IGNyZWRlbnRpYWxzLCBjJ2VzdCBsZSBzZXJ2aWNlIHRva2VuLCBvdSB1biBqZXRvbiBkJ2FjY8OocyBkaXJlY3QuIn0seyJzdGFydCI6MTI1LjE5LCJlbmQiOjEyOC4yNCwidGV4dCI6IkplIGdhcmRlIGxlIGNsaWVudCBPQXV0aCBkZSBsYSBwbGF0ZWZvcm1lLCBzYW5zIHJpZW4gcmVtcGxpci4ifSx7InN0YXJ0IjoxMzEuNjQsImVuZCI6MTM0LjgsInRleHQiOiJMZSBjb25uZWN0ZXVyIGV4cG9zZSB1biBzZXJ2ZXVyIE1DUCA6IHZvaWNpIHNvbiBhZHJlc3NlLiJ9LHsic3RhcnQiOjEzNi4yOSwiZW5kIjoxMzkuMTcsInRleHQiOiJQYXIgc8OpY3VyaXTDqSwgc2V1bHMgbGVzIGFnZW50cyBjb2Now6lzIGljaSBwZXV2ZW50IGwnYXBwZWxlci4ifSx7InN0YXJ0IjoxNDEuMDIsImVuZCI6MTQyLjY2LCJ0ZXh0IjoiSidhdXRvcmlzZSBsJ2FnZW50IE1lcyBkb2N1bWVudHMuIn0seyJzdGFydCI6MTQ0LjkzLCJlbmQiOjE0Ni44LCJ0ZXh0IjoiRXQgaidpbnN0YWxsZSBsYSBjYXBhY2l0w6kgc3VyIGNldCBhZ2VudC4ifSx7InN0YXJ0IjoxNDguNjYsImVuZCI6MTUwLjg3LCJ0ZXh0IjoiRGUgcmV0b3VyIGRhbnMgQWdlbnQgQ3JlYXRvciwgaidvdXZyZSBsJ2FnZW50LiJ9LHsic3RhcnQiOjE1Mi4zMywiZW5kIjoxNTUuNjcsInRleHQiOiJMYSBjYXBhY2l0w6kgU2hhcmVQb2ludCBOZXh0IGVzdCBiaWVuIGzDoCwgaW5zdGFsbMOpZSBkZXB1aXMgbGUgYnVpbGRlci4ifSx7InN0YXJ0IjoxNTcuNTUsImVuZCI6MTU5LjAzLCJ0ZXh0IjoiSmUgbGUgdGVzdGUgZGFucyBsZSBQbGF5Z3JvdW5kLiJ9LHsic3RhcnQiOjE2MC44OCwiZW5kIjoxNjMuMTUsInRleHQiOiJJbCByw6lwb25kIGF1c3NpdMO0dCwgYXZlYyBsYSBsaXN0ZSBkZXMgc2l0ZXMuIn0seyJzdGFydCI6MTY0LjU4LCJlbmQiOjE2OS4zMiwidGV4dCI6IlF1YXRyacOobWUgbml2ZWF1IDogbGVzIGF1dG9tYXRpc2F0aW9ucy4gRGFucyBsJ2VzcGFjZSBkZSB0cmF2YWlsLCBqZSBjb25uZWN0ZSBtb24gY29tcHRlIE1pY3Jvc29mdC4ifSx7InN0YXJ0IjoxNzAuMjIsImVuZCI6MTczLjQ4LCJ0ZXh0IjoiQydlc3QgY29ubmVjdMOpIDogY2UgamV0b24gc2VydmlyYSBhdXNzaSBhdXggZXjDqWN1dGlvbnMgcGxhbmlmacOpZXMuIn0seyJzdGFydCI6MTc1LjQ4LCJlbmQiOjE3Ni44OCwidGV4dCI6IkplIGNyw6llIHVuZSBhdXRvbWF0aXNhdGlvbi4ifSx7InN0YXJ0IjoxNzcuNDEsImVuZCI6MTgwLjk5LCJ0ZXh0IjoiVG91dGVzIGxlcyBvcMOpcmF0aW9ucyBTaGFyZVBvaW50IHNvbnQgZGlzcG9uaWJsZXMgY29tbWUgaW5zdHJ1Y3Rpb25zLiJ9LHsic3RhcnQiOjE4Mi43OSwiZW5kIjoxODQuMiwidGV4dCI6IkplIGNoZXJjaGUgc2VhcmNoU2l0ZXMuIn0seyJzdGFydCI6MTg0LjcsImVuZCI6MTg2LjI3LCJ0ZXh0IjoiSmUgbCdham91dGUsIHB1aXMgamUgcGFzc2UgZW4gWUFNTC4ifSx7InN0YXJ0IjoxODYuODMsImVuZCI6MTkxLjU0LCJ0ZXh0IjoiSmUgY29sbGUgbGUgYmxvYyA6IHNlYXJjaFNpdGVzIGF2ZWMgdW5lIMOpdG9pbGUsIHB1aXMgdW5lIGJvdWNsZSBxdWkgY29sbGVjdGUgbGUgbm9tIGRlIGNoYXF1ZSBzaXRlLiJ9LHsic3RhcnQiOjE5My4zNCwiZW5kIjoxOTUuNDksInRleHQiOiJKJ2VucmVnaXN0cmUsIGV0IGplIHJldmllbnMgw6AgbGEgdnVlIGdyYXBoaXF1ZS4ifSx7InN0YXJ0IjoxOTguMjUsImVuZCI6MTk5Ljg4LCJ0ZXh0IjoiSidleMOpY3V0ZSBsJ2F1dG9tYXRpc2F0aW9uLiJ9LHsic3RhcnQiOjIwMC43OCwiZW5kIjoyMDIuMzMsInRleHQiOiJFdCB2b2ljaSBsYSBsaXN0ZSBkZXMgc2l0ZXMuIn0seyJzdGFydCI6MjA1LjIyLCJlbmQiOjIwOC43MSwidGV4dCI6IkVuZmluLCBjw7R0w6kgYWRtaW5pc3RyYXRldXIgOiBqJ291dnJlIGwnZXNwYWNlIGRlIHRyYXZhaWwgZHUgY29ubmVjdGV1ci4ifSx7InN0YXJ0IjoyMDkuNzksImVuZCI6MjE1LjI4LCJ0ZXh0IjoiQydlc3QgaWNpIHF1ZSBsJ2FkbWluaXN0cmF0ZXVyIGTDqWNsYXJlLCB1bmUgc2V1bGUgZm9pcywgbGUgY2xpZW50IE9BdXRoIGRlIGxhIHBsYXRlZm9ybWUsIHV0aWxpc8OpIHBhciB0b3V0IGxlIG1vbmRlLiJ9LHsic3RhcnQiOjIxNi41NiwiZW5kIjoyMjAuNTcsInRleHQiOiJFdCBjZSBib3V0b24gcHVibGllIGxlIGNvbm5lY3RldXIgZGFucyBsZSBjYXRhbG9ndWUgZGUgY2FwYWNpdMOpcyBkZSBsJ29yZ2FuaXNhdGlvbi4ifV19fX0=" />

## Who is this for?

This connector is used by four different roles. Jump to the section that matches yours; each one is self-contained.

<CardGroup cols={2}>
  <Card title="Agent builder" icon="robot">
    You build agents in **Agent Creator** and want them to browse SharePoint sites, read files and query lists. → *Agent builder* tab.
  </Card>

  <Card title="Knowledge base owner" icon="database">
    You want SharePoint documents indexed and searchable semantically, kept up to date. → *Knowledge base (sync)* tab.
  </Card>

  <Card title="Platform admin" icon="shield-halved">
    You run the platform and set up the shared Microsoft Entra OAuth client once for everyone. → *Platform admin setup* accordion below.
  </Card>

  <Card title="Workspace builder" icon="puzzle-piece">
    You write Builder automations (DSUL) that call SharePoint operations directly. → *Workspace builder* tab.
  </Card>
</CardGroup>

## Prerequisites (Microsoft side)

* A **Microsoft 365 / SharePoint Online** tenant, and an **Azure / Microsoft Entra ID** tenant where you can register an application (or a maintainer who already did).
* An **app registration** in [Microsoft Entra ID](https://entra.microsoft.com) (Azure portal → **App registrations**), with a **client secret** created under **Certificates & secrets**.
* **Microsoft Graph delegated permissions** granted on the app (for the per-user OAuth modes), covering the resources you intend to use:
  * Sites & files: `Sites.Read.All` (or `Sites.ReadWrite.All` for create/update/move), `Files.Read.All` (or `Files.ReadWrite.All`)
  * Directory (access-aware RAG): `User.Read`, `GroupMember.Read.All` (optional)
  * Sign-in / identity: `openid`, `profile`, `offline_access`
* For the **application (client-credentials)** mode instead, grant the equivalent **application** permissions (e.g. `Sites.Read.All`, `Files.Read.All`) and have a Global Administrator grant admin consent.

The OAuth scopes requested by default are:

```text theme={null}
offline_access
https://graph.microsoft.com/Sites.Read.All
https://graph.microsoft.com/Files.Read.All
https://graph.microsoft.com/User.Read
```

<Accordion title="Platform admin (Governance): one-time platform setup" icon="shield-halved">
  **Goal:** two one-time tasks: (1) configure the shared **central Microsoft Entra OAuth client** so every workspace lets its users sign in with their own Microsoft account, and (2) expose SharePoint as a reusable **capability** in AI Governance so agent builders can pick it without pasting endpoint URLs.

  ## 1. Configure the connector

  <Steps>
    <Step title="Register the OAuth Application in Microsoft Entra ID">
      In [Microsoft Entra ID](https://entra.microsoft.com) → **App registrations > New registration**, register a **Web** application. Add a **Redirect URI** pointing at the core workspace callback:

      ```text theme={null}
      <api-url>/workspaces/<workspace-id>/webhooks/oauthCallback
      ```

      (e.g. `https://api.studio.prisme.ai/v2/workspaces/7oQvI6Q/webhooks/oauthCallback` on production).

      <Warning>
        Microsoft Entra rejects redirect URIs that contain a colon in the path, so use the **raw workspace id** of the core SharePoint workspace (`<workspace-id>`, e.g. `7oQvI6Q`), **not** the `slug:sharepoint-next` form used by other connectors. Copy the exact URI from the connector's configuration app, which renders it for you.
      </Warning>

      Add the Microsoft Graph **delegated** permissions listed in *Prerequisites*, create a **client secret** under **Certificates & secrets**, and note the **Application (client) ID**, the **secret value**, and the **Directory (tenant) ID** (or use `common` / `organizations` for multi-tenant).
    </Step>

    <Step title="Enter the credentials through the configuration app">
      Open the central `sharepoint-next` workspace and launch its **Configuration app**: `<studio>/apps/sharepoint-next` (e.g. `https://studio.prisme.ai/apps/sharepoint-next`), also linked as `Configuration app` on the installed instance. Switch to the maintainer view and follow the in-app instructions to paste the **Client ID**, **Client Secret**, **Tenant** and (optionally) scopes; the app stores them in the core workspace's secrets for you. Do not edit Studio's raw Secrets by hand. These credentials stay in the `sharepoint-next` workspace and are never exposed to tenants or end users; token exchange is proxied through the core `centralTokenExchange` webhook so the client secret never leaves the core workspace.
    </Step>

    <Step title="Tell workspaces to use the central client">
      Each consuming workspace selects auth mode **`oauthCentral`** in the connector configuration app (no client id/secret to enter on their side). Their users then just click **Connect**.
    </Step>
  </Steps>

  ## 2. Declare the capability in AI Governance

  Generic connectors (broad tool surfaces meant to be shared across many agents, like SharePoint) are best exposed as a named **capability** in AI Governance. Agent builders then enable that capability on their agents instead of pasting a raw MCP endpoint.

  <Steps>
    <Step title="Open AI Governance > Capabilities">
      Create (or edit) the **SharePoint** capability.
    </Step>

    <Step title="Point it at the MCP endpoint">
      Set the capability's MCP server URL to the connector's **MCP Endpoint**, and set its **Scope** to:

      ```text theme={null}
      context_id,agent_id,user_id
      ```

      The `agent_id` in the scope is what lets the connector identify and authorize the calling agent.
    </Step>

    <Step title="Make it available to agent builders">
      Once created, the capability appears in the capability picker for agent builders in your organization, who enable it on their agents. Access to the catalog follows your organization's existing roles; there is no per-capability role grant.
    </Step>

    <Step title="Smoke-test">
      From an agent that has the capability, in a workspace configured for `oauthCentral`, trigger any tool. The user is prompted to connect once (Microsoft sign-in); subsequent calls reuse the stored token transparently and refresh it automatically.
    </Step>
  </Steps>

  <Note>
    The connector's configuration app also offers a one-click **Add to catalog** button (workspace owner / admin only) that publishes the SharePoint capability to the organization-wide Capabilities catalog for you, the easiest way to expose it to agent builders without hand-editing Governance.
  </Note>

  <Warning>
    Declaring the capability makes the connector **available**; it does not by itself authorize a specific agent. This connector follows the **tenant-context model**: which agents may actually call it is gated per-workspace by the **authorized-agents allowlist** in the configuration app (see the *Workspace builder* tab). There is also **no OAuth auth-config JSON** to attach in Governance: connect / status / disconnect are handled by the connector's own webhooks, wired automatically.
  </Warning>
</Accordion>

***

<Tabs>
  <Tab title="Agent builder (Agent Creator)">
    ## Agent builder

    **Goal:** let an agent you build in Agent Creator browse SharePoint sites, read and manage files, query lists, and check permissions through MCP tools.

    <Note>
      Before an agent can call the connector, a *Workspace builder* must have installed and configured the SharePoint app in a workspace (see the *Workspace builder* tab), and, for the central OAuth mode, a *Platform admin* must have provisioned the shared Microsoft Entra OAuth client (see the *Platform admin setup* accordion above).
    </Note>

    This connector runs in the **tenant app-instance context**: your agent is authorized two ways at once: it is identified by the `agent_id` that Agent Creator injects through the capability *Scope*, and that agent must appear in the connector's **authorized-agents allowlist** (managed in the configuration app). The Microsoft Graph access token itself is resolved server-side from the configured auth mode.

    There are two ways to wire it up. Pick based on how much isolation you need.

    ## Option A: Enable the shared capability from the catalog

    The fastest path: a *Platform admin* has already published a **SharePoint** capability (see the *Platform admin setup* accordion above, §2), so you just pick it from the catalog. A workspace owner can publish it in one click with the config app's **Add to catalog** button.

    <Steps>
      <Step title="Open your agent in Agent Creator">
        Open the agent you want to extend and go to its capabilities / tools.
      </Step>

      <Step title="Add the SharePoint capability">
        Browse the capability catalog, select **SharePoint**, and enable it. The MCP endpoint URL and the *Scope* (`context_id,agent_id,user_id`) are already wired by the admin: nothing to paste, and the shared instance accepts every agent, so there is no allowlist step on your side.
      </Step>

      <Step title="Connect a Microsoft account (OAuth modes)">
        On the first tool call, an unconnected user is prompted to sign in; Agent Creator surfaces a `connect_url`. Application (`clientCredentials`) and `accessToken` modes need no per-user sign-in.
      </Step>
    </Steps>

    <Note>
      Convenient, but your agent runs against a **shared, platform-managed instance**: its Microsoft credentials are owned by someone else and the instance accepts every agent that is granted the capability. Prefer Option B for anything beyond quick experiments.
    </Note>

    ## Option B: Run it from your own workspace (recommended)

    For production agents, install the connector in **your own workspace** and point the agent at *that* workspace's MCP endpoint.

    <Warning>
      **Prefer this mode for security.** Because the MCP runs in *your* app-instance context, the Microsoft credentials, the per-user OAuth tokens and the authorized-agents allowlist are all **scoped to your workspace**, not shared platform-wide. You decide exactly which agents may call it and which Microsoft account / auth mode backs them, and a misconfiguration elsewhere can never expose your SharePoint content. The shared catalog capability (Option A) is a broad surface many agents can reach; your own workspace is an isolated, least-privilege boundary.
    </Warning>

    <Steps>
      <Step title="Install and configure the connector in your workspace">
        Follow the *Workspace builder* tab: install **SharePoint** in your workspace, open its **Configuration app**, choose the auth mode and connect a Microsoft account.
      </Step>

      <Step title="Allowlist your agent">
        In that workspace's config app, open **Authorized agents** and tick your agent (the **Install capability** button does this for you).
      </Step>

      <Step title="Add the MCP capability to your agent">
        In your agent, add a capability pointing at **your workspace's MCP Endpoint** URL, and set its **Scope** to:

        ```text theme={null}
        context_id,agent_id,user_id
        ```

        The `agent_id` is what lets the connector identify and authorize your agent; without it, every call is rejected with an explicit "agent could not be identified" message. This *Scope* is separate from the Microsoft Graph OAuth scopes.
      </Step>

      <Step title="Connect a Microsoft account (OAuth modes)">
        On the first tool call, the user is prompted to sign in (or uses **Connect** in the config app).
      </Step>
    </Steps>

    ## Brief the agent in its system prompt

    Whichever option you pick, wiring the capability is not enough: the agent must know the MCP exists and when to use it. Copy-pasteable starter:

    ```text theme={null}
    You have access to the SharePoint MCP server (tools: sites, drives, items, search, permissions, lists, directory, workbook, documents). Each tool takes an `action` argument. Use it whenever the user asks about SharePoint sites, document libraries, files and folders, SharePoint lists, sharing permissions, or who can access a document. To read a file, pick the tool by format: a Word `.docx` file with the `documents` tool, an Excel `.xlsx` file with the `workbook` tool, a text file (`.txt`, `.csv`, `.md`, `.json`) with `items` `getContent`, and any other file (PDF, PowerPoint, images) with `items` `attachToChat`, which asks the user to attach it to the conversation. Never try to decode file bytes yourself. Prefer calling a tool over guessing, and confirm with the user before any write or destructive action (create, update/move, copy, delete, invite, create link, add/create worksheet or table).
    ```

    <Note>
      **Legacy AI Knowledge agents** (no native MCP picker): add the connector under **Advanced > Tools > MCP** and paste the **MCP Endpoint** URL. The agent still has to be allowlisted in the config app and its identity propagated so the connector can read its `agent_id`.
    </Note>

    <Note>
      **Restricting to read-only (least privilege).** SharePoint tools cover both reads and writes (create folders, rename, move, copy, delete, share, edit list items and Excel cells; the connector never uploads file content). The default scopes depend on the OAuth client: with your own Microsoft Entra app, the connector requests **read-only** scopes (`Sites.Read.All`, `Files.Read.All`) unless you widen the **Scopes** field; with the platform's central client, it requests `Sites.ReadWrite.All` and `Files.ReadWrite.All`. To keep the connector read-only, set the read scopes (the **Read-only preset** of the configuration app):

      ```text theme={null}
      offline_access https://graph.microsoft.com/Sites.Read.All https://graph.microsoft.com/Files.Read.All https://graph.microsoft.com/User.Read
      ```

      Any write attempt is then rejected by Microsoft Graph with `403 Forbidden`. The scope is set at the workspace level (a workspace editor can widen it); for a hard guarantee, use an Entra app limited to read permissions.
    </Note>

    ## Available Tools

    Each tool takes an `action` argument selecting the concrete operation, plus the per-action parameters.

    | Tool | Description |
    | - | - |
    | `sites` | SharePoint sites discovery. Actions: `search`, `get`, `getRoot`, `listSubsites`. |
    | `drives` | Document libraries (drives) of sites and OneDrive. Actions: `listForSite`, `getSiteDefault`, `get`, `getMine`, `listMine`. |
    | `items` | Files & folders (driveItems): browse, read text files, offer any other file for attachment to the conversation. Actions: `listMyRootChildren`, `listMyChildrenByPath`, `listChildren`, `listRootChildren`, `changes`, `get`, `getContent`, `attachToChat`, `createFolder`, `update`, `delete`, `copy`, `thumbnails`, `versions`. |
    | `search` | Microsoft Search across SharePoint / OneDrive. Action: `query`. |
    | `permissions` | Sharing & permissions on driveItems (access-aware RAG). Actions: `list`, `get`, `invite`, `createLink`, `delete`. |
    | `lists` | SharePoint lists and list items. Actions: `listForSite`, `get`, `listItems`, `getItem`, `createItem`, `updateItemFields`, `deleteItem`. |
    | `directory` | Azure AD users & groups: resolve identities and group membership. Actions: `getUser`, `userMemberOf`, `checkUserMemberGroups`, `getGroup`, `groupMembers`. |
    | `workbook` | Read & write Excel `.xlsx` workbooks **natively** via the Microsoft Graph Excel API: no download, no OCR; cells are returned as structured values. Target a file by `driveId` + `itemId`. Actions: `listWorksheets`, `usedRange`, `getRange`, `listTables`, `listTableRows`, `updateRange`, `addTableRow`, `addWorksheet`, `createTable`, `executeFunction`. |
    | `documents` | Read the content of Word `.docx` documents **natively**: no external extraction service, no OCR; parses the OOXML in-process. Target a file by `driveId` + `itemId`. Actions: `getText`, `getStructure`. |

    ## Output Formats

    Every tool accepts an `outputFormat` argument that controls the MCP response shape:

    * **`verbose`** (default): a human-readable text view, optimized for LLM consumption.
    * **`structured`**: concise machine-readable JSON in `structuredContent`.
    * **`both`**: the structured payload, with its JSON also rendered as text.

    ## Tool Details

    ### sites

    ```json theme={null}
    {
      "name": "sites",
      "arguments": {
        "action": "search",
        "search": "marketing",
        "top": 10
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | One of `search`, `get`, `getRoot`, `listSubsites`. |
    | `siteId` | For get/listSubsites | SharePoint site id (`hostname,siteCollectionId,siteId`). |
    | `search` | For search | Keyword to match sites; use `*` to list all. |
    | `top` / `select` | No | OData `$top` / `$select`. |

    ### drives

    ```json theme={null}
    {
      "name": "drives",
      "arguments": {
        "action": "listForSite",
        "siteId": "contoso.sharepoint.com,abc-123,def-456"
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | One of `listForSite`, `getSiteDefault`, `get`, `getMine`, `listMine`. |
    | `siteId` | For listForSite/getSiteDefault | SharePoint site id. |
    | `driveId` | For get | Drive (document library) id. |
    | `select` | No | OData `$select`. |

    ### items

    ```json theme={null}
    {
      "name": "items",
      "arguments": {
        "action": "listChildren",
        "driveId": "b!xyz...",
        "itemId": "01ABCDEF...",
        "top": 50
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | One of `listMyRootChildren`, `listMyChildrenByPath`, `listChildren`, `listRootChildren`, `changes`, `get`, `getContent`, `attachToChat`, `createFolder`, `update`, `delete`, `copy`, `thumbnails`, `versions`. |
    | `driveId` | All actions except `listMyRootChildren`, `listMyChildrenByPath`, and `attachToChat` by `path` | Drive id. |
    | `itemId` | For get/getContent/attachToChat/update/delete/copy/thumbnails/versions/listChildren | DriveItem id. |
    | `path` | For listMyChildrenByPath; optional for attachToChat | Path in the signed-in user's own OneDrive, without a leading slash (for example `Documents/Reports`). OAuth modes only. |
    | `parentItemId` | For createFolder | Parent folder item id. |
    | `top` / `select` / `orderby` / `expand` / `skiptoken` | No | OData query options and pagination. |
    | `body` | For createFolder/update/copy | JSON body, e.g. `createFolder` → `{ name, folder: {}, "@microsoft.graph.conflictBehavior" }`; `copy` → `{ parentReference, name }`. |

    ### items: reading a file's content

    Pick the reading path by file format:

    | Format | Tool and action | What the agent receives |
    | - | - | - |
    | Word `.docx` | `documents` `getText` (or `getStructure`) | The full plain text, capped at about 200 KB |
    | Excel `.xlsx` | `workbook` (`listWorksheets`, then `usedRange` or `getRange`) | Cell values as structured data |
    | Text (`.txt`, `.csv`, `.md`, `.json`, `.html`, `.xml`…) | `items` `getContent` | The decoded text, capped at about 200 KB |
    | PDF, PowerPoint, images, other binaries | `items` `attachToChat` | An attachment offer that the user approves in the chat |

    `getContent` decides from the file's metadata before downloading anything: a text file comes back as text, and any other file comes back as the same attachment offer as `attachToChat`, never as raw bytes.

    `attachToChat` never downloads the file. It returns a standard MCP `resource_link` whose `uri` is the file's SharePoint web link. Agent Creator then asks the user to approve the attachment; once approved, the file is fetched server-side from its pre-signed download link and indexed in the conversation, exactly like a file the user dropped in the chat. The agent then searches it like any conversation document. Size limits:

    * PDF, PowerPoint and other documents: up to the chat upload limit (`attachment_direct_max_bytes`, 100 MB by default).
    * Images: 4 MB by default (`attachment_fetch_max_bytes`), because an image is copied into the conversation before the model reads it.

    Above the limit, the attachment is refused and the agent should share the file's SharePoint link (`webUrl`, from `items` `get`) instead. A folder cannot be attached.

    For a complete agent built on these reading paths, with the canvas for producing files, follow the [Office 365 agent tutorial](/resources/tutorials/office-365-agent).

    ### lists

    ```json theme={null}
    {
      "name": "lists",
      "arguments": {
        "action": "listItems",
        "siteId": "contoso.sharepoint.com,abc-123,def-456",
        "listId": "b6c8...",
        "expand": "fields"
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | One of `listForSite`, `get`, `listItems`, `getItem`, `createItem`, `updateItemFields`, `deleteItem`. |
    | `siteId` | Yes | SharePoint site id. |
    | `listId` | For get/listItems/getItem/createItem/updateItemFields/deleteItem | SharePoint list id. |
    | `itemId` | For getItem/updateItemFields/deleteItem | List item id. |
    | `expand` | No | OData `$expand`; use `fields` to get column values. |
    | `select` / `top` / `filter` | No | OData query options. |
    | `body` | For createItem/updateItemFields | `createItem` → `{ fields: { <Column>: <value> } }`; `updateItemFields` → `{ <Column>: <value> }`. |

    ### permissions

    ```json theme={null}
    {
      "name": "permissions",
      "arguments": {
        "action": "list",
        "driveId": "b!xyz...",
        "itemId": "01ABCDEF..."
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | One of `list`, `get`, `invite`, `createLink`, `delete`. |
    | `driveId` | Yes | Drive id. |
    | `itemId` | Yes | DriveItem id. |
    | `permId` | For get/delete | Permission id. |
    | `body` | For invite/createLink | `invite` → `{ recipients, roles, requireSignIn, sendInvitation }`; `createLink` → `{ type, scope }`. |

    ### workbook

    Read & write the cells of an Excel `.xlsx` file natively via the Microsoft Graph Excel API: no download, no OCR.

    ```json theme={null}
    {
      "name": "workbook",
      "arguments": {
        "action": "usedRange",
        "driveId": "b!xyz...",
        "itemId": "01ABCDEF...",
        "worksheetId": "Sheet1"
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | One of `listWorksheets`, `usedRange`, `getRange`, `listTables`, `listTableRows`, `updateRange`, `addTableRow`, `addWorksheet`, `createTable`, `executeFunction`. |
    | `driveId` | Yes | Drive id containing the `.xlsx` file. |
    | `itemId` | Yes | DriveItem id of the `.xlsx` file. |
    | `worksheetId` | For usedRange/getRange/updateRange | Worksheet id or name. |
    | `address` | For getRange/updateRange | A1 range address, e.g. `"A1:D50"` or `"Sheet1!A1:D50"`. |
    | `tableId` | For listTableRows/addTableRow | Table id or name. |
    | `functionName` | For executeFunction | Excel function name, e.g. `"vlookup"`, `"sum"`, `"today"`. |
    | `top` / `select` | No | Query options (`listTableRows` `top`, OData `$select`). |
    | `body` | For write actions | `{ values: [[...], [...]] }` (updateRange / addTableRow), `{ name }` (addWorksheet), `{ address, hasHeaders }` (createTable), or the function's named arguments (executeFunction, e.g. `{ values: [[...]] }`). |

    `addWorksheet`, `createTable` and `executeFunction` evaluate / mutate the workbook server-side. `executeFunction` returns `{ value }`, the evaluated result of the Excel function.

    ### documents

    Read the content of a Word `.docx` file natively: the file is downloaded and its OOXML parsed in-process (no external extraction service, no OCR).

    ```json theme={null}
    {
      "name": "documents",
      "arguments": {
        "action": "getText",
        "driveId": "b!xyz...",
        "itemId": "01ABCDEF..."
      }
    }
    ```

    | Parameter | Required | Description |
    | - | - | - |
    | `action` | Yes | `getText`: full plain text (paragraphs + table cells), capped \~200 KB, best for RAG / reading; or `getStructure`: the element tree (paragraphs with style/runs/formatting, tables with rows/cols/headers/cells) plus metadata and the full text. |
    | `driveId` | Yes | Drive id containing the `.docx` file. |
    | `itemId` | Yes | DriveItem id of the `.docx` file. |
    | `includeContent` | No (getStructure only) | Include per-element text/runs (default `true`). Ignored by `getText`. |
    | `maxContentLength` | No (getStructure only) | Max characters of text per element (`0` = no per-element cap). |
  </Tab>

  <Tab title="Workspace builder (DSUL)">
    ## Workspace builder

    **Goal:** install the connector in a workspace, configure authentication and the agent allowlist, and call SharePoint operations from your automations.

    ## Installation

    1. Go to **Apps** in your workspace
    2. Search for **SharePoint** and install it
    3. Open the **Configuration app** (the link auto-populated on install) to choose the auth mode, provide credentials, connect, and allow the agents that may call the connector

    ## Configuration

    | Field | Description |
    | - | - |
    | **Configuration app** | Auto-populated on install; open this link to configure authentication (mode + credentials), connect a Microsoft account (OAuth modes), and manage the authorized-agents allowlist. |
    | **Microsoft Graph API version** | `v1.0` (default) or `beta`. |

    The configuration app drives everything; the app instance itself has no per-field credential form. From it you pick one of:

    | Auth mode | What you provide | Best for |
    | - | - | - |
    | `oauthCentral` | Nothing; just click **Connect** | Workspaces on a platform where the admin set up the central client |
    | `oauth` | Your own Entra **Application (client) ID + Secret** (+ tenant; redirect URI `<api-url>/workspaces/<your-workspace-id>/webhooks/oauthCallback`) | You manage your own Microsoft Entra OAuth app |
    | `clientCredentials` | Entra **client ID + secret + tenant** with admin-consented **application** Graph permissions | Server-to-server / back-office, content indexing, no interactive sign-in |
    | `accessToken` | A pre-minted Microsoft Graph **access token** | Short-lived / caller-managed tokens |

    <Warning>
      Microsoft Entra rejects a colon in the redirect URI path, so for the `oauth` mode use your workspace's **raw id** (`<your-workspace-id>`) in the redirect URI, not the `slug:` form. The configuration app shows the exact URI to register.
    </Warning>

    <Note>
      Credentials are provisioned into the workspace's Secrets by the `onInstall` flow and resolved server-side. The agent allowlist (**Authorized agents**) gates which Agent Creator agents may call the MCP endpoint; see the *Agent builder* tab.
    </Note>

    ## Available Instructions

    Every instruction resolves credentials from the workspace configuration. Operations are grouped by SharePoint resource; the MCP server exposes the same operations behind the nine entity tools (see the *Agent builder* tab). Site ids use the `hostname,siteCollectionId,siteId` format.

    ### Sites

    | Instruction | Description | Returns |
    | - | - | - |
    | `searchSites` | Search sites across the tenant; `search` = keyword (`*` for all). | `{ value: [{ id, name, webUrl, displayName }] }` |
    | `getSite` | Get a site by `siteId`. | A site resource `{ id, displayName, webUrl, … }`. |
    | `getRootSite` | Get the tenant root site. | A site resource. |
    | `listSubsites` | List subsites of `siteId`. | `{ value: [ site ] }` |

    ### Drives

    | Instruction | Description | Returns |
    | - | - | - |
    | `listSiteDrives` | List the document libraries of a `siteId`. | `{ value: [{ id, name, driveType, webUrl }] }` |
    | `getSiteDefaultDrive` | Get the default document library of a `siteId`. | A drive resource. |
    | `getDrive` | Get a drive by `driveId`. | A drive resource `{ id, name, quota, … }`. |
    | `getMyDrive` | Get the signed-in user's OneDrive (OAuth modes). | A drive resource. |
    | `listMyDrives` | List the signed-in user's drives (OAuth modes). | `{ value: [ drive ] }` |

    ### Items (files & folders)

    | Instruction | Description | Returns |
    | - | - | - |
    | `listChildren` | List children of a folder (`driveId`, `itemId`). | `{ value: [ driveItem ], "@odata.nextLink" }`; each item carries `@microsoft.graph.downloadUrl`. |
    | `listRootChildren` | List children of the drive root (`driveId`). | `{ value: [ driveItem ] }` |
    | `getItem` | Get a driveItem (`driveId`, `itemId`). | A driveItem `{ id, name, size, file, folder, "@microsoft.graph.downloadUrl" }`. |
    | `createFolder` | Create a folder under `parentItemId`; `body` = `{ name, folder: {}, "@microsoft.graph.conflictBehavior" }`. | The created driveItem. |
    | `updateItem` | Rename/move an item (`itemId`); `body` = changed fields / `parentReference`. | The updated driveItem. |
    | `deleteItem` | Recycle an item (`driveId`, `itemId`). | Empty (HTTP 204). |
    | `copyItem` | Copy an item asynchronously; `body` = `{ parentReference, name }`. | Empty (HTTP 202 Accepted, `Location` monitor URL). |
    | `getThumbnails` | List thumbnails for an item. | `{ value: [{ id, small, medium, large }] }` |
    | `listItemVersions` | List versions of an item. | `{ value: [{ id, lastModifiedDateTime, size }] }` |

    ### Lists

    | Instruction | Description | Returns |
    | - | - | - |
    | `listSiteLists` | List the lists of a `siteId`. | `{ value: [{ id, displayName, list }] }` |
    | `getList` | Get a list (`siteId`, `listId`). | A list resource. |
    | `listListItems` | List items of a list; use `expand=fields` for column values. | `{ value: [ listItem ] }` |
    | `getListItem` | Get a list item (`siteId`, `listId`, `itemId`). | A listItem resource `{ id, fields }`. |
    | `createListItem` | Create a list item; `body` = `{ fields: { <Column>: <value> } }`. | The created listItem. |
    | `updateListItemFields` | Update column values; `body` = `{ <Column>: <value> }`. | The updated fields. |
    | `deleteListItem` | Delete a list item. | Empty (HTTP 204). |

    ### Search & permissions

    | Instruction | Description | Returns |
    | - | - | - |
    | `searchQuery` | Microsoft Search; `body` = `{ requests: [{ entityTypes, query: { queryString }, from, size }] }`. | `{ value: [{ hitsContainers: [{ hits: [...] }] }] }` |
    | `listPermissions` | List permission grants on an item. | `{ value: [{ id, roles, grantedToV2, link }] }` |
    | `getPermission` | Get a single permission by `permId`. | A permission resource. |
    | `invite` | Grant access; `body` = `{ recipients, roles, requireSignIn, sendInvitation }`. | `{ value: [ permission ] }` |
    | `createLink` | Create a sharing link; `body` = `{ type, scope }`. | A permission with `{ link: { webUrl } }`. |
    | `deletePermission` | Remove a permission by `permId`. | Empty (HTTP 204). |

    ### Directory

    | Instruction | Description | Returns |
    | - | - | - |
    | `getUser` | Get a user by id or UPN/email. | A user resource `{ id, displayName, mail }`. |
    | `listUserMemberOf` | List groups/roles a user belongs to. | `{ value: [ group ] }` |
    | `checkUserMemberGroups` | Check which of given group ids a user is in; `body` = `{ groupIds: [<id>] }`. | `{ value: [ <groupId> ] }` |
    | `getGroup` | Get a group by id. | A group resource. |
    | `listGroupMembers` | List members of a group. | `{ value: [ user ] }` |

    ### Excel workbooks & Word documents (native content)

    Reading and writing file **content** natively is exposed on the **MCP surface** as the `workbook` and `documents` entity tools (see the *Agent builder* tab), not as separate Builder instructions, since they are routed internally. From an agent you call them by `action`:

    | Tool | Actions | Purpose |
    | - | - | - |
    | `workbook` (Excel `.xlsx`) | `listWorksheets`, `usedRange`, `getRange`, `listTables`, `listTableRows`, `updateRange`, `addTableRow`, `addWorksheet`, `createTable`, `executeFunction` | Read/write cell values natively via the Microsoft Graph Excel API: no download, no OCR. `addWorksheet`/`createTable` mutate the workbook; `executeFunction` evaluates an Excel function (`functionName` + named args) and returns `{ value }`. |
    | `documents` (Word `.docx`) | `getText`, `getStructure` | Read document content natively (OOXML parsed in-process). `getText` returns the full plain text (capped \~200 KB); `getStructure` returns the paragraph/table element tree plus metadata. |

    <Note>
      `Returns` shows the shape of the operation output (the underlying Microsoft Graph resource). To download a file, read the `@microsoft.graph.downloadUrl` returned by `getItem` / `listChildren` (a \~1h pre-signed link); content is not returned inline.
    </Note>

    ## DSUL Examples

    **Find a site and list its document libraries:**

    ```yaml theme={null}
    - Sharepoint.searchSites:
        search: 'Marketing'
        top: 5
      output: sites
    - Sharepoint.listSiteDrives:
        siteId: '{{sites.value[0].id}}'
      output: drives
    ```

    **List files at a drive root:**

    ```yaml theme={null}
    - Sharepoint.listRootChildren:
        driveId: '{{drives.value[0].id}}'
        top: 50
        orderby: lastModifiedDateTime desc
      output: items
    ```

    **Create a folder:**

    ```yaml theme={null}
    - Sharepoint.createFolder:
        driveId: '{{drives.value[0].id}}'
        parentItemId: root
        body:
          name: 'Reports 2026'
          folder: {}
          '@microsoft.graph.conflictBehavior': rename
      output: folder
    ```

    **Run a Microsoft Search across document libraries:**

    ```yaml theme={null}
    - Sharepoint.searchQuery:
        body:
          requests:
            - entityTypes:
                - driveItem
              query:
                queryString: 'quarterly report'
              from: 0
              size: 25
      output: results
    ```

    **Create a SharePoint list item:**

    ```yaml theme={null}
    - Sharepoint.createListItem:
        siteId: '{{sites.value[0].id}}'
        listId: '{{listId}}'
        body:
          fields:
            Title: 'New entry'
            Status: 'Open'
      output: created
    ```
  </Tab>

  <Tab title="Knowledge base (sync)">
    ## Knowledge base

    **Goal:** index SharePoint documents into a knowledge base so an agent can search their **content**, and keep that base up to date.

    <Note>
      Before a base can be attached, a *Workspace builder* must have installed and configured the SharePoint app in a workspace and connected an account (see the *Workspace builder* tab). Nothing else is needed: the same app instance serves both the agent tools and the sync surface. The **Authorized agents** allowlist does **not** apply here — it gates the connector as an agent *tool*, and has no effect on synchronization.
    </Note>

    ## What can be synced

    **Document libraries** and the files inside them. SharePoint **pages and lists are not synced**: they are agent tools, not indexable resources.

    ## How it fits together

    ```mermaid theme={null}
    flowchart LR
      SP["SharePoint<br/>Microsoft Graph"]
      Conn["SharePoint connector<br/>MCP resources"]
      Sync["Knowledge Sync<br/>browse · diff · index"]
      KB["Knowledge base<br/>vector store"]
      Agent["Agent"]

      Sync -->|"resources/list · resources/read"| Conn
      Conn -->|"Graph API"| SP
      Sync -->|"documents"| KB
      Agent -->|"search"| KB
      Agent -.->|"per-reader access check"| Sync
    ```

    The resource tree is three levels deep — a **site**, its **document libraries**, then any **item** inside them — and any container can be picked as a sync root:

    ```text theme={null}
    sharepoint://site/{siteId}
    sharepoint://site/{siteId}/drive/{driveId}
    sharepoint://site/{siteId}/drive/{driveId}/item/{itemId}
    ```

    ## Attach the connector to a base

    <Steps>
      <Step title="Copy the MCP endpoint">
        Open the connector's **Configuration app** in the workspace where it is installed; it displays and copies that workspace's MCP endpoint:

        ```text theme={null}
        <api-url>/workspaces/<workspace-id>/webhooks/<app-instance>.mcp
        ```
      </Step>

      <Step title="Create the connection in Knowledges">
        Go to **Knowledges → Connectors → New Connection → Your own MCP server**, paste the endpoint and click **Check**.
      </Step>

      <Step title="Browse to the folder you want">
        Pick a site, then a document library, then descend into folders and confirm with **Use this location**. Everything below the selected root is synced, nested folders included.
      </Step>

      <Step title="Pick the destination and sync">
        Choose an existing knowledge base or create one from the same step, then click **Sync Now**. Large libraries are spread over several runs; the schedule (*Hourly* to *Daily*, under **Auto-sync**) finishes the job.
      </Step>
    </Steps>

    The full wizard, the run history and the connection settings are documented once for every provider in [Knowledges → Connectors](/products/ai-knowledge/connectors). This tab covers only what is specific to SharePoint.

    <Note>
      SharePoint is normally also published as a **catalog connector**, which appears under **Available Providers** and asks each person to sign in with their own Microsoft account. Attaching this connector's own endpoint instead is what lets a base be fed by an **application identity** (`clientCredentials` mode) rather than by a person — the credential then belongs to the workspace, and no reader ever signs in for the sync.
    </Note>

    ## Who may sync, and who may read

    | Moment | Acts as | Authorized by |
    | - | - | - |
    | Attaching the connection, browsing the tree | You | Your **role on the workspace** holding the connector's configuration — the right to read that workspace is the right to read this SharePoint through it |
    | A scheduled sync run | No user at all | The calling workspace must be listed in `knowledgeSync.trustedCallers`; the Knowledge Sync workspace ships there by default |
    | Answering a reader's question | The reader | A live per-reader access check (`items` / `checkAccess`) against Microsoft Graph |

    <Note>
      **Per-user access control is supported and worth keeping on.** The connector declares an access tool, so each reader's own rights are re-checked in SharePoint at query time: a file you lost access to stops appearing in answers without waiting for the next sync. Turning it off serves every synced document to anyone who can query the agent, whatever their SharePoint rights. Note that a connection backed by `clientCredentials` feeds the base with the **application's** reach — narrow it at the source (sites-selected permissions) rather than counting on the selection made in the wizard.
    </Note>

    ## What gets indexed

    | Aspect | Behavior |
    | - | - |
    | Document unit | One **driveItem** (a file) = one document. Sites, libraries and folders are containers, never indexed themselves. |
    | Content | Graph hands out a short-lived **pre-signed download URL**, so the bytes are fetched out of band — the format-aware path. Small text-like files (≤ 1 MB) are inlined directly instead, capped at 200 000 characters. |
    | Revision marker | `cTag`, falling back to `eTag`. Unchanged files are never re-read and never re-indexed. |
    | Identity | The **item id**. Renaming or moving a file inside the synced root therefore does *not* re-index it. |
    | Deletions | Each run is a **full traversal**: a file absent from a complete listing is removed from the base. A listing that failed halfway deletes nothing. |

    <Note>
      **The Knowledge profile this connector declares** — the descriptor Knowledges probes at `sharepoint://profile/knowledge`:

      | Field | Value |
      | - | - |
      | `provider` | `sharepoint-next` |
      | `hierarchy` | `site` › `drive` › `item` |
      | `canonical_uri` | `sharepoint://site/{siteId}/drive/{driveId}/item/{itemId}` |
      | `revision` | `cTag`, fallback `eTag` |
      | `read` | Pre-signed download URL for binaries; inline text ≤ 1 MB, 200 000 characters |
      | `list` | 50 resources per page by default, 200 max; `delta_on_drive: false` |
      | `access` | Tool `items`, action `checkAccess` |
      | `authentication` | `oauth`, `oauthCentral`, `clientCredentials`, `accessToken` |
    </Note>

    ## Troubleshooting the sync

    **The URL check says "You are not allowed to read it"**: you have no role on the workspace holding the connector's configuration. Ask its administrator for one — this is not about your SharePoint rights.

    **The URL check says "It answered, but could not serve its content"**: the connector itself is not fully configured. Open its configuration app and connect an account.

    **A site does not appear when browsing**: a site created moments ago is not searchable yet — `/sites?search=` is served by the SharePoint search index, which takes minutes to hours. It is reachable by path in the meantime.

    **A whole library syncs slowly**: that is expected — runs are bounded and the schedule finishes the job. Prefer selecting a folder, or several narrow connections, over one library-wide root.

    **A file is in the library but not in the base**: check its format is one the platform indexes, and that it is under the selected root. A file whose download failed is reported in the connection's synchronization errors rather than half-indexed.

    **A scheduled sync keeps running after a right was revoked**: the role check runs on the interactive paths only. A scheduled run is authorized as the platform's synchronization workspace — delete the connection to stop it for certain.
  </Tab>
</Tabs>

***

## Security

The answers that hold for every connector (agent access, shared knowledge bases, credentials, models, egress) are on [Connector security](/apps-store/marketplace/connectors/security). This section lists what is specific to SharePoint.

| Topic | SharePoint |
| - | - |
| Authentication family | Delegated OAuth (Microsoft Entra, authorization code with PKCE): each user connects their own Microsoft 365 account. An app-only mode (`clientCredentials`) also exists. |
| Production modes | `oauthCentral` or `oauth` |
| Modes to avoid in production | `accessToken` (testing only, and a Graph access token expires after about an hour). `clientCredentials` acts as the application, not as the user: avoid it when per-user permissions are required. |
| Read-only scopes | `offline_access`, `User.Read`, `Sites.Read.All`, `Files.Read.All` (the **Read-only preset** of the configuration app). These are the default with your own Microsoft Entra app; the platform's central client requests `Sites.ReadWrite.All` and `Files.ReadWrite.All` by default. |
| Agent allowlist | Yes, on the tenant endpoint (empty at installation). The global endpoint accepts every agent. |
| Per-reader access control on knowledge bases | Yes: each file is checked against the reader's own Microsoft 365 connection, even when the base is synchronized in `clientCredentials` mode. |
| Outbound hosts | `graph.microsoft.com`, `login.microsoftonline.com`, and your tenant's SharePoint hosts (for example `contoso.sharepoint.com`, and `contoso-my.sharepoint.com` for OneDrive files): when a user approves an attachment, the platform fetches the file server-side from its pre-signed download link. |
| Audit events | None specific to this connector |

With the read-only scopes, Microsoft refuses every folder creation, rename, move, copy, delete, sharing link, list item change and Excel cell write. `Sites.Read.All` and `Files.Read.All` still reach every site and file the user can open: the configuration app offers no scope that limits the connector to chosen sites. In `clientCredentials` mode, the application permissions apply to every site of the tenant, whoever calls the agent.

***

## Error Handling

| HTTP code | Meaning |
| - | - |
| `400` | Bad request: invalid parameters or malformed body (e.g. bad OData filter, invalid driveItem/list resource). |
| `401` | Unauthorized: the Microsoft Graph access token is missing, expired or revoked. The user must reconnect (OAuth modes). |
| `403` | Forbidden: insufficient Graph scope/permission, missing admin consent (application mode), or the account lacks access to the site/drive/item. |
| `404` | Not found: the site, drive, item, list or permission id does not exist or is not visible to the account. |
| `429` | Throttled: Microsoft Graph rate limit; back off and retry (honor `Retry-After`). |
| `500` / `503` | Microsoft Graph service error: transient; retry shortly, no reconnection needed. |

### Common Issues

**"This agent is not authorized to use this connector"**: The calling agent is not in the allowlist. Open the configuration app → **Authorized agents** → tick this agent (or enable **Allow all agents**) and Save.

**"The calling agent could not be identified"**: The MCP capability *Scope* does not declare `agent_id`, so Agent Creator never injects the agent identity. Set the Scope to `context_id,agent_id,user_id` on the capability, then allow the agent in the config app.

**"Microsoft Graph is not connected for this user"**: No per-user OAuth token. Open the configuration app (OAuth mode) and click **Connect**, or use the agent's connect flow.

**"Microsoft Graph token refresh failed … must reconnect"**: The stored refresh token was revoked or expired (Microsoft Entra invalidated it, or it aged past its limit). The connection is dropped automatically; the user must reconnect from the config app.

**"Microsoft Graph not authenticated" / "OAuth is not configured"**: Neither a tenant OAuth client nor the central platform client is available. Set the client ID/secret/tenant in the config app, or ask the platform maintainer to provision the central Entra OAuth client.

**`client_credentials` exchange failed**: In application mode, check the Application (client) ID / secret, the tenant id, and that a Global Administrator granted **admin consent** for the application Graph permissions.

**"Site not found"**: The site id format is `hostname,siteCollectionId,siteId`. Use `sites` `search` (or Graph Explorer) to find the correct id.

**Microsoft Entra redirect URI rejected**: Entra rejects a colon in the redirect URI path. Register the redirect URI with the workspace's **raw id** (`/workspaces/<workspace-id>/webhooks/oauthCallback`), not the `slug:` form; copy the exact value from the config app.

## External Resources

<CardGroup cols={2}>
  <Card title="Microsoft Graph API" icon="microsoft" href="https://learn.microsoft.com/en-us/graph/api/resources/sharepoint">
    Official reference for the SharePoint sites, drives, files, lists and permissions REST APIs.
  </Card>

  <Card title="Tool Agents" icon="robot" href="/products/agent-factory/capabilities">
    Learn how Agent Creator agents consume MCP tools in Prisme.ai.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.