OneDrive personal storage and SharePoint document libraries, both reached through the shared Microsoft Graph `/drives` endpoint: drive and item addressing, sharing permissions, storage quotas, file search, and the offboarding file-transfer workflow.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add WYRE-AI/msp-claude-plugins --skill files --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Files?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wyre-ai-files)More formats (shields.io, HTML) on the badges page.
---
name: "Microsoft 365 Files"
description: >
OneDrive personal storage and SharePoint document libraries, both reached through
the shared Microsoft Graph `/drives` endpoint: drive and item addressing, sharing
permissions, storage quotas, file search, and the offboarding file-transfer
workflow.
when_to_use: >-
When investigating M365 file access, sharing, storage-quota, or file-search issues across
OneDrive and SharePoint. Use
when: onedrive, m365 files, sharepoint files, onedrive quota, file sharing m365, onedrive
permissions, m365 storage, find file m365, onedrive access, or sharepoint document library.
---
# Microsoft 365 Files (OneDrive & SharePoint)
## Overview
Microsoft 365 provides two file storage surfaces: OneDrive (personal, per-user) and SharePoint (team/department libraries). Both are accessible through the same Microsoft Graph `/drives` endpoint. MSP support tasks include investigating access issues, checking storage quotas, managing sharing permissions, and transferring file access during offboarding.
## Anti-triggers
- **Files on the machine this session is running on** — "read the
file", "find the config", "list the directory" almost always mean the
local filesystem, which Claude Code's own file tools handle. This
skill only reaches a customer's cloud storage through Graph, and
loading it for local work wastes the call.
- **Restoring a deleted or ransomware-encrypted file** — past the
recycle bin and retention window, Graph has nothing to return; use
the `backup-pack` or `kaseya/datto-saas-protection`.
- **MSP documentation, runbooks, and stored credentials** — those live
in the documentation platform, not the customer's OneDrive; use
`kaseya/it-glue` or `hudu`.
- **A tenant-wide external-sharing posture review** — this skill
inspects one item's permissions; the policy question across the
tenant or the fleet is `m365-security` or `cipp`.
## Core Concepts
| Surface | Use | Graph Resource |
|---------|-----|---------------|
| **OneDrive Personal** | Individual user's documents | `/users/{id}/drive` |
| **SharePoint Site Drive** | Team/department files | `/sites/{id}/drives` |
| **SharePoint Library** | Document library within a site | `/drives/{driveId}` |
## Graph API Patterns
### Get a User's OneDrive Info (Quota)
```http
GET /v1.0/users/{userId}/drive?$select=id,name,quota
```
**Response:**
```json
{
"id": "drive-guid",
"name": "OneDrive",
"quota": {
"used": 5368709120,
"remaining": 1127428915200,
"total": 1132797624320,
"state": "normal"
}
}
```
`state` values: `normal`, `nearing`, `critical`, `exceeded`
### List Files in Root
```http
GET /v1.0/users/{userId}/drive/root/children?$select=id,name,size,lastModifiedDateTime,webUrl,folder,file
```
### List Files in a Specific Folder
```http
GET /v1.0/users/{userId}/drive/items/{folderId}/children?$select=id,name,size,lastModifiedDateTime,webUrl
```
### Search for Files Across OneDrive
```http
GET /v1.0/users/{userId}/drive/root/search(q='budget 2024')?$select=id,name,parentReference,lastModifiedDateTime,webUrl
```
### Get File Sharing Permissions
```http
GET /v1.0/drives/{driveId}/items/{itemId}/permissions
```
**Response includes:**
```json
{
"value": [
{
"id": "perm-id",
"roles": ["write"],
"grantedToV2": {
"user": { "displayName": "Bob Manager", "email": "bmanager@contoso.com" }
},
"link": null
},
{
"id": "link-id",
"roles": ["read"],
"link": {
"type": "view",
"scope": "anonymous",
"webUrl": "https://contoso-my.sharepoint.com/..."
}
}
]
}
```
### Share a File (Create Sharing Link)
```http
POST /v1.0/drives/{driveId}/items/{itemId}/createLink
Content-Type: application/json
{
"type": "view",
"scope": "organization"
}
```
`type`: `view`, `edit`, `embed`
`scope`: `anonymous`, `organization`, `users`
### Grant Direct Access to a File/Folder
```http
POST /v1.0/drives/{driveId}/items/{itemId}/invite
Content-Type: application/json
{
"requireSignIn": true,
"sendInvitation": false,
"roles": ["read"],
"recipients": [
{ "email": "manager@contoso.com" }
],
"message": "Shared as part of employee transition"
}
```
### Remove a Permission
```http
DELETE /v1.0/drives/{driveId}/items/{itemId}/permissions/{permissionId}
```
### Transfer OneDrive Access (Offboarding)
Grant another user access to the departing employee's entire OneDrive:
```http
POST /v1.0/users/{departingUserId}/drive/root/invite
Content-Type: application/json
{
"requireSignIn": true,
"sendInvitation": false,
"roles": ["write"],
"recipients": [{ "email": "manager@contoso.com" }]
}
```
> Full ownership transfer (changing site admin) requires SharePoint admin PowerShell:
> `Set-SPOSite -Identity <url> -Owner <email>`
## SharePoint Document Libraries
### List SharePoint Sites
```http
GET /v1.0/sites?search=*&$select=id,displayName,webUrl,createdDateTime
```
### List Drives (Document Libraries) in a Site
```http
GET /v1.0/sites/{siteId}/drives?$select=id,name,driveType,quota
```
### Get Files from a SharePoint Library
```http
GET /v1.0/drives/{driveId}/root/children?$select=id,name,size,lastModifiedDateTime,webUrl
```
## Common MSP Workflows
### User Can't Access a File
1. Get the file's current permissions: `GET /items/{id}/permissions`
2. Check if user has direct access or if it's link-based
3. Check if user is in a group that has access: `GET /users/{id}/memberOf`
4. If sharing link expired: create new sharing link
5. If direct access missing: add via `/invite`
### Pre-Offboarding Data Review
Before offboarding, identify files the user owns that are widely shared:
```http
GET /v1.0/users/{userId}/drive/root/search(q='*')?$select=id,name,permissions,parentReference
```
Look for items with `scope: anonymous` sharing links — these should be cleaned up or ownership transferred.
### OneDrive Quota Alert
Check users approaching quota limits:
```http
GET /v1.0/users/{userId}/drive?$select=quota
```
If `quota.state` is `nearing` (>80%) or `critical` (>90%), alert for cleanup or quota increase.
## Error Handling
| Error | Cause | Resolution |
|-------|-------|------------|
| `itemNotFound` | File or folder doesn't exist | Check path or item ID |
| `accessDenied` | No Files.Read permission | Grant permission and admin consent |
| `quotaLimitReached` | OneDrive full | Clean up or expand quota |
| `sharingDisabled` | Tenant sharing policy blocks external | Review SharePoint admin settings |
## Permissions Required
| Task | Microsoft Graph Permission |
|------|---------------------------|
| Read user's files | `Files.Read.All` |
| Read/write files | `Files.ReadWrite.All` |
| Read SharePoint sites | `Sites.Read.All` |
| Manage sharing | `Files.ReadWrite.All` |
| SharePoint admin | `Sites.ReadWrite.All` |
## Related Skills
- [M365 Users](../users/SKILL.md) - User offboarding, OneDrive transfer
- [M365 Security](../security/SKILL.md) - Audit external sharing
- [M365 API Patterns](../api-patterns/SKILL.md) - Search syntax, pagination
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!