GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

azure-mgmt-botservice-py

Azure Bot Service Management SDK for Python. Use for creating, managing, and configuring Azure Bot Service resources. Triggers: "azure-mgmt-botservice", "AzureBotService", "bot management", "conversational AI", "bot channels".

Ciza · 0 points · 19 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_azure-sdk-python_skills_azure-mgmt-botservice-py-e58528d.zip · 5 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-mgmt-botservice-py
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Azure Bot Service Management SDK for Python

Manage Azure Bot Service resources including bots, channels, and connections.

Installation

pip install azure-mgmt-botservice
pip install azure-identity

Environment Variables

AZURE_SUBSCRIPTION_ID=<your-subscription-id>  # Required for all auth methods
AZURE_RESOURCE_GROUP=<your-resource-group>  # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production

Authentication & Lifecycle

🔑 Two rules apply to every code sample below:

  1. Prefer DefaultAzureCredential. It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
    • Local dev: DefaultAzureCredential works as-is.
    • Production: set AZURE_TOKEN_CREDENTIALS=prod (or AZURE_TOKEN_CREDENTIALS=<specific_credential>) to constrain the credential chain to production-safe credentials.
  2. Wrap every client in a context manager so HTTP transports, sockets, and token caches are released deterministically:
    • Sync: with <Client>(...) as client:
    • Async: async with <Client>(...) as client: and async with DefaultAzureCredential() as credential: (from azure.identity.aio)

Snippets may abbreviate this setup, but production code should always follow both rules.

from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.mgmt.botservice import AzureBotService
import os

# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()

with AzureBotService(
    credential=credential,
    subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
) as client:
    # Use `client` for all subsequent operations (see examples below)
    ...

Create a Bot

from azure.mgmt.botservice import AzureBotService
from azure.mgmt.botservice.models import Bot, BotProperties, Sku
from azure.identity import DefaultAzureCredential
import os

resource_group = os.environ["AZURE_RESOURCE_GROUP"]
bot_name = "my-chat-bot"

credential = DefaultAzureCredential()
with AzureBotService(
    credential=credential,
    subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
) as client:
    bot = client.bots.create(
        resource_group_name=resource_group,
        resource_name=bot_name,
        parameters=Bot(
            location="global",
            sku=Sku(name="F0"),  # Free tier
            kind="azurebot",
            properties=BotProperties(
                display_name="My Chat Bot",
                description="A conversational AI bot",
                endpoint="https://my-bot-app.azurewebsites.net/api/messages",
                msa_app_id="<your-app-id>",
                msa_app_type="MultiTenant"
            )
        )
    )

print(f"Bot created: {bot.name}")

Get Bot Details

bot = client.bots.get(
    resource_group_name=resource_group,
    resource_name=bot_name
)

print(f"Bot: {bot.properties.display_name}")
print(f"Endpoint: {bot.properties.endpoint}")
print(f"SKU: {bot.sku.name}")

List Bots in Resource Group

bots = client.bots.list_by_resource_group(resource_group_name=resource_group)

for bot in bots:
    print(f"Bot: {bot.name} - {bot.properties.display_name}")

List All Bots in Subscription

all_bots = client.bots.list()

for bot in all_bots:
    print(f"Bot: {bot.name} in {bot.id.split('/')[4]}")

Update Bot

bot = client.bots.update(
    resource_group_name=resource_group,
    resource_name=bot_name,
    properties=BotProperties(
        display_name="Updated Bot Name",
        description="Updated description"
    )
)

Delete Bot

client.bots.delete(
    resource_group_name=resource_group,
    resource_name=bot_name
)

Configure Channels

Add Teams Channel

from azure.mgmt.botservice.models import (
    BotChannel,
    MsTeamsChannel,
    MsTeamsChannelProperties
)

channel = client.channels.create(
    resource_group_name=resource_group,
    resource_name=bot_name,
    channel_name="MsTeamsChannel",
    parameters=BotChannel(
        location="global",
        properties=MsTeamsChannel(
            properties=MsTeamsChannelProperties(
                is_enabled=True
            )
        )
    )
)

Add Direct Line Channel

from azure.mgmt.botservice.models import (
    BotChannel,
    DirectLineChannel,
    DirectLineChannelProperties,
    DirectLineSite
)

