The Microsoft 365 widget is a ServiceDesk Plus custom widget that brings Microsoft 365 capabilities into the request detail right panel. Technicians can schedule Teams meetings linked to the current request, chat with Microsoft 365 Copilot with request context pre-loaded, and search SharePoint and OneDrive content for relevant articles or files.
The widget uses one Azure AD app registration and one signed-in Microsoft account for all three features, so technicians sign in once per browser session.
Who this guide is for:
Administrators: Use the Configuration section to register the Azure AD app, configure the widget, and upload it to ServiceDesk Plus.
Technicians: Use Using the widget and Use cases to learn how the widget works day-to-day.
Before you configure the widget, ensure the following:
ServiceDesk Plus access: You have SDAdmin access to upload custom widgets.
Microsoft Entra ID (Azure AD) access: You have admin access to register an app and grant admin consent for Microsoft Graph permissions.
Microsoft 365 licences: Technicians have standard Microsoft 365 licences. Ask Copilot requires a Microsoft 365 Copilot licence for each technician who uses it.
HTTPS deployment: ServiceDesk Plus is served over HTTPS. MSAL pop-up authentication requires a secure origin.
Browser pop-ups: The ServiceDesk Plus domain is allowed to open pop-ups in technicians' browsers.
Head here to download the widget.
The widget requires a single Azure AD (Microsoft Entra ID) app registration. Complete the following steps in the Azure portal.
Go to portal.azure.com > Microsoft Entra ID > App registrations > + New registration.
Enter a display name, for example SDP Microsoft 365 Widget.
Under Supported account types, select Accounts in this organizational directory only (Single tenant).
Leave the Redirect URI blank for now — it is configured in the next step.
Click Register.
The widget uses a popup flow for authentication. The redirect URI must point to the msteams-auth-redirect.html file deployed alongside the widget.
Open the app registration and go to Authentication.
Click + Add a platform and select Single-page application (SPA).
Enter the redirect URI:
https://<your-sdp-domain>/custom/msteams-auth-redirect.html
Replace <your-sdp-domain> with the hostname of your SDP instance, for example helpdesk.yourcompany.com.

Click Configure, then Save.
The widget uses Microsoft Graph delegated permissions. Add all of the following permissions to the app registration.
In the app registration go to API permissions > + Add a permission > Microsoft Graph > Delegated permissions.
Search for and add each permission listed below:
|
Permission |
Purpose |
|
Calendars.ReadWrite.Shared |
Create calendar events (Teams meetings) on behalf of the user |
|
Sites.Read.All |
Search SharePoint sites and read content |
|
Mail.Read |
Read the signed-in user's mail (used for identity validation) |
|
People.Read.All |
Resolve people and attendees across the organisation |
|
OnlineMeetingTranscript.Read.All |
Read transcripts of online meetings |
|
OnlineMeetings.ReadWrite |
Create and manage Teams online meetings |
|
Chat.Read |
Read Teams chat messages |
|
ChannelMessage.Read.All |
Read Teams channel messages |
|
ExternalItem.Read.All |
Read external items indexed in Microsoft Search |
Click Add permissions.

