Microsoft Teams Apps Framework
July 14, 2026 ยท View on GitHub
High-level framework for building Microsoft Teams applications. Handles activity routing, authentication, and provides Microsoft Graph integration.
Features
- Activity Routing: Decorator-based routing for different activity types
- OAuth Integration: Built-in OAuth flow handling for user authentication
- Microsoft Graph Integration: Type-safe Graph client access via
user_graphandapp_graphproperties - Plugin System: Extensible plugin architecture for adding functionality
Basic Usage
from microsoft_teams.apps import App, ActivityContext
from microsoft_teams.api import MessageActivity
app = App()
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
await ctx.send(f"You said: {ctx.activity.text}")
# Start the app
await app.start()
Unauthenticated Requests
For local development only, JWT validation can be disabled explicitly:
app = App(dangerously_allow_unauthenticated_requests=True)
It can also be enabled with the DANGEROUSLY_ALLOW_UNAUTHENTICATED_REQUESTS=true environment variable.
The previous skip_auth option is deprecated and remains supported for compatibility.
OAuth and Graph Integration
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
if ctx.is_signed_in:
try:
# Access user's Graph data
me = await ctx.user_graph.me.get()
await ctx.send(f"Hello {me.display_name}!")
except (ValueError, RuntimeError, ImportError) as e:
await ctx.send(f"Graph access failed: {e}")
else:
# Prompt user to sign in
await ctx.sign_in()
Optional Graph Dependencies
Microsoft Graph functionality requires additional dependencies:
pip install microsoft-teams-apps[graph]
Or if using uv:
uv add microsoft-teams-apps[graph]
If Graph dependencies are not installed, user_graph and app_graph will raise an ImportError when accessed. If the user is not signed in or tokens are unavailable, they will raise ValueError.