channel = client.channels.create(
    resource_group_name=resource_group,
    resource_name=bot_name,
    channel_name="DirectLineChannel",
    parameters=BotChannel(
        location="global",
        properties=DirectLineChannel(
            properties=DirectLineChannelProperties(
                sites=[
                    DirectLineSite(
                        site_name="Default Site",
                        is_enabled=True,
                        is_v1_enabled=False,
                        is_v3_enabled=True
                    )
                ]
            )
        )
    )
)

Add Web Chat Channel

from azure.mgmt.botservice.models import (
    BotChannel,
    WebChatChannel,
    WebChatChannelProperties,
    WebChatSite
)

channel = client.channels.create(
    resource_group_name=resource_group,
    resource_name=bot_name,
    channel_name="WebChatChannel",
    parameters=BotChannel(
        location="global",
        properties=WebChatChannel(
            properties=WebChatChannelProperties(
                sites=[
                    WebChatSite(
                        site_name="Default Site",
                        is_enabled=True
                    )
                ]
            )
        )
    )
)

Get Channel Details

channel = client.channels.get(
    resource_group_name=resource_group,
    resource_name=bot_name,
    channel_name="DirectLineChannel"
)

List Channel Keys

keys = client.channels.list_with_keys(
    resource_group_name=resource_group,
    resource_name=bot_name,
    channel_name="DirectLineChannel"
)

# Access Direct Line keys
if hasattr(keys.properties, 'properties'):
    for site in keys.properties.properties.sites:
        print(f"Site: {site.site_name}")
        print(f"Key: {site.key}")

Bot Connections (OAuth)

Create Connection Setting

from azure.mgmt.botservice.models import (
    ConnectionSetting,
    ConnectionSettingProperties
)

connection = client.bot_connection.create(
    resource_group_name=resource_group,
    resource_name=bot_name,
    connection_name="graph-connection",
    parameters=ConnectionSetting(
        location="global",
        properties=ConnectionSettingProperties(
            client_id="<oauth-client-id>",
            client_secret="<oauth-client-secret>",
            scopes="User.Read",
            service_provider_id="<service-provider-id>"
        )
    )
)

List Connections

connections = client.bot_connection.list_by_bot_service(
    resource_group_name=resource_group,
    resource_name=bot_name
)

for conn in connections:
    print(f"Connection: {conn.name}")

Client Operations

Operation Method
client.bots Bot CRUD operations
client.channels Channel configuration
client.bot_connection OAuth connection settings
client.direct_line Direct Line channel operations
client.email Email channel operations
client.operations Available operations
client.host_settings Host settings operations

SKU Options

SKU Description
F0 Free tier (limited messages)
S1 Standard tier (unlimited messages)

Channel Types

Channel Class Purpose
MsTeamsChannel Microsoft Teams Teams integration
DirectLineChannel Direct Line Custom client integration
WebChatChannel Web Chat Embeddable web widget
SlackChannel Slack Slack workspace integration
FacebookChannel Facebook Messenger integration
EmailChannel Email Email communication

Best Practices

  1. Pick sync OR async and stay consistent. Do not mix azure.xxx sync clients with azure.xxx.aio async clients in the same call path. Choose one mode per module.
  2. Always use context managers for clients and async credentials. Wrap every client in with Client(...) as client: (sync) or async with Client(...) as client: (async). For async DefaultAzureCredential from azure.identity.aio, also use async with credential: so tokens and transports are cleaned up.
  3. Use DefaultAzureCredential for code that runs locally. Use a specific token credential for code that runs in Azure.
  4. Start with F0 SKU for development, upgrade to S1 for production
  5. Store MSA App ID/Secret securely — use Key Vault
  6. Enable only needed channels — reduces attack surface
  7. Rotate Direct Line keys periodically
  8. Use managed identity when possible for bot connections
  9. Configure proper CORS for Web Chat channel

Reference Files

