MCP Server for Microsoft SharePoint using modern Azure AD (MSAL) authentication.
-
Go to Azure Portal → Azure Active Directory → App registrations → New registration
- Name: anything you like
- Supported account types: "Accounts in this organizational directory only"
- Redirect URI: leave empty
-
From the Overview page, note:
- Application (client) ID →
SHP_ID_APP - Directory (tenant) ID →
SHP_TENANT_ID
- Application (client) ID →
-
Certificates & secrets → New client secret
- Save the Value immediately (you won't see it again) →
SHP_ID_APP_SECRET
- Save the Value immediately (you won't see it again) →
-
API permissions → Add a permission → SharePoint → Application permissions
- Add
Sites.ReadWrite.All(orSites.Read.Allfor read-only) - Click Grant admin consent — the status must show a green checkmark
- Add
-
Get your SharePoint site URL (e.g.
https://contoso.sharepoint.com/sites/yoursite) →SHP_SITE_URL- Do NOT include a trailing slash
- Use
Sites.Read.Allif you only need read access (principle of least privilege) - Set a calendar reminder to rotate client secrets before expiry
- Never commit
.envfiles to Git — use environment variables or a secrets manager
pip install mcp-sharepoint-usOr from source:
git clone https://github.com/mdev26/mcp-sharepoint-us.git
cd mcp-sharepoint-us
pip install -e .# Required
SHP_TENANT_ID=your-tenant-id-guid
SHP_ID_APP=your-client-id-guid
SHP_ID_APP_SECRET=your-client-secret
SHP_SITE_URL=https://your-tenant.sharepoint.com/sites/your-site
# Optional
SHP_DOC_LIBRARY=Shared Documents # default
SHP_AUTH_METHOD=msal # options: msal (default), certificate, legacySHP_AUTH_METHOD=certificate
SHP_CERT_PATH=/path/to/certificate.pem
SHP_CERT_THUMBPRINT=your-cert-thumbprintWindows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"sharepoint": {
"command": "python",
"args": ["-m", "mcp_sharepoint"],
"env": {
"SHP_TENANT_ID": "your-tenant-id",
"SHP_ID_APP": "your-client-id",
"SHP_ID_APP_SECRET": "your-client-secret",
"SHP_SITE_URL": "https://your-tenant.sharepoint.com/sites/your-site",
"SHP_AUTH_METHOD": "msal"
}
}
}
}{
"mcpServers": {
"sharepoint": {
"command": "uvx",
"args": ["mcp-sharepoint-us"],
"env": {
"SHP_TENANT_ID": "your-tenant-id",
"SHP_ID_APP": "your-client-id",
"SHP_ID_APP_SECRET": "your-client-secret",
"SHP_SITE_URL": "https://your-tenant.sharepoint.com/sites/your-site"
}
}
}
}| Tool | Description |
|---|---|
Test_Connection |
Verify authentication and connection |
List_SharePoint_Documents |
List documents in a folder |
Get_Document_Content |
Read document content (supports .docx, .pptx, .xlsx, .pdf) |
Upload_Document |
Upload a new document |
Update_Document |
Update an existing document |
Delete_Document |
Delete a document |
List_SharePoint_Folders |
List folders |
Create_Folder |
Create a new folder |
Delete_Folder |
Delete an empty folder |
Get_SharePoint_Tree |
Get recursive folder structure |
Create_Word_Document |
Create a formatted .docx and upload to SharePoint |
Edit_Word_Document |
Find/replace or section-replace content in a .docx |
Create_PowerPoint |
Create a .pptx and upload to SharePoint |
LOGLEVEL=DEBUG python -m mcp_sharepoint- Ensure
SHP_TENANT_IDis set and correct (Azure Portal → Azure AD → Overview → Tenant ID) - Ensure
SHP_AUTH_METHOD=msal(or leave unset — msal is the default) - Verify admin consent is granted in Azure Portal (green checkmarks on API permissions)
- After granting permissions, wait 5–10 minutes for propagation
- Permissions must be Application permissions, not Delegated
- Admin consent must be granted
- The site URL must exactly match the SharePoint site (no trailing slash)
- Copy the secret Value, not the secret ID
- Check for extra spaces in your
.envfile - The secret may have expired — create a new one
If authentication succeeds but Graph API calls fail (connection reset during TLS), the endpoint graph.microsoft.us (US Government) or graph.microsoft.com (commercial) may be blocked by a firewall using deep packet inspection. Ask your network team to whitelist the endpoint on port 443. For proxy environments:
export HTTPS_PROXY=http://proxy.company.com:8080MIT License