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> AZURE_RESOURCE_GROUP=<your-resource-group>
Authentication
from azure.identity import DefaultAzureCredential from azure.mgmt.botservice import AzureBotService import os
credential = DefaultAzureCredential() client = AzureBotService( credential=credential, subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"] )
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
credential = DefaultAzureCredential() client = AzureBotService( credential=credential, subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"] )
resource_group = os.environ["AZURE_RESOURCE_GROUP"] bot_name = "my-chat-bot"
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
-
Use DefaultAzureCredential for authentication
-
Start with F0 SKU for development, upgrade to S1 for production
-
Store MSA App ID/Secret securely — use Key Vault
-
Enable only needed channels — reduces attack surface
-
Rotate Direct Line keys periodically
-
Use managed identity when possible for bot connections
-
Configure proper CORS for Web Chat channel