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

# Installation

# Required Roles for Teams Installation

The required roles for the Teams installation are:

* **Azure Admin**: A user with administrative privileges who can grant
  permissions to the Skill Assistant app and run a script to force install the
  app for users.
* **Teams Admin**: A user with administrative privileges who can install and
  manage apps in Teams.
* **Azure Group Admin**: A user that can create and maintain an Azure group of
  users.
* **Customer Contact with TechWolf**: A designated representative who
  coordinates with TechWolf's team to facilitate the integration process,
  provide necessary information, and ensure successful implementation of the
  Skill Assistant in your Teams environment.

# Required Teams App Permissions

The Skill Assistant application requires the following permissions:

* `User.Read.All` application permission
* `User.Read` delegated permission

The `User.Read.All` application permission allows the app to read user profiles
for all users in the organization. This is necessary for the Skill Assistant to
fetch the linking property of a user (by default the Employee ID) using the
Microsoft Graph API. More information about this can be found in the
[Linking Microsoft Teams users and employee profiles in TechWolf ](#linking-microsoft-teams-users-and-employee-profiles-in-techwolf)
section. The `User.Read.All` permission is also required for the Skill Assistant
to fetch the user's country information, which is used to send suggestions
according to the user's country timezone when the user-based scheduling setting
is enabled. This country information is read from the **usageLocation** property
in Microsoft Graph.

<Note>
  For the Skill Assistant to use **user timezones** (when user-based
  scheduling is enabled), the **usageLocation** property must be set for each
  user in Microsoft 365 / Entra ID. The Skill Assistant uses usageLocation to
  derive the user's timezone. If usageLocation is not set for a user, that
  user will receive suggestions according to the tenant's default timezone
  instead. You can set usageLocation in the [Microsoft 365 admin
  center](https://admin.microsoft.com/) or via [Microsoft
  Graph](https://learn.microsoft.com/en-us/graph/api/user-update). The Skill
  Assistant also updates a user's timezone whenever it receives it from Teams
  (e.g. from the message context); this only happens after the user has sent
  their first message to the Skill Assistant.
</Note>

The `User.Read` delegated permission allows the app to read user profiles for
the user who is currently logged in. This is necessary for the Skill Assistant
to properly show the Skill Profile Tab.

# Installation steps

The installation consists of several steps, which are described in detail below.
TechWolf needs to configure the Skill Assistant to work with your tenant, you
need to give the app the right permissions, and you need to install the app in
your Teams environment.

<Steps>
  <Step title="Share your Azure Tenant ID with TechWolf.">
    Share your **Azure Tenant ID** with TechWolf. TechWolf will configure
    the Skill Assistant to work with your production tenant. Follow the
    steps in [Get Azure Tenant
    ID](https://learn.microsoft.com/en-us/entra/fundamentals/how-to-find-tenant)
    to find your Azure Tenant ID.
  </Step>

  <Step title="Link Microsoft users to employee profiles in TechWolf">
    We need a method to link employee profiles in the TechWolf API to Teams
    Users in Microsoft Teams. See [Linking Microsoft Teams users and
    employee profiles in TechWolf
    ](#linking-microsoft-teams-users-and-employee-profiles-in-techwolf).
  </Step>

  <Step title="Whitelist the Skill Profile Tab URL (if required)">
    If your organization restricts outbound internet traffic by default
    (i.e., blocks all URLs unless explicitly allowed), you will need to
    whitelist the following URL to ensure the Skill Profile tab functions
    correctly: `teams-tab-frontdoor.skillengine.eu`. This URL doesn't handle
    any personal or company data, it only loads the visual interface for the
    Skill Profile tab in Microsoft Teams.
  </Step>

  <Step title="Grant permissions to the Skill Assistant app">
    Grant the app the required permissions. Follow [these
    steps](#grant-permissions-to-the-skill-assistant-app).
  </Step>

  <Step title="Customize the branding of the Skill Assistant app">
    Customize the branding of the Skill Assistant app by following [these
    steps](./customizations/#branding).
  </Step>

  <Step title="Install the Skill Assistant for users">
    Install the Skill Assistant for users following [these
    steps](#installing-the-skill-assistant-for-users)
  </Step>
</Steps>

### Linking Microsoft Teams users and employee profiles in TechWolf

In order for TechWolf's Skill Assistant to deliver personalized and timely skill
suggestions via Microsoft Teams, it is crucial that we can accurately link each
employee in your organization to their corresponding Teams user.

There are two options to link the two IDs:

1. [Through Microsoft Graph (preferred)](#through-microsoft-graph-preferred)
2. [Through Custom Properties](#through-custom-properties)

If this is set up correctly, the TechWolf Skill Assistant will be able to fetch
all skill suggestions and send them to the right Teams user.

#### Through Microsoft Graph (preferred)

The preferred method is to use the Microsoft Graph API to read a user property
whose value matches the employee ID known within TechWolf's SkillEngine API. By
default this is the `Employee ID` (`employeeId`) property. This requires the
`Employee ID` property to be set in Azure for each user, and for that value to
*exactly match* the employee ID known within TechWolf's SkillEngine API. In that
case we can automatically link the Teams user to the employee profile in
TechWolf.

Ideally, the Employee ID is filled in automatically using an integration with
your organization's HR system. If this is not possible, you can manually
populate the Employee ID property by following this guide:
[Set Employee ID in Microsoft 365](https://o365info.com/set-employee-id-microsoft-365/)

<Note>
  **Linking on a different Microsoft Graph property.** You are not limited to
  the `Employee ID` property. If your organization stores the matching value
  elsewhere, TechWolf can read it from any other Microsoft Graph user
  property instead. Let TechWolf know during onboarding which property to use,
  and we will configure it for your tenant.

  * **Top-level property:** any user property, for example
    `onPremisesImmutableId`.
  * **Nested property:** a property inside a complex type, addressed with dot
    notation, for example
    `onPremisesExtensionAttributes.extensionAttribute1`.

  We recommend pointing this at a stable, non-personal identifier (such as an
  employee number or immutable ID). The configured value is stored on the
  TechWolf side to perform the link, so avoid properties that contain personal
  data, like `mail` or `userPrincipalName`.

  Whichever property is configured, its value must *exactly match* the
  employee ID known within TechWolf's SkillEngine API.
</Note>

#### Through Custom Properties

If the `Employee ID` property is not set in Azure, or if the Employee ID
property in Azure is different from the employee ID stored in the TechWolf
SkillEngine API, we can use a
[Custom Property](</reference/latest/Custom Properties/CustomPropertiesDefinitions/overview>)
for each employee profile in the TechWolf SkillEngine API. The Azure ID should
be stored in the Custom Property with the key `employee_azure_id`. The mapping
between the employee ID known in TechWolf's SkillEngine and their corresponding
custom property should be send to TechWolf via the datasource integration so
that we can store it accordingly.

<Note>
  The Azure ID we require (often referred to as the **Object ID**) has the
  following format: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` (e.g.
  `3f2a9c4e-7b6d-4e2b-9c9a-1a2b3c4d5e6f`).
</Note>

### Grant permissions to the Skill Assistant app

<Steps>
  <Step title="Go to your Teams admin page">
    Go to your [Teams admin page](https://admin.teams.microsoft.com/).
  </Step>

  <Step title="Navigate to Manage apps">
    Go to **Teams apps** -> **Manage apps**

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/teamsadminappmenu.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=75a18c4060e26df1060f8771f8291ed6" alt="Manage apps menu" width="252" height="205" data-path="integrations/skill-assistant/teams/images/teamsadminappmenu.png" />
  </Step>

  <Step title="Search TechWolf Skill Assistant">
    Type "TechWolf Skill Assistant" in the search bar.

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/searchapp.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=ab7ff78cf730ff66854809071319a1e0" alt="Search app" width="2240" height="295" data-path="integrations/skill-assistant/teams/images/searchapp.png" />
  </Step>

  <Step title="Click on TechWolf Skill Assistant">
    Click on the name of the "TechWolf Skill Assistant" app.
  </Step>

  <Step title="Navigate to the Permissions tab">
    Navigate to the Permissions tab (1).
  </Step>

  <Step title="Grant permissions">
    Grant the app the required permissions. Do so by pressing **Grant admin consent** (2). This will open a pop up.
    More information about the required permissions can be found in the [Required permissions of the Skill Assistant application](#required-teams-app-permissions) section.

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/grantpermissions.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=283feca31b6c01f922ecd78d38b95849" alt="Grant admin consent" width="965" height="664" data-path="integrations/skill-assistant/teams/images/grantpermissions.png" />
  </Step>

  <Step title="Select account">
    Select your account and log in if necessary (1).
  </Step>

  <Step title="Accept permissions">
    Review the required permissions and grant them, by clicking **Accept** (2).

    <img width="1000" alt="Popup" src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/popup.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=530d5169faaf7f5c4e4289b2e0e4e415" data-path="integrations/skill-assistant/teams/images/popup.png" />
  </Step>
</Steps>

### Installing the Skill Assistant for users

Depending on your organisation's workflow to install apps for employees, you
should now install the Skill Assistant for your employees. We recommend the
following workflow:

<Steps>
  <Step title="Setup user groups">
    The easiest way to install the app for a subset of users is to create a group in
    Azure AD and assign the app to that group. This way, you can easily manage who
    has access to the app. To create a group, follow the
    [Microsoft guide on creating a group](https://learn.microsoft.com/en-us/entra/fundamentals/groups-view-azure-portal).
  </Step>

  <Step title="Setup installation">
    We recommend to use the app centric management functionality if possible.

    If you are using app centric functionality, then follow [these steps](#install-the-app-using-app-centric-management) to install the app.

    If you are not using app centric functionality, then follow [these steps](#install-the-app-without-app-centric-management) to install the app.
  </Step>

  <Step title="Force install using Graph API">
    If the app is not installed for all users, you can force the installation for
    the remaining users using the Microsoft Graph API by following
    [these steps](#force-installing-the-app-using-the-microsoft-graph-api).
  </Step>
</Steps>

#### Install the app using App Centric Management

If you are using app centric management for app availability, you can install
the app for the group of users by following the following steps.

<Steps>
  <Step title="Make app available for users">
    Make the app available for the group of users by following [this guide
    from
    Microsoft](https://learn.microsoft.com/en-us/microsoftteams/app-centric-management#add-or-modify-app-availability-for-users).
  </Step>

  <Step title="Install the app for users">
    If you are using app centric management for installation, you can
    install the app for the group of users by following [this guide from
    Microsoft](https://learn.microsoft.com/en-us/microsoftteams/install-teams-apps#install-apps-using-app-centric-management).

    If you are not using app centric management for installation, you can use Setup Policies to install the app for the group of users.
    Follow [these steps](#install-the-app-using-setup-policies) to install the app using Setup Policies.

    <Warning>
      This can take a significant amount of time. We advise to install the users at
      least 1 week before the go-live date.

      Some users might need to restart their Teams to get the app installed.

      If there are still users that don't have the app after a week, the force
      installation using the next step needs to be done.
    </Warning>
  </Step>
</Steps>

#### Install the app without App Centric Management

<Note>
  We recommend to use app centric management for installation if possible.
</Note>

<Steps>
  <Step title="Install the app using setup policies">
    You can install the app for a group of users using setup policies. Follow [these steps](#install-the-app-using-setup-policies) to install the app using Setup Policies.

    <Warning>
      The setup policy is only applied after the permission policy is updated (see step 2).
    </Warning>

    <Warning>
      This can take a significant amount of time. We advise to install the users at
      least 1 week before the go-live date.

      Some users might need to restart their Teams to get the app installed.

      If there are still users that don't have the app after a week, the force
      installation using the next step needs to be done.
    </Warning>
  </Step>

  <Step title="Update permission policy">
    We recommend to adjust the global permission policy to allow the TechWolf Skill Assistant app.

    If modifying the global policy is not desired, you can create a new permission policy by following [this guide](https://learn.microsoft.com/en-us/microsoftteams/teams-app-permission-policies#create-an-app-permission-policy)
    and assign it to the group by following [these steps](#assigning-the-permission-policy-to-a-group).
  </Step>
</Steps>

#### Install the app using Setup Policies

Follow
[this guide from Microsoft](https://learn.microsoft.com/en-us/microsoftteams/teams-app-setup-policies#install-apps-to-teams-client-of-your-users)
to install the app using Setup Policies.

Make sure to apply the setup policy to the group of users by following
[this section from the Microsoft guide](https://learn.microsoft.com/en-us/microsoftteams/teams-app-setup-policies#assign-a-custom-policy-in-app-setup-policy-to-users-and-groups).

<Warning>
  If a setup policy is already applied to a user, the new setup policy will
  not be applied to that user!

  If you have different groups of users that require different app configurations, you'll need to create a unique setup policy for each group.
</Warning>

#### Assigning the permission policy to a group

This section describes how to assign the permission policy to a group of users.

<Note>
  This section is only relevant when you do not have the app centric
  management functionality and have created a new permission policy.
</Note>

Microsoft Teams does not support assigning app permission policies to groups.
However, it does support
[assigning policies to a batch of users](https://learn.microsoft.com/en-us/microsoftteams/assign-policies-users-and-groups#assign-a-policy-to-a-batch-of-users).

<Note>
  These steps require a setup policy to be applied to the group first.
</Note>

<Warning>
  The users linked to the permission policy will not be automatically updated
  when users are added/deleted from the group.
</Warning>

<Steps>
  <Step title="Navigate to Manage Users">
    Go to **Users** -> **Manage users**
  </Step>

  <Step title="Click on the filter icon">
    Click on the filter icon in the top right corner.

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/filter-users.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=d0595807b11258e351dee2af6ef0f8be" alt="Filter icon" width="358" height="74" data-path="integrations/skill-assistant/teams/images/filter-users.png" />
  </Step>

  <Step title="Filter on setup policy">
    Select the setup policy as filter and the created setup policy as filter value.

    Click on **Apply** to apply the filter.

    <img src="https://mintcdn.com/techwolf/hcu65nk-6HLQY3kl/integrations/skill-assistant/teams/images/filter-setup-policy.png?fit=max&auto=format&n=hcu65nk-6HLQY3kl&q=85&s=3a2ede9c1baa68fc31a2243699179bf3" alt="Filter setup policy" width="434" height="222" data-path="integrations/skill-assistant/teams/images/filter-setup-policy.png" />
  </Step>

  <Step title="Select all users">
    Click on the checkmark icon in the top left corner to select all users.

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/select-all-users.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=161d4801c75b54c0d8dfcce01edb1007" alt="Select all users" width="484" height="83" data-path="integrations/skill-assistant/teams/images/select-all-users.png" />
  </Step>

  <Step title="Edit settings">
    Click on the **Edit settings** button in the top left corner.

    <img src="https://mintcdn.com/techwolf/hcu65nk-6HLQY3kl/integrations/skill-assistant/teams/images/edit-settings.png?fit=max&auto=format&n=hcu65nk-6HLQY3kl&q=85&s=e81cb8f4b3aa2ee05d8f860df69d8f01" alt="Edit settings" width="503" height="150" data-path="integrations/skill-assistant/teams/images/edit-settings.png" />
  </Step>

  <Step title="Assign the permission policy">
    Select the created permission policy from the dropdown menu.

    Click on **Apply** to assign the permission policy to the selected users.

    <img src="https://mintcdn.com/techwolf/hcu65nk-6HLQY3kl/integrations/skill-assistant/teams/images/assign-permission-policy.png?fit=max&auto=format&n=hcu65nk-6HLQY3kl&q=85&s=4e31c13a72de72a6fd14951f1c9ac6d2" alt="Assign permission policy" width="272" height="307" data-path="integrations/skill-assistant/teams/images/assign-permission-policy.png" />
  </Step>
</Steps>

#### Force installing the app using the Microsoft Graph API

If the app is not installed for all users, you can force the installation for
the remaining users using the
[Microsoft Graph API](https://docs.microsoft.com/en-us/graph/api/userteamwork-post-installedapps).

<Steps>
  <Step title="Create file with Azure IDs">
    Create a text file containing all Azure IDs (Object IDs) of the people for which the app
    needs to be installed. This file is structured as a list of the Azure IDs,
    separated by newlines.

    ```plaintext theme={null}
    3f2a9c4e-7b6d-4e2b-9c9a-1a2b3c4d5e6f
    a1b2c3d4-e5f6-7890-abcd-ef1234567890
    12345678-90ab-cdef-1234-567890abcdef
    ...
    ```
  </Step>

  <Step title="Download the script">
    We created a template script that you can use to force install the app.

    <Card title="Download the script" icon="download" href="https://26502993.fs1.hubspotusercontent-eu1.net/hubfs/26502993/Developer%20portal/script.ps1" horizontal="true" />
  </Step>

  <Step title="Create a new service principal">
    Create a new service principal in Azure AD to run the script. Follow the
    [Microsoft guide on creating a service principal](https://learn.microsoft.com/en-us/entra/identity-platform/howto-create-service-principal-portal#register-an-application-with-microsoft-entra-id-and-create-a-service-principal).
  </Step>

  <Step title="Create a client secret">
    A client secret is needed to run the script.

    In the newly created service principal, select `Certificates & secrets`.

    Select `Client secrets`, and then select `New client secret` and click `Add`.

    You will need this secret later to run the script.

    <img src="https://mintcdn.com/techwolf/hcu65nk-6HLQY3kl/integrations/skill-assistant/teams/images/clientsecret.png?fit=max&auto=format&n=hcu65nk-6HLQY3kl&q=85&s=483aa149852aa0a00b7d59bca4d3c478" alt="Client secret" width="500" height="118" data-path="integrations/skill-assistant/teams/images/clientsecret.png" />
  </Step>

  <Step title="Add the permission">
    The script requires the `TeamsAppInstallation.ReadWriteForUser.All` and `User.Read.All` permissions.

    In the service principal, select `API permissions`.

    Click on `Add a permission` and select `Microsoft Graph`.

    Select `Application permissions` and search for
    `TeamsAppInstallation.ReadWriteForUser.All` and select it.

    Search `User.Read.All` and select it too.

    Click on `Add permissions` to add the permission.

    Select the added permissions and click `Grant admin consent`.

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/graphpermissions.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=6e1e5af1c722bbfab96bed98955d9115" alt="Add permission" width="1281" height="356" data-path="integrations/skill-assistant/teams/images/graphpermissions.png" />
  </Step>

  <Step title="Fill in the variables">
    Fill in the variables in the script:

    * `$FilePath`: the path to the previously created file (from Step 1) containing
      the Azure IDs
    * `$ApplicationID`: The Application Client ID of the newly created service principal (from step 3)
    * `$ClientSecret`: The Application Client Secret of the newly created service principal (from step 4)
    * `$TenantID`: The tenant ID of your Teams instance
  </Step>

  <Step title="Run the script in Powershell">
    Run the script in Powershell.

    In [Azure Portal](https://portal.azure.com/), click in the top right on the
    `Cloud Shell` icon.

    <img src="https://mintcdn.com/techwolf/0Ad82QpBivsiQKdJ/integrations/skill-assistant/teams/images/powershelllogo.png?fit=max&auto=format&n=0Ad82QpBivsiQKdJ&q=85&s=edc1195cff26c9ca5beb844e3100a16f" alt="Powershell logo" width="35" height="28" data-path="integrations/skill-assistant/teams/images/powershelllogo.png" />

    Click on `Manage files` and upload the file with Azure IDs and
    the filled in script. Run the script by typing `./script.ps1`.
  </Step>
</Steps>
