Teams App Developer
MicrosoftOfficialPublished by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The teams-app-developer skill provides a structured framework for managing the lifecycle of Microsoft 365 agents and Teams applications. It leverages the ATK CLI to handle project scaffolding, local testing via the Agents Playground, cloud provisioning on Azure, and troubleshooting. The skill includes specialized guidance for migrating Slack bots to Teams, including converting Block Kit UI to Adaptive Cards, and provides access to an extensive library of micro-expert documentation for cross-platform development.
What it does
- Scaffolds new Microsoft 365 agents and Teams applications from templates.
- Facilitates local testing using the Agents Playground or Teams-specific environments.
- Automates Azure resource provisioning and cloud deployment workflows.
- Provides diagnostic procedures for common authentication and configuration errors.
- Supports migration of Slack bots to the Teams platform.
- Manages project configuration and environment variables for ATK-based projects.
When to use it
- When starting a new Teams app, bot, or Declarative Agent project.
- When you need to test an agent locally before deploying to the cloud.
- When migrating existing Slack bots to the Microsoft Teams ecosystem.
- When troubleshooting deployment or authentication issues in a Teams project.
- When you need to provision Azure infrastructure for a Teams application.
Advantages
- Streamlines the development lifecycle with standardized CLI commands.
- Reduces development time by offering a local testing playground.
- Provides expert-level guidance for complex cross-platform migrations.
- Ensures consistent configuration management across development environments.
- Includes robust error-handling protocols for common platform-specific pitfalls.
Usage examples
- “Create a new Teams bot project using the default template.”
- The agent will initialize a new project folder, configure the necessary YAML files, and guide you through the initial setup using the ATK CLI.
- “How do I migrate my Slack bot to Microsoft Teams?”
- The agent will initiate the slack-to-teams workflow, providing access to cross-platform bridging experts and guidance on converting UI components.
- “My Teams bot is returning a 401 error, how do I fix it?”
- The agent will trigger the troubleshooting workflow, checking your environment variables, tunnel status, and authentication configuration.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/teams-app-developer/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip teams-app-developer.zip -d .agents/skills
Documentation by Microsoft
Microsoft 365 Agents Toolkit Skill
Build Microsoft 365 agents and Teams apps using the ATK CLI.
AI Behavior Guidelines
Testing Strategy: Recommend Agents Playground first (faster, no M365 needed). Use Teams workflow only if user explicitly requests it.
Environment Variables: NEVER hardcode secrets or make up placeholder values. Always ask users for real values.
Error Handling: Read error messages carefully. Check
env/.env.local,.localConfigs, andatk auth list. Common pitfalls:AADSTS7000229→aadApp/createmissinggenerateServicePrincipal: truein YAML — add it and re-provisionMissing
TENANT_IDin.localConfigs→ SDK uses wrong token authority → 401 from Bot Connector401 persists after auth fix → devtunnel URL may be blacklisted — create a fresh tunnel
See troubleshoot/troubleshoot.md for full diagnostic steps
Long-Running Commands — WAIT for completion:
atk new,atk provision,atk deploycan take several minutesAlways wait for completion before running the next step (timeout 120000ms+)
Local Service Startup — Hangs terminal (expected):
npm run dev,npm start,python app.py,devtunnel host, etc. will hang — the process keeps running indefinitelyALWAYS run as a background process (
isBackground=true) — NEVER useisBackground=falsefor these commandsDo NOT wait for it to "finish" — verify startup by checking output for "listening on port" or tunnel URL
If errors appear, read logs, diagnose, fix, restart
Use a NEW terminal to launch Agents Playground or open Teams sideloading URL
Monitor App Logs: Periodically check background terminal output for runtime errors. If the app crashes, read the error, fix the root cause, and restart.
Telemetry Tagging: Before running any
atkCLI commands, set the session environment variable so all CLI invocations are tagged as skill-initiated:export ATK_CLI_SKILL=trueRun this once at the start of the session. All subsequent
atkcommands in the same terminal will inherit it.
ATK CLI Setup
atk --version # Must be > 1.1.5-betaIf ATK is not found or version is too old:
npm i -g @microsoft/m365agentstoolkit-cli@betaCLI Global Options
| Option | Meaning | Recommendation |
|---|---|---|
-i | Interactive mode | Always use -i false in automation to avoid hanging |
-f | Project folder | Default to be current directory, used when specifying a custom folder. When scaffolding a new project, this is the parent folder where the project folder will be created under. |
-h | Command help | Use atk <command> -h for quick syntax checks |
Sub-Skills
| Sub-Skill | When to Use | Reference |
|---|---|---|
| create-project | Scaffold new project from template, choose template, atk new | create-project/create-project.md |
| test-playground | Test locally with Agents Playground, agentsplayground, quick testing | test-playground/test-playground.md |
| test-teams | Run on Teams, devtunnel, sideload, Teams testing, test in Copilot | test-teams/test-teams.md |
| provision-deploy | Provision Azure resources, deploy to cloud, atk provision, atk deploy | provision-deploy/provision-deploy.md |
| troubleshoot | Fix errors, 401, port conflicts, YAML errors, stale bots | troubleshoot/troubleshoot.md |
| slack-to-teams | Migrate Slack bot to Teams, cross-platform bridging, Block Kit to Adaptive Cards | slack-to-teams/SKILL.md |
MANDATORY: Before executing any workflow, read the corresponding sub-skill document.
Shared References
manifest-and-yaml.md — Project files, YAML config, env vars, .localConfigs flow
commands.md — ATK CLI commands: package, validate, share, collaborate
templates.md — Complete template catalog with language support
experts/ — 100+ micro-expert files: Teams SDK, Slack SDK, cross-platform bridging, deploy, AI models, security, language conversion
docs/ — Platform comparison guides: UI, messaging, identity, infrastructure, feature gaps
Workflow Chains
Match user intent to the smallest valid workflow.
| User Intent | Workflow (read in order) |
|---|---|
| Build new app from scratch | create-project → test-playground |
| Test existing project locally | test-playground (recommended) or test-teams |
| Deploy to Azure | provision-deploy |
| Fix broken bot | troubleshoot → re-test |
| Migrate Slack bot to Teams | slack-to-teams |
MANDATORY: Before executing any slack-to-teams workflow, read slack-to-teams/SKILL.md first. The sub-skill contains a routed expert system with 100+ micro-expert files for cross-platform bot development.
ATK Project Context Resolution
Resolve config values only when missing. If a value is already known in the session, reuse it.
Step 1: Detect ATK Project
If m365agentstoolkit*.yml exists in the current folder, treat it as an ATK project and parse configuration.
Step 2: Resolve Common Configuration
Resolve variables referenced in m365agentstoolkit*.yml. Common variables:
AZURE_OPENAI_API_KEY
AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_DEPLOYMENT_NAME
Step 3: Collect Missing Values
If required values are missing, ask the user for only the missing ones.
Refer to manifest-and-yaml.md for full config-file details.
Files
- ATTRIBUTION.mdAdded by AutoGineer906 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md7.6 KiB
- create-project/create-project.md8.1 KiB
- docs/README.md2.8 KiB
- docs/advanced-features.md7.0 KiB
- docs/feature-gaps.md46.3 KiB
- docs/files-and-links.md4.2 KiB
- docs/identity-and-auth.md4.3 KiB
- docs/infrastructure.md6.7 KiB
- docs/interactive-responses.md4.4 KiB
- docs/messaging-and-commands.md4.5 KiB
- docs/middleware-and-handlers.md4.4 KiB
- docs/ui-components.md6.9 KiB
- docs/workflows.md14.4 KiB
- experts/README.md8.6 KiB
- experts/_expert-ts.md2.2 KiB
- experts/analyzer.md14.0 KiB
- experts/bridge/app-distribution-packaging-ts.md14.2 KiB
- experts/bridge/channel-ops-graph-ts.md15.4 KiB
- experts/bridge/commands-slash-text-ts.md18.5 KiB
- experts/bridge/cross-platform-advisor-ts.md36.4 KiB
- experts/bridge/cross-platform-architecture-ts.md8.3 KiB
- experts/bridge/events-activities-ts.md22.4 KiB
- experts/bridge/files-upload-download-ts.md17.2 KiB
- experts/bridge/identity-oauth-bridge-ts.md19.8 KiB
- experts/bridge/index.md13.0 KiB
- experts/bridge/infra-compute-ts.md14.6 KiB
- experts/bridge/infra-observability-ts.md14.0 KiB
- experts/bridge/infra-secrets-config-ts.md13.2 KiB
- experts/bridge/infra-storage-ts.md14.3 KiB
- experts/bridge/interactive-responses-ts.md19.6 KiB
- experts/bridge/link-unfurl-preview-ts.md17.1 KiB
- experts/bridge/middleware-handlers-ts.md15.4 KiB
- experts/bridge/python-cross-platform.md9.3 KiB
- experts/bridge/rate-limiting-resilience-ts.md17.6 KiB
- experts/bridge/rest-only-integration-ts.md8.4 KiB
- experts/bridge/scheduling-deferred-send-ts.md17.8 KiB
- experts/bridge/shortcuts-extensions-ts.md17.5 KiB
- experts/bridge/transport-socketmode-https-ts.md14.3 KiB
- experts/bridge/ui-app-home-personal-tab-ts.md14.5 KiB
- experts/bridge/ui-block-kit-adaptive-cards-ts.md21.5 KiB
- experts/bridge/ui-legacy-attachments-cards-ts.md11.2 KiB
- experts/bridge/ui-modals-dialogs-ts.md21.4 KiB
- experts/bridge/workflow.composable-platform-ts.md13.7 KiB
- experts/bridge/workflows-automation-ts.md14.3 KiB
- experts/builder.md11.1 KiB
- experts/convert/bulk-conversion-strategy-ts.md12.8 KiB
- experts/convert/dependency-mapping-ts.md8.3 KiB
- experts/convert/index.md3.5 KiB
- experts/convert/java-to-ts-ts.md20.6 KiB
- experts/convert/js-to-ts-ts.md6.2 KiB
- experts/convert/json-serialization-ts.md11.0 KiB
- experts/convert/kotlin-to-ts-ts.md11.2 KiB
- experts/convert/ruby-to-ts-ts.md9.7 KiB
- experts/convert/type-mapping-ts.md10.1 KiB
- experts/deploy/aws-bot-deploy-ts.md14.6 KiB
- experts/deploy/aws-cli-reference-ts.md52.4 KiB
- experts/deploy/azure-bot-deploy-ts.md15.4 KiB
- experts/deploy/azure-cli-reference-ts.md16.9 KiB
- experts/deploy/index.md4.6 KiB
- experts/fallback.md2.1 KiB
- experts/index.md18.9 KiB
- experts/models/anthropic-ts.md7.8 KiB
- experts/models/bedrock-ts.md9.9 KiB
- experts/models/foundry-cloud-ts.md8.1 KiB
- experts/models/foundry-local-ts.md10.6 KiB
- experts/models/index.md5.8 KiB
- experts/models/openai-azure-openai-ts.md8.3 KiB
- experts/models/oss-openai-compatible-ts.md10.7 KiB
- experts/models/transformers-js-ts.md11.6 KiB
- experts/prompt-engineer.md14.7 KiB
- experts/researcher.md2.8 KiB
- experts/security/index.md1.2 KiB
- experts/security/input-validation-ts.md13.8 KiB
- experts/security/secrets-ts.md13.9 KiB
- experts/slack/bolt-assistant-ts.md9.9 KiB
- experts/slack/bolt-events-ts.md9.3 KiB
- experts/slack/bolt-java.md8.9 KiB
- experts/slack/bolt-oauth-distribution-ts.md10.9 KiB
- experts/slack/bolt-python.md9.5 KiB
- experts/slack/cli.app-management.md7.9 KiB
- experts/slack/cli.datastore-env.md8.6 KiB
- experts/slack/cli.getting-started.md8.0 KiB
- experts/slack/cli.local-dev-deploy.md8.4 KiB
- experts/slack/cli.manifest-triggers.md9.9 KiB
- experts/slack/index.md8.9 KiB
- experts/slack/runtime.ack-rules-ts.md9.8 KiB
- experts/slack/runtime.bolt-foundations-ts.md10.7 KiB
- experts/slack/runtime.shortcuts-ts.md11.0 KiB
- experts/slack/runtime.slash-commands-ts.md11.6 KiB
- experts/slack/runtime.socket-mode-ts.md9.5 KiB
- experts/slack/ui.block-kit-ts.md11.5 KiB
- experts/slack/ui.modals-lifecycle-ts.md13.3 KiB
- experts/slack/web-api-proactive-ts.md11.0 KiB
- experts/slack/workflow.slack-automations-ts.md10.2 KiB
- experts/teams/a2a.client-basics-ts.md9.7 KiB
- experts/teams/a2a.orchestrator-patterns-ts.md12.7 KiB
- experts/teams/a2a.server-basics-ts.md11.4 KiB
- experts/teams/ai.chatprompt-basics-ts.md8.1 KiB
- experts/teams/ai.citations-feedback-ts.md6.9 KiB
- experts/teams/ai.conversational-query-ts.md14.2 KiB
- experts/teams/ai.function-calling-design-ts.md9.0 KiB
- experts/teams/ai.function-calling-implementation-ts.md7.7 KiB
- experts/teams/ai.memory-localmemory-ts.md7.3 KiB
- experts/teams/ai.model-setup-ts.md6.6 KiB
- experts/teams/ai.rag-retrieval-ts.md7.4 KiB
- experts/teams/ai.rag-vectorstores-ts.md8.5 KiB
- experts/teams/ai.streaming-ts.md6.9 KiB
- experts/teams/auth.oauth-sso-ts.md10.1 KiB
- experts/teams/compat.botbuilder-interop-ts.md14.6 KiB
- experts/teams/dev.debug-test-ts.md14.1 KiB
- experts/teams/graph.usergraph-appgraph-ts.md9.0 KiB
- experts/teams/index.md9.8 KiB
- experts/teams/mcp.client-basics-ts.md9.5 KiB
- experts/teams/mcp.expose-chatprompt-tools-ts.md9.5 KiB
- experts/teams/mcp.security-ts.md10.4 KiB
- experts/teams/mcp.server-basics-ts.md9.9 KiB
- experts/teams/project.scaffold-files-ts.md12.2 KiB
- experts/teams/runtime.app-init-ts.md10.9 KiB
- experts/teams/runtime.manifest-ts.md12.3 KiB
- experts/teams/runtime.proactive-messaging-ts.md12.6 KiB
- experts/teams/runtime.routing-handlers-ts.md12.3 KiB
- experts/teams/state.storage-patterns-ts.md9.4 KiB
- experts/teams/teams-dotnet.md8.2 KiB
- experts/teams/teams-python.md8.3 KiB
- experts/teams/ui.adaptive-cards-ts.md12.9 KiB
- experts/teams/ui.dialogs-task-modules-ts.md15.1 KiB
- experts/teams/ui.message-extensions-ts.md15.6 KiB
- experts/teams/workflow.approvals-inline-ts.md12.4 KiB
- experts/teams/workflow.message-native-records-ts.md10.6 KiB
- experts/teams/workflow.sharepoint-lists-ts.md9.0 KiB
- experts/teams/workflow.state-driven-events-ts.md12.2 KiB
- experts/teams/workflow.triggers-compose-ts.md10.3 KiB
- experts/update-experts.md10.0 KiB
- provision-deploy/provision-deploy.md4.3 KiB
- test-playground/playground-cli.md4.6 KiB
- test-playground/playground.md4.5 KiB
- test-playground/test-playground.md1.1 KiB
- test-teams/test-teams.md4.9 KiB
- toolkit/README.md4.2 KiB
- toolkit/commands.md2.6 KiB
- toolkit/environments.md12.6 KiB
- toolkit/lifecycle-cli.md17.6 KiB
- toolkit/manifest-and-yaml.md6.0 KiB
- toolkit/playground.md7.6 KiB
- toolkit/publish.md9.3 KiB
- toolkit/templates.md6.7 KiB
- troubleshoot/troubleshoot.md20.2 KiB
toolkit/lifecycle-cli.md
Lifecycle and atk CLI
purpose
M365 Agents Toolkit lifecycle configuration (m365agents.yml) and full atk CLI command reference for provisioning, deploying, and managing M365 agents (declarative agents, custom engine agents, Teams bots/tabs/message extensions, Copilot connectors, Office add-ins).
rules
m365agents.yml is the lifecycle manifest. Every Agents Toolkit project has an
m365agents.ymlat the project root for dev/cloud deployment, and typically anm365agents.local.ymlfor local development. They define theprovision,deploy, andpublishlifecycle stages — each stage is an ordered list of actions.atk provision --env localrunsm365agents.local.yml;atk provision --env devrunsm365agents.yml.Lifecycle stages run in order: provision → deploy → publish. Provision creates cloud resources (Azure Bot, App Registration, resource groups). Deploy pushes app code to compute targets. Publish submits the app package to the Teams catalog.
All actions use
uses:— there is noruns:syntax. Built-in actions likearm/deployorteamsApp/createare referenced withuses: <action-name>. Custom shell commands use the built-inscriptaction:uses: scriptwithwith.run: <command>. Every action accepts awith:block for parameters.Built-in actions cover the full lifecycle. Key actions:
aadApp/create,aadApp/update,botAadApp/create,botFramework/create,arm/deploy,azureAppService/zipDeploy,azureFunctions/zipDeploy,teamsApp/create,teamsApp/update,teamsApp/validateManifest,teamsApp/zipAppPackage,file/createOrUpdateEnvironmentFile. TheaadApp/createaction must includegenerateServicePrincipal: true— without it, the service principal is not created and the bot getsAADSTS7000229.Use
m365agents.ymlto replace manual Azure portal setup. A singleprovisionstage automates what otherwise requires 10+ manualazCLI commands or Azure Portal steps: Entra ID App Registration (aadApp/create), bot identity and password (botAadApp/create), Bot Service with Teams channel (botFramework/create), ARM/Bicep resource deployment (arm/deploy), and Teams app registration (teamsApp/create). Each action writes its outputs (IDs, secrets) to env files automatically. For the full manual walkthrough these actions replace, see../experts/deploy/azure-bot-deploy-ts.mdrules 3–12.environmentFolderPathinm365agents.ymlpoints to theenv/directory. Defaults to./env. All${{VAR}}placeholders resolve from the active environment's.env.{name}files.atk newscaffolds a project. Creates project structure withm365agents.yml,m365agents.local.yml,env/folder,appPackage/, and starter code. Supports--capabilityfor predefined templates and-i falsefor non-interactive mode. ATK CLI version must be > 1.1.5-beta — install withnpm i -g @microsoft/m365agentstoolkit-cli@beta.atk provisioncreates cloud resources. Runs theprovisionstage in the environment-specific YAML. Accepts--env <name>to target a specific environment (default:dev). Always add-i falsefor non-interactive execution. Creates resources defined by ARM templates or built-in actions.atk deploypushes code to cloud or generates local config. Runs thedeploystage. For cloud (--env dev), builds the project and deploys to Azure. For local (--env local), writes runtime credentials to.localConfigsviafile/createOrUpdateEnvironmentFile. Always runatk provisionbefore first deploy.atk publishsubmits to the org catalog. Runs thepublishstage. Packages the app and submits it to the Teams Admin Center for org-wide distribution. Requires admin approval after submission.atk validatechecks the manifest. Validatesmanifest.jsonagainst the Teams schema before packaging. Catches missing fields, invalid scopes, and schema violations early.atk packagecreates the app zip bundle. Generates the.zipcontainingmanifest.json, icons, and resolved placeholders. Useatk package --env <name> -i false. This is the artifact uploaded to Teams or Partner Center.atk previewlaunches local testing. Starts the Agents Playground for local testing without deploying to Teams. Seeplayground.mdfor the recommendedagentsplaygroundCLI alternative that requires no provisioning.CI/CD integration uses
atkCLI with--envand-i falseflags. GitHub Actions and Azure Pipelines callatk provision --env staging -i falseandatk deploy --env staging -i falsein sequence. Store credentials in CI secrets, not in.env.*.userfiles.
patterns
Pattern 1: m365agents.yml anatomy (cloud deployment)
# m365agents.yml — lifecycle configuration for dev/cloud
version: v1.11
environmentFolderPath: ./env
provision:
- uses: teamsApp/create
with:
name: ${{TEAMS_APP_NAME}}
writeToEnvironmentFile:
teamsAppId: TEAMS_APP_ID
- uses: botAadApp/create
with:
name: ${{BOT_DISPLAY_NAME}}
writeToEnvironmentFile:
botId: BOT_ID
botPassword: SECRET_BOT_PASSWORD
- uses: arm/deploy
with:
subscriptionId: ${{AZURE_SUBSCRIPTION_ID}}
resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}}
templates:
- path: ./infra/azure.bicep
parameters: ./infra/azure.parameters.json
deploymentName: teams-bot
writeToEnvironmentFile:
botEndpoint: BOT_ENDPOINT
- uses: teamsApp/zipAppPackage
with:
manifestPath: ./appPackage/manifest.json
outputZipPath: ./appPackage/build/appPackage.${{APP_ENV}}.zip
outputFolder: ./appPackage/build
- uses: teamsApp/update
with:
appPackagePath: ./appPackage/build/appPackage.${{APP_ENV}}.zip
deploy:
- uses: cli/runNpmCommand
with:
args: install
- uses: azureAppService/zipDeploy
with:
artifactFolder: .
resourceId: ${{AZURE_APP_SERVICE_RESOURCE_ID}}Pattern 1b: m365agents.local.yml anatomy (local development)
# m365agents.local.yml — lifecycle configuration for local
version: v1.11
provision:
- uses: teamsApp/create
with:
name: ${{TEAMS_APP_NAME}}-local-debug
writeToEnvironmentFile:
teamsAppId: TEAMS_APP_ID
- uses: aadApp/create
with:
name: ${{CONFIG__MANIFEST__NAME}}-aad
generateClientSecret: true
generateServicePrincipal: true # REQUIRED — without this, AADSTS7000229
signInAudience: AzureADMultipleOrgs
writeToEnvironmentFile:
clientId: BOT_ID
clientSecret: SECRET_BOT_PASSWORD
objectId: BOT_OBJECT_ID
tenantId: TEAMS_APP_TENANT_ID
- uses: botFramework/create
with:
botId: ${{BOT_ID}}
name: ${{CONFIG__MANIFEST__NAME}}
messagingEndpoint: ${{BOT_ENDPOINT}}/api/messages
description: "" # Optional — driver defaults to ""; templates set it explicitly for clarity
channels:
- name: msteams
deploy:
- uses: file/createOrUpdateEnvironmentFile
with:
target: ./.localConfigs
envs:
PORT: 3978
CLIENT_ID: ${{BOT_ID}}
CLIENT_SECRET: ${{SECRET_BOT_PASSWORD}}
TENANT_ID: ${{TEAMS_APP_TENANT_ID}}Critical:
.localConfigsis what your app reads at runtime, NOTenv/.env.local. Thefile/createOrUpdateEnvironmentFileaction transforms env vars fromenv/.env.localinto.localConfigs. In the example above,.localConfigsTENANT_IDcomes fromTEAMS_APP_TENANT_IDinenv/.env.local. IfTENANT_IDis missing from.localConfigsafter deploy, copy the value fromTEAMS_APP_TENANT_IDinenv/.env.local.
Pattern 2: Manual steps replaced by m365agents.yml
Each provision action in m365agents.yml replaces one or more manual Azure CLI / Portal steps. This table maps them:
m365agents.yml action | Manual equivalent it replaces | What gets auto-created |
|---|---|---|
aadApp/create | Azure Portal → App Registrations → New registration, or az ad app create + az ad app credential reset | Entra ID App with client ID + secret, written to env |
botAadApp/create | az ad app create (separate bot identity) + az ad app credential reset | Bot-specific App ID + password, written to env |
botFramework/create | az bot create --app-type SingleTenant + az bot msteams create | Azure Bot Service resource with Teams channel connected |
arm/deploy | az group create + az webapp create + az webapp config appsettings set (or equivalent for Functions/Container Apps) | All Bicep/ARM resources (App Service, plan, settings) |
teamsApp/create | Teams client → Apps → Upload a custom app, or Teams Admin Center upload | Teams app registration with TEAMS_APP_ID |
azureAppService/zipDeploy | az webapp deploy --src-path <zip> | Code deployed to App Service |
teamsApp/zipAppPackage | Manually zip manifest.json + icons with resolved placeholders | App package .zip ready for sideload or publishing |
Bottom line:
atk provision+atk deployreplaces steps 3–12 in../experts/deploy/azure-bot-deploy-ts.md. Two commands instead of ten.
Pattern 2b: Custom shell commands via uses: script
There is no runs: step in m365agents.yml. To run an arbitrary shell command, use the built-in script action:
# Set environment variables for local launch (from templates/configs/local/typescript/m365agents.local.yml.tpl)
- uses: script
with:
run:
echo "::set-teamsfx-env BOT_DOMAIN=localhost";
echo "::set-teamsfx-env BOT_ENDPOINT=https://localhost:3978";
# Run a build step in a subdirectory
- uses: script
with:
run: npm run build
workingDirectory: ./srcThe script driver also supports shell: (e.g., bash, pwsh) and redirectTo: for capturing output.
Pattern 3: CLI command reference
# Check CLI version (must be > 1.1.5-beta)
atk --version
# Install / update CLI
npm i -g @microsoft/m365agentstoolkit-cli@beta
# Scaffold a new project
atk new # Interactive wizard
atk new -c ai-bot -l typescript -i false # Non-interactive
# Provision cloud resources
atk provision --env dev -i false # Uses m365agents.yml
atk provision --env local -i false # Uses m365agents.local.yml
atk provision --env dev --resource-group <rg> --region <region> -i false # Azure resources
# Deploy application code / generate .localConfigs
atk deploy --env dev -i false # Deploy to Azure
atk deploy --env local -i false # Generate .localConfigs
# Validate and package
atk validate --env dev -i false
atk package --env dev -i false
# Publish to org catalog
atk publish --env dev -i false
# Local preview / Agents Playground
atk preview
# Update an existing Teams app registration
atk update
# Auth management
atk auth login m365
atk auth login azure
atk auth listPattern 4: GitHub Actions CI/CD pipeline
# .github/workflows/deploy.yml
name: Deploy Teams Bot
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- name: Install Agents Toolkit CLI
run: npm install -g @microsoft/m365agentstoolkit-cli
- name: Provision
run: atk provision --env production -i false
env:
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
AZURE_RESOURCE_GROUP_NAME: ${{ secrets.AZURE_RESOURCE_GROUP_NAME }}
# M365 credentials for app registration
M365_ACCOUNT_NAME: ${{ secrets.M365_ACCOUNT_NAME }}
M365_ACCOUNT_PASSWORD: ${{ secrets.M365_ACCOUNT_PASSWORD }}
- name: Deploy
run: atk deploy --env production -i false
env:
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}Pattern 5: Cross-Platform Projects (no m365agents.yml)
Standalone cross-platform examples (Teams + Slack) can skip m365agents.yml entirely. These projects:
Use a single
.envfile at the project root (loaded viadotenv) instead ofenv/.env.{name}pairsStill include
appPackage/manifest.jsonfor sideloading into TeamsRun with
tsx watchornodedirectly — noatk provisionoratk deployneededManage Azure resources manually (Bot Registration, App Service) rather than through lifecycle actions
cross-platform-bot/
├── appPackage/
│ └── manifest.json # v1.26 schema, ${{VAR}} placeholders for sideloading
├── src/
│ ├── adapters/
│ │ ├── teams-bot.ts # @microsoft/teams.apps handler
│ │ └── slack-bot.ts # @slack/bolt handler
│ └── index.ts # Starts both platforms
├── .env # All credentials (Teams + Slack) in one file
├── package.json
└── tsconfig.json # extends @microsoft/teams.config/tsconfig.node.jsonWhen to add
m365agents.yml: Only when you wantatk provision/atk deployto manage Azure resources automatically. For teaching examples and local development, manual.env+ sideloading is simpler.
pitfalls
Running
deploybeforeprovision— Cloud resources must exist first. Always provision before the first deploy. Subsequent deploys can skip provision if resources haven't changed.Forgetting
writeToEnvironmentFile— Built-in actions that create resources output IDs and secrets. WithoutwriteToEnvironmentFile, downstream actions can't reference these values.Editing
m365agents.ymlaction order — Actions run top-to-bottom within a stage. Movingarm/deploybeforebotAadApp/createbreaks because the ARM template references the bot ID.Inventing a
runs:field — There is no top-levelruns:step inm365agents.yml. For custom shell commands, use the built-inuses: scriptaction with awith.run: <command>block (and an optionalworking-directory:).Committing
.env.*.userfiles — These contain secrets (SECRET_*vars). They're gitignored by default — don't override this.Missing
--envin CI — Without--env, the CLI uses thedevenvironment. Production pipelines must specify--env productionexplicitly.Confusing
atkwith legacy CLI names — The CLI was previously calledteamsfx, thenteamsapp. The current CLI isatk(installed as@microsoft/m365agentstoolkit-cli). If docs or examples referenceteamsfxorteamsapp, translate toatk.ARM template parameter mismatches —
arm/deployparameters must match the Bicep/ARM template's expected inputs. Mismatches cause silent failures during provisioning.Missing
generateServicePrincipal: trueinaadApp/create— Without this field, no service principal is created. The bot getsAADSTS7000229at runtime. Always include it in the local YAML'saadApp/createaction.TENANT_IDnot written to.localConfigs— Thefile/createOrUpdateEnvironmentFilemay not includeTENANT_ID. Without it, the SDK acquires tokens from the wrong authority, causing 401 from Bot Connector. Copy fromenv/.env.localif missing.Devtunnel URL blacklisted after repeated 401s — Bot Framework may cache a failing tunnel URL. Even after fixing auth, the bot still gets 401. Create a fresh devtunnel, update
BOT_ENDPOINT, and re-provision.outputJsonPathinteamsApp/zipAppPackage— This field does not exist. UseoutputFolderinstead. Using the wrong field causes a silent schema validation error.Assuming
descriptionis required inbotFramework/create— It is optional. The driver defaults to""when not provided. Templates setdescription: ""explicitly only for clarity, not because the schema rejects its omission.Using
botAadApp/createin local YAML —botAadApp/createis for cloud (m365agents.yml). Local templates useaadApp/create+botFramework/createinstead.
references
instructions
Do a web search for:
"Microsoft 365 Agents Toolkit m365agents.yml lifecycle configuration 2025"
"atk CLI provision deploy publish commands reference"
"Agents Toolkit CI/CD GitHub Actions Azure Pipelines"
Pair with:
../experts/teams/project.scaffold-files-ts.md— project scaffolding (whatatk newcreates)../experts/deploy/azure-bot-deploy-ts.md— manual Azure deployment as alternative to Agents Toolkitenvironments.md— environment files consumed by lifecycle hookspublish.md— detailed publishing workflow
research
Deep Research prompt:
"Write a micro expert on Microsoft 365 Agents Toolkit lifecycle management (TypeScript). Cover m365agents.yml anatomy, atk CLI commands (new, provision, deploy, publish, validate, package, preview, update), built-in actions (arm/deploy, azureAppService/deploy, aadApp/create, botAadApp/create, teamsApp/create, teamsApp/validateManifest, teamsApp/zipAppPackage), uses: vs runs: hooks, writeToEnvironmentFile, CI/CD integration with GitHub Actions and Azure Pipelines. Include canonical patterns for: complete m365agents.yml config, CLI command reference cheat sheet, GitHub Actions deployment pipeline."
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python, Needs Node.js
Security
What our scanner noticed· Medium risk
- Possible data-exfiltration endpoints
- Instructions that use the network
- Downloads piped into a shell
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/microsoft-365-agents-toolkit/skills/teams-app-developer · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download teams-app-developer.zip