Several permissions (such as People.Read.All and OnlineMeetingTranscript.Read.All) require admin consent. A Global Administrator or Privileged Role Administrator must grant it.
In API permissions, click Grant admin consent for <your tenant>.
Confirm the prompt. All permissions should show a green tick under Status.
Collect these two values from the app registration Overview page before editing config.json:
|
Value |
Where to find it |
|
Application (client) ID |
Shown on the Overview page — a GUID,
|
|
Directory (tenant) ID |
Also on the Overview page — the GUID for your Azure AD tenant |
Before packaging the widget, open config.json and replace the three placeholders with the values collected in Section 3.5.
|
Placeholder |
Replace with |
|
<client-id> |
Replace with the Application (client) ID from the app registration |
|
<tenant-id> |
Replace with the Directory (tenant) ID from the app registration |
|
<sdp-domain> |
Replace with the hostname of your SDP instance (e.g. helpdesk.yourcompany.com) |
Example of a completed config.json:
{ "clientId": "12345678-abcd-efgh-ijkl-000000000000", "tenantId": "87654321-wxyz-abcd-1234-000000000000", "redirectUri": "https://helpdesk.yourcompany.com/custom/msteams-auth-redirect.html", "scopes": [ "Calendars.ReadWrite.Shared", "Sites.Read.All", "Mail.Read", "People.Read.All", "OnlineMeetingTranscript.Read.All", "OnlineMeetings.ReadWrite", "Chat.Read", "ChannelMessage.Read.All", "ExternalItem.Read.All" ], "slashCommands": [ ... ]}The slashCommands array defines the Copilot shortcuts available to technicians. One command is included by default. Additional commands can be added at any time.
|
Field |
Description |
|
command |
The text typed in the chat composer, e.g. /summarise ticket |
|
description |
Short help text shown in the command picker and welcome suggestions |
|
prompt |
The actual instruction sent to Copilot when the command is used |
|
shouldEnableWebSearch |
(optional) true/false — turns on web search for this command. Defaults to false |
|
includeRequestContext |
(optional) true/false — attaches ticket context to the prompt. Defaults to true |
Context placeholders available inside the prompt field:
{{request.id}}
{{request.subject}}
{{request.description}}
{{request.descriptionSummary}}
{{request.status}}
{{request.priority}}
{{request.group}}
{{request.requesterName}}
{{request.requesterEmail}}
{{request.technicianName}}
{{request.technicianEmail}}
SDP custom widgets are uploaded as a ZIP archive. The archive must contain the individual widget files at the root level — do not zip the parent folder. Select the files individually and zip them.
Files to include in the ZIP:
|
File |
Purpose |
|
msteams.html |
Main widget shell (entry point) |
|
msteams_util.js |
All widget logic — auth, meetings, Copilot, SharePoint |
|
styles.css |
Widget styling |
|
msteams-auth-redirect.html |
MSAL popup redirect handler |
|
config.json |
Azure AD config and slash commands (placeholders already replaced) |
|
plugin-manifest.json |
SDP plugin definition |
|
m365_logo.png |
Microsoft 365 logo used in the widget header |
|
teams_logo.png |
Teams logo used on the sign-in screen |
|
copilot_icon.png |
Copilot icon used in the Copilot card and chat |
You need SDP Administrator access to complete these steps.
Log in to ServiceDesk Plus as an Administrator.
Navigate to Admin > Developer Space > Custom Widgets.
Click + New Custom Widget.
Upload the ZIP file prepared in Package the Widget Section.
Open any ServiceDesk Plus request. The Microsoft 365 widget should appear in the right panel. Click it to verify the sign-in screen loads.
The widget uses the Microsoft Authentication Library (MSAL) running entirely in the browser. Authentication happens once per session in a pop-up window.
On first use, click Sign in with Microsoft in the widget.
Sign in with the Microsoft account that matches your ServiceDesk Plus login email.
The widget validates the account match and caches it for the session.
If your ServiceDesk Plus user changes, the cached account is cleared and you must sign in again. Tokens refresh silently where possible; a pop-up appears only when silent refresh fails. To sign out, click the × button in the widget header.
Schedule a Microsoft Teams online meeting from the request detail panel.
|
Field |
Behaviour |
|
Meeting title |
Pre-filled as Request ID: {id} - {subject}. Editable before creating. |
|
Attendees |
Tag-style email input. The requester's email is added automatically when ServiceDesk Plus provides it. Add more attendees manually. |
|
When — Now |
Creates the meeting immediately, starting from the current time. |
|
When — Schedule |
Reveals start and end date and time pickers for scheduling in advance. |
|
Add note to ticket |
Toggle (enabled by default). Adds the meeting details as a request note after creation. |
When the Add note to ticket toggle is on (the default), the widget adds a formatted request note after the meeting is created. The note includes:
Meeting title
Start and end date and time
Teams join link
Microsoft Graph event ID
Full attendee list
If the toggle is off, the meeting is still created and the note step is skipped. If note creation fails, the meeting result screen still shows the join link alongside an inline error message.
Open an embedded Microsoft 365 Copilot chat inside the widget. The current request context is loaded automatically so Copilot can answer request-aware questions.
Request context: Request ID, subject, description, status, priority, group, requester, and technician details are sent to Copilot as additional context on every turn.
Web search toggle: A per-message toggle that lets Copilot draw on live web search results.
Request context toggle: A per-message toggle to include or exclude the request details for a specific prompt.
New Chat: Resets the conversation and starts a fresh Copilot session without leaving the widget.
Slash commands: Type / to open a command picker.
Slash commands are pre-defined prompts that you can trigger with a single click or by typing / in the Copilot composer.
Welcome-state suggestion cards show all configured commands.
Typing / opens a keyboard-navigable command picker. Use arrow keys and Enter to select.
Each command includes request context by default. You can disable this per command in config.json.
The default built-in command is /summarise ticket, which generates a concise IT-support summary of the current request — issue, impact, status, priority, and recommended next step. Add more commands by editing the slashCommands array in config.json.
Search across all SharePoint sites and OneDrive content accessible to your Microsoft account, from the request panel.
Keyword search: Full-text search using Microsoft Graph Search.
File results: Use Preview to view files inline via Graph file preview, or Open to open the file in a new tab.
Article and page results: Use Open to open the page in a new tab. Preview is not available because the preview and page URL resolve to the same SharePoint URL.
Copy link: Copies the item URL to the clipboard.
Add to note: Appends the item link to the current request as a note.
|
Symptom |
Why this happens |
Resolution |
|
Sign-in pop-up blocked |
The browser is blocking pop-ups for the ServiceDesk Plus domain. MSAL requires a pop-up window for authentication. |
Allow pop-ups for the ServiceDesk Plus domain in browser settings. |
|
redirect_uri_mismatch error in the auth pop-up |
The redirectUri in config.json does not exactly match the URI registered in Azure. |
Check for trailing slashes, HTTP vs HTTPS, and case sensitivity. Re-save the URI in both places. |
|
403 Forbidden on Graph calls after sign-in |
Admin consent has not been granted for one or more permissions. Delegated permissions that require admin consent cannot be self-consented by end users. |
Go to the app registration > API permissions and click Grant admin consent. |
|
Copilot returns 403 or "You do not have access" |
The technician does not have a Microsoft 365 Copilot licence assigned. |
Assign a Copilot licence in the Microsoft 365 admin centre. |
|
Widget shows a blank or white screen |
The most common cause is a malformed config.json or files zipped inside a subfolder rather than at the archive root. |
Open the browser developer console (F12 > Console) for the exact error. Verify config.json parses as valid JSON and that the ZIP contains files at the root level. |
|
Meeting created but note not added |
The widget could not write to the ServiceDesk Plus request API. The meeting itself is unaffected, and the join link is still available on the result screen. |
Check that the ServiceDesk Plus API is reachable and the request ID is valid. Retry from the meeting result screen. |
|
Widget rejects sign-in with an email mismatch error |
The Microsoft account email does not match the ServiceDesk Plus user email. |
Sign in with the Microsoft account that matches your ServiceDesk Plus login email. |