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

# Connect Microsoft Teams with OAuth 2.0 (Client Credentials) – StackOne Hub

> Link a Microsoft Teams account in the StackOne Hub using OAuth 2.0 (Client Credentials). End-user guide to authorize the integration and start using Microsoft Teams actions.

<Warning>You must have at least Application Developer permissions in your Azure account to register applications and configure application permissions in Microsoft Entra ID. Note: The Client Credentials (app-only) authentication option cannot be used with actions that call /me/... Microsoft Graph endpoints (for example, actions in microsoftteams.chats and microsoftteams.users); those actions require delegated user tokens and will fail when used with client credentials.</Warning>

<Panel>
  <div className="not-prose guides-scope-selector" data-guides-scope-selector data-guide-actions-json="[{&#x22;id&#x22;:&#x22;microsoftteams_list_users&#x22;,&#x22;label&#x22;:&#x22;List Users&#x22;,&#x22;scopes&#x22;:[&#x22;User.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_user&#x22;,&#x22;label&#x22;:&#x22;Get User&#x22;,&#x22;scopes&#x22;:[&#x22;User.Read&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_create_user&#x22;,&#x22;label&#x22;:&#x22;Create User&#x22;,&#x22;scopes&#x22;:[&#x22;User.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_delete_user&#x22;,&#x22;label&#x22;:&#x22;Delete User&#x22;,&#x22;scopes&#x22;:[&#x22;User.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_change_password&#x22;,&#x22;label&#x22;:&#x22;Change Password&#x22;,&#x22;scopes&#x22;:[&#x22;User-PasswordProfile.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_current_user&#x22;,&#x22;label&#x22;:&#x22;Get Current User&#x22;,&#x22;scopes&#x22;:[&#x22;User.Read&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_teams&#x22;,&#x22;label&#x22;:&#x22;List Teams&#x22;,&#x22;scopes&#x22;:[&#x22;Team.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_create_team&#x22;,&#x22;label&#x22;:&#x22;Create Team&#x22;,&#x22;scopes&#x22;:[&#x22;Team.Create&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_team&#x22;,&#x22;label&#x22;:&#x22;Get Team&#x22;,&#x22;scopes&#x22;:[&#x22;Team.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_update_team&#x22;,&#x22;label&#x22;:&#x22;Update Team&#x22;,&#x22;scopes&#x22;:[&#x22;TeamSettings.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_delete_team&#x22;,&#x22;label&#x22;:&#x22;Delete Team&#x22;,&#x22;scopes&#x22;:[&#x22;Group.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_archive_team&#x22;,&#x22;label&#x22;:&#x22;Archive Team&#x22;,&#x22;scopes&#x22;:[&#x22;TeamSettings.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_unarchive_team&#x22;,&#x22;label&#x22;:&#x22;Unarchive Team&#x22;,&#x22;scopes&#x22;:[&#x22;TeamSettings.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_add_team_member&#x22;,&#x22;label&#x22;:&#x22;Add Team Member&#x22;,&#x22;scopes&#x22;:[&#x22;TeamMember.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_add_team_members_bulk&#x22;,&#x22;label&#x22;:&#x22;Add Team Members In Bulk&#x22;,&#x22;scopes&#x22;:[&#x22;TeamMember.ReadWriteNonOwnerRole.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_remove_team_member&#x22;,&#x22;label&#x22;:&#x22;Remove Team Member&#x22;,&#x22;scopes&#x22;:[&#x22;TeamMember.ReadWriteNonOwnerRole.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_remove_team_members_bulk&#x22;,&#x22;label&#x22;:&#x22;Remove Team Members In Bulk&#x22;,&#x22;scopes&#x22;:[&#x22;TeamMember.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_team_members&#x22;,&#x22;label&#x22;:&#x22;List Team Members&#x22;,&#x22;scopes&#x22;:[&#x22;TeamMember.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_team_member&#x22;,&#x22;label&#x22;:&#x22;Get Team Member&#x22;,&#x22;scopes&#x22;:[&#x22;TeamMember.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_clone_team&#x22;,&#x22;label&#x22;:&#x22;Clone Team&#x22;,&#x22;scopes&#x22;:[&#x22;Team.Create&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_channels&#x22;,&#x22;label&#x22;:&#x22;List Channels&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_channel&#x22;,&#x22;label&#x22;:&#x22;Get Channel&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_all_channels&#x22;,&#x22;label&#x22;:&#x22;List All Channels&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_incoming_channels&#x22;,&#x22;label&#x22;:&#x22;List Incoming Channels&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_primary_channel&#x22;,&#x22;label&#x22;:&#x22;Get Primary Channel&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.ReadBasic.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_create_channel&#x22;,&#x22;label&#x22;:&#x22;Create Channel&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.Create&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_update_channel&#x22;,&#x22;label&#x22;:&#x22;Update Channel&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelSettings.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_delete_channel&#x22;,&#x22;label&#x22;:&#x22;Delete Channel&#x22;,&#x22;scopes&#x22;:[&#x22;Channel.Delete.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_channel_tabs&#x22;,&#x22;label&#x22;:&#x22;List Channel Tabs&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsTab.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_channel_files_folder&#x22;,&#x22;label&#x22;:&#x22;Get Channel Files Folder&#x22;,&#x22;scopes&#x22;:[&#x22;Files.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_channel_members&#x22;,&#x22;label&#x22;:&#x22;List Channel Members&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMember.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_all_channel_members&#x22;,&#x22;label&#x22;:&#x22;List All Channel Members&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMember.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_channel_member&#x22;,&#x22;label&#x22;:&#x22;Get Channel Member&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMember.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_archive_channel&#x22;,&#x22;label&#x22;:&#x22;Archive Channel&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelSettings.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_unarchive_channel&#x22;,&#x22;label&#x22;:&#x22;Unarchive Channel&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelSettings.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_add_channel_member&#x22;,&#x22;label&#x22;:&#x22;Add Channel Member&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMember.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_remove_channel_member&#x22;,&#x22;label&#x22;:&#x22;Remove Channel Member&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMember.ReadWrite.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_channel_tab&#x22;,&#x22;label&#x22;:&#x22;Get Channel Tab&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsTab.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_delete_channel_tab&#x22;,&#x22;label&#x22;:&#x22;Delete Channel Tab&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsTab.ReadWriteSelfForTeam&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_channel_messages&#x22;,&#x22;label&#x22;:&#x22;List Channel Messages&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_all_channel_messages&#x22;,&#x22;label&#x22;:&#x22;List All Channel Messages&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_channel_message&#x22;,&#x22;label&#x22;:&#x22;Get Channel Message&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.Read&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_send_channel_message&#x22;,&#x22;label&#x22;:&#x22;Send Channel Message&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.Send&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_update_channel_message&#x22;,&#x22;label&#x22;:&#x22;Update Channel Message&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_soft_delete_channel_message&#x22;,&#x22;label&#x22;:&#x22;Delete Channel Message&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_channel_message_replies&#x22;,&#x22;label&#x22;:&#x22;List Message Replies&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_send_message_reply&#x22;,&#x22;label&#x22;:&#x22;Send Message Reply&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.Send&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_channel_message_reply&#x22;,&#x22;label&#x22;:&#x22;Get Message Reply&#x22;,&#x22;scopes&#x22;:[&#x22;ChannelMessage.Read.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_chat_messages&#x22;,&#x22;label&#x22;:&#x22;List Chat Messages&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.Read&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_chat_message&#x22;,&#x22;label&#x22;:&#x22;Get Chat Message&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.Read&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_send_chat_message&#x22;,&#x22;label&#x22;:&#x22;Send Chat Message&#x22;,&#x22;scopes&#x22;:[&#x22;ChatMessage.Send&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_soft_delete_chat_message&#x22;,&#x22;label&#x22;:&#x22;Delete Chat Message&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_undo_soft_delete_chat_message&#x22;,&#x22;label&#x22;:&#x22;Undo Soft Delete Chat Message&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_chats&#x22;,&#x22;label&#x22;:&#x22;List Chats&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadBasic&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_chat&#x22;,&#x22;label&#x22;:&#x22;Get Chat&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadBasic&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_create_chat&#x22;,&#x22;label&#x22;:&#x22;Create Chat&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.Create&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_update_chat&#x22;,&#x22;label&#x22;:&#x22;Update Chat&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_delete_chat&#x22;,&#x22;label&#x22;:&#x22;Delete Chat&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ManageDeletion.All&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_list_chat_members&#x22;,&#x22;label&#x22;:&#x22;List Chat Members&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadBasic&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_add_chat_member&#x22;,&#x22;label&#x22;:&#x22;Add Chat Member&#x22;,&#x22;scopes&#x22;:[&#x22;ChatMember.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_remove_chat_member&#x22;,&#x22;label&#x22;:&#x22;Remove Chat Member&#x22;,&#x22;scopes&#x22;:[&#x22;ChatMember.ReadWrite&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_get_chat_member&#x22;,&#x22;label&#x22;:&#x22;Get Chat Member&#x22;,&#x22;scopes&#x22;:[&#x22;Chat.ReadBasic&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_create_conversation&#x22;,&#x22;label&#x22;:&#x22;Bot Create Conversation&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_send_to_conversation&#x22;,&#x22;label&#x22;:&#x22;Bot Send To Conversation&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_reply_to_activity&#x22;,&#x22;label&#x22;:&#x22;Bot Reply To Activity&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_update_activity&#x22;,&#x22;label&#x22;:&#x22;Bot Update Activity&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_delete_activity&#x22;,&#x22;label&#x22;:&#x22;Bot Delete Activity&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_get_conversation_members&#x22;,&#x22;label&#x22;:&#x22;Bot Get Conversation Members&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_get_conversation_paged_members&#x22;,&#x22;label&#x22;:&#x22;Bot Get Conversation Paged Members&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]},{&#x22;id&#x22;:&#x22;microsoftteams_bot_get_conversation_member&#x22;,&#x22;label&#x22;:&#x22;Bot Get Conversation Member&#x22;,&#x22;scopes&#x22;:[&#x22;TeamsAppInstallation.ReadWriteSelfForUser&#x22;]}]" style={{ borderRadius: '8px', padding: '16px', marginBottom: '24px' }}>
    <div className="guides-scope-selector__title" style={{ fontSize: '16px', fontWeight: '600', marginBottom: '12px' }}>Select Actions to adjust the guide</div>
    <div className="guides-scope-selector__muted" style={{ fontSize: '13px', marginBottom: '12px' }}>Some actions may require additional configuration in the provider to be accessible. Choose the actions you need and the guide will be updated.</div>

    <div style={{ display: 'flex', gap: '8px', marginBottom: '12px', flexWrap: 'wrap' }}>
      <input type="text" placeholder="Search actions..." className="guides-scope-selector__input" data-guide-action-search style={{ padding: '8px 12px', borderRadius: '6px', fontSize: '13px', flex: 1, minWidth: '160px' }} />

      <button type="button" className="guides-scope-selector__quick-btn" data-guide-select-all style={{ padding: '6px 10px', borderRadius: '6px', fontSize: '12px', cursor: 'pointer' }}>Select all</button>
      <button type="button" className="guides-scope-selector__quick-btn" data-guide-clear style={{ padding: '6px 10px', borderRadius: '6px', fontSize: '12px', cursor: 'pointer' }}>Clear</button>
    </div>

    <div className="guides-scope-selector__list" style={{ maxHeight: '240px', overflowY: 'auto', borderRadius: '6px', marginBottom: '12px' }}>
      <div className="guides-scope-selector__list-header" style={{ display: 'flex', alignItems: 'center', gap: '10px', padding: '8px 12px', fontSize: '12px', fontWeight: '600', position: 'sticky', top: 0, zIndex: 1 }}>
        <div style={{ width: '16px', flexShrink: 0 }} />

        <div style={{ flex: 1, textAlign: 'left' }}>Action</div>
        <div style={{ minWidth: '120px', marginLeft: 'auto', textAlign: 'right' }}>Scope(s)</div>
      </div>

      <div className="guides-scope-selector__muted" data-guide-loading style={{ padding: '16px', textAlign: 'center', fontSize: '13px' }}>Loading actions...</div>
      <div className="guides-scope-selector__muted" data-guide-no-results hidden style={{ padding: '16px', textAlign: 'center', fontSize: '13px' }}>No actions match your search.</div>
    </div>

    <div className="guides-scope-selector__url-section" style={{ marginTop: '12px', paddingTop: '12px' }}>
      <div className="guides-scope-selector__muted" style={{ fontSize: '12px', fontWeight: '500', marginBottom: '6px' }}>Dynamic Guide URL</div>

      <div style={{ display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>
        <input type="text" readOnly className="guides-scope-selector__input" data-guide-url style={{ flex: 1, minWidth: '200px', padding: '8px 10px', borderRadius: '6px', fontSize: '12px', fontFamily: 'monospace' }} />

        <button type="button" className="guides-scope-selector__copy-btn" data-guide-copy-url style={{ width: '120px', padding: '8px 14px', borderRadius: '6px', fontSize: '13px', fontWeight: '500', cursor: 'pointer', whiteSpace: 'nowrap', marginLeft: 'auto' }}>Copy URL</button>
      </div>

      <div style={{ marginTop: '12px' }}>
        <div className="guides-scope-selector__muted" style={{ fontSize: '12px', fontWeight: '500', marginBottom: '6px' }}>Scopes Selected</div>

        <div style={{ display: 'flex', alignItems: 'stretch', gap: '8px', flexWrap: 'wrap' }}>
          <pre className="guides-scope-selector__input" role="textbox" aria-readonly="true" tabIndex={0} data-guide-scopes-output style={{ flex: 1, minWidth: '200px', minHeight: '88px', maxHeight: '120px', overflowY: 'auto', margin: 0, padding: '8px 10px', borderRadius: '6px', fontSize: '12px', fontFamily: 'monospace', whiteSpace: 'pre-wrap' }} />

          <div className="guides-scope-selector__muted" style={{ display: 'flex', flexDirection: 'column', gap: '8px', fontSize: '12px', fontWeight: '500', flexShrink: 0, alignItems: 'flex-start' }}>
            <div style={{ whiteSpace: 'nowrap' }}>Separator</div>

            <select className="guides-scope-selector__input" data-guide-scope-delimiter style={{ width: '100%', padding: '6px 10px', borderRadius: '6px', fontSize: '12px' }}>
              <option value="space">Space</option>
              <option value="comma">Comma</option>
              <option value="semicolon">Semicolon</option>
              <option value="pipe">Pipe</option>
              <option value="newline">Newline</option>
            </select>

            <button type="button" className="guides-scope-selector__copy-btn" data-guide-copy-scopes style={{ width: '120px', padding: '8px 14px', borderRadius: '6px', fontSize: '13px', fontWeight: '500', cursor: 'pointer', whiteSpace: 'nowrap' }}>Copy scopes</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</Panel>

<section data-guide-section data-guide-scopes="">
  <h2>Register Your Application in Microsoft Entra ID</h2>

  <p>To use client credentials authentication with Microsoft Teams, you need to register an application in Microsoft Entra ID and configure application permissions.</p>

  <Steps>
    <Step title="Sign in to Microsoft Entra Admin Center">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to the <a href="https://entra.microsoft.com" target="_blank" rel="noopener noreferrer">Microsoft Entra admin center</a> as at least an Application Developer. If you have access to multiple tenants, click the <strong>Settings</strong> (gear) icon in the top-right corner, then select the desired tenant from the list under <strong>Directory + subscription</strong>.</p>
      </div>
    </Step>

    <Step title="Create a New App Registration">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Navigate to <strong>App registrations</strong> by searching from the top search bar and click on <strong>New registration</strong>.</p>

        <ul>
          <li>Enter a meaningful <strong>Name</strong> for your app (e.g., StackOne Microsoft Teams Integration).</li>
          <li>Under <strong>Supported account types</strong>, select <strong>Single tenant</strong> if only your organization will use this integration, or <strong>Multitenant</strong> if you need to support users from multiple Azure AD tenants. Recommended option is <strong>Multitenant</strong>.</li>
          <li>You do not need to configure a redirect URI for client credentials flow.</li>
          <li>Select <strong>Register</strong> to create the app registration.</li>
        </ul>
      </div>
    </Step>

    <Step title="Copy the Application (Client) ID">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>After registration, you'll be directed to the application's <strong>Overview</strong> page. Copy the <strong>Application (client) ID</strong> value and store it securely for use later.</p>
      </div>
    </Step>

    <Step title="Copy the Directory (Tenant) ID">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>From the same <strong>Overview</strong> page, copy the <strong>Directory (tenant) ID</strong> value and store it securely for use later.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Configure Application Permissions</h2>

  <p>Grant your application the necessary Microsoft Graph API application permissions. These are different from delegated permissions and do not require user consent.</p>

  <Steps>
    <Step title="Open API Permissions">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>From the left menu under <strong>Manage</strong>, select <strong>API permissions</strong>.</p>
      </div>
    </Step>

    <Step title="Add Microsoft Graph Application Permissions">
      <div data-guide-step data-guide-scopes="Channel.ReadBasic.All,Channel.Create,Channel.Delete.All,ChannelSettings.ReadWrite.All,ChannelMember.Read.All,ChannelMember.ReadWrite.All,ChannelMessage.Read.All,ChannelMessage.Send,ChannelMessage.ReadWrite,Chat.ReadBasic,Chat.Read,Chat.ReadWrite,Chat.Create,Chat.ManageDeletion.All,ChatMember.ReadWrite,ChatMessage.Send,Team.ReadBasic.All,Team.Create,TeamSettings.ReadWrite.All,TeamMember.Read.All,TeamMember.ReadWriteNonOwnerRole.All,TeamMember.ReadWrite.All,Group.ReadWrite.All,TeamsTab.Read.All,TeamsTab.ReadWriteSelfForTeam,Files.Read.All,User.Read,User.ReadBasic.All,User.ReadWrite.All,User-PasswordProfile.ReadWrite.All" data-guide-display-scopes-list="Channel.ReadBasic.All,Channel.Create,Channel.Delete.All,ChannelSettings.ReadWrite.All,ChannelMember.Read.All,ChannelMember.ReadWrite.All,ChannelMessage.Read.All,ChannelMessage.Send,ChannelMessage.ReadWrite,Chat.ReadBasic,Chat.Read,Chat.ReadWrite,Chat.Create,Chat.ManageDeletion.All,ChatMember.ReadWrite,ChatMessage.Send,Team.ReadBasic.All,Team.Create,TeamSettings.ReadWrite.All,TeamMember.Read.All,TeamMember.ReadWriteNonOwnerRole.All,TeamMember.ReadWrite.All,Group.ReadWrite.All,TeamsTab.Read.All,TeamsTab.ReadWriteSelfForTeam,Files.Read.All,User.Read,User.ReadBasic.All,User.ReadWrite.All,User-PasswordProfile.ReadWrite.All">
        <div className="connector-guide-actions-badge" data-guide-actions-badge data-guide-actions-badge-scopes="Channel.ReadBasic.All,Channel.Create,Channel.Delete.All,ChannelSettings.ReadWrite.All,ChannelMember.Read.All,ChannelMember.ReadWrite.All,ChannelMessage.Read.All,ChannelMessage.Send,ChannelMessage.ReadWrite,Chat.ReadBasic,Chat.Read,Chat.ReadWrite,Chat.Create,Chat.ManageDeletion.All,ChatMember.ReadWrite,ChatMessage.Send,Team.ReadBasic.All,Team.Create,TeamSettings.ReadWrite.All,TeamMember.Read.All,TeamMember.ReadWriteNonOwnerRole.All,TeamMember.ReadWrite.All,Group.ReadWrite.All,TeamsTab.Read.All,TeamsTab.ReadWriteSelfForTeam,Files.Read.All,User.Read,User.ReadBasic.All,User.ReadWrite.All,User-PasswordProfile.ReadWrite.All" style={{ display: 'block', width: 'fit-content', maxWidth: '100%', padding: '2px 8px', borderRadius: '8px', fontSize: '12px', marginBottom: '8px', marginTop: '-10px', whiteSpace: 'nowrap', overflowX: 'auto', overflowY: 'hidden', msOverflowStyle: 'none', scrollbarWidth: 'none' }}>
          <span>Enables actions: </span><span data-guide-actions-badge-labels>Add Channel Member, Add Chat Member, Add Team Member, Add Team Members In Bulk, Archive Channel, Archive Team, Change Password, Clone Team, Create Channel, Create Chat, Create Team, Create User, Delete Channel, Delete Channel Message, Delete Channel Tab, Delete Chat, Delete Chat Message, Delete Team, Delete User, Get Channel, Get Channel Files Folder, Get Channel Member, Get Channel Message, Get Channel Tab, Get Chat, Get Chat Member, Get Chat Message, Get Current User, Get Message Reply, Get Primary Channel, Get Team, Get Team Member, Get User, List All Channel Members, List All Channel Messages, List All Channels, List Channel Members, List Channel Messages, List Channel Tabs, List Channels, List Chat Members, List Chat Messages, List Chats, List Incoming Channels, List Message Replies, List Team Members, List Teams, List Users, Remove Channel Member, Remove Chat Member, Remove Team Member, Remove Team Members In Bulk, Send Channel Message, Send Chat Message, Send Message Reply, Unarchive Channel, Unarchive Team, Undo Soft Delete Chat Message, Update Channel, Update Channel Message, Update Chat, Update Team</span>
        </div>

        <p>Click <strong>Add a permission</strong>, then select <strong>Microsoft Graph</strong>. Select <strong>Application permissions</strong> and add the scopes required for your use case, then click <strong>Add permissions</strong> to save.<br /><br />Note: Client credentials (app-only) authentication cannot access user-specific /me endpoints (e.g., chat actions). Use the OAuth 2.0 delegated flow for those actions.</p>

        <div style={{ marginTop: '8px' }} data-guide-display-scopes>
          <div className="connector-guide-scopes-container connector-guide-scopes-container--scrollable">
            <ul className="not-prose" style={{ listStyleType: "'- '", paddingLeft: '1em', margin: 0 }}>
              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Channel.ReadBasic.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Channel.ReadBasic.All" title="Copy scope" data-copy="Channel.ReadBasic.All">
                  <span className="connector-guide-scope-copy__label">Channel.ReadBasic.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Channel.Create">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Channel.Create" title="Copy scope" data-copy="Channel.Create">
                  <span className="connector-guide-scope-copy__label">Channel.Create</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Channel.Delete.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Channel.Delete.All" title="Copy scope" data-copy="Channel.Delete.All">
                  <span className="connector-guide-scope-copy__label">Channel.Delete.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChannelSettings.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChannelSettings.ReadWrite.All" title="Copy scope" data-copy="ChannelSettings.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">ChannelSettings.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChannelMember.Read.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChannelMember.Read.All" title="Copy scope" data-copy="ChannelMember.Read.All">
                  <span className="connector-guide-scope-copy__label">ChannelMember.Read.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChannelMember.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChannelMember.ReadWrite.All" title="Copy scope" data-copy="ChannelMember.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">ChannelMember.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChannelMessage.Read.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChannelMessage.Read.All" title="Copy scope" data-copy="ChannelMessage.Read.All">
                  <span className="connector-guide-scope-copy__label">ChannelMessage.Read.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChannelMessage.Send">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChannelMessage.Send" title="Copy scope" data-copy="ChannelMessage.Send">
                  <span className="connector-guide-scope-copy__label">ChannelMessage.Send</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChannelMessage.ReadWrite">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChannelMessage.ReadWrite" title="Copy scope" data-copy="ChannelMessage.ReadWrite">
                  <span className="connector-guide-scope-copy__label">ChannelMessage.ReadWrite</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Chat.ReadBasic">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Chat.ReadBasic" title="Copy scope" data-copy="Chat.ReadBasic">
                  <span className="connector-guide-scope-copy__label">Chat.ReadBasic</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Chat.Read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Chat.Read" title="Copy scope" data-copy="Chat.Read">
                  <span className="connector-guide-scope-copy__label">Chat.Read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Chat.ReadWrite">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Chat.ReadWrite" title="Copy scope" data-copy="Chat.ReadWrite">
                  <span className="connector-guide-scope-copy__label">Chat.ReadWrite</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Chat.Create">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Chat.Create" title="Copy scope" data-copy="Chat.Create">
                  <span className="connector-guide-scope-copy__label">Chat.Create</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Chat.ManageDeletion.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Chat.ManageDeletion.All" title="Copy scope" data-copy="Chat.ManageDeletion.All">
                  <span className="connector-guide-scope-copy__label">Chat.ManageDeletion.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChatMember.ReadWrite">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChatMember.ReadWrite" title="Copy scope" data-copy="ChatMember.ReadWrite">
                  <span className="connector-guide-scope-copy__label">ChatMember.ReadWrite</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="ChatMessage.Send">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy ChatMessage.Send" title="Copy scope" data-copy="ChatMessage.Send">
                  <span className="connector-guide-scope-copy__label">ChatMessage.Send</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Team.ReadBasic.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Team.ReadBasic.All" title="Copy scope" data-copy="Team.ReadBasic.All">
                  <span className="connector-guide-scope-copy__label">Team.ReadBasic.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Team.Create">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Team.Create" title="Copy scope" data-copy="Team.Create">
                  <span className="connector-guide-scope-copy__label">Team.Create</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="TeamSettings.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy TeamSettings.ReadWrite.All" title="Copy scope" data-copy="TeamSettings.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">TeamSettings.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="TeamMember.Read.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy TeamMember.Read.All" title="Copy scope" data-copy="TeamMember.Read.All">
                  <span className="connector-guide-scope-copy__label">TeamMember.Read.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="TeamMember.ReadWriteNonOwnerRole.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy TeamMember.ReadWriteNonOwnerRole.All" title="Copy scope" data-copy="TeamMember.ReadWriteNonOwnerRole.All">
                  <span className="connector-guide-scope-copy__label">TeamMember.ReadWriteNonOwnerRole.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="TeamMember.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy TeamMember.ReadWrite.All" title="Copy scope" data-copy="TeamMember.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">TeamMember.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Group.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Group.ReadWrite.All" title="Copy scope" data-copy="Group.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">Group.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="TeamsTab.Read.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy TeamsTab.Read.All" title="Copy scope" data-copy="TeamsTab.Read.All">
                  <span className="connector-guide-scope-copy__label">TeamsTab.Read.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="TeamsTab.ReadWriteSelfForTeam">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy TeamsTab.ReadWriteSelfForTeam" title="Copy scope" data-copy="TeamsTab.ReadWriteSelfForTeam">
                  <span className="connector-guide-scope-copy__label">TeamsTab.ReadWriteSelfForTeam</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="Files.Read.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy Files.Read.All" title="Copy scope" data-copy="Files.Read.All">
                  <span className="connector-guide-scope-copy__label">Files.Read.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="User.Read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy User.Read" title="Copy scope" data-copy="User.Read">
                  <span className="connector-guide-scope-copy__label">User.Read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="User.ReadBasic.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy User.ReadBasic.All" title="Copy scope" data-copy="User.ReadBasic.All">
                  <span className="connector-guide-scope-copy__label">User.ReadBasic.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="User.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy User.ReadWrite.All" title="Copy scope" data-copy="User.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">User.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="User-PasswordProfile.ReadWrite.All">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy User-PasswordProfile.ReadWrite.All" title="Copy scope" data-copy="User-PasswordProfile.ReadWrite.All">
                  <span className="connector-guide-scope-copy__label">User-PasswordProfile.ReadWrite.All</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </Step>

    <Step title="Grant Admin Consent">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Grant admin consent for \[tenant name]</strong> and select <strong>Yes</strong> to consent on behalf of the organization. After granting, verify that <strong>Granted for \[tenant name]</strong> appears under the <strong>Status</strong> column.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Generate Client Secret</h2>

  <p>Create a client secret that will be used to authenticate your application with Microsoft Teams.</p>

  <Steps>
    <Step title="Navigate to Certificates & Secrets">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>From the left menu under <strong>Manage</strong>, select <strong>Certificates & secrets</strong>.</p>
      </div>
    </Step>

    <Step title="Create a New Client Secret">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Under the <strong>Client secrets</strong> tab, click <strong>New client secret</strong>.</p>

        <ul>
          <li>Add a <strong>Description</strong> (e.g., StackOne Integration Secret).</li>
          <li>Select an expiration period.</li>
          <li>Click <strong>Add</strong>.</li>
        </ul>
      </div>
    </Step>

    <Step title="Copy the Client Secret Value">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Immediately copy the <strong>Value</strong> of the newly created client secret and store it securely for use later. This value will only be shown once and cannot be retrieved again.</p>
      </div>
    </Step>
  </Steps>
</section>

<div data-whitelabel-hide>
  <h2>Linking the Account from the Hub</h2>

  <Steps>
    <Step title="Navigate to the Hub">
      Use one of the three <a href="/guides/accounts-section#linking-accounts">Linking Account Methods</a> to access the Hub.
    </Step>

    <Step title="Fill out the fields">
      Fill out the following fields using details from your provider:

      <ul>
        <li><strong>Tenant ID</strong></li>
        <li><strong>Client ID</strong></li>
        <li><strong>Client Secret</strong></li>
      </ul>
    </Step>

    <Step title="Connect">
      <ul>
        <li>Click <strong>Connect</strong></li>
        <li>If applicable, the provider will redirect you to a sign-in or authorization page. Complete the provider's authorization flow.</li>
        <li>Once authorization is successful, you will see a confirmation popup</li>
      </ul>
    </Step>
  </Steps>

  <p>If the account linking is successful, you will see the newly linked account in your <a href="/guides/accounts-section">Accounts</a> page.</p>
</div>

## References

<Columns cols={2}>
  <Card title="Microsoft Graph API" href="https://learn.microsoft.com/en-us/graph/api/overview?view=graph-rest-1.0">
    Full REST API reference for Microsoft Graph.
  </Card>

  <Card title="Build a bot for Microsoft Teams" href="https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots">
    Guide for building bots to leverage the messaging API for agentic use cases.
  </Card>
</Columns>