File Contents
references/capabilities.md Additional non-hero capabilities, operation-group coverage, and production checklists.
references/non-hero-scenarios.md Dedicated non-hero examples for secondary/advanced scenarios.
Files (skills)
  • references
    • capabilities.md 2.3 KB
      # azure-mgmt-botservice-py capability coverage
      
      **SDK/package**: `azure-mgmt-botservice`
      
      This index maps hero scenarios in `SKILL.md` and links non-hero scenarios documented in dedicated reference files.
      
      ## Hero scenarios covered in SKILL.md
      
      - `Create a Bot`
      - `Get Bot Details`
      - `List Bots in Resource Group`
      - `List All Bots in Subscription`
      
      ## Non-hero scenarios
      
      - `Update Bot`: Dedicated example and implementation notes.  
        See: [`non-hero-scenarios.md#update-bot`](non-hero-scenarios.md#update-bot)
      - `Delete Bot`: Dedicated example and implementation notes.  
        See: [`non-hero-scenarios.md#delete-bot`](non-hero-scenarios.md#delete-bot)
      - `Configure Channels`: Dedicated example and implementation notes.  
        See: [`non-hero-scenarios.md#configure-channels`](non-hero-scenarios.md#configure-channels)
      - `Get Channel Details`: Dedicated example and implementation notes.  
        See: [`non-hero-scenarios.md#get-channel-details`](non-hero-scenarios.md#get-channel-details)
      - `List Channel Keys`: Dedicated example and implementation notes.  
        See: [`non-hero-scenarios.md#list-channel-keys`](non-hero-scenarios.md#list-channel-keys)
      - `Bot Connections (OAuth)`: Dedicated example and implementation notes.  
        See: [`non-hero-scenarios.md#bot-connections-oauth`](non-hero-scenarios.md#bot-connections-oauth)
      - `Client Operations`: | Operation | Method |  
        See: [`non-hero-scenarios.md#client-operations`](non-hero-scenarios.md#client-operations)
      - `SKU Options`: | SKU | Description |  
        See: [`non-hero-scenarios.md#sku-options`](non-hero-scenarios.md#sku-options)
      - `Channel Types`: | Channel | Class | Purpose |  
        See: [`non-hero-scenarios.md#channel-types`](non-hero-scenarios.md#channel-types)
      
      ## Related deep-dive references
      
      - [`non-hero-scenarios.md`](non-hero-scenarios.md): Dedicated non-hero examples and implementation notes.
      
      ## API breadth checklist
      
      - Verify client/auth mode for the environment before coding.
      - Confirm operation-group/method names against current Microsoft Learn API reference.
      - For Python SDKs with both sync and async clients, document both forms without a blanket preference.
      - Include cleanup/delete paths for created resources in examples.
      - Prefer idempotent create/update operations where available.
      - Validate paging/LRO/error-handling patterns for production paths.
      
    • non-hero-scenarios.md 4.9 KB
      # azure-mgmt-botservice-py non-hero scenarios
      
      These scenarios are intentionally separate from hero flows in `SKILL.md`.
      They cover secondary/advanced patterns typically used after the primary end-to-end path is working.
      
      ## Update Bot
      
      ```python
      bot = client.bots.update(
          resource_group_name=resource_group,
          resource_name=bot_name,
          properties=BotProperties(
              display_name="Updated Bot Name",
              description="Updated description"
          )
      )
      ```
      
      ## Delete Bot
      
      ```python
      client.bots.delete(
          resource_group_name=resource_group,
          resource_name=bot_name
      )
      ```
      
      ## Configure Channels
      
      ### Add Teams Channel
      
      ```python
      from azure.mgmt.botservice.models import (
          BotChannel,
          MsTeamsChannel,
          MsTeamsChannelProperties
      )
      
      channel = client.channels.create(
          resource_group_name=resource_group,
          resource_name=bot_name,
          channel_name="MsTeamsChannel",
          parameters=BotChannel(
              location="global",
              properties=MsTeamsChannel(
                  properties=MsTeamsChannelProperties(
                      is_enabled=True
                  )
              )
          )
      )
      ```
      
      ### Add Direct Line Channel
      
      ```python
      from azure.mgmt.botservice.models import (
          BotChannel,
          DirectLineChannel,
          DirectLineChannelProperties,
          DirectLineSite
      )
      
      channel = client.channels.create(
          resource_group_name=resource_group,
          resource_name=bot_name,
          channel_name="DirectLineChannel",
          parameters=BotChannel(
              location="global",
              properties=DirectLineChannel(
                  properties=DirectLineChannelProperties(
                      sites=[
                          DirectLineSite(
                              site_name="Default Site",
                              is_enabled=True,
                              is_v1_enabled=False,
                              is_v3_enabled=True
                          )
                      ]
                  )
              )
          )
      )
      ```
      
      ### Add Web Chat Channel
      
      ```python
      from azure.mgmt.botservice.models import (
          BotChannel,
          WebChatChannel,
          WebChatChannelProperties,
          WebChatSite
      )
      
      channel = client.channels.create(
          resource_group_name=resource_group,
          resource_name=bot_name,
          channel_name="WebChatChannel",
          parameters=BotChannel(
              location="global",
              properties=WebChatChannel(
                  properties=WebChatChannelProperties(
                      sites=[
                          WebChatSite(
                              site_name="Default Site",
                              is_enabled=True
                          )
                      ]
                  )
              )
          )
      )
      ```
      
      ## Get Channel Details
      
      ```python
      channel = client.channels.get(
          resource_group_name=resource_group,
          resource_name=bot_name,
          channel_name="DirectLineChannel"
      )
      ```
      
      ## List Channel Keys
      
      ```python
      keys = client.channels.list_with_keys(
          resource_group_name=resource_group,
          resource_name=bot_name,
          channel_name="DirectLineChannel"
      )
      
      # Access Direct Line keys
      if hasattr(keys.properties, 'properties'):
          for site in keys.properties.properties.sites:
              print(f"Site: {site.site_name}")
              # Use site.key without logging or persisting it.
      ```
      
      ## Bot Connections (OAuth)
      
      ### Create Connection Setting
      
      ```python
      import os
      from azure.mgmt.botservice.models import (
          ConnectionSetting,
          ConnectionSettingProperties
      )
      
      connection = client.bot_connection.create(
          resource_group_name=resource_group,
          resource_name=bot_name,
          connection_name="graph-connection",
          parameters=ConnectionSetting(
              location="global",
              properties=ConnectionSettingProperties(
                  client_id="<oauth-client-id>",
                  client_secret=os.environ["OAUTH_CLIENT_SECRET"],
                  scopes="User.Read",
                  service_provider_id="<service-provider-id>"
              )
          )
      )
      ```
      
      ### List Connections
      
      ```python
      connections = client.bot_connection.list_by_bot_service(
          resource_group_name=resource_group,
          resource_name=bot_name
      )
      
      for conn in connections:
          print(f"Connection: {conn.name}")
      ```
      
      ## Client Operations
      
      | Operation | Method |
      |-----------|--------|
      | `client.bots` | Bot CRUD operations |
      | `client.channels` | Channel configuration |
      | `client.bot_connection` | OAuth connection settings |
      | `client.direct_line` | Direct Line channel operations |
      | `client.email` | Email channel operations |
      | `client.operations` | Available operations |
      | `client.host_settings` | Host settings operations |
      
      ## SKU Options
      
      | SKU | Description |
      |-----|-------------|
      | `F0` | Free tier (limited messages) |
      | `S1` | Standard tier (unlimited messages) |
      
      ## Channel Types
      
      | Channel | Class | Purpose |
      |---------|-------|---------|
      | `MsTeamsChannel` | Microsoft Teams | Teams integration |
      | `DirectLineChannel` | Direct Line | Custom client integration |
      | `WebChatChannel` | Web Chat | Embeddable web widget |
      | `SlackChannel` | Slack | Slack workspace integration |
      | `FacebookChannel` | Facebook | Messenger integration |
      | `EmailChannel` | Email | Email communication |
      
  • SKILL.md 10 KB
    ---
    name: azure-mgmt-botservice-py
    description: |-
      Azure Bot Service Management SDK for Python. Use for creating, managing, and configuring Azure Bot Service resources.
      Triggers: "azure-mgmt-botservice", "AzureBotService", "bot management", "conversational AI", "bot channels".
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
    ---
    
    # Azure Bot Service Management SDK for Python
    
    Manage Azure Bot Service resources including bots, channels, and connections.
    
    ## Installation
    
    ```bash
    pip install azure-mgmt-botservice
    pip install azure-identity
    ```
    
    ## Environment Variables
    
    ```bash
    AZURE_SUBSCRIPTION_ID=<your-subscription-id>  # Required for all auth methods
    AZURE_RESOURCE_GROUP=<your-resource-group>  # Required for all auth methods
    AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
    ```
    
    ## Authentication & Lifecycle
    
    > **🔑 Two rules apply to every code sample below:**
    >
    > 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
    >    - Local dev: `DefaultAzureCredential` works as-is.
    >    - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
    > 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
    >    - Sync: `with <Client>(...) as client:`
    >    - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
    >
    > Snippets may abbreviate this setup, but production code should always follow both rules.
    
    ```python
    from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
    from azure.mgmt.botservice import AzureBotService
    import os
    
    # Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
    credential = DefaultAzureCredential(require_envvar=True)
    # Or use a specific credential directly in production:
    # See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
    # credential = ManagedIdentityCredential()
    
    with AzureBotService(
        credential=credential,
        subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
    ) as client:
        # Use `client` for all subsequent operations (see examples below)
        ...
    ```
    
    ## Create a Bot
    
    ```python
    from azure.mgmt.botservice import AzureBotService
    from azure.mgmt.botservice.models import Bot, BotProperties, Sku
    from azure.identity import DefaultAzureCredential
    import os
    
    resource_group = os.environ["AZURE_RESOURCE_GROUP"]
    bot_name = "my-chat-bot"
    
    credential = DefaultAzureCredential()
    with AzureBotService(
        credential=credential,
        subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
    ) as client:
        bot = client.bots.create(
            resource_group_name=resource_group,
            resource_name=bot_name,
            parameters=Bot(
                location="global",
                sku=Sku(name="F0"),  # Free tier
                kind="azurebot",
                properties=BotProperties(
                    display_name="My Chat Bot",
                    description="A conversational AI bot",
                    endpoint="https://my-bot-app.azurewebsites.net/api/messages",
                    msa_app_id="<your-app-id>",
                    msa_app_type="MultiTenant"
                )
            )
        )
    
    print(f"Bot created: {bot.name}")
    ```
    
    ## Get Bot Details
    
    ```python
    bot = client.bots.get(
        resource_group_name=resource_group,
        resource_name=bot_name
    )
    
    print(f"Bot: {bot.properties.display_name}")
    print(f"Endpoint: {bot.properties.endpoint}")
    print(f"SKU: {bot.sku.name}")
    ```
    
    ## List Bots in Resource Group
    
    ```python
    bots = client.bots.list_by_resource_group(resource_group_name=resource_group)
    
    for bot in bots:
        print(f"Bot: {bot.name} - {bot.properties.display_name}")
    ```
    
    ## List All Bots in Subscription
    
    ```python
    all_bots = client.bots.list()
    
    for bot in all_bots:
        print(f"Bot: {bot.name} in {bot.id.split('/')[4]}")
    ```
    
    ## Update Bot
    
    ```python
    bot = client.bots.update(
        resource_group_name=resource_group,
        resource_name=bot_name,
        properties=BotProperties(
            display_name="Updated Bot Name",
            description="Updated description"
        )
    )
    ```
    
    ## Delete Bot
    
    ```python
    client.bots.delete(
        resource_group_name=resource_group,
        resource_name=bot_name
    )
    ```
    
    ## Configure Channels
    
    ### Add Teams Channel
    
    ```python
    from azure.mgmt.botservice.models import (
        BotChannel,
        MsTeamsChannel,
        MsTeamsChannelProperties
    )
    
    channel = client.channels.create(
        resource_group_name=resource_group,
        resource_name=bot_name,
        channel_name="MsTeamsChannel",
        parameters=BotChannel(
            location="global",
            properties=MsTeamsChannel(
                properties=MsTeamsChannelProperties(
                    is_enabled=True
                )
            )
        )
    )
    ```
    
    ### Add Direct Line Channel
    
    ```python
    from azure.mgmt.botservice.models import (
        BotChannel,
        DirectLineChannel,
        DirectLineChannelProperties,
        DirectLineSite
    )
    
    channel = client.channels.create(
        resource_group_name=resource_group,
        resource_name=bot_name,
        channel_name="DirectLineChannel",
        parameters=BotChannel(
            location="global",
            properties=DirectLineChannel(
                properties=DirectLineChannelProperties(
                    sites=[
                        DirectLineSite(
                            site_name="Default Site",
                            is_enabled=True,
                            is_v1_enabled=False,
                            is_v3_enabled=True
                        )
                    ]
                )
            )
        )
    )
    ```
    
    ### Add Web Chat Channel
    
    ```python
    from azure.mgmt.botservice.models import (
        BotChannel,
        WebChatChannel,
        WebChatChannelProperties,
        WebChatSite
    )
    
    channel = client.channels.create(
        resource_group_name=resource_group,
        resource_name=bot_name,
        channel_name="WebChatChannel",
        parameters=BotChannel(
            location="global",
            properties=WebChatChannel(
                properties=WebChatChannelProperties(
                    sites=[
                        WebChatSite(
                            site_name="Default Site",
                            is_enabled=True
                        )
                    ]
                )
            )
        )
    )
    ```
    
    ## Get Channel Details
    
    ```python
    channel = client.channels.get(
        resource_group_name=resource_group,
        resource_name=bot_name,
        channel_name="DirectLineChannel"
    )
    ```
    
    ## List Channel Keys
    
    ```python
    keys = client.channels.list_with_keys(
        resource_group_name=resource_group,
        resource_name=bot_name,
        channel_name="DirectLineChannel"
    )
    
    # Access Direct Line keys
    if hasattr(keys.properties, 'properties'):
        for site in keys.properties.properties.sites:
            print(f"Site: {site.site_name}")
            print(f"Key: {site.key}")
    ```
    
    ## Bot Connections (OAuth)
    
    ### Create Connection Setting
    
    ```python
    from azure.mgmt.botservice.models import (
        ConnectionSetting,
        ConnectionSettingProperties
    )
    
    connection = client.bot_connection.create(
        resource_group_name=resource_group,
        resource_name=bot_name,
        connection_name="graph-connection",
        parameters=ConnectionSetting(
            location="global",
            properties=ConnectionSettingProperties(
                client_id="<oauth-client-id>",
                client_secret="<oauth-client-secret>",
                scopes="User.Read",
                service_provider_id="<service-provider-id>"
            )
        )
    )
    ```
    
    ### List Connections
    
    ```python
    connections = client.bot_connection.list_by_bot_service(
        resource_group_name=resource_group,
        resource_name=bot_name
    )
    
    for conn in connections:
        print(f"Connection: {conn.name}")
    ```
    
    ## Client Operations
    
    | Operation | Method |
    |-----------|--------|
    | `client.bots` | Bot CRUD operations |
    | `client.channels` | Channel configuration |
    | `client.bot_connection` | OAuth connection settings |
    | `client.direct_line` | Direct Line channel operations |
    | `client.email` | Email channel operations |
    | `client.operations` | Available operations |
    | `client.host_settings` | Host settings operations |
    
    ## SKU Options
    
    | SKU | Description |
    |-----|-------------|
    | `F0` | Free tier (limited messages) |
    | `S1` | Standard tier (unlimited messages) |
    
    ## Channel Types
    
    | Channel | Class | Purpose |
    |---------|-------|---------|
    | `MsTeamsChannel` | Microsoft Teams | Teams integration |
    | `DirectLineChannel` | Direct Line | Custom client integration |
    | `WebChatChannel` | Web Chat | Embeddable web widget |
    | `SlackChannel` | Slack | Slack workspace integration |
    | `FacebookChannel` | Facebook | Messenger integration |
    | `EmailChannel` | Email | Email communication |
    
    ## Best Practices
    
    1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
    2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
    3. **Use `DefaultAzureCredential`** for code that runs locally. Use a specific token credential for code that runs in Azure.
    4. **Start with F0 SKU** for development, upgrade to S1 for production
    5. **Store MSA App ID/Secret securely** — use Key Vault
    6. **Enable only needed channels** — reduces attack surface
    7. **Rotate Direct Line keys** periodically
    8. **Use managed identity** when possible for bot connections
    9. **Configure proper CORS** for Web Chat channel
    
    ## Reference Files
    
    | File | Contents |
    |------|----------|
    | [references/capabilities.md](references/capabilities.md) | Additional non-hero capabilities, operation-group coverage, and production checklists. |
    | [references/non-hero-scenarios.md](references/non-hero-scenarios.md) | Dedicated non-hero examples for secondary/advanced scenarios. |
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related