#862 by GitHub stars
microsoft/work-iq
MCP Server and CLI for accessing Work IQ
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
plugins/microsoft-365-agents-toolkit/skills/declarative-agent-developer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/microsoft-365-agents-toolkit/skills/install-atk/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/slack-to-teams/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-preview/skills/workiq-preview/SKILL.md
Week of Nov 2, 2026 · +4 / −5 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/action-item-extractor/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/channel-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/channel-digest/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/daily-outlook-triage/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/email-analytics/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/meeting-cost-calculator/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/multi-plan-search/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/org-chart/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/planner-status-report/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq-productivity/skills/site-explorer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
plugins/workiq/skills/workiq/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
66f62b146788 → a48007cbbea3
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66f62b146788
No earlier version was observed for comparison.
Verified commit a48007cbbea3ba8b8030c1bd11b890b88f395b9b
git clone --filter=blob:none --no-checkout https://github.com/microsoft/work-iq.git .hotskills/microsoft-work-iq && git -C .hotskills/microsoft-work-iq checkout --detach a48007cbbea3ba8b8030c1bd11b890b88f395b9b
# Copy each selected skill directory from .hotskills/microsoft-work-iq into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/microsoft/work-iq.git .hotskills/microsoft-work-iq && git -C .hotskills/microsoft-work-iq checkout --detach a48007cbbea3ba8b8030c1bd11b890b88f395b9b
# Copy each selected skill directory from .hotskills/microsoft-work-iq into .agents/skills/<skill-name>/Heat
3.7- Star growth, last 7 daysAhead of 66% of tracked repositories
- Star growth, last 24 hoursAhead of 3% of tracked repositories
- Rank movement, last 7 daysAhead of 5% of tracked repositories
- Commits, last 30 daysAhead of 85% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- declarative-agent-developer
plugins/microsoft-365-agents-toolkit/skills/declarative-agent-developer - install-atk
plugins/microsoft-365-agents-toolkit/skills/install-atk - m365-agent-evaluator
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator - setup-sso-ui-widget
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget - teams-app-developer
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer - slack-to-teams
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/slack-to-teams - ui-widget-developer
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer - workiq-preview
plugins/workiq-preview/skills/workiq-preview - action-item-extractor
plugins/workiq-productivity/skills/action-item-extractor - channel-audit
plugins/workiq-productivity/skills/channel-audit - channel-digest
plugins/workiq-productivity/skills/channel-digest - daily-outlook-triage
plugins/workiq-productivity/skills/daily-outlook-triage - email-analytics
plugins/workiq-productivity/skills/email-analytics - meeting-cost-calculator
plugins/workiq-productivity/skills/meeting-cost-calculator - multi-plan-search
plugins/workiq-productivity/skills/multi-plan-search - org-chart
plugins/workiq-productivity/skills/org-chart - planner-status-report
plugins/workiq-productivity/skills/planner-status-report - site-explorer
plugins/workiq-productivity/skills/site-explorer - workiq
plugins/workiq/skills/workiq
How it works
declarative-agent-developer
When your agent uses it
Entry point for Microsoft 365 Copilot declarative-agent authoring and lifecycle requests. Use for scaffolding, manifest edits, capabilities, API or MCP actions, authentication, localization, instruction design and review, validation, packaging, provisioning, sharing, publishing, and troubleshooting. Delegate the complete request to the WIQD plugin's `wiqd` skill before inspecting a project, answering implementation questions, running commands, or editing files. Triggers: "create agent", "declarative agent", "edit my agent", "add a capability", "add an API plugin", "add an MCP plugin", "deploy my agent", "validate my agent", "localize my agent", "review instructions", "publish my agent"
What it loads into context
Frontmatter
165 tokensAlways available to the agent
SKILL.md
431 tokensWhen the skill is activated
Reference documents
552,154 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Required Delegation
- Boundaries
Scripts executed separately
../setup-sso-ui-widget/references/auth.ts../setup-sso-ui-widget/scripts/_lib.ps1../setup-sso-ui-widget/scripts/atk-oauth-register.ps1../setup-sso-ui-widget/scripts/build-sideload.ps1../setup-sso-ui-widget/scripts/cleanup.ps1../setup-sso-ui-widget/scripts/create-tunnel.ps1../setup-sso-ui-widget/scripts/detect-project.ps1../setup-sso-ui-widget/scripts/gather-inputs.ps1../setup-sso-ui-widget/scripts/inject-guard.ps1../setup-sso-ui-widget/scripts/register-entra-app.ps1../setup-sso-ui-widget/scripts/resync-tunnel-url.ps1../setup-sso-ui-widget/scripts/update-entra-app.ps1../setup-sso-ui-widget/scripts/verify-401.ps1../setup-sso-ui-widget/scripts/wire-mcpplugin.ps1../setup-sso-ui-widget/scripts/write-sso-env.ps1
Files
../../../../.claude-plugin/marketplace.jsonasset1,689 bytes../../.claude-plugin/plugin.jsonasset281 bytesSKILL.mdcore2,071 bytes../install-atk/SKILL.mddoc2,678 bytes../m365-agent-evaluator/SKILL.mddoc8,124 bytes../m365-agent-evaluator/examples/analyze-failures.mddoc1,507 bytes../m365-agent-evaluator/examples/basic-generation.mddoc1,822 bytes../m365-agent-evaluator/examples/iterate-on-changes.mddoc1,302 bytes../m365-agent-evaluator/examples/missing-instructions.mddoc1,581 bytes../m365-agent-evaluator/examples/not-atk-project.mddoc1,452 bytes../m365-agent-evaluator/examples/run-and-analyze.mddoc1,660 bytes../m365-agent-evaluator/references/azure-setup.mddoc5,927 bytes../m365-agent-evaluator/references/eval-templates.mddoc5,176 bytes../m365-agent-evaluator/references/guardrails.mddoc4,221 bytes../m365-agent-evaluator/references/output-schema.jsonasset4,051 bytes../m365-agent-evaluator/references/output-schema.mddoc2,711 bytes../m365-agent-evaluator/references/pra-framework.mddoc3,319 bytes../m365-agent-evaluator/references/prompts-schema.jsonasset15,760 bytes../m365-agent-evaluator/references/remediation-patterns.mddoc3,675 bytes../m365-agent-evaluator/references/result-analysis.mddoc4,514 bytes../m365-agent-evaluator/references/workflow.mddoc6,623 bytes../setup-sso-ui-widget/SKILL.mddoc15,647 bytes../setup-sso-ui-widget/references/auth.tsruns3,748 bytes../setup-sso-ui-widget/references/build-verify-cleanup.mddoc1,301 bytes../setup-sso-ui-widget/references/detect-and-inputs.mddoc1,522 bytes../setup-sso-ui-widget/references/easy-auth.mddoc4,486 bytes../setup-sso-ui-widget/references/register-app.mddoc2,328 bytes../setup-sso-ui-widget/references/sso-explained.mddoc22,552 bytes../setup-sso-ui-widget/references/wire-and-guard.mddoc9,497 bytes../setup-sso-ui-widget/scripts/_lib.ps1runs5,163 bytes../setup-sso-ui-widget/scripts/atk-oauth-register.ps1runs3,492 bytes../setup-sso-ui-widget/scripts/build-sideload.ps1runs1,139 bytes../setup-sso-ui-widget/scripts/cleanup.ps1runs1,083 bytes../setup-sso-ui-widget/scripts/create-tunnel.ps1runs1,606 bytes../setup-sso-ui-widget/scripts/detect-project.ps1runs1,983 bytes../setup-sso-ui-widget/scripts/gather-inputs.ps1runs3,746 bytes../setup-sso-ui-widget/scripts/inject-guard.ps1runs2,255 bytes../setup-sso-ui-widget/scripts/register-entra-app.ps1runs2,519 bytes../setup-sso-ui-widget/scripts/resync-tunnel-url.ps1runs4,369 bytes../setup-sso-ui-widget/scripts/update-entra-app.ps1runs3,766 bytes../setup-sso-ui-widget/scripts/verify-401.ps1runs1,060 bytes../setup-sso-ui-widget/scripts/wire-mcpplugin.ps1runs3,290 bytes../setup-sso-ui-widget/scripts/write-sso-env.ps1runs780 bytes../teams-app-developer/SKILL.mddoc7,266 bytes../teams-app-developer/create-project/create-project.mddoc8,654 bytes../teams-app-developer/docs/README.mddoc2,888 bytes../teams-app-developer/docs/advanced-features.mddoc7,141 bytes../teams-app-developer/docs/feature-gaps.mddoc47,375 bytes../teams-app-developer/docs/files-and-links.mddoc4,285 bytes../teams-app-developer/docs/identity-and-auth.mddoc4,450 bytes../teams-app-developer/docs/infrastructure.mddoc6,822 bytes../teams-app-developer/docs/interactive-responses.mddoc4,495 bytes../teams-app-developer/docs/messaging-and-commands.mddoc4,613 bytes../teams-app-developer/docs/middleware-and-handlers.mddoc4,490 bytes../teams-app-developer/docs/ui-components.mddoc7,015 bytes../teams-app-developer/docs/workflows.mddoc14,740 bytes../teams-app-developer/experts/README.mddoc8,835 bytes../teams-app-developer/experts/_expert-ts.mddoc2,242 bytes../teams-app-developer/experts/analyzer.mddoc14,305 bytes../teams-app-developer/experts/bridge/app-distribution-packaging-ts.mddoc14,589 bytes../teams-app-developer/experts/bridge/channel-ops-graph-ts.mddoc15,750 bytes../teams-app-developer/experts/bridge/commands-slash-text-ts.mddoc18,951 bytes../teams-app-developer/experts/bridge/cross-platform-advisor-ts.mddoc37,232 bytes../teams-app-developer/experts/bridge/cross-platform-architecture-ts.mddoc8,455 bytes../teams-app-developer/experts/bridge/events-activities-ts.mddoc22,937 bytes../teams-app-developer/experts/bridge/files-upload-download-ts.mddoc17,582 bytes../teams-app-developer/experts/bridge/identity-oauth-bridge-ts.mddoc20,246 bytes../teams-app-developer/experts/bridge/index.mddoc13,307 bytes../teams-app-developer/experts/bridge/infra-compute-ts.mddoc14,991 bytes../teams-app-developer/experts/bridge/infra-observability-ts.mddoc14,316 bytes../teams-app-developer/experts/bridge/infra-secrets-config-ts.mddoc13,483 bytes../teams-app-developer/experts/bridge/infra-storage-ts.mddoc14,627 bytes../teams-app-developer/experts/bridge/interactive-responses-ts.mddoc20,096 bytes../teams-app-developer/experts/bridge/link-unfurl-preview-ts.mddoc17,507 bytes../teams-app-developer/experts/bridge/middleware-handlers-ts.mddoc15,816 bytes../teams-app-developer/experts/bridge/python-cross-platform.mddoc9,553 bytes../teams-app-developer/experts/bridge/rate-limiting-resilience-ts.mddoc17,999 bytes../teams-app-developer/experts/bridge/rest-only-integration-ts.mddoc8,620 bytes../teams-app-developer/experts/bridge/scheduling-deferred-send-ts.mddoc18,182 bytes../teams-app-developer/experts/bridge/shortcuts-extensions-ts.mddoc17,971 bytes../teams-app-developer/experts/bridge/transport-socketmode-https-ts.mddoc14,626 bytes../teams-app-developer/experts/bridge/ui-app-home-personal-tab-ts.mddoc14,897 bytes../teams-app-developer/experts/bridge/ui-block-kit-adaptive-cards-ts.mddoc22,032 bytes../teams-app-developer/experts/bridge/ui-legacy-attachments-cards-ts.mddoc11,498 bytes../teams-app-developer/experts/bridge/ui-modals-dialogs-ts.mddoc21,920 bytes../teams-app-developer/experts/bridge/workflow.composable-platform-ts.mddoc14,058 bytes../teams-app-developer/experts/bridge/workflows-automation-ts.mddoc14,688 bytes../teams-app-developer/experts/builder.mddoc11,399 bytes../teams-app-developer/experts/convert/bulk-conversion-strategy-ts.mddoc13,132 bytes../teams-app-developer/experts/convert/dependency-mapping-ts.mddoc8,513 bytes../teams-app-developer/experts/convert/index.mddoc3,559 bytes../teams-app-developer/experts/convert/java-to-ts-ts.mddoc21,050 bytes../teams-app-developer/experts/convert/js-to-ts-ts.mddoc6,374 bytes../teams-app-developer/experts/convert/json-serialization-ts.mddoc11,247 bytes../teams-app-developer/experts/convert/kotlin-to-ts-ts.mddoc11,451 bytes../teams-app-developer/experts/convert/ruby-to-ts-ts.mddoc9,922 bytes../teams-app-developer/experts/convert/type-mapping-ts.mddoc10,361 bytes../teams-app-developer/experts/deploy/aws-bot-deploy-ts.mddoc14,933 bytes../teams-app-developer/experts/deploy/aws-cli-reference-ts.mddoc53,646 bytes../teams-app-developer/experts/deploy/azure-bot-deploy-ts.mddoc15,766 bytes../teams-app-developer/experts/deploy/azure-cli-reference-ts.mddoc17,313 bytes../teams-app-developer/experts/deploy/index.mddoc4,709 bytes../teams-app-developer/experts/fallback.mddoc2,154 bytes../teams-app-developer/experts/index.mddoc19,394 bytes../teams-app-developer/experts/models/anthropic-ts.mddoc8,033 bytes../teams-app-developer/experts/models/bedrock-ts.mddoc10,106 bytes../teams-app-developer/experts/models/foundry-cloud-ts.mddoc8,322 bytes../teams-app-developer/experts/models/foundry-local-ts.mddoc10,839 bytes../teams-app-developer/experts/models/index.mddoc5,975 bytes../teams-app-developer/experts/models/openai-azure-openai-ts.mddoc8,528 bytes../teams-app-developer/experts/models/oss-openai-compatible-ts.mddoc10,976 bytes../teams-app-developer/experts/models/transformers-js-ts.mddoc11,869 bytes../teams-app-developer/experts/prompt-engineer.mddoc15,035 bytes../teams-app-developer/experts/researcher.mddoc2,821 bytes../teams-app-developer/experts/security/index.mddoc1,228 bytes../teams-app-developer/experts/security/input-validation-ts.mddoc14,082 bytes../teams-app-developer/experts/security/secrets-ts.mddoc14,195 bytes../teams-app-developer/experts/slack/bolt-assistant-ts.mddoc10,111 bytes../teams-app-developer/experts/slack/bolt-events-ts.mddoc9,536 bytes../teams-app-developer/experts/slack/bolt-java.mddoc9,073 bytes../teams-app-developer/experts/slack/bolt-oauth-distribution-ts.mddoc11,130 bytes../teams-app-developer/experts/slack/bolt-python.mddoc9,750 bytes../teams-app-developer/experts/slack/cli.app-management.mddoc8,130 bytes../teams-app-developer/experts/slack/cli.datastore-env.mddoc8,795 bytes../teams-app-developer/experts/slack/cli.getting-started.mddoc8,187 bytes../teams-app-developer/experts/slack/cli.local-dev-deploy.mddoc8,595 bytes../teams-app-developer/experts/slack/cli.manifest-triggers.mddoc10,093 bytes../teams-app-developer/experts/slack/index.mddoc9,154 bytes../teams-app-developer/experts/slack/runtime.ack-rules-ts.mddoc10,029 bytes../teams-app-developer/experts/slack/runtime.bolt-foundations-ts.mddoc10,918 bytes../teams-app-developer/experts/slack/runtime.shortcuts-ts.mddoc11,313 bytes../teams-app-developer/experts/slack/runtime.slash-commands-ts.mddoc11,909 bytes../teams-app-developer/experts/slack/runtime.socket-mode-ts.mddoc9,684 bytes../teams-app-developer/experts/slack/ui.block-kit-ts.mddoc11,728 bytes../teams-app-developer/experts/slack/ui.modals-lifecycle-ts.mddoc13,577 bytes../teams-app-developer/experts/slack/web-api-proactive-ts.mddoc11,294 bytes../teams-app-developer/experts/slack/workflow.slack-automations-ts.mddoc10,401 bytes../teams-app-developer/experts/teams/a2a.client-basics-ts.mddoc9,967 bytes../teams-app-developer/experts/teams/a2a.orchestrator-patterns-ts.mddoc13,014 bytes../teams-app-developer/experts/teams/a2a.server-basics-ts.mddoc11,679 bytes../teams-app-developer/experts/teams/ai.chatprompt-basics-ts.mddoc8,266 bytes../teams-app-developer/experts/teams/ai.citations-feedback-ts.mddoc7,105 bytes../teams-app-developer/experts/teams/ai.conversational-query-ts.mddoc14,573 bytes../teams-app-developer/experts/teams/ai.function-calling-design-ts.mddoc9,252 bytes../teams-app-developer/experts/teams/ai.function-calling-implementation-ts.mddoc7,893 bytes../teams-app-developer/experts/teams/ai.memory-localmemory-ts.mddoc7,452 bytes../teams-app-developer/experts/teams/ai.model-setup-ts.mddoc6,794 bytes../teams-app-developer/experts/teams/ai.rag-retrieval-ts.mddoc7,619 bytes../teams-app-developer/experts/teams/ai.rag-vectorstores-ts.mddoc8,749 bytes../teams-app-developer/experts/teams/ai.streaming-ts.mddoc7,058 bytes../teams-app-developer/experts/teams/auth.oauth-sso-ts.mddoc10,384 bytes../teams-app-developer/experts/teams/compat.botbuilder-interop-ts.mddoc14,985 bytes../teams-app-developer/experts/teams/dev.debug-test-ts.mddoc14,472 bytes../teams-app-developer/experts/teams/graph.usergraph-appgraph-ts.mddoc9,176 bytes../teams-app-developer/experts/teams/index.mddoc10,042 bytes../teams-app-developer/experts/teams/mcp.client-basics-ts.mddoc9,722 bytes../teams-app-developer/experts/teams/mcp.expose-chatprompt-tools-ts.mddoc9,753 bytes../teams-app-developer/experts/teams/mcp.security-ts.mddoc10,637 bytes../teams-app-developer/experts/teams/mcp.server-basics-ts.mddoc10,131 bytes../teams-app-developer/experts/teams/project.scaffold-files-ts.mddoc12,465 bytes../teams-app-developer/experts/teams/runtime.app-init-ts.mddoc11,161 bytes../teams-app-developer/experts/teams/runtime.manifest-ts.mddoc12,553 bytes../teams-app-developer/experts/teams/runtime.proactive-messaging-ts.mddoc12,913 bytes../teams-app-developer/experts/teams/runtime.routing-handlers-ts.mddoc12,638 bytes../teams-app-developer/experts/teams/state.storage-patterns-ts.mddoc9,656 bytes../teams-app-developer/experts/teams/teams-dotnet.mddoc8,255 bytes../teams-app-developer/experts/teams/teams-python.mddoc8,509 bytes../teams-app-developer/experts/teams/ui.adaptive-cards-ts.mddoc13,222 bytes../teams-app-developer/experts/teams/ui.dialogs-task-modules-ts.mddoc15,425 bytes../teams-app-developer/experts/teams/ui.message-extensions-ts.mddoc16,025 bytes../teams-app-developer/experts/teams/workflow.approvals-inline-ts.mddoc12,736 bytes../teams-app-developer/experts/teams/workflow.message-native-records-ts.mddoc10,835 bytes../teams-app-developer/experts/teams/workflow.sharepoint-lists-ts.mddoc9,251 bytes../teams-app-developer/experts/teams/workflow.state-driven-events-ts.mddoc12,506 bytes../teams-app-developer/experts/teams/workflow.triggers-compose-ts.mddoc10,589 bytes../teams-app-developer/experts/update-experts.mddoc10,246 bytes../teams-app-developer/provision-deploy/provision-deploy.mddoc4,844 bytes../teams-app-developer/slack-to-teams/SKILL.mddoc9,109 bytes../teams-app-developer/test-playground/playground-cli.mddoc4,677 bytes../teams-app-developer/test-playground/playground.mddoc4,609 bytes../teams-app-developer/test-playground/test-playground.mddoc1,122 bytes../teams-app-developer/test-teams/test-teams.mddoc5,066 bytes../teams-app-developer/toolkit/README.mddoc4,256 bytes../teams-app-developer/toolkit/commands.mddoc2,695 bytes../teams-app-developer/toolkit/environments.mddoc12,910 bytes../teams-app-developer/toolkit/lifecycle-cli.mddoc18,058 bytes../teams-app-developer/toolkit/manifest-and-yaml.mddoc6,195 bytes../teams-app-developer/toolkit/playground.mddoc7,825 bytes../teams-app-developer/toolkit/publish.mddoc9,538 bytes../teams-app-developer/toolkit/templates.mddoc6,870 bytes../teams-app-developer/troubleshoot/troubleshoot.mddoc20,734 bytes../ui-widget-developer/SKILL.mddoc24,540 bytes../ui-widget-developer/references/best-practices.mddoc12,269 bytes../ui-widget-developer/references/copilot-widget-protocol.mddoc11,774 bytes../ui-widget-developer/references/devtunnels.mddoc11,867 bytes../ui-widget-developer/references/mcp-server-pattern.mddoc14,682 bytes../ui-widget-developer/references/plugin-schema.mddoc6,964 bytes../ui-widget-developer/references/widget-patterns.mddoc6,345 bytes../../../workiq-preview/.claude-plugin/plugin.jsonasset530 bytes../../../workiq-preview/skills/workiq-preview/SKILL.mddoc14,388 bytes../../../workiq-preview/skills/workiq-preview/references/agents-work-iq.mddoc2,479 bytes../../../workiq-preview/skills/workiq-preview/references/ask-work-iq.mddoc4,759 bytes../../../workiq-preview/skills/workiq-preview/references/business-applications.mddoc5,498 bytes../../../workiq-preview/skills/workiq-preview/references/calendar-work-iq.mddoc16,708 bytes../../../workiq-preview/skills/workiq-preview/references/call-function-work-iq.mddoc4,594 bytes../../../workiq-preview/skills/workiq-preview/references/create-entity-work-iq.mddoc1,666 bytes../../../workiq-preview/skills/workiq-preview/references/delete-entity-work-iq.mddoc1,807 bytes../../../workiq-preview/skills/workiq-preview/references/do-action-work-iq.mddoc2,742 bytes../../../workiq-preview/skills/workiq-preview/references/fetch-blob-work-iq.mddoc4,549 bytes../../../workiq-preview/skills/workiq-preview/references/fetch-work-iq.mddoc5,488 bytes../../../workiq-preview/skills/workiq-preview/references/files-work-iq.mddoc9,620 bytes../../../workiq-preview/skills/workiq-preview/references/get-schema-work-iq.mddoc3,941 bytes../../../workiq-preview/skills/workiq-preview/references/mail-work-iq.mddoc8,007 bytes../../../workiq-preview/skills/workiq-preview/references/retrieve-work-iq.mddoc12,196 bytes../../../workiq-preview/skills/workiq-preview/references/search-paths-work-iq.mddoc2,501 bytes../../../workiq-preview/skills/workiq-preview/references/tasks-work-iq.mddoc5,192 bytes../../../workiq-preview/skills/workiq-preview/references/teams-work-iq.mddoc7,981 bytes../../../workiq-preview/skills/workiq-preview/references/troubleshooting.mddoc8,325 bytes../../../workiq-preview/skills/workiq-preview/references/update-entity-work-iq.mddoc2,496 bytes../../../workiq-preview/skills/workiq-preview/references/upload-blob-work-iq.mddoc1,193 bytes../../../workiq-preview/skills/workiq-preview/references/workflows-work-iq.mddoc9,878 bytes../../../workiq-preview/skills/workiq-preview/references/workiq-files-cli.mddoc2,673 bytes../../../workiq-productivity/.claude-plugin/plugin.jsonasset262 bytes../../../workiq-productivity/skills/action-item-extractor/SKILL.mddoc4,707 bytes../../../workiq-productivity/skills/channel-audit/SKILL.mddoc11,012 bytes../../../workiq-productivity/skills/channel-digest/SKILL.mddoc10,593 bytes../../../workiq-productivity/skills/daily-outlook-triage/SKILL.mddoc7,460 bytes../../../workiq-productivity/skills/email-analytics/SKILL.mddoc10,737 bytes../../../workiq-productivity/skills/meeting-cost-calculator/SKILL.mddoc11,107 bytes../../../workiq-productivity/skills/multi-plan-search/SKILL.mddoc10,231 bytes../../../workiq-productivity/skills/org-chart/SKILL.mddoc14,088 bytes../../../workiq-productivity/skills/planner-status-report/SKILL.mddoc20,229 bytes../../../workiq-productivity/skills/site-explorer/SKILL.mddoc10,732 bytes../../../workiq/.claude-plugin/plugin.jsonasset327 bytes../../../workiq/skills/workiq/SKILL.mddoc60,135 bytes../../../workiq/skills/workiq/references/ask-work-iq.mddoc4,405 bytes../../../workiq/skills/workiq/references/business-applications.mddoc10,352 bytes../../../workiq/skills/workiq/references/call-function-work-iq.mddoc3,529 bytes../../../workiq/skills/workiq/references/create-entity-work-iq.mddoc2,173 bytes../../../workiq/skills/workiq/references/delete-entity-work-iq.mddoc1,955 bytes../../../workiq/skills/workiq/references/do-action-work-iq.mddoc15,543 bytes../../../workiq/skills/workiq/references/fetch-blob-work-iq.mddoc2,557 bytes../../../workiq/skills/workiq/references/fetch-work-iq.mddoc8,702 bytes../../../workiq/skills/workiq/references/get-schema-work-iq.mddoc6,346 bytes../../../workiq/skills/workiq/references/mail-work-iq.mddoc6,953 bytes../../../workiq/skills/workiq/references/search-paths-work-iq.mddoc3,163 bytes../../../workiq/skills/workiq/references/sharepoint-library-metadata.mddoc18,516 bytes../../../workiq/skills/workiq/references/sharepoint-work-iq.mddoc4,218 bytes../../../workiq/skills/workiq/references/tasks-work-iq.mddoc4,213 bytes../../../workiq/skills/workiq/references/teams-work-iq.mddoc12,975 bytes../../../workiq/skills/workiq/references/troubleshooting.mddoc8,296 bytes../../../workiq/skills/workiq/references/update-entity-work-iq.mddoc6,300 bytes../../../workiq/skills/workiq/references/upload-blob-work-iq.mddoc2,368 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubinstall-atk
When your agent uses it
Install or update the M365 Agents Toolkit (ATK) CLI and VS Code extension. Triggers: "install atk", "update atk", "install agents toolkit", "update agents toolkit", "install the toolkit", "setup atk", "get atk", "install atk cli", "install atk extension", "install atk vsix", "update the vs code extension", "install latest atk", "upgrade atk"
What it loads into context
Frontmatter
97 tokensAlways available to the agent
SKILL.md
664 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Telemetry Tagging
- Triggers
- Behavior
- Commands
- Execution
- Safety Rules
Files
SKILL.mdcore2,678 bytesSKILL.mdcore2,678 bytesSKILL.mdcore2,678 bytesSKILL.mdcore2,678 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubm365-agent-evaluator
When your agent uses it
Use this skill when a user wants to create, run, or analyze evaluation suites for Microsoft 365 Copilot declarative agents with the public @microsoft/m365-copilot-eval CLI. Trigger on intents such as "evaluate my agent", "test my agent", "run my evals", "create eval prompts", "add multi-turn tests", "tune evaluator thresholds", "why is my agent failing", or "set up eval environment variables".
What it loads into context
Frontmatter
105 tokensAlways available to the agent
SKILL.md
2,041 tokensWhen the skill is activated
Reference documents
10,982 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Always use this CLI invocation
- Activation workflow
- Current dataset contract
- Public evaluator names
- Common commands
- Version and PATH safety
- File conventions
- Generation guidance
- Result analysis guidance
Files
SKILL.mdcore8,124 bytesSKILL.mdcore8,124 bytesSKILL.mdcore8,124 bytesSKILL.mdcore8,124 bytesSKILL.mdcore8,124 bytesSKILL.mdcore8,124 bytesSKILL.mdcore8,124 bytesexamples/analyze-failures.mddoc1,507 bytesexamples/basic-generation.mddoc1,822 bytesexamples/iterate-on-changes.mddoc1,302 bytesexamples/missing-instructions.mddoc1,581 bytesexamples/not-atk-project.mddoc1,452 bytesexamples/run-and-analyze.mddoc1,660 bytesreferences/azure-setup.mddoc5,927 bytesreferences/eval-templates.mddoc5,176 bytesreferences/guardrails.mddoc4,221 bytesreferences/output-schema.jsonasset4,051 bytesreferences/output-schema.mddoc2,711 bytesreferences/pra-framework.mddoc3,319 bytesreferences/prompts-schema.jsonasset15,760 bytesreferences/remediation-patterns.mddoc3,675 bytesreferences/result-analysis.mddoc4,514 bytesreferences/workflow.mddoc6,623 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubsetup-sso-ui-widget
When your agent uses it
Adds Microsoft Entra SSO (single sign-on, no OBO) to a Microsoft 365 Copilot declarative agent whose tools are served by an MCP server — for BOTH widget standards: (1) the MCP Apps standard (from create-mcp-app / the MCP Apps SDK): a plugin manifest such as readiness_plugin.json (or another *_plugin.json with a runtimes[] block) and an EXPRESS-based MCP server; and (2) the OpenAI Apps (OAI Apps) layout from the ui-widget-developer skill: appPackage/mcpPlugin.json and a raw-http MCP server. When the layout is ambiguous, DEFAULT to the MCP Apps standard (most projects use it). The skill auto-detects the layout, reuses the existing named devtunnel + env/.env.local (never creates a second tunnel), registers the Entra app + ATK OAuth (MicrosoftEntra), patches the plugin manifest's runtimes[] auth to OAuthPluginVault, injects a minimal JWKS bearer-token guard into the existing server (an EXPRESS middleware for MCP Apps, or a raw-http guard WITHOUT rewriting to Express for OAI Apps), validates, sideloads, and prints an app-registration summary. SSO only — no OBO. Triggered by: "add sso to my mcp server", "wire entra sso for my copilot agent", "setup sso for mcp apps", "add sso after create-mcp-app", "add sso after ui-widget-developer", "add entra auth to my express mcp server", "configure only sso no obo"
What it loads into context
Frontmatter
360 tokensAlways available to the agent
SKILL.md
4,060 tokensWhen the skill is activated
Reference documents
10,769 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Scope Guardrails
- ⛔ Phase 0 — Workspace Check (MANDATORY FIRST STEP)
- Phase 1 — Prerequisites (EXECUTE)
- Phase 2 — Gather Inputs + Reuse Existing Tunnel (EXECUTE)
- Phase 3–5 — Register + Configure the Entra App (EXECUTE)
- Phase 6–8 — Wire SSO + Inject Guard + Write Env (EXECUTE)
- Phase 9–11 — Build, Verify, Clean Up (EXECUTE)
- 🎉 FINAL SUMMARY (render DIRECTLY in your reply — NOT inside a code fence)
- What changed (minimal-touch, no OBO)
- App registration details
- Changed files
- Test status
- Test in Copilot
- Deployment note — Azure (Easy Auth)
- ⚠<U+FE0F> Caveat — if your dev tunnel URL changes later
- Notes & Error Handling
Scripts executed separately
references/auth.tsscripts/_lib.ps1scripts/atk-oauth-register.ps1scripts/build-sideload.ps1scripts/cleanup.ps1scripts/create-tunnel.ps1scripts/detect-project.ps1scripts/gather-inputs.ps1scripts/inject-guard.ps1scripts/register-entra-app.ps1scripts/resync-tunnel-url.ps1scripts/update-entra-app.ps1scripts/verify-401.ps1scripts/wire-mcpplugin.ps1scripts/write-sso-env.ps1
Files
SKILL.mdcore15,647 bytesSKILL.mdcore15,647 bytesSKILL.mdcore15,647 bytesreferences/auth.tsruns3,748 bytesreferences/build-verify-cleanup.mddoc1,301 bytesreferences/detect-and-inputs.mddoc1,522 bytesreferences/easy-auth.mddoc4,486 bytesreferences/register-app.mddoc2,328 bytesreferences/sso-explained.mddoc22,552 bytesreferences/wire-and-guard.mddoc9,497 bytesscripts/_lib.ps1runs5,163 bytesscripts/atk-oauth-register.ps1runs3,492 bytesscripts/build-sideload.ps1runs1,139 bytesscripts/cleanup.ps1runs1,083 bytesscripts/create-tunnel.ps1runs1,606 bytesscripts/detect-project.ps1runs1,983 bytesscripts/gather-inputs.ps1runs3,746 bytesscripts/inject-guard.ps1runs2,255 bytesscripts/register-entra-app.ps1runs2,519 bytesscripts/resync-tunnel-url.ps1runs4,369 bytesscripts/update-entra-app.ps1runs3,766 bytesscripts/verify-401.ps1runs1,060 bytesscripts/wire-mcpplugin.ps1runs3,290 bytesscripts/write-sso-env.ps1runs780 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubteams-app-developer
When your agent uses it
Build, test, and deploy code-based Teams apps using the M365 Agents Toolkit CLI. USE FOR: Custom Engine Agents (CEA), Teams bots, tabs, message extensions, Agents Playground local testing, Azure provision/deploy, Slack-to-Teams migration, cross-platform bot development, Block Kit to Adaptive Cards conversion, AI model integration (OpenAI/Azure/Anthropic/Bedrock). DO NOT USE FOR: declarative agents — use the `declarative-agent-developer` skill instead. Triggers: "build a teams bot", "custom engine agent", "CEA", "teams agent", "tab app", "message extension", "test with agents playground", "provision to azure", "deploy to azure", "migrate slack bot", "slack to teams", "convert block kit", "add azure openai to my bot"
What it loads into context
Frontmatter
191 tokensAlways available to the agent
SKILL.md
1,752 tokensWhen the skill is activated
Reference documents
399,169 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- AI Behavior Guidelines
- ATK CLI Setup
- CLI Global Options
- Sub-Skills
- Workflow Chains
- Shared References
- ATK Project Context Resolution
Files
SKILL.mdcore7,266 bytesSKILL.mdcore7,266 bytesSKILL.mdcore7,266 bytesSKILL.mdcore7,266 bytescreate-project/create-project.mddoc8,654 bytesdocs/README.mddoc2,888 bytesdocs/advanced-features.mddoc7,141 bytesdocs/feature-gaps.mddoc47,375 bytesdocs/files-and-links.mddoc4,285 bytesdocs/identity-and-auth.mddoc4,450 bytesdocs/infrastructure.mddoc6,822 bytesdocs/interactive-responses.mddoc4,495 bytesdocs/messaging-and-commands.mddoc4,613 bytesdocs/middleware-and-handlers.mddoc4,490 bytesdocs/ui-components.mddoc7,015 bytesdocs/workflows.mddoc14,740 bytesexperts/README.mddoc8,835 bytesexperts/_expert-ts.mddoc2,242 bytesexperts/analyzer.mddoc14,305 bytesexperts/bridge/app-distribution-packaging-ts.mddoc14,589 bytesexperts/bridge/channel-ops-graph-ts.mddoc15,750 bytesexperts/bridge/commands-slash-text-ts.mddoc18,951 bytesexperts/bridge/cross-platform-advisor-ts.mddoc37,232 bytesexperts/bridge/cross-platform-architecture-ts.mddoc8,455 bytesexperts/bridge/events-activities-ts.mddoc22,937 bytesexperts/bridge/files-upload-download-ts.mddoc17,582 bytesexperts/bridge/identity-oauth-bridge-ts.mddoc20,246 bytesexperts/bridge/index.mddoc13,307 bytesexperts/bridge/infra-compute-ts.mddoc14,991 bytesexperts/bridge/infra-observability-ts.mddoc14,316 bytesexperts/bridge/infra-secrets-config-ts.mddoc13,483 bytesexperts/bridge/infra-storage-ts.mddoc14,627 bytesexperts/bridge/interactive-responses-ts.mddoc20,096 bytesexperts/bridge/link-unfurl-preview-ts.mddoc17,507 bytesexperts/bridge/middleware-handlers-ts.mddoc15,816 bytesexperts/bridge/python-cross-platform.mddoc9,553 bytesexperts/bridge/rate-limiting-resilience-ts.mddoc17,999 bytesexperts/bridge/rest-only-integration-ts.mddoc8,620 bytesexperts/bridge/scheduling-deferred-send-ts.mddoc18,182 bytesexperts/bridge/shortcuts-extensions-ts.mddoc17,971 bytesexperts/bridge/transport-socketmode-https-ts.mddoc14,626 bytesexperts/bridge/ui-app-home-personal-tab-ts.mddoc14,897 bytesexperts/bridge/ui-block-kit-adaptive-cards-ts.mddoc22,032 bytesexperts/bridge/ui-legacy-attachments-cards-ts.mddoc11,498 bytesexperts/bridge/ui-modals-dialogs-ts.mddoc21,920 bytesexperts/bridge/workflow.composable-platform-ts.mddoc14,058 bytesexperts/bridge/workflows-automation-ts.mddoc14,688 bytesexperts/builder.mddoc11,399 bytesexperts/convert/bulk-conversion-strategy-ts.mddoc13,132 bytesexperts/convert/dependency-mapping-ts.mddoc8,513 bytesexperts/convert/index.mddoc3,559 bytesexperts/convert/java-to-ts-ts.mddoc21,050 bytesexperts/convert/js-to-ts-ts.mddoc6,374 bytesexperts/convert/json-serialization-ts.mddoc11,247 bytesexperts/convert/kotlin-to-ts-ts.mddoc11,451 bytesexperts/convert/ruby-to-ts-ts.mddoc9,922 bytesexperts/convert/type-mapping-ts.mddoc10,361 bytesexperts/deploy/aws-bot-deploy-ts.mddoc14,933 bytesexperts/deploy/aws-cli-reference-ts.mddoc53,646 bytesexperts/deploy/azure-bot-deploy-ts.mddoc15,766 bytesexperts/deploy/azure-cli-reference-ts.mddoc17,313 bytesexperts/deploy/index.mddoc4,709 bytesexperts/fallback.mddoc2,154 bytesexperts/index.mddoc19,394 bytesexperts/models/anthropic-ts.mddoc8,033 bytesexperts/models/bedrock-ts.mddoc10,106 bytesexperts/models/foundry-cloud-ts.mddoc8,322 bytesexperts/models/foundry-local-ts.mddoc10,839 bytesexperts/models/index.mddoc5,975 bytesexperts/models/openai-azure-openai-ts.mddoc8,528 bytesexperts/models/oss-openai-compatible-ts.mddoc10,976 bytesexperts/models/transformers-js-ts.mddoc11,869 bytesexperts/prompt-engineer.mddoc15,035 bytesexperts/researcher.mddoc2,821 bytesexperts/security/index.mddoc1,228 bytesexperts/security/input-validation-ts.mddoc14,082 bytesexperts/security/secrets-ts.mddoc14,195 bytesexperts/slack/bolt-assistant-ts.mddoc10,111 bytesexperts/slack/bolt-events-ts.mddoc9,536 bytesexperts/slack/bolt-java.mddoc9,073 bytesexperts/slack/bolt-oauth-distribution-ts.mddoc11,130 bytesexperts/slack/bolt-python.mddoc9,750 bytesexperts/slack/cli.app-management.mddoc8,130 bytesexperts/slack/cli.datastore-env.mddoc8,795 bytesexperts/slack/cli.getting-started.mddoc8,187 bytesexperts/slack/cli.local-dev-deploy.mddoc8,595 bytesexperts/slack/cli.manifest-triggers.mddoc10,093 bytesexperts/slack/index.mddoc9,154 bytesexperts/slack/runtime.ack-rules-ts.mddoc10,029 bytesexperts/slack/runtime.bolt-foundations-ts.mddoc10,918 bytesexperts/slack/runtime.shortcuts-ts.mddoc11,313 bytesexperts/slack/runtime.slash-commands-ts.mddoc11,909 bytesexperts/slack/runtime.socket-mode-ts.mddoc9,684 bytesexperts/slack/ui.block-kit-ts.mddoc11,728 bytesexperts/slack/ui.modals-lifecycle-ts.mddoc13,577 bytesexperts/slack/web-api-proactive-ts.mddoc11,294 bytesexperts/slack/workflow.slack-automations-ts.mddoc10,401 bytesexperts/teams/a2a.client-basics-ts.mddoc9,967 bytesexperts/teams/a2a.orchestrator-patterns-ts.mddoc13,014 bytesexperts/teams/a2a.server-basics-ts.mddoc11,679 bytesexperts/teams/ai.chatprompt-basics-ts.mddoc8,266 bytesexperts/teams/ai.citations-feedback-ts.mddoc7,105 bytesexperts/teams/ai.conversational-query-ts.mddoc14,573 bytesexperts/teams/ai.function-calling-design-ts.mddoc9,252 bytesexperts/teams/ai.function-calling-implementation-ts.mddoc7,893 bytesexperts/teams/ai.memory-localmemory-ts.mddoc7,452 bytesexperts/teams/ai.model-setup-ts.mddoc6,794 bytesexperts/teams/ai.rag-retrieval-ts.mddoc7,619 bytesexperts/teams/ai.rag-vectorstores-ts.mddoc8,749 bytesexperts/teams/ai.streaming-ts.mddoc7,058 bytesexperts/teams/auth.oauth-sso-ts.mddoc10,384 bytesexperts/teams/compat.botbuilder-interop-ts.mddoc14,985 bytesexperts/teams/dev.debug-test-ts.mddoc14,472 bytesexperts/teams/graph.usergraph-appgraph-ts.mddoc9,176 bytesexperts/teams/index.mddoc10,042 bytesexperts/teams/mcp.client-basics-ts.mddoc9,722 bytesexperts/teams/mcp.expose-chatprompt-tools-ts.mddoc9,753 bytesexperts/teams/mcp.security-ts.mddoc10,637 bytesexperts/teams/mcp.server-basics-ts.mddoc10,131 bytesexperts/teams/project.scaffold-files-ts.mddoc12,465 bytesexperts/teams/runtime.app-init-ts.mddoc11,161 bytesexperts/teams/runtime.manifest-ts.mddoc12,553 bytesexperts/teams/runtime.proactive-messaging-ts.mddoc12,913 bytesexperts/teams/runtime.routing-handlers-ts.mddoc12,638 bytesexperts/teams/state.storage-patterns-ts.mddoc9,656 bytesexperts/teams/teams-dotnet.mddoc8,255 bytesexperts/teams/teams-python.mddoc8,509 bytesexperts/teams/ui.adaptive-cards-ts.mddoc13,222 bytesexperts/teams/ui.dialogs-task-modules-ts.mddoc15,425 bytesexperts/teams/ui.message-extensions-ts.mddoc16,025 bytesexperts/teams/workflow.approvals-inline-ts.mddoc12,736 bytesexperts/teams/workflow.message-native-records-ts.mddoc10,835 bytesexperts/teams/workflow.sharepoint-lists-ts.mddoc9,251 bytesexperts/teams/workflow.state-driven-events-ts.mddoc12,506 bytesexperts/teams/workflow.triggers-compose-ts.mddoc10,589 bytesexperts/update-experts.mddoc10,246 bytesprovision-deploy/provision-deploy.mddoc4,844 bytestest-playground/playground-cli.mddoc4,677 bytestest-playground/playground.mddoc4,609 bytestest-playground/test-playground.mddoc1,122 bytestest-teams/test-teams.mddoc5,066 bytestoolkit/README.mddoc4,256 bytestoolkit/commands.mddoc2,695 bytestoolkit/environments.mddoc12,910 bytestoolkit/lifecycle-cli.mddoc18,058 bytestoolkit/manifest-and-yaml.mddoc6,195 bytestoolkit/playground.mddoc7,825 bytestoolkit/publish.mddoc9,538 bytestoolkit/templates.mddoc6,870 bytestroubleshoot/troubleshoot.mddoc20,734 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubslack-to-teams
When your agent uses it
Sub-skill of microsoft-365-agents-toolkit. Routed expert system with 100+ micro-expert files for migrating Slack bots to Teams, cross-platform bridging, and dual-platform bot development. USE FOR: migrating Slack bot to Teams, adding Teams support to Slack bot, building dual-platform bots, converting Block Kit to Adaptive Cards, identity/OAuth bridging, deploying bots to Azure or AWS, configuring AI model providers. DO NOT USE FOR: general web development, non-bot projects, standalone Teams development without Slack (use parent skill instead).
What it loads into context
Frontmatter
120 tokensAlways available to the agent
SKILL.md
2,259 tokensWhen the skill is activated
Reference documents
89,094 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Procedure
- Agents Toolkit Compatibility
- Error Recovery
- Expert Domains
- Platform Comparison Docs
Files
../SKILL.mddoc7,266 bytes../docs/advanced-features.mddoc7,141 bytes../docs/feature-gaps.mddoc47,375 bytes../docs/files-and-links.mddoc4,285 bytes../docs/identity-and-auth.mddoc4,450 bytes../docs/infrastructure.mddoc6,822 bytes../docs/interactive-responses.mddoc4,495 bytes../docs/messaging-and-commands.mddoc4,613 bytes../docs/middleware-and-handlers.mddoc4,490 bytes../docs/ui-components.mddoc7,015 bytes../docs/workflows.mddoc14,740 bytes../experts/_expert-ts.mddoc2,242 bytes../experts/analyzer.mddoc14,305 bytes../experts/bridge/cross-platform-advisor-ts.mddoc37,232 bytes../experts/bridge/cross-platform-architecture-ts.mddoc8,455 bytes../experts/bridge/index.mddoc13,307 bytes../experts/bridge/python-cross-platform.mddoc9,553 bytes../experts/bridge/rest-only-integration-ts.mddoc8,620 bytes../experts/builder.mddoc11,399 bytes../experts/convert/index.mddoc3,559 bytes../experts/deploy/index.mddoc4,709 bytes../experts/fallback.mddoc2,154 bytes../experts/index.mddoc19,394 bytes../experts/models/index.mddoc5,975 bytes../experts/security/index.mddoc1,228 bytes../experts/slack/bolt-java.mddoc9,073 bytes../experts/slack/bolt-python.mddoc9,750 bytes../experts/slack/index.mddoc9,154 bytes../experts/teams/index.mddoc10,042 bytes../experts/teams/runtime.manifest-ts.mddoc12,553 bytes../experts/teams/teams-dotnet.mddoc8,255 bytes../experts/teams/teams-python.mddoc8,509 bytes../provision-deploy/provision-deploy.mddoc4,844 bytesSKILL.mdcore9,109 bytesSKILL.mdcore9,109 bytesSKILL.mdcore9,109 bytes../test-playground/test-playground.mddoc1,122 bytes../test-teams/test-teams.mddoc5,066 bytes../toolkit/commands.mddoc2,695 bytes../toolkit/manifest-and-yaml.mddoc6,195 bytes../toolkit/templates.mddoc6,870 bytes../troubleshoot/troubleshoot.mddoc20,734 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubui-widget-developer
When your agent uses it
Build MCP servers for Copilot Chat using the OpenAI Apps SDK or MCP Apps SDK widget rendering support (any language). Use this skill when: - Creating MCP servers that integrate with M365 Copilot declarative agents - Building rich interactive widgets (React + Fluent UI) that render in Copilot Chat - Implementing tools that return structuredContent for widget rendering - Adapting an existing MCP server to support Copilot widget rendering - Setting up devtunnels for localhost MCP server exposure - Configuring mcpPlugin.json manifests with RemoteMCPServer runtime Do NOT use this skill for general agent development (scaffolding, manifests, deployment) — use declarative-agent-developer instead. This skill is ONLY for MCP server + widget development. Triggers: "MCP server for Copilot", "OpenAI Apps SDK", "Copilot widget", "structuredContent", "MCP plugin", "devtunnels MCP", "OAI app", "widget rendering", "UI widget"
What it loads into context
Frontmatter
223 tokensAlways available to the agent
SKILL.md
5,886 tokensWhen the skill is activated
Reference documents
16,107 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Telemetry Tagging
- 🔀 PATH SELECTION
- 📛 PROJECT DETECTION 📛
- Scenario Routing
- 🚨 CRITICAL EXECUTION RULES 🚨
- ⚠<U+FE0F> MCP TOOL CONFIGURATION RULE ⚠<U+FE0F>
- Architecture
- Project Structure
- Copilot Widget Protocol
- Implementation
- DevTunnels Setup
- Development Workflow
- Best Practices
- Next Step — Add SSO (optional)
Files
SKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesSKILL.mdcore24,540 bytesreferences/best-practices.mddoc12,269 bytesreferences/copilot-widget-protocol.mddoc11,774 bytesreferences/devtunnels.mddoc11,867 bytesreferences/mcp-server-pattern.mddoc14,682 bytesreferences/plugin-schema.mddoc6,964 bytesreferences/widget-patterns.mddoc6,345 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubworkiq-preview
When your agent uses it
WorkIQ tools for Microsoft 365 workplace data and actions. Use for email, meetings, calendar, files, SharePoint, OneDrive, Teams, people, Planner, and connected work context. Triggers include gather requirements, summarize workplace discussions, manage meetings, create an upload session, send or draft replies, manage tasks, and discover paths or schemas. Retrieve context first with explicit Grounding when available and synthesize locally; use ask only for intentional delegation to Copilot or a known/discovered agent. Exact entities and writes stay on entity tools; WorkIQ files API transfers use the Files CLI reference. This skill contains instructions for the WorkIQ MCP tools and must be used beforehand to understand their usage. Use this skill also for Microsoft Business Applications requests involving CRM, ERP, Power Apps, or Dataverse records and workflows, including requests that reference paths under /businessapps/.
What it loads into context
Frontmatter
208 tokensAlways available to the agent
SKILL.md
3,149 tokensWhen the skill is activated
Reference documents
26,776 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choosing the Right Tool
- Retrieval: Evidence, Not a Finished Answer
- Known Paths - Go Direct, Skip Discovery
- Required Workflow Order
- URL and Body Format Rules
- Mail-Specific Guidance
- Efficiency and Error Handling
- References - Read Only What the Task Needs
Files
SKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesSKILL.mdcore14,388 bytesreferences/agents-work-iq.mddoc2,479 bytesreferences/ask-work-iq.mddoc4,759 bytesreferences/business-applications.mddoc5,498 bytesreferences/calendar-work-iq.mddoc16,708 bytesreferences/call-function-work-iq.mddoc4,594 bytesreferences/create-entity-work-iq.mddoc1,666 bytesreferences/delete-entity-work-iq.mddoc1,807 bytesreferences/do-action-work-iq.mddoc2,742 bytesreferences/fetch-blob-work-iq.mddoc4,549 bytesreferences/fetch-work-iq.mddoc5,488 bytesreferences/files-work-iq.mddoc9,620 bytesreferences/get-schema-work-iq.mddoc3,941 bytesreferences/mail-work-iq.mddoc8,007 bytesreferences/retrieve-work-iq.mddoc12,196 bytesreferences/search-paths-work-iq.mddoc2,501 bytesreferences/tasks-work-iq.mddoc5,192 bytesreferences/teams-work-iq.mddoc7,981 bytesreferences/troubleshooting.mddoc8,325 bytesreferences/update-entity-work-iq.mddoc2,496 bytesreferences/upload-blob-work-iq.mddoc1,193 bytesreferences/workflows-work-iq.mddoc9,878 bytesreferences/workiq-files-cli.mddoc2,673 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubaction-item-extractor
When your agent uses it
Extract action items with owners, deadlines, and priorities from meeting content
What it loads into context
Frontmatter
24 tokensAlways available to the agent
SKILL.md
1,129 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Description
- Prerequisites
- Required Inputs
- Execution Steps
- Error Handling
- Output
- Instructions
- Examples
Files
SKILL.mdcore4,707 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubchannel-audit
When your agent uses it
Audit Teams channels across your teams — identify inactive channels, low‑engagement conversations, channels with no recent posts, and recommend cleanup actions.
What it loads into context
Frontmatter
36 tokensAlways available to the agent
SKILL.md
2,357 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Output Format
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore11,012 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubchannel-digest
When your agent uses it
Summarize activity across multiple Teams channels into a single consolidated digest — key discussions, decisions, mentions, and action items.
What it loads into context
Frontmatter
33 tokensAlways available to the agent
SKILL.md
2,257 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Output Format
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore10,593 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubdaily-outlook-triage
When your agent uses it
Get a quick summary of your day by pulling your inbox emails and calendar meetings. Helps you triage and prioritize your workday.
What it loads into context
Frontmatter
37 tokensAlways available to the agent
SKILL.md
1,680 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Does
- Instructions
- Output Format
- Parameters
- Example Usage
- Required MCP Tools
- Tips for Effective Triage
- Error Handling
Files
SKILL.mdcore7,460 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubemail-analytics
When your agent uses it
Analyze your email patterns over a time period — volume trends, top senders, response time estimates, busiest days, and unread backlog statistics.
What it loads into context
Frontmatter
36 tokensAlways available to the agent
SKILL.md
2,206 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Output Format
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore10,737 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubmeeting-cost-calculator
When your agent uses it
Calculate time spent in meetings per week or month — total hours, percentage of work time, attendee‑hours, and identify your most expensive recurring meetings.
What it loads into context
Frontmatter
39 tokensAlways available to the agent
SKILL.md
2,377 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Output Format
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore11,107 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubmulti-plan-search
When your agent uses it
Search for tasks across all your Planner plans by keyword, assignee, status, or priority — unified cross‑plan task discovery in one view.
What it loads into context
Frontmatter
37 tokensAlways available to the agent
SKILL.md
2,252 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Output Format
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore10,231 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHuborg-chart
When your agent uses it
Display a beautifully formatted ASCII org chart for any person in the organization — showing their manager, peers, and direct reports in a visual tree.
What it loads into context
Frontmatter
35 tokensAlways available to the agent
SKILL.md
3,110 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Output Format
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore14,088 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubplanner-status-report
When your agent uses it
Generates a Microsoft Planner status report for one plan, using task status, owners, dates, priorities, buckets, risks, wins, progress, upcoming commitments, and milestones.
What it loads into context
Frontmatter
42 tokensAlways available to the agent
SKILL.md
4,625 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Do Not Use
- Instructions
- Parameters
- Required MCP Tools
- Error Handling
- Examples
Files
SKILL.mdcore20,229 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubsite-explorer
When your agent uses it
Browse and discover SharePoint sites, lists, document libraries, and file contents — navigate your SharePoint world without leaving the CLI.
What it loads into context
Frontmatter
34 tokensAlways available to the agent
SKILL.md
2,418 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Instructions
- Parameters
- Required MCP Tools
- Tips
- Examples
- Error Handling
Files
SKILL.mdcore10,732 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubworkiq
When your agent uses it
WorkIQ tools for Microsoft 365 workplace data and actions. Use for email, calendar events and meetings, files, SharePoint, OneDrive, Teams, people, Planner, and other M365 requests. Triggers include cancel meeting or event, accept or decline meetings, create or update events, create an upload session or replace an existing OneDrive file, find or summarize workplace content, send or reply to mail, manage or download files, manage tasks, read SharePoint library metadata or columns, filter/count/group/sort files by metadata, and discover M365 paths or schemas. Prefer `ask` for synthesis and structured entity tools for exact reads, writes, SharePoint library metadata, and binary downloads with `fetch_blob`. This skill contains instructions for the WorkIQ MCP tools and must be used beforehand to understand their usage. Use this skill also for Microsoft Business Applications requests involving CRM, ERP, Power Apps, or Dataverse records and workflows, including requests that reference paths under /businessapps/.
What it loads into context
Frontmatter
231 tokensAlways available to the agent
SKILL.md
14,372 tokensWhen the skill is activated
Reference documents
29,757 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 🛑 STOP — Read This Before Your First Tool Call
- CRITICAL: When to Use This Skill
- Prerequisites
- Configuration
- Resolving tool names in your host
- MCP Tools
- Entity Tools
- Business Applications (`/businessapps`)
Files
SKILL.mdcore60,135 bytesSKILL.mdcore60,135 bytesSKILL.mdcore60,135 bytesSKILL.mdcore60,135 bytesSKILL.mdcore60,135 bytesSKILL.mdcore60,135 bytesSKILL.mdcore60,135 bytesreferences/ask-work-iq.mddoc4,405 bytesreferences/business-applications.mddoc10,352 bytesreferences/call-function-work-iq.mddoc3,529 bytesreferences/create-entity-work-iq.mddoc2,173 bytesreferences/delete-entity-work-iq.mddoc1,955 bytesreferences/do-action-work-iq.mddoc15,543 bytesreferences/fetch-blob-work-iq.mddoc2,557 bytesreferences/fetch-work-iq.mddoc8,702 bytesreferences/get-schema-work-iq.mddoc6,346 bytesreferences/mail-work-iq.mddoc6,953 bytesreferences/search-paths-work-iq.mddoc3,163 bytesreferences/sharepoint-library-metadata.mddoc18,516 bytesreferences/sharepoint-work-iq.mddoc4,218 bytesreferences/tasks-work-iq.mddoc4,213 bytesreferences/teams-work-iq.mddoc12,975 bytesreferences/troubleshooting.mddoc8,296 bytesreferences/update-entity-work-iq.mddoc6,300 bytesreferences/upload-blob-work-iq.mddoc2,368 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- declarative-agent-developer
- install-atk
- m365-agent-evaluator
- setup-sso-ui-widget
- teams-app-developer
- slack-to-teams
- ui-widget-developer
- workiq-preview
- action-item-extractor
- channel-audit
- channel-digest
- daily-outlook-triage
- email-analytics
- meeting-cost-calculator
- multi-plan-search
- org-chart
- planner-status-report
- site-explorer
- workiq
Repository facts
- License
- No license detected
- Created
- Jan 20, 2026
- Last pushed
- Nov 6, 2026
- Forks
- 151
- Open issues
- 102
- Project activity
- Slowing
Rank over the last 12 weeks
Now #862 · best #588 · down 130 in 30 days
- #846 on Nov 2
- #849 on Nov 3
- #851 on Nov 4
- #854 on Nov 5
- #856 on Nov 6
- #862 since Nov 7
59 earlier periods
- #610 on Aug 1
- #575 on Aug 6
- #584 on Aug 10
- #579 on Aug 12
- #588 on Aug 14
- #570 on Aug 15
- #588 on Aug 16
- #606 on Aug 18
- #595 on Aug 19
- #593 on Aug 20
- #619 on Aug 24
- #629 on Aug 25
- #623 on Aug 27
- #639 on Aug 28
- #599 on Aug 29
- #638 on Sep 1
- #626 on Sep 2
- #627 on Sep 3
- #609 on Sep 4
- #614 on Sep 6
- #627 on Sep 7
- #645 on Sep 8
- #637 on Sep 9
- #641 on Sep 10
- #628 on Sep 11
- #631 on Sep 12
- #659 on Sep 14
- #648 on Sep 15
- #657 on Sep 16
- #659 on Sep 17
- #635 on Sep 19
- #673 on Sep 23
- #647 on Sep 24
- #636 on Sep 25
- #634 on Sep 26
- #668 on Sep 28
- #708 on Sep 29
- #689 on Sep 30
- #650 on Oct 1
- #660 on Oct 2
- #682 on Oct 6
- #692 on Oct 7
- #732 on Oct 8
- #701 on Oct 9
- #687 on Oct 11
- #705 on Oct 12
- #713 on Oct 15
- #700 on Oct 17
- #695 on Oct 18
- #729 on Oct 19
- #743 on Oct 21
- #723 on Oct 22
- #698 on Oct 24
- #821 on Oct 25
- #831 on Oct 28
- #833 on Oct 29
- #838 on Oct 30
- #840 on Oct 31
- #843 on Nov 1
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 44 notes
plugins/microsoft-365-agents-toolkit/skills/install-atk/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/install-atk/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/install-atk/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/teams-app-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/teams-app-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/teams-app-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/teams-app-developer/slack-to-teams/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/teams-app-developer/slack-to-teams/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 27 dangerous shell commandsin 8 files: plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/troubleshoot/troubleshoot.md:272 plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/deploy/aws-bot-deploy-ts.md:212 plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/oss-openai-compatible-ts.md:14 and 5 more
- 3,908 network referencesin 142 files: plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/runtime.manifest-ts.md:9 plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/rest-only-integration-ts.md:11 plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/a2a.orchestrator-patterns-ts.md:9 and 139 more
- No hidden or obfuscated text
- No instruction overrides
- 30 executable scriptsin 15 files: plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/auth.ts:1 plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/_lib.ps1:1 plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/atk-oauth-register.ps1:1 and 12 more
- 703 references to secretsin 84 files: plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/security/secrets-ts.md:10 plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/infra-secrets-config-ts.md:11 plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/identity-oauth-bridge-ts.md:12 and 81 more
- No requests to vote in Hot
Show all 4,668 signals by file
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/examples/not-atk-project.md
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/azure-setup.md
- Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/output-schema.json
- Network accessline 1
{ "$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 1
{ "$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 2
"$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 2
"$schema": "https://json-schema.org/draft/2020-12/schema",
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/prompts-schema.json
- Network accessline 1
{ "$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 1
{ "$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 2
"$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 2
"$schema": "https://json-schema.org/draft/2020-12/schema", - Network accessline 3
"$id": "https://raw.githubusercontent.com/microsoft/M365-Copilot-Agent-Evals/refs/heads/main/schema/v1/eval-document.schema.json", - Network accessline 3
"$id": "https://raw.githubusercontent.com/microsoft/M365-Copilot-Agent-Evals/refs/heads/main/schema/v1/eval-document.schema.json",
plugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/workflow.md
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md
- Network accessline 156
## Test in Copilot 1. Open https://m365.cloud.microsoft/chat (agent may take up to 15 min to appear). - Network accessline 156
## Test in Copilot 1. Open https://m365.cloud.microsoft/chat (agent may take up to 15 min to appear). - Network accessline 157
1. Open https://m365.cloud.microsoft/chat (agent may take up to 15 min to appear). - Network accessline 157
1. Open https://m365.cloud.microsoft/chat (agent may take up to 15 min to appear). - Network accessline 166
- **App registration:** the Entra app this skill created (`<ClientId>`) — do not create a new one. - **Supported account types:** Single tenant. - **Issuer URL:** `https://login.microsoftonline.com/<TenantId>/v2.0` - Network accessline 166
- **App registration:** the Entra app this skill created (`<ClientId>`) — do not create a new one. - **Supported account types:** Single tenant. - **Issuer URL:** `https://login.microsoftonline.com/<TenantId>/v2.0` - Network accessline 167
- **Supported account types:** Single tenant. - **Issuer URL:** `https://login.microsoftonline.com/<TenantId>/v2.0` - **Allowed token audiences:** `<ClientId>` — the **bare client-id** form (NOT `api://…`), else `401`. - Network accessline 167
- **Supported account types:** Single tenant. - **Issuer URL:** `https://login.microsoftonline.com/<TenantId>/v2.0` - **Allowed token audiences:** `<ClientId>` — the **bare client-id** form (NOT `api://…`), else `401`. - Network accessline 168
- **Issuer URL:** `https://login.microsoftonline.com/<TenantId>/v2.0` - **Allowed token audiences:** `<ClientId>` — the **bare client-id** form (NOT `api://…`), else `401`. - **Client application requirement:** *Allow requests from specific - Network accessline 168
- **Issuer URL:** `https://login.microsoftonline.com/<TenantId>/v2.0` - **Allowed token audiences:** `<ClientId>` — the **bare client-id** form (NOT `api://…`), else `401`. - **Client application requirement:** *Allow requests from specific - Network accessline 173
📄 **Full field-by-field guide** (both blade tables + both gotchas): **[`references/easy-auth.md`](references/easy-auth.md)** — cite it by name in the summary. Also include: - [Authentication and authorization in Azure App Service](https://l - Network accessline 173
📄 **Full field-by-field guide** (both blade tables + both gotchas): **[`references/easy-auth.md`](references/easy-auth.md)** — cite it by name in the summary. Also include: - [Authentication and authorization in Azure App Service](https://l - Network accessline 174
- [Authentication and authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) - Network accessline 174
- [Authentication and authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) - Network accessline 175
- [Configure MCP server authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/configure-authentication-mcp) - Network accessline 175
- [Configure MCP server authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/configure-authentication-mcp) - Network accessline 190
- **Two tunnels?** This skill reuses the tunnel from `env/.env.local`. If you ever see a second tunnel, stop it and keep the named one the ui-widget script created. - **Dev tunnel URL changed → auth suddenly broken.** The OAuth registration - Network accessline 190
- **Two tunnels?** This skill reuses the tunnel from `env/.env.local`. If you ever see a second tunnel, stop it and keep the named one the ui-widget script created. - **Dev tunnel URL changed → auth suddenly broken.** The OAuth registration - Network accessline 191
- **Dev tunnel URL changed → auth suddenly broken.** The OAuth registration is created with `baseUrl: ${{MCP_SERVER_URL}}`, ATK derives the Application ID URI from that tunnel domain, and it's written into the Entra app's `identifierUris`. - Network accessline 191
- **Dev tunnel URL changed → auth suddenly broken.** The OAuth registration is created with `baseUrl: ${{MCP_SERVER_URL}}`, ATK derives the Application ID URI from that tunnel domain, and it's written into the Entra app's `identifierUris`.
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/auth.ts
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 29
if (!tenantId) throw new Error("TENANT_ID not configured"); expectedTenantId = tenantId; jwks = createRemoteJWKSet(new URL(`https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`)); - Network accessline 29
if (!tenantId) throw new Error("TENANT_ID not configured"); expectedTenantId = tenantId; jwks = createRemoteJWKSet(new URL(`https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`)); - Network accessline 31
jwks = createRemoteJWKSet(new URL(`https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`)); - Network accessline 31
jwks = createRemoteJWKSet(new URL(`https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`)); - Network accessline 40
issuers = [`https://login.microsoftonline.com/${tenantId}/v2.0`]; - Network accessline 40
issuers = [`https://login.microsoftonline.com/${tenantId}/v2.0`];
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/easy-auth.md
- Network accessline 25
| **Application (client) ID** | `<api-app-client-id>` | Identifies the protected API | | **Client secret setting name** | *(leave unset for pure bearer validation)* | A secret is only needed if App Service itself performs a login/redirect f - Network accessline 25
| **Application (client) ID** | `<api-app-client-id>` | Identifies the protected API | | **Client secret setting name** | *(leave unset for pure bearer validation)* | A secret is only needed if App Service itself performs a login/redirect f - Network accessline 26
| **Client secret setting name** | *(leave unset for pure bearer validation)* | A secret is only needed if App Service itself performs a login/redirect flow; for API token validation it isn't required | | **Issuer URL** | `https://login.mic - Network accessline 26
| **Client secret setting name** | *(leave unset for pure bearer validation)* | A secret is only needed if App Service itself performs a login/redirect flow; for API token validation it isn't required | | **Issuer URL** | `https://login.mic - Network accessline 27
| **Issuer URL** | `https://login.microsoftonline.com/<tenant-id>/v2.0` | Must match the token's issuer (drop `/v2.0` only for v1 tokens) | - Network accessline 27
| **Issuer URL** | `https://login.microsoftonline.com/<tenant-id>/v2.0` | Must match the token's issuer (drop `/v2.0` only for v1 tokens) | - Network accessline 53
- [Authentication and authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) - Network accessline 53
- [Authentication and authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) - Network accessline 54
- [Configure MCP server authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/configure-authentication-mcp) - Network accessline 54
- [Configure MCP server authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/configure-authentication-mcp)
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/sso-explained.md
- Network accessline 106
app exposed and the user consented to. Its presence is what makes the token *usable by* (and later exchangeable *for*) your app. - **Issuer (`iss`) must match the user's tenant** (`https://login.microsoftonline.com/<tid>/v2.0` - Network accessline 106
app exposed and the user consented to. Its presence is what makes the token *usable by* (and later exchangeable *for*) your app. - **Issuer (`iss`) must match the user's tenant** (`https://login.microsoftonline.com/<tid>/v2.0` - Network accessline 107
(and later exchangeable *for*) your app. - **Issuer (`iss`) must match the user's tenant** (`https://login.microsoftonline.com/<tid>/v2.0` or the v1 `sts.windows.net` form). This stops tokens from other tenants. - Network accessline 107
(and later exchangeable *for*) your app. - **Issuer (`iss`) must match the user's tenant** (`https://login.microsoftonline.com/<tid>/v2.0` or the v1 `sts.windows.net` form). This stops tokens from other tenants. - Network accessline 108
- **Issuer (`iss`) must match the user's tenant** (`https://login.microsoftonline.com/<tid>/v2.0` - Network accessline 108
- **Issuer (`iss`) must match the user's tenant** (`https://login.microsoftonline.com/<tid>/v2.0` - Network accessline 123
{ "aud": "11111111-1111-1111-1111-111111111111", // YOUR app (client-id GUID form — not api://) "iss": "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/v2.0", // tenant issuer - Network accessline 123
{ "aud": "11111111-1111-1111-1111-111111111111", // YOUR app (client-id GUID form — not api://) "iss": "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/v2.0", // tenant issuer - Network accessline 124
"aud": "11111111-1111-1111-1111-111111111111", // YOUR app (client-id GUID form — not api://) "iss": "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/v2.0", // tenant issuer "iat": 1782762638, "nbf": 1782762638, " - Network accessline 124
"aud": "11111111-1111-1111-1111-111111111111", // YOUR app (client-id GUID form — not api://) "iss": "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/v2.0", // tenant issuer "iat": 1782762638, "nbf": 1782762638, " - Network accessline 125
"iss": "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/v2.0", // tenant issuer - Network accessline 125
"iss": "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/v2.0", // tenant issuer - Network accessline 352
token you already validated to Entra's `/oauth2/v2.0/token` endpoint with `grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer` and `requested_token_use=on_behalf_of`, scoped to `https://graph.microsoft.com/.default` (or specific s - Network accessline 352
token you already validated to Entra's `/oauth2/v2.0/token` endpoint with `grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer` and `requested_token_use=on_behalf_of`, scoped to `https://graph.microsoft.com/.default` (or specific s - Network accessline 353
`grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer` and `requested_token_use=on_behalf_of`, scoped to `https://graph.microsoft.com/.default` (or specific scopes). 4. **Call Graph** with the returned downstream token; cache it per us - Network accessline 353
`grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer` and `requested_token_use=on_behalf_of`, scoped to `https://graph.microsoft.com/.default` (or specific scopes). 4. **Call Graph** with the returned downstream token; cache it per us - Network accessline 354
scoped to `https://graph.microsoft.com/.default` (or specific scopes). - Network accessline 354
scoped to `https://graph.microsoft.com/.default` (or specific scopes). - Access to secretsline 365
[Credential-related source omitted] - Access to secretsline 365
[Credential-related source omitted] - Network accessline 367
assertion: incomingBearerToken, // the token Copilot sent you requested_token_use: "on_behalf_of", scope: "https://graph.microsoft.com/.default", - Network accessline 367
assertion: incomingBearerToken, // the token Copilot sent you requested_token_use: "on_behalf_of", scope: "https://graph.microsoft.com/.default", - Network accessline 368
requested_token_use: "on_behalf_of", scope: "https://graph.microsoft.com/.default", }); - Network accessline 368
requested_token_use: "on_behalf_of", scope: "https://graph.microsoft.com/.default", }); - Network accessline 369
scope: "https://graph.microsoft.com/.default", }); const r = await fetch( - Network accessline 369
scope: "https://graph.microsoft.com/.default", }); const r = await fetch( - Network accessline 370
}); const r = await fetch( `https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/v2.0/token`, - Network accessline 370
}); const r = await fetch( `https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/v2.0/token`, - Network accessline 371
const r = await fetch( - Network accessline 371
const r = await fetch( - Network accessline 372
`https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/v2.0/token`, - Network accessline 372
`https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/v2.0/token`, - Access to secretsline 375
[Credential-related source omitted] - Access to secretsline 375
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/wire-and-guard.md
- Network accessline 11
> **⚠<U+FE0F> Tunnel ↔ OAuth coupling.** The OAuth registration is created with `baseUrl: ${{MCP_SERVER_URL}}` (Phase 4), ATK derives the Application ID URI from that tunnel domain, and Phase 5 writes it into the Entra app's `identifierUris`. So t - Network accessline 11
> **⚠<U+FE0F> Tunnel ↔ OAuth coupling.** The OAuth registration is created with `baseUrl: ${{MCP_SERVER_URL}}` (Phase 4), ATK derives the Application ID URI from that tunnel domain, and Phase 5 writes it into the Entra app's `identifierUris`. So t - Network accessline 155
> > - **Field-by-field blade config:** [`easy-auth.md`](easy-auth.md) — the exact **App Service → Authentication → Microsoft Entra** settings, including the two gotchas: the audience must be the **bare client-id** form (else `401`), and *Al - Network accessline 155
> > - **Field-by-field blade config:** [`easy-auth.md`](easy-auth.md) — the exact **App Service → Authentication → Microsoft Entra** settings, including the two gotchas: the audience must be the **bare client-id** form (else `401`), and *Al - Network accessline 156
> - **Field-by-field blade config:** [`easy-auth.md`](easy-auth.md) — the exact **App Service → Authentication → Microsoft Entra** settings, including the two gotchas: the audience must be the **bare client-id** form (else `401`), and *Allo - Network accessline 156
> - **Field-by-field blade config:** [`easy-auth.md`](easy-auth.md) — the exact **App Service → Authentication → Microsoft Entra** settings, including the two gotchas: the audience must be the **bare client-id** form (else `401`), and *Allo - Network accessline 157
> - Overview: [Authentication and authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) - Network accessline 157
> - Overview: [Authentication and authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) - Network accessline 158
> - MCP-specific (matches this scenario): [Configure MCP server authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/configure-authentication-mcp) — App Service Authentication validates the MCP client's token fo - Network accessline 158
> - MCP-specific (matches this scenario): [Configure MCP server authorization in Azure App Service](https://learn.microsoft.com/azure/app-service/configure-authentication-mcp) — App Service Authentication validates the MCP client's token fo
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/_lib.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/atk-oauth-register.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/build-sideload.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/cleanup.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/create-tunnel.ps1
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 23
$TunnelHost = ($line -replace '.*https://', '' -replace '/.*', '').Trim() if (-not $TunnelHost) { Fail "Could not parse the tunnel host from 'devtunnel show'." } $BaseUrl = "https://$TunnelHost" - Network accessline 23
$TunnelHost = ($line -replace '.*https://', '' -replace '/.*', '').Trim() if (-not $TunnelHost) { Fail "Could not parse the tunnel host from 'devtunnel show'." } $BaseUrl = "https://$TunnelHost" - Network accessline 25
$BaseUrl = "https://$TunnelHost" - Network accessline 25
$BaseUrl = "https://$TunnelHost"
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/detect-project.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/gather-inputs.ps1
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 44
if ($liveHost -and $liveHost -ne $TunnelHost) { Write-Host "Tunnel drift detected — env points at '$TunnelHost' but tunnel '$TunnelName' is live at '$liveHost'." -ForegroundColor Yellow $BaseUrl = "https://$liveHost" - Network accessline 44
if ($liveHost -and $liveHost -ne $TunnelHost) { Write-Host "Tunnel drift detected — env points at '$TunnelHost' but tunnel '$TunnelName' is live at '$liveHost'." -ForegroundColor Yellow $BaseUrl = "https://$liveHost" - Network accessline 45
Write-Host "Tunnel drift detected — env points at '$TunnelHost' but tunnel '$TunnelName' is live at '$liveHost'." -ForegroundColor Yellow $BaseUrl = "https://$liveHost"; $TunnelHost = $liveHost Set-EnvValue -Key "MCP - Network accessline 45
Write-Host "Tunnel drift detected — env points at '$TunnelHost' but tunnel '$TunnelName' is live at '$liveHost'." -ForegroundColor Yellow $BaseUrl = "https://$liveHost"; $TunnelHost = $liveHost Set-EnvValue -Key "MCP - Network accessline 46
$BaseUrl = "https://$liveHost"; $TunnelHost = $liveHost - Network accessline 46
$BaseUrl = "https://$liveHost"; $TunnelHost = $liveHost
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/inject-guard.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/register-entra-app.ps1
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 18
$TenantId = az rest --method GET --uri "https://graph.microsoft.com/v1.0/organization" --only-show-errors 2>$null | ConvertFrom-Json | ForEach-Object { $_.value[0].id } - Network accessline 18
$TenantId = az rest --method GET --uri "https://graph.microsoft.com/v1.0/organization" --only-show-errors 2>$null | ConvertFrom-Json | ForEach-Object { $_.value[0].id } - Network accessline 38
az ad app update --id $ClientId --web-redirect-uris "https://teams.microsoft.com/api/platform/v1.0/oAuthConsentRedirect" - Network accessline 38
az ad app update --id $ClientId --web-redirect-uris "https://teams.microsoft.com/api/platform/v1.0/oAuthConsentRedirect"
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/resync-tunnel-url.ps1
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 15
param( [string]$NewUrl, # optional: force this base URL (e.g. https://myapp-tunnel-xyz.usw2.devtunnels.ms) - Network accessline 15
param( [string]$NewUrl, # optional: force this base URL (e.g. https://myapp-tunnel-xyz.usw2.devtunnels.ms) - Network accessline 16
[string]$NewUrl, # optional: force this base URL (e.g. https://myapp-tunnel-xyz.usw2.devtunnels.ms) - Network accessline 16
[string]$NewUrl, # optional: force this base URL (e.g. https://myapp-tunnel-xyz.usw2.devtunnels.ms) - Network accessline 31
} elseif ($TunnelName) { $show = devtunnel show $TunnelName 2>&1 if ($LASTEXITCODE -ne 0) { Fail "'devtunnel show $TunnelName' failed. Pass -NewUrl <https://...> explicitly." } - Network accessline 31
} elseif ($TunnelName) { $show = devtunnel show $TunnelName 2>&1 if ($LASTEXITCODE -ne 0) { Fail "'devtunnel show $TunnelName' failed. Pass -NewUrl <https://...> explicitly." } - Network accessline 32
$show = devtunnel show $TunnelName 2>&1 if ($LASTEXITCODE -ne 0) { Fail "'devtunnel show $TunnelName' failed. Pass -NewUrl <https://...> explicitly." } $line = $show | Where-Object { $_ -match "Connect via browser" -or $_ -match "ht - Network accessline 32
$show = devtunnel show $TunnelName 2>&1 if ($LASTEXITCODE -ne 0) { Fail "'devtunnel show $TunnelName' failed. Pass -NewUrl <https://...> explicitly." } $line = $show | Where-Object { $_ -match "Connect via browser" -or $_ -match "ht - Network accessline 33
if ($LASTEXITCODE -ne 0) { Fail "'devtunnel show $TunnelName' failed. Pass -NewUrl <https://...> explicitly." } - Network accessline 33
if ($LASTEXITCODE -ne 0) { Fail "'devtunnel show $TunnelName' failed. Pass -NewUrl <https://...> explicitly." } - Network accessline 34
$line = $show | Where-Object { $_ -match "Connect via browser" -or $_ -match "https://" } | Select-Object -First 1 $TunnelHost = ($line -replace '.*https://', '' -replace '/.*', '').Trim() if (-not $TunnelHost) { Fail "Could not par - Network accessline 34
$line = $show | Where-Object { $_ -match "Connect via browser" -or $_ -match "https://" } | Select-Object -First 1 $TunnelHost = ($line -replace '.*https://', '' -replace '/.*', '').Trim() if (-not $TunnelHost) { Fail "Could not par - Network accessline 35
$TunnelHost = ($line -replace '.*https://', '' -replace '/.*', '').Trim() if (-not $TunnelHost) { Fail "Could not parse the tunnel host from 'devtunnel show'. Pass -NewUrl <https://...> explicitly." } $BaseUrl = "https://$TunnelHost - Network accessline 35
$TunnelHost = ($line -replace '.*https://', '' -replace '/.*', '').Trim() if (-not $TunnelHost) { Fail "Could not parse the tunnel host from 'devtunnel show'. Pass -NewUrl <https://...> explicitly." } $BaseUrl = "https://$TunnelHost - Network accessline 36
if (-not $TunnelHost) { Fail "Could not parse the tunnel host from 'devtunnel show'. Pass -NewUrl <https://...> explicitly." } - Network accessline 36
if (-not $TunnelHost) { Fail "Could not parse the tunnel host from 'devtunnel show'. Pass -NewUrl <https://...> explicitly." } - Network accessline 37
$BaseUrl = "https://$TunnelHost" - Network accessline 37
$BaseUrl = "https://$TunnelHost"
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/update-entra-app.ps1
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 18
$file = [System.IO.Path]::GetTempFileName() $json | Set-Content -Path $file -Encoding UTF8 $out = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$ObjectId" --headers "Content-Type=application/json" --bod - Network accessline 18
$file = [System.IO.Path]::GetTempFileName() $json | Set-Content -Path $file -Encoding UTF8 $out = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$ObjectId" --headers "Content-Type=application/json" --bod - Network accessline 19
$json | Set-Content -Path $file -Encoding UTF8 $out = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$ObjectId" --headers "Content-Type=application/json" --body "@$file" 2>&1 Remove-Item $file -ErrorActi - Network accessline 19
$json | Set-Content -Path $file -Encoding UTF8 $out = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$ObjectId" --headers "Content-Type=application/json" --body "@$file" 2>&1 Remove-Item $file -ErrorActi - Network accessline 20
$out = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$ObjectId" --headers "Content-Type=application/json" --body "@$file" 2>&1 - Network accessline 20
$out = az rest --method PATCH --uri "https://graph.microsoft.com/v1.0/applications/$ObjectId" --headers "Content-Type=application/json" --body "@$file" 2>&1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/verify-401.ps1
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 7
$body = '{"jsonrpc":"2.0","method":"initialize","id":1,"params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' try { Invoke-WebRequest -Uri "http://localhost:$Port/mcp" -Method POST -Co - Network accessline 7
$body = '{"jsonrpc":"2.0","method":"initialize","id":1,"params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' try { Invoke-WebRequest -Uri "http://localhost:$Port/mcp" -Method POST -Co - Network accessline 8
try { Invoke-WebRequest -Uri "http://localhost:$Port/mcp" -Method POST -ContentType "application/json" -Body $body | Out-Null Write-Host "WARNING: Got 200 — auth not enforced. Check the Phase 7 guard insertion." -ForegroundColor Yel - Network accessline 8
try { Invoke-WebRequest -Uri "http://localhost:$Port/mcp" -Method POST -ContentType "application/json" -Body $body | Out-Null Write-Host "WARNING: Got 200 — auth not enforced. Check the Phase 7 guard insertion." -ForegroundColor Yel - Network accessline 9
Invoke-WebRequest -Uri "http://localhost:$Port/mcp" -Method POST -ContentType "application/json" -Body $body | Out-Null - Network accessline 9
Invoke-WebRequest -Uri "http://localhost:$Port/mcp" -Method POST -ContentType "application/json" -Body $body | Out-Null - Network accessline 12
$code = $_.Exception.Response.StatusCode.value__ if ($code -eq 401) { Write-Host "VERIFIED: 401 Unauthorized — SSO guard working OK" -ForegroundColor Green } elseif (-not $code) { Write-Host "Could not reach http://localhost:$Port/m - Network accessline 12
$code = $_.Exception.Response.StatusCode.value__ if ($code -eq 401) { Write-Host "VERIFIED: 401 Unauthorized — SSO guard working OK" -ForegroundColor Green } elseif (-not $code) { Write-Host "Could not reach http://localhost:$Port/m - Network accessline 13
if ($code -eq 401) { Write-Host "VERIFIED: 401 Unauthorized — SSO guard working OK" -ForegroundColor Green } elseif (-not $code) { Write-Host "Could not reach http://localhost:$Port/mcp — is the server running?" -ForegroundColor Yellow - Network accessline 13
if ($code -eq 401) { Write-Host "VERIFIED: 401 Unauthorized — SSO guard working OK" -ForegroundColor Green } elseif (-not $code) { Write-Host "Could not reach http://localhost:$Port/mcp — is the server running?" -ForegroundColor Yellow - Network accessline 14
elseif (-not $code) { Write-Host "Could not reach http://localhost:$Port/mcp — is the server running?" -ForegroundColor Yellow } - Network accessline 14
elseif (-not $code) { Write-Host "Could not reach http://localhost:$Port/mcp — is the server running?" -ForegroundColor Yellow }
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/wire-mcpplugin.ps1
plugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/scripts/write-sso-env.ps1
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/SKILL.md
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/create-project/create-project.md
- Network accessline 128
> **Applies to: code-based Teams bots/agents only** (templates: `bot`, `teams-agent*`, `basic-custom-engine-agent`, `weather-agent`, `coffee-agent`, `bot-sso`, `msgext-*`, `tab*`). > > Does **not** apply to declarative agents, API plugins, - Network accessline 128
> **Applies to: code-based Teams bots/agents only** (templates: `bot`, `teams-agent*`, `basic-custom-engine-agent`, `weather-agent`, `coffee-agent`, `bot-sso`, `msgext-*`, `tab*`). > > Does **not** apply to declarative agents, API plugins, - Network accessline 130
> Does **not** apply to declarative agents, API plugins, Copilot connectors, or `declarative-agent-*` / `copilot-connector` templates — those have no source code to scaffold against. For those, follow the in-template instructions and the [M - Network accessline 130
> Does **not** apply to declarative agents, API plugins, Copilot connectors, or `declarative-agent-*` / `copilot-connector` templates — those have no source code to scaffold against. For those, follow the in-template instructions and the [M
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/docs/identity-and-auth.md
- Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Network accessline 55
fetch OpenID config from https://login.botframework.com/v1/.well-known/openidconfiguration - Network accessline 55
fetch OpenID config from https://login.botframework.com/v1/.well-known/openidconfiguration - Network accessline 55
fetch OpenID config from https://login.botframework.com/v1/.well-known/openidconfiguration - Network accessline 56
validate JWT from Authorization header verify audience = your bot's CLIENT_ID verify issuer = https://api.botframework.com - Network accessline 56
validate JWT from Authorization header verify audience = your bot's CLIENT_ID verify issuer = https://api.botframework.com - Network accessline 56
validate JWT from Authorization header verify audience = your bot's CLIENT_ID verify issuer = https://api.botframework.com - Network accessline 58
verify issuer = https://api.botframework.com - Network accessline 58
verify issuer = https://api.botframework.com - Network accessline 58
verify issuer = https://api.botframework.com
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/docs/infrastructure.md
- Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 174
[Credential-related source omitted] - Access to secretsline 174
[Credential-related source omitted] - Access to secretsline 174
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/README.md
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/app-distribution-packaging-ts.md
- Network accessline 9
1. **Slack App Directory → Teams App Store (Partner Center).** Slack apps are listed in the Slack App Directory for public distribution. Teams apps are published to the Microsoft Teams App Store via Partner Center. The review and submission - Network accessline 9
1. **Slack App Directory → Teams App Store (Partner Center).** Slack apps are listed in the Slack App Directory for public distribution. Teams apps are published to the Microsoft Teams App Store via Partner Center. The review and submission - Network accessline 10
[Credential-related source omitted] - Network accessline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Network accessline 11
3. **Slack `InstallationStore` → conversation reference storage.** Slack's `InstallationStore` persists tokens per workspace for API calls. Teams doesn't need per-workspace tokens, but you still need to store conversation references for pro - Network accessline 11
3. **Slack `InstallationStore` → conversation reference storage.** Slack's `InstallationStore` persists tokens per workspace for API calls. Teams doesn't need per-workspace tokens, but you still need to store conversation references for pro - Network accessline 12
4. **Slack org-level install → Teams Admin Center tenant-wide deployment.** Slack Enterprise Grid supports org-level app installation. In Teams, tenant-wide deployment is done via the Teams Admin Center by an IT admin: Manage Apps → Upload/ - Network accessline 12
4. **Slack org-level install → Teams Admin Center tenant-wide deployment.** Slack Enterprise Grid supports org-level app installation. In Teams, tenant-wide deployment is done via the Teams Admin Center by an IT admin: Manage Apps → Upload/ - Network accessline 13
5. **Development install → Teams sideloading.** Slack development apps are installed via the app's manage page or OAuth URL. Teams development apps are sideloaded: upload the app package (ZIP with manifest + icons) directly into Teams. Side - Network accessline 13
5. **Development install → Teams sideloading.** Slack development apps are installed via the app's manage page or OAuth URL. Teams development apps are sideloaded: upload the app package (ZIP with manifest + icons) directly into Teams. Side - Network accessline 14
6. **Agents Toolkit simplifies packaging, provisioning, and deployment.** Agents Toolkit (VS Code extension or CLI `atk`) automates: Azure resource provisioning, app package generation, sideloading, and publishing. It replaces the manual Az - Network accessline 14
6. **Agents Toolkit simplifies packaging, provisioning, and deployment.** Agents Toolkit (VS Code extension or CLI `atk`) automates: Azure resource provisioning, app package generation, sideloading, and publishing. It replaces the manual Az - Network accessline 15
7. **Multi-tenant Slack app → Azure AD multi-tenant app registration.** Slack multi-workspace apps use the App Directory + OAuth per workspace. Teams multi-tenant bots use a single Azure AD app registration with `signInAudience: "AzureADMul - Network accessline 15
7. **Multi-tenant Slack app → Azure AD multi-tenant app registration.** Slack multi-workspace apps use the App Directory + OAuth per workspace. Teams multi-tenant bots use a single Azure AD app registration with `signInAudience: "AzureADMul - Network accessline 16
8. **Slack app manifest (`manifest.json`) → Teams app manifest (`manifest.json` in app package).** Both platforms use JSON manifests but with completely different schemas. Slack's manifest includes OAuth scopes, event subscriptions, slash c - Network accessline 16
8. **Slack app manifest (`manifest.json`) → Teams app manifest (`manifest.json` in app package).** Both platforms use JSON manifests but with completely different schemas. Slack's manifest includes OAuth scopes, event subscriptions, slash c - Network accessline 17
9. **Slack app icons (512x512 + workspace-specific) → Teams icons (color 192x192 + outline 32x32).** Teams requires exactly two icon files in the app package: a full-color icon (192x192 PNG) and an outline/monochrome icon (32x32 PNG with tr - Network accessline 17
9. **Slack app icons (512x512 + workspace-specific) → Teams icons (color 192x192 + outline 32x32).** Teams requires exactly two icon files in the app package: a full-color icon (192x192 PNG) and an outline/monochrome icon (32x32 PNG with tr - Network accessline 18
10. **Slack app review (hours-days) vs Teams store review (1-2 weeks).** Slack's App Directory review is relatively fast. Teams App Store review via Partner Center is more rigorous and can take 1-2 weeks. Plan for revision cycles — common r - Network accessline 18
10. **Slack app review (hours-days) vs Teams store review (1-2 weeks).** Slack's App Directory review is relatively fast. Teams App Store review via Partner Center is more rigorous and can take 1-2 weeks. Plan for revision cycles — common r - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Network accessline 172
- https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/publish - Network accessline 172
- https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/publish - Network accessline 173
- https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload - Network accessline 173
- https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload - Network accessline 174
- https://learn.microsoft.com/en-us/microsoftteams/manage-apps - Network accessline 174
- https://learn.microsoft.com/en-us/microsoftteams/manage-apps - Network accessline 175
- https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals - Network accessline 175
- https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals - Network accessline 176
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema - Network accessline 176
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema - Network accessline 177
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration - Network accessline 177
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration - Network accessline 178
- https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines - Network accessline 178
- https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines - Network accessline 179
- https://github.com/microsoft/teams.ts - Network accessline 179
- https://github.com/microsoft/teams.ts - Network accessline 180
- https://api.slack.com/distribution — Slack app distribution - Network accessline 180
- https://api.slack.com/distribution — Slack app distribution
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/channel-ops-graph-ts.md
- Network accessline 9
1. **Slack `conversations.create` → Graph `POST /teams/{team-id}/channels`.** Slack creates channels in a flat workspace namespace. Teams channels always belong to a specific team — you must know the `team-id` first. The request body includ - Network accessline 9
1. **Slack `conversations.create` → Graph `POST /teams/{team-id}/channels`.** Slack creates channels in a flat workspace namespace. Teams channels always belong to a specific team — you must know the `team-id` first. The request body includ - Network accessline 10
2. **Slack `conversations.archive` → no true archive in Teams.** Teams has no channel archive API. Workarounds: (a) delete the channel (destructive, 30-day soft delete), (b) rename the channel with a `[ARCHIVED]` prefix, (c) remove all memb - Network accessline 10
2. **Slack `conversations.archive` → no true archive in Teams.** Teams has no channel archive API. Workarounds: (a) delete the channel (destructive, 30-day soft delete), (b) rename the channel with a `[ARCHIVED]` prefix, (c) remove all memb - Network accessline 11
3. **Slack `conversations.invite` → Graph `POST /teams/{team-id}/channels/{channel-id}/members`.** The request body must include the user's Azure AD Object ID (`@odata.type: '#microsoft.graph.aadUserConversationMember'`) and a `roles` array - Network accessline 11
3. **Slack `conversations.invite` → Graph `POST /teams/{team-id}/channels/{channel-id}/members`.** The request body must include the user's Azure AD Object ID (`@odata.type: '#microsoft.graph.aadUserConversationMember'`) and a `roles` array - Network accessline 12
4. **Slack `conversations.kick` → Graph `DELETE /teams/{team-id}/channels/{channel-id}/members/{membership-id}`.** You must first resolve the `membership-id` by listing channel members (`GET /teams/{team-id}/channels/{channel-id}/members`) - Network accessline 12
4. **Slack `conversations.kick` → Graph `DELETE /teams/{team-id}/channels/{channel-id}/members/{membership-id}`.** You must first resolve the `membership-id` by listing channel members (`GET /teams/{team-id}/channels/{channel-id}/members`) - Network accessline 13
5. **Slack `conversations.setTopic` → Graph `PATCH /teams/{team-id}/channels/{channel-id}` with `description`.** Slack channels have a separate `topic` field. Teams channels use the `description` field as the closest equivalent. The channel - Network accessline 13
5. **Slack `conversations.setTopic` → Graph `PATCH /teams/{team-id}/channels/{channel-id}` with `description`.** Slack channels have a separate `topic` field. Teams channels use the `description` field as the closest equivalent. The channel - Network accessline 14
6. **All channel operations require a `team-id`.** Slack has a flat channel namespace (every channel has a globally-unique `C-ID`). Teams channels are nested under teams. Most operations need both `team-id` and `channel-id`. Resolve team ID - Network accessline 14
6. **All channel operations require a `team-id`.** Slack has a flat channel namespace (every channel has a globally-unique `C-ID`). Teams channels are nested under teams. Most operations need both `team-id` and `channel-id`. Resolve team ID - Network accessline 15
7. **Channel name restrictions differ from Slack.** Teams channel names cannot contain: `~ # % & * { } / \ : < > ? + | ' "`. Maximum length is 50 characters (Slack allows 80). Channel names must be unique within a team. Validate and sanitiz - Network accessline 15
7. **Channel name restrictions differ from Slack.** Teams channel names cannot contain: `~ # % & * { } / \ : < > ? + | ' "`. Maximum length is 50 characters (Slack allows 80). Channel names must be unique within a team. Validate and sanitiz - Network accessline 16
8. **Graph API requires application or delegated permissions.** Channel operations need `Channel.Create`, `ChannelMember.ReadWrite.All`, `Channel.Delete.All` (application permissions) or equivalent delegated permissions. These require Azure - Network accessline 16
8. **Graph API requires application or delegated permissions.** Channel operations need `Channel.Create`, `ChannelMember.ReadWrite.All`, `Channel.Delete.All` (application permissions) or equivalent delegated permissions. These require Azure - Network accessline 17
9. **Slack `conversations.list` → Graph `GET /teams/{team-id}/channels`.** List all channels in a team. For listing channels across teams, iterate over `GET /me/joinedTeams` first, then list channels per team. There is no single API to list - Network accessline 17
9. **Slack `conversations.list` → Graph `GET /teams/{team-id}/channels`.** List all channels in a team. For listing channels across teams, iterate over `GET /me/joinedTeams` first, then list channels per team. There is no single API to list - Network accessline 18
10. **Private channels have separate membership management.** Slack private channels (`is_private: true`) map to Teams private channels (`membershipType: 'private'`). Private channel members are managed via the channel members API, not the - Network accessline 18
10. **Private channels have separate membership management.** Slack private channels (`is_private: true`) map to Teams private channels (`membershipType: 'private'`). Private channel members are managed via the channel members API, not the - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Network accessline 106
await graph.api(`/teams/${teamId}/channels/${channel.id}/members`).post({ "@odata.type": "#microsoft.graph.aadUserConversationMember", "user@odata.bind": `https://graph.microsoft.com/v1.0/users('${aadId}')`, - Network accessline 106
await graph.api(`/teams/${teamId}/channels/${channel.id}/members`).post({ "@odata.type": "#microsoft.graph.aadUserConversationMember", "user@odata.bind": `https://graph.microsoft.com/v1.0/users('${aadId}')`, - Network accessline 107
"@odata.type": "#microsoft.graph.aadUserConversationMember", "user@odata.bind": `https://graph.microsoft.com/v1.0/users('${aadId}')`, roles: [], // empty = member, ['owner'] = owner - Network accessline 107
"@odata.type": "#microsoft.graph.aadUserConversationMember", "user@odata.bind": `https://graph.microsoft.com/v1.0/users('${aadId}')`, roles: [], // empty = member, ['owner'] = owner - Network accessline 108
"user@odata.bind": `https://graph.microsoft.com/v1.0/users('${aadId}')`, - Network accessline 108
"user@odata.bind": `https://graph.microsoft.com/v1.0/users('${aadId}')`, - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Network accessline 249
- https://learn.microsoft.com/en-us/graph/api/channel-post - Network accessline 249
- https://learn.microsoft.com/en-us/graph/api/channel-post - Network accessline 250
- https://learn.microsoft.com/en-us/graph/api/channel-post-members - Network accessline 250
- https://learn.microsoft.com/en-us/graph/api/channel-post-members - Network accessline 251
- https://learn.microsoft.com/en-us/graph/api/channel-delete-members - Network accessline 251
- https://learn.microsoft.com/en-us/graph/api/channel-delete-members - Network accessline 252
- https://learn.microsoft.com/en-us/graph/api/channel-patch - Network accessline 252
- https://learn.microsoft.com/en-us/graph/api/channel-patch - Network accessline 253
- https://learn.microsoft.com/en-us/graph/api/team-archive - Network accessline 253
- https://learn.microsoft.com/en-us/graph/api/team-archive - Network accessline 254
- https://learn.microsoft.com/en-us/graph/api/channel-list - Network accessline 254
- https://learn.microsoft.com/en-us/graph/api/channel-list - Network accessline 255
- https://learn.microsoft.com/en-us/microsoftteams/limits-specifications-teams - Network accessline 255
- https://learn.microsoft.com/en-us/microsoftteams/limits-specifications-teams - Network accessline 256
- https://github.com/microsoft/teams.ts - Network accessline 256
- https://github.com/microsoft/teams.ts - Network accessline 257
- https://api.slack.com/methods/conversations.create — Slack conversations API - Network accessline 257
- https://api.slack.com/methods/conversations.create — Slack conversations API
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/commands-slash-text-ts.md
- Network accessline 9
1. Teams bots do **not** have a native slash command system equivalent to Slack's `app.command('/name')`. Slack slash commands must be reimplemented using one of three Teams patterns: text pattern matching, messaging extensions, or manifest - Network accessline 9
1. Teams bots do **not** have a native slash command system equivalent to Slack's `app.command('/name')`. Slack slash commands must be reimplemented using one of three Teams patterns: text pattern matching, messaging extensions, or manifest - Network accessline 10
2. The most direct migration path is **text pattern matching** with `app.message(regex)` in the Teams SDK. Map `app.command('/help')` to `app.message(/^\/?help$/i)`. The leading `/?` makes the slash optional so users can type either "help" - Network accessline 10
2. The most direct migration path is **text pattern matching** with `app.message(regex)` in the Teams SDK. Map `app.command('/help')` to `app.message(/^\/?help$/i)`. The leading `/?` makes the slash optional so users can type either "help" - Network accessline 11
3. Remove all `ack()` calls when migrating to Teams. Teams handlers do not require acknowledgement -- simply process the request and respond. The `ack` concept does not exist in the Teams SDK. [github.com/microsoft/teams.ts](https://github. - Network accessline 11
3. Remove all `ack()` calls when migrating to Teams. Teams handlers do not require acknowledgement -- simply process the request and respond. The `ack` concept does not exist in the Teams SDK. [github.com/microsoft/teams.ts](https://github. - Network accessline 12
4. Replace Slack's `respond()` (response_url) and `say()` with the Teams context methods `send()` (new message) and `reply()` (threaded reply). There is no Teams equivalent of Slack's ephemeral response -- all bot messages are visible to pa - Network accessline 12
4. Replace Slack's `respond()` (response_url) and `say()` with the Teams context methods `send()` (new message) and `reply()` (threaded reply). There is no Teams equivalent of Slack's ephemeral response -- all bot messages are visible to pa - Network accessline 13
5. Slack's `trigger_id` for opening modals has no direct Teams equivalent. Instead, send an Adaptive Card with form inputs inline, or use a Task Module (dialog) opened via `dialog.open` handler. Task modules do not require a trigger_id -- t - Network accessline 13
5. Slack's `trigger_id` for opening modals has no direct Teams equivalent. Instead, send an Adaptive Card with form inputs inline, or use a Task Module (dialog) opened via `dialog.open` handler. Task modules do not require a trigger_id -- t - Network accessline 14
6. For command **discoverability**, add entries to the `commands` array in the manifest's `bots` section. These appear as suggestions when users type in the bot's compose box. They are UI hints only -- the bot still receives the text as a r - Network accessline 14
6. For command **discoverability**, add entries to the `commands` array in the manifest's `bots` section. These appear as suggestions when users type in the bot's compose box. They are UI hints only -- the bot still receives the text as a r - Network accessline 15
7. For a richer command UX, use **messaging extensions** (`composeExtensions` in manifest). Search-based extensions let users query and insert results; action-based extensions open a task module form. These replace complex slash commands th - Network accessline 15
7. For a richer command UX, use **messaging extensions** (`composeExtensions` in manifest). Search-based extensions let users query and insert results; action-based extensions open a task module form. These replace complex slash commands th - Network accessline 16
8. Slack's `command.text` (the argument string) maps to parsing `activity.text` in Teams. Strip the bot @mention prefix first (set `activity.mentions.stripText: true` in App options), then parse the remaining text for arguments. [github.com - Network accessline 16
8. Slack's `command.text` (the argument string) maps to parsing `activity.text` in Teams. Strip the bot @mention prefix first (set `activity.mentions.stripText: true` in App options), then parse the remaining text for arguments. [github.com - Network accessline 17
9. Slack's `command.user_id` maps to `activity.from.aadObjectId` (Azure AD Object ID) in Teams. Slack's `command.channel_id` maps to `activity.conversation.id`. These IDs have completely different formats and are not interchangeable. [learn - Network accessline 17
9. Slack's `command.user_id` maps to `activity.from.aadObjectId` (Azure AD Object ID) in Teams. Slack's `command.channel_id` maps to `activity.conversation.id`. These IDs have completely different formats and are not interchangeable. [learn - Network accessline 18
10. In Teams channels, bots only receive messages when @mentioned (unless configured otherwise via RSC permissions). Slash commands in Slack work without mention. Account for this UX difference by instructing users to @mention the bot or by - Network accessline 18
10. In Teams channels, bots only receive messages when @mentioned (unless configured otherwise via RSC permissions). Slash commands in Slack work without mention. Account for this UX difference by instructing users to @mention the bot or by - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Access to secretsline 192
[Credential-related source omitted] - Access to secretsline 192
[Credential-related source omitted] - Network accessline 393
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots - Network accessline 393
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots - Network accessline 394
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/create-a-bot-commands-menu - Network accessline 394
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/create-a-bot-commands-menu - Network accessline 395
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions - Network accessline 395
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions - Network accessline 396
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/what-are-task-modules - Network accessline 396
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/what-are-task-modules - Network accessline 397
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-and-group-conversations - Network accessline 397
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-and-group-conversations - Network accessline 398
- https://github.com/microsoft/teams.ts - Network accessline 398
- https://github.com/microsoft/teams.ts - Network accessline 399
- https://slack.dev/bolt-js/concepts/commands - Network accessline 399
- https://slack.dev/bolt-js/concepts/commands - Network accessline 400
- https://api.slack.com/interactivity/slash-commands - Network accessline 400
- https://api.slack.com/interactivity/slash-commands
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/cross-platform-advisor-ts.md
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/cross-platform-architecture-ts.md
- Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Network accessline 151
- Bolt.js `ExpressReceiver`: https://slack.dev/bolt-js/concepts/custom-routes - Network accessline 151
- Bolt.js `ExpressReceiver`: https://slack.dev/bolt-js/concepts/custom-routes - Network accessline 151
- Bolt.js `ExpressReceiver`: https://slack.dev/bolt-js/concepts/custom-routes - Network accessline 152
- Bot Framework `CloudAdapter`: https://learn.microsoft.com/en-us/javascript/api/botbuilder/cloudadapter - Network accessline 152
- Bot Framework `CloudAdapter`: https://learn.microsoft.com/en-us/javascript/api/botbuilder/cloudadapter - Network accessline 152
- Bot Framework `CloudAdapter`: https://learn.microsoft.com/en-us/javascript/api/botbuilder/cloudadapter - Network accessline 153
- Express 5: https://expressjs.com/en/5x/api.html - Network accessline 153
- Express 5: https://expressjs.com/en/5x/api.html - Network accessline 153
- Express 5: https://expressjs.com/en/5x/api.html
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/events-activities-ts.md
- Network accessline 9
1. Slack's `app.event('event_name')` maps to Teams' `app.on('route_name')` pattern. The event names and payload shapes are completely different between the two platforms. Always consult the mapping table below for the correct Teams route. [ - Network accessline 9
1. Slack's `app.event('event_name')` maps to Teams' `app.on('route_name')` pattern. The event names and payload shapes are completely different between the two platforms. Always consult the mapping table below for the correct Teams route. [ - Network accessline 10
2. Slack's `app.message(pattern)` maps directly to Teams' `app.message(pattern)` for pattern-matched messages. For a catch-all, Slack uses `app.message(async ...)` while Teams uses `app.on('message', async ...)`. [github.com/microsoft/teams - Network accessline 10
2. Slack's `app.message(pattern)` maps directly to Teams' `app.message(pattern)` for pattern-matched messages. For a catch-all, Slack uses `app.message(async ...)` while Teams uses `app.on('message', async ...)`. [github.com/microsoft/teams - Network accessline 11
3. Slack's `app.event('app_mention')` has no dedicated Teams route. In Teams channels, bots receive messages only when @mentioned, so the standard `app.on('message')` handler already implies a mention context. Check `activity.entities` for - Network accessline 11
3. Slack's `app.event('app_mention')` has no dedicated Teams route. In Teams channels, bots receive messages only when @mentioned, so the standard `app.on('message')` handler already implies a mention context. Check `activity.entities` for - Network accessline 12
4. Slack's `app.event('member_joined_channel')` and `app.event('member_left_channel')` map to Teams' `app.on('conversationUpdate')` with inspection of `activity.membersAdded` or `activity.membersRemoved` arrays. [learn.microsoft.com -- conv - Network accessline 12
4. Slack's `app.event('member_joined_channel')` and `app.event('member_left_channel')` map to Teams' `app.on('conversationUpdate')` with inspection of `activity.membersAdded` or `activity.membersRemoved` arrays. [learn.microsoft.com -- conv - Network accessline 13
5. Slack's `say()` maps to Teams' `send()` for posting a new message. Slack's threaded replies via `say({ thread_ts })` map to Teams' `reply()` method which uses `replyToId` internally for threaded conversation. [github.com/microsoft/teams. - Network accessline 13
5. Slack's `say()` maps to Teams' `send()` for posting a new message. Slack's threaded replies via `say({ thread_ts })` map to Teams' `reply()` method which uses `replyToId` internally for threaded conversation. [github.com/microsoft/teams. - Network accessline 14
6. Slack's `app.event('reaction_added')` and `app.event('reaction_removed')` map to Teams' `app.on('messageReaction')` route. Teams delivers both added and removed reactions in a single route -- inspect `activity.reactionsAdded` and `activi - Network accessline 14
6. Slack's `app.event('reaction_added')` and `app.event('reaction_removed')` map to Teams' `app.on('messageReaction')` route. Teams delivers both added and removed reactions in a single route -- inspect `activity.reactionsAdded` and `activi - Network accessline 15
7. Slack's ephemeral messages (`respond({ response_type: 'ephemeral' })`) have **no Teams equivalent**. Redesign ephemeral responses as: (a) messages in personal (1:1) chat, (b) Adaptive Cards with user-specific `Action.Execute` refresh, or - Network accessline 15
7. Slack's ephemeral messages (`respond({ response_type: 'ephemeral' })`) have **no Teams equivalent**. Redesign ephemeral responses as: (a) messages in personal (1:1) chat, (b) Adaptive Cards with user-specific `Action.Execute` refresh, or - Network accessline 16
8. In Teams channels, bots require @mention to receive messages (default behavior). This is fundamentally different from Slack where bots receive all channel messages. To receive all messages without mention, the app must request Resource-S - Network accessline 16
8. In Teams channels, bots require @mention to receive messages (default behavior). This is fundamentally different from Slack where bots receive all channel messages. To receive all messages without mention, the app must request Resource-S - Network accessline 17
9. Slack's `app.event('app_home_opened')` (App Home tab) maps to Teams' static tab or `tab.open` invoke route for personal tabs. There is no direct equivalent -- Teams tabs are web pages rendered in an iframe, not bot-driven views. [learn.m - Network accessline 17
9. Slack's `app.event('app_home_opened')` (App Home tab) maps to Teams' static tab or `tab.open` invoke route for personal tabs. There is no direct equivalent -- Teams tabs are web pages rendered in an iframe, not bot-driven views. [learn.m - Network accessline 18
10. Teams provides install/uninstall events via `app.on('install.add')` and `app.on('install.remove')` which have no direct Slack equivalent. Use these to send welcome messages and store conversation references for proactive messaging. [git - Network accessline 18
10. Teams provides install/uninstall events via `app.on('install.add')` and `app.on('install.remove')` which have no direct Slack equivalent. Use these to send welcome messages and store conversation references for proactive messaging. [git - Network accessline 19
11. **Teams has only 6 reaction types** (`like`, `heart`, `laugh`, `surprised`, `sad`, `angry`) — Slack supports unlimited custom emoji reactions. Bots that use reactions as workflow triggers (e.g., `:white_check_mark:` to mark approved, `: - Network accessline 19
11. **Teams has only 6 reaction types** (`like`, `heart`, `laugh`, `surprised`, `sad`, `angry`) — Slack supports unlimited custom emoji reactions. Bots that use reactions as workflow triggers (e.g., `:white_check_mark:` to mark approved, `: - Network accessline 20
12. **Threading model differs significantly.** Slack uses `thread_ts` to identify a parent message and `reply_broadcast` to also post a thread reply to the channel. Teams uses `replyToId` in the activity and the `reply()` method. There is * - Network accessline 20
12. **Threading model differs significantly.** Slack uses `thread_ts` to identify a parent message and `reply_broadcast` to also post a thread reply to the channel. Teams uses `replyToId` in the activity and the `reply()` method. There is * - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Network accessline 395
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/subscribe-to-conversation-events - Network accessline 395
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/subscribe-to-conversation-events - Network accessline 396
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-and-group-conversations - Network accessline 396
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-and-group-conversations - Network accessline 397
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/conversation-basics - Network accessline 397
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/conversation-basics - Network accessline 398
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 398
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 399
- https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent - Network accessline 399
- https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent - Network accessline 400
- https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs - Network accessline 400
- https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs - Network accessline 401
- https://github.com/microsoft/teams.ts - Network accessline 401
- https://github.com/microsoft/teams.ts - Network accessline 402
- https://slack.dev/bolt-js/concepts/events - Network accessline 402
- https://slack.dev/bolt-js/concepts/events - Network accessline 403
- https://slack.dev/bolt-js/concepts/message-listening - Network accessline 403
- https://slack.dev/bolt-js/concepts/message-listening
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/files-upload-download-ts.md
- Network accessline 9
1. **Slack `files.upload` → Teams FileConsentCard + Graph API upload.** Slack bots upload files directly via `files.upload`. Teams bots cannot directly attach files to messages. Instead: (a) send a FileConsentCard asking the user for upload - Network accessline 9
1. **Slack `files.upload` → Teams FileConsentCard + Graph API upload.** Slack bots upload files directly via `files.upload`. Teams bots cannot directly attach files to messages. Instead: (a) send a FileConsentCard asking the user for upload - Network accessline 10
2. **The `supportsFiles: true` manifest flag is required.** Without `"supportsFiles": true` in the bot's manifest entry, Teams will not show file consent cards or allow the bot to handle file-related activities. This flag only works in pers - Network accessline 10
2. **The `supportsFiles: true` manifest flag is required.** Without `"supportsFiles": true` in the bot's manifest entry, Teams will not show file consent cards or allow the bot to handle file-related activities. This flag only works in pers - Network accessline 11
3. **Slack `files.sharedPublicURL` → Graph API `createLink` sharing link.** Slack creates a public URL for a file. In Teams/OneDrive, use the Graph API `POST /drives/{drive-id}/items/{item-id}/createLink` to create a sharing link with the d - Network accessline 11
3. **Slack `files.sharedPublicURL` → Graph API `createLink` sharing link.** Slack creates a public URL for a file. In Teams/OneDrive, use the Graph API `POST /drives/{drive-id}/items/{item-id}/createLink` to create a sharing link with the d - Network accessline 12
4. **Slack file events (`file_shared`, `file_created`) → `activity.attachments` in message handler.** When a user sends a file to a Teams bot, the file appears as an attachment on the incoming message activity. Check `activity.attachments` - Network accessline 12
4. **Slack file events (`file_shared`, `file_created`) → `activity.attachments` in message handler.** When a user sends a file to a Teams bot, the file appears as an attachment on the incoming message activity. Check `activity.attachments` - Network accessline 13
5. **Download user-uploaded files via the `downloadUrl` in the attachment.** Each file attachment includes a `content.downloadUrl` with a pre-authenticated URL. Use `fetch()` or `axios` to download the file content. The URL is short-lived — - Network accessline 13
5. **Download user-uploaded files via the `downloadUrl` in the attachment.** Each file attachment includes a `content.downloadUrl` with a pre-authenticated URL. Use `fetch()` or `axios` to download the file content. The URL is short-lived — - Network accessline 14
6. **File upload in channels requires SharePoint, not OneDrive.** In personal chat, files go to the user's OneDrive. In channels, files go to the team's SharePoint document library. The Graph API path changes: `POST /drives/{drive-id}/root: - Network accessline 14
6. **File upload in channels requires SharePoint, not OneDrive.** In personal chat, files go to the user's OneDrive. In channels, files go to the team's SharePoint document library. The Graph API path changes: `POST /drives/{drive-id}/root: - Network accessline 15
7. **Large files (>4 MB) require Graph resumable upload sessions.** Small files can use simple PUT to Graph API. Files larger than 4 MB must use a resumable upload session: `POST /drives/{drive-id}/items/{parent-id}:/filename:/createUploadS - Network accessline 15
7. **Large files (>4 MB) require Graph resumable upload sessions.** Small files can use simple PUT to Graph API. Files larger than 4 MB must use a resumable upload session: `POST /drives/{drive-id}/items/{parent-id}:/filename:/createUploadS - Network accessline 16
8. **FileConsentCard flow is a 3-step protocol.** Step 1: Bot sends a FileConsentCard with filename and size. Step 2: User accepts or declines. Step 3: On accept, Teams sends a `fileConsent/invoke` activity with an `uploadInfo` containing t - Network accessline 16
8. **FileConsentCard flow is a 3-step protocol.** Step 1: Bot sends a FileConsentCard with filename and size. Step 2: User accepts or declines. Step 3: On accept, Teams sends a `fileConsent/invoke` activity with an `uploadInfo` containing t - Network accessline 17
9. **Slack `files.list` / `files.info` → Graph API drive item queries.** Slack has dedicated file listing APIs. In Teams, files are stored in OneDrive/SharePoint. Use Graph API: `GET /drives/{drive-id}/root/children` to list files, `GET /dr - Network accessline 17
9. **Slack `files.list` / `files.info` → Graph API drive item queries.** Slack has dedicated file listing APIs. In Teams, files are stored in OneDrive/SharePoint. Use Graph API: `GET /drives/{drive-id}/root/children` to list files, `GET /dr - Network accessline 18
10. **File handling only works in personal (1:1) chat scope.** The `supportsFiles` manifest flag and FileConsentCard only work in personal bot conversations. For channel file operations, use Graph API directly without the consent card flow. - Network accessline 18
10. **File handling only works in personal (1:1) chat scope.** The `supportsFiles` manifest flag and FileConsentCard only work in personal bot conversations. For channel file operations, use Graph API directly without the consent card flow. - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 98
if (uploadInfo && fileContent) { // Upload to OneDrive via the pre-signed URL await fetch(uploadInfo.uploadUrl, { - Network accessline 98
if (uploadInfo && fileContent) { // Upload to OneDrive via the pre-signed URL await fetch(uploadInfo.uploadUrl, { - Network accessline 99
// Upload to OneDrive via the pre-signed URL await fetch(uploadInfo.uploadUrl, { method: "PUT", - Network accessline 99
// Upload to OneDrive via the pre-signed URL await fetch(uploadInfo.uploadUrl, { method: "PUT", - Network accessline 100
await fetch(uploadInfo.uploadUrl, { - Network accessline 100
await fetch(uploadInfo.uploadUrl, { - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Network accessline 149
// Download file content using the private URL + bot token const response = await fetch(file.url_private!, { - Network accessline 149
// Download file content using the private URL + bot token const response = await fetch(file.url_private!, { - Network accessline 150
const response = await fetch(file.url_private!, { - Network accessline 150
const response = await fetch(file.url_private!, { - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Network accessline 185
if (downloadUrl) { // Download using the pre-authenticated URL (no token needed) const response = await fetch(downloadUrl); - Network accessline 185
if (downloadUrl) { // Download using the pre-authenticated URL (no token needed) const response = await fetch(downloadUrl); - Network accessline 186
// Download using the pre-authenticated URL (no token needed) const response = await fetch(downloadUrl); const content = await response.text(); - Network accessline 186
// Download using the pre-authenticated URL (no token needed) const response = await fetch(downloadUrl); const content = await response.text(); - Network accessline 187
const response = await fetch(downloadUrl); - Network accessline 187
const response = await fetch(downloadUrl); - Network accessline 256
const chunk = content.subarray(offset, offset + chunkSize); const end = Math.min(offset + chunkSize, content.length); await fetch(session.uploadUrl, { - Network accessline 256
const chunk = content.subarray(offset, offset + chunkSize); const end = Math.min(offset + chunkSize, content.length); await fetch(session.uploadUrl, { - Network accessline 257
const end = Math.min(offset + chunkSize, content.length); await fetch(session.uploadUrl, { method: "PUT", - Network accessline 257
const end = Math.min(offset + chunkSize, content.length); await fetch(session.uploadUrl, { method: "PUT", - Network accessline 258
await fetch(session.uploadUrl, { - Network accessline 258
await fetch(session.uploadUrl, { - Network accessline 315
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4 - Network accessline 315
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4 - Network accessline 316
- https://learn.microsoft.com/en-us/graph/api/driveitem-put-content - Network accessline 316
- https://learn.microsoft.com/en-us/graph/api/driveitem-put-content - Network accessline 317
- https://learn.microsoft.com/en-us/graph/api/driveitem-createuploadsession - Network accessline 317
- https://learn.microsoft.com/en-us/graph/api/driveitem-createuploadsession - Network accessline 318
- https://learn.microsoft.com/en-us/graph/api/driveitem-createlink - Network accessline 318
- https://learn.microsoft.com/en-us/graph/api/driveitem-createlink - Network accessline 319
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#bots - Network accessline 319
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#bots - Network accessline 320
- https://github.com/microsoft/teams.ts - Network accessline 320
- https://github.com/microsoft/teams.ts - Network accessline 321
- https://api.slack.com/methods/files.uploadV2 — Slack files.upload - Network accessline 321
- https://api.slack.com/methods/files.uploadV2 — Slack files.upload - Network accessline 322
- https://api.slack.com/methods/files.sharedPublicURL — Slack file sharing - Network accessline 322
- https://api.slack.com/methods/files.sharedPublicURL — Slack file sharing
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/identity-oauth-bridge-ts.md
- Network accessline 9
1. Slack uses proprietary ID formats: user IDs start with `U` (e.g., `U01ABCDEF`), channel IDs start with `C` (e.g., `C02GHIJKL`), team/workspace IDs start with `T` (e.g., `T03MNOPQR`), and bot IDs start with `B`. These IDs have no relation - Network accessline 9
1. Slack uses proprietary ID formats: user IDs start with `U` (e.g., `U01ABCDEF`), channel IDs start with `C` (e.g., `C02GHIJKL`), team/workspace IDs start with `T` (e.g., `T03MNOPQR`), and bot IDs start with `B`. These IDs have no relation - Network accessline 10
2. Teams identifies users by Azure AD Object ID (a GUID like `00000000-0000-0000-0000-000000000000`), available at `activity.from.aadObjectId`. Conversation IDs are opaque strings like `19:abc123@thread.v2` for channels or `a]concat@...` fo - Network accessline 10
2. Teams identifies users by Azure AD Object ID (a GUID like `00000000-0000-0000-0000-000000000000`), available at `activity.from.aadObjectId`. Conversation IDs are opaque strings like `19:abc123@thread.v2` for channels or `a]concat@...` fo - Network accessline 11
3. Slack's request verification via `signingSecret` (HMAC-SHA256 of request body) is replaced by **Bot Framework JWT token validation** in Teams. The Teams SDK handles JWT validation automatically -- no manual signing secret check is needed - Network accessline 11
3. Slack's request verification via `signingSecret` (HMAC-SHA256 of request body) is replaced by **Bot Framework JWT token validation** in Teams. The Teams SDK handles JWT validation automatically -- no manual signing secret check is needed - Network accessline 12
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Network accessline 13
5. Slack OAuth scopes (e.g., `chat:write`, `users:read`, `commands`) map to **Azure AD permissions** for the Microsoft Graph API (e.g., `User.Read`, `ChannelMessage.Send`). Slack scopes are configured in the Slack app dashboard; Azure AD pe - Network accessline 13
5. Slack OAuth scopes (e.g., `chat:write`, `users:read`, `commands`) map to **Azure AD permissions** for the Microsoft Graph API (e.g., `User.Read`, `ChannelMessage.Send`). Slack scopes are configured in the Slack app dashboard; Azure AD pe - Network accessline 14
6. Slack user tokens (obtained via OAuth `users:read` or user token grant) map to **Teams SSO / OAuth card flow**. In Teams, configure an OAuth connection in the Azure Bot resource, then use `isSignedIn` / `signin()` / `userGraph` in handle - Network accessline 14
6. Slack user tokens (obtained via OAuth `users:read` or user token grant) map to **Teams SSO / OAuth card flow**. In Teams, configure an OAuth connection in the Azure Bot resource, then use `isSignedIn` / `signin()` / `userGraph` in handle - Network accessline 15
7. To resolve user identity across platforms during migration, use a **shared attribute** like email address. Query Slack's `users.info` API for the user's email, then look up the same email in Azure AD via Microsoft Graph `users?$filter=ma - Network accessline 15
7. To resolve user identity across platforms during migration, use a **shared attribute** like email address. Query Slack's `users.info` API for the user's email, then look up the same email in Azure AD via Microsoft Graph `users?$filter=ma - Network accessline 16
8. Any data stored with Slack IDs as keys (user preferences, conversation history, permissions) must be **re-keyed** to Teams/AAD IDs. Plan a data migration step that uses the email-based mapping table to translate stored Slack user IDs to - Network accessline 16
8. Any data stored with Slack IDs as keys (user preferences, conversation history, permissions) must be **re-keyed** to Teams/AAD IDs. Plan a data migration step that uses the email-based mapping table to translate stored Slack user IDs to - Network accessline 17
9. Slack workspace-level operations (e.g., listing all users via `users.list`, posting to any channel) require bot scopes. In Teams, equivalent operations use Microsoft Graph with **application permissions** (consented by a tenant admin). U - Network accessline 17
9. Slack workspace-level operations (e.g., listing all users via `users.list`, posting to any channel) require bot scopes. In Teams, equivalent operations use Microsoft Graph with **application permissions** (consented by a tenant admin). U - Network accessline 18
10. Teams supports **managed identity** as an alternative to client secret for production deployments on Azure. Set `managedIdentityClientId: 'system'` in App options to use Azure Managed Identity instead of storing secrets in environment v - Network accessline 18
10. Teams supports **managed identity** as an alternative to client secret for production deployments on Azure. Set `managedIdentityClientId: 'system'` in App options to use Azure Managed Identity instead of storing secrets in environment v - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 244
[Credential-related source omitted] - Access to secretsline 244
[Credential-related source omitted] - Access to secretsline 245
[Credential-related source omitted] - Access to secretsline 245
[Credential-related source omitted] - Network accessline 246
.oAuthInstallPath("/slack/install") .oAuthRedirectUriPath("/slack/oauth_redirect") .oAuthCompletionUrl("https://example.com/success") - Network accessline 246
.oAuthInstallPath("/slack/install") .oAuthRedirectUriPath("/slack/oauth_redirect") .oAuthCompletionUrl("https://example.com/success") - Network accessline 247
.oAuthRedirectUriPath("/slack/oauth_redirect") .oAuthCompletionUrl("https://example.com/success") .oAuthCancellationUrl("https://example.com/cancel") - Network accessline 247
.oAuthRedirectUriPath("/slack/oauth_redirect") .oAuthCompletionUrl("https://example.com/success") .oAuthCancellationUrl("https://example.com/cancel") - Network accessline 248
.oAuthCompletionUrl("https://example.com/success") - Network accessline 248
.oAuthCompletionUrl("https://example.com/success") - Network accessline 249
.oAuthCancellationUrl("https://example.com/cancel") - Network accessline 249
.oAuthCancellationUrl("https://example.com/cancel") - Access to secretsline 264
[Credential-related source omitted] - Access to secretsline 264
[Credential-related source omitted] - Access to secretsline 313
[Credential-related source omitted] - Access to secretsline 313
[Credential-related source omitted] - Network accessline 335
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication - Network accessline 335
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication - Network accessline 336
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration - Network accessline 336
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration - Network accessline 337
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/bot-sso-overview - Network accessline 337
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/bot-sso-overview - Network accessline 338
- https://learn.microsoft.com/en-us/graph/permissions-reference - Network accessline 338
- https://learn.microsoft.com/en-us/graph/permissions-reference - Network accessline 339
- https://learn.microsoft.com/en-us/graph/api/user-list - Network accessline 339
- https://learn.microsoft.com/en-us/graph/api/user-list - Network accessline 340
- https://learn.microsoft.com/en-us/graph/auth/auth-concepts - Network accessline 340
- https://learn.microsoft.com/en-us/graph/auth/auth-concepts - Network accessline 341
- https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview - Network accessline 341
- https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview - Network accessline 342
- https://api.slack.com/types - Network accessline 342
- https://api.slack.com/types - Network accessline 343
- https://api.slack.com/methods/users.info - Network accessline 343
- https://api.slack.com/methods/users.info - Network accessline 344
- https://github.com/microsoft/teams.ts - Network accessline 344
- https://github.com/microsoft/teams.ts - Access to secretsline 348
[Credential-related source omitted] - Access to secretsline 348
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/infra-compute-ts.md
- Network accessline 11
1. Map AWS compute services to Azure equivalents using this decision matrix: Lambda + API Gateway maps to Azure Functions (Consumption or Premium), ECS/Fargate maps to Azure Container Apps, EC2 maps to Azure App Service (or Azure VMs for li - Network accessline 11
1. Map AWS compute services to Azure equivalents using this decision matrix: Lambda + API Gateway maps to Azure Functions (Consumption or Premium), ECS/Fargate maps to Azure Container Apps, EC2 maps to Azure App Service (or Azure VMs for li - Network accessline 12
2. Teams bots require an HTTPS endpoint at `/api/messages` that accepts POST requests from the Bot Framework. Azure App Service and Container Apps provide this natively; Azure Functions requires an HTTP-triggered function bound to that rout - Network accessline 12
2. Teams bots require an HTTPS endpoint at `/api/messages` that accepts POST requests from the Bot Framework. Azure App Service and Container Apps provide this natively; Azure Functions requires an HTTP-triggered function bound to that rout - Network accessline 13
3. Teams expects bot responses within 3 seconds for synchronous invoke activities (card actions, dialogs, message extensions). Azure Functions Consumption plan cold starts (5-10 seconds for Node.js) will violate this. Use the Premium plan ( - Network accessline 13
3. Teams expects bot responses within 3 seconds for synchronous invoke activities (card actions, dialogs, message extensions). Azure Functions Consumption plan cold starts (5-10 seconds for Node.js) will violate this. Use the Premium plan ( - Network accessline 14
4. Enable "Always On" for Azure App Service deployments to prevent the app from unloading after idle periods. Without it, the first request after idle triggers a cold start that can cause Teams timeouts. Set this in Configuration > General - Network accessline 14
4. Enable "Always On" for Azure App Service deployments to prevent the app from unloading after idle periods. Without it, the first request after idle triggers a cold start that can cause Teams timeouts. Set this in Configuration > General - Network accessline 15
5. Use Node.js 20 LTS or later as the runtime stack. Set this explicitly in App Service (Configuration > General Settings > Stack: Node, Version: 20-lts) or in the Azure Functions `host.json` and app settings. The Teams AI Library v2 requir - Network accessline 15
5. Use Node.js 20 LTS or later as the runtime stack. Set this explicitly in App Service (Configuration > General Settings > Stack: Node, Version: 20-lts) or in the Azure Functions `host.json` and app settings. The Teams AI Library v2 requir - Network accessline 16
6. Migrate environment variables from AWS Lambda environment / SSM to Azure App Settings. App Settings are injected as `process.env` variables at runtime, equivalent to Lambda environment variables. Use deployment slots for staging/producti - Network accessline 16
6. Migrate environment variables from AWS Lambda environment / SSM to Azure App Settings. App Settings are injected as `process.env` variables at runtime, equivalent to Lambda environment variables. Use deployment slots for staging/producti - Network accessline 17
7. Configure health check endpoints for all Azure compute targets. App Service supports built-in health checks (Configuration > Health check path: `/api/health`). Container Apps use liveness and readiness probes. This replaces Lambda/ECS he - Network accessline 17
7. Configure health check endpoints for all Azure compute targets. App Service supports built-in health checks (Configuration > Health check path: `/api/health`). Container Apps use liveness and readiness probes. This replaces Lambda/ECS he - Network accessline 18
8. For streaming and WebSocket scenarios (e.g., AI streaming responses via `stream.emit()`), use App Service or Container Apps with WebSocket support enabled. Azure Functions Consumption plan does not support WebSockets. Enable WebSockets i - Network accessline 18
8. For streaming and WebSocket scenarios (e.g., AI streaming responses via `stream.emit()`), use App Service or Container Apps with WebSocket support enabled. Azure Functions Consumption plan does not support WebSockets. Enable WebSockets i - Network accessline 19
9. Use deployment slots in App Service for zero-downtime deployments, replacing blue/green patterns built with Lambda aliases/versions or ECS rolling updates. Swap staging to production after validation. [learn.microsoft.com -- Deployment s - Network accessline 19
9. Use deployment slots in App Service for zero-downtime deployments, replacing blue/green patterns built with Lambda aliases/versions or ECS rolling updates. Swap staging to production after validation. [learn.microsoft.com -- Deployment s - Network accessline 20
10. For complex multi-container deployments (previously ECS task definitions with sidecars), use Azure Container Apps with multiple containers per revision, or Azure Kubernetes Service for full orchestration control. Container Apps supports - Network accessline 20
10. For complex multi-container deployments (previously ECS task definitions with sidecars), use Azure Container Apps with multiple containers per revision, or Azure Kubernetes Service for full orchestration control. Container Apps supports - Network accessline 21
11. **Azure Functions Premium "Always Ready" instances eliminate cold starts.** Set `WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT` to cap horizontal scaling, and configure `alwaysReady` in the Premium plan to keep N instances warm. This is the - Network accessline 21
11. **Azure Functions Premium "Always Ready" instances eliminate cold starts.** Set `WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT` to cap horizontal scaling, and configure `alwaysReady` in the Premium plan to keep N instances warm. This is the - Network accessline 22
12. **Container Apps with Dapr sidecars replaces ECS multi-container patterns.** ECS task definitions with multiple containers (app + sidecar) map to Container Apps revisions with Dapr enabled. Dapr provides service-to-service invocation, s - Network accessline 22
12. **Container Apps with Dapr sidecars replaces ECS multi-container patterns.** ECS task definitions with multiple containers (app + sidecar) map to Container Apps revisions with Dapr enabled. Dapr provides service-to-service invocation, s - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Network accessline 178
// Invoke another Container App by its Dapr app ID // Replaces: http://service-name.local:3000/api/data (ECS service discovery) - Network accessline 178
// Invoke another Container App by its Dapr app ID // Replaces: http://service-name.local:3000/api/data (ECS service discovery) - Network accessline 179
// Replaces: http://service-name.local:3000/api/data (ECS service discovery) - Network accessline 179
// Replaces: http://service-name.local:3000/api/data (ECS service discovery) - Network accessline 193
- **Forgetting Always On**: App Service without Always On unloads the app after ~20 minutes idle. The next incoming Teams message triggers a full restart, causing timeout errors. Always enable Always On for bot workloads. - **Port mismatch* - Network accessline 193
- **Forgetting Always On**: App Service without Always On unloads the app after ~20 minutes idle. The next incoming Teams message triggers a full restart, causing timeout errors. Always enable Always On for bot workloads. - **Port mismatch* - Network accessline 194
- **Port mismatch**: Azure App Service expects the app to listen on `process.env.PORT` (defaults to `8080`), not the Teams default of `3978`. Set `PORT` in App Settings or update `app.start(process.env.PORT || 8080)` for App Service deploym - Network accessline 194
- **Port mismatch**: Azure App Service expects the app to listen on `process.env.PORT` (defaults to `8080`), not the Teams default of `3978`. Set `PORT` in App Settings or update `app.start(process.env.PORT || 8080)` for App Service deploym - Network accessline 195
- **Missing /api/messages route**: The Azure Bot registration messaging endpoint must point to `https://your-app.azurewebsites.net/api/messages`. If the Teams app listens on a different path, update the Bot registration accordingly. - Network accessline 195
- **Missing /api/messages route**: The Azure Bot registration messaging endpoint must point to `https://your-app.azurewebsites.net/api/messages`. If the Teams app listens on a different path, update the Bot registration accordingly. - Network accessline 204
- [Azure App Service overview](https://learn.microsoft.com/en-us/azure/app-service/overview) - Network accessline 204
- [Azure App Service overview](https://learn.microsoft.com/en-us/azure/app-service/overview) - Network accessline 205
- [Azure Functions Node.js developer guide](https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-node) - Network accessline 205
- [Azure Functions Node.js developer guide](https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-node) - Network accessline 206
- [Azure Container Apps overview](https://learn.microsoft.com/en-us/azure/container-apps/overview) - Network accessline 206
- [Azure Container Apps overview](https://learn.microsoft.com/en-us/azure/container-apps/overview) - Network accessline 207
- [Azure Functions Premium plan](https://learn.microsoft.com/en-us/azure/azure-functions/functions-premium-plan) - Network accessline 207
- [Azure Functions Premium plan](https://learn.microsoft.com/en-us/azure/azure-functions/functions-premium-plan) - Network accessline 208
- [Deploy a bot to Azure](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-deploy-az-cli) - Network accessline 208
- [Deploy a bot to Azure](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-deploy-az-cli) - Network accessline 209
- [Azure App Service deployment slots](https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots) - Network accessline 209
- [Azure App Service deployment slots](https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots) - Network accessline 210
- [Configure Node.js apps for App Service](https://learn.microsoft.com/en-us/azure/app-service/configure-language-nodejs) - Network accessline 210
- [Configure Node.js apps for App Service](https://learn.microsoft.com/en-us/azure/app-service/configure-language-nodejs) - Network accessline 211
- [AWS to Azure services comparison](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services) - Network accessline 211
- [AWS to Azure services comparison](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/infra-observability-ts.md
- Network accessline 11
1. Map CloudWatch Logs to Application Insights and Log Analytics. Application Insights provides structured telemetry (requests, dependencies, exceptions, traces) while Log Analytics is the query engine (KQL) for exploring that data. Both re - Network accessline 11
1. Map CloudWatch Logs to Application Insights and Log Analytics. Application Insights provides structured telemetry (requests, dependencies, exceptions, traces) while Log Analytics is the query engine (KQL) for exploring that data. Both re - Network accessline 12
2. Instrument Node.js Teams bots with the `applicationinsights` npm package. Call `setup()` and `start()` before any other imports to enable automatic dependency tracking, request correlation, and exception capture. This replaces AWS X-Ray - Network accessline 12
2. Instrument Node.js Teams bots with the `applicationinsights` npm package. Call `setup()` and `start()` before any other imports to enable automatic dependency tracking, request correlation, and exception capture. This replaces AWS X-Ray - Network accessline 13
3. Map CloudWatch Metrics to Azure Monitor Metrics. Custom metrics sent via `trackMetric()` in Application Insights appear in Azure Monitor Metrics Explorer, replacing CloudWatch custom metrics and `putMetricData` calls. [learn.microsoft.co - Network accessline 13
3. Map CloudWatch Metrics to Azure Monitor Metrics. Custom metrics sent via `trackMetric()` in Application Insights appear in Azure Monitor Metrics Explorer, replacing CloudWatch custom metrics and `putMetricData` calls. [learn.microsoft.co - Network accessline 14
4. Map CloudWatch Alarms to Azure Monitor Alerts. Create alert rules on Application Insights metrics (response time, failure rate, exception count) or log-based alerts using KQL queries. This replaces CloudWatch Alarm + SNS notification pat - Network accessline 14
4. Map CloudWatch Alarms to Azure Monitor Alerts. Create alert rules on Application Insights metrics (response time, failure rate, exception count) or log-based alerts using KQL queries. This replaces CloudWatch Alarm + SNS notification pat - Network accessline 15
5. Map AWS X-Ray distributed tracing to Application Insights distributed tracing. Application Insights automatically correlates requests across services using operation IDs. The `applicationinsights` SDK propagates trace context headers (`t - Network accessline 15
5. Map AWS X-Ray distributed tracing to Application Insights distributed tracing. Application Insights automatically correlates requests across services using operation IDs. The `applicationinsights` SDK propagates trace context headers (`t - Network accessline 16
6. Integrate with the Teams SDK `ConsoleLogger` by creating a custom logger implementation that forwards to Application Insights. Use `trackTrace()` for log messages, `trackException()` for errors, and `trackEvent()` for business events (bo - Network accessline 16
6. Integrate with the Teams SDK `ConsoleLogger` by creating a custom logger implementation that forwards to Application Insights. Use `trackTrace()` for log messages, `trackException()` for errors, and `trackEvent()` for business events (bo - Network accessline 17
7. Set the Application Insights connection string via the `APPLICATIONINSIGHTS_CONNECTION_STRING` environment variable in App Settings. Do not hardcode connection strings. App Service and Functions have built-in Application Insights integra - Network accessline 17
7. Set the Application Insights connection string via the `APPLICATIONINSIGHTS_CONNECTION_STRING` environment variable in App Settings. Do not hardcode connection strings. App Service and Functions have built-in Application Insights integra - Network accessline 18
8. Use KQL queries in Log Analytics to diagnose bot issues, replacing CloudWatch Logs Insights queries. Query `requests`, `dependencies`, `exceptions`, and `traces` tables. Pin frequently used queries to Azure dashboards for team visibility - Network accessline 18
8. Use KQL queries in Log Analytics to diagnose bot issues, replacing CloudWatch Logs Insights queries. Query `requests`, `dependencies`, `exceptions`, and `traces` tables. Pin frequently used queries to Azure dashboards for team visibility - Network accessline 19
9. Configure sampling to control telemetry volume and cost. Application Insights supports adaptive sampling (automatic) and fixed-rate sampling. For production bots with high message volume, set a sampling percentage to avoid excessive cost - Network accessline 19
9. Configure sampling to control telemetry volume and cost. Application Insights supports adaptive sampling (automatic) and fixed-rate sampling. For production bots with high message volume, set a sampling percentage to avoid excessive cost - Network accessline 20
10. Build Azure dashboards for bot health monitoring, replacing CloudWatch Dashboards. Include panels for request rate, response time (P50/P95/P99), failure rate, active conversations, and AI model latency. Use Application Insights workbook - Network accessline 20
10. Build Azure dashboards for bot health monitoring, replacing CloudWatch Dashboards. Include panels for request rate, response time (P50/P95/P99), failure rate, active conversations, and AI model latency. Use Application Insights workbook - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Network accessline 229
- [Application Insights overview](https://learn.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview) - Network accessline 229
- [Application Insights overview](https://learn.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview) - Network accessline 230
- [Application Insights for Node.js](https://learn.microsoft.com/en-us/azure/azure-monitor/app/nodejs) - Network accessline 230
- [Application Insights for Node.js](https://learn.microsoft.com/en-us/azure/azure-monitor/app/nodejs) - Network accessline 231
- [Application Insights API reference](https://learn.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics) - Network accessline 231
- [Application Insights API reference](https://learn.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics) - Network accessline 232
- [KQL quick reference](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/kql-quick-reference) - Network accessline 232
- [KQL quick reference](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/kql-quick-reference) - Network accessline 233
- [Azure Monitor Alerts](https://learn.microsoft.com/en-us/azure/azure-monitor/alerts/alerts-overview) - Network accessline 233
- [Azure Monitor Alerts](https://learn.microsoft.com/en-us/azure/azure-monitor/alerts/alerts-overview) - Network accessline 234
- [Application Insights sampling](https://learn.microsoft.com/en-us/azure/azure-monitor/app/sampling-classic-api) - Network accessline 234
- [Application Insights sampling](https://learn.microsoft.com/en-us/azure/azure-monitor/app/sampling-classic-api) - Network accessline 235
- [Distributed tracing in Application Insights](https://learn.microsoft.com/en-us/azure/azure-monitor/app/distributed-trace-data) - Network accessline 235
- [Distributed tracing in Application Insights](https://learn.microsoft.com/en-us/azure/azure-monitor/app/distributed-trace-data) - Network accessline 236
- [AWS to Azure services comparison -- Management and monitoring](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services#management-and-monitoring) - Network accessline 236
- [AWS to Azure services comparison -- Management and monitoring](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services#management-and-monitoring)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/infra-secrets-config-ts.md
- Network accessline 11
[Credential-related source omitted] - Network accessline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Network accessline 12
2. Map AWS SSM Parameter Store to Azure App Configuration for non-secret configuration values (feature flags, endpoint URLs, tuning parameters). App Configuration supports key-value pairs, labels for environments, and feature management. Us - Network accessline 12
2. Map AWS SSM Parameter Store to Azure App Configuration for non-secret configuration values (feature flags, endpoint URLs, tuning parameters). App Configuration supports key-value pairs, labels for environments, and feature management. Us - Network accessline 13
3. Use managed identity (system-assigned or user-assigned) to access Key Vault from Azure compute, eliminating the need for Key Vault credentials in code. This replaces IAM role-based access patterns used with AWS Secrets Manager. Configure - Network accessline 13
3. Use managed identity (system-assigned or user-assigned) to access Key Vault from Azure compute, eliminating the need for Key Vault credentials in code. This replaces IAM role-based access patterns used with AWS Secrets Manager. Configure - Network accessline 14
4. For App Service deployments, use Key Vault references in App Settings instead of direct secret values. The syntax `@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/MySecret/)` resolves secrets at runtime without appl - Network accessline 14
4. For App Service deployments, use Key Vault references in App Settings instead of direct secret values. The syntax `@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/MySecret/)` resolves secrets at runtime without appl - Network accessline 15
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Network accessline 16
6. Never commit secrets to source control. Add `.env` to `.gitignore`. Use `.env.example` or `.env.template` with placeholder values to document required variables. This applies equally to AWS and Azure workflows. [OWASP -- Secrets in sourc - Network accessline 16
6. Never commit secrets to source control. Add `.env` to `.gitignore`. Use `.env.example` or `.env.template` with placeholder values to document required variables. This applies equally to AWS and Azure workflows. [OWASP -- Secrets in sourc - Network accessline 17
[Credential-related source omitted] - Network accessline 17
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Network accessline 19
9. Apply least-privilege access policies to Key Vault. Grant only "Get" and "List" secret permissions to the bot's managed identity. Do not grant "Set", "Delete", or management permissions to runtime identities. Use separate access policies - Network accessline 19
9. Apply least-privilege access policies to Key Vault. Grant only "Get" and "List" secret permissions to the bot's managed identity. Do not grant "Set", "Delete", or management permissions to runtime identities. Use separate access policies - Network accessline 20
10. For local development, use `DefaultAzureCredential` from `@azure/identity` which chains multiple credential sources: environment variables, managed identity, Azure CLI login, and VS Code credentials. This provides a unified auth pattern - Network accessline 20
10. For local development, use `DefaultAzureCredential` from `@azure/identity` which chains multiple credential sources: environment variables, managed identity, Azure CLI login, and VS Code credentials. This provides a unified auth pattern - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Network accessline 120
[Credential-related source omitted] - Network accessline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Network accessline 124
CLIENT_ID="@Microsoft.KeyVault(SecretUri=https://my-bot-vault.vault.azure.net/secrets/BotClientId/)" \ - Network accessline 124
CLIENT_ID="@Microsoft.KeyVault(SecretUri=https://my-bot-vault.vault.azure.net/secrets/BotClientId/)" \ - Network accessline 125
[Credential-related source omitted] - Network accessline 125
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Network accessline 126
TENANT_ID="@Microsoft.KeyVault(SecretUri=https://my-bot-vault.vault.azure.net/secrets/BotTenantId/)" \ - Network accessline 126
TENANT_ID="@Microsoft.KeyVault(SecretUri=https://my-bot-vault.vault.azure.net/secrets/BotTenantId/)" \ - Network accessline 127
[Credential-related source omitted] - Network accessline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted] - Access to secretsline 156
[Credential-related source omitted] - Access to secretsline 156
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Network accessline 165
- [Azure Key Vault overview](https://learn.microsoft.com/en-us/azure/key-vault/general/overview) - Network accessline 165
- [Azure Key Vault overview](https://learn.microsoft.com/en-us/azure/key-vault/general/overview) - Network accessline 166
- [Azure App Configuration overview](https://learn.microsoft.com/en-us/azure/azure-app-configuration/overview) - Network accessline 166
- [Azure App Configuration overview](https://learn.microsoft.com/en-us/azure/azure-app-configuration/overview) - Network accessline 167
- [Key Vault references for App Service](https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references) - Network accessline 167
- [Key Vault references for App Service](https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references) - Network accessline 168
- [Managed identities overview](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 168
- [Managed identities overview](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 169
- [@azure/identity -- DefaultAzureCredential](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains) - Network accessline 169
- [@azure/identity -- DefaultAzureCredential](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains) - Network accessline 170
- [@azure/keyvault-secrets npm](https://www.npmjs.com/package/@azure/keyvault-secrets) - Network accessline 170
- [@azure/keyvault-secrets npm](https://www.npmjs.com/package/@azure/keyvault-secrets) - Network accessline 171
- [Key Vault secret rotation tutorial](https://learn.microsoft.com/en-us/azure/key-vault/secrets/tutorial-rotation) - Network accessline 171
- [Key Vault secret rotation tutorial](https://learn.microsoft.com/en-us/azure/key-vault/secrets/tutorial-rotation) - Network accessline 172
- [AWS to Azure services comparison -- Security](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services#security-identity-and-access) - Network accessline 172
- [AWS to Azure services comparison -- Security](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services#security-identity-and-access) - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 193
[Credential-related source omitted] - Access to secretsline 193
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/infra-storage-ts.md
- Network accessline 11
1. Map AWS S3 to Azure Blob Storage for file and object storage. Both provide tiered storage (Hot/Cool/Archive maps to S3 Standard/IA/Glacier), versioning, and lifecycle policies. Use `@azure/storage-blob` for programmatic access. Container - Network accessline 11
1. Map AWS S3 to Azure Blob Storage for file and object storage. Both provide tiered storage (Hot/Cool/Archive maps to S3 Standard/IA/Glacier), versioning, and lifecycle policies. Use `@azure/storage-blob` for programmatic access. Container - Network accessline 12
2. Map AWS DynamoDB to Azure Cosmos DB for NoSQL key-value and document storage. Cosmos DB offers multiple APIs: Core SQL (recommended for new development), Table API (closest DynamoDB migration path), and MongoDB API. Choose based on query - Network accessline 12
2. Map AWS DynamoDB to Azure Cosmos DB for NoSQL key-value and document storage. Cosmos DB offers multiple APIs: Core SQL (recommended for new development), Table API (closest DynamoDB migration path), and MongoDB API. Choose based on query - Network accessline 13
3. Map AWS RDS (MySQL/PostgreSQL/SQL Server) to the equivalent Azure managed database: RDS MySQL maps to Azure Database for MySQL, RDS PostgreSQL maps to Azure Database for PostgreSQL, RDS SQL Server maps to Azure SQL Database. Schema and d - Network accessline 13
3. Map AWS RDS (MySQL/PostgreSQL/SQL Server) to the equivalent Azure managed database: RDS MySQL maps to Azure Database for MySQL, RDS PostgreSQL maps to Azure Database for PostgreSQL, RDS SQL Server maps to Azure SQL Database. Schema and d - Network accessline 14
4. Implement the Teams SDK `IStorage` interface for bot state management with Cosmos DB. The `IStorage` interface requires `get(key)`, `set(key, value)`, and `delete(key)` methods. This replaces any custom DynamoDB state store used by a Sla - Network accessline 14
4. Implement the Teams SDK `IStorage` interface for bot state management with Cosmos DB. The `IStorage` interface requires `get(key)`, `set(key, value)`, and `delete(key)` methods. This replaces any custom DynamoDB state store used by a Sla - Network accessline 15
5. For simple bot state (conversation history, user preferences), use Cosmos DB Core SQL API with a single container partitioned by the state key. This provides single-digit millisecond reads, automatic indexing, and serverless pricing for - Network accessline 15
5. For simple bot state (conversation history, user preferences), use Cosmos DB Core SQL API with a single container partitioned by the state key. This provides single-digit millisecond reads, automatic indexing, and serverless pricing for - Network accessline 16
6. Use managed identity or connection strings stored in Key Vault for database access. Never hardcode connection strings in source code. For Cosmos DB, use `@azure/cosmos` with `DefaultAzureCredential` for managed identity access, or store - Network accessline 16
6. Use managed identity or connection strings stored in Key Vault for database access. Never hardcode connection strings in source code. For Cosmos DB, use `@azure/cosmos` with `DefaultAzureCredential` for managed identity access, or store - Network accessline 17
7. For DynamoDB to Cosmos DB Table API migration, use the Azure Cosmos DB Data Migration Tool or custom scripts. Table API preserves the key-value access pattern (PartitionKey + RowKey), making it the lowest-effort migration path. However, - Network accessline 17
7. For DynamoDB to Cosmos DB Table API migration, use the Azure Cosmos DB Data Migration Tool or custom scripts. Table API preserves the key-value access pattern (PartitionKey + RowKey), making it the lowest-effort migration path. However, - Network accessline 18
8. Configure Cosmos DB request units (RUs) appropriately. DynamoDB uses read/write capacity units (RCUs/WCUs); Cosmos DB uses RUs. A simple bot state read costs approximately 1 RU. Start with serverless mode (pay-per-request) for developmen - Network accessline 18
8. Configure Cosmos DB request units (RUs) appropriately. DynamoDB uses read/write capacity units (RCUs/WCUs); Cosmos DB uses RUs. A simple bot state read costs approximately 1 RU. Start with serverless mode (pay-per-request) for developmen - Network accessline 19
9. Plan data migration strategy: for S3 to Blob Storage, use AzCopy or Azure Data Factory for bulk migration. For DynamoDB to Cosmos DB, export to JSON from DynamoDB and import with the Cosmos DB Data Migration Tool. For RDS, use Azure Data - Network accessline 19
9. Plan data migration strategy: for S3 to Blob Storage, use AzCopy or Azure Data Factory for bulk migration. For DynamoDB to Cosmos DB, export to JSON from DynamoDB and import with the Cosmos DB Data Migration Tool. For RDS, use Azure Data - Network accessline 20
10. Implement retry logic and handle throttling for Cosmos DB operations. Unlike DynamoDB which returns `ProvisionedThroughputExceededException`, Cosmos DB returns HTTP 429 with a `x-ms-retry-after-ms` header. The `@azure/cosmos` SDK has bu - Network accessline 20
10. Implement retry logic and handle throttling for Cosmos DB operations. Unlike DynamoDB which returns `ProvisionedThroughputExceededException`, Cosmos DB returns HTTP 429 with a `x-ms-retry-after-ms` header. The `@azure/cosmos` SDK has bu - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Network accessline 124
// Using managed identity (production) const blobServiceClient = new BlobServiceClient( `https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, - Network accessline 124
// Using managed identity (production) const blobServiceClient = new BlobServiceClient( `https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, - Network accessline 125
const blobServiceClient = new BlobServiceClient( `https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, new DefaultAzureCredential(), - Network accessline 125
const blobServiceClient = new BlobServiceClient( `https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, new DefaultAzureCredential(), - Network accessline 126
`https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, - Network accessline 126
`https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, - Network accessline 163
// Migration command: bulk copy from S3 to Blob Storage // azcopy copy "https://s3.amazonaws.com/my-bucket" \ - Network accessline 163
// Migration command: bulk copy from S3 to Blob Storage // azcopy copy "https://s3.amazonaws.com/my-bucket" \ - Network accessline 164
// azcopy copy "https://s3.amazonaws.com/my-bucket" \ - Network accessline 164
// azcopy copy "https://s3.amazonaws.com/my-bucket" \ - Network accessline 165
// "https://mystorageaccount.blob.core.windows.net/my-container?SAS_TOKEN" \ - Network accessline 165
// "https://mystorageaccount.blob.core.windows.net/my-container?SAS_TOKEN" \ - Network accessline 187
const cosmosClient = new CosmosClient({ endpoint: process.env.COSMOS_ENDPOINT!, // https://my-cosmos-db.documents.azure.com:443/ - Network accessline 187
const cosmosClient = new CosmosClient({ endpoint: process.env.COSMOS_ENDPOINT!, // https://my-cosmos-db.documents.azure.com:443/ - Network accessline 188
endpoint: process.env.COSMOS_ENDPOINT!, // https://my-cosmos-db.documents.azure.com:443/ - Network accessline 188
endpoint: process.env.COSMOS_ENDPOINT!, // https://my-cosmos-db.documents.azure.com:443/ - Network accessline 220
- [Azure Blob Storage overview](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-overview) - Network accessline 220
- [Azure Blob Storage overview](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-overview) - Network accessline 221
- [Azure Cosmos DB overview](https://learn.microsoft.com/en-us/azure/cosmos-db/introduction) - Network accessline 221
- [Azure Cosmos DB overview](https://learn.microsoft.com/en-us/azure/cosmos-db/introduction) - Network accessline 222
- [Azure SQL Database overview](https://learn.microsoft.com/en-us/azure/azure-sql/database/sql-database-paas-overview) - Network accessline 222
- [Azure SQL Database overview](https://learn.microsoft.com/en-us/azure/azure-sql/database/sql-database-paas-overview) - Network accessline 223
- [Cosmos DB Table API](https://learn.microsoft.com/en-us/azure/cosmos-db/table/introduction) - Network accessline 223
- [Cosmos DB Table API](https://learn.microsoft.com/en-us/azure/cosmos-db/table/introduction) - Network accessline 224
- [Cosmos DB RBAC with managed identity](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-rbac) - Network accessline 224
- [Cosmos DB RBAC with managed identity](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-rbac) - Network accessline 225
- [@azure/cosmos npm](https://www.npmjs.com/package/@azure/cosmos) - Network accessline 225
- [@azure/cosmos npm](https://www.npmjs.com/package/@azure/cosmos) - Network accessline 226
- [@azure/storage-blob npm](https://www.npmjs.com/package/@azure/storage-blob) - Network accessline 226
- [@azure/storage-blob npm](https://www.npmjs.com/package/@azure/storage-blob) - Network accessline 227
- [AzCopy tool](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10) - Network accessline 227
- [AzCopy tool](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10) - Network accessline 228
- [AWS to Azure services comparison -- Storage](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services#storage) - Network accessline 228
- [AWS to Azure services comparison -- Storage](https://learn.microsoft.com/en-us/azure/architecture/aws-professional/services#storage)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/interactive-responses-ts.md
- Network accessline 9
1. **Slack `respond({ replace_original: true })` → Teams invoke response with card.** In Slack, `respond()` with `replace_original` replaces the message that triggered the interaction. In Teams, return a new Adaptive Card from the `card.act - Network accessline 9
1. **Slack `respond({ replace_original: true })` → Teams invoke response with card.** In Slack, `respond()` with `replace_original` replaces the message that triggered the interaction. In Teams, return a new Adaptive Card from the `card.act - Network accessline 10
2. **Slack `respond({ delete_original: true })` → Teams `deleteActivity(activityId)`.** Slack's delete-original flag removes the message. In Teams, call `deleteActivity(activityId)` on the turn context. You must store the original activity - Network accessline 10
2. **Slack `respond({ delete_original: true })` → Teams `deleteActivity(activityId)`.** Slack's delete-original flag removes the message. In Teams, call `deleteActivity(activityId)` on the turn context. You must store the original activity - Network accessline 11
3. **Slack `chat.update(channel, ts, ...)` → Teams `updateActivity(activityId, activity)`.** Both platforms support editing a bot's own message after sending. The key difference: Slack identifies messages by `channel + ts`, Teams uses `acti - Network accessline 11
3. **Slack `chat.update(channel, ts, ...)` → Teams `updateActivity(activityId, activity)`.** Both platforms support editing a bot's own message after sending. The key difference: Slack identifies messages by `channel + ts`, Teams uses `acti - Network accessline 12
4. **Slack `chat.postEphemeral()` has NO Teams equivalent.** Ephemeral messages visible only to one user do not exist in Teams. Redesign strategies: (a) send a message in the user's 1:1 bot chat, (b) use `Action.Execute` with `refresh.userI - Network accessline 12
4. **Slack `chat.postEphemeral()` has NO Teams equivalent.** Ephemeral messages visible only to one user do not exist in Teams. Redesign strategies: (a) send a message in the user's 1:1 bot chat, (b) use `Action.Execute` with `refresh.userI - Network accessline 13
5. **Deferred response pattern: send "processing..." card, update later.** Slack's `response_url` allows 5 follow-up messages within 30 minutes. Teams has no `response_url` concept. Instead: (a) return a "Processing..." card from the invoke - Network accessline 13
5. **Deferred response pattern: send "processing..." card, update later.** Slack's `response_url` allows 5 follow-up messages within 30 minutes. Teams has no `response_url` concept. Instead: (a) return a "Processing..." card from the invoke - Network accessline 14
6. **Slack `response_url` (30-min, 5 follow-ups) → `send()` / `updateActivity()` with no expiry.** Slack's response_url is a webhook with time and count limits. Teams' `send()` and `updateActivity()` work indefinitely as long as you have a - Network accessline 14
6. **Slack `response_url` (30-min, 5 follow-ups) → `send()` / `updateActivity()` with no expiry.** Slack's response_url is a webhook with time and count limits. Teams' `send()` and `updateActivity()` work indefinitely as long as you have a - Network accessline 15
7. **`Action.Execute` with `refresh.userIds` enables per-user card views.** Slack broadcasts the same message to everyone; only the interacting user sees ephemeral responses. Teams' `Action.Execute` with `refresh` can show different card co - Network accessline 15
7. **`Action.Execute` with `refresh.userIds` enables per-user card views.** Slack broadcasts the same message to everyone; only the interacting user sees ephemeral responses. Teams' `Action.Execute` with `refresh` can show different card co - Network accessline 16
8. **Store activity IDs at send time.** Every `send()` in Teams returns an activity ID (or resource response). Store this ID if you need to update or delete the message later. Slack uses `channel + ts`; Teams uses a single opaque `activityI - Network accessline 16
8. **Store activity IDs at send time.** Every `send()` in Teams returns an activity ID (or resource response). Store this ID if you need to update or delete the message later. Slack uses `channel + ts`; Teams uses a single opaque `activityI - Network accessline 17
9. **Slack `respond({ response_type: 'in_channel' })` → `send()`.** Slack's `in_channel` response type makes an ephemeral-by-default response visible to everyone. In Teams, all bot messages are visible by default — simply call `send()`. The - Network accessline 17
9. **Slack `respond({ response_type: 'in_channel' })` → `send()`.** Slack's `in_channel` response type makes an ephemeral-by-default response visible to everyone. In Teams, all bot messages are visible by default — simply call `send()`. The - Network accessline 18
10. **Card action handler must return within 3 seconds.** Teams invoke activities (including `Action.Execute` and `Action.Submit`) require a synchronous response within ~3 seconds. If processing takes longer, return a "processing" card imme - Network accessline 18
10. **Card action handler must return within 3 seconds.** Teams invoke activities (including `Action.Execute` and `Action.Submit`) require a synchronous response within ~3 seconds. If processing takes longer, return a "processing" card imme - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Network accessline 234
// Simulate long-running work await new Promise((r) => setTimeout(r, 15000)); return { url: "https://example.com/report.pdf" }; - Network accessline 234
// Simulate long-running work await new Promise((r) => setTimeout(r, 15000)); return { url: "https://example.com/report.pdf" }; - Network accessline 235
await new Promise((r) => setTimeout(r, 15000)); return { url: "https://example.com/report.pdf" }; } - Network accessline 235
await new Promise((r) => setTimeout(r, 15000)); return { url: "https://example.com/report.pdf" }; } - Network accessline 236
return { url: "https://example.com/report.pdf" }; - Network accessline 236
return { url: "https://example.com/report.pdf" }; - Network accessline 364
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 364
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 365
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/user-specific-views - Network accessline 365
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/user-specific-views - Network accessline 366
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 366
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 367
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-update-activity - Network accessline 367
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-update-activity - Network accessline 368
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-delete-activity - Network accessline 368
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-delete-activity - Network accessline 369
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/conversation-messages - Network accessline 369
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/conversation-messages - Network accessline 370
- https://github.com/microsoft/teams.ts - Network accessline 370
- https://github.com/microsoft/teams.ts - Network accessline 371
- https://api.slack.com/interactivity/handling — Slack interactive responses - Network accessline 371
- https://api.slack.com/interactivity/handling — Slack interactive responses - Network accessline 372
- https://api.slack.com/methods/chat.update — Slack chat.update - Network accessline 372
- https://api.slack.com/methods/chat.update — Slack chat.update - Network accessline 373
- https://api.slack.com/methods/chat.postEphemeral — Slack chat.postEphemeral - Network accessline 373
- https://api.slack.com/methods/chat.postEphemeral — Slack chat.postEphemeral
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/link-unfurl-preview-ts.md
- Network accessline 9
1. **Slack `app.event('link_shared')` + `chat.unfurl()` → Teams `message.ext.query-link` handler.** Slack fires a `link_shared` event and the bot calls `chat.unfurl()` asynchronously. Teams uses a compose extension handler that must return - Network accessline 9
1. **Slack `app.event('link_shared')` + `chat.unfurl()` → Teams `message.ext.query-link` handler.** Slack fires a `link_shared` event and the bot calls `chat.unfurl()` asynchronously. Teams uses a compose extension handler that must return - Network accessline 10
2. **Manifest `composeExtensions[].messageHandlers` with domain list is required.** Unlike Slack where you register unfurl domains in the app dashboard, Teams requires them in the manifest JSON under `composeExtensions[0].messageHandlers[0] - Network accessline 10
2. **Manifest `composeExtensions[].messageHandlers` with domain list is required.** Unlike Slack where you register unfurl domains in the app dashboard, Teams requires them in the manifest JSON under `composeExtensions[0].messageHandlers[0] - Network accessline 11
3. **Teams has a 5-second synchronous response deadline.** Slack's `link_shared` event allows async unfurling — the bot receives the event, processes it, then calls `chat.unfurl()` within 30 minutes. Teams' `query-link` is an invoke that mu - Network accessline 11
3. **Teams has a 5-second synchronous response deadline.** Slack's `link_shared` event allows async unfurling — the bot receives the event, processes it, then calls `chat.unfurl()` within 30 minutes. Teams' `query-link` is an invoke that mu - Network accessline 12
4. **The bot must be installed in the conversation for unfurling to work.** Slack link unfurling works in any channel where the app is installed (workspace-level). Teams link unfurling only works in conversations where the bot is explicitly - Network accessline 12
4. **The bot must be installed in the conversation for unfurling to work.** Slack link unfurling works in any channel where the app is installed (workspace-level). Teams link unfurling only works in conversations where the bot is explicitly - Network accessline 13
5. **No retroactive unfurling of already-posted links.** Slack can unfurl links in messages already posted (if the app is added later). Teams only unfurls links at the time they are composed/sent. Links in existing messages are never retroa - Network accessline 13
5. **No retroactive unfurling of already-posted links.** Slack can unfurl links in messages already posted (if the app is added later). Teams only unfurls links at the time they are composed/sent. Links in existing messages are never retroa - Network accessline 14
6. **Slack unfurl supports multiple links per message; Teams handles one at a time.** Slack's `link_shared` event includes an array of `links` from the message. Teams invokes the `query-link` handler once per URL. If a message contains mult - Network accessline 14
6. **Slack unfurl supports multiple links per message; Teams handles one at a time.** Slack's `link_shared` event includes an array of `links` from the message. Teams invokes the `query-link` handler once per URL. If a message contains mult - Network accessline 15
7. **Return an Adaptive Card (not Hero/Thumbnail) for rich previews.** Slack unfurls return attachment objects with `title`, `text`, `thumb_url`, `color`. Teams link unfurling should return Adaptive Cards for the richest preview. The respon - Network accessline 15
7. **Return an Adaptive Card (not Hero/Thumbnail) for rich previews.** Slack unfurls return attachment objects with `title`, `text`, `thumb_url`, `color`. Teams link unfurling should return Adaptive Cards for the richest preview. The respon - Network accessline 16
8. **Domain matching is exact — no wildcards for subdomains.** Slack unfurl domain matching supports wildcards. Teams manifest `messageHandlers.value.domains` requires exact domain entries. To match `foo.example.com` and `bar.example.com`, - Network accessline 16
8. **Domain matching is exact — no wildcards for subdomains.** Slack unfurl domain matching supports wildcards. Teams manifest `messageHandlers.value.domains` requires exact domain entries. To match `foo.example.com` and `bar.example.com`, - Network accessline 17
9. **Slack's unfurl `is_bot_token_only` flag → not applicable.** Slack distinguishes between user-token and bot-token unfurling. Teams link unfurling always runs as the bot identity. There is no user-token mode. [github.com/microsoft/teams. - Network accessline 17
9. **Slack's unfurl `is_bot_token_only` flag → not applicable.** Slack distinguishes between user-token and bot-token unfurling. Teams link unfurling always runs as the bot identity. There is no user-token mode. [github.com/microsoft/teams. - Network accessline 18
10. **Cache unfurl results where possible.** Since the 5-second deadline is strict, cache API responses for frequently unfurled URLs. Slack's async model made caching less critical. In Teams, a cache miss that takes >5 seconds means the unf - Network accessline 18
10. **Cache unfurl results where possible.** Since the 5-second deadline is strict, cache API responses for frequently unfurled URLs. Slack's async model made caching less critical. In Teams, a cache miss that takes >5 seconds means the unf - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Network accessline 315
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/link-unfurling - Network accessline 315
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/link-unfurling - Network accessline 316
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensionsmessagehandlers - Network accessline 316
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensionsmessagehandlers - Network accessline 317
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions - Network accessline 317
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions - Network accessline 318
- https://github.com/microsoft/teams.ts - Network accessline 318
- https://github.com/microsoft/teams.ts - Network accessline 319
- https://api.slack.com/reference/messaging/link-unfurling — Slack link unfurling - Network accessline 319
- https://api.slack.com/reference/messaging/link-unfurling — Slack link unfurling - Network accessline 320
- https://api.slack.com/methods/chat.unfurl — Slack chat.unfurl - Network accessline 320
- https://api.slack.com/methods/chat.unfurl — Slack chat.unfurl
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/middleware-handlers-ts.md
- Network accessline 9
1. Slack Bolt uses an explicit middleware chain: `app.use((args) => { ... await next(); })` for global middleware, and per-listener middleware as extra arguments to `app.message()`, `app.action()`, etc. Teams SDK v2 uses `app.on()` route ha - Network accessline 9
1. Slack Bolt uses an explicit middleware chain: `app.use((args) => { ... await next(); })` for global middleware, and per-listener middleware as extra arguments to `app.message()`, `app.action()`, etc. Teams SDK v2 uses `app.on()` route ha - Network accessline 314
- https://slack.dev/bolt-js/concepts/global-middleware -- Slack Bolt global middleware - Network accessline 314
- https://slack.dev/bolt-js/concepts/global-middleware -- Slack Bolt global middleware - Network accessline 315
- https://slack.dev/bolt-js/concepts/listener-middleware -- Slack listener middleware - Network accessline 315
- https://slack.dev/bolt-js/concepts/listener-middleware -- Slack listener middleware - Network accessline 316
- https://api.slack.com/interactivity/handling#acknowledgment_response -- Slack ack() requirement - Network accessline 316
- https://api.slack.com/interactivity/handling#acknowledgment_response -- Slack ack() requirement - Network accessline 317
- https://github.com/microsoft/teams.ts -- Teams SDK v2 handler patterns - Network accessline 317
- https://github.com/microsoft/teams.ts -- Teams SDK v2 handler patterns - Network accessline 318
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication -- Bot Framework auth (replaces Slack signing secret) - Network accessline 318
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication -- Bot Framework auth (replaces Slack signing secret)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/python-cross-platform.md
- Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Network accessline 164
- https://slack.dev/bolt-python/concepts - Network accessline 164
- https://slack.dev/bolt-python/concepts - Network accessline 164
- https://slack.dev/bolt-python/concepts - Network accessline 165
- https://slack.dev/bolt-python/concepts/adapters - Network accessline 165
- https://slack.dev/bolt-python/concepts/adapters - Network accessline 165
- https://slack.dev/bolt-python/concepts/adapters
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/rate-limiting-resilience-ts.md
- Network accessline 9
1. **Slack 429 + `Retry-After` header → same pattern for Bot Framework and Graph API.** Both platforms return HTTP 429 with a `Retry-After` header (seconds) when throttled. The retry pattern is identical: wait the specified duration, then r - Network accessline 9
1. **Slack 429 + `Retry-After` header → same pattern for Bot Framework and Graph API.** Both platforms return HTTP 429 with a `Retry-After` header (seconds) when throttled. The retry pattern is identical: wait the specified duration, then r - Network accessline 10
2. **Slack Bolt retry config → manual retry with exponential backoff + jitter.** Slack Bolt has built-in retry (`retryConfig: { retries: 3 }`). The Teams SDK does not have built-in retry. Implement exponential backoff with jitter: `delay = - Network accessline 10
2. **Slack Bolt retry config → manual retry with exponential backoff + jitter.** Slack Bolt has built-in retry (`retryConfig: { retries: 3 }`). The Teams SDK does not have built-in retry. Implement exponential backoff with jitter: `delay = - Network accessline 11
3. **Teams Bot Framework rate limits: ~1 msg/sec per conversation, ~30 msg/min per conversation.** These are soft limits that vary by channel type (1:1 vs group vs channel). Exceeding them results in 429 responses. Slack's rate limits are p - Network accessline 11
3. **Teams Bot Framework rate limits: ~1 msg/sec per conversation, ~30 msg/min per conversation.** These are soft limits that vary by channel type (1:1 vs group vs channel). Exceeding them results in 429 responses. Slack's rate limits are p - Network accessline 12
4. **Graph API has separate throttling from Bot Framework.** Graph API rate limits are per-app and per-tenant, varying by API. Common limits: 10,000 requests/10 minutes per app, with lower limits for specific APIs (e.g., channel messages). - Network accessline 12
4. **Graph API has separate throttling from Bot Framework.** Graph API rate limits are per-app and per-tenant, varying by API. Common limits: 10,000 requests/10 minutes per app, with lower limits for specific APIs (e.g., channel messages). - Network accessline 13
5. **Proactive broadcast to many conversations needs a send queue.** Sending the same message to 500 users at once will hit rate limits. Implement a queue with concurrency control: process N messages concurrently, respect per-conversation l - Network accessline 13
5. **Proactive broadcast to many conversations needs a send queue.** Sending the same message to 500 users at once will hit rate limits. Implement a queue with concurrency control: process N messages concurrently, respect per-conversation l - Network accessline 14
6. **Circuit breaker pattern (`opossum`) protects against cascading failures.** When an external service (your database, a third-party API) is down, the bot should fail fast instead of timing out on every request. Use `opossum` to wrap exte - Network accessline 14
6. **Circuit breaker pattern (`opossum`) protects against cascading failures.** When an external service (your database, a third-party API) is down, the bot should fail fast instead of timing out on every request. Use `opossum` to wrap exte - Network accessline 15
7. **Slack `slack_api_error` with `response.headers['retry-after']` → same extraction pattern for Teams.** The error handling pattern is similar: catch HTTP errors, check for 429 status, extract `Retry-After`, and schedule retry. The API cl - Network accessline 15
7. **Slack `slack_api_error` with `response.headers['retry-after']` → same extraction pattern for Teams.** The error handling pattern is similar: catch HTTP errors, check for 429 status, extract `Retry-After`, and schedule retry. The API cl - Network accessline 16
8. **Bot Framework Connector API has a separate 30-second timeout.** Beyond rate limits, the Bot Framework Connector API has a response timeout. If the bot doesn't respond to an invoke within ~3-10 seconds (depending on activity type), the - Network accessline 16
8. **Bot Framework Connector API has a separate 30-second timeout.** Beyond rate limits, the Bot Framework Connector API has a response timeout. If the bot doesn't respond to an invoke within ~3-10 seconds (depending on activity type), the - Network accessline 17
9. **Graph API batch requests reduce API call volume.** Instead of N individual Graph API calls, batch up to 20 requests in a single `POST /$batch` call. This counts as fewer requests against rate limits and reduces network overhead. Useful - Network accessline 17
9. **Graph API batch requests reduce API call volume.** Instead of N individual Graph API calls, batch up to 20 requests in a single `POST /$batch` call. This counts as fewer requests against rate limits and reduces network overhead. Useful - Network accessline 18
10. **Log and monitor throttling events.** Unlike Slack where Bolt logs retries automatically, Teams throttling must be explicitly logged. Track: 429 count, average retry delay, circuit breaker state, queue depth. Use Application Insights c - Network accessline 18
10. **Log and monitor throttling events.** Unlike Slack where Bolt logs retries automatically, Teams throttling must be explicitly logged. Track: 429 count, average retry delay, circuit breaker state, queue depth. Use Application Insights c - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted] - Network accessline 234
const fetchUserData = new CircuitBreaker( async (userId: string) => { const response = await fetch(`https://api.internal.com/users/${userId}`); - Network accessline 234
const fetchUserData = new CircuitBreaker( async (userId: string) => { const response = await fetch(`https://api.internal.com/users/${userId}`); - Network accessline 235
async (userId: string) => { const response = await fetch(`https://api.internal.com/users/${userId}`); if (!response.ok) throw new Error(`HTTP ${response.status}`); - Network accessline 235
async (userId: string) => { const response = await fetch(`https://api.internal.com/users/${userId}`); if (!response.ok) throw new Error(`HTTP ${response.status}`); - Network accessline 236
const response = await fetch(`https://api.internal.com/users/${userId}`); - Network accessline 236
const response = await fetch(`https://api.internal.com/users/${userId}`); - Network accessline 349
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/rate-limit - Network accessline 349
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/rate-limit - Network accessline 350
- https://learn.microsoft.com/en-us/graph/throttling - Network accessline 350
- https://learn.microsoft.com/en-us/graph/throttling - Network accessline 351
- https://learn.microsoft.com/en-us/graph/json-batching - Network accessline 351
- https://learn.microsoft.com/en-us/graph/json-batching - Network accessline 352
- https://learn.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific - Network accessline 352
- https://learn.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific - Network accessline 353
- https://learn.microsoft.com/en-us/azure/azure-monitor/app/nodejs - Network accessline 353
- https://learn.microsoft.com/en-us/azure/azure-monitor/app/nodejs - Network accessline 354
- https://www.npmjs.com/package/p-queue - Network accessline 354
- https://www.npmjs.com/package/p-queue - Network accessline 355
- https://www.npmjs.com/package/opossum - Network accessline 355
- https://www.npmjs.com/package/opossum - Network accessline 356
- https://github.com/microsoft/teams.ts - Network accessline 356
- https://github.com/microsoft/teams.ts - Network accessline 357
- https://api.slack.com/docs/rate-limits — Slack rate limits - Network accessline 357
- https://api.slack.com/docs/rate-limits — Slack rate limits
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/rest-only-integration-ts.md
- Network accessline 11
3. **Verify Slack request signatures manually.** Compute `HMAC-SHA256` of `v0:{timestamp}:{request_body}` using your signing secret. Compare against the `X-Slack-Signature` header. Reject if timestamp is older than 5 minutes. 4. **Verify Te - Network accessline 11
3. **Verify Slack request signatures manually.** Compute `HMAC-SHA256` of `v0:{timestamp}:{request_body}` using your signing secret. Compare against the `X-Slack-Signature` header. Reject if timestamp is older than 5 minutes. 4. **Verify Te - Network accessline 11
3. **Verify Slack request signatures manually.** Compute `HMAC-SHA256` of `v0:{timestamp}:{request_body}` using your signing secret. Compare against the `X-Slack-Signature` header. Reject if timestamp is older than 5 minutes. 4. **Verify Te - Network accessline 12
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Network accessline 13
[Credential-related source omitted] - Network accessline 13
[Credential-related source omitted] - Network accessline 13
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Network accessline 14
6. **Send Teams messages via the Bot Connector API.** POST to `{serviceUrl}/v3/conversations/{conversationId}/activities` with the activity JSON and a `Bearer` token. The `serviceUrl` comes from the inbound activity. 7. **Send Slack message - Network accessline 14
6. **Send Teams messages via the Bot Connector API.** POST to `{serviceUrl}/v3/conversations/{conversationId}/activities` with the activity JSON and a `Bearer` token. The `serviceUrl` comes from the inbound activity. 7. **Send Slack message - Network accessline 14
6. **Send Teams messages via the Bot Connector API.** POST to `{serviceUrl}/v3/conversations/{conversationId}/activities` with the activity JSON and a `Bearer` token. The `serviceUrl` comes from the inbound activity. 7. **Send Slack message - Network accessline 15
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Network accessline 44
POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token - Network accessline 44
POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token - Network accessline 44
POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token - Network accessline 47
[Credential-related source omitted] - Network accessline 47
[Credential-related source omitted] - Network accessline 47
[Credential-related source omitted] - Network accessline 48
[Credential-related source omitted] - Network accessline 48
[Credential-related source omitted] - Network accessline 48
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Network accessline 49
&scope=https://api.botframework.com/.default - Network accessline 49
&scope=https://api.botframework.com/.default - Network accessline 49
&scope=https://api.botframework.com/.default - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Network accessline 72
POST https://slack.com/api/chat.postMessage - Network accessline 72
POST https://slack.com/api/chat.postMessage - Network accessline 72
POST https://slack.com/api/chat.postMessage - Network accessline 111
[Credential-related source omitted] - Network accessline 111
[Credential-related source omitted] - Network accessline 111
[Credential-related source omitted] - Network accessline 112
[Credential-related source omitted] - Network accessline 112
[Credential-related source omitted] - Network accessline 112
[Credential-related source omitted] - Network accessline 113
// Fetch keys from https://login.botframework.com/v1/.well-known/openidconfiguration - Network accessline 113
// Fetch keys from https://login.botframework.com/v1/.well-known/openidconfiguration - Network accessline 113
// Fetch keys from https://login.botframework.com/v1/.well-known/openidconfiguration - Network accessline 114
claims = jwt_verify(token, publicKeys) assert claims.aud == appId assert claims.iss starts with "https://api.botframework.com" - Network accessline 114
claims = jwt_verify(token, publicKeys) assert claims.aud == appId assert claims.iss starts with "https://api.botframework.com" - Network accessline 114
claims = jwt_verify(token, publicKeys) assert claims.aud == appId assert claims.iss starts with "https://api.botframework.com" - Network accessline 115
assert claims.aud == appId assert claims.iss starts with "https://api.botframework.com" assert claims.exp > now() - Network accessline 115
assert claims.aud == appId assert claims.iss starts with "https://api.botframework.com" assert claims.exp > now() - Network accessline 115
assert claims.aud == appId assert claims.iss starts with "https://api.botframework.com" assert claims.exp > now() - Network accessline 116
assert claims.iss starts with "https://api.botframework.com" - Network accessline 116
assert claims.iss starts with "https://api.botframework.com" - Network accessline 116
assert claims.iss starts with "https://api.botframework.com" - Network accessline 123
- **Slack signature uses raw body, not parsed JSON.** You must verify against the exact bytes received, not a re-serialized JSON string. Many frameworks parse the body before your handler — use middleware to capture the raw body. - **Teams - Network accessline 123
- **Slack signature uses raw body, not parsed JSON.** You must verify against the exact bytes received, not a re-serialized JSON string. Many frameworks parse the body before your handler — use middleware to capture the raw body. - **Teams - Network accessline 123
- **Slack signature uses raw body, not parsed JSON.** You must verify against the exact bytes received, not a re-serialized JSON string. Many frameworks parse the body before your handler — use middleware to capture the raw body. - **Teams - Network accessline 124
- **Teams `serviceUrl` varies by region.** Don't hardcode it. The URL may be `https://smba.trafficmanager.net/...` or `https://emea.ng.msg.teams.microsoft.com/...` depending on the tenant's region. - Network accessline 124
- **Teams `serviceUrl` varies by region.** Don't hardcode it. The URL may be `https://smba.trafficmanager.net/...` or `https://emea.ng.msg.teams.microsoft.com/...` depending on the tenant's region. - Network accessline 124
- **Teams `serviceUrl` varies by region.** Don't hardcode it. The URL may be `https://smba.trafficmanager.net/...` or `https://emea.ng.msg.teams.microsoft.com/...` depending on the tenant's region. - Network accessline 126
- **Slack's `response_url` expires after 30 minutes.** If you need to update a message later, use `chat.update` with the message `ts` instead. - **Teams proactive messaging requires a conversation reference.** You can't just POST to a user - Network accessline 126
- **Slack's `response_url` expires after 30 minutes.** If you need to update a message later, use `chat.update` with the message `ts` instead. - **Teams proactive messaging requires a conversation reference.** You can't just POST to a user - Network accessline 126
- **Slack's `response_url` expires after 30 minutes.** If you need to update a message later, use `chat.update` with the message `ts` instead. - **Teams proactive messaging requires a conversation reference.** You can't just POST to a user - Network accessline 127
- **Teams proactive messaging requires a conversation reference.** You can't just POST to a user ID — you need the `conversationId` and `serviceUrl` from a previous inbound activity. Store these on first contact. - **No Adaptive Card suppor - Network accessline 127
- **Teams proactive messaging requires a conversation reference.** You can't just POST to a user ID — you need the `conversationId` and `serviceUrl` from a previous inbound activity. Store these on first contact. - **No Adaptive Card suppor - Network accessline 127
- **Teams proactive messaging requires a conversation reference.** You can't just POST to a user ID — you need the `conversationId` and `serviceUrl` from a previous inbound activity. Store these on first contact. - **No Adaptive Card suppor - Network accessline 128
- **No Adaptive Card support via REST without the schema.** You must construct the full Adaptive Card JSON yourself. Use the Adaptive Card Designer (https://adaptivecards.io/designer/) to prototype, then embed the JSON in your API calls. - Network accessline 128
- **No Adaptive Card support via REST without the schema.** You must construct the full Adaptive Card JSON yourself. Use the Adaptive Card Designer (https://adaptivecards.io/designer/) to prototype, then embed the JSON in your API calls. - Network accessline 128
- **No Adaptive Card support via REST without the schema.** You must construct the full Adaptive Card JSON yourself. Use the Adaptive Card Designer (https://adaptivecards.io/designer/) to prototype, then embed the JSON in your API calls. - Network accessline 133
- Bot Framework REST API: https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference - Network accessline 133
- Bot Framework REST API: https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference - Network accessline 133
- Bot Framework REST API: https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference - Network accessline 134
- Slack Events API: https://api.slack.com/events-api - Slack Web API: https://api.slack.com/web - Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Network accessline 134
- Slack Events API: https://api.slack.com/events-api - Slack Web API: https://api.slack.com/web - Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Network accessline 134
- Slack Events API: https://api.slack.com/events-api - Slack Web API: https://api.slack.com/web - Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Network accessline 135
- Slack Web API: https://api.slack.com/web - Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Azure AD token endpoint: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth - Network accessline 135
- Slack Web API: https://api.slack.com/web - Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Azure AD token endpoint: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth - Network accessline 135
- Slack Web API: https://api.slack.com/web - Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Azure AD token endpoint: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth - Network accessline 136
- Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Network accessline 136
- Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Network accessline 136
- Slack request verification: https://api.slack.com/authentication/verifying-requests-from-slack - Network accessline 137
- Azure AD token endpoint: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow - Network accessline 137
- Azure AD token endpoint: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow - Network accessline 137
- Azure AD token endpoint: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow - Network accessline 138
- Adaptive Card Designer: https://adaptivecards.io/designer/ - Network accessline 138
- Adaptive Card Designer: https://adaptivecards.io/designer/ - Network accessline 138
- Adaptive Card Designer: https://adaptivecards.io/designer/
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/scheduling-deferred-send-ts.md
- Network accessline 9
1. **Slack `chat.scheduleMessage` has NO Teams equivalent.** Teams has no built-in scheduled message API. Replace with: store the message + target time in persistent storage, then use a timer mechanism to send proactively at the scheduled t - Network accessline 9
1. **Slack `chat.scheduleMessage` has NO Teams equivalent.** Teams has no built-in scheduled message API. Replace with: store the message + target time in persistent storage, then use a timer mechanism to send proactively at the scheduled t - Network accessline 10
2. **Slack `chat.deleteScheduledMessage` → delete from your own storage/queue.** Since scheduled messages are self-managed in Teams, cancellation is simply removing the pending item from your storage (database row, queue message, cron job). - Network accessline 10
2. **Slack `chat.deleteScheduledMessage` → delete from your own storage/queue.** Since scheduled messages are self-managed in Teams, cancellation is simply removing the pending item from your storage (database row, queue message, cron job). - Network accessline 11
3. **Slack `reminders.add` → persistent storage + background poll + proactive send.** Slack reminders are platform-managed with DM delivery. In Teams, the bot must: (a) store the reminder with target user/time, (b) poll or use a timer to de - Network accessline 11
3. **Slack `reminders.add` → persistent storage + background poll + proactive send.** Slack reminders are platform-managed with DM delivery. In Teams, the bot must: (a) store the reminder with target user/time, (b) poll or use a timer to de - Network accessline 12
4. **In-process timers (`node-cron`, `setTimeout`) are for development only.** `node-cron` or `setTimeout` work for local dev and single-instance deployments. They are NOT durable — a process restart loses all scheduled items. Never use in- - Network accessline 12
4. **In-process timers (`node-cron`, `setTimeout`) are for development only.** `node-cron` or `setTimeout` work for local dev and single-instance deployments. They are NOT durable — a process restart loses all scheduled items. Never use in- - Network accessline 13
5. **Azure Functions timer trigger provides durable serverless scheduling.** Create a timer-triggered function that polls your database for due messages and sends them proactively. The CRON expression configures frequency (e.g., `"0 */1 * * - Network accessline 13
5. **Azure Functions timer trigger provides durable serverless scheduling.** Create a timer-triggered function that polls your database for due messages and sends them proactively. The CRON expression configures frequency (e.g., `"0 */1 * * - Network accessline 14
6. **Azure Queue Storage with visibility timeout enables exact-time scheduling.** Enqueue a message with `visibilityTimeout` set to the delay duration. The message becomes visible at the target time, triggering a queue-triggered function th - Network accessline 14
6. **Azure Queue Storage with visibility timeout enables exact-time scheduling.** Enqueue a message with `visibilityTimeout` set to the delay duration. The message becomes visible at the target time, triggering a queue-triggered function th - Network accessline 15
7. **Azure Service Bus scheduled messages support exact-time delivery.** `ServiceBusSender.scheduleMessages(message, scheduledEnqueueTimeUtc)` enqueues with a future delivery time. No polling needed — Service Bus delivers at the exact time. - Network accessline 15
7. **Azure Service Bus scheduled messages support exact-time delivery.** `ServiceBusSender.scheduleMessages(message, scheduledEnqueueTimeUtc)` enqueues with a future delivery time. No polling needed — Service Bus delivers at the exact time. - Network accessline 16
8. **Power Automate "Recurrence" trigger is a no-code alternative.** For simple recurring messages (daily standup reminder, weekly digest), a Power Automate flow with a Recurrence trigger can send messages via the bot's webhook or Graph API - Network accessline 16
8. **Power Automate "Recurrence" trigger is a no-code alternative.** For simple recurring messages (daily standup reminder, weekly digest), a Power Automate flow with a Recurrence trigger can send messages via the bot's webhook or Graph API - Network accessline 17
9. **Store conversation references at install time for proactive messaging.** All scheduled/reminder sends require a valid conversation reference (including `serviceUrl`). Capture and persist the reference in the `install.add` handler. With - Network accessline 17
9. **Store conversation references at install time for proactive messaging.** All scheduled/reminder sends require a valid conversation reference (including `serviceUrl`). Capture and persist the reference in the `install.add` handler. With - Network accessline 18
10. **Rate limiting applies to bulk scheduled sends.** Teams limits bots to ~1 message/second per conversation and ~30 messages/minute per conversation. If many scheduled messages are due at the same time (e.g., "send daily digest to 500 us - Network accessline 18
10. **Rate limiting applies to bulk scheduled sends.** Teams limits bots to ~1 message/second per conversation and ~30 messages/minute per conversation. If many scheduled messages are due at the same time (e.g., "send daily digest to 500 us - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Network accessline 192
// Use Bot Framework REST API or your Teams app instance // POST to {serviceUrl}/v3/conversations/{conversationId}/activities const response = await fetch(`${serviceUrl}/v3/conversations/${conversationId}/activities`, { - Network accessline 192
// Use Bot Framework REST API or your Teams app instance // POST to {serviceUrl}/v3/conversations/{conversationId}/activities const response = await fetch(`${serviceUrl}/v3/conversations/${conversationId}/activities`, { - Network accessline 193
// POST to {serviceUrl}/v3/conversations/{conversationId}/activities const response = await fetch(`${serviceUrl}/v3/conversations/${conversationId}/activities`, { method: "POST", - Network accessline 193
// POST to {serviceUrl}/v3/conversations/{conversationId}/activities const response = await fetch(`${serviceUrl}/v3/conversations/${conversationId}/activities`, { method: "POST", - Network accessline 194
const response = await fetch(`${serviceUrl}/v3/conversations/${conversationId}/activities`, { - Network accessline 194
const response = await fetch(`${serviceUrl}/v3/conversations/${conversationId}/activities`, { - Network accessline 318
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 318
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 319
- https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer - Network accessline 319
- https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer - Network accessline 320
- https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger - Network accessline 320
- https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger - Network accessline 321
- https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-sequencing#scheduled-messages - Network accessline 321
- https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-sequencing#scheduled-messages - Network accessline 322
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/rate-limit - Network accessline 322
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/rate-limit - Network accessline 323
- https://learn.microsoft.com/en-us/power-automate/triggers-introduction - Network accessline 323
- https://learn.microsoft.com/en-us/power-automate/triggers-introduction - Network accessline 324
- https://github.com/microsoft/teams.ts - Network accessline 324
- https://github.com/microsoft/teams.ts - Network accessline 325
- https://api.slack.com/methods/chat.scheduleMessage — Slack scheduled messages - Network accessline 325
- https://api.slack.com/methods/chat.scheduleMessage — Slack scheduled messages - Network accessline 326
- https://api.slack.com/methods/reminders.add — Slack reminders - Network accessline 326
- https://api.slack.com/methods/reminders.add — Slack reminders
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/shortcuts-extensions-ts.md
- Network accessline 9
1. **Slack global shortcuts → Teams action-based compose extensions with `context: ['compose', 'commandBox']`.** Slack global shortcuts appear in the lightning bolt menu and don't reference a specific message. In Teams, the equivalent is a - Network accessline 9
1. **Slack global shortcuts → Teams action-based compose extensions with `context: ['compose', 'commandBox']`.** Slack global shortcuts appear in the lightning bolt menu and don't reference a specific message. In Teams, the equivalent is a - Network accessline 10
2. **Slack message shortcuts → Teams action-based extensions with `context: ['message']`.** Slack message shortcuts appear in the message context menu (⋮ → More actions). In Teams, action-based extensions with `context: ['message']` appear - Network accessline 10
2. **Slack message shortcuts → Teams action-based extensions with `context: ['message']`.** Slack message shortcuts appear in the message context menu (⋮ → More actions). In Teams, action-based extensions with `context: ['message']` appear - Network accessline 11
3. **Slack `trigger_id` + `views.open()` → Teams `fetchTask: true` + task module.** Slack shortcuts use the `trigger_id` to open a modal. Teams action-based extensions use `fetchTask: true` in the manifest, which causes Teams to invoke the - Network accessline 11
3. **Slack `trigger_id` + `views.open()` → Teams `fetchTask: true` + task module.** Slack shortcuts use the `trigger_id` to open a modal. Teams action-based extensions use `fetchTask: true` in the manifest, which causes Teams to invoke the - Network accessline 12
4. **Slack `shortcut.message` (target message in message shortcuts) → Teams `activity.value.messagePayload`.** When a message shortcut is invoked in Slack, the message object is in `shortcut.message`. In Teams, the message that was acted up - Network accessline 12
4. **Slack `shortcut.message` (target message in message shortcuts) → Teams `activity.value.messagePayload`.** When a message shortcut is invoked in Slack, the message object is in `shortcut.message`. In Teams, the message that was acted up - Network accessline 13
5. **Manifest `composeExtensions[].commands[]` with `type: "action"` is required.** Unlike Slack where shortcuts are configured in the app dashboard, Teams requires each action command to be declared in the manifest JSON with its title, des - Network accessline 13
5. **Manifest `composeExtensions[].commands[]` with `type: "action"` is required.** Unlike Slack where shortcuts are configured in the app dashboard, Teams requires each action command to be declared in the manifest JSON with its title, des - Network accessline 14
6. **Slack `app.shortcut('callback_id')` → Teams handler routing via `activity.value.commandId`.** Slack routes shortcuts by `callback_id`. Teams invokes the same `message.ext.open` handler for all action commands — differentiate by checkin - Network accessline 14
6. **Slack `app.shortcut('callback_id')` → Teams handler routing via `activity.value.commandId`.** Slack routes shortcuts by `callback_id`. Teams invokes the same `message.ext.open` handler for all action commands — differentiate by checkin - Network accessline 15
7. **Task module response replaces Slack modal view return.** Slack's `views.open()` returns a view object with blocks. Teams' `message.ext.open` handler returns a task module response containing either an Adaptive Card or an iframe URL. Th - Network accessline 15
7. **Task module response replaces Slack modal view return.** Slack's `views.open()` returns a view object with blocks. Teams' `message.ext.open` handler returns a task module response containing either an Adaptive Card or an iframe URL. Th - Network accessline 16
8. **Slack `view_submission` → Teams `message.ext.submit`.** When the user submits the task module form, Teams invokes the `message.ext.submit` handler (or `composeExtension/submitAction` activity). The form data is in `activity.value.data` - Network accessline 16
8. **Slack `view_submission` → Teams `message.ext.submit`.** When the user submits the task module form, Teams invokes the `message.ext.submit` handler (or `composeExtension/submitAction` activity). The form data is in `activity.value.data` - Network accessline 17
9. **No "fire and forget" shortcuts in Teams.** Slack global shortcuts can trigger background actions without showing a modal (just `ack()` + do work). Teams action-based extensions always show a task module if `fetchTask: true`. To mimic f - Network accessline 17
9. **No "fire and forget" shortcuts in Teams.** Slack global shortcuts can trigger background actions without showing a modal (just `ack()` + do work). Teams action-based extensions always show a task module if `fetchTask: true`. To mimic f - Network accessline 18
10. **Teams action extensions can insert cards into the compose box.** Slack shortcuts post messages via `say()` or `respond()`. Teams action extensions can return a card that gets inserted into the user's compose box for them to review and - Network accessline 18
10. **Teams action extensions can insert cards into the compose box.** Slack shortcuts post messages via `say()` or `respond()`. Teams action extensions can return a card that gets inserted into the user's compose box for them to review and - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 204
[Credential-related source omitted] - Access to secretsline 204
[Credential-related source omitted] - Access to secretsline 205
[Credential-related source omitted] - Access to secretsline 205
[Credential-related source omitted] - Network accessline 342
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/define-action-command - Network accessline 342
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/define-action-command - Network accessline 343
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/create-task-module - Network accessline 343
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/create-task-module - Network accessline 344
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit - Network accessline 344
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit - Network accessline 345
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensionscommands - Network accessline 345
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensionscommands - Network accessline 346
- https://github.com/microsoft/teams.ts - Network accessline 346
- https://github.com/microsoft/teams.ts - Network accessline 347
- https://api.slack.com/interactivity/shortcuts — Slack shortcuts - Network accessline 347
- https://api.slack.com/interactivity/shortcuts — Slack shortcuts - Network accessline 348
- https://api.slack.com/reference/interaction-payloads/shortcuts — Slack shortcut payloads - Network accessline 348
- https://api.slack.com/reference/interaction-payloads/shortcuts — Slack shortcut payloads
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/transport-socketmode-https-ts.md
- Network accessline 9
1. **Slack has 3 transport modes; Teams has 1.** Slack supports HTTP webhooks (Events API), Socket Mode (WebSocket for firewalled environments), and RTM (legacy WebSocket). Teams uses exclusively HTTPS via the Azure Bot Framework Service ch - Network accessline 9
1. **Slack has 3 transport modes; Teams has 1.** Slack supports HTTP webhooks (Events API), Socket Mode (WebSocket for firewalled environments), and RTM (legacy WebSocket). Teams uses exclusively HTTPS via the Azure Bot Framework Service ch - Network accessline 10
2. **Slack Socket Mode (`@slack/socket-mode`) has NO Teams equivalent.** Socket Mode exists because Slack apps behind firewalls can't receive inbound HTTP. In Teams, the bot MUST expose a public HTTPS endpoint. Use Azure App Service, ngrok - Network accessline 10
2. **Slack Socket Mode (`@slack/socket-mode`) has NO Teams equivalent.** Socket Mode exists because Slack apps behind firewalls can't receive inbound HTTP. In Teams, the bot MUST expose a public HTTPS endpoint. Use Azure App Service, ngrok - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Network accessline 18
10. **Slack's event subscription URL verification challenge (`url_verification` event)** has no Teams equivalent. Teams verifies your endpoint via the Bot Framework registration in Azure Portal, not via an HTTP challenge. Remove all challen - Network accessline 18
10. **Slack's event subscription URL verification challenge (`url_verification` event)** has no Teams equivalent. Teams verifies your endpoint via the Bot Framework registration in Azure Portal, not via an HTTP challenge. Remove all challen - Network accessline 20
12. **Add a health check endpoint for production hosting.** Azure App Service, Container Apps, and Kubernetes all use HTTP health probes to determine if the app is alive. Expose `GET /api/health` returning 200 with a JSON body. Configure th - Network accessline 20
12. **Add a health check endpoint for production hosting.** Azure App Service, Container Apps, and Kubernetes all use HTTP health probes to determine if the app is alive. Expose `GET /api/health` returning 200 with a JSON body. Configure th - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Network accessline 184
|---|---|---|---| | **Local dev** | `localhost:3978` + Dev Tunnel | `https://<tunnel-id>.devtunnels.ms/api/messages` | Free; tunnels expire after idle timeout | | **Staging** | Azure App Service (B1) | `https://my-bot-staging.azurewebsites. - Network accessline 184
|---|---|---|---| | **Local dev** | `localhost:3978` + Dev Tunnel | `https://<tunnel-id>.devtunnels.ms/api/messages` | Free; tunnels expire after idle timeout | | **Staging** | Azure App Service (B1) | `https://my-bot-staging.azurewebsites. - Network accessline 185
| **Local dev** | `localhost:3978` + Dev Tunnel | `https://<tunnel-id>.devtunnels.ms/api/messages` | Free; tunnels expire after idle timeout | | **Staging** | Azure App Service (B1) | `https://my-bot-staging.azurewebsites.net/api/messages` - Network accessline 185
| **Local dev** | `localhost:3978` + Dev Tunnel | `https://<tunnel-id>.devtunnels.ms/api/messages` | Free; tunnels expire after idle timeout | | **Staging** | Azure App Service (B1) | `https://my-bot-staging.azurewebsites.net/api/messages` - Network accessline 186
| **Staging** | Azure App Service (B1) | `https://my-bot-staging.azurewebsites.net/api/messages` | Use deployment slots; Always On enabled | - Network accessline 186
| **Staging** | Azure App Service (B1) | `https://my-bot-staging.azurewebsites.net/api/messages` | Use deployment slots; Always On enabled | - Network accessline 187
| **Production** | Azure App Service (S1+) or Container Apps | `https://my-bot.azurewebsites.net/api/messages` | Custom domain + managed TLS; health check configured | - Network accessline 187
| **Production** | Azure App Service (S1+) or Container Apps | `https://my-bot.azurewebsites.net/api/messages` | Custom domain + managed TLS; health check configured | - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Network accessline 215
- https://api.slack.com/apis/connections/socket -- Slack Socket Mode documentation - Network accessline 215
- https://api.slack.com/apis/connections/socket -- Slack Socket Mode documentation - Network accessline 216
- https://api.slack.com/apis/connections/events-api -- Slack Events API (HTTP) - Network accessline 216
- https://api.slack.com/apis/connections/events-api -- Slack Events API (HTTP) - Network accessline 217
- https://api.slack.com/rtm -- Slack RTM API (deprecated) - Network accessline 217
- https://api.slack.com/rtm -- Slack RTM API (deprecated) - Network accessline 218
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-overview -- Bot Framework architecture - Network accessline 218
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-overview -- Bot Framework architecture - Network accessline 219
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication -- Bot Framework authentication - Network accessline 219
- https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication -- Bot Framework authentication - Network accessline 220
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/debug/locally-with-an-ide -- Local dev with tunneling - Network accessline 220
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/debug/locally-with-an-ide -- Local dev with tunneling - Network accessline 221
- https://github.com/microsoft/teams.ts -- Teams SDK v2 - Network accessline 221
- https://github.com/microsoft/teams.ts -- Teams SDK v2
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/ui-app-home-personal-tab-ts.md
- Network accessline 201
"entityId": "homeTab", "name": "Home", "contentUrl": "https://your-app.azurewebsites.net/tab/home", - Network accessline 201
"entityId": "homeTab", "name": "Home", "contentUrl": "https://your-app.azurewebsites.net/tab/home", - Network accessline 202
"name": "Home", "contentUrl": "https://your-app.azurewebsites.net/tab/home", "scopes": ["personal"] - Network accessline 202
"name": "Home", "contentUrl": "https://your-app.azurewebsites.net/tab/home", "scopes": ["personal"] - Network accessline 203
"contentUrl": "https://your-app.azurewebsites.net/tab/home", - Network accessline 203
"contentUrl": "https://your-app.azurewebsites.net/tab/home", - Network accessline 229
<meta charset="UTF-8" /> <title>Home</title> <script src="https://res.cdn.office.net/teams-js/2.24.0/js/MicrosoftTeams.min.js"></script> - Network accessline 229
<meta charset="UTF-8" /> <title>Home</title> <script src="https://res.cdn.office.net/teams-js/2.24.0/js/MicrosoftTeams.min.js"></script> - Network accessline 230
<title>Home</title> <script src="https://res.cdn.office.net/teams-js/2.24.0/js/MicrosoftTeams.min.js"></script> <style> - Network accessline 230
<title>Home</title> <script src="https://res.cdn.office.net/teams-js/2.24.0/js/MicrosoftTeams.min.js"></script> <style> - Network accessline 231
<script src="https://res.cdn.office.net/teams-js/2.24.0/js/MicrosoftTeams.min.js"></script> - Network accessline 231
<script src="https://res.cdn.office.net/teams-js/2.24.0/js/MicrosoftTeams.min.js"></script> - Network accessline 253
function doAction(verb) { // Use Teams JS SDK to communicate or fetch data fetch('/tab/api/action', { - Network accessline 253
function doAction(verb) { // Use Teams JS SDK to communicate or fetch data fetch('/tab/api/action', { - Network accessline 254
// Use Teams JS SDK to communicate or fetch data fetch('/tab/api/action', { method: 'POST', - Network accessline 254
// Use Teams JS SDK to communicate or fetch data fetch('/tab/api/action', { method: 'POST', - Network accessline 255
fetch('/tab/api/action', { - Network accessline 255
fetch('/tab/api/action', { - Network accessline 302
- https://api.slack.com/surfaces/app-home — Slack App Home documentation - Network accessline 302
- https://api.slack.com/surfaces/app-home — Slack App Home documentation - Network accessline 303
- https://api.slack.com/events/app_home_opened — AppHomeOpenedEvent reference - Network accessline 303
- https://api.slack.com/events/app_home_opened — AppHomeOpenedEvent reference - Network accessline 304
- https://api.slack.com/methods/views.publish — views.publish API - Network accessline 304
- https://api.slack.com/methods/views.publish — views.publish API - Network accessline 305
- https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs — Teams tabs overview - Network accessline 305
- https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs — Teams tabs overview - Network accessline 306
- https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/how-to/create-personal-tab — Personal tabs - Network accessline 306
- https://learn.microsoft.com/en-us/microsoftteams/platform/tabs/how-to/create-personal-tab — Personal tabs - Network accessline 307
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages — Proactive messaging - Network accessline 307
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages — Proactive messaging - Network accessline 308
- https://github.com/microsoft/teams.ts — Teams SDK v2 - Network accessline 308
- https://github.com/microsoft/teams.ts — Teams SDK v2
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/ui-block-kit-adaptive-cards-ts.md
- Network accessline 160
const adaptiveCard: AdaptiveCard = { type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 160
const adaptiveCard: AdaptiveCard = { type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 161
type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 161
type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 162
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 162
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 270
const taskModuleCard = { type: "AdaptiveCard" as const, $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 270
const taskModuleCard = { type: "AdaptiveCard" as const, $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 271
type: "AdaptiveCard" as const, $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 271
type: "AdaptiveCard" as const, $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 272
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 272
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 435
- https://api.slack.com/reference/block-kit/blocks -- Slack Block Kit block type reference - Network accessline 435
- https://api.slack.com/reference/block-kit/blocks -- Slack Block Kit block type reference - Network accessline 436
- https://api.slack.com/reference/block-kit/block-elements -- Slack interactive element reference - Network accessline 436
- https://api.slack.com/reference/block-kit/block-elements -- Slack interactive element reference - Network accessline 437
- https://api.slack.com/surfaces/modals -- Slack modal (views.open) documentation - Network accessline 437
- https://api.slack.com/surfaces/modals -- Slack modal (views.open) documentation - Network accessline 438
- https://adaptivecards.io/explorer/ -- Adaptive Cards schema explorer (all element types) - Network accessline 438
- https://adaptivecards.io/explorer/ -- Adaptive Cards schema explorer (all element types) - Network accessline 439
- https://adaptivecards.io/explorer/Action.Submit.html -- Action.Submit schema and data field - Network accessline 439
- https://adaptivecards.io/explorer/Action.Submit.html -- Action.Submit schema and data field - Network accessline 440
- https://adaptivecards.io/explorer/Input.ChoiceSet.html -- Input.ChoiceSet (select/multi-select) - Network accessline 440
- https://adaptivecards.io/explorer/Input.ChoiceSet.html -- Input.ChoiceSet (select/multi-select) - Network accessline 441
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference -- Teams Adaptive Card support - Network accessline 441
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference -- Teams Adaptive Card support - Network accessline 442
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots -- Task modules from bots - Network accessline 442
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots -- Task modules from bots - Network accessline 443
- https://learn.microsoft.com/en-us/adaptive-cards/authoring-cards/universal-action-model -- Universal Actions - Network accessline 443
- https://learn.microsoft.com/en-us/adaptive-cards/authoring-cards/universal-action-model -- Universal Actions
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/ui-legacy-attachments-cards-ts.md
- Network accessline 191
- https://api.slack.com/reference/messaging/attachments — Slack legacy attachments (deprecated but supported) - Network accessline 191
- https://api.slack.com/reference/messaging/attachments — Slack legacy attachments (deprecated but supported) - Network accessline 192
- https://api.slack.com/legacy/interactive-messages — Legacy interactive messages (attachment actions) - Network accessline 192
- https://api.slack.com/legacy/interactive-messages — Legacy interactive messages (attachment actions) - Network accessline 193
- https://adaptivecards.io/explorer/Action.ShowCard.html — Action.ShowCard (inline reveal) - Network accessline 193
- https://adaptivecards.io/explorer/Action.ShowCard.html — Action.ShowCard (inline reveal) - Network accessline 194
- https://adaptivecards.io/explorer/Container.html — Container with style property - Network accessline 194
- https://adaptivecards.io/explorer/Container.html — Container with style property - Network accessline 195
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference — Teams card reference - Network accessline 195
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference — Teams card reference - Network accessline 196
- https://github.com/microsoft/teams.ts — Teams SDK v2 - Network accessline 196
- https://github.com/microsoft/teams.ts — Teams SDK v2
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/ui-modals-dialogs-ts.md
- Network accessline 436
- https://api.slack.com/surfaces/modals — Slack modal documentation - Network accessline 436
- https://api.slack.com/surfaces/modals — Slack modal documentation - Network accessline 437
- https://api.slack.com/surfaces/modals/using#pushing — Stacking views with views.push - Network accessline 437
- https://api.slack.com/surfaces/modals/using#pushing — Stacking views with views.push - Network accessline 438
- https://api.slack.com/surfaces/modals/using#closing — notify_on_close and viewClosed - Network accessline 438
- https://api.slack.com/surfaces/modals/using#closing — notify_on_close and viewClosed - Network accessline 439
- https://api.slack.com/reference/interaction-payloads/views — view_submission payload - Network accessline 439
- https://api.slack.com/reference/interaction-payloads/views — view_submission payload - Network accessline 440
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots — Teams task modules - Network accessline 440
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots — Teams task modules - Network accessline 441
- https://github.com/microsoft/teams.ts — Teams SDK v2 - Network accessline 441
- https://github.com/microsoft/teams.ts — Teams SDK v2
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/workflow.composable-platform-ts.md
- Network accessline 285
- https://learn.microsoft.com/en-us/graph/api/resources/list - Network accessline 285
- https://learn.microsoft.com/en-us/graph/api/resources/list - Network accessline 286
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 286
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 287
- https://learn.microsoft.com/en-us/power-automate/getting-started - Network accessline 287
- https://learn.microsoft.com/en-us/power-automate/getting-started
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/bridge/workflows-automation-ts.md
- Network accessline 9
1. **Slack Workflow Builder → Power Automate flows (manual rebuild required).** There is no automated migration tool. Slack workflows are drag-and-drop automations with triggers and steps. Power Automate flows serve the same purpose but wit - Network accessline 9
1. **Slack Workflow Builder → Power Automate flows (manual rebuild required).** There is no automated migration tool. Slack workflows are drag-and-drop automations with triggers and steps. Power Automate flows serve the same purpose but wit - Network accessline 10
2. **Slack workflow triggers → Power Automate triggers.** Slack triggers include: webhook, shortcut, new channel message, emoji reaction, user joins channel. Power Automate equivalents: HTTP request (webhook), Teams message trigger, approva - Network accessline 10
2. **Slack workflow triggers → Power Automate triggers.** Slack triggers include: webhook, shortcut, new channel message, emoji reaction, user joins channel. Power Automate equivalents: HTTP request (webhook), Teams message trigger, approva - Network accessline 11
3. **Slack custom steps (`workflow_step_execute`) → Power Automate custom connectors.** Slack bots can register custom workflow steps that appear in the Workflow Builder. In Power Automate, the equivalent is a custom connector wrapping your - Network accessline 11
3. **Slack custom steps (`workflow_step_execute`) → Power Automate custom connectors.** Slack bots can register custom workflow steps that appear in the Workflow Builder. In Power Automate, the equivalent is a custom connector wrapping your - Network accessline 12
4. **Slack approval workflows → Power Automate Approvals connector (built-in).** Slack workflows that collect approvals via emoji reactions or form submissions map to Power Automate's native Approvals connector. It provides: approval reques - Network accessline 12
4. **Slack approval workflows → Power Automate Approvals connector (built-in).** Slack workflows that collect approvals via emoji reactions or form submissions map to Power Automate's native Approvals connector. It provides: approval reques - Network accessline 13
5. **Teams "Workflows" app provides simple in-Teams automations.** For basic workflows (post to channel on schedule, notify on form submission), the Workflows app in Teams provides templates without leaving Teams. It's powered by Power Auto - Network accessline 13
5. **Teams "Workflows" app provides simple in-Teams automations.** For basic workflows (post to channel on schedule, notify on form submission), the Workflows app in Teams provides templates without leaving Teams. It's powered by Power Auto - Network accessline 14
6. **Bot-driven workflow alternative: state machine + Adaptive Card buttons.** For workflows that don't fit Power Automate's model (complex branching, dynamic participants, long-running multi-step processes), implement a state machine in th - Network accessline 14
6. **Bot-driven workflow alternative: state machine + Adaptive Card buttons.** For workflows that don't fit Power Automate's model (complex branching, dynamic participants, long-running multi-step processes), implement a state machine in th - Network accessline 15
7. **Slack `workflow_step` event lifecycle → custom connector action lifecycle.** Slack's workflow step has `edit` (configure step), `save` (persist config), `execute` (run step). Power Automate custom connectors define: action schema (inpu - Network accessline 15
7. **Slack `workflow_step` event lifecycle → custom connector action lifecycle.** Slack's workflow step has `edit` (configure step), `save` (persist config), `execute` (run step). Power Automate custom connectors define: action schema (inpu - Network accessline 16
8. **Slack workflow variables → Power Automate dynamic content.** Slack workflows pass data between steps via variables set in earlier steps. Power Automate uses "dynamic content" — outputs from previous steps that can be referenced in late - Network accessline 16
8. **Slack workflow variables → Power Automate dynamic content.** Slack workflows pass data between steps via variables set in earlier steps. Power Automate uses "dynamic content" — outputs from previous steps that can be referenced in late - Network accessline 17
9. **Power Automate flows can call Bot Framework via HTTP.** To integrate your Teams bot into a Power Automate flow, expose REST endpoints on your bot's server and call them from Power Automate's HTTP action. The bot can then send proactive - Network accessline 17
9. **Power Automate flows can call Bot Framework via HTTP.** To integrate your Teams bot into a Power Automate flow, expose REST endpoints on your bot's server and call them from Power Automate's HTTP action. The bot can then send proactive - Network accessline 18
10. **Slack Workflow Builder is free; Power Automate has licensing tiers.** Slack Workflow Builder is included in all plans. Power Automate has a free tier (limited runs) and premium tiers. Custom connectors require a premium license. Facto - Network accessline 18
10. **Slack Workflow Builder is free; Power Automate has licensing tiers.** Slack Workflow Builder is included in all plans. Power Automate has a free tier (limited runs) and premium tiers. Custom connectors require a premium license. Facto - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Network accessline 229
- https://learn.microsoft.com/en-us/power-automate/getting-started - Network accessline 229
- https://learn.microsoft.com/en-us/power-automate/getting-started - Network accessline 230
- https://learn.microsoft.com/en-us/power-automate/get-started-approvals - Network accessline 230
- https://learn.microsoft.com/en-us/power-automate/get-started-approvals - Network accessline 231
- https://learn.microsoft.com/en-us/connectors/custom-connectors/ - Network accessline 231
- https://learn.microsoft.com/en-us/connectors/custom-connectors/ - Network accessline 232
- https://learn.microsoft.com/en-us/power-automate/triggers-introduction - Network accessline 232
- https://learn.microsoft.com/en-us/power-automate/triggers-introduction - Network accessline 233
- https://learn.microsoft.com/en-us/power-automate/use-expressions-in-conditions - Network accessline 233
- https://learn.microsoft.com/en-us/power-automate/use-expressions-in-conditions - Network accessline 234
- https://learn.microsoft.com/en-us/power-platform/admin/pricing-billing-skus - Network accessline 234
- https://learn.microsoft.com/en-us/power-platform/admin/pricing-billing-skus - Network accessline 235
- https://github.com/microsoft/teams.ts - Network accessline 235
- https://github.com/microsoft/teams.ts - Network accessline 236
- https://api.slack.com/workflows — Slack Workflow Builder - Network accessline 236
- https://api.slack.com/workflows — Slack Workflow Builder - Network accessline 237
- https://api.slack.com/workflows/steps — Slack custom workflow steps - Network accessline 237
- https://api.slack.com/workflows/steps — Slack custom workflow steps
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/bulk-conversion-strategy-ts.md
- Network accessline 262
- https://www.typescriptlang.org/tsconfig#allowJs -- allowJs for incremental migration - Network accessline 262
- https://www.typescriptlang.org/tsconfig#allowJs -- allowJs for incremental migration - Network accessline 263
- https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html -- official migration guide - Network accessline 263
- https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html -- official migration guide - Network accessline 264
- https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html -- .d.ts files for shims - Network accessline 264
- https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html -- .d.ts files for shims
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/dependency-mapping-ts.md
- Network accessline 9
1. Always check if an `@types/{package}` exists on DefinitelyTyped before declaring a package as untyped. Run `npm info @types/{package}` or search https://www.npmjs.com/~types. - Network accessline 9
1. Always check if an `@types/{package}` exists on DefinitelyTyped before declaring a package as untyped. Run `npm info @types/{package}` or search https://www.npmjs.com/~types. - Network accessline 103
- https://www.npmjs.com/ -- npm package registry (search for equivalents) - Network accessline 103
- https://www.npmjs.com/ -- npm package registry (search for equivalents) - Network accessline 104
- https://www.npmjs.com/~types -- DefinitelyTyped @types packages - Network accessline 104
- https://www.npmjs.com/~types -- DefinitelyTyped @types packages - Network accessline 105
- https://rubygems.org/ -- Ruby gem registry (for understanding source deps) - Network accessline 105
- https://rubygems.org/ -- Ruby gem registry (for understanding source deps) - Network accessline 106
- https://search.maven.org/ -- Maven Central (for understanding source deps) - Network accessline 106
- https://search.maven.org/ -- Maven Central (for understanding source deps) - Network accessline 107
- https://nodejs.org/api/ -- Node.js built-in modules - Network accessline 107
- https://nodejs.org/api/ -- Node.js built-in modules
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/java-to-ts-ts.md
- Network accessline 434
- https://www.typescriptlang.org/docs/handbook/2/classes.html -- TS classes and inheritance - Network accessline 434
- https://www.typescriptlang.org/docs/handbook/2/classes.html -- TS classes and inheritance - Network accessline 435
- https://www.typescriptlang.org/docs/handbook/2/generics.html -- TS generics - Network accessline 435
- https://www.typescriptlang.org/docs/handbook/2/generics.html -- TS generics - Network accessline 436
- https://www.typescriptlang.org/docs/handbook/decorators.html -- TS decorators (annotation equivalent) - Network accessline 436
- https://www.typescriptlang.org/docs/handbook/decorators.html -- TS decorators (annotation equivalent) - Network accessline 437
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map -- JS Map (HashMap equivalent) - Network accessline 437
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map -- JS Map (HashMap equivalent) - Network accessline 438
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise -- Promise (Future equivalent) - Network accessline 438
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise -- Promise (Future equivalent)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/js-to-ts-ts.md
- Network accessline 59
// --- Before (JS) --- function fetchData(url, callback) { fetch(url) - Network accessline 59
// --- Before (JS) --- function fetchData(url, callback) { fetch(url) - Network accessline 60
function fetchData(url, callback) { fetch(url) .then(res => res.json()) - Network accessline 60
function fetchData(url, callback) { fetch(url) .then(res => res.json()) - Network accessline 61
fetch(url) - Network accessline 61
fetch(url) - Network accessline 75
async function fetchData<T>(url: string): Promise<FetchResult<T>> { const res = await fetch(url); - Network accessline 75
async function fetchData<T>(url: string): Promise<FetchResult<T>> { const res = await fetch(url); - Network accessline 76
const res = await fetch(url); - Network accessline 76
const res = await fetch(url); - Network accessline 118
- https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html - Network accessline 118
- https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html - Network accessline 119
- https://www.typescriptlang.org/tsconfig -- tsconfig reference - Network accessline 119
- https://www.typescriptlang.org/tsconfig -- tsconfig reference - Network accessline 120
- https://github.com/DefinitelyTyped/DefinitelyTyped -- @types packages - Network accessline 120
- https://github.com/DefinitelyTyped/DefinitelyTyped -- @types packages - Network accessline 121
- https://www.typescriptlang.org/docs/handbook/2/types-from-types.html -- utility types - Network accessline 121
- https://www.typescriptlang.org/docs/handbook/2/types-from-types.html -- utility types
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/json-serialization-ts.md
- Network accessline 209
- https://zod.dev/ -- Zod schema validation library - Network accessline 209
- https://zod.dev/ -- Zod schema validation library - Network accessline 210
- https://github.com/google/gson -- Gson (source library reference) - Network accessline 210
- https://github.com/google/gson -- Gson (source library reference) - Network accessline 211
- https://github.com/FasterXML/jackson -- Jackson (source library reference) - Network accessline 211
- https://github.com/FasterXML/jackson -- Jackson (source library reference) - Network accessline 212
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON -- JSON built-in - Network accessline 212
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON -- JSON built-in - Network accessline 213
- https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions -- discriminated unions - Network accessline 213
- https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions -- discriminated unions
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/kotlin-to-ts-ts.md
- Network accessline 195
- https://kotlinlang.org/docs/basic-syntax.html — Kotlin syntax reference - Network accessline 195
- https://kotlinlang.org/docs/basic-syntax.html — Kotlin syntax reference - Network accessline 196
- https://kotlinlang.org/docs/null-safety.html — Kotlin null-safety operators - Network accessline 196
- https://kotlinlang.org/docs/null-safety.html — Kotlin null-safety operators - Network accessline 197
- https://kotlinlang.org/docs/lambdas.html — Kotlin lambda syntax and SAM conversions - Network accessline 197
- https://kotlinlang.org/docs/lambdas.html — Kotlin lambda syntax and SAM conversions - Network accessline 198
- https://kotlinlang.org/docs/scope-functions.html — let, run, apply, also, with - Network accessline 198
- https://kotlinlang.org/docs/scope-functions.html — let, run, apply, also, with - Network accessline 199
- https://kotlinlang.org/docs/data-classes.html — Data classes - Network accessline 199
- https://kotlinlang.org/docs/data-classes.html — Data classes - Network accessline 200
- https://kotlinlang.org/docs/extensions.html — Extension functions - Network accessline 200
- https://kotlinlang.org/docs/extensions.html — Extension functions - Network accessline 201
- https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html — TS template literals - Network accessline 201
- https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html — TS template literals - Network accessline 202
- https://www.typescriptlang.org/docs/handbook/2/narrowing.html — TS type narrowing and guards - Network accessline 202
- https://www.typescriptlang.org/docs/handbook/2/narrowing.html — TS type narrowing and guards
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/ruby-to-ts-ts.md
- Network accessline 116
def notify(message, opts = {}) icon = opts.fetch(:icon_emoji, ':robot_face:') - Network accessline 116
def notify(message, opts = {}) icon = opts.fetch(:icon_emoji, ':robot_face:') - Network accessline 117
icon = opts.fetch(:icon_emoji, ':robot_face:') - Network accessline 117
icon = opts.fetch(:icon_emoji, ':robot_face:') - Network accessline 123
notifier = SlackNotifier.new(webhook_url: 'https://...', channel: '#alerts') - Network accessline 123
notifier = SlackNotifier.new(webhook_url: 'https://...', channel: '#alerts') - Network accessline 160
const notifier = new SlackNotifier({ webhookUrl: 'https://...', channel: '#alerts' }); - Network accessline 160
const notifier = new SlackNotifier({ webhookUrl: 'https://...', channel: '#alerts' }); - Network accessline 210
- https://www.typescriptlang.org/docs/handbook/2/classes.html -- TS classes - Network accessline 210
- https://www.typescriptlang.org/docs/handbook/2/classes.html -- TS classes - Network accessline 211
- https://www.typescriptlang.org/docs/handbook/2/objects.html -- structural typing - Network accessline 211
- https://www.typescriptlang.org/docs/handbook/2/objects.html -- structural typing - Network accessline 212
- https://www.typescriptlang.org/docs/handbook/mixins.html -- mixin pattern - Network accessline 212
- https://www.typescriptlang.org/docs/handbook/mixins.html -- mixin pattern - Network accessline 213
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array -- JS array methods (Enumerable equivalents) - Network accessline 213
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array -- JS array methods (Enumerable equivalents) - Network accessline 214
- https://ruby-doc.org/core/Enumerable.html -- Ruby Enumerable reference (for mapping) - Network accessline 214
- https://ruby-doc.org/core/Enumerable.html -- Ruby Enumerable reference (for mapping)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/convert/type-mapping-ts.md
- Network accessline 200
- https://www.typescriptlang.org/docs/handbook/2/everyday-types.html -- basic types - Network accessline 200
- https://www.typescriptlang.org/docs/handbook/2/everyday-types.html -- basic types - Network accessline 201
- https://www.typescriptlang.org/docs/handbook/2/narrowing.html -- type narrowing and guards - Network accessline 201
- https://www.typescriptlang.org/docs/handbook/2/narrowing.html -- type narrowing and guards - Network accessline 202
- https://www.typescriptlang.org/docs/handbook/2/generics.html -- generics - Network accessline 202
- https://www.typescriptlang.org/docs/handbook/2/generics.html -- generics - Network accessline 203
- https://www.typescriptlang.org/docs/handbook/utility-types.html -- Readonly, Partial, Pick, etc. - Network accessline 203
- https://www.typescriptlang.org/docs/handbook/utility-types.html -- Readonly, Partial, Pick, etc. - Network accessline 204
- https://www.typescriptlang.org/docs/handbook/2/types-from-types.html -- advanced type construction - Network accessline 204
- https://www.typescriptlang.org/docs/handbook/2/types-from-types.html -- advanced type construction
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/deploy/aws-bot-deploy-ts.md
- Network accessline 9
1. **Install prerequisites.** You need: Node.js 20 LTS, AWS CLI v2, and optionally AWS SAM CLI (`pip install aws-sam-cli`) or AWS CDK (`npm install -g aws-cdk`). Verify with `aws --version` and `node --version`. [docs.aws.amazon.com/cli/lat - Network accessline 9
1. **Install prerequisites.** You need: Node.js 20 LTS, AWS CLI v2, and optionally AWS SAM CLI (`pip install aws-sam-cli`) or AWS CDK (`npm install -g aws-cdk`). Verify with `aws --version` and `node --version`. [docs.aws.amazon.com/cli/lat - Network accessline 10
2. **Configure AWS credentials.** Run `aws configure` and enter your IAM access key, secret key, default region, and output format. For SSO-enabled organizations, use `aws sso login` instead. Verify with `aws sts get-caller-identity`. [docs - Network accessline 10
2. **Configure AWS credentials.** Run `aws configure` and enter your IAM access key, secret key, default region, and output format. For SSO-enabled organizations, use `aws sso login` instead. Verify with `aws sts get-caller-identity`. [docs - Network accessline 11
3. **Create an IAM user or role for the bot.** The bot's execution role needs permissions for: CloudWatch Logs (logging), Secrets Manager or SSM Parameter Store (credentials), and any other AWS services it accesses. Use least-privilege — do - Network accessline 11
3. **Create an IAM user or role for the bot.** The bot's execution role needs permissions for: CloudWatch Logs (logging), Secrets Manager or SSM Parameter Store (credentials), and any other AWS services it accesses. Use least-privilege — do - Network accessline 12
4. **Create a Slack API app at api.slack.com.** Under "OAuth & Permissions", install the app to your workspace and copy the Bot User OAuth Token (`xoxb-...`). Under "Basic Information", copy the Signing Secret. For Socket Mode, also create - Network accessline 12
4. **Create a Slack API app at api.slack.com.** Under "OAuth & Permissions", install the app to your workspace and copy the Bot User OAuth Token (`xoxb-...`). Under "Basic Information", copy the Signing Secret. For Socket Mode, also create - Network accessline 13
5. **Choose your compute target.** Lambda + API Gateway (serverless, event-driven — best for HTTP-mode Slack bots), EC2 or Elastic Beanstalk (always-on — required for Socket Mode, good for Teams bots), or ECS Fargate (containerized, product - Network accessline 13
5. **Choose your compute target.** Lambda + API Gateway (serverless, event-driven — best for HTTP-mode Slack bots), EC2 or Elastic Beanstalk (always-on — required for Socket Mode, good for Teams bots), or ECS Fargate (containerized, product - Network accessline 14
6. **For Lambda: use SAM or CDK to define the stack.** A SAM template defines the Lambda function + API Gateway in YAML. `sam build && sam deploy --guided` handles packaging, uploading, and CloudFormation stack creation. [docs.aws.amazon.co - Network accessline 14
6. **For Lambda: use SAM or CDK to define the stack.** A SAM template defines the Lambda function + API Gateway in YAML. `sam build && sam deploy --guided` handles packaging, uploading, and CloudFormation stack creation. [docs.aws.amazon.co - Network accessline 15
7. **For Lambda: handle the Slack 3-second ack deadline.** Lambda cold starts can take 1-5 seconds. Use provisioned concurrency (`ProvisionedConcurrencyConfig` in SAM) to keep warm instances, or use the async pattern: immediately return 200 - Network accessline 15
7. **For Lambda: handle the Slack 3-second ack deadline.** Lambda cold starts can take 1-5 seconds. Use provisioned concurrency (`ProvisionedConcurrencyConfig` in SAM) to keep warm instances, or use the async pattern: immediately return 200 - Network accessline 16
8. **Socket Mode cannot run on Lambda.** Socket Mode requires a persistent WebSocket connection — Lambda functions are ephemeral. Use EC2, Elastic Beanstalk, or ECS Fargate for Socket Mode bots. HTTP-mode Slack bots work fine on Lambda. 9. - Network accessline 16
8. **Socket Mode cannot run on Lambda.** Socket Mode requires a persistent WebSocket connection — Lambda functions are ephemeral. Use EC2, Elastic Beanstalk, or ECS Fargate for Socket Mode bots. HTTP-mode Slack bots work fine on Lambda. 9. - Network accessline 17
[Credential-related source omitted] - Network accessline 17
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Network accessline 18
10. **For Teams bots on AWS: you still need Azure Bot Service.** Register an App Registration in Entra ID (Azure AD), create a Bot Service resource, and set the messaging endpoint to your AWS URL (e.g., `https://<api-id>.execute-api.<region - Network accessline 18
10. **For Teams bots on AWS: you still need Azure Bot Service.** Register an App Registration in Entra ID (Azure AD), create a Bot Service resource, and set the messaging endpoint to your AWS URL (e.g., `https://<api-id>.execute-api.<region - Network accessline 20
12. **Set up CloudWatch alarms for error monitoring.** Create alarms for Lambda errors (`Errors` metric > 0), API Gateway 5xx responses, and invocation duration. Use `aws cloudwatch put-metric-alarm` or define them in your SAM/CDK template. - Network accessline 20
12. **Set up CloudWatch alarms for error monitoring.** Create alarms for Lambda errors (`Errors` metric > 0), API Gateway 5xx responses, and invocation duration. Use `aws cloudwatch put-metric-alarm` or define them in your SAM/CDK template. - Network accessline 98
SlackEndpoint: Description: "URL for Slack Event Subscriptions" Value: !Sub "https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/slack/events" - Network accessline 98
SlackEndpoint: Description: "URL for Slack Event Subscriptions" Value: !Sub "https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/slack/events" - Network accessline 100
Value: !Sub "https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/slack/events" - Network accessline 100
Value: !Sub "https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/slack/events" - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Network accessline 162
# Configure Slack Request URL: # https://slack-bot-env.us-east-1.elasticbeanstalk.com/slack/events - Network accessline 162
# Configure Slack Request URL: # https://slack-bot-env.us-east-1.elasticbeanstalk.com/slack/events - Network accessline 163
# https://slack-bot-env.us-east-1.elasticbeanstalk.com/slack/events - Network accessline 163
# https://slack-bot-env.us-east-1.elasticbeanstalk.com/slack/events - Network accessline 187
# Step 3: Set the messaging endpoint to your AWS URL API_URL="https://abc123.execute-api.us-east-1.amazonaws.com/api/messages" - Network accessline 187
# Step 3: Set the messaging endpoint to your AWS URL API_URL="https://abc123.execute-api.us-east-1.amazonaws.com/api/messages" - Network accessline 188
API_URL="https://abc123.execute-api.us-east-1.amazonaws.com/api/messages" - Network accessline 188
API_URL="https://abc123.execute-api.us-east-1.amazonaws.com/api/messages" - Access to secretsline 192
[Credential-related source omitted] - Access to secretsline 192
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Network accessline 210
# 2. SSH in and install Node.js ssh -i my-key.pem ec2-user@<public-ip> curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - Network accessline 210
# 2. SSH in and install Node.js ssh -i my-key.pem ec2-user@<public-ip> curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - Network accessline 211
ssh -i my-key.pem ec2-user@<public-ip> curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo yum install -y nodejs - Network accessline 211
ssh -i my-key.pem ec2-user@<public-ip> curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo yum install -y nodejs - Dangerous shell operationline 212
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - Dangerous shell operationline 212
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - Network accessline 212
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - Network accessline 212
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - Dangerous shell operationline 213
sudo yum install -y nodejs - Dangerous shell operationline 213
sudo yum install -y nodejs - Network accessline 215
# 3. Clone, install, build git clone https://github.com/your-org/your-bot.git - Network accessline 215
# 3. Clone, install, build git clone https://github.com/your-org/your-bot.git - Network accessline 216
git clone https://github.com/your-org/your-bot.git - Network accessline 216
git clone https://github.com/your-org/your-bot.git - Access to secretsline 220
[Credential-related source omitted] - Access to secretsline 220
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Network accessline 243
- https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html - Network accessline 243
- https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html - Network accessline 244
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html - Network accessline 244
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html - Network accessline 245
- https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html - Network accessline 245
- https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html - Network accessline 246
- https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html - Network accessline 246
- https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html - Network accessline 247
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.html - Network accessline 247
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.html - Network accessline 248
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html - Network accessline 248
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html - Network accessline 249
- https://api.slack.com/authentication/basics - Network accessline 249
- https://api.slack.com/authentication/basics - Network accessline 250
- https://slack.dev/bolt-js/deployments/aws-lambda - Network accessline 250
- https://slack.dev/bolt-js/deployments/aws-lambda - Network accessline 251
- https://learn.microsoft.com/azure/bot-service/bot-service-quickstart-registration - Network accessline 251
- https://learn.microsoft.com/azure/bot-service/bot-service-quickstart-registration
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/deploy/aws-cli-reference-ts.md
- Network accessline 9
1. **This is a reference, not a tutorial.** For step-by-step deployment walkthroughs, see `aws-bot-deploy-ts.md`. This file catalogs every `aws` command group relevant to bot/agent projects. 2. **Always authenticate first.** Every command b - Network accessline 9
1. **This is a reference, not a tutorial.** For step-by-step deployment walkthroughs, see `aws-bot-deploy-ts.md`. This file catalogs every `aws` command group relevant to bot/agent projects. 2. **Always authenticate first.** Every command b - Network accessline 10
2. **Always authenticate first.** Every command below assumes you have run `aws configure` (or `aws sso login`) and verified with `aws sts get-caller-identity`. [docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html](https: - Network accessline 10
2. **Always authenticate first.** Every command below assumes you have run `aws configure` (or `aws sso login`) and verified with `aws sts get-caller-identity`. [docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html](https: - Network accessline 60
Reference: [docs.aws.amazon.com/cli/latest/reference/iam](https://docs.aws.amazon.com/cli/latest/reference/iam) - Network accessline 60
Reference: [docs.aws.amazon.com/cli/latest/reference/iam](https://docs.aws.amazon.com/cli/latest/reference/iam) - Network accessline 129
Reference: [docs.aws.amazon.com/cli/latest/reference/lambda](https://docs.aws.amazon.com/cli/latest/reference/lambda) - Network accessline 129
Reference: [docs.aws.amazon.com/cli/latest/reference/lambda](https://docs.aws.amazon.com/cli/latest/reference/lambda) - Network accessline 194
Reference: [docs.aws.amazon.com/cli/latest/reference/apigatewayv2](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2) - Network accessline 194
Reference: [docs.aws.amazon.com/cli/latest/reference/apigatewayv2](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2) - Network accessline 244
Reference: [docs.aws.amazon.com/cli/latest/reference/ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2) - Network accessline 244
Reference: [docs.aws.amazon.com/cli/latest/reference/ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2) - Network accessline 290
Reference: [docs.aws.amazon.com/cli/latest/reference/ecs](https://docs.aws.amazon.com/cli/latest/reference/ecs) - Network accessline 290
Reference: [docs.aws.amazon.com/cli/latest/reference/ecs](https://docs.aws.amazon.com/cli/latest/reference/ecs) - Network accessline 309
Reference: [docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk](https://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk) - Network accessline 309
Reference: [docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk](https://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk) - Network accessline 328
Reference: [docs.aws.amazon.com/cli/latest/reference/apprunner](https://docs.aws.amazon.com/cli/latest/reference/apprunner) - Network accessline 328
Reference: [docs.aws.amazon.com/cli/latest/reference/apprunner](https://docs.aws.amazon.com/cli/latest/reference/apprunner) - Network accessline 346
Reference: [docs.aws.amazon.com/cli/latest/reference/secretsmanager](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager) - Network accessline 346
Reference: [docs.aws.amazon.com/cli/latest/reference/secretsmanager](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager) - Network accessline 364
Reference: [docs.aws.amazon.com/cli/latest/reference/ssm](https://docs.aws.amazon.com/cli/latest/reference/ssm) - Network accessline 364
Reference: [docs.aws.amazon.com/cli/latest/reference/ssm](https://docs.aws.amazon.com/cli/latest/reference/ssm) - Network accessline 395
Reference: [docs.aws.amazon.com/cli/latest/reference/cloudwatch](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch) - Network accessline 395
Reference: [docs.aws.amazon.com/cli/latest/reference/cloudwatch](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch) - Dangerous shell operationline 411
| `aws s3 rm s3://my-bot-artifacts/deploys/function.zip` | Delete object | - Dangerous shell operationline 411
| `aws s3 rm s3://my-bot-artifacts/deploys/function.zip` | Delete object | - Network accessline 425
Reference: [docs.aws.amazon.com/cli/latest/reference/s3](https://docs.aws.amazon.com/cli/latest/reference/s3) - Network accessline 425
Reference: [docs.aws.amazon.com/cli/latest/reference/s3](https://docs.aws.amazon.com/cli/latest/reference/s3) - Network accessline 459
Reference: [docs.aws.amazon.com/cli/latest/reference/dynamodb](https://docs.aws.amazon.com/cli/latest/reference/dynamodb) - Network accessline 459
Reference: [docs.aws.amazon.com/cli/latest/reference/dynamodb](https://docs.aws.amazon.com/cli/latest/reference/dynamodb) - Network accessline 480
Reference: [docs.aws.amazon.com/cli/latest/reference/sqs](https://docs.aws.amazon.com/cli/latest/reference/sqs) - Network accessline 480
Reference: [docs.aws.amazon.com/cli/latest/reference/sqs](https://docs.aws.amazon.com/cli/latest/reference/sqs) - Network accessline 498
Reference: [docs.aws.amazon.com/cli/latest/reference/sns](https://docs.aws.amazon.com/cli/latest/reference/sns) - Network accessline 498
Reference: [docs.aws.amazon.com/cli/latest/reference/sns](https://docs.aws.amazon.com/cli/latest/reference/sns) - Network accessline 524
Reference: [docs.aws.amazon.com/cli/latest/reference/ecr](https://docs.aws.amazon.com/cli/latest/reference/ecr) - Network accessline 524
Reference: [docs.aws.amazon.com/cli/latest/reference/ecr](https://docs.aws.amazon.com/cli/latest/reference/ecr) - Network accessline 544
Reference: [docs.aws.amazon.com/cli/latest/reference/cloudformation](https://docs.aws.amazon.com/cli/latest/reference/cloudformation) - Network accessline 544
Reference: [docs.aws.amazon.com/cli/latest/reference/cloudformation](https://docs.aws.amazon.com/cli/latest/reference/cloudformation) - Network accessline 557
Reference: [docs.aws.amazon.com/cli/latest/reference/sts](https://docs.aws.amazon.com/cli/latest/reference/sts) - Network accessline 557
Reference: [docs.aws.amazon.com/cli/latest/reference/sts](https://docs.aws.amazon.com/cli/latest/reference/sts) - Network accessline 596
Reference: [docs.aws.amazon.com/cli/latest/reference/route53](https://docs.aws.amazon.com/cli/latest/reference/route53) - Network accessline 596
Reference: [docs.aws.amazon.com/cli/latest/reference/route53](https://docs.aws.amazon.com/cli/latest/reference/route53) - Network accessline 626
Reference: [docs.aws.amazon.com/cli/latest/reference/acm](https://docs.aws.amazon.com/cli/latest/reference/acm) - Network accessline 626
Reference: [docs.aws.amazon.com/cli/latest/reference/acm](https://docs.aws.amazon.com/cli/latest/reference/acm) - Network accessline 707
Reference: [docs.aws.amazon.com/cli/latest/reference/bedrock](https://docs.aws.amazon.com/cli/latest/reference/bedrock) - Network accessline 707
Reference: [docs.aws.amazon.com/cli/latest/reference/bedrock](https://docs.aws.amazon.com/cli/latest/reference/bedrock) - Network accessline 758
Reference: [docs.aws.amazon.com/cli/latest/reference/lexv2-models](https://docs.aws.amazon.com/cli/latest/reference/lexv2-models) - Network accessline 758
Reference: [docs.aws.amazon.com/cli/latest/reference/lexv2-models](https://docs.aws.amazon.com/cli/latest/reference/lexv2-models) - Network accessline 815
# 7. Get endpoint URL for Slack app configuration echo "Slack Request URL: https://$API_ID.execute-api.us-east-1.amazonaws.com/slack/events" - Network accessline 815
# 7. Get endpoint URL for Slack app configuration echo "Slack Request URL: https://$API_ID.execute-api.us-east-1.amazonaws.com/slack/events" - Network accessline 816
echo "Slack Request URL: https://$API_ID.execute-api.us-east-1.amazonaws.com/slack/events" - Network accessline 816
echo "Slack Request URL: https://$API_ID.execute-api.us-east-1.amazonaws.com/slack/events"
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/deploy/azure-bot-deploy-ts.md
- Network accessline 9
1. **Install prerequisites before anything else.** You need: Node.js 20 LTS, Azure CLI (`az`), and optionally the Agents Toolkit CLI (`npm install -g @microsoft/m365agentstoolkit-cli`). Verify with `az --version` and `node --version`. [lear - Network accessline 9
1. **Install prerequisites before anything else.** You need: Node.js 20 LTS, Azure CLI (`az`), and optionally the Agents Toolkit CLI (`npm install -g @microsoft/m365agentstoolkit-cli`). Verify with `az --version` and `node --version`. [lear - Network accessline 10
2. **Authenticate and set the target subscription.** Run `az login` to open browser auth, then `az account set --subscription <subscription-id>`. All subsequent commands use this subscription. [learn.microsoft.com/cli/azure/authenticate-azu - Network accessline 10
2. **Authenticate and set the target subscription.** Run `az login` to open browser auth, then `az account set --subscription <subscription-id>`. All subsequent commands use this subscription. [learn.microsoft.com/cli/azure/authenticate-azu - Network accessline 11
3. **Create a resource group to contain all bot resources.** `az group create --name <rg-name> --location <region>`. Use a region close to your users (e.g., `eastus`, `westeurope`). All subsequent resources go in this group. [learn.microsof - Network accessline 11
3. **Create a resource group to contain all bot resources.** `az group create --name <rg-name> --location <region>`. Use a region close to your users (e.g., `eastus`, `westeurope`). All subsequent resources go in this group. [learn.microsof - Network accessline 12
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Network accessline 13
5. **Create an Azure Bot Service resource (Teams bots).** `az bot create --resource-group <rg> --name <bot-name> --app-type SingleTenant --appid <appId> --tenant-id <tenantId>`. Set the messaging endpoint to `https://<app-name>.azurewebsite - Network accessline 13
5. **Create an Azure Bot Service resource (Teams bots).** `az bot create --resource-group <rg> --name <bot-name> --app-type SingleTenant --appid <appId> --tenant-id <tenantId>`. Set the messaging endpoint to `https://<app-name>.azurewebsite - Network accessline 14
6. **Connect the Bot Service to Teams.** `az bot msteams create --resource-group <rg> --name <bot-name>`. Without this, Teams cannot reach your bot even if it's deployed and running. [learn.microsoft.com/azure/bot-service/channel-connect-te - Network accessline 14
6. **Connect the Bot Service to Teams.** `az bot msteams create --resource-group <rg> --name <bot-name>`. Without this, Teams cannot reach your bot even if it's deployed and running. [learn.microsoft.com/azure/bot-service/channel-connect-te - Network accessline 15
7. **For Slack bots on Azure, skip Bot Service.** Deploy as a plain web app with the Bolt HTTP receiver. Configure the Slack app's Event Subscriptions Request URL and Interactivity URL to `https://<app-name>.azurewebsites.net/slack/events`. - Network accessline 15
7. **For Slack bots on Azure, skip Bot Service.** Deploy as a plain web app with the Bolt HTTP receiver. Configure the Slack app's Event Subscriptions Request URL and Interactivity URL to `https://<app-name>.azurewebsites.net/slack/events`. - Network accessline 16
8. **Choose your compute target.** App Service (recommended — always-on, simple), Azure Functions Premium (serverless with warm instances), or Container Apps (containerized workloads with scale-to-zero). Avoid Functions Consumption plan for - Network accessline 16
8. **Choose your compute target.** App Service (recommended — always-on, simple), Azure Functions Premium (serverless with warm instances), or Container Apps (containerized workloads with scale-to-zero). Avoid Functions Consumption plan for - Network accessline 17
9. **Provision the compute resource with Node.js 20 LTS.** For App Service: `az webapp create --resource-group <rg> --plan <plan-name> --name <app-name> --runtime "NODE:20-lts"`. For Functions: `az functionapp create ... --runtime node --ru - Network accessline 17
9. **Provision the compute resource with Node.js 20 LTS.** For App Service: `az webapp create --resource-group <rg> --plan <plan-name> --name <app-name> --runtime "NODE:20-lts"`. For Functions: `az functionapp create ... --runtime node --ru - Network accessline 18
10. **Configure App Settings with all required environment variables.** `az webapp config appsettings set --resource-group <rg> --name <app-name> --settings MicrosoftAppId=<appId> MicrosoftAppPassword=<secret> MicrosoftAppTenantId=<tenantId - Network accessline 18
10. **Configure App Settings with all required environment variables.** `az webapp config appsettings set --resource-group <rg> --name <app-name> --settings MicrosoftAppId=<appId> MicrosoftAppPassword=<secret> MicrosoftAppTenantId=<tenantId - Network accessline 19
11. **Build and deploy.** Run `npm run build` locally, then zip deploy: `az webapp deploy --resource-group <rg> --name <app-name> --src-path <zip-path> --type zip`. For Functions: `func azure functionapp publish <app-name>`. [learn.microsof - Network accessline 19
11. **Build and deploy.** Run `npm run build` locally, then zip deploy: `az webapp deploy --resource-group <rg> --name <app-name> --src-path <zip-path> --type zip`. For Functions: `func azure functionapp publish <app-name>`. [learn.microsof - Network accessline 20
12. **Enable Always On for App Service.** `az webapp config set --resource-group <rg> --name <app-name> --always-on true`. Without this, the app goes idle after 20 minutes and the next request cold-starts. For Functions Premium, configure A - Network accessline 20
12. **Enable Always On for App Service.** `az webapp config set --resource-group <rg> --name <app-name> --always-on true`. Without this, the app goes idle after 20 minutes and the next request cold-starts. For Functions Premium, configure A - Network accessline 21
13. **Verify the deployment.** Check the health endpoint: `curl https://<app-name>.azurewebsites.net/api/health`. Then send a test message in Teams or Slack. Check App Service logs: `az webapp log tail --resource-group <rg> --name <app-name - Network accessline 21
13. **Verify the deployment.** Check the health endpoint: `curl https://<app-name>.azurewebsites.net/api/health`. Then send a test message in Teams or Slack. Check App Service logs: `az webapp log tail --resource-group <rg> --name <app-name - Network accessline 22
14. **Agents Toolkit fast path (Teams bots).** Instead of steps 3-12, run `atk provision` (creates App Registration, Bot Service, App Service, and all config) then `atk deploy` (builds and deploys). Two commands replace the entire manual pr - Network accessline 22
14. **Agents Toolkit fast path (Teams bots).** Instead of steps 3-12, run `atk provision` (creates App Registration, Bot Service, App Service, and all config) then `atk deploy` (builds and deploys). Two commands replace the entire manual pr - Access to secretsline 86
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 127
az bot update --resource-group rg-mybot --name mybot-bot --endpoint "https://mybot-app.azurewebsites.net/api/messages" - Network accessline 127
az bot update --resource-group rg-mybot --name mybot-bot --endpoint "https://mybot-app.azurewebsites.net/api/messages" - Network accessline 128
--resource-group rg-mybot \ --name mybot-bot \ --endpoint "https://mybot-app.azurewebsites.net/api/messages" - Network accessline 128
--resource-group rg-mybot \ --name mybot-bot \ --endpoint "https://mybot-app.azurewebsites.net/api/messages" - Network accessline 130
--endpoint "https://mybot-app.azurewebsites.net/api/messages" - Network accessline 130
--endpoint "https://mybot-app.azurewebsites.net/api/messages" - Network accessline 137
# 12. Verify curl https://mybot-app.azurewebsites.net/api/health - Network accessline 137
# 12. Verify curl https://mybot-app.azurewebsites.net/api/health - Network accessline 138
curl https://mybot-app.azurewebsites.net/api/health - Network accessline 138
curl https://mybot-app.azurewebsites.net/api/health - Network accessline 154
# 4. Sideload to Teams for testing # Get TEAMS_APP_ID from env/.env.dev, open: # https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true - Network accessline 154
# 4. Sideload to Teams for testing # Get TEAMS_APP_ID from env/.env.dev, open: # https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true - Network accessline 156
# https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true - Network accessline 156
# https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true - Network accessline 195
# 4. Configure Slack app URLs at api.slack.com: # Event Subscriptions Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 195
# 4. Configure Slack app URLs at api.slack.com: # Event Subscriptions Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 196
# Event Subscriptions Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 196
# Event Subscriptions Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 197
# Interactivity Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 197
# Interactivity Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 198
# Slash Command Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 198
# Slash Command Request URL: https://slackbot-app.azurewebsites.net/slack/events - Network accessline 218
# Configure Slack app URLs at api.slack.com: # Event Subscriptions: https://mybot-app.azurewebsites.net/slack/events - Network accessline 218
# Configure Slack app URLs at api.slack.com: # Event Subscriptions: https://mybot-app.azurewebsites.net/slack/events - Network accessline 219
# Event Subscriptions: https://mybot-app.azurewebsites.net/slack/events - Network accessline 219
# Event Subscriptions: https://mybot-app.azurewebsites.net/slack/events - Network accessline 220
# Interactivity: https://mybot-app.azurewebsites.net/slack/events - Network accessline 220
# Interactivity: https://mybot-app.azurewebsites.net/slack/events - Access to secretsline 227
[Credential-related source omitted] - Access to secretsline 227
[Credential-related source omitted] - Network accessline 236
- https://learn.microsoft.com/cli/azure/install-azure-cli - Network accessline 236
- https://learn.microsoft.com/cli/azure/install-azure-cli - Network accessline 237
- https://learn.microsoft.com/entra/identity-platform/quickstart-register-app - Network accessline 237
- https://learn.microsoft.com/entra/identity-platform/quickstart-register-app - Network accessline 238
- https://learn.microsoft.com/azure/bot-service/bot-service-quickstart-registration - Network accessline 238
- https://learn.microsoft.com/azure/bot-service/bot-service-quickstart-registration - Network accessline 239
- https://learn.microsoft.com/azure/bot-service/channel-connect-teams - Network accessline 239
- https://learn.microsoft.com/azure/bot-service/channel-connect-teams - Network accessline 240
- https://learn.microsoft.com/azure/app-service/quickstart-nodejs - Network accessline 240
- https://learn.microsoft.com/azure/app-service/quickstart-nodejs - Network accessline 241
- https://learn.microsoft.com/azure/app-service/deploy-zip - Network accessline 241
- https://learn.microsoft.com/azure/app-service/deploy-zip - Network accessline 242
- https://learn.microsoft.com/azure/app-service/configure-common - Network accessline 242
- https://learn.microsoft.com/azure/app-service/configure-common - Network accessline 243
- https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/microsoft-365-agents-toolkit-cli - Network accessline 243
- https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/microsoft-365-agents-toolkit-cli - Network accessline 244
- https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs - Network accessline 244
- https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/deploy/azure-cli-reference-ts.md
- Network accessline 9
1. **This is a reference, not a tutorial.** For step-by-step deployment walkthroughs, see `azure-bot-deploy-ts.md`. This file catalogs every `az` command group relevant to bot/agent projects. 2. **Always authenticate first.** Every command - Network accessline 9
1. **This is a reference, not a tutorial.** For step-by-step deployment walkthroughs, see `azure-bot-deploy-ts.md`. This file catalogs every `az` command group relevant to bot/agent projects. 2. **Always authenticate first.** Every command - Network accessline 10
2. **Always authenticate first.** Every command below assumes you have run `az login` and `az account set --subscription <id>`. [learn.microsoft.com/cli/azure/authenticate-azure-cli](https://learn.microsoft.com/cli/azure/authenticate-azure- - Network accessline 10
2. **Always authenticate first.** Every command below assumes you have run `az login` and `az account set --subscription <id>`. [learn.microsoft.com/cli/azure/authenticate-azure-cli](https://learn.microsoft.com/cli/azure/authenticate-azure- - Network accessline 29
Reference: [learn.microsoft.com/cli/azure/bot](https://learn.microsoft.com/cli/azure/bot) - Network accessline 29
Reference: [learn.microsoft.com/cli/azure/bot](https://learn.microsoft.com/cli/azure/bot) - Network accessline 48
Reference: [learn.microsoft.com/cli/azure/bot/msteams](https://learn.microsoft.com/cli/azure/bot/msteams) - Network accessline 48
Reference: [learn.microsoft.com/cli/azure/bot/msteams](https://learn.microsoft.com/cli/azure/bot/msteams) - Network accessline 62
Reference: [learn.microsoft.com/cli/azure/bot/authsetting](https://learn.microsoft.com/cli/azure/bot/authsetting) - Network accessline 62
Reference: [learn.microsoft.com/cli/azure/bot/authsetting](https://learn.microsoft.com/cli/azure/bot/authsetting) - Network accessline 84
Reference: [learn.microsoft.com/cli/azure/cognitiveservices/agent](https://learn.microsoft.com/cli/azure/cognitiveservices/agent) - Network accessline 84
Reference: [learn.microsoft.com/cli/azure/cognitiveservices/agent](https://learn.microsoft.com/cli/azure/cognitiveservices/agent) - Network accessline 107
Reference: [learn.microsoft.com/cli/azure/cognitiveservices/account](https://learn.microsoft.com/cli/azure/cognitiveservices/account) - Network accessline 107
Reference: [learn.microsoft.com/cli/azure/cognitiveservices/account](https://learn.microsoft.com/cli/azure/cognitiveservices/account) - Network accessline 129
Reference: [learn.microsoft.com/cli/azure/ad/app](https://learn.microsoft.com/cli/azure/ad/app) - Network accessline 129
Reference: [learn.microsoft.com/cli/azure/ad/app](https://learn.microsoft.com/cli/azure/ad/app) - Network accessline 140
Reference: [learn.microsoft.com/cli/azure/identity](https://learn.microsoft.com/cli/azure/identity) - Network accessline 140
Reference: [learn.microsoft.com/cli/azure/identity](https://learn.microsoft.com/cli/azure/identity) - Network accessline 150
Reference: [learn.microsoft.com/cli/azure/role/assignment](https://learn.microsoft.com/cli/azure/role/assignment) - Network accessline 150
Reference: [learn.microsoft.com/cli/azure/role/assignment](https://learn.microsoft.com/cli/azure/role/assignment) - Network accessline 174
Reference: [learn.microsoft.com/cli/azure/webapp](https://learn.microsoft.com/cli/azure/webapp) - Network accessline 174
Reference: [learn.microsoft.com/cli/azure/webapp](https://learn.microsoft.com/cli/azure/webapp) - Network accessline 183
Reference: [learn.microsoft.com/cli/azure/appservice/plan](https://learn.microsoft.com/cli/azure/appservice/plan) - Network accessline 183
Reference: [learn.microsoft.com/cli/azure/appservice/plan](https://learn.microsoft.com/cli/azure/appservice/plan) - Network accessline 200
Reference: [learn.microsoft.com/cli/azure/functionapp](https://learn.microsoft.com/cli/azure/functionapp) - Network accessline 200
Reference: [learn.microsoft.com/cli/azure/functionapp](https://learn.microsoft.com/cli/azure/functionapp) - Network accessline 219
Reference: [learn.microsoft.com/cli/azure/containerapp](https://learn.microsoft.com/cli/azure/containerapp) - Network accessline 219
Reference: [learn.microsoft.com/cli/azure/containerapp](https://learn.microsoft.com/cli/azure/containerapp) - Network accessline 234
Reference: [learn.microsoft.com/cli/azure/group](https://learn.microsoft.com/cli/azure/group) - Network accessline 234
Reference: [learn.microsoft.com/cli/azure/group](https://learn.microsoft.com/cli/azure/group) - Network accessline 244
Reference: [learn.microsoft.com/cli/azure/account](https://learn.microsoft.com/cli/azure/account) - Network accessline 244
Reference: [learn.microsoft.com/cli/azure/account](https://learn.microsoft.com/cli/azure/account) - Network accessline 259
Reference: [learn.microsoft.com/cli/azure/keyvault](https://learn.microsoft.com/cli/azure/keyvault) - Network accessline 259
Reference: [learn.microsoft.com/cli/azure/keyvault](https://learn.microsoft.com/cli/azure/keyvault) - Network accessline 276
Reference: [learn.microsoft.com/cli/azure/storage/account](https://learn.microsoft.com/cli/azure/storage/account) - Network accessline 276
Reference: [learn.microsoft.com/cli/azure/storage/account](https://learn.microsoft.com/cli/azure/storage/account) - Network accessline 290
Reference: [learn.microsoft.com/cli/azure/cosmosdb](https://learn.microsoft.com/cli/azure/cosmosdb) - Network accessline 290
Reference: [learn.microsoft.com/cli/azure/cosmosdb](https://learn.microsoft.com/cli/azure/cosmosdb) - Network accessline 304
Reference: [learn.microsoft.com/cli/azure/monitor](https://learn.microsoft.com/cli/azure/monitor) - Network accessline 304
Reference: [learn.microsoft.com/cli/azure/monitor](https://learn.microsoft.com/cli/azure/monitor) - Access to secretsline 347
[Credential-related source omitted] - Access to secretsline 347
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/anthropic-ts.md
- Network accessline 9
1. **Use the official `@anthropic-ai/sdk` package.** `npm install @anthropic-ai/sdk`. This is the only supported TypeScript/JavaScript SDK. [docs.anthropic.com/en/docs/build-with-claude/getting-started](https://docs.anthropic.com/en/docs/bu - Network accessline 9
1. **Use the official `@anthropic-ai/sdk` package.** `npm install @anthropic-ai/sdk`. This is the only supported TypeScript/JavaScript SDK. [docs.anthropic.com/en/docs/build-with-claude/getting-started](https://docs.anthropic.com/en/docs/bu - Network accessline 10
[Credential-related source omitted] - Network accessline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Network accessline 11
3. **Use the Messages API, not the legacy Completions API.** All Claude models use `client.messages.create()`. The legacy `client.completions.create()` is deprecated. [docs.anthropic.com/en/api/messages](https://docs.anthropic.com/en/api/me - Network accessline 11
3. **Use the Messages API, not the legacy Completions API.** All Claude models use `client.messages.create()`. The legacy `client.completions.create()` is deprecated. [docs.anthropic.com/en/api/messages](https://docs.anthropic.com/en/api/me - Network accessline 12
4. **Always specify `max_tokens`.** Unlike OpenAI, Anthropic requires `max_tokens` on every request. There is no default. Omitting it throws an error. [docs.anthropic.com/en/api/messages](https://docs.anthropic.com/en/api/messages) - Network accessline 12
4. **Always specify `max_tokens`.** Unlike OpenAI, Anthropic requires `max_tokens` on every request. There is no default. Omitting it throws an error. [docs.anthropic.com/en/api/messages](https://docs.anthropic.com/en/api/messages) - Network accessline 13
5. **System messages go in the `system` parameter, not in `messages`.** Claude uses a top-level `system` string, not a `{ role: 'system', content: '...' }` message. Putting system content in `messages` with role `'system'` will error. [docs - Network accessline 13
5. **System messages go in the `system` parameter, not in `messages`.** Claude uses a top-level `system` string, not a `{ role: 'system', content: '...' }` message. Putting system content in `messages` with role `'system'` will error. [docs - Network accessline 14
6. **Use `model` IDs like `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-haiku-4-5-20251001`.** Check the model names page for the latest IDs. Aliases like `claude-3-5-sonnet-latest` are available but less predictable. [docs.anthropic.com/ - Network accessline 14
6. **Use `model` IDs like `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-haiku-4-5-20251001`.** Check the model names page for the latest IDs. Aliases like `claude-3-5-sonnet-latest` are available but less predictable. [docs.anthropic.com/ - Network accessline 15
7. **Tool use follows the `tools` + `tool_use` / `tool_result` pattern.** Define tools in the request, receive `tool_use` content blocks in the response, execute them, then send `tool_result` blocks back. [docs.anthropic.com/en/docs/build-w - Network accessline 15
7. **Tool use follows the `tools` + `tool_use` / `tool_result` pattern.** Define tools in the request, receive `tool_use` content blocks in the response, execute them, then send `tool_result` blocks back. [docs.anthropic.com/en/docs/build-w - Network accessline 16
8. **Streaming uses `client.messages.stream()`.** Returns a `MessageStream` with event-driven or async iteration. Use `stream.on('text', (text) => ...)` for incremental text or `for await (const event of stream)` for full events. [docs.anth - Network accessline 16
8. **Streaming uses `client.messages.stream()`.** Returns a `MessageStream` with event-driven or async iteration. Use `stream.on('text', (text) => ...)` for incremental text or `for await (const event of stream)` for full events. [docs.anth - Network accessline 17
9. **Handle rate limits with exponential backoff.** The SDK throws `RateLimitError` (HTTP 429). Implement retry logic with backoff, or use the SDK's built-in `maxRetries` option (defaults to 2). [docs.anthropic.com/en/api/rate-limits](https - Network accessline 17
9. **Handle rate limits with exponential backoff.** The SDK throws `RateLimitError` (HTTP 429). Implement retry logic with backoff, or use the SDK's built-in `maxRetries` option (defaults to 2). [docs.anthropic.com/en/api/rate-limits](https - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Network accessline 146
- [Anthropic TypeScript SDK — GitHub](https://github.com/anthropics/anthropic-sdk-typescript) - Network accessline 146
- [Anthropic TypeScript SDK — GitHub](https://github.com/anthropics/anthropic-sdk-typescript) - Network accessline 147
- [Messages API Reference](https://docs.anthropic.com/en/api/messages) - Network accessline 147
- [Messages API Reference](https://docs.anthropic.com/en/api/messages) - Network accessline 148
- [Tool Use Guide](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) - Network accessline 148
- [Tool Use Guide](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) - Network accessline 149
- [Streaming Guide](https://docs.anthropic.com/en/api/messages-streaming) - Network accessline 149
- [Streaming Guide](https://docs.anthropic.com/en/api/messages-streaming) - Network accessline 150
- [Claude Models](https://docs.anthropic.com/en/docs/about-claude/models) - Network accessline 150
- [Claude Models](https://docs.anthropic.com/en/docs/about-claude/models)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/bedrock-ts.md
- Network accessline 9
1. **Use `@aws-sdk/client-bedrock-runtime` for model invocation.** This is the primary package for calling models. `npm install @aws-sdk/client-bedrock-runtime`. For agent/KB management, use `@aws-sdk/client-bedrock-agent` and `@aws-sdk/cli - Network accessline 9
1. **Use `@aws-sdk/client-bedrock-runtime` for model invocation.** This is the primary package for calling models. `npm install @aws-sdk/client-bedrock-runtime`. For agent/KB management, use `@aws-sdk/client-bedrock-agent` and `@aws-sdk/cli - Network accessline 10
2. **Prefer the Converse API over InvokeModel.** `ConverseCommand` provides a unified interface across all Bedrock models — same request/response format regardless of provider. `InvokeModelCommand` requires provider-specific request bodies. - Network accessline 10
2. **Prefer the Converse API over InvokeModel.** `ConverseCommand` provides a unified interface across all Bedrock models — same request/response format regardless of provider. `InvokeModelCommand` requires provider-specific request bodies. - Network accessline 11
[Credential-related source omitted] - Network accessline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Network accessline 12
4. **Model IDs follow the format `provider.model-name`.** Examples: `anthropic.claude-3-5-sonnet-20241022-v2:0`, `meta.llama3-2-90b-instruct-v1:0`, `amazon.titan-text-express-v1`. Check the Bedrock console for available model IDs in your re - Network accessline 12
4. **Model IDs follow the format `provider.model-name`.** Examples: `anthropic.claude-3-5-sonnet-20241022-v2:0`, `meta.llama3-2-90b-instruct-v1:0`, `amazon.titan-text-express-v1`. Check the Bedrock console for available model IDs in your re - Network accessline 13
5. **You must enable model access before use.** Go to the Bedrock console → Model access → Request access for each model. This is a one-time per-account setup. Without it, API calls return `AccessDeniedException`. [docs.aws.amazon.com/bedro - Network accessline 13
5. **You must enable model access before use.** Go to the Bedrock console → Model access → Request access for each model. This is a one-time per-account setup. Without it, API calls return `AccessDeniedException`. [docs.aws.amazon.com/bedro - Network accessline 14
6. **Region matters for model availability.** Not all models are available in all regions. Claude is typically in `us-east-1` and `us-west-2`. Llama and Titan have broader availability. Check the model access page in your target region. 7. - Network accessline 14
6. **Region matters for model availability.** Not all models are available in all regions. Claude is typically in `us-east-1` and `us-west-2`. Llama and Titan have broader availability. Check the model access page in your target region. 7. - Network accessline 15
7. **Use `ConverseStreamCommand` for streaming.** Returns a stream of events. Iterate with `for await (const event of response.stream)` and check `event.contentBlockDelta?.delta?.text` for incremental text. [docs.aws.amazon.com/bedrock/late - Network accessline 15
7. **Use `ConverseStreamCommand` for streaming.** Returns a stream of events. Iterate with `for await (const event of response.stream)` and check `event.contentBlockDelta?.delta?.text` for incremental text. [docs.aws.amazon.com/bedrock/late - Network accessline 16
8. **Tool use with Converse API follows a unified format.** Define `toolConfig` with `tools` array. The model returns `toolUse` content blocks. Send `toolResult` blocks back. This works identically across all Bedrock models that support too - Network accessline 16
8. **Tool use with Converse API follows a unified format.** Define `toolConfig` with `tools` array. The model returns `toolUse` content blocks. Send `toolResult` blocks back. This works identically across all Bedrock models that support too - Network accessline 17
9. **Bedrock Agents provide autonomous tool orchestration.** Unlike raw tool use (where your code manages the loop), Bedrock Agents handle the tool-call loop internally. You invoke the agent and get a final answer. Use `@aws-sdk/client-bedr - Network accessline 17
9. **Bedrock Agents provide autonomous tool orchestration.** Unlike raw tool use (where your code manages the loop), Bedrock Agents handle the tool-call loop internally. You invoke the agent and get a final answer. Use `@aws-sdk/client-bedr - Network accessline 18
10. **Attach guardrails to filter content.** Pass `guardrailConfig: { guardrailIdentifier, guardrailVersion }` in the Converse request to apply content filters, denied topics, and PII redaction. [docs.aws.amazon.com/bedrock/latest/userguide - Network accessline 18
10. **Attach guardrails to filter content.** Pass `guardrailConfig: { guardrailIdentifier, guardrailVersion }` in the Converse request to apply content filters, denied topics, and PII redaction. [docs.aws.amazon.com/bedrock/latest/userguide - Network accessline 150
- [AWS SDK for JS v3 — BedrockRuntimeClient](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-runtime) - Network accessline 150
- [AWS SDK for JS v3 — BedrockRuntimeClient](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-runtime) - Network accessline 151
- [Converse API — User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html) - Network accessline 151
- [Converse API — User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html) - Network accessline 152
- [Bedrock Tool Use](https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html) - Network accessline 152
- [Bedrock Tool Use](https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html) - Network accessline 153
- [Bedrock Agents](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) - Network accessline 153
- [Bedrock Agents](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) - Network accessline 154
- [Bedrock Model IDs](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html) - Network accessline 154
- [Bedrock Model IDs](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html) - Network accessline 155
- [Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) - Network accessline 155
- [Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/foundry-cloud-ts.md
- Network accessline 9
1. **Azure AI Foundry provides serverless model endpoints (Model-as-a-Service).** No GPU provisioning needed — deploy a model from the catalog and get an HTTPS endpoint with pay-per-token billing. Available models include Phi-4, Llama, Mist - Network accessline 9
1. **Azure AI Foundry provides serverless model endpoints (Model-as-a-Service).** No GPU provisioning needed — deploy a model from the catalog and get an HTTPS endpoint with pay-per-token billing. Available models include Phi-4, Llama, Mist - Network accessline 10
2. **MaaS endpoints are OpenAI-compatible.** The deployed endpoint exposes `/v1/chat/completions` with the standard OpenAI request/response format. Use the `openai` npm package with a custom `baseURL` and the endpoint's API key. [learn.micr - Network accessline 10
2. **MaaS endpoints are OpenAI-compatible.** The deployed endpoint exposes `/v1/chat/completions` with the standard OpenAI request/response format. Use the `openai` npm package with a custom `baseURL` and the endpoint's API key. [learn.micr - Network accessline 11
3. **Alternatively, use `@azure-rest/ai-inference` for the Azure AI Inference SDK.** This TypeScript SDK provides a typed client for Azure AI model endpoints. `npm install @azure-rest/ai-inference`. It supports chat completions, embeddings, - Network accessline 11
3. **Alternatively, use `@azure-rest/ai-inference` for the Azure AI Inference SDK.** This TypeScript SDK provides a typed client for Azure AI model endpoints. `npm install @azure-rest/ai-inference`. It supports chat completions, embeddings, - Network accessline 12
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Network accessline 13
5. **GitHub Models provides free-tier access to the same model catalog.** Use `https://models.inference.ai.azure.com` as the base URL with a GitHub personal access token as the API key. Great for prototyping before deploying to your own Azu - Network accessline 13
5. **GitHub Models provides free-tier access to the same model catalog.** Use `https://models.inference.ai.azure.com` as the base URL with a GitHub personal access token as the API key. Great for prototyping before deploying to your own Azu - Network accessline 14
6. **Deploy models via the Azure AI Foundry portal or CLI.** In the portal: AI Foundry → Model catalog → Deploy. Via CLI: `az cognitiveservices account deployment create` for Azure OpenAI models, or use the AI Foundry portal for MaaS models - Network accessline 14
6. **Deploy models via the Azure AI Foundry portal or CLI.** In the portal: AI Foundry → Model catalog → Deploy. Via CLI: `az cognitiveservices account deployment create` for Azure OpenAI models, or use the AI Foundry portal for MaaS models - Network accessline 27
// MaaS endpoint from Azure AI Foundry deployment const client = new OpenAI({ baseURL: process.env.AZURE_AI_ENDPOINT, // e.g., https://my-phi4.eastus.models.ai.azure.com/v1 - Network accessline 27
// MaaS endpoint from Azure AI Foundry deployment const client = new OpenAI({ baseURL: process.env.AZURE_AI_ENDPOINT, // e.g., https://my-phi4.eastus.models.ai.azure.com/v1 - Network accessline 28
[Credential-related source omitted] - Network accessline 28
[Credential-related source omitted] - Network accessline 29
baseURL: process.env.AZURE_AI_ENDPOINT, // e.g., https://my-phi4.eastus.models.ai.azure.com/v1 - Network accessline 29
baseURL: process.env.AZURE_AI_ENDPOINT, // e.g., https://my-phi4.eastus.models.ai.azure.com/v1 - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Network accessline 81
const client = new OpenAI({ baseURL: 'https://models.inference.ai.azure.com', - Network accessline 81
const client = new OpenAI({ baseURL: 'https://models.inference.ai.azure.com', - Network accessline 82
baseURL: 'https://models.inference.ai.azure.com', - Network accessline 82
baseURL: 'https://models.inference.ai.azure.com', - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Network accessline 107
// Free tier for development return new OpenAI({ baseURL: 'https://models.inference.ai.azure.com', - Network accessline 107
// Free tier for development return new OpenAI({ baseURL: 'https://models.inference.ai.azure.com', - Network accessline 108
[Credential-related source omitted] - Network accessline 108
[Credential-related source omitted] - Network accessline 109
baseURL: 'https://models.inference.ai.azure.com', - Network accessline 109
baseURL: 'https://models.inference.ai.azure.com', - Access to secretsline 110
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Network accessline 126
- [Azure AI Foundry — Model Catalog](https://learn.microsoft.com/azure/ai-studio/how-to/model-catalog-overview) - Network accessline 126
- [Azure AI Foundry — Model Catalog](https://learn.microsoft.com/azure/ai-studio/how-to/model-catalog-overview) - Network accessline 127
- [Deploy Serverless Models (MaaS)](https://learn.microsoft.com/azure/ai-studio/how-to/deploy-models-serverless) - Network accessline 127
- [Deploy Serverless Models (MaaS)](https://learn.microsoft.com/azure/ai-studio/how-to/deploy-models-serverless) - Network accessline 128
- [Azure AI Inference SDK — npm](https://www.npmjs.com/package/@azure-rest/ai-inference) - Network accessline 128
- [Azure AI Inference SDK — npm](https://www.npmjs.com/package/@azure-rest/ai-inference) - Network accessline 129
- [Azure AI Model Inference API](https://learn.microsoft.com/azure/ai-studio/reference/reference-model-inference-api) - Network accessline 129
- [Azure AI Model Inference API](https://learn.microsoft.com/azure/ai-studio/reference/reference-model-inference-api) - Network accessline 130
- [GitHub Models](https://docs.github.com/en/github-models) - Network accessline 130
- [GitHub Models](https://docs.github.com/en/github-models)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/foundry-local-ts.md
- Network accessline 9
1. **Install Foundry Local via package manager.** Windows: `winget install Microsoft.FoundryLocal`. macOS: `brew tap microsoft/foundrylocal && brew install foundrylocal`. Verify with `foundry --version`. [learn.microsoft.com/azure/foundry-l - Network accessline 9
1. **Install Foundry Local via package manager.** Windows: `winget install Microsoft.FoundryLocal`. macOS: `brew tap microsoft/foundrylocal && brew install foundrylocal`. Verify with `foundry --version`. [learn.microsoft.com/azure/foundry-l - Network accessline 10
2. **Foundry Local exposes an OpenAI-compatible API.** The local service runs at `http://localhost:<port>/v1/chat/completions`. Use the standard `openai` npm package pointed at this endpoint — no custom SDK needed. [learn.microsoft.com/azur - Network accessline 10
2. **Foundry Local exposes an OpenAI-compatible API.** The local service runs at `http://localhost:<port>/v1/chat/completions`. Use the standard `openai` npm package pointed at this endpoint — no custom SDK needed. [learn.microsoft.com/azur - Network accessline 11
3. **The port is dynamic.** Foundry Local assigns a random port each time the service starts. Always discover it via `foundry service status` and parse the endpoint URL. Do not hard-code port numbers. [learn.microsoft.com/azure/foundry-loca - Network accessline 11
3. **The port is dynamic.** Foundry Local assigns a random port each time the service starts. Always discover it via `foundry service status` and parse the endpoint URL. Do not hard-code port numbers. [learn.microsoft.com/azure/foundry-loca - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 168
# 2. In another terminal, verify the endpoint foundry service status # Output: http://localhost:5272 (port varies) - Network accessline 168
# 2. In another terminal, verify the endpoint foundry service status # Output: http://localhost:5272 (port varies) - Network accessline 170
# Output: http://localhost:5272 (port varies) - Network accessline 170
# Output: http://localhost:5272 (port varies) - Network accessline 172
# 3. Test with curl curl http://localhost:5272/v1/chat/completions \ - Network accessline 172
# 3. Test with curl curl http://localhost:5272/v1/chat/completions \ - Network accessline 173
curl http://localhost:5272/v1/chat/completions \ - Network accessline 173
curl http://localhost:5272/v1/chat/completions \ - Network accessline 199
- [Foundry Local — Get Started](https://learn.microsoft.com/azure/foundry-local/get-started) - Network accessline 199
- [Foundry Local — Get Started](https://learn.microsoft.com/azure/foundry-local/get-started) - Network accessline 200
- [Foundry Local CLI Reference](https://learn.microsoft.com/azure/foundry-local/reference/reference-cli) - Network accessline 200
- [Foundry Local CLI Reference](https://learn.microsoft.com/azure/foundry-local/reference/reference-cli) - Network accessline 201
- [Foundry Local REST API Reference](https://learn.microsoft.com/azure/foundry-local/reference/reference-rest) - Network accessline 201
- [Foundry Local REST API Reference](https://learn.microsoft.com/azure/foundry-local/reference/reference-rest) - Network accessline 202
- [Foundry Local GitHub](https://github.com/microsoft/Foundry-Local) - Network accessline 202
- [Foundry Local GitHub](https://github.com/microsoft/Foundry-Local) - Network accessline 203
- [OpenAI Node.js SDK](https://github.com/openai/openai-node) - Network accessline 203
- [OpenAI Node.js SDK](https://github.com/openai/openai-node)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/index.md
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/openai-azure-openai-ts.md
- Network accessline 9
1. **Use the official `openai` npm package for both OpenAI and Azure OpenAI.** The same SDK supports both — Azure is just a configuration difference. `npm install openai`. [github.com/openai/openai-node](https://github.com/openai/openai-nod - Network accessline 9
1. **Use the official `openai` npm package for both OpenAI and Azure OpenAI.** The same SDK supports both — Azure is just a configuration difference. `npm install openai`. [github.com/openai/openai-node](https://github.com/openai/openai-nod - Network accessline 10
[Credential-related source omitted] - Network accessline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Network accessline 11
3. **For Azure OpenAI, use `AzureOpenAI` from the same package.** Import `AzureOpenAI` and provide `endpoint`, `apiVersion`, and `deployment`. The deployment name replaces the `model` parameter in API calls. [learn.microsoft.com/azure/ai-se - Network accessline 11
3. **For Azure OpenAI, use `AzureOpenAI` from the same package.** Import `AzureOpenAI` and provide `endpoint`, `apiVersion`, and `deployment`. The deployment name replaces the `model` parameter in API calls. [learn.microsoft.com/azure/ai-se - Network accessline 12
4. **Azure OpenAI requires `apiVersion`.** Use a stable version like `2024-10-21`. Omitting it produces request path errors. Check the docs for the latest stable version. [learn.microsoft.com/azure/ai-services/openai/reference](https://lear - Network accessline 12
4. **Azure OpenAI requires `apiVersion`.** Use a stable version like `2024-10-21`. Omitting it produces request path errors. Check the docs for the latest stable version. [learn.microsoft.com/azure/ai-services/openai/reference](https://lear - Network accessline 13
5. **For Azure Managed Identity, use `@azure/identity`.** Pass a `DefaultAzureCredential` token provider instead of an API key. This eliminates key management entirely: `azureADTokenProvider: () => credential.getToken('https://cognitiveserv - Network accessline 13
5. **For Azure Managed Identity, use `@azure/identity`.** Pass a `DefaultAzureCredential` token provider instead of an API key. This eliminates key management entirely: `azureADTokenProvider: () => credential.getToken('https://cognitiveserv - Network accessline 14
6. **Always set a timeout.** The SDK defaults to no timeout. Set `timeout: 30000` (30s) for chat completions, higher for image generation. Stalled endpoints will hang your bot indefinitely without this. 7. **Use streaming for long responses - Network accessline 14
6. **Always set a timeout.** The SDK defaults to no timeout. Set `timeout: 30000` (30s) for chat completions, higher for image generation. Stalled endpoints will hang your bot indefinitely without this. 7. **Use streaming for long responses - Network accessline 15
7. **Use streaming for long responses.** Call `client.chat.completions.create({ ..., stream: true })` to get an `AsyncIterable<ChatCompletionChunk>`. This lets your bot send progressive updates instead of waiting for the full response. [pla - Network accessline 15
7. **Use streaming for long responses.** Call `client.chat.completions.create({ ..., stream: true })` to get an `AsyncIterable<ChatCompletionChunk>`. This lets your bot send progressive updates instead of waiting for the full response. [pla - Network accessline 16
8. **Use structured outputs for reliable JSON.** Pass `response_format: { type: 'json_schema', json_schema: { ... } }` to guarantee valid JSON output. Available on GPT-4o and later. [platform.openai.com/docs/guides/structured-outputs](https - Network accessline 16
8. **Use structured outputs for reliable JSON.** Pass `response_format: { type: 'json_schema', json_schema: { ... } }` to guarantee valid JSON output. Available on GPT-4o and later. [platform.openai.com/docs/guides/structured-outputs](https - Network accessline 17
9. **Function calling uses `tools` and `tool_choice`.** Define tools as an array of `{ type: 'function', function: { name, description, parameters } }`. The model returns `tool_calls` in its response — your code executes them and sends resu - Network accessline 17
9. **Function calling uses `tools` and `tool_choice`.** Define tools as an array of `{ type: 'function', function: { name, description, parameters } }`. The model returns `tool_calls` in its response — your code executes them and sends resu - Network accessline 18
10. **Store all secrets in environment variables.** Use `dotenv` for local dev. Never hard-code API keys. For production, use Key Vault (Azure) or Secrets Manager (AWS). [npmjs.com/package/dotenv](https://www.npmjs.com/package/dotenv) - Network accessline 18
10. **Store all secrets in environment variables.** Use `dotenv` for local dev. Never hard-code API keys. For production, use Key Vault (Azure) or Secrets Manager (AWS). [npmjs.com/package/dotenv](https://www.npmjs.com/package/dotenv) - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Network accessline 73
const credential = new DefaultAzureCredential(); const tokenProvider = getBearerTokenProvider(credential, 'https://cognitiveservices.azure.com/.default'); - Network accessline 73
const credential = new DefaultAzureCredential(); const tokenProvider = getBearerTokenProvider(credential, 'https://cognitiveservices.azure.com/.default'); - Network accessline 74
const tokenProvider = getBearerTokenProvider(credential, 'https://cognitiveservices.azure.com/.default'); - Network accessline 74
const tokenProvider = getBearerTokenProvider(credential, 'https://cognitiveservices.azure.com/.default'); - Network accessline 145
- [OpenAI Node.js SDK — GitHub](https://github.com/openai/openai-node) - Network accessline 145
- [OpenAI Node.js SDK — GitHub](https://github.com/openai/openai-node) - Network accessline 146
- [OpenAI API Reference — Chat Completions](https://platform.openai.com/docs/api-reference/chat/create) - Network accessline 146
- [OpenAI API Reference — Chat Completions](https://platform.openai.com/docs/api-reference/chat/create) - Network accessline 147
- [Azure OpenAI Quickstart — TypeScript](https://learn.microsoft.com/azure/ai-services/openai/quickstart) - Network accessline 147
- [Azure OpenAI Quickstart — TypeScript](https://learn.microsoft.com/azure/ai-services/openai/quickstart) - Network accessline 148
- [Azure OpenAI REST API Reference](https://learn.microsoft.com/azure/ai-services/openai/reference) - Network accessline 148
- [Azure OpenAI REST API Reference](https://learn.microsoft.com/azure/ai-services/openai/reference) - Network accessline 149
- [Structured Outputs Guide](https://platform.openai.com/docs/guides/structured-outputs) - Network accessline 149
- [Structured Outputs Guide](https://platform.openai.com/docs/guides/structured-outputs)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/oss-openai-compatible-ts.md
- Network accessline 9
1. **All OpenAI-compatible servers use the same API contract.** The `/v1/chat/completions` endpoint accepts the same request body as OpenAI's API. Use the `openai` npm package with a custom `baseURL` — no special SDKs needed. [github.com/op - Network accessline 9
1. **All OpenAI-compatible servers use the same API contract.** The `/v1/chat/completions` endpoint accepts the same request body as OpenAI's API. Use the `openai` npm package with a custom `baseURL` — no special SDKs needed. [github.com/op - Network accessline 10
2. **Set `baseURL` to the server's endpoint.** Common defaults: Ollama `http://localhost:11434/v1`, LM Studio `http://localhost:1234/v1`, vLLM `http://localhost:8000/v1`, llama.cpp `http://localhost:8080/v1`. Always confirm the actual URL — - Network accessline 10
2. **Set `baseURL` to the server's endpoint.** Common defaults: Ollama `http://localhost:11434/v1`, LM Studio `http://localhost:1234/v1`, vLLM `http://localhost:8000/v1`, llama.cpp `http://localhost:8080/v1`. Always confirm the actual URL — - Network accessline 12
4. **Model names are server-specific.** Ollama uses names like `llama3.2`, `mistral`, `phi4`. vLLM uses the model path. LM Studio uses whatever you loaded. Check the server's model list endpoint: `GET /v1/models`. 5. **Feature support varie - Network accessline 12
4. **Model names are server-specific.** Ollama uses names like `llama3.2`, `mistral`, `phi4`. vLLM uses the model path. LM Studio uses whatever you loaded. Check the server's model list endpoint: `GET /v1/models`. 5. **Feature support varie - Network accessline 13
5. **Feature support varies by server and model.** Not all servers support streaming, tool use, JSON mode, or vision. Test capabilities before relying on them. Ollama supports tool use for some models; llama.cpp has limited function calling - Network accessline 13
5. **Feature support varies by server and model.** Not all servers support streaming, tool use, JSON mode, or vision. Test capabilities before relying on them. Ollama supports tool use for some models; llama.cpp has limited function calling - Dangerous shell operationline 14
6. **Ollama is the easiest local server to start with.** Install: `curl -fsSL https://ollama.com/install.sh | sh` (Linux/macOS) or download from [ollama.com](https://ollama.com). Pull a model: `ollama pull llama3.2`. It auto-starts and expo - Dangerous shell operationline 14
6. **Ollama is the easiest local server to start with.** Install: `curl -fsSL https://ollama.com/install.sh | sh` (Linux/macOS) or download from [ollama.com](https://ollama.com). Pull a model: `ollama pull llama3.2`. It auto-starts and expo - Network accessline 14
6. **Ollama is the easiest local server to start with.** Install: `curl -fsSL https://ollama.com/install.sh | sh` (Linux/macOS) or download from [ollama.com](https://ollama.com). Pull a model: `ollama pull llama3.2`. It auto-starts and expo - Network accessline 14
6. **Ollama is the easiest local server to start with.** Install: `curl -fsSL https://ollama.com/install.sh | sh` (Linux/macOS) or download from [ollama.com](https://ollama.com). Pull a model: `ollama pull llama3.2`. It auto-starts and expo - Network accessline 15
7. **vLLM is best for production self-hosting.** Optimized for throughput with continuous batching, PagedAttention, and tensor parallelism. Requires NVIDIA GPU. `pip install vllm && vllm serve meta-llama/Llama-3.2-3B-Instruct`. [docs.vllm.a - Network accessline 15
7. **vLLM is best for production self-hosting.** Optimized for throughput with continuous batching, PagedAttention, and tensor parallelism. Requires NVIDIA GPU. `pip install vllm && vllm serve meta-llama/Llama-3.2-3B-Instruct`. [docs.vllm.a - Network accessline 16
8. **LM Studio provides a desktop GUI with an API server.** Download from [lmstudio.ai](https://lmstudio.ai). Load a model in the GUI, then start the server tab. Good for developers who prefer a visual interface. - Network accessline 16
8. **LM Studio provides a desktop GUI with an API server.** Download from [lmstudio.ai](https://lmstudio.ai). Load a model in the GUI, then start the server tab. Good for developers who prefer a visual interface. - Network accessline 27
const client = new OpenAI({ baseURL: 'http://localhost:11434/v1', - Network accessline 27
const client = new OpenAI({ baseURL: 'http://localhost:11434/v1', - Network accessline 28
baseURL: 'http://localhost:11434/v1', - Network accessline 28
baseURL: 'http://localhost:11434/v1', - Network accessline 50
const client = new OpenAI({ baseURL: 'http://localhost:8000/v1', - Network accessline 50
const client = new OpenAI({ baseURL: 'http://localhost:8000/v1', - Network accessline 51
baseURL: 'http://localhost:8000/v1', - Network accessline 51
baseURL: 'http://localhost:8000/v1', - Network accessline 67
const client = new OpenAI({ baseURL: 'http://localhost:1234/v1', - Network accessline 67
const client = new OpenAI({ baseURL: 'http://localhost:1234/v1', - Network accessline 68
baseURL: 'http://localhost:1234/v1', - Network accessline 68
baseURL: 'http://localhost:1234/v1', - Network accessline 109
case 'ollama': return new OpenAI({ baseURL: config.baseURL ?? 'http://localhost:11434/v1', - Network accessline 109
case 'ollama': return new OpenAI({ baseURL: config.baseURL ?? 'http://localhost:11434/v1', - Network accessline 110
[Credential-related source omitted] - Network accessline 110
[Credential-related source omitted] - Network accessline 111
baseURL: config.baseURL ?? 'http://localhost:11434/v1', - Network accessline 111
baseURL: config.baseURL ?? 'http://localhost:11434/v1', - Network accessline 115
case 'vllm': return new OpenAI({ baseURL: config.baseURL ?? 'http://localhost:8000/v1', - Network accessline 115
case 'vllm': return new OpenAI({ baseURL: config.baseURL ?? 'http://localhost:8000/v1', - Network accessline 116
[Credential-related source omitted] - Network accessline 116
[Credential-related source omitted] - Network accessline 117
baseURL: config.baseURL ?? 'http://localhost:8000/v1', - Network accessline 117
baseURL: config.baseURL ?? 'http://localhost:8000/v1', - Access to secretsline 138
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Network accessline 161
# Install Ollama curl -fsSL https://ollama.com/install.sh | sh - Network accessline 161
# Install Ollama curl -fsSL https://ollama.com/install.sh | sh - Dangerous shell operationline 162
curl -fsSL https://ollama.com/install.sh | sh - Dangerous shell operationline 162
curl -fsSL https://ollama.com/install.sh | sh - Network accessline 162
curl -fsSL https://ollama.com/install.sh | sh - Network accessline 162
curl -fsSL https://ollama.com/install.sh | sh - Network accessline 170
# Test the API curl http://localhost:11434/v1/chat/completions \ - Network accessline 170
# Test the API curl http://localhost:11434/v1/chat/completions \ - Network accessline 171
curl http://localhost:11434/v1/chat/completions \ - Network accessline 171
curl http://localhost:11434/v1/chat/completions \ - Network accessline 211
- [Ollama](https://ollama.com) - Network accessline 211
- [Ollama](https://ollama.com) - Network accessline 212
- [vLLM Documentation](https://docs.vllm.ai) - Network accessline 212
- [vLLM Documentation](https://docs.vllm.ai) - Network accessline 213
- [LM Studio](https://lmstudio.ai) - Network accessline 213
- [LM Studio](https://lmstudio.ai) - Network accessline 214
- [llama.cpp — Server Mode](https://github.com/ggerganov/llama.cpp/tree/master/examples/server) - Network accessline 214
- [llama.cpp — Server Mode](https://github.com/ggerganov/llama.cpp/tree/master/examples/server) - Network accessline 215
- [text-generation-inference (TGI)](https://github.com/huggingface/text-generation-inference) - Network accessline 215
- [text-generation-inference (TGI)](https://github.com/huggingface/text-generation-inference) - Network accessline 216
- [LocalAI](https://localai.io) - Network accessline 216
- [LocalAI](https://localai.io) - Network accessline 217
- [OpenAI Node.js SDK](https://github.com/openai/openai-node) - Network accessline 217
- [OpenAI Node.js SDK](https://github.com/openai/openai-node)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/models/transformers-js-ts.md
- Network accessline 9
1. **Transformers.js runs models in-process, not via an API.** Unlike Ollama, vLLM, or Foundry Local (which run a server you call via HTTP), Transformers.js loads ONNX models directly into your Node.js process or browser tab. No separate se - Network accessline 9
1. **Transformers.js runs models in-process, not via an API.** Unlike Ollama, vLLM, or Foundry Local (which run a server you call via HTTP), Transformers.js loads ONNX models directly into your Node.js process or browser tab. No separate se - Network accessline 10
2. **Use the `pipeline` API for most tasks.** `pipeline(task, model?)` returns a callable function. Supported tasks include `text-generation`, `text-classification`, `feature-extraction` (embeddings), `summarization`, `translation`, `questi - Network accessline 10
2. **Use the `pipeline` API for most tasks.** `pipeline(task, model?)` returns a callable function. Supported tasks include `text-generation`, `text-classification`, `feature-extraction` (embeddings), `summarization`, `translation`, `questi - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Network accessline 202
- [Transformers.js Documentation](https://huggingface.co/docs/transformers.js) - Network accessline 202
- [Transformers.js Documentation](https://huggingface.co/docs/transformers.js) - Network accessline 203
- [Transformers.js GitHub](https://github.com/huggingface/transformers.js) - Network accessline 203
- [Transformers.js GitHub](https://github.com/huggingface/transformers.js) - Network accessline 204
- [@huggingface/transformers on npm](https://www.npmjs.com/package/@huggingface/transformers) - Network accessline 204
- [@huggingface/transformers on npm](https://www.npmjs.com/package/@huggingface/transformers) - Network accessline 205
- [Compatible Models on HuggingFace Hub](https://huggingface.co/models?library=transformers.js) - Network accessline 205
- [Compatible Models on HuggingFace Hub](https://huggingface.co/models?library=transformers.js) - Network accessline 206
- [Pipeline API Reference](https://huggingface.co/docs/transformers.js/api/pipelines) - Network accessline 206
- [Pipeline API Reference](https://huggingface.co/docs/transformers.js/api/pipelines) - Network accessline 207
- [WebGPU Guide](https://huggingface.co/docs/transformers.js/guides/webgpu) - Network accessline 207
- [WebGPU Guide](https://huggingface.co/docs/transformers.js/guides/webgpu)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/security/input-validation-ts.md
- Network accessline 9
1. Always validate `activity.value` server-side after Adaptive Card `Action.Submit` and `Action.Execute`. The JSON payload can be tampered with by clients -- never trust that field names, types, or values match the card definition. Use a sc - Network accessline 9
1. Always validate `activity.value` server-side after Adaptive Card `Action.Submit` and `Action.Execute`. The JSON payload can be tampered with by clients -- never trust that field names, types, or values match the card definition. Use a sc - Network accessline 10
2. Define zod schemas for every card action and dialog submission payload. Parse with `schema.safeParse(activity.value)` and handle validation failures with a user-friendly error message. Never use `schema.parse()` in handlers -- uncaught ` - Network accessline 10
2. Define zod schemas for every card action and dialog submission payload. Parse with `schema.safeParse(activity.value)` and handle validation failures with a user-friendly error message. Never use `schema.parse()` in handlers -- uncaught ` - Network accessline 11
3. Validate `activity.text` from user messages before using it in database queries, API calls, or AI prompts. Apply content length limits (Teams messages can be up to 28 KB), strip or escape control characters, and reject messages that exce - Network accessline 11
3. Validate `activity.text` from user messages before using it in database queries, API calls, or AI prompts. Apply content length limits (Teams messages can be up to 28 KB), strip or escape control characters, and reject messages that exce - Network accessline 12
4. Use Adaptive Card input element validation properties (`isRequired`, `regex`, `errorMessage`) as a first layer of client-side validation. These provide immediate feedback to users but are NOT a security boundary -- the server must re-val - Network accessline 12
4. Use Adaptive Card input element validation properties (`isRequired`, `regex`, `errorMessage`) as a first layer of client-side validation. These provide immediate feedback to users but are NOT a security boundary -- the server must re-val - Network accessline 13
5. Be aware that `Input.ChoiceSet` values are always strings in `activity.value`, even when they appear numeric. A choice with `"value": "42"` arrives as the string `"42"`, not the number `42`. Always use explicit type coercion (`parseInt() - Network accessline 13
5. Be aware that `Input.ChoiceSet` values are always strings in `activity.value`, even when they appear numeric. A choice with `"value": "42"` arrives as the string `"42"`, not the number `42`. Always use explicit type coercion (`parseInt() - Network accessline 14
6. Sanitize user input before rendering it in Adaptive Card `TextBlock` elements to prevent XSS-like injection. While Teams sanitizes most HTML, markdown rendering in cards can be abused with crafted links or misleading formatting. Strip or - Network accessline 14
6. Sanitize user input before rendering it in Adaptive Card `TextBlock` elements to prevent XSS-like injection. While Teams sanitizes most HTML, markdown rendering in cards can be abused with crafted links or misleading formatting. Strip or - Network accessline 15
7. When using AI function calling, validate that user-influenced parameters passed to tool functions do not enable command injection or unauthorized data access. If the LLM generates a function call with parameters derived from user input, - Network accessline 15
7. When using AI function calling, validate that user-influenced parameters passed to tool functions do not enable command injection or unauthorized data access. If the LLM generates a function call with parameters derived from user input, - Network accessline 16
8. Implement content length limits for all text inputs. Set `maxLength` on `Input.Text` elements in cards (client-side enforcement), and enforce the same limit server-side. Reject payloads larger than expected to prevent denial-of-service f - Network accessline 16
8. Implement content length limits for all text inputs. Set `maxLength` on `Input.Text` elements in cards (client-side enforcement), and enforce the same limit server-side. Reject payloads larger than expected to prevent denial-of-service f - Network accessline 17
9. Validate the `verb` or routing identifier in `activity.value.data` before dispatching card actions. An attacker could submit a crafted payload with an unexpected verb to reach unintended handlers. Verify that the verb matches a known set - Network accessline 17
9. Validate the `verb` or routing identifier in `activity.value.data` before dispatching card actions. An attacker could submit a crafted payload with an unexpected verb to reach unintended handlers. Verify that the verb matches a known set - Network accessline 18
10. Log validation failures for security monitoring but never log the raw invalid input if it may contain PII or malicious payloads. Log the validation error type and field name, not the value. Use structured logging with Application Insigh - Network accessline 18
10. Log validation failures for security monitoring but never log the raw invalid input if it may contain PII or malicious payloads. Log the validation error type and field name, not the value. Use structured logging with Application Insigh - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 147
[Credential-related source omitted] - Access to secretsline 147
[Credential-related source omitted] - Network accessline 202
- [Zod documentation](https://zod.dev/) - Network accessline 202
- [Zod documentation](https://zod.dev/) - Network accessline 203
- [Teams: Cards and card actions](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-actions) - Network accessline 203
- [Teams: Cards and card actions](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-actions) - Network accessline 204
- [Adaptive Cards Input.Text](https://adaptivecards.io/explorer/Input.Text.html) - Network accessline 204
- [Adaptive Cards Input.Text](https://adaptivecards.io/explorer/Input.Text.html) - Network accessline 205
- [Adaptive Cards Input.ChoiceSet](https://adaptivecards.io/explorer/Input.ChoiceSet.html) - Network accessline 205
- [Adaptive Cards Input.ChoiceSet](https://adaptivecards.io/explorer/Input.ChoiceSet.html) - Network accessline 206
- [Teams: Format cards in Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format) - Network accessline 206
- [Teams: Format cards in Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format) - Network accessline 207
- [OWASP Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) - Network accessline 207
- [OWASP Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) - Network accessline 208
- [Teams message size limits](https://learn.microsoft.com/en-us/microsoftteams/limits-specifications-teams) - Network accessline 208
- [Teams message size limits](https://learn.microsoft.com/en-us/microsoftteams/limits-specifications-teams) - Network accessline 209
- [Teams AI Library GitHub](https://github.com/microsoft/teams-ai) - Network accessline 209
- [Teams AI Library GitHub](https://github.com/microsoft/teams-ai)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/security/secrets-ts.md
- Network accessline 9
1. Never commit secrets to source control. Add `.env` to `.gitignore` before the first commit. Create a `.env.example` file with placeholder values and comments documenting each required variable. Scan repositories with tools like `git-secr - Network accessline 9
1. Never commit secrets to source control. Add `.env` to `.gitignore` before the first commit. Create a `.env.example` file with placeholder values and comments documenting each required variable. Scan repositories with tools like `git-secr - Network accessline 10
[Credential-related source omitted] - Network accessline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Network accessline 11
[Credential-related source omitted] - Network accessline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Network accessline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Network accessline 13
5. Apply the least-privilege principle to Azure AD app registrations. Grant only the Microsoft Graph permissions the bot actually needs (e.g., `User.Read` for profile access, not `Directory.ReadWrite.All`). Use delegated permissions where p - Network accessline 13
5. Apply the least-privilege principle to Azure AD app registrations. Grant only the Microsoft Graph permissions the bot actually needs (e.g., `User.Read` for profile access, not `Directory.ReadWrite.All`). Use delegated permissions where p - Network accessline 14
[Credential-related source omitted] - Network accessline 14
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Network accessline 16
8. Never log secrets or tokens. Implement log scrubbing to redact patterns matching API keys, JWTs, and connection strings. The Teams SDK `ConsoleLogger` does not automatically redact secrets -- wrap or post-process log output if it might c - Network accessline 16
8. Never log secrets or tokens. Implement log scrubbing to redact patterns matching API keys, JWTs, and connection strings. The Teams SDK `ConsoleLogger` does not automatically redact secrets -- wrap or post-process log output if it might c - Network accessline 17
[Credential-related source omitted] - Network accessline 17
[Credential-related source omitted] - Network accessline 18
10. For local development, use `.env` files loaded via `dotenv` (included in the project template via `node -r dotenv/config .`). Keep local `.env` secrets separate from production secrets. Use Azure CLI login (`az login`) with `DefaultAzur - Network accessline 18
10. For local development, use `.env` files loaded via `dotenv` (included in the project template via `node -r dotenv/config .`). Keep local `.env` secrets separate from production secrets. Use Azure CLI login (`az login`) with `DefaultAzur - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Network accessline 42
[Credential-related source omitted] - Network accessline 42
[Credential-related source omitted] - Network accessline 43
[Credential-related source omitted] - Network accessline 43
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Network accessline 44
# AZURE_OPENAI_ENDPOINT=<https://your-resource.openai.azure.com> - Network accessline 44
# AZURE_OPENAI_ENDPOINT=<https://your-resource.openai.azure.com> - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Dangerous shell operationline 181
[Credential-related source omitted] - Dangerous shell operationline 181
[Credential-related source omitted] - Access to secretsline 181
[Credential-related source omitted] - Access to secretsline 181
[Credential-related source omitted] - Access to secretsline 182
[Credential-related source omitted] - Access to secretsline 182
[Credential-related source omitted] - Access to secretsline 187
[Credential-related source omitted] - Access to secretsline 187
[Credential-related source omitted] - Access to secretsline 188
[Credential-related source omitted] - Access to secretsline 188
[Credential-related source omitted] - Network accessline 192
- [Azure Key Vault overview](https://learn.microsoft.com/en-us/azure/key-vault/general/overview) - Network accessline 192
- [Azure Key Vault overview](https://learn.microsoft.com/en-us/azure/key-vault/general/overview) - Network accessline 193
- [Managed identities for Azure resources](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 193
- [Managed identities for Azure resources](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 194
- [Azure Bot registration](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - Network accessline 194
- [Azure Bot registration](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - Network accessline 195
- [Key Vault references for App Service](https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references) - Network accessline 195
- [Key Vault references for App Service](https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references) - Network accessline 196
- [DefaultAzureCredential documentation](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains) - Network accessline 196
- [DefaultAzureCredential documentation](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains) - Network accessline 197
- [Key Vault secret rotation](https://learn.microsoft.com/en-us/azure/key-vault/secrets/tutorial-rotation) - Network accessline 197
- [Key Vault secret rotation](https://learn.microsoft.com/en-us/azure/key-vault/secrets/tutorial-rotation) - Network accessline 198
- [Microsoft Graph permissions reference](https://learn.microsoft.com/en-us/graph/permissions-overview) - Network accessline 198
- [Microsoft Graph permissions reference](https://learn.microsoft.com/en-us/graph/permissions-overview) - Network accessline 199
- [OWASP Logging Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html) - Network accessline 199
- [OWASP Logging Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html) - Access to secretsline 206
[Credential-related source omitted] - Access to secretsline 206
[Credential-related source omitted] - Access to secretsline 208
[Credential-related source omitted] - Access to secretsline 208
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 211
[Credential-related source omitted] - Access to secretsline 211
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/bolt-assistant-ts.md
- Network accessline 9
1. **Provide `threadStarted` and `userMessage` handlers (required).** These are the minimum callbacks for an Assistant. `threadContextChanged` is optional and defaults to saving context via the thread context store. [slack.dev/bolt-js/conce - Network accessline 9
1. **Provide `threadStarted` and `userMessage` handlers (required).** These are the minimum callbacks for an Assistant. `threadContextChanged` is optional and defaults to saving context via the thread context store. [slack.dev/bolt-js/conce - Network accessline 10
2. **Call `setStatus()` to show typing indicators.** Use `await setStatus("Thinking...")` at the start of `userMessage` to show the user that processing is happening. The status clears automatically when the bot sends a reply via `say()`, o - Network accessline 10
2. **Call `setStatus()` to show typing indicators.** Use `await setStatus("Thinking...")` at the start of `userMessage` to show the user that processing is happening. The status clears automatically when the bot sends a reply via `say()`, o - Network accessline 11
3. **Use `setSuggestedPrompts()` in `threadStarted`.** Provide up to 4 preset prompts with `title` and `message` properties. This helps users discover what the assistant can do. An optional top-level `title` parameter labels the prompt grou - Network accessline 11
3. **Use `setSuggestedPrompts()` in `threadStarted`.** Provide up to 4 preset prompts with `title` and `message` properties. This helps users discover what the assistant can do. An optional top-level `title` parameter labels the prompt grou - Network accessline 12
4. **Use `setTitle()` to label conversation threads.** Call `setTitle(summary)` after processing the first `userMessage` to give the thread a meaningful name in the sidebar. [api.slack.com/docs/assistants](https://api.slack.com/docs/assista - Network accessline 12
4. **Use `setTitle()` to label conversation threads.** Call `setTitle(summary)` after processing the first `userMessage` to give the thread a meaningful name in the sidebar. [api.slack.com/docs/assistants](https://api.slack.com/docs/assista - Network accessline 13
5. **Thread context is NOT included in `userMessage` events.** The `message` event payload does not carry thread context. Call `await getThreadContext()` in `userMessage` handlers to retrieve the current context (channel_id, team_id, enterp - Network accessline 13
5. **Thread context is NOT included in `userMessage` events.** The `message` event payload does not carry thread context. Call `await getThreadContext()` in `userMessage` handlers to retrieve the current context (channel_id, team_id, enterp - Network accessline 14
6. **Use `saveThreadContext()` in `threadStarted`.** The initial thread context (which channel the user was viewing) arrives in the `threadStarted` event. Save it immediately so `userMessage` handlers can retrieve it later. [slack.dev/bolt- - Network accessline 14
6. **Use `saveThreadContext()` in `threadStarted`.** The initial thread context (which channel the user was viewing) arrives in the `threadStarted` event. Save it immediately so `userMessage` handlers can retrieve it later. [slack.dev/bolt- - Network accessline 15
7. **The default `AssistantThreadContextStore` uses message metadata.** Context is persisted by updating the bot's first message in the thread with metadata. This survives app restarts without external storage. For production, implement a c - Network accessline 15
7. **The default `AssistantThreadContextStore` uses message metadata.** Context is persisted by updating the bot's first message in the thread with metadata. This survives app restarts without external storage. For production, implement a c - Network accessline 16
8. **Register the assistant with `app.assistant(assistant)`.** This adds middleware that intercepts `assistant_thread_started`, `assistant_thread_context_changed`, and thread messages. The middleware stops propagation — registered `app.mess - Network accessline 16
8. **Register the assistant with `app.assistant(assistant)`.** This adds middleware that intercepts `assistant_thread_started`, `assistant_thread_context_changed`, and thread messages. The middleware stops propagation — registered `app.mess - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 156
- https://api.slack.com/docs/assistants - Network accessline 156
- https://api.slack.com/docs/assistants - Network accessline 157
- https://slack.dev/bolt-js/concepts/assistant - Network accessline 157
- https://slack.dev/bolt-js/concepts/assistant - Network accessline 158
- https://github.com/slackapi/bolt-js/blob/main/src/Assistant.ts - Network accessline 158
- https://github.com/slackapi/bolt-js/blob/main/src/Assistant.ts - Network accessline 159
- https://github.com/slackapi/bolt-js/blob/main/src/AssistantThreadContextStore.ts - Network accessline 159
- https://github.com/slackapi/bolt-js/blob/main/src/AssistantThreadContextStore.ts
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/bolt-events-ts.md
- Network accessline 9
1. **Use `app.event(eventType, handler)` for all non-message events.** Register handlers with the event type string (e.g., `"reaction_added"`, `"member_joined_channel"`, `"app_home_opened"`). Bolt routes events by matching `event.type`. [sl - Network accessline 9
1. **Use `app.event(eventType, handler)` for all non-message events.** Register handlers with the event type string (e.g., `"reaction_added"`, `"member_joined_channel"`, `"app_home_opened"`). Bolt routes events by matching `event.type`. [sl - Network accessline 10
2. **Use `app.message()` for message events, not `app.event("message")`.** `app.message()` provides text pattern matching (string/RegExp), `say()`, and subtype-aware filtering. `app.event("message")` works but lacks these conveniences. Bolt - Network accessline 10
2. **Use `app.message()` for message events, not `app.event("message")`.** `app.message()` provides text pattern matching (string/RegExp), `say()`, and subtype-aware filtering. `app.event("message")` works but lacks these conveniences. Bolt - Network accessline 11
3. **Events do NOT have `ack()`.** Unlike commands, actions, and views, event handlers receive no `ack` function. Bolt automatically acknowledges event webhooks with HTTP 200 before your handler runs. [slack.dev/bolt-js/concepts/event-liste - Network accessline 11
3. **Events do NOT have `ack()`.** Unlike commands, actions, and views, event handlers receive no `ack` function. Bolt automatically acknowledges event webhooks with HTTP 200 before your handler runs. [slack.dev/bolt-js/concepts/event-liste - Network accessline 12
4. **`say()` is only available for events with channel context.** Events like `app_mention`, `message`, and `member_joined_channel` include a channel, so `say()` works. Events like `team_join` or `app_home_opened` may not — use `client.chat - Network accessline 12
4. **`say()` is only available for events with channel context.** Events like `app_mention`, `message`, and `member_joined_channel` include a channel, so `say()` works. Events like `team_join` or `app_home_opened` may not — use `client.chat - Network accessline 13
5. **`ignoreSelf` is enabled by default.** Bolt filters out events generated by your own bot (matching `bot_id` for messages, `user` for other events). This prevents infinite loops. Disable with `ignoreSelf: false` in App constructor if you - Network accessline 13
5. **`ignoreSelf` is enabled by default.** Bolt filters out events generated by your own bot (matching `bot_id` for messages, `user` for other events). This prevents infinite loops. Disable with `ignoreSelf: false` in App constructor if you - Network accessline 14
6. **Use `context.retryNum` and `context.retryReason` to detect retries.** Slack retries event delivery if your server doesn't respond with 200 in time. Check `context.retryNum` to skip duplicate processing or log retry attempts. [api.slack - Network accessline 14
6. **Use `context.retryNum` and `context.retryReason` to detect retries.** Slack retries event delivery if your server doesn't respond with 200 in time. Check `context.retryNum` to skip duplicate processing or log retry attempts. [api.slack - Network accessline 15
7. **Event type can be matched with RegExp.** Pass a RegExp to `app.event()` for pattern matching: `app.event(/^member_/, handler)` matches both `member_joined_channel` and `member_left_channel`. Matches are stored in `context.matches`. [sl - Network accessline 15
7. **Event type can be matched with RegExp.** Pass a RegExp to `app.event()` for pattern matching: `app.event(/^member_/, handler)` matches both `member_joined_channel` and `member_left_channel`. Matches are stored in `context.matches`. [sl - Network accessline 16
8. **Subscribe to events in the Slack app dashboard.** `app.event()` in code does nothing if the event type isn't enabled in "Event Subscriptions" in your app's configuration. Both code and dashboard must agree. [api.slack.com/events-api#su - Network accessline 16
8. **Subscribe to events in the Slack app dashboard.** `app.event()` in code does nothing if the event type isn't enabled in "Event Subscriptions" in your app's configuration. Both code and dashboard must agree. [api.slack.com/events-api#su - Network accessline 17
9. **The `body` property contains the full event envelope.** It includes `team_id`, `api_app_id`, `event_id`, `event_time`, and `authorizations`. The `event` property is just the inner event payload. Use `body` when you need workspace-level - Network accessline 17
9. **The `body` property contains the full event envelope.** It includes `team_id`, `api_app_id`, `event_id`, `event_time`, and `authorizations`. The `event` property is just the inner event payload. Use `body` when you need workspace-level - Network accessline 18
10. **URL verification is handled automatically by Bolt receivers.** Both `HTTPReceiver` and `ExpressReceiver` respond to `{ type: "url_verification" }` challenges without any handler code. You don't need to implement this yourself. [slack. - Network accessline 18
10. **URL verification is handled automatically by Bolt receivers.** Both `HTTPReceiver` and `ExpressReceiver` respond to `{ type: "url_verification" }` challenges without any handler code. You don't need to implement this yourself. [slack. - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Network accessline 139
- https://api.slack.com/events-api - Network accessline 139
- https://api.slack.com/events-api - Network accessline 140
- https://api.slack.com/events - Network accessline 140
- https://api.slack.com/events - Network accessline 141
- https://slack.dev/bolt-js/concepts/event-listening - Network accessline 141
- https://slack.dev/bolt-js/concepts/event-listening - Network accessline 142
- https://slack.dev/bolt-js/concepts/message-listening - Network accessline 142
- https://slack.dev/bolt-js/concepts/message-listening - Network accessline 143
- https://api.slack.com/scopes - Network accessline 143
- https://api.slack.com/scopes - Network accessline 144
- https://github.com/slackapi/bolt-js - Network accessline 144
- https://github.com/slackapi/bolt-js
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/bolt-java.md
- Network accessline 9
1. Add the `com.slack.api:bolt` dependency (and optionally `bolt-servlet`, `bolt-jetty`, or `bolt-socket-mode`) via Maven or Gradle. The SDK is modular: `slack-api-client` for Web API, `slack-api-model` for data models, `bolt` for the app f - Network accessline 9
1. Add the `com.slack.api:bolt` dependency (and optionally `bolt-servlet`, `bolt-jetty`, or `bolt-socket-mode`) via Maven or Gradle. The SDK is modular: `slack-api-client` for Web API, `slack-api-model` for data models, `bolt` for the app f - Network accessline 9
1. Add the `com.slack.api:bolt` dependency (and optionally `bolt-servlet`, `bolt-jetty`, or `bolt-socket-mode`) via Maven or Gradle. The SDK is modular: `slack-api-client` for Web API, `slack-api-model` for data models, `bolt` for the app f - Network accessline 10
2. Initialize the App with `new App()` (reads `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` from env) or with `new App(AppConfig.builder().singleTeamBotToken(token).signingSecret(secret).build())`. The `AppConfig` uses Lombok `@Builder` for - Network accessline 10
2. Initialize the App with `new App()` (reads `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` from env) or with `new App(AppConfig.builder().singleTeamBotToken(token).signingSecret(secret).build())`. The `AppConfig` uses Lombok `@Builder` for - Network accessline 10
2. Initialize the App with `new App()` (reads `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` from env) or with `new App(AppConfig.builder().singleTeamBotToken(token).signingSecret(secret).build())`. The `AppConfig` uses Lombok `@Builder` for - Network accessline 11
3. Register listeners using lambda syntax: `app.command("/cmd", (req, ctx) -> ctx.ack())`. All handlers receive two parameters — a typed `Request` and a typed `Context`. The handler returns a `Response` object. This replaces the TS single-c - Network accessline 11
3. Register listeners using lambda syntax: `app.command("/cmd", (req, ctx) -> ctx.ack())`. All handlers receive two parameters — a typed `Request` and a typed `Context`. The handler returns a `Response` object. This replaces the TS single-c - Network accessline 11
3. Register listeners using lambda syntax: `app.command("/cmd", (req, ctx) -> ctx.ack())`. All handlers receive two parameters — a typed `Request` and a typed `Context`. The handler returns a `Response` object. This replaces the TS single-c - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Network accessline 132
- https://github.com/slackapi/java-slack-sdk - Network accessline 132
- https://github.com/slackapi/java-slack-sdk - Network accessline 132
- https://github.com/slackapi/java-slack-sdk - Network accessline 133
- https://github.com/slackapi/java-slack-sdk/wiki - Network accessline 133
- https://github.com/slackapi/java-slack-sdk/wiki - Network accessline 133
- https://github.com/slackapi/java-slack-sdk/wiki - Network accessline 134
- https://slack.dev/java-slack-sdk/guides/bolt-basics - Network accessline 134
- https://slack.dev/java-slack-sdk/guides/bolt-basics - Network accessline 134
- https://slack.dev/java-slack-sdk/guides/bolt-basics
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/bolt-oauth-distribution-ts.md
- Network accessline 9
1. **Provide `clientId`, `clientSecret`, and `stateSecret` for OAuth apps.** These enable the built-in OAuth flow with install page and callback handling. The `stateSecret` must be at least 16 characters for CSRF protection. Without all thr - Network accessline 9
1. **Provide `clientId`, `clientSecret`, and `stateSecret` for OAuth apps.** These enable the built-in OAuth flow with install page and callback handling. The `stateSecret` must be at least 16 characters for CSRF protection. Without all thr - Network accessline 10
2. **Implement `InstallationStore` for production.** The default `MemoryInstallationStore` loses data on restart. Implement `storeInstallation`, `fetchInstallation`, and `deleteInstallation` with database persistence. [slack.dev/bolt-js/con - Network accessline 10
2. **Implement `InstallationStore` for production.** The default `MemoryInstallationStore` loses data on restart. Implement `storeInstallation`, `fetchInstallation`, and `deleteInstallation` with database persistence. [slack.dev/bolt-js/con - Network accessline 11
3. **Handle both team-level and enterprise-level installations.** Check `installation.isEnterpriseInstall`: if true, key by `enterprise.id`; if false, key by `team.id`. Enterprise Grid org-wide installs have `team` undefined. [slack.dev/bol - Network accessline 11
3. **Handle both team-level and enterprise-level installations.** Check `installation.isEnterpriseInstall`: if true, key by `enterprise.id`; if false, key by `team.id`. Enterprise Grid org-wide installs have `team` undefined. [slack.dev/bol - Network accessline 12
4. **`scopes` defines bot token permissions.** Pass an array of scope strings (e.g., `["chat:write", "commands", "channels:history"]`) at the App or receiver level. These determine what the bot token can do. [api.slack.com/scopes](https://a - Network accessline 12
4. **`scopes` defines bot token permissions.** Pass an array of scope strings (e.g., `["chat:write", "commands", "channels:history"]`) at the App or receiver level. These determine what the bot token can do. [api.slack.com/scopes](https://a - Network accessline 13
5. **`installerOptions.userScopes` defines user token permissions.** User scopes grant permissions on behalf of the installing user. The resulting `installation.user.token` (xoxp-...) is separate from the bot token (xoxb-...). [api.slack.co - Network accessline 13
5. **`installerOptions.userScopes` defines user token permissions.** User scopes grant permissions on behalf of the installing user. The resulting `installation.user.token` (xoxp-...) is separate from the bot token (xoxb-...). [api.slack.co - Network accessline 14
6. **`fetchInstallation` is called for every incoming event.** The built-in `authorize` function queries your `InstallationStore` for each event to resolve the bot token. Keep this lookup fast — use caching or an indexed database. [slack.de - Network accessline 14
6. **`fetchInstallation` is called for every incoming event.** The built-in `authorize` function queries your `InstallationStore` for each event to resolve the bot token. Keep this lookup fast — use caching or an indexed database. [slack.de - Network accessline 15
7. **Use custom `authorize` for advanced token resolution.** Instead of `InstallationStore`, pass an `authorize` function that receives `{ teamId, enterpriseId, userId, isEnterpriseInstall }` and returns `{ botToken, botId, botUserId }`. [s - Network accessline 15
7. **Use custom `authorize` for advanced token resolution.** Instead of `InstallationStore`, pass an `authorize` function that receives `{ teamId, enterpriseId, userId, isEnterpriseInstall }` and returns `{ botToken, botId, botUserId }`. [s - Network accessline 16
8. **Don't mix `token` with OAuth.** Single-workspace apps use `token` directly. OAuth/multi-workspace apps use `clientId` + `clientSecret` + `installationStore`. Providing both causes undefined behavior. [slack.dev/bolt-js/concepts/authent - Network accessline 16
8. **Don't mix `token` with OAuth.** Single-workspace apps use `token` directly. OAuth/multi-workspace apps use `clientId` + `clientSecret` + `installationStore`. Providing both causes undefined behavior. [slack.dev/bolt-js/concepts/authent - Network accessline 17
9. **OAuth routes are registered automatically.** `HTTPReceiver` and `ExpressReceiver` create `GET /slack/install` (Add to Slack page) and `GET /slack/oauth_redirect` (callback). Customize paths via `installerOptions.installPath` and `insta - Network accessline 17
9. **OAuth routes are registered automatically.** `HTTPReceiver` and `ExpressReceiver` create `GET /slack/install` (Add to Slack page) and `GET /slack/oauth_redirect` (callback). Customize paths via `installerOptions.installPath` and `insta - Network accessline 18
10. **Handle `tokens_revoked` and `app_uninstalled` events.** Subscribe to these events and call `installationStore.deleteInstallation()` to clean up. Without this, revoked tokens cause auth errors on every event from that workspace. [api.s - Network accessline 18
10. **Handle `tokens_revoked` and `app_uninstalled` events.** Subscribe to these events and call `installationStore.deleteInstallation()` to clean up. Without this, revoked tokens cause auth errors on every event from that workspace. [api.s - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 83
(async () => { await app.start(3000); console.log("OAuth app running — visit http://localhost:3000/slack/install"); - Network accessline 83
(async () => { await app.start(3000); console.log("OAuth app running — visit http://localhost:3000/slack/install"); - Network accessline 84
await app.start(3000); console.log("OAuth app running — visit http://localhost:3000/slack/install"); })(); - Network accessline 84
await app.start(3000); console.log("OAuth app running — visit http://localhost:3000/slack/install"); })(); - Network accessline 85
console.log("OAuth app running — visit http://localhost:3000/slack/install"); - Network accessline 85
console.log("OAuth app running — visit http://localhost:3000/slack/install"); - Access to secretsline 95
[Credential-related source omitted] - Access to secretsline 95
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Network accessline 163
- https://slack.dev/bolt-js/concepts/authenticating-oauth - Network accessline 163
- https://slack.dev/bolt-js/concepts/authenticating-oauth - Network accessline 164
- https://slack.dev/bolt-js/concepts/authorization - Network accessline 164
- https://slack.dev/bolt-js/concepts/authorization - Network accessline 165
- https://api.slack.com/authentication/oauth-v2 - Network accessline 165
- https://api.slack.com/authentication/oauth-v2 - Network accessline 166
- https://api.slack.com/scopes - Network accessline 166
- https://api.slack.com/scopes - Network accessline 167
- https://api.slack.com/events/app_uninstalled - Network accessline 167
- https://api.slack.com/events/app_uninstalled - Network accessline 168
- https://api.slack.com/events/tokens_revoked - Network accessline 168
- https://api.slack.com/events/tokens_revoked - Network accessline 169
- https://github.com/slackapi/bolt-js - Network accessline 169
- https://github.com/slackapi/bolt-js - Network accessline 170
- https://github.com/slackapi/node-slack-sdk/tree/main/packages/oauth - Network accessline 170
- https://github.com/slackapi/node-slack-sdk/tree/main/packages/oauth
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/bolt-python.md
- Network accessline 9
1. Import the sync App from `slack_bolt` or the async App from `slack_bolt.async_app`. Use `AsyncApp` for FastAPI or any async framework; use sync `App` for Flask or Django. [slack.dev/bolt-python/concepts](https://slack.dev/bolt-python/con - Network accessline 9
1. Import the sync App from `slack_bolt` or the async App from `slack_bolt.async_app`. Use `AsyncApp` for FastAPI or any async framework; use sync `App` for Flask or Django. [slack.dev/bolt-python/concepts](https://slack.dev/bolt-python/con - Network accessline 9
1. Import the sync App from `slack_bolt` or the async App from `slack_bolt.async_app`. Use `AsyncApp` for FastAPI or any async framework; use sync `App` for Flask or Django. [slack.dev/bolt-python/concepts](https://slack.dev/bolt-python/con - Network accessline 10
2. Initialize the App with `token` and `signing_secret`, or let Bolt auto-load from `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` environment variables. Unlike TS Bolt, Python Bolt reads env vars automatically when no args are passed. [slack - Network accessline 10
2. Initialize the App with `token` and `signing_secret`, or let Bolt auto-load from `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` environment variables. Unlike TS Bolt, Python Bolt reads env vars automatically when no args are passed. [slack - Network accessline 10
2. Initialize the App with `token` and `signing_secret`, or let Bolt auto-load from `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` environment variables. Unlike TS Bolt, Python Bolt reads env vars automatically when no args are passed. [slack - Network accessline 11
3. Register listeners using decorator syntax: `@app.message("pattern")`, `@app.command("/cmd")`, `@app.action("action_id")`, `@app.shortcut("callback_id")`, `@app.view("callback_id")`, `@app.event("event_type")`, `@app.options("action_id")` - Network accessline 11
3. Register listeners using decorator syntax: `@app.message("pattern")`, `@app.command("/cmd")`, `@app.action("action_id")`, `@app.shortcut("callback_id")`, `@app.view("callback_id")`, `@app.event("event_type")`, `@app.options("action_id")` - Network accessline 11
3. Register listeners using decorator syntax: `@app.message("pattern")`, `@app.command("/cmd")`, `@app.action("action_id")`, `@app.shortcut("callback_id")`, `@app.view("callback_id")`, `@app.event("event_type")`, `@app.options("action_id")` - Network accessline 12
4. Python Bolt uses **argument injection** — handlers declare only the parameters they need (`ack`, `say`, `respond`, `client`, `body`, `event`, `command`, `action`, `shortcut`, `view`, `context`, `logger`). Bolt inspects the function signa - Network accessline 12
4. Python Bolt uses **argument injection** — handlers declare only the parameters they need (`ack`, `say`, `respond`, `client`, `body`, `event`, `command`, `action`, `shortcut`, `view`, `context`, `logger`). Bolt inspects the function signa - Network accessline 12
4. Python Bolt uses **argument injection** — handlers declare only the parameters they need (`ack`, `say`, `respond`, `client`, `body`, `event`, `command`, `action`, `shortcut`, `view`, `context`, `logger`). Bolt inspects the function signa - Network accessline 13
5. Use `ack()` the same way as TS. For view submissions, pass `response_action="errors"` and `errors={"block_id": "message"}` as keyword arguments instead of the TS object form `ack({ response_action: 'errors', errors })`. [slack.dev/bolt-p - Network accessline 13
5. Use `ack()` the same way as TS. For view submissions, pass `response_action="errors"` and `errors={"block_id": "message"}` as keyword arguments instead of the TS object form `ack({ response_action: 'errors', errors })`. [slack.dev/bolt-p - Network accessline 13
5. Use `ack()` the same way as TS. For view submissions, pass `response_action="errors"` and `errors={"block_id": "message"}` as keyword arguments instead of the TS object form `ack({ response_action: 'errors', errors })`. [slack.dev/bolt-p - Network accessline 14
6. Use `client` (a `WebClient` instance from `slack_sdk`) for API calls. Method names use **snake_case**: `client.chat_postMessage()`, `client.views_open()`, `client.users_info()`, `client.files_upload_v2()`. This maps directly from the TS - Network accessline 14
6. Use `client` (a `WebClient` instance from `slack_sdk`) for API calls. Method names use **snake_case**: `client.chat_postMessage()`, `client.views_open()`, `client.users_info()`, `client.files_upload_v2()`. This maps directly from the TS - Network accessline 14
6. Use `client` (a `WebClient` instance from `slack_sdk`) for API calls. Method names use **snake_case**: `client.chat_postMessage()`, `client.views_open()`, `client.users_info()`, `client.files_upload_v2()`. This maps directly from the TS - Network accessline 15
7. Pass keyword arguments to API methods, not request configurators. TS uses `client.chat.postMessage({ channel, text })`. Python uses `client.chat_postMessage(channel=channel, text=text)`. No nested method namespaces — methods are flat on - Network accessline 15
7. Pass keyword arguments to API methods, not request configurators. TS uses `client.chat.postMessage({ channel, text })`. Python uses `client.chat_postMessage(channel=channel, text=text)`. No nested method namespaces — methods are flat on - Network accessline 15
7. Pass keyword arguments to API methods, not request configurators. TS uses `client.chat.postMessage({ channel, text })`. Python uses `client.chat_postMessage(channel=channel, text=text)`. No nested method namespaces — methods are flat on - Network accessline 16
8. For Socket Mode, use `SocketModeHandler` from `slack_bolt.adapter.socket_mode`. Pass the `App` and `app_token`. Call `handler.start()` to block. This replaces the TS `socketMode: true` constructor option. [slack.dev/bolt-python/concepts/ - Network accessline 16
8. For Socket Mode, use `SocketModeHandler` from `slack_bolt.adapter.socket_mode`. Pass the `App` and `app_token`. Call `handler.start()` to block. This replaces the TS `socketMode: true` constructor option. [slack.dev/bolt-python/concepts/ - Network accessline 16
8. For Socket Mode, use `SocketModeHandler` from `slack_bolt.adapter.socket_mode`. Pass the `App` and `app_token`. Call `handler.start()` to block. This replaces the TS `socketMode: true` constructor option. [slack.dev/bolt-python/concepts/ - Network accessline 17
9. For Flask, wrap the App with `SlackRequestHandler` from `slack_bolt.adapter.flask`. For FastAPI, use `AsyncSlackRequestHandler` from `slack_bolt.adapter.fastapi` with `AsyncApp`. Django, Bottle, Sanic, Tornado, Starlette, and ASGI adapte - Network accessline 17
9. For Flask, wrap the App with `SlackRequestHandler` from `slack_bolt.adapter.flask`. For FastAPI, use `AsyncSlackRequestHandler` from `slack_bolt.adapter.fastapi` with `AsyncApp`. Django, Bottle, Sanic, Tornado, Starlette, and ASGI adapte - Network accessline 17
9. For Flask, wrap the App with `SlackRequestHandler` from `slack_bolt.adapter.flask`. For FastAPI, use `AsyncSlackRequestHandler` from `slack_bolt.adapter.fastapi` with `AsyncApp`. Django, Bottle, Sanic, Tornado, Starlette, and ASGI adapte - Network accessline 18
10. Use regex patterns with `re.compile()`: `@app.message(re.compile(r"^hello"))`. Same capability as TS RegExp patterns but uses Python's `re` module. [slack.dev/bolt-python/concepts/message-listening](https://slack.dev/bolt-python/concept - Network accessline 18
10. Use regex patterns with `re.compile()`: `@app.message(re.compile(r"^hello"))`. Same capability as TS RegExp patterns but uses Python's `re` module. [slack.dev/bolt-python/concepts/message-listening](https://slack.dev/bolt-python/concept - Network accessline 18
10. Use regex patterns with `re.compile()`: `@app.message(re.compile(r"^hello"))`. Same capability as TS RegExp patterns but uses Python's `re` module. [slack.dev/bolt-python/concepts/message-listening](https://slack.dev/bolt-python/concept - Network accessline 19
11. Access event data through the injected `event` or `body` dict — these are plain Python dicts, not typed objects. Use `event["user"]`, `body["trigger_id"]`, `view["state"]["values"]`. No TypeScript interfaces — rely on Slack API document - Network accessline 19
11. Access event data through the injected `event` or `body` dict — these are plain Python dicts, not typed objects. Use `event["user"]`, `body["trigger_id"]`, `view["state"]["values"]`. No TypeScript interfaces — rely on Slack API document - Network accessline 19
11. Access event data through the injected `event` or `body` dict — these are plain Python dicts, not typed objects. Use `event["user"]`, `body["trigger_id"]`, `view["state"]["values"]`. No TypeScript interfaces — rely on Slack API document - Network accessline 20
12. For middleware, use `@app.middleware` decorator or pass `middleware=[fn]` to individual listeners. Middleware functions receive injected args including `next` (or `next_` to avoid shadowing the builtin). Call `next()` to continue the ch - Network accessline 20
12. For middleware, use `@app.middleware` decorator or pass `middleware=[fn]` to individual listeners. Middleware functions receive injected args including `next` (or `next_` to avoid shadowing the builtin). Call `next()` to continue the ch - Network accessline 20
12. For middleware, use `@app.middleware` decorator or pass `middleware=[fn]` to individual listeners. Middleware functions receive injected args including `next` (or `next_` to avoid shadowing the builtin). Call `next()` to continue the ch - Network accessline 21
13. Both sync and async Apps support the same listener types. Async handlers must use `async def` and `await` all utility calls (`await ack()`, `await say()`, `await client.chat_postMessage()`). Sync handlers use regular `def` and direct ca - Network accessline 21
13. Both sync and async Apps support the same listener types. Async handlers must use `async def` and `await` all utility calls (`await ack()`, `await say()`, `await client.chat_postMessage()`). Sync handlers use regular `def` and direct ca - Network accessline 21
13. Both sync and async Apps support the same listener types. Async handlers must use `async def` and `await` all utility calls (`await ack()`, `await say()`, `await client.chat_postMessage()`). Sync handlers use regular `def` and direct ca - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Network accessline 141
- https://slack.dev/bolt-python/concepts - Network accessline 141
- https://slack.dev/bolt-python/concepts - Network accessline 141
- https://slack.dev/bolt-python/concepts - Network accessline 142
- https://slack.dev/bolt-python/tutorial/getting-started - Network accessline 142
- https://slack.dev/bolt-python/tutorial/getting-started - Network accessline 142
- https://slack.dev/bolt-python/tutorial/getting-started - Network accessline 143
- https://slack.dev/python-slack-sdk/web - Network accessline 143
- https://slack.dev/python-slack-sdk/web - Network accessline 143
- https://slack.dev/python-slack-sdk/web - Network accessline 144
- https://github.com/slackapi/bolt-python - Network accessline 144
- https://github.com/slackapi/bolt-python - Network accessline 144
- https://github.com/slackapi/bolt-python
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/cli.app-management.md
- Network accessline 134
- [slack app reference](https://tools.slack.dev/cli/reference/slack_app/) - Network accessline 134
- [slack app reference](https://tools.slack.dev/cli/reference/slack_app/) - Network accessline 135
- [App installation](https://tools.slack.dev/cli/guides/installing-an-app/) - Network accessline 135
- [App installation](https://tools.slack.dev/cli/guides/installing-an-app/) - Network accessline 136
- [Collaborator management](https://tools.slack.dev/cli/reference/slack_collaborator/) - Network accessline 136
- [Collaborator management](https://tools.slack.dev/cli/reference/slack_collaborator/) - Network accessline 137
- [Multi-workspace apps](https://tools.slack.dev/cli/guides/deploying-to-slack/) - Network accessline 137
- [Multi-workspace apps](https://tools.slack.dev/cli/guides/deploying-to-slack/) - Network accessline 138
- [slack app link](https://tools.slack.dev/cli/reference/slack_app_link/) - Network accessline 138
- [slack app link](https://tools.slack.dev/cli/reference/slack_app_link/)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/cli.datastore-env.md
- Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Network accessline 126
[Credential-related source omitted] - Network accessline 126
[Credential-related source omitted] - Network accessline 127
[Credential-related source omitted] - Network accessline 127
[Credential-related source omitted] - Network accessline 128
# Authorization URL: https://accounts.google.com/o/oauth2/v2/auth - Network accessline 128
# Authorization URL: https://accounts.google.com/o/oauth2/v2/auth - Network accessline 129
# Token URL: https://oauth2.googleapis.com/token - Network accessline 129
# Token URL: https://oauth2.googleapis.com/token - Network accessline 155
- [Datastores overview](https://tools.slack.dev/cli/guides/datastores/) - Network accessline 155
- [Datastores overview](https://tools.slack.dev/cli/guides/datastores/) - Network accessline 156
- [slack datastore reference](https://tools.slack.dev/cli/reference/slack_datastore/) - Network accessline 156
- [slack datastore reference](https://tools.slack.dev/cli/reference/slack_datastore/) - Network accessline 157
- [Environment variables](https://tools.slack.dev/cli/guides/environment-variables/) - Network accessline 157
- [Environment variables](https://tools.slack.dev/cli/guides/environment-variables/) - Network accessline 158
- [slack env reference](https://tools.slack.dev/cli/reference/slack_env/) - Network accessline 158
- [slack env reference](https://tools.slack.dev/cli/reference/slack_env/) - Network accessline 159
- [External auth providers](https://tools.slack.dev/cli/guides/external-auth/) - Network accessline 159
- [External auth providers](https://tools.slack.dev/cli/guides/external-auth/) - Network accessline 160
- [Query expressions](https://api.slack.com/automation/datastores/query-expressions) - Network accessline 160
- [Query expressions](https://api.slack.com/automation/datastores/query-expressions)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/cli.getting-started.md
- Network accessline 30
brew install slack-cli # Windows (PowerShell as admin): # irm https://downloads.slack-edge.com/slack-cli/install-windows.ps1 | iex - Network accessline 30
brew install slack-cli # Windows (PowerShell as admin): # irm https://downloads.slack-edge.com/slack-cli/install-windows.ps1 | iex - Network accessline 31
# Windows (PowerShell as admin): # irm https://downloads.slack-edge.com/slack-cli/install-windows.ps1 | iex # Linux: - Network accessline 31
# Windows (PowerShell as admin): # irm https://downloads.slack-edge.com/slack-cli/install-windows.ps1 | iex # Linux: - Network accessline 32
# irm https://downloads.slack-edge.com/slack-cli/install-windows.ps1 | iex # Linux: # curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash - Network accessline 32
# irm https://downloads.slack-edge.com/slack-cli/install-windows.ps1 | iex # Linux: # curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash - Dangerous shell operationline 34
# curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash - Dangerous shell operationline 34
# curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash - Network accessline 34
# curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash - Network accessline 34
# curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash - Network accessline 58
# From a specific template URL slack create my-bot --template https://github.com/slack-samples/deno-hello-world - Network accessline 58
# From a specific template URL slack create my-bot --template https://github.com/slack-samples/deno-hello-world - Network accessline 59
slack create my-bot --template https://github.com/slack-samples/deno-hello-world - Network accessline 59
slack create my-bot --template https://github.com/slack-samples/deno-hello-world - Network accessline 122
- [Slack CLI quickstart](https://tools.slack.dev/cli/getting-started/) - Network accessline 122
- [Slack CLI quickstart](https://tools.slack.dev/cli/getting-started/) - Network accessline 123
- [Install the Slack CLI](https://tools.slack.dev/cli/install/) - Network accessline 123
- [Install the Slack CLI](https://tools.slack.dev/cli/install/) - Network accessline 124
- [Authentication](https://tools.slack.dev/cli/authorization/) - Network accessline 124
- [Authentication](https://tools.slack.dev/cli/authorization/) - Network accessline 125
- [slack create reference](https://tools.slack.dev/cli/reference/slack_create/) - Network accessline 125
- [slack create reference](https://tools.slack.dev/cli/reference/slack_create/) - Network accessline 126
- [Project configuration](https://tools.slack.dev/cli/guides/project-structure/) - Network accessline 126
- [Project configuration](https://tools.slack.dev/cli/guides/project-structure/) - Network accessline 127
- [Slack CLI GitHub repo](https://github.com/slackapi/slack-cli) - Network accessline 127
- [Slack CLI GitHub repo](https://github.com/slackapi/slack-cli)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/cli.local-dev-deploy.md
- Network accessline 42
# my-bot (dev) A0123456789 T0123456789 # SDK: deno-slack-sdk 2.x # Visit https://app.slack.com/client/T0123456789 to use your app - Network accessline 42
# my-bot (dev) A0123456789 T0123456789 # SDK: deno-slack-sdk 2.x # Visit https://app.slack.com/client/T0123456789 to use your app - Network accessline 44
# Visit https://app.slack.com/client/T0123456789 to use your app - Network accessline 44
# Visit https://app.slack.com/client/T0123456789 to use your app - Network accessline 59
# ✅ my-bot deployed to workspace MyWorkspace # App ID: A0123456789 # Dashboard: https://api.slack.com/apps/A0123456789 - Network accessline 59
# ✅ my-bot deployed to workspace MyWorkspace # App ID: A0123456789 # Dashboard: https://api.slack.com/apps/A0123456789 - Network accessline 61
# Dashboard: https://api.slack.com/apps/A0123456789 - Network accessline 61
# Dashboard: https://api.slack.com/apps/A0123456789 - Network accessline 132
- [slack run reference](https://tools.slack.dev/cli/reference/slack_run/) - Network accessline 132
- [slack run reference](https://tools.slack.dev/cli/reference/slack_run/) - Network accessline 133
- [slack deploy reference](https://tools.slack.dev/cli/reference/slack_deploy/) - Network accessline 133
- [slack deploy reference](https://tools.slack.dev/cli/reference/slack_deploy/) - Network accessline 134
- [slack activity reference](https://tools.slack.dev/cli/reference/slack_activity/) - Network accessline 134
- [slack activity reference](https://tools.slack.dev/cli/reference/slack_activity/) - Network accessline 135
- [Local development guide](https://tools.slack.dev/cli/guides/developing-locally/) - Network accessline 135
- [Local development guide](https://tools.slack.dev/cli/guides/developing-locally/) - Network accessline 136
- [Deploying to Slack](https://tools.slack.dev/cli/guides/deploying-to-slack/) - Network accessline 136
- [Deploying to Slack](https://tools.slack.dev/cli/guides/deploying-to-slack/) - Network accessline 137
- [Hooks system](https://tools.slack.dev/cli/guides/hooks/) - Network accessline 137
- [Hooks system](https://tools.slack.dev/cli/guides/hooks/)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/cli.manifest-triggers.md
- Network accessline 60
# Type: shortcut # Name: Send Greeting # Shortcut URL: https://slack.com/shortcuts/Ft0123456789/... - Network accessline 60
# Type: shortcut # Name: Send Greeting # Shortcut URL: https://slack.com/shortcuts/Ft0123456789/... - Network accessline 62
# Shortcut URL: https://slack.com/shortcuts/Ft0123456789/... - Network accessline 62
# Shortcut URL: https://slack.com/shortcuts/Ft0123456789/... - Network accessline 179
- [App manifest reference](https://tools.slack.dev/cli/guides/creating-an-app-manifest/) - Network accessline 179
- [App manifest reference](https://tools.slack.dev/cli/guides/creating-an-app-manifest/) - Network accessline 180
- [Trigger types](https://tools.slack.dev/cli/guides/triggers/) - Network accessline 180
- [Trigger types](https://tools.slack.dev/cli/guides/triggers/) - Network accessline 181
- [slack trigger reference](https://tools.slack.dev/cli/reference/slack_trigger/) - Network accessline 181
- [slack trigger reference](https://tools.slack.dev/cli/reference/slack_trigger/) - Network accessline 182
- [slack manifest validate](https://tools.slack.dev/cli/reference/slack_manifest_validate/) - Network accessline 182
- [slack manifest validate](https://tools.slack.dev/cli/reference/slack_manifest_validate/) - Network accessline 183
- [Custom functions](https://tools.slack.dev/cli/guides/creating-custom-functions/) - Network accessline 183
- [Custom functions](https://tools.slack.dev/cli/guides/creating-custom-functions/) - Network accessline 184
- [Function distribution](https://tools.slack.dev/cli/reference/slack_function/) - Network accessline 184
- [Function distribution](https://tools.slack.dev/cli/reference/slack_function/)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/runtime.ack-rules-ts.md
- Network accessline 9
1. Slack requires every interactive request (commands, actions, view submissions, shortcuts, options) to be acknowledged within **3 seconds**. Failure to `ack()` in time causes the user to see a "dispatch_failed" error or a timeout spinner. - Network accessline 9
1. Slack requires every interactive request (commands, actions, view submissions, shortcuts, options) to be acknowledged within **3 seconds**. Failure to `ack()` in time causes the user to see a "dispatch_failed" error or a timeout spinner. - Network accessline 10
2. **Commands** (`app.command`): must call `await ack()`. Optionally pass a string or blocks payload to `ack()` to send an immediate ephemeral response. Calling `ack()` with no argument sends a 200 OK with no visible reply. [slack.dev/bolt- - Network accessline 10
2. **Commands** (`app.command`): must call `await ack()`. Optionally pass a string or blocks payload to `ack()` to send an immediate ephemeral response. Calling `ack()` with no argument sends a 200 OK with no visible reply. [slack.dev/bolt- - Network accessline 11
3. **Actions** (`app.action`): must call `await ack()`. The `ack()` function takes no arguments for actions -- it simply acknowledges receipt. Any response goes through `respond()` or `client` API calls after ack. [slack.dev/bolt-js/concept - Network accessline 11
3. **Actions** (`app.action`): must call `await ack()`. The `ack()` function takes no arguments for actions -- it simply acknowledges receipt. Any response goes through `respond()` or `client` API calls after ack. [slack.dev/bolt-js/concept - Network accessline 12
4. **View submissions** (`app.view`): must call `await ack()`. Optionally pass a `response_action` object to control modal behavior: `{ response_action: "errors", errors: { block_id: "msg" } }` to show validation errors, `{ response_action: - Network accessline 12
4. **View submissions** (`app.view`): must call `await ack()`. Optionally pass a `response_action` object to control modal behavior: `{ response_action: "errors", errors: { block_id: "msg" } }` to show validation errors, `{ response_action: - Network accessline 13
5. **Shortcuts** (`app.shortcut`): must call `await ack()` with no arguments. Then use `trigger_id` from the payload to open a modal via `client.views.open()`. [slack.dev/bolt-js/concepts/shortcuts](https://slack.dev/bolt-js/concepts/shortc - Network accessline 13
5. **Shortcuts** (`app.shortcut`): must call `await ack()` with no arguments. Then use `trigger_id` from the payload to open a modal via `client.views.open()`. [slack.dev/bolt-js/concepts/shortcuts](https://slack.dev/bolt-js/concepts/shortc - Network accessline 14
6. **Options** (`app.options`): must call `await ack()` with an options payload containing the dynamic choices to display in the select menu. [slack.dev/bolt-js/concepts/options](https://slack.dev/bolt-js/concepts/options) 7. **Messages** ( - Network accessline 14
6. **Options** (`app.options`): must call `await ack()` with an options payload containing the dynamic choices to display in the select menu. [slack.dev/bolt-js/concepts/options](https://slack.dev/bolt-js/concepts/options) 7. **Messages** ( - Network accessline 15
7. **Messages** (`app.message`) and **events** (`app.event`): do NOT require `ack()`. These are fire-and-forget from Slack's perspective. The `ack` property is not present in their context objects. [slack.dev/bolt-js/concepts/message-listen - Network accessline 15
7. **Messages** (`app.message`) and **events** (`app.event`): do NOT require `ack()`. These are fire-and-forget from Slack's perspective. The `ack` property is not present in their context objects. [slack.dev/bolt-js/concepts/message-listen - Network accessline 16
8. Always call `ack()` **before** any async work (database calls, API requests, LLM inference). Perform long-running operations after acknowledgement to stay within the 3-second window. [api.slack.com/interactivity/handling#acknowledgment_r - Network accessline 16
8. Always call `ack()` **before** any async work (database calls, API requests, LLM inference). Perform long-running operations after acknowledgement to stay within the 3-second window. [api.slack.com/interactivity/handling#acknowledgment_r - Network accessline 17
9. For commands that need a visible immediate reply, pass the response to `ack(text)` or `ack({ text, blocks })`. For a delayed or richer response, `ack()` with no arguments first, then use `respond()` or `say()` for the follow-up message. - Network accessline 17
9. For commands that need a visible immediate reply, pass the response to `ack(text)` or `ack({ text, blocks })`. For a delayed or richer response, `ack()` with no arguments first, then use `respond()` or `say()` for the follow-up message. - Network accessline 18
10. Duplicate ack calls are harmless but wasteful -- Slack ignores the second acknowledgement. However, calling `ack()` after the 3-second window has passed still results in a user-visible error regardless of the call. [api.slack.com/intera - Network accessline 18
10. Duplicate ack calls are harmless but wasteful -- Slack ignores the second acknowledgement. However, calling `ack()` after the 3-second window has passed still results in a user-visible error regardless of the call. [api.slack.com/intera - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Network accessline 152
- https://api.slack.com/interactivity/handling#acknowledgment_response - Network accessline 152
- https://api.slack.com/interactivity/handling#acknowledgment_response - Network accessline 153
- https://api.slack.com/surfaces/modals#response_actions - Network accessline 153
- https://api.slack.com/surfaces/modals#response_actions - Network accessline 154
- https://slack.dev/bolt-js/concepts/commands - Network accessline 154
- https://slack.dev/bolt-js/concepts/commands - Network accessline 155
- https://slack.dev/bolt-js/concepts/actions - Network accessline 155
- https://slack.dev/bolt-js/concepts/actions - Network accessline 156
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 156
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 157
- https://slack.dev/bolt-js/concepts/shortcuts - Network accessline 157
- https://slack.dev/bolt-js/concepts/shortcuts - Network accessline 158
- https://slack.dev/bolt-js/concepts/options - Network accessline 158
- https://slack.dev/bolt-js/concepts/options - Network accessline 159
- https://slack.dev/bolt-js/concepts/acknowledge - Network accessline 159
- https://slack.dev/bolt-js/concepts/acknowledge - Network accessline 160
- https://api.slack.com/interactivity/slash-commands#responding_to_commands - Network accessline 160
- https://api.slack.com/interactivity/slash-commands#responding_to_commands - Network accessline 161
- https://github.com/slackapi/bolt-js - Network accessline 161
- https://github.com/slackapi/bolt-js
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/runtime.bolt-foundations-ts.md
- Network accessline 9
1. Initialize the Bolt `App` with at minimum `token` (bot OAuth token) and `signingSecret` (request verification); for socket mode add `socketMode: true` and `appToken`. Never hard-code secrets -- pull from `process.env`. [slack.dev/bolt-js - Network accessline 9
1. Initialize the Bolt `App` with at minimum `token` (bot OAuth token) and `signingSecret` (request verification); for socket mode add `socketMode: true` and `appToken`. Never hard-code secrets -- pull from `process.env`. [slack.dev/bolt-js - Network accessline 10
2. Call `await app.start(port)` to launch the HTTP receiver (default Express). In socket mode the port argument is ignored and a WebSocket connection is established instead. [slack.dev/bolt-js/concepts/socket-mode](https://slack.dev/bolt-js - Network accessline 10
2. Call `await app.start(port)` to launch the HTTP receiver (default Express). In socket mode the port argument is ignored and a WebSocket connection is established instead. [slack.dev/bolt-js/concepts/socket-mode](https://slack.dev/bolt-js - Network accessline 11
3. Register handlers by type: `app.message()` for messages, `app.command()` for slash commands, `app.action()` for Block Kit interactions, `app.view()` for modal submissions, `app.event()` for Events API, `app.shortcut()` for global/message - Network accessline 11
3. Register handlers by type: `app.message()` for messages, `app.command()` for slash commands, `app.action()` for Block Kit interactions, `app.view()` for modal submissions, `app.event()` for Events API, `app.shortcut()` for global/message - Network accessline 12
4. Every handler receives a context object with named properties. Common properties include `say` (post to the conversation), `respond` (hit the response_url), `client` (Slack WebClient), `body` (full payload), `ack` (acknowledge the reques - Network accessline 12
4. Every handler receives a context object with named properties. Common properties include `say` (post to the conversation), `respond` (hit the response_url), `client` (Slack WebClient), `body` (full payload), `ack` (acknowledge the reques - Network accessline 13
5. `app.message()` accepts a string, RegExp, or no argument (catch-all). String matching is substring-based. For exact matching use a RegExp with anchors (e.g., `/^hello$/i`). [slack.dev/bolt-js/concepts/message-listening](https://slack.dev - Network accessline 13
5. `app.message()` accepts a string, RegExp, or no argument (catch-all). String matching is substring-based. For exact matching use a RegExp with anchors (e.g., `/^hello$/i`). [slack.dev/bolt-js/concepts/message-listening](https://slack.dev - Network accessline 14
6. Use `app.use()` to register global middleware that runs before all route handlers. Middleware must call `await next()` to continue to the next middleware or handler; omitting `next()` silently swallows the event. [slack.dev/bolt-js/conce - Network accessline 14
6. Use `app.use()` to register global middleware that runs before all route handlers. Middleware must call `await next()` to continue to the next middleware or handler; omitting `next()` silently swallows the event. [slack.dev/bolt-js/conce - Network accessline 15
7. Register `app.error(async (error) => { ... })` for global error handling. Unhandled errors in listeners bubble to this handler. Without it, errors are logged to stderr and the process continues. [slack.dev/bolt-js/concepts/error-handling - Network accessline 15
7. Register `app.error(async (error) => { ... })` for global error handling. Unhandled errors in listeners bubble to this handler. Without it, errors are logged to stderr and the process continues. [slack.dev/bolt-js/concepts/error-handling - Network accessline 16
8. The `client` property in handler context is a pre-authenticated `WebClient` bound to the bot token. Use it for Slack API calls like `client.chat.postMessage()`, `client.views.open()`, `client.users.info()`, etc. For workspace-level calls - Network accessline 16
8. The `client` property in handler context is a pre-authenticated `WebClient` bound to the bot token. Use it for Slack API calls like `client.chat.postMessage()`, `client.views.open()`, `client.users.info()`, etc. For workspace-level calls - Network accessline 17
9. Handler registration order matters: Bolt evaluates listeners in registration order and stops at the first match for `app.message()`. Place more specific patterns before catch-all handlers. [slack.dev/bolt-js/concepts/message-listening](h - Network accessline 17
9. Handler registration order matters: Bolt evaluates listeners in registration order and stops at the first match for `app.message()`. Place more specific patterns before catch-all handlers. [slack.dev/bolt-js/concepts/message-listening](h - Network accessline 18
10. The `say()` function posts a message to the same channel where the event occurred. It accepts a string or a full message payload with `blocks`, `text`, `thread_ts`, and `attachments`. For posting to a different channel, use `client.chat - Network accessline 18
10. The `say()` function posts a message to the same channel where the event occurred. It accepts a string or a full message payload with `blocks`, `text`, `thread_ts`, and `attachments`. For posting to a different channel, use `client.chat - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Network accessline 176
- https://slack.dev/bolt-js/getting-started - Network accessline 176
- https://slack.dev/bolt-js/getting-started - Network accessline 177
- https://slack.dev/bolt-js/concepts/basic - Network accessline 177
- https://slack.dev/bolt-js/concepts/basic - Network accessline 178
- https://slack.dev/bolt-js/concepts/message-listening - Network accessline 178
- https://slack.dev/bolt-js/concepts/message-listening - Network accessline 179
- https://slack.dev/bolt-js/concepts/actions - Network accessline 179
- https://slack.dev/bolt-js/concepts/actions - Network accessline 180
- https://slack.dev/bolt-js/concepts/commands - Network accessline 180
- https://slack.dev/bolt-js/concepts/commands - Network accessline 181
- https://slack.dev/bolt-js/concepts/events - Network accessline 181
- https://slack.dev/bolt-js/concepts/events - Network accessline 182
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 182
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 183
- https://slack.dev/bolt-js/concepts/global-middleware - https://slack.dev/bolt-js/concepts/error-handling - https://slack.dev/bolt-js/concepts/socket-mode - Network accessline 183
- https://slack.dev/bolt-js/concepts/global-middleware - https://slack.dev/bolt-js/concepts/error-handling - https://slack.dev/bolt-js/concepts/socket-mode - Network accessline 184
- https://slack.dev/bolt-js/concepts/error-handling - https://slack.dev/bolt-js/concepts/socket-mode - https://slack.dev/bolt-js/reference - Network accessline 184
- https://slack.dev/bolt-js/concepts/error-handling - https://slack.dev/bolt-js/concepts/socket-mode - https://slack.dev/bolt-js/reference - Network accessline 185
- https://slack.dev/bolt-js/concepts/socket-mode - Network accessline 185
- https://slack.dev/bolt-js/concepts/socket-mode - Network accessline 186
- https://slack.dev/bolt-js/reference - Network accessline 186
- https://slack.dev/bolt-js/reference - Network accessline 187
- https://api.slack.com/methods - Network accessline 187
- https://api.slack.com/methods - Network accessline 188
- https://github.com/slackapi/bolt-js - Network accessline 188
- https://github.com/slackapi/bolt-js
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/runtime.shortcuts-ts.md
- Network accessline 9
1. Register shortcut handlers with `app.shortcut('callback_id', handler)`. The `callback_id` must match the shortcut configured in the Slack app dashboard under **Interactivity & Shortcuts**. Supports string or RegExp matching. [slack.dev/b - Network accessline 9
1. Register shortcut handlers with `app.shortcut('callback_id', handler)`. The `callback_id` must match the shortcut configured in the Slack app dashboard under **Interactivity & Shortcuts**. Supports string or RegExp matching. [slack.dev/b - Network accessline 10
2. Slack has two shortcut types: **global shortcuts** (`type: 'shortcut'`) launched from the compose menu or search bar, and **message shortcuts** (`type: 'message_action'`) launched from a message's context menu (three-dot "More actions"). - Network accessline 10
2. Slack has two shortcut types: **global shortcuts** (`type: 'shortcut'`) launched from the compose menu or search bar, and **message shortcuts** (`type: 'message_action'`) launched from a message's context menu (three-dot "More actions"). - Network accessline 11
3. Always call `await ack()` within 3 seconds. Shortcuts provide a `trigger_id` — use it to open a modal with `client.views.open()` immediately after ack. The trigger ID expires quickly, so do not perform slow work between ack and views.ope - Network accessline 11
3. Always call `await ack()` within 3 seconds. Shortcuts provide a `trigger_id` — use it to open a modal with `client.views.open()` immediately after ack. The trigger ID expires quickly, so do not perform slow work between ack and views.ope - Network accessline 12
4. Filter by shortcut type using constraints: `app.shortcut({ type: 'message_action', callback_id: 'my_action' }, handler)`. Without a `type` constraint, the handler fires for both global and message shortcuts with that `callback_id`. [bolt - Network accessline 12
4. Filter by shortcut type using constraints: `app.shortcut({ type: 'message_action', callback_id: 'my_action' }, handler)`. Without a `type` constraint, the handler fires for both global and message shortcuts with that `callback_id`. [bolt - Network accessline 13
5. Global shortcuts provide `shortcut.trigger_id`, `shortcut.user`, and `shortcut.team` but **no channel or message context**. The only response pattern is opening a modal — `say()` is not available. [api.slack.com/interactivity/shortcuts/u - Network accessline 13
5. Global shortcuts provide `shortcut.trigger_id`, `shortcut.user`, and `shortcut.team` but **no channel or message context**. The only response pattern is opening a modal — `say()` is not available. [api.slack.com/interactivity/shortcuts/u - Network accessline 14
6. Message shortcuts provide `shortcut.message` (the target message with `ts`, `text`, `user`), `shortcut.channel` (channel ID and name), `shortcut.response_url`, and `shortcut.message_ts`. Both `say()` and `respond()` are available. [api.s - Network accessline 14
6. Message shortcuts provide `shortcut.message` (the target message with `ts`, `text`, `user`), `shortcut.channel` (channel ID and name), `shortcut.response_url`, and `shortcut.message_ts`. Both `say()` and `respond()` are available. [api.s - Network accessline 15
7. Use `shortcut.message.text` and `shortcut.message.ts` from message shortcuts to access the message content the user right-clicked on. The `message` object may not have a `user` field for bot messages. Always handle that as optional. [bol - Network accessline 15
7. Use `shortcut.message.text` and `shortcut.message.ts` from message shortcuts to access the message content the user right-clicked on. The `message` object may not have a `user` field for bot messages. Always handle that as optional. [bol - Network accessline 16
8. Store context for modal follow-up using `private_metadata` on the view. For message shortcuts, serialize the channel ID, message timestamp, and any relevant data into `private_metadata` so the `view_submission` handler can access it. [ap - Network accessline 16
8. Store context for modal follow-up using `private_metadata` on the view. For message shortcuts, serialize the channel ID, message timestamp, and any relevant data into `private_metadata` so the `view_submission` handler can access it. [ap - Network accessline 17
9. Register shortcuts in the Slack app dashboard: **global shortcuts** under Interactivity → Shortcuts → "Global" tab; **message shortcuts** under Interactivity → Shortcuts → "On messages" tab. Each shortcut needs a name, description, and ` - Network accessline 17
9. Register shortcuts in the Slack app dashboard: **global shortcuts** under Interactivity → Shortcuts → "Global" tab; **message shortcuts** under Interactivity → Shortcuts → "On messages" tab. Each shortcut needs a name, description, and ` - Network accessline 18
10. Shortcut payloads include `enterprise` and `is_enterprise_install` fields for Enterprise Grid compatibility. Check `is_enterprise_install` when routing to workspace-specific resources in multi-org deployments. [bolt-js source: types/sho - Network accessline 18
10. Shortcut payloads include `enterprise` and `is_enterprise_install` fields for Enterprise Grid compatibility. Check `is_enterprise_install` when routing to workspace-specific resources in multi-org deployments. [bolt-js source: types/sho - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Network accessline 196
- https://api.slack.com/interactivity/shortcuts - Network accessline 196
- https://api.slack.com/interactivity/shortcuts - Network accessline 197
- https://api.slack.com/interactivity/shortcuts/using - Network accessline 197
- https://api.slack.com/interactivity/shortcuts/using - Network accessline 198
- https://api.slack.com/surfaces/modals - Network accessline 198
- https://api.slack.com/surfaces/modals - Network accessline 199
- https://slack.dev/bolt-js/concepts/shortcuts - Network accessline 199
- https://slack.dev/bolt-js/concepts/shortcuts - Network accessline 200
- https://github.com/slackapi/bolt-js/blob/main/src/types/shortcuts/global-shortcut.ts - Network accessline 200
- https://github.com/slackapi/bolt-js/blob/main/src/types/shortcuts/global-shortcut.ts - Network accessline 201
- https://github.com/slackapi/bolt-js/blob/main/src/types/shortcuts/message-shortcut.ts - Network accessline 201
- https://github.com/slackapi/bolt-js/blob/main/src/types/shortcuts/message-shortcut.ts
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/runtime.slash-commands-ts.md
- Network accessline 9
1. Register slash command handlers with `app.command('/command-name', handler)`. The command string must include the leading `/` and match the command configured in the Slack app dashboard. [slack.dev/bolt-js/concepts/commands](https://slac - Network accessline 9
1. Register slash command handlers with `app.command('/command-name', handler)`. The command string must include the leading `/` and match the command configured in the Slack app dashboard. [slack.dev/bolt-js/concepts/commands](https://slac - Network accessline 10
2. The handler context includes `command` (the full payload), `ack`, `say`, `respond`, and `client`. The `command` object contains: `text` (everything after the command), `trigger_id`, `response_url`, `user_id`, `user_name`, `channel_id`, ` - Network accessline 10
2. The handler context includes `command` (the full payload), `ack`, `say`, `respond`, and `client`. The `command` object contains: `text` (everything after the command), `trigger_id`, `response_url`, `user_id`, `user_name`, `channel_id`, ` - Network accessline 11
3. Always call `await ack()` within 3 seconds. Optionally pass a string or `{ text, blocks }` to `ack()` for an immediate ephemeral response visible only to the invoking user. [api.slack.com/interactivity/slash-commands#responding_to_comman - Network accessline 11
3. Always call `await ack()` within 3 seconds. Optionally pass a string or `{ text, blocks }` to `ack()` for an immediate ephemeral response visible only to the invoking user. [api.slack.com/interactivity/slash-commands#responding_to_comman - Network accessline 12
4. The default response type for `ack(text)` and `respond()` is **ephemeral** (visible only to the user). To make a response visible to the entire channel, set `response_type: "in_channel"` in the `respond()` payload. [api.slack.com/interac - Network accessline 12
4. The default response type for `ack(text)` and `respond()` is **ephemeral** (visible only to the user). To make a response visible to the entire channel, set `response_type: "in_channel"` in the `respond()` payload. [api.slack.com/interac - Network accessline 13
5. Use `respond()` (backed by `response_url`) for follow-up messages after `ack()`. The `response_url` is valid for 30 minutes and supports up to 5 responses. Each call can set `replace_original`, `delete_original`, or `response_type`. [api - Network accessline 13
5. Use `respond()` (backed by `response_url`) for follow-up messages after `ack()`. The `response_url` is valid for 30 minutes and supports up to 5 responses. Each call can set `replace_original`, `delete_original`, or `response_type`. [api - Network accessline 14
6. Use `trigger_id` from the command payload to open modals with `client.views.open()`. The trigger ID expires in 3 seconds, so call `ack()` and `client.views.open()` early in the handler. [api.slack.com/surfaces/modals#opening](https://api - Network accessline 14
6. Use `trigger_id` from the command payload to open modals with `client.views.open()`. The trigger ID expires in 3 seconds, so call `ack()` and `client.views.open()` early in the handler. [api.slack.com/surfaces/modals#opening](https://api - Network accessline 15
7. Use `say()` to post a visible message to the channel where the command was invoked. Unlike `respond()`, messages from `say()` are always visible to everyone and appear as normal bot messages (not ephemeral). [slack.dev/bolt-js/concepts/c - Network accessline 15
7. Use `say()` to post a visible message to the channel where the command was invoked. Unlike `respond()`, messages from `say()` are always visible to everyone and appear as normal bot messages (not ephemeral). [slack.dev/bolt-js/concepts/c - Network accessline 16
8. Parse the `command.text` string yourself for sub-commands or arguments. Bolt does not provide built-in argument parsing. Use `text.split(/\s+/)` or a command-parsing library for complex argument structures. [api.slack.com/interactivity/s - Network accessline 16
8. Parse the `command.text` string yourself for sub-commands or arguments. Bolt does not provide built-in argument parsing. Use `text.split(/\s+/)` or a command-parsing library for complex argument structures. [api.slack.com/interactivity/s - Network accessline 17
9. Slash commands require the `commands` scope in the bot's OAuth configuration. Each command must be registered in the Slack app dashboard under "Slash Commands" with a request URL pointing to your app's endpoint. [api.slack.com/interactiv - Network accessline 17
9. Slash commands require the `commands` scope in the bot's OAuth configuration. Each command must be registered in the Slack app dashboard under "Slash Commands" with a request URL pointing to your app's endpoint. [api.slack.com/interactiv - Network accessline 18
10. Commands invoked in DMs with the bot have `channel_id` set to the DM channel and `channel_name` set to `"directmessage"`. Always handle both channel and DM contexts in your command logic. [api.slack.com/interactivity/slash-commands](htt - Network accessline 18
10. Commands invoked in DMs with the bot have `channel_id` set to the DM channel and `channel_name` set to `"directmessage"`. Always handle both channel and DM contexts in your command logic. [api.slack.com/interactivity/slash-commands](htt - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted] - Network accessline 230
- https://api.slack.com/interactivity/slash-commands - Network accessline 230
- https://api.slack.com/interactivity/slash-commands - Network accessline 231
- https://api.slack.com/interactivity/slash-commands#creating_commands - Network accessline 231
- https://api.slack.com/interactivity/slash-commands#creating_commands - Network accessline 232
- https://api.slack.com/interactivity/slash-commands#responding_to_commands - Network accessline 232
- https://api.slack.com/interactivity/slash-commands#responding_to_commands - Network accessline 233
- https://api.slack.com/interactivity/responding - Network accessline 233
- https://api.slack.com/interactivity/responding - Network accessline 234
- https://api.slack.com/surfaces/modals#opening - Network accessline 234
- https://api.slack.com/surfaces/modals#opening - Network accessline 235
- https://slack.dev/bolt-js/concepts/commands - Network accessline 235
- https://slack.dev/bolt-js/concepts/commands - Network accessline 236
- https://slack.dev/bolt-js/concepts/acknowledge - Network accessline 236
- https://slack.dev/bolt-js/concepts/acknowledge - Network accessline 237
- https://github.com/slackapi/bolt-js - Network accessline 237
- https://github.com/slackapi/bolt-js
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/runtime.socket-mode-ts.md
- Network accessline 9
1. Enable Socket Mode by setting `socketMode: true` and providing `appToken` in the `App` constructor. The app token must be an **app-level token** (prefix `xapp-`) with the `connections:write` scope, not a bot token. [api.slack.com/apis/co - Network accessline 9
1. Enable Socket Mode by setting `socketMode: true` and providing `appToken` in the `App` constructor. The app token must be an **app-level token** (prefix `xapp-`) with the `connections:write` scope, not a bot token. [api.slack.com/apis/co - Network accessline 10
2. Socket Mode uses WebSocket connections instead of HTTP endpoints. No public URL, no `signingSecret`, and no request signature verification are needed. This makes it ideal for local development and firewall-restricted environments. [slack - Network accessline 10
2. Socket Mode uses WebSocket connections instead of HTTP endpoints. No public URL, no `signingSecret`, and no request signature verification are needed. This makes it ideal for local development and firewall-restricted environments. [slack - Network accessline 11
3. Install `@slack/socket-mode` as a dependency alongside `@slack/bolt`. Bolt's `SocketModeReceiver` wraps the `SocketModeClient` from this package. [github.com/slackapi/node-slack-sdk](https://github.com/slackapi/node-slack-sdk) - Network accessline 11
3. Install `@slack/socket-mode` as a dependency alongside `@slack/bolt`. Bolt's `SocketModeReceiver` wraps the `SocketModeClient` from this package. [github.com/slackapi/node-slack-sdk](https://github.com/slackapi/node-slack-sdk) - Network accessline 12
4. Call `await app.start()` to open the WebSocket connection. Unlike HTTP mode, `start()` returns an `AppsConnectionsOpenResponse` object, not an HTTP server. [slack.dev/bolt-js/concepts/socket-mode](https://slack.dev/bolt-js/concepts/socke - Network accessline 12
4. Call `await app.start()` to open the WebSocket connection. Unlike HTTP mode, `start()` returns an `AppsConnectionsOpenResponse` object, not an HTTP server. [slack.dev/bolt-js/concepts/socket-mode](https://slack.dev/bolt-js/concepts/socke - Network accessline 13
5. Auto-reconnect is enabled by default. The `SocketModeClient` handles connection drops, ping/pong heartbeats, and reconnection automatically. Override with `autoReconnectEnabled: false` only for testing. [github.com/slackapi/node-slack-sd - Network accessline 13
5. Auto-reconnect is enabled by default. The `SocketModeClient` handles connection drops, ping/pong heartbeats, and reconnection automatically. Override with `autoReconnectEnabled: false` only for testing. [github.com/slackapi/node-slack-sd - Network accessline 14
6. To add OAuth install routes or custom HTTP endpoints alongside Socket Mode, pass `customRoutes` to the `SocketModeReceiver`. This spins up an HTTP server on port 3000 (default) in addition to the WebSocket connection. [slack.dev/bolt-js/ - Network accessline 14
6. To add OAuth install routes or custom HTTP endpoints alongside Socket Mode, pass `customRoutes` to the `SocketModeReceiver`. This spins up an HTTP server on port 3000 (default) in addition to the WebSocket connection. [slack.dev/bolt-js/ - Network accessline 15
7. For multi-workspace apps using Socket Mode with OAuth, provide `clientId`, `clientSecret`, `stateSecret`, and `installationStore` in the receiver options. The receiver creates an HTTP server for OAuth flows while using WebSocket for even - Network accessline 15
7. For multi-workspace apps using Socket Mode with OAuth, provide `clientId`, `clientSecret`, `stateSecret`, and `installationStore` in the receiver options. The receiver creates an HTTP server for OAuth flows while using WebSocket for even - Network accessline 16
8. Use `processEventErrorHandler` on the receiver to control retry behavior. Return `true` to acknowledge the event (stops Slack retries). Return `false` to let Slack retry. `AuthorizationError` returns `true` by default (retrying won't fix - Network accessline 16
8. Use `processEventErrorHandler` on the receiver to control retry behavior. Return `true` to acknowledge the event (stops Slack retries). Return `false` to let Slack retry. `AuthorizationError` returns `true` by default (retrying won't fix - Network accessline 17
9. Access the underlying `SocketModeClient` via `receiver.client` to listen for low-level events like `connected`, `connecting`, `disconnected`, and `unable_to_socket_mode_start`. [github.com/slackapi/node-slack-sdk/tree/main/packages/socke - Network accessline 17
9. Access the underlying `SocketModeClient` via `receiver.client` to listen for low-level events like `connected`, `connecting`, `disconnected`, and `unable_to_socket_mode_start`. [github.com/slackapi/node-slack-sdk/tree/main/packages/socke - Network accessline 18
10. Generate the app-level token in the Slack app dashboard under **Settings → Basic Information → App-Level Tokens**. Create a token with the `connections:write` scope. Store it as `SLACK_APP_TOKEN` in your environment. [api.slack.com/apis - Network accessline 18
10. Generate the app-level token in the Slack app dashboard under **Settings → Basic Information → App-Level Tokens**. Create a token with the `connections:write` scope. Store it as `SLACK_APP_TOKEN` in your environment. [api.slack.com/apis - Network accessline 19
11. Socket Mode supports all Bolt listener types — `app.message()`, `app.command()`, `app.action()`, `app.shortcut()`, `app.view()`, `app.event()`, and `app.options()` — with no code changes versus HTTP mode. The transport is transparent to - Network accessline 19
11. Socket Mode supports all Bolt listener types — `app.message()`, `app.command()`, `app.action()`, `app.shortcut()`, `app.view()`, `app.event()`, and `app.options()` — with no code changes versus HTTP mode. The transport is transparent to - Network accessline 20
12. Do not set `signingSecret` when using Socket Mode with `socketMode: true`. Bolt will throw if both are set with conflicting receiver configurations. If you need to switch between Socket Mode (dev) and HTTP (prod), use environment variab - Network accessline 20
12. Do not set `signingSecret` when using Socket Mode with `socketMode: true`. Bolt will throw if both are set with conflicting receiver configurations. If you need to switch between Socket Mode (dev) and HTTP (prod), use environment variab - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 84
[Credential-related source omitted] - Access to secretsline 84
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 113
[Credential-related source omitted] - Access to secretsline 113
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Network accessline 152
- https://api.slack.com/apis/connections/socket - Network accessline 152
- https://api.slack.com/apis/connections/socket - Network accessline 153
- https://slack.dev/bolt-js/concepts/socket-mode - Network accessline 153
- https://slack.dev/bolt-js/concepts/socket-mode - Network accessline 154
- https://slack.dev/bolt-js/concepts/custom-routes - https://github.com/slackapi/bolt-js/blob/main/src/receivers/SocketModeReceiver.ts - https://github.com/slackapi/node-slack-sdk/tree/main/packages/socket-mode - Network accessline 154
- https://slack.dev/bolt-js/concepts/custom-routes - https://github.com/slackapi/bolt-js/blob/main/src/receivers/SocketModeReceiver.ts - https://github.com/slackapi/node-slack-sdk/tree/main/packages/socket-mode - Network accessline 155
- https://github.com/slackapi/bolt-js/blob/main/src/receivers/SocketModeReceiver.ts - Network accessline 155
- https://github.com/slackapi/bolt-js/blob/main/src/receivers/SocketModeReceiver.ts - Network accessline 156
- https://github.com/slackapi/node-slack-sdk/tree/main/packages/socket-mode - Network accessline 156
- https://github.com/slackapi/node-slack-sdk/tree/main/packages/socket-mode
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/ui.block-kit-ts.md
- Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Network accessline 233
- https://api.slack.com/reference/block-kit/blocks - Network accessline 233
- https://api.slack.com/reference/block-kit/blocks - Network accessline 234
- https://api.slack.com/reference/block-kit/block-elements - Network accessline 234
- https://api.slack.com/reference/block-kit/block-elements - Network accessline 235
- https://api.slack.com/reference/block-kit/composition-objects - Network accessline 235
- https://api.slack.com/reference/block-kit/composition-objects - Network accessline 236
- https://api.slack.com/surfaces/modals - Network accessline 236
- https://api.slack.com/surfaces/modals - Network accessline 237
- https://api.slack.com/reference/interaction-payloads/views - Network accessline 237
- https://api.slack.com/reference/interaction-payloads/views - Network accessline 238
- https://api.slack.com/tools/block-kit-builder - Network accessline 238
- https://api.slack.com/tools/block-kit-builder - Network accessline 239
- https://api.slack.com/methods/chat.postMessage - Network accessline 239
- https://api.slack.com/methods/chat.postMessage - Network accessline 240
- https://api.slack.com/methods/chat.update - Network accessline 240
- https://api.slack.com/methods/chat.update - Network accessline 241
- https://api.slack.com/methods/views.open - Network accessline 241
- https://api.slack.com/methods/views.open - Network accessline 242
- https://slack.dev/bolt-js/concepts/actions - Network accessline 242
- https://slack.dev/bolt-js/concepts/actions - Network accessline 243
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 243
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 244
- https://github.com/slackapi/bolt-js - Network accessline 244
- https://github.com/slackapi/bolt-js
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/ui.modals-lifecycle-ts.md
- Network accessline 9
1. Open a modal with `client.views.open({ trigger_id, view })`. A `trigger_id` is required and comes from commands, shortcuts, or interactive actions. It expires in ~3 seconds, so call `views.open` immediately after `ack()`. [api.slack.com/ - Network accessline 9
1. Open a modal with `client.views.open({ trigger_id, view })`. A `trigger_id` is required and comes from commands, shortcuts, or interactive actions. It expires in ~3 seconds, so call `views.open` immediately after `ack()`. [api.slack.com/ - Network accessline 10
2. The `view` object requires `type: 'modal'`, `title` (plain_text, max 24 chars), and `blocks`. Optionally include `submit` (button label), `close` (button label), `callback_id` (for submission handling), and `private_metadata` (max 3000 c - Network accessline 10
2. The `view` object requires `type: 'modal'`, `title` (plain_text, max 24 chars), and `blocks`. Optionally include `submit` (button label), `close` (button label), `callback_id` (for submission handling), and `private_metadata` (max 3000 c - Network accessline 11
3. Register submission handlers with `app.view('callback_id', handler)`. The default event type is `view_submission`. The handler receives `view` (the full view state), `body` (the submission event), and `ack`. [slack.dev/bolt-js/concepts/v - Network accessline 11
3. Register submission handlers with `app.view('callback_id', handler)`. The default event type is `view_submission`. The handler receives `view` (the full view state), `body` (the submission event), and `ack`. [slack.dev/bolt-js/concepts/v - Network accessline 12
4. Access input values through `view.state.values[blockId][actionId]`. Each input element's value depends on its type: `.value` for text inputs, `.selected_option` for selects, `.selected_date` for date pickers, `.selected_users` for multi- - Network accessline 12
4. Access input values through `view.state.values[blockId][actionId]`. Each input element's value depends on its type: `.value` for text inputs, `.selected_option` for selects, `.selected_date` for date pickers, `.selected_users` for multi- - Network accessline 13
5. Validate inputs in the submission handler by returning errors from `ack()`: `await ack({ response_action: 'errors', errors: { block_id: 'Error message' } })`. This keeps the modal open and displays inline errors under the specified block - Network accessline 13
5. Validate inputs in the submission handler by returning errors from `ack()`: `await ack({ response_action: 'errors', errors: { block_id: 'Error message' } })`. This keeps the modal open and displays inline errors under the specified block - Network accessline 14
6. Four response actions are available in `ack()` for `view_submission`: `update` (replace current view), `push` (add new view to stack), `clear` (close all views in stack), and `errors` (show validation errors). Calling `ack()` with no arg - Network accessline 14
6. Four response actions are available in `ack()` for `view_submission`: `update` (replace current view), `push` (add new view to stack), `clear` (close all views in stack), and `errors` (show validation errors). Calling `ack()` with no arg - Network accessline 15
7. Update a modal mid-interaction with `client.views.update({ view_id, view })`. Use `body.view.id` (from an action inside the modal) as the `view_id`. Optionally pass `hash` (from `body.view.hash`) to prevent race conditions — the update f - Network accessline 15
7. Update a modal mid-interaction with `client.views.update({ view_id, view })`. Use `body.view.id` (from an action inside the modal) as the `view_id`. Optionally pass `hash` (from `body.view.hash`) to prevent race conditions — the update f - Network accessline 16
8. Push a new modal onto the stack with `client.views.push({ trigger_id, view })`. Up to 3 modals can be stacked. The `trigger_id` must come from an interaction inside the current modal (e.g., a button action). [api.slack.com/methods/views. - Network accessline 16
8. Push a new modal onto the stack with `client.views.push({ trigger_id, view })`. Up to 3 modals can be stacked. The `trigger_id` must come from an interaction inside the current modal (e.g., a button action). [api.slack.com/methods/views. - Network accessline 17
9. Handle `view_closed` events by registering `app.view({ callback_id: 'id', type: 'view_closed' }, handler)`. The payload includes `is_cleared` (true if the user clicked "X", false if the modal was programmatically cleared). You must set ` - Network accessline 17
9. Handle `view_closed` events by registering `app.view({ callback_id: 'id', type: 'view_closed' }, handler)`. The payload includes `is_cleared` (true if the user clicked "X", false if the modal was programmatically cleared). You must set ` - Network accessline 18
10. Pass context between the trigger (command/shortcut/action) and the submission handler using `private_metadata`. Serialize the channel ID, user context, or any data needed by the submission handler as a JSON string. [api.slack.com/surfac - Network accessline 18
10. Pass context between the trigger (command/shortcut/action) and the submission handler using `private_metadata`. Serialize the channel ID, user context, or any data needed by the submission handler as a JSON string. [api.slack.com/surfac - Network accessline 19
11. Use `view.response_urls` in the submission handler to post messages back to channels when the view contains inputs with `response_url_enabled: true` (only available on `conversations_select` and `channels_select` inputs). [api.slack.com - Network accessline 19
11. Use `view.response_urls` in the submission handler to post messages back to channels when the view contains inputs with `response_url_enabled: true` (only available on `conversations_select` and `channels_select` inputs). [api.slack.com - Network accessline 20
12. Modal `title` is limited to 24 characters, `submit` and `close` labels to 24 characters, and `private_metadata` to 3000 characters. Exceeding these limits causes the `views.open` or `views.update` call to fail silently or return an erro - Network accessline 20
12. Modal `title` is limited to 24 characters, `submit` and `close` labels to 24 characters, and `private_metadata` to 3000 characters. Exceeding these limits causes the `views.open` or `views.update` call to fail silently or return an erro - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted] - Network accessline 229
- https://api.slack.com/surfaces/modals - Network accessline 229
- https://api.slack.com/surfaces/modals - Network accessline 230
- https://api.slack.com/surfaces/modals#opening - Network accessline 230
- https://api.slack.com/surfaces/modals#opening - Network accessline 231
- https://api.slack.com/surfaces/modals#updating - Network accessline 231
- https://api.slack.com/surfaces/modals#updating - Network accessline 232
- https://api.slack.com/surfaces/modals#response_actions - Network accessline 232
- https://api.slack.com/surfaces/modals#response_actions - Network accessline 233
- https://api.slack.com/surfaces/modals#validation - Network accessline 233
- https://api.slack.com/surfaces/modals#validation - Network accessline 234
- https://api.slack.com/methods/views.open - Network accessline 234
- https://api.slack.com/methods/views.open - Network accessline 235
- https://api.slack.com/methods/views.update - Network accessline 235
- https://api.slack.com/methods/views.update - Network accessline 236
- https://api.slack.com/methods/views.push - Network accessline 236
- https://api.slack.com/methods/views.push - Network accessline 237
- https://api.slack.com/reference/surfaces/views - Network accessline 237
- https://api.slack.com/reference/surfaces/views - Network accessline 238
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 238
- https://slack.dev/bolt-js/concepts/view-submissions - Network accessline 239
- https://github.com/slackapi/bolt-js/blob/main/src/types/view/index.ts - Network accessline 239
- https://github.com/slackapi/bolt-js/blob/main/src/types/view/index.ts
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/web-api-proactive-ts.md
- Network accessline 9
1. Access the Web API client via `client` in any listener context or via `app.client` for proactive messaging outside of handlers. The `client` in listeners is pre-configured with the correct token for the workspace; `app.client` uses the d - Network accessline 9
1. Access the Web API client via `client` in any listener context or via `app.client` for proactive messaging outside of handlers. The `client` in listeners is pre-configured with the correct token for the workspace; `app.client` uses the d - Network accessline 10
2. Use `client.chat.postMessage({ channel, text })` to send messages to any channel or DM. The `channel` parameter accepts a channel ID, DM channel ID, or user ID (to open/reuse a DM). Always include `text` as a fallback even when using `bl - Network accessline 10
2. Use `client.chat.postMessage({ channel, text })` to send messages to any channel or DM. The `channel` parameter accepts a channel ID, DM channel ID, or user ID (to open/reuse a DM). Always include `text` as a fallback even when using `bl - Network accessline 11
3. Use `client.chat.update({ channel, ts, text })` to edit an existing message. Both `channel` and `ts` (the message timestamp) are required to identify the message. Only messages posted by the bot can be updated. [api.slack.com/methods/cha - Network accessline 11
3. Use `client.chat.update({ channel, ts, text })` to edit an existing message. Both `channel` and `ts` (the message timestamp) are required to identify the message. Only messages posted by the bot can be updated. [api.slack.com/methods/cha - Network accessline 12
4. Use `client.chat.delete({ channel, ts })` to delete a bot-posted message. For user messages, use `chat.delete` with a user token that has `chat:write` scope. [api.slack.com/methods/chat.delete](https://api.slack.com/methods/chat.delete) - Network accessline 12
4. Use `client.chat.delete({ channel, ts })` to delete a bot-posted message. For user messages, use `chat.delete` with a user token that has `chat:write` scope. [api.slack.com/methods/chat.delete](https://api.slack.com/methods/chat.delete) - Network accessline 13
5. Post threaded replies by setting `thread_ts` to the parent message's `ts`. Set `reply_broadcast: true` to also post the reply to the channel as a "replied to a thread" message. [api.slack.com/methods/chat.postMessage](https://api.slack.c - Network accessline 13
5. Post threaded replies by setting `thread_ts` to the parent message's `ts`. Set `reply_broadcast: true` to also post the reply to the channel as a "replied to a thread" message. [api.slack.com/methods/chat.postMessage](https://api.slack.c - Network accessline 14
6. Send ephemeral messages (visible only to one user) with `client.chat.postEphemeral({ channel, user, text })`. Ephemeral messages cannot be updated or deleted — they disappear when the user reloads. [api.slack.com/methods/chat.postEphemer - Network accessline 14
6. Send ephemeral messages (visible only to one user) with `client.chat.postEphemeral({ channel, user, text })`. Ephemeral messages cannot be updated or deleted — they disappear when the user reloads. [api.slack.com/methods/chat.postEphemer - Network accessline 15
7. Schedule future messages with `client.chat.scheduleMessage({ channel, text, post_at })`. The `post_at` parameter is a Unix timestamp. Scheduled messages can be cancelled with `client.chat.deleteScheduledMessage()` before they post. [api. - Network accessline 15
7. Schedule future messages with `client.chat.scheduleMessage({ channel, text, post_at })`. The `post_at` parameter is a Unix timestamp. Scheduled messages can be cancelled with `client.chat.deleteScheduledMessage()` before they post. [api. - Network accessline 16
8. Look up users with `client.users.info({ user })` or list workspace members with `client.users.list()`. For email-to-user mapping, use `client.users.lookupByEmail({ email })`. These require the `users:read` and `users:read.email` scopes r - Network accessline 16
8. Look up users with `client.users.info({ user })` or list workspace members with `client.users.list()`. For email-to-user mapping, use `client.users.lookupByEmail({ email })`. These require the `users:read` and `users:read.email` scopes r - Network accessline 17
9. Manage conversations with `client.conversations.list()`, `client.conversations.info({ channel })`, `client.conversations.members({ channel })`, and `client.conversations.history({ channel })`. Use cursor-based pagination for large result - Network accessline 17
9. Manage conversations with `client.conversations.list()`, `client.conversations.info({ channel })`, `client.conversations.members({ channel })`, and `client.conversations.history({ channel })`. Use cursor-based pagination for large result - Network accessline 18
10. Upload files with `client.filesUploadV2({ channel_id, file, filename })`. The v2 method is required — the original `files.upload` is deprecated. For multiple files, pass an array to `file_uploads`. Requires `files:write` scope. [api.sla - Network accessline 18
10. Upload files with `client.filesUploadV2({ channel_id, file, filename })`. The v2 method is required — the original `files.upload` is deprecated. For multiple files, pass an array to `file_uploads`. Requires `files:write` scope. [api.sla - Network accessline 19
11. For proactive messaging (no incoming event), store the target `channel` ID and bot `token` during installation or a prior interaction. Use `app.client` with an explicit `token` parameter since there is no listener context to infer the w - Network accessline 19
11. For proactive messaging (no incoming event), store the target `channel` ID and bot `token` during installation or a prior interaction. Use `app.client` with an explicit `token` parameter since there is no listener context to infer the w - Network accessline 20
12. Handle rate limiting by catching errors with `code === 'slack_webapi_platform_error'` and checking for `retry_after` in the response headers. The `@slack/web-api` client has built-in retry logic with configurable `retryConfig`. [api.sla - Network accessline 20
12. Handle rate limiting by catching errors with `code === 'slack_webapi_platform_error'` and checking for `retry_after` in the response headers. The `@slack/web-api` client has built-in retry logic with configurable `retryConfig`. [api.sla - Network accessline 21
13. Distinguish `say()`, `respond()`, and `client` for the right messaging pattern: `say()` posts to the event's channel (requires channel context); `respond()` uses the `response_url` (commands, actions, shortcuts — ephemeral by default, e - Network accessline 21
13. Distinguish `say()`, `respond()`, and `client` for the right messaging pattern: `say()` posts to the event's channel (requires channel context); `respond()` uses the `response_url` (commands, actions, shortcuts — ephemeral by default, e - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 145
[Credential-related source omitted] - Access to secretsline 145
[Credential-related source omitted] - Access to secretsline 146
[Credential-related source omitted] - Access to secretsline 146
[Credential-related source omitted] - Access to secretsline 155
[Credential-related source omitted] - Access to secretsline 155
[Credential-related source omitted] - Network accessline 182
- https://api.slack.com/methods/chat.postMessage - Network accessline 182
- https://api.slack.com/methods/chat.postMessage - Network accessline 183
- https://api.slack.com/methods/chat.update - Network accessline 183
- https://api.slack.com/methods/chat.update - Network accessline 184
- https://api.slack.com/methods/chat.delete - Network accessline 184
- https://api.slack.com/methods/chat.delete - Network accessline 185
- https://api.slack.com/methods/chat.postEphemeral - Network accessline 185
- https://api.slack.com/methods/chat.postEphemeral - Network accessline 186
- https://api.slack.com/methods/chat.scheduleMessage - Network accessline 186
- https://api.slack.com/methods/chat.scheduleMessage - Network accessline 187
- https://api.slack.com/methods/users.info - Network accessline 187
- https://api.slack.com/methods/users.info - Network accessline 188
- https://api.slack.com/methods/users.lookupByEmail - Network accessline 188
- https://api.slack.com/methods/users.lookupByEmail - Network accessline 189
- https://api.slack.com/methods/conversations.list - Network accessline 189
- https://api.slack.com/methods/conversations.list - Network accessline 190
- https://api.slack.com/methods/files.uploadV2 - Network accessline 190
- https://api.slack.com/methods/files.uploadV2 - Network accessline 191
- https://api.slack.com/docs/rate-limits - Network accessline 191
- https://api.slack.com/docs/rate-limits - Network accessline 192
- https://slack.dev/bolt-js/concepts/web-api - Network accessline 192
- https://slack.dev/bolt-js/concepts/web-api
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/slack/workflow.slack-automations-ts.md
- Network accessline 9
1. **Slack's next-gen platform is function-based.** Workflows are composed of steps, and each step is a function. Functions can be built-in (send message, create channel) or custom (developer-defined). Custom functions are defined in the ap - Network accessline 9
1. **Slack's next-gen platform is function-based.** Workflows are composed of steps, and each step is a function. Functions can be built-in (send message, create channel) or custom (developer-defined). Custom functions are defined in the ap - Network accessline 10
2. **Workflows are defined declaratively in `manifest.ts`.** Use `DefineWorkflow` to compose steps from functions. Each step specifies inputs (from trigger outputs, previous step outputs, or literals) and produces outputs for downstream ste - Network accessline 10
2. **Workflows are defined declaratively in `manifest.ts`.** Use `DefineWorkflow` to compose steps from functions. Each step specifies inputs (from trigger outputs, previous step outputs, or literals) and produces outputs for downstream ste - Network accessline 11
3. **Triggers start workflows.** Four trigger types: (a) **Link triggers** — URL click, (b) **Shortcut triggers** — from channel compose menu, (c) **Event triggers** — fire on Slack events (message posted, reaction added, member joined), (d - Network accessline 11
3. **Triggers start workflows.** Four trigger types: (a) **Link triggers** — URL click, (b) **Shortcut triggers** — from channel compose menu, (c) **Event triggers** — fire on Slack events (message posted, reaction added, member joined), (d - Network accessline 12
4. **Custom functions run on Slack's hosted infrastructure (Deno).** The next-gen platform runs functions on Slack's infrastructure using Deno. No external hosting needed. Functions receive `inputs` and return `outputs` defined by their sch - Network accessline 12
4. **Custom functions run on Slack's hosted infrastructure (Deno).** The next-gen platform runs functions on Slack's infrastructure using Deno. No external hosting needed. Functions receive `inputs` and return `outputs` defined by their sch - Network accessline 13
5. **Datastores provide built-in persistence.** `DefineDatastore` creates a schematized key-value store on Slack's platform. Functions can CRUD datastore records. No external database needed for simple workflows. Limited to 50,000 records p - Network accessline 13
5. **Datastores provide built-in persistence.** `DefineDatastore` creates a schematized key-value store on Slack's platform. Functions can CRUD datastore records. No external database needed for simple workflows. Limited to 50,000 records p - Network accessline 167
- https://api.slack.com/automation/functions - Network accessline 167
- https://api.slack.com/automation/functions - Network accessline 168
- https://api.slack.com/automation/workflows - Network accessline 168
- https://api.slack.com/automation/workflows - Network accessline 169
- https://api.slack.com/automation/triggers - Network accessline 169
- https://api.slack.com/automation/triggers - Network accessline 170
- https://api.slack.com/automation/datastores - Network accessline 170
- https://api.slack.com/automation/datastores - Network accessline 171
- https://api.slack.com/automation/functions/custom - Network accessline 171
- https://api.slack.com/automation/functions/custom
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/a2a.client-basics-ts.md
- Network accessline 9
1. Create an `A2AClientPlugin` instance and pass it as a ChatPrompt plugin in the second argument array: `new ChatPrompt({ ... }, [new A2AClientPlugin()])`. The plugin registers itself under the name `'a2a'`. [github.com/microsoft/teams.ts] - Network accessline 9
1. Create an `A2AClientPlugin` instance and pass it as a ChatPrompt plugin in the second argument array: `new ChatPrompt({ ... }, [new A2AClientPlugin()])`. The plugin registers itself under the name `'a2a'`. [github.com/microsoft/teams.ts] - Network accessline 10
2. Connect to remote A2A agents using `.usePlugin('a2a', { key, cardUrl })` chained on the ChatPrompt. The `key` is a unique identifier for the agent and `cardUrl` is the URL to its agent card JSON. [github.com/microsoft/teams.ts](https://g - Network accessline 10
2. Connect to remote A2A agents using `.usePlugin('a2a', { key, cardUrl })` chained on the ChatPrompt. The `key` is a unique identifier for the agent and `cardUrl` is the URL to its agent card JSON. [github.com/microsoft/teams.ts](https://g - Network accessline 11
3. Connect to multiple agents by chaining multiple `.usePlugin('a2a', { key, cardUrl })` calls. Each agent's skills are registered as callable functions, and the LLM decides which agent to delegate to based on skill descriptions. [github.co - Network accessline 11
3. Connect to multiple agents by chaining multiple `.usePlugin('a2a', { key, cardUrl })` calls. Each agent's skills are registered as callable functions, and the LLM decides which agent to delegate to based on skill descriptions. [github.co - Network accessline 12
4. The `key` parameter must be unique across all connected agents. It is used internally to identify the agent when the LLM invokes delegation functions. Use short, descriptive keys (e.g., `'weather'`, `'calendar'`). [github.com/microsoft/t - Network accessline 12
4. The `key` parameter must be unique across all connected agents. It is used internally to identify the agent when the LLM invokes delegation functions. Use short, descriptive keys (e.g., `'weather'`, `'calendar'`). [github.com/microsoft/t - Network accessline 13
5. The `cardUrl` must point to the agent's well-known agent card endpoint (e.g., `http://localhost:4000/a2a/.well-known/agent-card.json`). The plugin fetches the card at connection time to read the agent's skills and capabilities. [google.g - Network accessline 13
5. The `cardUrl` must point to the agent's well-known agent card endpoint (e.g., `http://localhost:4000/a2a/.well-known/agent-card.json`). The plugin fetches the card at connection time to read the agent's skills and capabilities. [google.g - Network accessline 14
6. The LLM automatically delegates to connected agents as if they were function calls. No explicit delegation code is needed -- the agent's skills appear as functions the LLM can invoke during `prompt.send()`. [github.com/microsoft/teams.ts - Network accessline 14
6. The LLM automatically delegates to connected agents as if they were function calls. No explicit delegation code is needed -- the agent's skills appear as functions the LLM can invoke during `prompt.send()`. [github.com/microsoft/teams.ts - Network accessline 15
7. Install `@microsoft/teams.a2a` as a dependency. The A2A client and server plugins are both in this package. Also install `@microsoft/teams.ai` and `@microsoft/teams.openai` for the ChatPrompt and model. [github.com/microsoft/teams.ts](ht - Network accessline 15
7. Install `@microsoft/teams.a2a` as a dependency. The A2A client and server plugins are both in this package. Also install `@microsoft/teams.ai` and `@microsoft/teams.openai` for the ChatPrompt and model. [github.com/microsoft/teams.ts](ht - Network accessline 16
8. A2AClientPlugin is a ChatPrompt plugin, not an App plugin. Pass it to `new ChatPrompt()`, not to `new App({ plugins: [...] })`. Adding it to the App has no effect. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 16
8. A2AClientPlugin is a ChatPrompt plugin, not an App plugin. Pass it to `new ChatPrompt()`, not to `new App({ plugins: [...] })`. Adding it to the App has no effect. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 17
9. Agent cards are fetched once at connection time. If a remote agent's skills change, the client bot must be restarted or the plugin must be re-configured to pick up the new skills. [github.com/microsoft/teams.ts](https://github.com/micros - Network accessline 17
9. Agent cards are fetched once at connection time. If a remote agent's skills change, the client bot must be restarted or the plugin must be re-configured to pick up the new skills. [github.com/microsoft/teams.ts](https://github.com/micros - Network accessline 18
10. Handle `prompt.send()` failures gracefully. If a remote agent is unreachable or returns an error, the LLM receives an error result for that function call. Wrap `prompt.send()` in try/catch and inform the user. [github.com/microsoft/team - Network accessline 18
10. Handle `prompt.send()` failures gracefully. If a remote agent is unreachable or returns an error, the LLM receives an error result for that function call. Wrap `prompt.send()` in try/catch and inform the user. [github.com/microsoft/team - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 45
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Network accessline 45
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Network accessline 46
key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', }); - Network accessline 46
key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', }); - Network accessline 47
cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Network accessline 47
cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Network accessline 94
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 94
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 95
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }) - Network accessline 95
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }) - Network accessline 96
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 96
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 98
.usePlugin('a2a', { key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 98
.usePlugin('a2a', { key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 99
key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', }) - Network accessline 99
key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', }) - Network accessline 100
cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 100
cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 102
.usePlugin('a2a', { key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 102
.usePlugin('a2a', { key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 103
key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', }); - Network accessline 103
key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', }); - Network accessline 104
cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 104
cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Access to secretsline 136
[Credential-related source omitted] - Access to secretsline 136
[Credential-related source omitted] - Network accessline 148
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Network accessline 148
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Network accessline 149
key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', }) - Network accessline 149
key: 'weather', cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', }) - Network accessline 150
cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Network accessline 150
cardUrl: 'http://localhost:4000/a2a/.well-known/agent-card.json', - Dangerous shell operationline 168
return String(eval(expression)); // Use safe parser in production - Dangerous shell operationline 168
return String(eval(expression)); // Use safe parser in production - Network accessline 187
- [A2A Protocol Specification](https://google.github.io/A2A/) - Network accessline 187
- [A2A Protocol Specification](https://google.github.io/A2A/) - Network accessline 188
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 188
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 189
- [@microsoft/teams.a2a npm](https://www.npmjs.com/package/@microsoft/teams.a2a) - Network accessline 189
- [@microsoft/teams.a2a npm](https://www.npmjs.com/package/@microsoft/teams.a2a) - Network accessline 190
- [A2A Agent Card documentation](https://google.github.io/A2A/#/documentation?id=agent-card) - Network accessline 190
- [A2A Agent Card documentation](https://google.github.io/A2A/#/documentation?id=agent-card)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/a2a.orchestrator-patterns-ts.md
- Network accessline 9
1. The orchestrator pattern uses one primary bot with `A2AClientPlugin` that delegates to multiple specialized A2A agents. The orchestrator's instructions guide the LLM on when and how to delegate. [github.com/microsoft/teams.ts](https://gi - Network accessline 9
1. The orchestrator pattern uses one primary bot with `A2AClientPlugin` that delegates to multiple specialized A2A agents. The orchestrator's instructions guide the LLM on when and how to delegate. [github.com/microsoft/teams.ts](https://gi - Network accessline 10
2. Customize delegation behavior by passing options to the `A2AClientPlugin` constructor: `buildFunctionMetadata`, `buildMessageForAgent`, and `buildMessageFromAgentResponse`. These hooks control how agents appear as functions and how messa - Network accessline 10
2. Customize delegation behavior by passing options to the `A2AClientPlugin` constructor: `buildFunctionMetadata`, `buildMessageForAgent`, and `buildMessageFromAgentResponse`. These hooks control how agents appear as functions and how messa - Network accessline 11
3. Use `buildFunctionMetadata(card)` to customize how each agent appears to the LLM. Return `{ name, description }` to control the function name and description the LLM sees. This allows consistent naming conventions across agents. [github. - Network accessline 11
3. Use `buildFunctionMetadata(card)` to customize how each agent appears to the LLM. Return `{ name, description }` to control the function name and description the LLM sees. This allows consistent naming conventions across agents. [github. - Network accessline 12
4. Use `buildMessageForAgent(card, input)` to transform the outgoing message before it reaches the remote agent. This lets you add context, reformat the request, or inject routing metadata. [github.com/microsoft/teams.ts](https://github.com - Network accessline 12
4. Use `buildMessageForAgent(card, input)` to transform the outgoing message before it reaches the remote agent. This lets you add context, reformat the request, or inject routing metadata. [github.com/microsoft/teams.ts](https://github.com - Network accessline 13
5. Use `buildMessageFromAgentResponse(card, response)` to transform the remote agent's response before returning it to the LLM. This lets you format, summarize, or annotate responses. [github.com/microsoft/teams.ts](https://github.com/micro - Network accessline 13
5. Use `buildMessageFromAgentResponse(card, response)` to transform the remote agent's response before returning it to the LLM. This lets you format, summarize, or annotate responses. [github.com/microsoft/teams.ts](https://github.com/micro - Network accessline 14
6. Write explicit orchestrator instructions that list available agents by name and describe their capabilities. The LLM uses these instructions plus the agent function descriptions to decide delegation. [github.com/microsoft/teams.ts](https - Network accessline 14
6. Write explicit orchestrator instructions that list available agents by name and describe their capabilities. The LLM uses these instructions plus the agent function descriptions to decide delegation. [github.com/microsoft/teams.ts](https - Network accessline 15
7. Combine A2A agents with MCP tools in the same ChatPrompt. Use `A2AClientPlugin` for agent delegation and `McpClientPlugin` for tool invocation. The LLM sees both as callable functions. [github.com/microsoft/teams.ts](https://github.com/m - Network accessline 15
7. Combine A2A agents with MCP tools in the same ChatPrompt. Use `A2AClientPlugin` for agent delegation and `McpClientPlugin` for tool invocation. The LLM sees both as callable functions. [github.com/microsoft/teams.ts](https://github.com/m - Network accessline 16
8. Prevent infinite delegation loops by designing clear skill boundaries between agents. An orchestrator should not delegate to an agent that delegates back to the orchestrator. Keep delegation unidirectional. [google.github.io/A2A -- Best - Network accessline 16
8. Prevent infinite delegation loops by designing clear skill boundaries between agents. An orchestrator should not delegate to an agent that delegates back to the orchestrator. Keep delegation unidirectional. [google.github.io/A2A -- Best - Network accessline 17
9. Add fallback handling in orchestrator instructions: if no agent matches the user's request, the orchestrator should answer directly or inform the user that the request cannot be handled. [github.com/microsoft/teams.ts](https://github.com - Network accessline 17
9. Add fallback handling in orchestrator instructions: if no agent matches the user's request, the orchestrator should answer directly or inform the user that the request cannot be handled. [github.com/microsoft/teams.ts](https://github.com - Network accessline 18
10. Test multi-agent flows end-to-end. Start all agent processes, verify agent card URLs are reachable, and test delegation with representative user queries for each agent's skill set. [github.com/microsoft/teams.ts](https://github.com/micr - Network accessline 18
10. Test multi-agent flows end-to-end. Start all agent processes, verify agent card URLs are reachable, and test delegation with representative user queries for each agent's skill set. [github.com/microsoft/teams.ts](https://github.com/micr - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 72
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 72
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 73
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }) - Network accessline 73
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }) - Network accessline 74
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 74
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 76
.usePlugin('a2a', { key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 76
.usePlugin('a2a', { key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 77
key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', }) - Network accessline 77
key: 'calendar', cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', }) - Network accessline 78
cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 78
cardUrl: 'http://calendar-agent:4001/a2a/.well-known/agent-card.json', - Network accessline 80
.usePlugin('a2a', { key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 80
.usePlugin('a2a', { key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 81
key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', }); - Network accessline 81
key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', }); - Network accessline 82
cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 82
cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 139
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 139
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 140
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }) - Network accessline 140
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }) - Network accessline 141
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 141
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 143
.usePlugin('a2a', { key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 143
.usePlugin('a2a', { key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 144
key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', }) - Network accessline 144
key: 'it-support', cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', }) - Network accessline 145
cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 145
cardUrl: 'http://it-agent:4002/a2a/.well-known/agent-card.json', - Network accessline 147
// MCP tools for data access .usePlugin('mcpClient', { url: 'http://localhost:5000/mcp', - Network accessline 147
// MCP tools for data access .usePlugin('mcpClient', { url: 'http://localhost:5000/mcp', - Network accessline 148
.usePlugin('mcpClient', { url: 'http://localhost:5000/mcp', }) - Network accessline 148
.usePlugin('mcpClient', { url: 'http://localhost:5000/mcp', }) - Network accessline 149
url: 'http://localhost:5000/mcp', - Network accessline 149
url: 'http://localhost:5000/mcp', - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Network accessline 197
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 197
.usePlugin('a2a', { key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 198
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }); - Network accessline 198
key: 'weather', cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', }); - Network accessline 199
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 199
cardUrl: 'http://weather-agent:4000/a2a/.well-known/agent-card.json', - Network accessline 204
name: 'Coordinator Agent', description: 'A coordinator that routes requests to specialized agents', url: 'http://localhost:3978/a2a', - Network accessline 204
name: 'Coordinator Agent', description: 'A coordinator that routes requests to specialized agents', url: 'http://localhost:3978/a2a', - Network accessline 205
description: 'A coordinator that routes requests to specialized agents', url: 'http://localhost:3978/a2a', version: '1.0.0', - Network accessline 205
description: 'A coordinator that routes requests to specialized agents', url: 'http://localhost:3978/a2a', version: '1.0.0', - Network accessline 206
url: 'http://localhost:3978/a2a', - Network accessline 206
url: 'http://localhost:3978/a2a', - Network accessline 265
- [A2A Protocol Specification](https://google.github.io/A2A/) - Network accessline 265
- [A2A Protocol Specification](https://google.github.io/A2A/) - Network accessline 266
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 266
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 267
- [@microsoft/teams.a2a npm](https://www.npmjs.com/package/@microsoft/teams.a2a) - Network accessline 267
- [@microsoft/teams.a2a npm](https://www.npmjs.com/package/@microsoft/teams.a2a) - Network accessline 268
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction) - Network accessline 268
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/a2a.server-basics-ts.md
- Network accessline 9
1. Create an `A2APlugin` with `new A2APlugin({ agentCard })` where `agentCard` is an `AgentCard` object describing your agent's identity and capabilities. The plugin registers the A2A HTTP endpoint automatically. [github.com/microsoft/teams - Network accessline 9
1. Create an `A2APlugin` with `new A2APlugin({ agentCard })` where `agentCard` is an `AgentCard` object describing your agent's identity and capabilities. The plugin registers the A2A HTTP endpoint automatically. [github.com/microsoft/teams - Network accessline 10
2. The `AgentCard` must include these required fields: `name`, `description`, `url`, `version`, `protocolVersion`, `capabilities`, and `skills`. The `url` must match the A2A endpoint (e.g., `http://localhost:3978/a2a`). [google.github.io/A2 - Network accessline 10
2. The `AgentCard` must include these required fields: `name`, `description`, `url`, `version`, `protocolVersion`, `capabilities`, and `skills`. The `url` must match the A2A endpoint (e.g., `http://localhost:3978/a2a`). [google.github.io/A2 - Network accessline 11
3. Set `protocolVersion` to `'0.3.0'` to match the current A2A protocol version. Client agents use this to verify compatibility before sending messages. [google.github.io/A2A -- Protocol](https://google.github.io/A2A/) - Network accessline 11
3. Set `protocolVersion` to `'0.3.0'` to match the current A2A protocol version. Client agents use this to verify compatibility before sending messages. [google.github.io/A2A -- Protocol](https://google.github.io/A2A/) - Network accessline 12
4. Define `skills` as an array of objects with `id`, `name`, `description`, and optionally `tags` and `examples`. Skills describe what your agent can do. Client agents and LLMs use skill descriptions to decide when to delegate to your agent - Network accessline 12
4. Define `skills` as an array of objects with `id`, `name`, `description`, and optionally `tags` and `examples`. Skills describe what your agent can do. Client agents and LLMs use skill descriptions to decide when to delegate to your agent - Network accessline 13
5. Handle incoming A2A messages with `app.event('a2a:message', handler)`. The handler receives `{ respond, requestContext }` where `requestContext.userMessage.parts` contains the message parts sent by the calling agent. [github.com/microsof - Network accessline 13
5. Handle incoming A2A messages with `app.event('a2a:message', handler)`. The handler receives `{ respond, requestContext }` where `requestContext.userMessage.parts` contains the message parts sent by the calling agent. [github.com/microsof - Network accessline 14
6. Extract text input from message parts by filtering for `kind === 'text'`: `requestContext.userMessage.parts.filter((p) => p.kind === 'text').at(0)?.text`. Always check for the text part before processing. [github.com/microsoft/teams.ts]( - Network accessline 14
6. Extract text input from message parts by filtering for `kind === 'text'`: `requestContext.userMessage.parts.filter((p) => p.kind === 'text').at(0)?.text`. Always check for the text part before processing. [github.com/microsoft/teams.ts]( - Network accessline 15
7. Send responses using the `respond(text)` helper function. This sends a text response back to the calling agent through the A2A protocol. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 15
7. Send responses using the `respond(text)` helper function. This sends a text response back to the calling agent through the A2A protocol. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 16
8. Add the `A2APlugin` to the App's `plugins` array. The plugin registers two HTTP routes: the A2A message endpoint at `/a2a` and the agent card at `/a2a/.well-known/agent-card.json`. [github.com/microsoft/teams.ts](https://github.com/micro - Network accessline 16
8. Add the `A2APlugin` to the App's `plugins` array. The plugin registers two HTTP routes: the A2A message endpoint at `/a2a` and the agent card at `/a2a/.well-known/agent-card.json`. [github.com/microsoft/teams.ts](https://github.com/micro - Network accessline 17
9. Install `@microsoft/teams.a2a` as a dependency. If the agent uses AI to process messages, also install `@microsoft/teams.ai` and `@microsoft/teams.openai`. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 17
9. Install `@microsoft/teams.a2a` as a dependency. If the agent uses AI to process messages, also install `@microsoft/teams.ai` and `@microsoft/teams.openai`. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 18
10. Keep skill descriptions specific and actionable. Vague descriptions like "general assistant" cause LLM orchestrators to delegate inappropriately. Include example queries in the `examples` array to guide delegation decisions. [google.git - Network accessline 18
10. Keep skill descriptions specific and actionable. Vague descriptions like "general assistant" cause LLM orchestrators to delegate inappropriately. Include example queries in the `examples` array to guide delegation decisions. [google.git - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 43
name: 'Weather Agent', description: 'An agent that provides weather information', url: 'http://localhost:3978/a2a', - Network accessline 43
name: 'Weather Agent', description: 'An agent that provides weather information', url: 'http://localhost:3978/a2a', - Network accessline 44
description: 'An agent that provides weather information', url: 'http://localhost:3978/a2a', version: '0.0.1', - Network accessline 44
description: 'An agent that provides weather information', url: 'http://localhost:3978/a2a', version: '0.0.1', - Network accessline 45
url: 'http://localhost:3978/a2a', - Network accessline 45
url: 'http://localhost:3978/a2a', - Network accessline 87
app.start(3978); // A2A endpoint: http://localhost:3978/a2a - Network accessline 87
app.start(3978); // A2A endpoint: http://localhost:3978/a2a - Network accessline 88
// A2A endpoint: http://localhost:3978/a2a - Network accessline 88
// A2A endpoint: http://localhost:3978/a2a - Network accessline 89
// Agent card: http://localhost:3978/a2a/.well-known/agent-card.json - Network accessline 89
// Agent card: http://localhost:3978/a2a/.well-known/agent-card.json - Network accessline 98
name: 'IT Help Desk Agent', description: 'An agent that handles IT support requests, password resets, and ticket creation', url: 'http://localhost:3978/a2a', - Network accessline 98
name: 'IT Help Desk Agent', description: 'An agent that handles IT support requests, password resets, and ticket creation', url: 'http://localhost:3978/a2a', - Network accessline 99
description: 'An agent that handles IT support requests, password resets, and ticket creation', url: 'http://localhost:3978/a2a', version: '1.0.0', - Network accessline 99
description: 'An agent that handles IT support requests, password resets, and ticket creation', url: 'http://localhost:3978/a2a', version: '1.0.0', - Network accessline 100
url: 'http://localhost:3978/a2a', - Network accessline 100
url: 'http://localhost:3978/a2a', - Access to secretsline 150
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted] - Network accessline 184
name: 'IT Help Desk Agent', description: 'Handles IT support requests', url: 'http://localhost:3978/a2a', - Network accessline 184
name: 'IT Help Desk Agent', description: 'Handles IT support requests', url: 'http://localhost:3978/a2a', - Network accessline 185
description: 'Handles IT support requests', url: 'http://localhost:3978/a2a', version: '1.0.0', - Network accessline 185
description: 'Handles IT support requests', url: 'http://localhost:3978/a2a', version: '1.0.0', - Network accessline 186
url: 'http://localhost:3978/a2a', - Network accessline 186
url: 'http://localhost:3978/a2a', - Network accessline 224
- **Missing required AgentCard fields**: Omitting `name`, `url`, `version`, or `protocolVersion` causes client agents to reject the agent card during discovery. Include all required fields. - **URL mismatch in AgentCard**: The `url` field m - Network accessline 224
- **Missing required AgentCard fields**: Omitting `name`, `url`, `version`, or `protocolVersion` causes client agents to reject the agent card during discovery. Include all required fields. - **URL mismatch in AgentCard**: The `url` field m - Network accessline 225
- **URL mismatch in AgentCard**: The `url` field must match the actual A2A endpoint URL. If your bot runs on port 3978, the URL is `http://localhost:3978/a2a`. A mismatch causes clients to connect to the wrong endpoint. - Network accessline 225
- **URL mismatch in AgentCard**: The `url` field must match the actual A2A endpoint URL. If your bot runs on port 3978, the URL is `http://localhost:3978/a2a`. A mismatch causes clients to connect to the wrong endpoint. - Network accessline 234
- [A2A Protocol Specification](https://google.github.io/A2A/) - Network accessline 234
- [A2A Protocol Specification](https://google.github.io/A2A/) - Network accessline 235
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 235
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 236
- [@microsoft/teams.a2a npm](https://www.npmjs.com/package/@microsoft/teams.a2a) - Network accessline 236
- [@microsoft/teams.a2a npm](https://www.npmjs.com/package/@microsoft/teams.a2a) - Network accessline 237
- [A2A Agent Card documentation](https://google.github.io/A2A/#/documentation?id=agent-card) - Network accessline 237
- [A2A Agent Card documentation](https://google.github.io/A2A/#/documentation?id=agent-card)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.chatprompt-basics-ts.md
- Network accessline 9
1. Always import `ChatPrompt` from `@microsoft/teams.ai` and pass a configured `IChatModel` instance (typically `OpenAIChatModel`) as the `model` option. The `model` field is the only required option. [github.com/microsoft/teams.ts](https:/ - Network accessline 9
1. Always import `ChatPrompt` from `@microsoft/teams.ai` and pass a configured `IChatModel` instance (typically `OpenAIChatModel`) as the `model` option. The `model` field is the only required option. [github.com/microsoft/teams.ts](https:/ - Network accessline 10
2. Set `instructions` to define the system prompt. This accepts a `string`, `string[]` (joined with newlines), or an `ITemplate` for dynamic instructions. The `role` option controls whether instructions are sent as `'system'` (default) or ` - Network accessline 10
2. Set `instructions` to define the system prompt. This accepts a `string`, `string[]` (joined with newlines), or an `ITemplate` for dynamic instructions. The `role` option controls whether instructions are sent as `'system'` (default) or ` - Network accessline 11
3. Pass a `LocalMemory` instance as `messages` for automatic conversation history management with configurable limits and auto-summarization. Alternatively, pass a raw `Message[]` array for manual control. [github.com/microsoft/teams.ts -- - Network accessline 11
3. Pass a `LocalMemory` instance as `messages` for automatic conversation history management with configurable limits and auto-summarization. Alternatively, pass a raw `Message[]` array for manual control. [github.com/microsoft/teams.ts -- - Network accessline 12
4. Call `prompt.send(input)` to send a user message and get a `ModelMessage` response. The input can be a `string` or a `ContentPart[]` array for multimodal input (text + images). [github.com/microsoft/teams.ts](https://github.com/microsoft - Network accessline 12
4. Call `prompt.send(input)` to send a user message and get a `ModelMessage` response. The input can be a `string` or a `ContentPart[]` array for multimodal input (text + images). [github.com/microsoft/teams.ts](https://github.com/microsoft - Network accessline 13
5. Always check `response.content` before sending -- it may be `undefined` if the model returned only function calls. When `autoFunctionCalling` is `true` (the default), function results are automatically fed back and the final response wil - Network accessline 13
5. Always check `response.content` before sending -- it may be `undefined` if the model returned only function calls. When `autoFunctionCalling` is `true` (the default), function results are automatically fed back and the final response wil - Network accessline 14
6. Use `prompt.send(input, { request: { temperature, max_tokens } })` to override model parameters per-request. These merge with the model's `requestOptions` defaults. [OpenAI -- Chat Completions](https://platform.openai.com/docs/api-refere - Network accessline 14
6. Use `prompt.send(input, { request: { temperature, max_tokens } })` to override model parameters per-request. These merge with the model's `requestOptions` defaults. [OpenAI -- Chat Completions](https://platform.openai.com/docs/api-refere - Network accessline 15
7. Use `prompt.send(input, { messages: extraMessages })` to inject additional context messages for a single request without persisting them to memory. This is useful for RAG-injected context. [github.com/microsoft/teams.ts](https://github.c - Network accessline 15
7. Use `prompt.send(input, { messages: extraMessages })` to inject additional context messages for a single request without persisting them to memory. This is useful for RAG-injected context. [github.com/microsoft/teams.ts](https://github.c - Network accessline 16
8. Use `.use(otherPrompt)` to compose sub-prompts and inherit their function definitions. This enables modular function organization across multiple ChatPrompt instances. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts - Network accessline 16
8. Use `.use(otherPrompt)` to compose sub-prompts and inherit their function definitions. This enables modular function organization across multiple ChatPrompt instances. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts - Network accessline 17
9. Set `name` and `description` on the prompt for debugging and identification. These appear in logs when a `logger` is provided and are used by ChatPrompt plugins for metadata. [github.com/microsoft/teams.ts](https://github.com/microsoft/t - Network accessline 17
9. Set `name` and `description` on the prompt for debugging and identification. These appear in logs when a `logger` is provided and are used by ChatPrompt plugins for metadata. [github.com/microsoft/teams.ts](https://github.com/microsoft/t - Network accessline 18
10. Pass ChatPrompt plugins as the second constructor argument: `new ChatPrompt(options, [plugin1, plugin2])`. Plugins hook into the send lifecycle (before/after send, before/after function calls). [github.com/microsoft/teams.ts -- ChatProm - Network accessline 18
10. Pass ChatPrompt plugins as the second constructor argument: `new ChatPrompt(options, [plugin1, plugin2])`. Plugins hook into the send lifecycle (before/after send, before/after function calls). [github.com/microsoft/teams.ts -- ChatProm - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 66
const visionResponse = await prompt.send([ { type: 'text', text: 'What is in this image?' }, { type: 'image_url', image_url: 'https://example.com/photo.jpg' }, - Network accessline 66
const visionResponse = await prompt.send([ { type: 'text', text: 'What is in this image?' }, { type: 'image_url', image_url: 'https://example.com/photo.jpg' }, - Network accessline 67
{ type: 'text', text: 'What is in this image?' }, { type: 'image_url', image_url: 'https://example.com/photo.jpg' }, ]); - Network accessline 67
{ type: 'text', text: 'What is in this image?' }, { type: 'image_url', image_url: 'https://example.com/photo.jpg' }, ]); - Network accessline 68
{ type: 'image_url', image_url: 'https://example.com/photo.jpg' }, - Network accessline 68
{ type: 'image_url', image_url: 'https://example.com/photo.jpg' }, - Network accessline 91
required: ['city'], }, async ({ city }: { city: string }) => { const res = await fetch(`https://api.weather.example.com/${city}`); - Network accessline 91
required: ['city'], }, async ({ city }: { city: string }) => { const res = await fetch(`https://api.weather.example.com/${city}`); - Network accessline 92
}, async ({ city }: { city: string }) => { const res = await fetch(`https://api.weather.example.com/${city}`); return await res.json(); - Network accessline 92
}, async ({ city }: { city: string }) => { const res = await fetch(`https://api.weather.example.com/${city}`); return await res.json(); - Network accessline 93
const res = await fetch(`https://api.weather.example.com/${city}`); - Network accessline 93
const res = await fetch(`https://api.weather.example.com/${city}`); - Network accessline 124
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 124
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 125
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 125
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 126
- [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat/create) - Network accessline 126
- [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat/create) - Network accessline 127
- [OpenAI Vision Guide](https://platform.openai.com/docs/guides/vision) - Network accessline 127
- [OpenAI Vision Guide](https://platform.openai.com/docs/guides/vision) - Network accessline 128
- [Teams AI v2 Examples](https://github.com/microsoft/teams.ts/tree/main/examples) - Network accessline 128
- [Teams AI v2 Examples](https://github.com/microsoft/teams.ts/tree/main/examples)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.citations-feedback-ts.md
- Network accessline 101
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 101
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 102
- [AI Message Markers -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bot-messages-ai-generated-content) - Network accessline 102
- [AI Message Markers -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bot-messages-ai-generated-content) - Network accessline 103
- [Citations in Teams Messages -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bot-messages-ai-generated-content#citations) - Network accessline 103
- [Citations in Teams Messages -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bot-messages-ai-generated-content#citations) - Network accessline 104
- [@microsoft/teams.api -- npm](https://www.npmjs.com/package/@microsoft/teams.api) - Network accessline 104
- [@microsoft/teams.api -- npm](https://www.npmjs.com/package/@microsoft/teams.api)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.conversational-query-ts.md
- Network accessline 9
1. **NL queries go through AI function calling, not regex parsing.** Define tool/function schemas that accept structured parameters (status filter, date range, person). The LLM translates the user's natural language into function calls with - Network accessline 9
1. **NL queries go through AI function calling, not regex parsing.** Define tool/function schemas that accept structured parameters (status filter, date range, person). The LLM translates the user's natural language into function calls with - Network accessline 10
2. **Define focused query functions, not a generic "search" function.** Create specific functions: `queryPtoRequests(status?, dateRange?, requester?)`, `queryBreakStatus(teamId?)`, `queryEquipmentBookings(item?, dateRange?)`. Specific schem - Network accessline 10
2. **Define focused query functions, not a generic "search" function.** Create specific functions: `queryPtoRequests(status?, dateRange?, requester?)`, `queryBreakStatus(teamId?)`, `queryEquipmentBookings(item?, dateRange?)`. Specific schem - Network accessline 312
- https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/function-calling - Network accessline 312
- https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/function-calling - Network accessline 313
- https://learn.microsoft.com/en-us/graph/api/listitem-list - Network accessline 313
- https://learn.microsoft.com/en-us/graph/api/listitem-list - Network accessline 314
- https://learn.microsoft.com/en-us/graph/query-parameters - Network accessline 314
- https://learn.microsoft.com/en-us/graph/query-parameters - Network accessline 315
- https://platform.openai.com/docs/guides/function-calling - Network accessline 315
- https://platform.openai.com/docs/guides/function-calling
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.function-calling-design-ts.md
- Network accessline 9
1. Name functions with `camelCase` verbs that clearly describe the action: `getWeather`, `searchDocuments`, `createTicket`. The LLM uses the function name as a primary signal for when to call it. Avoid generic names like `doAction` or `proc - Network accessline 9
1. Name functions with `camelCase` verbs that clearly describe the action: `getWeather`, `searchDocuments`, `createTicket`. The LLM uses the function name as a primary signal for when to call it. Avoid generic names like `doAction` or `proc - Network accessline 10
2. Write function descriptions from the LLM's perspective -- explain what the function does and when to use it. Good: `'Search the knowledge base for documents matching a query'`. Bad: `'Calls the search API'`. The description is part of th - Network accessline 10
2. Write function descriptions from the LLM's perspective -- explain what the function does and when to use it. Good: `'Search the knowledge base for documents matching a query'`. Bad: `'Calls the search API'`. The description is part of th - Network accessline 11
3. Define parameter schemas using JSON Schema with `type: 'object'` at the root. Supported property types are `string`, `number`, `integer`, `boolean`, `object`, `array`, and `null`. Always include `description` on every property. [json-sch - Network accessline 11
3. Define parameter schemas using JSON Schema with `type: 'object'` at the root. Supported property types are `string`, `number`, `integer`, `boolean`, `object`, `array`, and `null`. Always include `description` on every property. [json-sch - Network accessline 12
4. Mark parameters as required in the `required` array. Only include parameters that the function truly cannot operate without. Optional parameters give the LLM flexibility to omit them. [OpenAI -- Function Calling](https://platform.openai. - Network accessline 12
4. Mark parameters as required in the `required` array. Only include parameters that the function truly cannot operate without. Optional parameters give the LLM flexibility to omit them. [OpenAI -- Function Calling](https://platform.openai. - Network accessline 13
5. Use `enum` constraints on string parameters when there is a fixed set of valid values (e.g., `{ type: 'string', enum: ['celsius', 'fahrenheit'] }`). This prevents the LLM from hallucinating invalid values. [json-schema.org -- enum](https - Network accessline 13
5. Use `enum` constraints on string parameters when there is a fixed set of valid values (e.g., `{ type: 'string', enum: ['celsius', 'fahrenheit'] }`). This prevents the LLM from hallucinating invalid values. [json-schema.org -- enum](https - Network accessline 14
6. Keep the total number of functions per prompt under 20. Each function definition consumes tokens in every request. Too many functions slow down inference and increase cost. Group related operations or use sub-prompts via `.use()`. [OpenA - Network accessline 14
6. Keep the total number of functions per prompt under 20. Each function definition consumes tokens in every request. Too many functions slow down inference and increase cost. Group related operations or use sub-prompts via `.use()`. [OpenA - Network accessline 15
7. Use `.use(otherPrompt)` to compose function sets from separate ChatPrompt instances. This enables modular organization -- e.g., a `weatherPrompt` and a `calendarPrompt` composed into a `mainPrompt`. The main prompt inherits all functions - Network accessline 15
7. Use `.use(otherPrompt)` to compose function sets from separate ChatPrompt instances. This enables modular organization -- e.g., a `weatherPrompt` and a `calendarPrompt` composed into a `mainPrompt`. The main prompt inherits all functions - Network accessline 16
8. For functions with no parameters, omit the schema argument entirely. The `.function(name, description, handler)` three-argument overload registers a zero-parameter function. [github.com/microsoft/teams.ts](https://github.com/microsoft/te - Network accessline 16
8. For functions with no parameters, omit the schema argument entirely. The `.function(name, description, handler)` three-argument overload registers a zero-parameter function. [github.com/microsoft/teams.ts](https://github.com/microsoft/te - Network accessline 17
9. Return structured data (objects, arrays) from function handlers -- the SDK serializes them to JSON for the LLM. Return human-readable strings for simple status messages. Never return `undefined`. [github.com/microsoft/teams.ts](https://g - Network accessline 17
9. Return structured data (objects, arrays) from function handlers -- the SDK serializes them to JSON for the LLM. Return human-readable strings for simple status messages. Never return `undefined`. [github.com/microsoft/teams.ts](https://g - Network accessline 18
10. Decide between auto and manual function calling at design time. Use auto (default) for straightforward tool use where the LLM should handle the full loop. Use manual (`autoFunctionCalling: false`) when you need to validate, log, or gate - Network accessline 18
10. Decide between auto and manual function calling at design time. Use auto (default) for straightforward tool use where the LLM should handle the full loop. Use manual (`autoFunctionCalling: false`) when you need to validate, log, or gate - Network accessline 46
async ({ city, units }: { city: string; units?: string }) => { const u = units || 'celsius'; const res = await fetch(`https://api.weather.example.com/${city}?units=${u}`); - Network accessline 46
async ({ city, units }: { city: string; units?: string }) => { const u = units || 'celsius'; const res = await fetch(`https://api.weather.example.com/${city}?units=${u}`); - Network accessline 47
const u = units || 'celsius'; const res = await fetch(`https://api.weather.example.com/${city}?units=${u}`); return await res.json(); - Network accessline 47
const u = units || 'celsius'; const res = await fetch(`https://api.weather.example.com/${city}?units=${u}`); return await res.json(); - Network accessline 48
const res = await fetch(`https://api.weather.example.com/${city}?units=${u}`); - Network accessline 48
const res = await fetch(`https://api.weather.example.com/${city}?units=${u}`); - Network accessline 139
- [OpenAI -- Function Calling Guide](https://platform.openai.com/docs/guides/function-calling) - Network accessline 139
- [OpenAI -- Function Calling Guide](https://platform.openai.com/docs/guides/function-calling) - Network accessline 140
- [JSON Schema Reference](https://json-schema.org/understanding-json-schema/) - Network accessline 140
- [JSON Schema Reference](https://json-schema.org/understanding-json-schema/) - Network accessline 141
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 141
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 142
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 142
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 143
- [Teams AI v2 Lights Example](https://github.com/microsoft/teams.ts/tree/main/examples/lights) - Network accessline 143
- [Teams AI v2 Lights Example](https://github.com/microsoft/teams.ts/tree/main/examples/lights)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.function-calling-implementation-ts.md
- Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 63
async ({ name }: { name: string }) => { try { const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${name}`); - Network accessline 63
async ({ name }: { name: string }) => { try { const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${name}`); - Network accessline 64
try { const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${name}`); if (!res.ok) return `Error: Pokemon "${name}" not found`; - Network accessline 64
try { const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${name}`); if (!res.ok) return `Error: Pokemon "${name}" not found`; - Network accessline 65
const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${name}`); - Network accessline 65
const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${name}`); - Network accessline 126
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 126
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 127
- [OpenAI Function Calling Guide](https://platform.openai.com/docs/guides/function-calling) - Network accessline 127
- [OpenAI Function Calling Guide](https://platform.openai.com/docs/guides/function-calling) - Network accessline 128
- [JSON Schema Specification](https://json-schema.org/understanding-json-schema/) - Network accessline 128
- [JSON Schema Specification](https://json-schema.org/understanding-json-schema/) - Network accessline 129
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 129
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.memory-localmemory-ts.md
- Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Network accessline 133
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 133
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 134
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 134
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 135
- [OpenAI Context Window Limits](https://platform.openai.com/docs/models) - Network accessline 135
- [OpenAI Context Window Limits](https://platform.openai.com/docs/models) - Network accessline 136
- [Conversation History Best Practices -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/) - Network accessline 136
- [Conversation History Best Practices -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.model-setup-ts.md
- Network accessline 9
1. Always import `OpenAIChatModel` from `@microsoft/teams.openai` -- this is the only model class in the Teams AI v2 SDK. It handles both OpenAI and Azure OpenAI backends. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.t - Network accessline 9
1. Always import `OpenAIChatModel` from `@microsoft/teams.openai` -- this is the only model class in the Teams AI v2 SDK. It handles both OpenAI and Azure OpenAI backends. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.t - Network accessline 10
2. For plain OpenAI, provide `apiKey` and `model` (e.g., `'gpt-4o'`). Do not set `endpoint` or `apiVersion` -- those trigger Azure mode. [OpenAI API reference](https://platform.openai.com/docs/api-reference/chat) - Network accessline 10
2. For plain OpenAI, provide `apiKey` and `model` (e.g., `'gpt-4o'`). Do not set `endpoint` or `apiVersion` -- those trigger Azure mode. [OpenAI API reference](https://platform.openai.com/docs/api-reference/chat) - Network accessline 11
3. For Azure OpenAI, provide `apiKey`, `endpoint`, `apiVersion`, and `model` (the deployment name, not the base model name). Setting `endpoint` is what switches the client into Azure mode. [learn.microsoft.com -- Azure OpenAI](https://learn - Network accessline 11
3. For Azure OpenAI, provide `apiKey`, `endpoint`, `apiVersion`, and `model` (the deployment name, not the base model name). Setting `endpoint` is what switches the client into Azure mode. [learn.microsoft.com -- Azure OpenAI](https://learn - Network accessline 12
4. For Azure Managed Identity authentication, omit `apiKey` and provide `azureADTokenProvider: () => Promise<string>` instead. This function is called before each request to obtain a fresh token. [learn.microsoft.com -- Managed Identity](ht - Network accessline 12
4. For Azure Managed Identity authentication, omit `apiKey` and provide `azureADTokenProvider: () => Promise<string>` instead. This function is called before each request to obtain a fresh token. [learn.microsoft.com -- Managed Identity](ht - Network accessline 13
5. Store all secrets (`apiKey`, `endpoint`, `apiVersion`, deployment name) in environment variables and load them via `process.env`. Never hard-code API keys in source files. Use `dotenv` for local development. [dotenv on npm](https://www.n - Network accessline 13
5. Store all secrets (`apiKey`, `endpoint`, `apiVersion`, deployment name) in environment variables and load them via `process.env`. Never hard-code API keys in source files. Use `dotenv` for local development. [dotenv on npm](https://www.n - Network accessline 14
6. Use the `requestOptions` field to set default chat completion parameters (`temperature`, `max_tokens`, `top_p`, etc.). These apply to every `prompt.send()` call unless overridden per-request via `prompt.send(input, { request: { ... } })` - Network accessline 14
6. Use the `requestOptions` field to set default chat completion parameters (`temperature`, `max_tokens`, `top_p`, etc.). These apply to every `prompt.send()` call unless overridden per-request via `prompt.send(input, { request: { ... } })` - Network accessline 15
7. Use `logger` on the model constructor to get request/response debug logging. Pass a `ConsoleLogger` child for scoped output (e.g., `logger.child('openai')`). [github.com/microsoft/teams.ts -- ConsoleLogger](https://github.com/microsoft/t - Network accessline 15
7. Use `logger` on the model constructor to get request/response debug logging. Pass a `ConsoleLogger` child for scoped output (e.g., `logger.child('openai')`). [github.com/microsoft/teams.ts -- ConsoleLogger](https://github.com/microsoft/t - Network accessline 16
8. Set `timeout` (in milliseconds) to prevent hanging requests. A reasonable default is 30000-60000ms for chat completions. The SDK does not set a default timeout. [OpenAI SDK -- timeout](https://platform.openai.com/docs/api-reference) - Network accessline 16
8. Set `timeout` (in milliseconds) to prevent hanging requests. A reasonable default is 30000-60000ms for chat completions. The SDK does not set a default timeout. [OpenAI SDK -- timeout](https://platform.openai.com/docs/api-reference) - Network accessline 17
9. Use `headers` for custom HTTP headers required by proxies or API gateways. This is a `Record<string, string>` merged into every outgoing request. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 17
9. Use `headers` for custom HTTP headers required by proxies or API gateways. This is a `Record<string, string>` merged into every outgoing request. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 18
10. Use `organization` and `project` only when your OpenAI account requires org/project scoping. Azure OpenAI ignores these fields. [OpenAI -- Organization](https://platform.openai.com/docs/api-reference/organization-optional) - Network accessline 18
10. Use `organization` and `project` only when your OpenAI account requires org/project scoping. Azure OpenAI ignores these fields. [OpenAI -- Organization](https://platform.openai.com/docs/api-reference/organization-optional) - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Network accessline 79
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 79
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 80
- [OpenAI API Reference -- Chat Completions](https://platform.openai.com/docs/api-reference/chat/create) - Network accessline 80
- [OpenAI API Reference -- Chat Completions](https://platform.openai.com/docs/api-reference/chat/create) - Network accessline 81
- [Azure OpenAI Service REST API](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference) - Network accessline 81
- [Azure OpenAI Service REST API](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference) - Network accessline 82
- [Azure Managed Identity Overview](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 82
- [Azure Managed Identity Overview](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 83
- [@microsoft/teams.openai -- npm](https://www.npmjs.com/package/@microsoft/teams.openai) - Network accessline 83
- [@microsoft/teams.openai -- npm](https://www.npmjs.com/package/@microsoft/teams.openai)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.rag-retrieval-ts.md
- Network accessline 115
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 115
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 116
- [Fuse.js -- Lightweight Fuzzy Search](https://www.fusejs.io/) - Network accessline 116
- [Fuse.js -- Lightweight Fuzzy Search](https://www.fusejs.io/) - Network accessline 117
- [RAG Pattern -- Microsoft Learn](https://learn.microsoft.com/en-us/azure/search/retrieval-augmented-generation-overview) - Network accessline 117
- [RAG Pattern -- Microsoft Learn](https://learn.microsoft.com/en-us/azure/search/retrieval-augmented-generation-overview) - Network accessline 118
- [Azure AI Search -- Vector Search](https://learn.microsoft.com/en-us/azure/search/vector-search-overview) - Network accessline 118
- [Azure AI Search -- Vector Search](https://learn.microsoft.com/en-us/azure/search/vector-search-overview) - Network accessline 119
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 119
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.rag-vectorstores-ts.md
- Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Network accessline 81
private async getEmbedding(text: string): Promise<number[]> { const response = await fetch('https://api.openai.com/v1/embeddings', { - Network accessline 81
private async getEmbedding(text: string): Promise<number[]> { const response = await fetch('https://api.openai.com/v1/embeddings', { - Network accessline 82
const response = await fetch('https://api.openai.com/v1/embeddings', { - Network accessline 82
const response = await fetch('https://api.openai.com/v1/embeddings', { - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Network accessline 158
- [Azure AI Search -- Vector Search](https://learn.microsoft.com/en-us/azure/search/vector-search-overview) - Network accessline 158
- [Azure AI Search -- Vector Search](https://learn.microsoft.com/en-us/azure/search/vector-search-overview) - Network accessline 159
- [OpenAI Embeddings API](https://platform.openai.com/docs/guides/embeddings) - Network accessline 159
- [OpenAI Embeddings API](https://platform.openai.com/docs/guides/embeddings) - Network accessline 160
- [Pinecone Documentation](https://docs.pinecone.io/) - Network accessline 160
- [Pinecone Documentation](https://docs.pinecone.io/) - Network accessline 161
- [pgvector -- PostgreSQL Extension](https://github.com/pgvector/pgvector) - Network accessline 161
- [pgvector -- PostgreSQL Extension](https://github.com/pgvector/pgvector) - Network accessline 162
- [Weaviate Documentation](https://weaviate.io/developers/weaviate) - Network accessline 162
- [Weaviate Documentation](https://weaviate.io/developers/weaviate) - Network accessline 163
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 163
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ai.streaming-ts.md
- Network accessline 101
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 101
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 102
- [Teams Streaming Protocol -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/streaming) - Network accessline 102
- [Teams Streaming Protocol -- Microsoft Learn](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/streaming) - Network accessline 103
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 103
- [@microsoft/teams.ai -- npm](https://www.npmjs.com/package/@microsoft/teams.ai) - Network accessline 104
- [OpenAI Streaming -- API Reference](https://platform.openai.com/docs/api-reference/chat/create#chat-create-stream) - Network accessline 104
- [OpenAI Streaming -- API Reference](https://platform.openai.com/docs/api-reference/chat/create#chat-create-stream)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/auth.oauth-sso-ts.md
- Network accessline 9
1. Always configure OAuth by passing `oauth: { defaultConnectionName: 'graph' }` to the `App` constructor alongside `clientId`, `clientSecret`, and `tenantId`. Without all four properties the sign-in flow will fail silently. [learn.microsof - Network accessline 9
1. Always configure OAuth by passing `oauth: { defaultConnectionName: 'graph' }` to the `App` constructor alongside `clientId`, `clientSecret`, and `tenantId`. Without all four properties the sign-in flow will fail silently. [learn.microsof - Network accessline 10
2. Guard every message handler with an `isSignedIn` check before accessing `userGraph` or `userToken`. If the user is not signed in, call `await signin()` and return immediately -- the handler will re-fire after the sign-in completes. [gith - Network accessline 10
2. Guard every message handler with an `isSignedIn` check before accessing `userGraph` or `userToken`. If the user is not signed in, call `await signin()` and return immediately -- the handler will re-fire after the sign-in completes. [gith - Network accessline 11
3. Pass `oauthCardText` and `signInButtonText` options to `signin()` to customize the sign-in card displayed to the user. These are the only two customization points for the OAuth card. [learn.microsoft.com -- Auth flow](https://learn.micro - Network accessline 11
3. Pass `oauthCardText` and `signInButtonText` options to `signin()` to customize the sign-in card displayed to the user. These are the only two customization points for the OAuth card. [learn.microsoft.com -- Auth flow](https://learn.micro - Network accessline 12
4. Handle the post-sign-in event with `app.event('signin', handler)` to greet the user or execute first-time logic. The handler receives `{ send, userGraph, token }` and fires after the token exchange completes. [github.com/microsoft/teams. - Network accessline 12
4. Handle the post-sign-in event with `app.event('signin', handler)` to greet the user or execute first-time logic. The handler receives `{ send, userGraph, token }` and fires after the token exchange completes. [github.com/microsoft/teams. - Network accessline 13
5. Implement sign-out with a dedicated command (e.g., `app.message('/signout', ...)`) that checks `isSignedIn`, calls `await signout()`, and confirms to the user. Forgetting the `isSignedIn` guard on signout causes confusing errors. [github - Network accessline 13
5. Implement sign-out with a dedicated command (e.g., `app.message('/signout', ...)`) that checks `isSignedIn`, calls `await signout()`, and confirms to the user. Forgetting the `isSignedIn` guard on signout causes confusing errors. [github - Network accessline 14
6. The `userToken` property on the handler context is the raw OAuth access token string. Use it only for direct REST calls outside of the Graph client; prefer `userGraph` for Microsoft Graph calls as it handles token injection automatically - Network accessline 14
6. The `userToken` property on the handler context is the raw OAuth access token string. Use it only for direct REST calls outside of the Graph client; prefer `userGraph` for Microsoft Graph calls as it handles token injection automatically - Network accessline 15
7. For app-level (service-to-service) calls, use `appGraph` which authenticates with client credentials and does not require user sign-in. Do not confuse `appGraph` (application permissions) with `userGraph` (delegated permissions). [learn. - Network accessline 15
7. For app-level (service-to-service) calls, use `appGraph` which authenticates with client credentials and does not require user sign-in. Do not confuse `appGraph` (application permissions) with `userGraph` (delegated permissions). [learn. - Network accessline 16
8. Choose the appropriate credential method: `clientId` + `clientSecret` for standard deployments, `managedIdentityClientId: 'system'` for system-assigned managed identity, a specific identity string for user-assigned managed identity, or ` - Network accessline 16
8. Choose the appropriate credential method: `clientId` + `clientSecret` for standard deployments, `managedIdentityClientId: 'system'` for system-assigned managed identity, a specific identity string for user-assigned managed identity, or ` - Network accessline 17
9. The OAuth connection name (e.g., `'graph'`) must exactly match the OAuth connection setting configured in the Azure Bot resource. A mismatch results in a generic "sign-in failed" error with no helpful diagnostics. [learn.microsoft.com -- - Network accessline 17
9. The OAuth connection name (e.g., `'graph'`) must exactly match the OAuth connection setting configured in the Azure Bot resource. A mismatch results in a generic "sign-in failed" error with no helpful diagnostics. [learn.microsoft.com -- - Network accessline 18
10. Never store or log raw tokens. The `userToken` is a bearer credential that grants access to the user's data. If you need to persist auth state, store a flag or user ID, not the token itself. [learn.microsoft.com -- Security best practic - Network accessline 18
10. Never store or log raw tokens. The `userToken` is a bearer credential that grants access to the user's data. If you need to persist auth state, store a flag or user ID, not the token itself. [learn.microsoft.com -- Security best practic - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Network accessline 143
- [Teams Bot SSO overview](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/bot-sso-overview) - Network accessline 143
- [Teams Bot SSO overview](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/bot-sso-overview) - Network accessline 144
- [Add authentication to a Teams bot](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/add-authentication) - Network accessline 144
- [Add authentication to a Teams bot](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/add-authentication) - Network accessline 145
- [Bot authentication flow](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/auth-flow-bot) - Network accessline 145
- [Bot authentication flow](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/auth-flow-bot) - Network accessline 146
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 146
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 147
- [Microsoft Graph permissions overview](https://learn.microsoft.com/en-us/graph/permissions-overview) - Network accessline 147
- [Microsoft Graph permissions overview](https://learn.microsoft.com/en-us/graph/permissions-overview) - Network accessline 148
- [Azure Managed Identities](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) - Network accessline 148
- [Azure Managed Identities](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/compat.botbuilder-interop-ts.md
- Network accessline 9
1. The `@microsoft/teams.botbuilder` package provides a backward-compatibility layer between legacy BotBuilder bots (using `TeamsActivityHandler` from `botbuilder`) and the Teams SDK v2 (`@microsoft/teams.apps`). Use it only when you have a - Network accessline 9
1. The `@microsoft/teams.botbuilder` package provides a backward-compatibility layer between legacy BotBuilder bots (using `TeamsActivityHandler` from `botbuilder`) and the Teams SDK v2 (`@microsoft/teams.apps`). Use it only when you have a - Network accessline 10
2. For new projects, always use `@microsoft/teams.apps` directly. The compat layer adds overhead and limits access to newer SDK v2 features (plugin system, streaming, DevTools, MCP, A2A). Only use `@microsoft/teams.botbuilder` for increment - Network accessline 10
2. For new projects, always use `@microsoft/teams.apps` directly. The compat layer adds overhead and limits access to newer SDK v2 features (plugin system, streaming, DevTools, MCP, A2A). Only use `@microsoft/teams.botbuilder` for increment - Network accessline 11
3. Legacy BotBuilder bots use `TeamsActivityHandler` with method overrides (`onMessage()`, `onMembersAdded()`, `onTeamsChannelCreated()`, etc.) and the `TurnContext` object. Teams SDK v2 uses `App` with `app.on()` route handlers and a destr - Network accessline 11
3. Legacy BotBuilder bots use `TeamsActivityHandler` with method overrides (`onMessage()`, `onMembersAdded()`, `onTeamsChannelCreated()`, etc.) and the `TurnContext` object. Teams SDK v2 uses `App` with `app.on()` route handlers and a destr - Network accessline 12
4. The migration path from BotBuilder to SDK v2 follows: (a) install `@microsoft/teams.botbuilder` alongside existing `botbuilder` packages, (b) wrap the existing handler with the compat layer, (c) incrementally move handlers from `TeamsAct - Network accessline 12
4. The migration path from BotBuilder to SDK v2 follows: (a) install `@microsoft/teams.botbuilder` alongside existing `botbuilder` packages, (b) wrap the existing handler with the compat layer, (c) incrementally move handlers from `TeamsAct - Network accessline 13
5. Key API differences between BotBuilder and SDK v2: BotBuilder uses `TurnContext.sendActivity()` while SDK v2 uses `ctx.send()` / `ctx.reply()`; BotBuilder uses `CardFactory.adaptiveCard()` while SDK v2 sends raw attachment objects; BotBu - Network accessline 13
5. Key API differences between BotBuilder and SDK v2: BotBuilder uses `TurnContext.sendActivity()` while SDK v2 uses `ctx.send()` / `ctx.reply()`; BotBuilder uses `CardFactory.adaptiveCard()` while SDK v2 sends raw attachment objects; BotBu - Network accessline 14
6. BotBuilder's state management (`ConversationState`, `UserState`, `MemoryStorage`) does not carry over. SDK v2 uses `IStorage` from `@microsoft/teams.common` and `LocalMemory` from `@microsoft/teams.ai`. Migrate state stores as part of th - Network accessline 14
6. BotBuilder's state management (`ConversationState`, `UserState`, `MemoryStorage`) does not carry over. SDK v2 uses `IStorage` from `@microsoft/teams.common` and `LocalMemory` from `@microsoft/teams.ai`. Migrate state stores as part of th - Network accessline 15
7. BotBuilder's dialog system (`ComponentDialog`, `WaterfallDialog`) is not available in SDK v2. Replace with SDK v2 `dialog.open` / `dialog.submit` invoke routes and Adaptive Card-based task modules, or use AI-driven conversation flows wit - Network accessline 15
7. BotBuilder's dialog system (`ComponentDialog`, `WaterfallDialog`) is not available in SDK v2. Replace with SDK v2 `dialog.open` / `dialog.submit` invoke routes and Adaptive Card-based task modules, or use AI-driven conversation flows wit - Network accessline 16
8. Authentication patterns differ: BotBuilder uses `OAuthPrompt` and `TokenResponseEventHandler`, while SDK v2 uses `oauth` in `AppOptions` with `ctx.isSignedIn`, `ctx.signin()`, and `ctx.userGraph`. Migrate OAuth configuration to the App c - Network accessline 16
8. Authentication patterns differ: BotBuilder uses `OAuthPrompt` and `TokenResponseEventHandler`, while SDK v2 uses `oauth` in `AppOptions` with `ctx.isSignedIn`, `ctx.signin()`, and `ctx.userGraph`. Migrate OAuth configuration to the App c - Network accessline 17
9. The `@examples/botbuilder` example in the Teams SDK v2 repository demonstrates the compat layer usage. Reference it for concrete interop patterns. [github.com/microsoft/teams.ts -- examples/botbuilder](https://github.com/microsoft/teams. - Network accessline 17
9. The `@examples/botbuilder` example in the Teams SDK v2 repository demonstrates the compat layer usage. Reference it for concrete interop patterns. [github.com/microsoft/teams.ts -- examples/botbuilder](https://github.com/microsoft/teams. - Network accessline 18
10. Before starting migration, audit the existing bot's feature set: message handlers, card actions, dialogs, proactive messaging, authentication, and any Bot Framework middleware. Map each feature to its SDK v2 equivalent. Features without - Network accessline 18
10. Before starting migration, audit the existing bot's feature set: message handlers, card actions, dialogs, proactive messaging, authentication, and any Bot Framework middleware. Map each feature to its SDK v2 equivalent. Features without - Access to secretsline 187
[Credential-related source omitted] - Access to secretsline 187
[Credential-related source omitted] - Network accessline 222
- [Teams SDK v2 -- @microsoft/teams.botbuilder](https://github.com/microsoft/teams.ts/tree/main/packages/botbuilder) - Network accessline 222
- [Teams SDK v2 -- @microsoft/teams.botbuilder](https://github.com/microsoft/teams.ts/tree/main/packages/botbuilder) - Network accessline 223
- [Teams SDK v2 -- botbuilder example](https://github.com/microsoft/teams.ts/tree/main/examples/botbuilder) - Network accessline 223
- [Teams SDK v2 -- botbuilder example](https://github.com/microsoft/teams.ts/tree/main/examples/botbuilder) - Network accessline 224
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 224
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 225
- [Bot Framework SDK for JavaScript](https://github.com/microsoft/botframework-sdk) - Network accessline 225
- [Bot Framework SDK for JavaScript](https://github.com/microsoft/botframework-sdk) - Network accessline 226
- [BotBuilder documentation](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics) - Network accessline 226
- [BotBuilder documentation](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics) - Network accessline 227
- [Teams: Migrate from BotBuilder](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots) - Network accessline 227
- [Teams: Migrate from BotBuilder](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/dev.debug-test-ts.md
- Network accessline 9
1. Always include `DevtoolsPlugin` from `@microsoft/teams.dev` in the `plugins` array during local development. It provides a web-based DevTools UI, WebSocket-based real-time activity inspection, and message replay capabilities. [github.com - Network accessline 9
1. Always include `DevtoolsPlugin` from `@microsoft/teams.dev` in the `plugins` array during local development. It provides a web-based DevTools UI, WebSocket-based real-time activity inspection, and message replay capabilities. [github.com - Network accessline 10
2. The DevTools UI runs at `http://localhost:{PORT+1}/devtools` (default `http://localhost:3979/devtools`). It starts automatically when the app starts with `DevtoolsPlugin` registered. Open it in a browser to inspect inbound and outbound a - Network accessline 10
2. The DevTools UI runs at `http://localhost:{PORT+1}/devtools` (default `http://localhost:3979/devtools`). It starts automatically when the app starts with `DevtoolsPlugin` registered. Open it in a browser to inspect inbound and outbound a - Network accessline 11
3. The bot endpoint is `http://localhost:{PORT}/api/messages` (default `http://localhost:3978/api/messages`). This is the URL that Teams (or the Bot Framework Emulator) sends activities to. For Azure deployment, update the messaging endpoin - Network accessline 11
3. The bot endpoint is `http://localhost:{PORT}/api/messages` (default `http://localhost:3978/api/messages`). This is the URL that Teams (or the Bot Framework Emulator) sends activities to. For Azure deployment, update the messaging endpoin - Network accessline 12
4. Run locally with `npm run dev` which executes `tsx watch -r dotenv/config src/index.ts`. This provides TypeScript execution with automatic file watching -- changes to source files trigger an instant restart without a build step. [github. - Network accessline 12
4. Run locally with `npm run dev` which executes `tsx watch -r dotenv/config src/index.ts`. This provides TypeScript execution with automatic file watching -- changes to source files trigger an instant restart without a build step. [github. - Network accessline 13
5. Configure logging with `ConsoleLogger` at the appropriate level: `'trace'` for deep SDK internals, `'debug'` for development, `'info'` for staging, `'warn'` or `'error'` for production. Use `pattern: '-azure/msal-node'` to suppress noisy - Network accessline 13
5. Configure logging with `ConsoleLogger` at the appropriate level: `'trace'` for deep SDK internals, `'debug'` for development, `'info'` for staging, `'warn'` or `'error'` for production. Use `pattern: '-azure/msal-node'` to suppress noisy - Network accessline 14
6. Run `npx tsc --noEmit` as a build verification gate before testing or deploying. This type-checks all TypeScript source without producing output files. The project must compile cleanly -- type errors caught here prevent runtime failures. - Network accessline 14
6. Run `npx tsc --noEmit` as a build verification gate before testing or deploying. This type-checks all TypeScript source without producing output files. The project must compile cleanly -- type errors caught here prevent runtime failures. - Network accessline 15
7. For testing with real Teams clients locally, use a tunneling solution (ngrok, dev tunnels, Cloudflare Tunnel) to expose your local `localhost:3978` endpoint over HTTPS. Update the Azure Bot messaging endpoint to the tunnel URL (e.g., `ht - Network accessline 15
7. For testing with real Teams clients locally, use a tunneling solution (ngrok, dev tunnels, Cloudflare Tunnel) to expose your local `localhost:3978` endpoint over HTTPS. Update the Azure Bot messaging endpoint to the tunnel URL (e.g., `ht - Network accessline 16
8. Sideload the app by opening the Teams sideloading URL after provisioning: `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` Use `TEAMS_APP_ID` - Network accessline 16
8. Sideload the app by opening the Teams sideloading URL after provisioning: `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` Use `TEAMS_APP_ID` - Network accessline 17
9. Use `skipAuth: true` in `AppOptions` for purely local development against DevTools without Azure Bot credentials. This disables JWT validation. Never use it in production or when testing against real Teams clients. [github.com/microsoft/ - Network accessline 17
9. Use `skipAuth: true` in `AppOptions` for purely local development against DevTools without Azure Bot credentials. This disables JWT validation. Never use it in production or when testing against real Teams clients. [github.com/microsoft/ - Network accessline 18
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Network accessline 43
// Bot endpoint: http://localhost:3978/api/messages - Network accessline 43
// Bot endpoint: http://localhost:3978/api/messages - Network accessline 44
// DevTools UI: http://localhost:3979/devtools - Network accessline 44
// DevTools UI: http://localhost:3979/devtools - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Network accessline 117
// 7. Open DevTools in browser // http://localhost:3979/devtools - Network accessline 117
// 7. Open DevTools in browser // http://localhost:3979/devtools - Network accessline 118
// http://localhost:3979/devtools - Network accessline 118
// http://localhost:3979/devtools - Network accessline 124
// atk deploy --env local -i false // Open Teams sideload URL (TEAMS_APP_ID from env/.env.local): // https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true&appTenantId=$TENANT_ID - Network accessline 124
// atk deploy --env local -i false // Open Teams sideload URL (TEAMS_APP_ID from env/.env.local): // https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true&appTenantId=$TENANT_ID - Network accessline 125
// Open Teams sideload URL (TEAMS_APP_ID from env/.env.local): // https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true&appTenantId=$TENANT_ID // (TEAMS_APP_ID from env/.env.local; TENANT_ID from .loca - Network accessline 125
// Open Teams sideload URL (TEAMS_APP_ID from env/.env.local): // https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true&appTenantId=$TENANT_ID // (TEAMS_APP_ID from env/.env.local; TENANT_ID from .loca - Network accessline 126
// https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true&appTenantId=$TENANT_ID - Network accessline 126
// https://teams.microsoft.com/l/app/$TEAMS_APP_ID?installAppPackage=true&webjoin=true&appTenantId=$TENANT_ID - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Network accessline 172
- [Teams SDK v2 -- @microsoft/teams.dev (DevtoolsPlugin)](https://github.com/microsoft/teams.ts/tree/main/packages/dev) - Network accessline 172
- [Teams SDK v2 -- @microsoft/teams.dev (DevtoolsPlugin)](https://github.com/microsoft/teams.ts/tree/main/packages/dev) - Network accessline 173
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 173
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 174
- [Teams: Sideload apps](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload) - Network accessline 174
- [Teams: Sideload apps](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload) - Network accessline 175
- [Azure Dev Tunnels](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview) - Network accessline 175
- [Azure Dev Tunnels](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview) - Network accessline 176
- [ngrok documentation](https://ngrok.com/docs) - Network accessline 176
- [ngrok documentation](https://ngrok.com/docs) - Network accessline 177
- [M365 Agents Toolkit](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/teams-toolkit-fundamentals-vs) - Network accessline 177
- [M365 Agents Toolkit](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/teams-toolkit-fundamentals-vs) - Network accessline 178
- [Teams: Test and debug](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/debug) - Network accessline 178
- [Teams: Test and debug](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/debug)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/graph.usergraph-appgraph-ts.md
- Network accessline 9
1. Import Graph endpoints from `@microsoft/teams.graph-endpoints` for v1.0 APIs and `@microsoft/teams.graph-endpoints-beta` for beta APIs. These are auto-generated typed functions, not raw URL strings. [github.com/microsoft/teams.ts](https: - Network accessline 9
1. Import Graph endpoints from `@microsoft/teams.graph-endpoints` for v1.0 APIs and `@microsoft/teams.graph-endpoints-beta` for beta APIs. These are auto-generated typed functions, not raw URL strings. [github.com/microsoft/teams.ts](https: - Network accessline 10
2. Use `userGraph` for operations that act on behalf of the signed-in user (delegated permissions). This requires the user to have completed the OAuth sign-in flow (`isSignedIn === true`). [learn.microsoft.com -- Delegated permissions](http - Network accessline 10
2. Use `userGraph` for operations that act on behalf of the signed-in user (delegated permissions). This requires the user to have completed the OAuth sign-in flow (`isSignedIn === true`). [learn.microsoft.com -- Delegated permissions](http - Network accessline 11
3. Use `appGraph` for operations that run under the application's own identity (application permissions). This does not require user sign-in but requires admin consent for the target tenant. [learn.microsoft.com -- Application permissions]( - Network accessline 11
3. Use `appGraph` for operations that run under the application's own identity (application permissions). This does not require user sign-in but requires admin consent for the target tenant. [learn.microsoft.com -- Application permissions]( - Network accessline 12
4. Call endpoints with `graph.call(endpoints.{resource}.{action}, params)` where `params` is an object containing path parameters, query parameters, and the request body. Path parameters use kebab-case keys matching the Graph URL template ( - Network accessline 12
4. Call endpoints with `graph.call(endpoints.{resource}.{action}, params)` where `params` is an object containing path parameters, query parameters, and the request body. Path parameters use kebab-case keys matching the Graph URL template ( - Network accessline 13
5. Use OData query parameters (`$top`, `$filter`, `$select`, `$orderby`, `$expand`) as top-level keys in the params object to control response shape and size. Always set `$top` on list endpoints to avoid unbounded result sets. [learn.micros - Network accessline 13
5. Use OData query parameters (`$top`, `$filter`, `$select`, `$orderby`, `$expand`) as top-level keys in the params object to control response shape and size. Always set `$top` on list endpoints to avoid unbounded result sets. [learn.micros - Network accessline 14
6. Endpoint names follow a consistent pattern: `endpoints.{resource}.get` for single-item GET, `endpoints.{resource}.list` for collection GET, `endpoints.{resource}.create` for POST, `endpoints.{resource}.update` for PATCH, `endpoints.{reso - Network accessline 14
6. Endpoint names follow a consistent pattern: `endpoints.{resource}.get` for single-item GET, `endpoints.{resource}.list` for collection GET, `endpoints.{resource}.create` for POST, `endpoints.{resource}.update` for PATCH, `endpoints.{reso - Network accessline 15
7. Always wrap Graph calls in try/catch. Failed calls throw errors with HTTP status codes and Graph error details. Check for 401 (token expired), 403 (insufficient permissions), and 429 (throttled). [learn.microsoft.com -- Error responses]( - Network accessline 15
7. Always wrap Graph calls in try/catch. Failed calls throw errors with HTTP status codes and Graph error details. Check for 401 (token expired), 403 (insufficient permissions), and 429 (throttled). [learn.microsoft.com -- Error responses]( - Network accessline 16
8. For nested resources, endpoints chain with dot notation: `endpoints.chats.messages.list`, `endpoints.chats.messages.create`. Pass the parent resource ID as a path parameter (e.g., `'chat-id': chatId`). [github.com/microsoft/teams.ts](htt - Network accessline 16
8. For nested resources, endpoints chain with dot notation: `endpoints.chats.messages.list`, `endpoints.chats.messages.create`. Pass the parent resource ID as a path parameter (e.g., `'chat-id': chatId`). [github.com/microsoft/teams.ts](htt - Network accessline 17
9. Prefer `$select` to retrieve only the fields you need. This reduces payload size and avoids retrieving sensitive data. For example, `$select: 'displayName,mail'` on a user query. [learn.microsoft.com -- Select parameter](https://learn.mi - Network accessline 17
9. Prefer `$select` to retrieve only the fields you need. This reduces payload size and avoids retrieving sensitive data. For example, `$select: 'displayName,mail'` on a user query. [learn.microsoft.com -- Select parameter](https://learn.mi - Network accessline 18
10. Never call `userGraph` without first verifying `isSignedIn`. Calling `userGraph.call()` without a valid delegated token throws an authentication error. Gate all `userGraph` usage behind the sign-in guard pattern. [github.com/microsoft/t - Network accessline 18
10. Never call `userGraph` without first verifying `isSignedIn`. Calling `userGraph.call()` without a valid delegated token throws an authentication error. Gate all `userGraph` usage behind the sign-in guard pattern. [github.com/microsoft/t - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Network accessline 126
- [Microsoft Graph API overview](https://learn.microsoft.com/en-us/graph/overview) - Network accessline 126
- [Microsoft Graph API overview](https://learn.microsoft.com/en-us/graph/overview) - Network accessline 127
- [Graph permissions overview](https://learn.microsoft.com/en-us/graph/permissions-overview) - Network accessline 127
- [Graph permissions overview](https://learn.microsoft.com/en-us/graph/permissions-overview) - Network accessline 128
- [Graph OData query parameters](https://learn.microsoft.com/en-us/graph/query-parameters) - Network accessline 128
- [Graph OData query parameters](https://learn.microsoft.com/en-us/graph/query-parameters) - Network accessline 129
- [Graph error responses](https://learn.microsoft.com/en-us/graph/errors) - Network accessline 129
- [Graph error responses](https://learn.microsoft.com/en-us/graph/errors) - Network accessline 130
- [Graph API rate limiting](https://learn.microsoft.com/en-us/graph/throttling) - Network accessline 130
- [Graph API rate limiting](https://learn.microsoft.com/en-us/graph/throttling) - Network accessline 131
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 131
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 132
- [@microsoft/teams.graph-endpoints npm](https://www.npmjs.com/package/@microsoft/teams.graph-endpoints) - Network accessline 132
- [@microsoft/teams.graph-endpoints npm](https://www.npmjs.com/package/@microsoft/teams.graph-endpoints)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/mcp.client-basics-ts.md
- Network accessline 9
1. Create an `McpClientPlugin` instance and pass it as a ChatPrompt plugin in the second argument array: `new ChatPrompt({ ... }, [new McpClientPlugin({ logger })])`. The plugin registers itself under the name `'mcpClient'`. [github.com/mic - Network accessline 9
1. Create an `McpClientPlugin` instance and pass it as a ChatPrompt plugin in the second argument array: `new ChatPrompt({ ... }, [new McpClientPlugin({ logger })])`. The plugin registers itself under the name `'mcpClient'`. [github.com/mic - Network accessline 10
2. Connect to MCP servers using `.usePlugin('mcpClient', { url })` chained on the ChatPrompt. Each call adds one server connection. The URL must point to the server's MCP endpoint (e.g., `http://localhost:3978/mcp`). [github.com/microsoft/t - Network accessline 10
2. Connect to MCP servers using `.usePlugin('mcpClient', { url })` chained on the ChatPrompt. Each call adds one server connection. The URL must point to the server's MCP endpoint (e.g., `http://localhost:3978/mcp`). [github.com/microsoft/t - Network accessline 11
3. Connect to multiple MCP servers by chaining multiple `.usePlugin('mcpClient', { url })` calls. Each server's tools are merged and made available to the LLM as callable functions. [github.com/microsoft/teams.ts](https://github.com/microso - Network accessline 11
3. Connect to multiple MCP servers by chaining multiple `.usePlugin('mcpClient', { url })` calls. Each server's tools are merged and made available to the LLM as callable functions. [github.com/microsoft/teams.ts](https://github.com/microso - Network accessline 12
4. Set transport options via `params.transport`: `'sse'` (default) for Server-Sent Events or `'streamable-http'` for HTTP-based streaming. Match the transport to what the remote MCP server supports. [spec.modelcontextprotocol.io -- Transpor - Network accessline 12
4. Set transport options via `params.transport`: `'sse'` (default) for Server-Sent Events or `'streamable-http'` for HTTP-based streaming. Match the transport to what the remote MCP server supports. [spec.modelcontextprotocol.io -- Transpor - Network accessline 13
5. Use `params.refetchTimeoutMs` to control how often tools are re-fetched from the server. Set this when MCP servers may add or remove tools dynamically. Default behavior fetches tools once at connection. [github.com/microsoft/teams.ts](ht - Network accessline 13
5. Use `params.refetchTimeoutMs` to control how often tools are re-fetched from the server. Set this when MCP servers may add or remove tools dynamically. Default behavior fetches tools once at connection. [github.com/microsoft/teams.ts](ht - Network accessline 14
6. Pass custom headers for authentication via `params.headers`. For Azure Functions-hosted MCP servers, include `'x-functions-key'` with the function key. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 14
6. Pass custom headers for authentication via `params.headers`. For Azure Functions-hosted MCP servers, include `'x-functions-key'` with the function key. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 15
7. Install the required packages: `@microsoft/teams.mcpclient`, `@modelcontextprotocol/sdk`, plus `@microsoft/teams.ai` and `@microsoft/teams.openai` for the ChatPrompt and model. [github.com/microsoft/teams.ts](https://github.com/microsoft - Network accessline 15
7. Install the required packages: `@microsoft/teams.mcpclient`, `@modelcontextprotocol/sdk`, plus `@microsoft/teams.ai` and `@microsoft/teams.openai` for the ChatPrompt and model. [github.com/microsoft/teams.ts](https://github.com/microsoft - Network accessline 16
8. Tools from MCP servers are automatically available to the LLM during `prompt.send()`. The LLM sees them as callable functions alongside any locally defined `.function()` tools. No extra configuration is needed. [github.com/microsoft/team - Network accessline 16
8. Tools from MCP servers are automatically available to the LLM during `prompt.send()`. The LLM sees them as callable functions alongside any locally defined `.function()` tools. No extra configuration is needed. [github.com/microsoft/team - Network accessline 17
9. MCP client connections are established lazily on the first `prompt.send()` call, not at construction time. Ensure the MCP servers are running before the bot processes its first message. [github.com/microsoft/teams.ts](https://github.com/ - Network accessline 17
9. MCP client connections are established lazily on the first `prompt.send()` call, not at construction time. Ensure the MCP servers are running before the bot processes its first message. [github.com/microsoft/teams.ts](https://github.com/ - Network accessline 18
10. Handle connection failures gracefully. If an MCP server is unreachable, the tool list for that server will be empty and the LLM will not be able to invoke those tools. Log connection errors for debugging. [github.com/microsoft/teams.ts] - Network accessline 18
10. Handle connection failures gracefully. If an MCP server is unreachable, the tool list for that server will be empty and the LLM will not be able to invoke those tools. Log connection errors for debugging. [github.com/microsoft/teams.ts] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Network accessline 46
// Connect to an MCP server -- tools are auto-discovered .usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', - Network accessline 46
// Connect to an MCP server -- tools are auto-discovered .usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', - Network accessline 47
.usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', }); - Network accessline 47
.usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', }); - Network accessline 48
url: 'http://localhost:3978/mcp', - Network accessline 48
url: 'http://localhost:3978/mcp', - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Network accessline 91
// Local MCP server (default SSE transport) .usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', - Network accessline 91
// Local MCP server (default SSE transport) .usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', - Network accessline 92
.usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', }) - Network accessline 92
.usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', }) - Network accessline 93
url: 'http://localhost:3978/mcp', - Network accessline 93
url: 'http://localhost:3978/mcp', - Network accessline 95
// Remote Azure Functions MCP server with auth header .usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Network accessline 95
// Remote Azure Functions MCP server with auth header .usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Network accessline 96
.usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', params: { - Network accessline 96
.usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', params: { - Network accessline 97
url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Network accessline 97
url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Network accessline 104
// Another server using streamable-http transport .usePlugin('mcpClient', { url: 'https://search-mcp.example.com/mcp', - Network accessline 104
// Another server using streamable-http transport .usePlugin('mcpClient', { url: 'https://search-mcp.example.com/mcp', - Network accessline 105
.usePlugin('mcpClient', { url: 'https://search-mcp.example.com/mcp', params: { - Network accessline 105
.usePlugin('mcpClient', { url: 'https://search-mcp.example.com/mcp', params: { - Network accessline 106
url: 'https://search-mcp.example.com/mcp', - Network accessline 106
url: 'https://search-mcp.example.com/mcp', - Access to secretsline 139
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Network accessline 150
// Remote tools from MCP server .usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', - Network accessline 150
// Remote tools from MCP server .usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', - Network accessline 151
.usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', }) - Network accessline 151
.usePlugin('mcpClient', { url: 'http://localhost:3978/mcp', }) - Network accessline 152
url: 'http://localhost:3978/mcp', - Network accessline 152
url: 'http://localhost:3978/mcp', - Network accessline 176
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 176
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 177
- [@microsoft/teams.mcpclient npm](https://www.npmjs.com/package/@microsoft/teams.mcpclient) - Network accessline 177
- [@microsoft/teams.mcpclient npm](https://www.npmjs.com/package/@microsoft/teams.mcpclient) - Network accessline 178
- [MCP Protocol Specification -- Transports](https://spec.modelcontextprotocol.io/specification/basic/transports/) - Network accessline 178
- [MCP Protocol Specification -- Transports](https://spec.modelcontextprotocol.io/specification/basic/transports/) - Network accessline 179
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction) - Network accessline 179
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/mcp.expose-chatprompt-tools-ts.md
- Network accessline 9
1. Call `mcpPlugin.use(prompt)` to expose all functions defined on a `ChatPrompt` instance as MCP tools. Each `.function()` on the prompt becomes a discoverable, callable MCP tool. [github.com/microsoft/teams.ts](https://github.com/microsof - Network accessline 9
1. Call `mcpPlugin.use(prompt)` to expose all functions defined on a `ChatPrompt` instance as MCP tools. Each `.function()` on the prompt becomes a discoverable, callable MCP tool. [github.com/microsoft/teams.ts](https://github.com/microsof - Network accessline 10
2. The `mcpPlugin.use(prompt)` call must happen after all `.function()` definitions on the prompt. Functions added after `.use()` are not automatically exposed. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 10
2. The `mcpPlugin.use(prompt)` call must happen after all `.function()` definitions on the prompt. Functions added after `.use()` are not automatically exposed. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 11
3. Function names on the ChatPrompt become MCP tool names. Function descriptions become MCP tool descriptions. JSON Schema parameter definitions are translated to the MCP tool schema. [github.com/microsoft/teams.ts](https://github.com/micro - Network accessline 11
3. Function names on the ChatPrompt become MCP tool names. Function descriptions become MCP tool descriptions. JSON Schema parameter definitions are translated to the MCP tool schema. [github.com/microsoft/teams.ts](https://github.com/micro - Network accessline 12
4. You can combine `mcpPlugin.use(prompt)` with direct `.tool()` definitions on the same McpPlugin. Both sets of tools are exposed at the `/mcp` endpoint. Ensure names are unique across both. [github.com/microsoft/teams.ts](https://github.c - Network accessline 12
4. You can combine `mcpPlugin.use(prompt)` with direct `.tool()` definitions on the same McpPlugin. Both sets of tools are exposed at the `/mcp` endpoint. Ensure names are unique across both. [github.com/microsoft/teams.ts](https://github.c - Network accessline 13
5. Use `mcpPlugin.use(prompt)` when you want external systems to call the same tools your LLM uses internally. Use direct `.tool()` when you need MCP-specific features like `authInfo` or custom return formats that differ from function calli - Network accessline 13
5. Use `mcpPlugin.use(prompt)` when you want external systems to call the same tools your LLM uses internally. Use direct `.tool()` when you need MCP-specific features like `authInfo` or custom return formats that differ from function calli - Network accessline 14
6. Functions exposed via `.use(prompt)` do not have MCP tool hints (`readOnlyHint`, `idempotentHint`). If you need hints, define the tool directly with `.tool()` instead of relying on the bridge. [github.com/microsoft/teams.ts](https://gith - Network accessline 14
6. Functions exposed via `.use(prompt)` do not have MCP tool hints (`readOnlyHint`, `idempotentHint`). If you need hints, define the tool directly with `.tool()` instead of relying on the bridge. [github.com/microsoft/teams.ts](https://gith - Network accessline 15
7. The prompt's function handler receives only the typed parameters object, not the MCP `authInfo` context. If you need caller validation, define the tool directly with `.tool()` which provides `authInfo`. [github.com/microsoft/teams.ts](ht - Network accessline 15
7. The prompt's function handler receives only the typed parameters object, not the MCP `authInfo` context. If you need caller validation, define the tool directly with `.tool()` which provides `authInfo`. [github.com/microsoft/teams.ts](ht - Network accessline 16
8. Install the same packages required for both MCP server and AI: `@microsoft/teams.mcp`, `@modelcontextprotocol/sdk`, `zod`, `@microsoft/teams.ai`, and `@microsoft/teams.openai`. [github.com/microsoft/teams.ts](https://github.com/microsoft - Network accessline 16
8. Install the same packages required for both MCP server and AI: `@microsoft/teams.mcp`, `@modelcontextprotocol/sdk`, `zod`, `@microsoft/teams.ai`, and `@microsoft/teams.openai`. [github.com/microsoft/teams.ts](https://github.com/microsoft - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 76
app.start(3978); // MCP tools "getTime" and "getWeather" available at http://localhost:3978/mcp - Network accessline 76
app.start(3978); // MCP tools "getTime" and "getWeather" available at http://localhost:3978/mcp - Network accessline 77
// MCP tools "getTime" and "getWeather" available at http://localhost:3978/mcp - Network accessline 77
// MCP tools "getTime" and "getWeather" available at http://localhost:3978/mcp - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Network accessline 196
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 196
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 197
- [@microsoft/teams.mcp npm](https://www.npmjs.com/package/@microsoft/teams.mcp) - Network accessline 197
- [@microsoft/teams.mcp npm](https://www.npmjs.com/package/@microsoft/teams.mcp) - Network accessline 198
- [MCP Protocol Specification -- Tools](https://spec.modelcontextprotocol.io/specification/server/tools/) - Network accessline 198
- [MCP Protocol Specification -- Tools](https://spec.modelcontextprotocol.io/specification/server/tools/) - Network accessline 199
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction) - Network accessline 199
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/mcp.security-ts.md
- Network accessline 9
1. Always check the `authInfo` parameter in tool handlers for tools that modify state or access sensitive data. The `authInfo` object contains caller identity information provided by the MCP transport layer. Reject requests where `authInfo` - Network accessline 9
1. Always check the `authInfo` parameter in tool handlers for tools that modify state or access sensitive data. The `authInfo` object contains caller identity information provided by the MCP transport layer. Reject requests where `authInfo` - Network accessline 10
2. Validate all tool inputs using zod schemas. The `.tool()` API validates parameters before the handler runs, but add additional business-logic validation (e.g., string length limits, allowed values, format checks) inside the handler. [zod - Network accessline 10
2. Validate all tool inputs using zod schemas. The `.tool()` API validates parameters before the handler runs, but add additional business-logic validation (e.g., string length limits, allowed values, format checks) inside the handler. [zod - Network accessline 11
3. Apply the principle of least privilege to tool permissions. Only expose tools that external callers genuinely need. Internal-only functions should remain on the ChatPrompt without being bridged to MCP via `mcpPlugin.use(prompt)`. [spec.m - Network accessline 11
3. Apply the principle of least privilege to tool permissions. Only expose tools that external callers genuinely need. Internal-only functions should remain on the ChatPrompt without being bridged to MCP via `mcpPlugin.use(prompt)`. [spec.m - Network accessline 12
4. Require HTTPS for production MCP endpoints. SSE and streamable-http transports transmit tool calls and responses in cleartext over HTTP. Use TLS termination (Azure App Service, reverse proxy, or load balancer) to encrypt traffic. [spec.m - Network accessline 12
4. Require HTTPS for production MCP endpoints. SSE and streamable-http transports transmit tool calls and responses in cleartext over HTTP. Use TLS termination (Azure App Service, reverse proxy, or load balancer) to encrypt traffic. [spec.m - Network accessline 13
5. For Azure Functions-hosted MCP servers, require a function key via the `x-functions-key` header. MCP clients pass this in `params.headers`. Without it, the endpoint is publicly accessible. [learn.microsoft.com -- Azure Functions auth](ht - Network accessline 13
5. For Azure Functions-hosted MCP servers, require a function key via the `x-functions-key` header. MCP clients pass this in `params.headers`. Without it, the endpoint is publicly accessible. [learn.microsoft.com -- Azure Functions auth](ht - Network accessline 14
6. Rate-limit MCP tool invocations to prevent abuse. Track call counts per caller (using `authInfo`) and return an error response when limits are exceeded. The MCP protocol does not enforce rate limits; you must implement them. [spec.modelc - Network accessline 14
6. Rate-limit MCP tool invocations to prevent abuse. Track call counts per caller (using `authInfo`) and return an error response when limits are exceeded. The MCP protocol does not enforce rate limits; you must implement them. [spec.modelc - Network accessline 15
7. Sanitize tool output before returning it. If tool results include user-generated content or database values, escape or validate them to prevent injection attacks in downstream consumers. [spec.modelcontextprotocol.io -- Security](https:/ - Network accessline 15
7. Sanitize tool output before returning it. If tool results include user-generated content or database values, escape or validate them to prevent injection attacks in downstream consumers. [spec.modelcontextprotocol.io -- Security](https:/ - Network accessline 16
8. Log all tool invocations with caller identity, tool name, parameters (redacting secrets), and result status. Audit logs are critical for detecting misuse and debugging authorization failures. [spec.modelcontextprotocol.io -- Security](ht - Network accessline 16
8. Log all tool invocations with caller identity, tool name, parameters (redacting secrets), and result status. Audit logs are critical for detecting misuse and debugging authorization failures. [spec.modelcontextprotocol.io -- Security](ht - Network accessline 17
9. Do not embed secrets (API keys, connection strings) in tool schemas or descriptions. These are exposed to MCP clients during tool discovery. Keep secrets in environment variables and access them only inside handler implementations. [spec - Network accessline 17
9. Do not embed secrets (API keys, connection strings) in tool schemas or descriptions. These are exposed to MCP clients during tool discovery. Keep secrets in environment variables and access them only inside handler implementations. [spec - Network accessline 18
10. When consuming external MCP servers as a client, validate the server's TLS certificate and pin to known server URLs. Do not connect to arbitrary MCP server URLs provided by untrusted input. [spec.modelcontextprotocol.io -- Security](htt - Network accessline 18
10. When consuming external MCP servers as a client, validate the server's TLS certificate and pin to known server URLs. Do not connect to arbitrary MCP server URLs provided by untrusted input. [spec.modelcontextprotocol.io -- Security](htt - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Network accessline 132
// Connect to secure Azure Functions MCP server .usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Network accessline 132
// Connect to secure Azure Functions MCP server .usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Network accessline 133
.usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', params: { - Network accessline 133
.usePlugin('mcpClient', { url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', params: { - Network accessline 134
url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Network accessline 134
url: 'https://my-mcp-server.azurewebsites.net/mcp/sse', - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Network accessline 161
- [MCP Protocol Specification -- Security Considerations](https://spec.modelcontextprotocol.io/specification/basic/security/) - Network accessline 161
- [MCP Protocol Specification -- Security Considerations](https://spec.modelcontextprotocol.io/specification/basic/security/) - Network accessline 162
- [MCP Protocol Specification -- Transports](https://spec.modelcontextprotocol.io/specification/basic/transports/) - Network accessline 162
- [MCP Protocol Specification -- Transports](https://spec.modelcontextprotocol.io/specification/basic/transports/) - Network accessline 163
- [Azure Functions HTTP authorization keys](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger#authorization-keys) - Network accessline 163
- [Azure Functions HTTP authorization keys](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger#authorization-keys) - Network accessline 164
- [Zod documentation](https://zod.dev/) - Network accessline 164
- [Zod documentation](https://zod.dev/) - Network accessline 165
- [OWASP Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) - Network accessline 165
- [OWASP Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) - Network accessline 166
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 166
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/mcp.server-basics-ts.md
- Network accessline 9
1. Create an `McpPlugin` with `new McpPlugin({ name, description })`. The `name` is used as the MCP server identifier and the `description` appears in tool discovery responses. [github.com/microsoft/teams.ts](https://github.com/microsoft/te - Network accessline 9
1. Create an `McpPlugin` with `new McpPlugin({ name, description })`. The `name` is used as the MCP server identifier and the `description` appears in tool discovery responses. [github.com/microsoft/teams.ts](https://github.com/microsoft/te - Network accessline 10
2. Define tools using the fluent `.tool(name, description, schema, hints, handler)` chain API. The schema uses zod objects where each key becomes a tool parameter. All parameters are validated before the handler runs. [github.com/microsoft/ - Network accessline 10
2. Define tools using the fluent `.tool(name, description, schema, hints, handler)` chain API. The schema uses zod objects where each key becomes a tool parameter. All parameters are validated before the handler runs. [github.com/microsoft/ - Network accessline 11
3. Set tool hints to communicate tool behavior to clients: `readOnlyHint: true` signals no side effects, `idempotentHint: true` signals safe retries. Omitting hints defaults to assuming the tool may have side effects. [spec.modelcontextprot - Network accessline 11
3. Set tool hints to communicate tool behavior to clients: `readOnlyHint: true` signals no side effects, `idempotentHint: true` signals safe retries. Omitting hints defaults to assuming the tool may have side effects. [spec.modelcontextprot - Network accessline 12
4. Tool handlers must return `{ content: [{ type: 'text', text: string }] }` format. The `content` array can contain multiple content items. Always return at least one content item. [spec.modelcontextprotocol.io -- Tool results](https://spe - Network accessline 12
4. Tool handlers must return `{ content: [{ type: 'text', text: string }] }` format. The `content` array can contain multiple content items. Always return at least one content item. [spec.modelcontextprotocol.io -- Tool results](https://spe - Network accessline 13
5. Access caller identity via the `authInfo` parameter in tool handlers: `async (params, { authInfo }) => { ... }`. Use this to verify who is calling the tool and enforce authorization. [github.com/microsoft/teams.ts](https://github.com/mic - Network accessline 13
5. Access caller identity via the `authInfo` parameter in tool handlers: `async (params, { authInfo }) => { ... }`. Use this to verify who is calling the tool and enforce authorization. [github.com/microsoft/teams.ts](https://github.com/mic - Network accessline 14
6. Add the `McpPlugin` instance to the `App` constructor's `plugins` array. The plugin registers the `/mcp` HTTP endpoint automatically during app initialization. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 14
6. Add the `McpPlugin` instance to the `App` constructor's `plugins` array. The plugin registers the `/mcp` HTTP endpoint automatically during app initialization. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 15
7. The MCP server endpoint is available at `http://localhost:{PORT}/mcp` using SSE transport by default. Clients connect to this URL to discover and invoke tools. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 15
7. The MCP server endpoint is available at `http://localhost:{PORT}/mcp` using SSE transport by default. Clients connect to this URL to discover and invoke tools. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 16
8. Use descriptive tool names and parameter descriptions. MCP clients (including LLMs) rely on names and descriptions to decide when and how to invoke tools. Vague names lead to misuse. [spec.modelcontextprotocol.io -- Tool naming](https:// - Network accessline 16
8. Use descriptive tool names and parameter descriptions. MCP clients (including LLMs) rely on names and descriptions to decide when and how to invoke tools. Vague names lead to misuse. [spec.modelcontextprotocol.io -- Tool naming](https:// - Network accessline 17
9. Install the required packages: `@microsoft/teams.mcp`, `@modelcontextprotocol/sdk`, and `zod`. All three are needed -- the plugin depends on the SDK and uses zod for schema validation. [github.com/microsoft/teams.ts](https://github.com/m - Network accessline 17
9. Install the required packages: `@microsoft/teams.mcp`, `@modelcontextprotocol/sdk`, and `zod`. All three are needed -- the plugin depends on the SDK and uses zod for schema validation. [github.com/microsoft/teams.ts](https://github.com/m - Network accessline 18
10. Tools are stateless by default. If a tool needs access to bot state or external services, close over them in the handler or pass the `App` instance. Do not store mutable state inside tool definitions. [spec.modelcontextprotocol.io -- Se - Network accessline 18
10. Tools are stateless by default. If a tool needs access to bot state or external services, close over them in the handler or pass the `App` instance. Do not store mutable state inside tool definitions. [spec.modelcontextprotocol.io -- Se - Network accessline 63
app.start(3978); // MCP endpoint: http://localhost:3978/mcp - Network accessline 63
app.start(3978); // MCP endpoint: http://localhost:3978/mcp - Network accessline 64
// MCP endpoint: http://localhost:3978/mcp - Network accessline 64
// MCP endpoint: http://localhost:3978/mcp - Network accessline 187
- [MCP Protocol Specification -- Tools](https://spec.modelcontextprotocol.io/specification/server/tools/) - Network accessline 187
- [MCP Protocol Specification -- Tools](https://spec.modelcontextprotocol.io/specification/server/tools/) - Network accessline 188
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 188
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 189
- [@microsoft/teams.mcp npm](https://www.npmjs.com/package/@microsoft/teams.mcp) - Network accessline 189
- [@microsoft/teams.mcp npm](https://www.npmjs.com/package/@microsoft/teams.mcp) - Network accessline 190
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction) - Network accessline 190
- [Model Context Protocol -- Introduction](https://modelcontextprotocol.io/introduction) - Network accessline 191
- [Zod documentation](https://zod.dev/) - Network accessline 191
- [Zod documentation](https://zod.dev/)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/project.scaffold-files-ts.md
- Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 5
[Credential-related source omitted] - Network accessline 9
1. Every Teams SDK v2 project requires these base dependencies: `@microsoft/teams.api`, `@microsoft/teams.apps`, `@microsoft/teams.cards`, `@microsoft/teams.common`, `@microsoft/teams.dev`. These are always present regardless of features. D - Network accessline 9
1. Every Teams SDK v2 project requires these base dependencies: `@microsoft/teams.api`, `@microsoft/teams.apps`, `@microsoft/teams.cards`, `@microsoft/teams.common`, `@microsoft/teams.dev`. These are always present regardless of features. D - Network accessline 10
2. Feature-specific dependencies must be added based on the selected capabilities: AI/LLM requires `@microsoft/teams.ai` + `@microsoft/teams.openai`; Authentication/Graph requires `@microsoft/teams.graph` + `@microsoft/teams.graph-endpoints - Network accessline 10
2. Feature-specific dependencies must be added based on the selected capabilities: AI/LLM requires `@microsoft/teams.ai` + `@microsoft/teams.openai`; Authentication/Graph requires `@microsoft/teams.graph` + `@microsoft/teams.graph-endpoints - Network accessline 11
3. Standard npm scripts are: `"clean": "npx rimraf ./dist"`, `"build": "npx tsup"`, `"start": "node -r dotenv/config ."`, `"dev": "tsx watch -r dotenv/config src/index.ts"`. The `dev` script uses `tsx` for TypeScript execution with file wat - Network accessline 11
3. Standard npm scripts are: `"clean": "npx rimraf ./dist"`, `"build": "npx tsup"`, `"start": "node -r dotenv/config ."`, `"dev": "tsx watch -r dotenv/config src/index.ts"`. The `dev` script uses `tsx` for TypeScript execution with file wat - Network accessline 12
4. The `tsconfig.json` must use `"module": "NodeNext"`, `"target": "ESNext"`, `"moduleResolution": "NodeNext"`, `"strict": true`, `"outDir": "dist"`, `"rootDir": "src"`, and `"types": ["node"]`. The `include` array targets `"src/**/*.ts"`. - Network accessline 12
4. The `tsconfig.json` must use `"module": "NodeNext"`, `"target": "ESNext"`, `"moduleResolution": "NodeNext"`, `"strict": true`, `"outDir": "dist"`, `"rootDir": "src"`, and `"types": ["node"]`. The `include` array targets `"src/**/*.ts"`. - Network accessline 13
[Credential-related source omitted] - Network accessline 13
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Network accessline 14
6. The `appPackage/` directory must contain `manifest.json`, `color.png` (192x192), and `outline.png` (32x32). This directory is zipped for sideloading. It is not part of the compiled `dist/` output. [learn.microsoft.com -- App package](htt - Network accessline 14
6. The `appPackage/` directory must contain `manifest.json`, `color.png` (192x192), and `outline.png` (32x32). This directory is zipped for sideloading. It is not part of the compiled `dist/` output. [learn.microsoft.com -- App package](htt - Network accessline 15
7. The CLI scaffolding command is `npx @microsoft/teams.cli@latest new typescript <name> --template <template>` where templates include `echo`, `ai`, `lights`, `auth`, etc. However, for full control over output, create files directly rather - Network accessline 15
7. The CLI scaffolding command is `npx @microsoft/teams.cli@latest new typescript <name> --template <template>` where templates include `echo`, `ai`, `lights`, `auth`, etc. However, for full control over output, create files directly rather - Network accessline 16
8. The recommended project structure places the entry point at `src/index.ts` and organizes larger projects into `src/handlers/`, `src/prompts/`, `src/functions/`, `src/cards/`, and `src/services/`. Keep simple bots in a single `src/index.t - Network accessline 16
8. The recommended project structure places the entry point at `src/index.ts` and organizes larger projects into `src/handlers/`, `src/prompts/`, `src/functions/`, `src/cards/`, and `src/services/`. Keep simple bots in a single `src/index.t - Network accessline 17
9. Set `"main": "dist/index"` and `"types": "dist/index"` in `package.json` so the `start` script resolves to the compiled entry point. The `"files": ["dist"]` field restricts published content to the build output. [github.com/microsoft/tea - Network accessline 17
9. Set `"main": "dist/index"` and `"types": "dist/index"` in `package.json` so the `start` script resolves to the compiled entry point. The `"files": ["dist"]` field restricts published content to the build output. [github.com/microsoft/tea - Network accessline 18
10. Run `npx tsc --noEmit` as a build verification gate after creating or modifying source files. This type-checks without producing output. The project must compile cleanly before testing or deploying. [github.com/microsoft/teams.ts](https - Network accessline 18
10. Run `npx tsc --noEmit` as a build verification gate after creating or modifying source files. This type-checks without producing output. The project must compile cleanly before testing or deploying. [github.com/microsoft/teams.ts](https - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Network accessline 90
// tsconfig.json -- standard configuration const tsconfig = { "$schema": "https://json.schemastore.org/tsconfig", - Network accessline 90
// tsconfig.json -- standard configuration const tsconfig = { "$schema": "https://json.schemastore.org/tsconfig", - Network accessline 91
const tsconfig = { "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - Network accessline 91
const tsconfig = { "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - Network accessline 92
"$schema": "https://json.schemastore.org/tsconfig", - Network accessline 92
"$schema": "https://json.schemastore.org/tsconfig", - Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 168
[Credential-related source omitted] - Access to secretsline 168
[Credential-related source omitted] - Network accessline 191
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 191
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 192
- [Teams SDK v2 -- @microsoft/teams.cli](https://github.com/microsoft/teams.ts/tree/main/packages/cli) - Network accessline 192
- [Teams SDK v2 -- @microsoft/teams.cli](https://github.com/microsoft/teams.ts/tree/main/packages/cli) - Network accessline 193
- [Teams SDK v2 -- Package catalog](https://github.com/microsoft/teams.ts#packages) - Network accessline 193
- [Teams SDK v2 -- Package catalog](https://github.com/microsoft/teams.ts#packages) - Network accessline 194
- [Teams: App package structure](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package) - Network accessline 194
- [Teams: App package structure](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package) - Network accessline 195
- [tsup documentation](https://tsup.egoist.dev/) - Network accessline 195
- [tsup documentation](https://tsup.egoist.dev/) - Network accessline 196
- [tsx documentation](https://github.com/privatenumber/tsx) - Network accessline 196
- [tsx documentation](https://github.com/privatenumber/tsx) - Access to secretsline 218
[Credential-related source omitted] - Access to secretsline 218
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/runtime.app-init-ts.md
- Network accessline 9
1. Always import `App` from `@microsoft/teams.apps`, `ConsoleLogger` from `@microsoft/teams.common`, and `DevtoolsPlugin` from `@microsoft/teams.dev` as the minimum bootstrap triple. These three packages are always present in `dependencies` - Network accessline 9
1. Always import `App` from `@microsoft/teams.apps`, `ConsoleLogger` from `@microsoft/teams.common`, and `DevtoolsPlugin` from `@microsoft/teams.dev` as the minimum bootstrap triple. These three packages are always present in `dependencies` - Network accessline 10
[Credential-related source omitted] - Network accessline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Network accessline 11
3. Configure logging with `new ConsoleLogger(name, { level })` where `level` is one of `'error' | 'warn' | 'info' | 'debug' | 'trace'`. Use `pattern: '-azure/msal-node'` to suppress noisy child loggers. Child loggers inherit settings via `l - Network accessline 11
3. Configure logging with `new ConsoleLogger(name, { level })` where `level` is one of `'error' | 'warn' | 'info' | 'debug' | 'trace'`. Use `pattern: '-azure/msal-node'` to suppress noisy child loggers. Child loggers inherit settings via `l - Network accessline 12
4. Register plugins via the `plugins` array in the constructor or dynamically with `app.plugin(instance)`. Every development project should include `DevtoolsPlugin`. Plugin lifecycle follows: register -> `onInit()` -> `onStart({ port })` -> - Network accessline 12
4. Register plugins via the `plugins` array in the constructor or dynamically with `app.plugin(instance)`. Every development project should include `DevtoolsPlugin`. Plugin lifecycle follows: register -> `onInit()` -> `onStart({ port })` -> - Network accessline 13
5. Configure OAuth by adding `oauth: { defaultConnectionName: 'graph' }` to `AppOptions`. This enables `ctx.isSignedIn`, `ctx.signin()`, `ctx.signout()`, and `ctx.userGraph` on every handler context. Requires `clientId`, `clientSecret`, and - Network accessline 13
5. Configure OAuth by adding `oauth: { defaultConnectionName: 'graph' }` to `AppOptions`. This enables `ctx.isSignedIn`, `ctx.signin()`, `ctx.signout()`, and `ctx.userGraph` on every handler context. Requires `clientId`, `clientSecret`, and - Network accessline 14
6. Storage defaults to in-memory. Pass a custom `IStorage` implementation to the `storage` option for persistence across restarts. Use `LocalStorage` from `@microsoft/teams.common` for development with optional LRU eviction via `{ max: N }` - Network accessline 14
6. Storage defaults to in-memory. Pass a custom `IStorage` implementation to the `storage` option for persistence across restarts. Use `LocalStorage` from `@microsoft/teams.common` for development with optional LRU eviction via `{ max: N }` - Network accessline 15
7. Call `app.start(port)` (default `3978`) as the final step. It returns a `Promise` -- always attach `.catch(console.error)` or use `await`. The bot endpoint is `http://localhost:{port}/api/messages` and DevTools UI runs on `{port + 1}`. [ - Network accessline 15
7. Call `app.start(port)` (default `3978`) as the final step. It returns a `Promise` -- always attach `.catch(console.error)` or use `await`. The bot endpoint is `http://localhost:{port}/api/messages` and DevTools UI runs on `{port + 1}`. [ - Network accessline 16
8. Set `skipAuth: true` only during local development without Azure credentials. This disables JWT validation on inbound activities. Never use this in production. [github.com/microsoft/teams.ts -- apps](https://github.com/microsoft/teams.ts - Network accessline 16
8. Set `skipAuth: true` only during local development without Azure credentials. This disables JWT validation on inbound activities. Never use this in production. [github.com/microsoft/teams.ts -- apps](https://github.com/microsoft/teams.ts - Network accessline 17
9. The full `AppOptions` reference includes: `clientId`, `clientSecret`, `tenantId`, `token` (custom token factory), `managedIdentityClientId` (`'system'` or string), `client` (custom HTTP client), `logger` (`ILogger`), `storage` (`IStorage - Network accessline 17
9. The full `AppOptions` reference includes: `clientId`, `clientSecret`, `tenantId`, `token` (custom token factory), `managedIdentityClientId` (`'system'` or string), `client` (custom HTTP client), `logger` (`ILogger`), `storage` (`IStorage - Network accessline 18
10. Use `app.event('start', ...)` for post-listen setup, `app.event('error', ...)` for global error handling, `app.event('signin', ...)` for post-authentication logic, and `app.event('activity', ...)`/`app.event('activity.sent', ...)` for o - Network accessline 18
10. Use `app.event('start', ...)` for post-listen setup, `app.event('error', ...)` for global error handling, `app.event('signin', ...)` for post-authentication logic, and `app.event('activity', ...)`/`app.event('activity.sent', ...)` for o - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Network accessline 140
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 140
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 141
- [Teams SDK v2 -- @microsoft/teams.apps](https://github.com/microsoft/teams.ts/tree/main/packages/apps) - Network accessline 141
- [Teams SDK v2 -- @microsoft/teams.apps](https://github.com/microsoft/teams.ts/tree/main/packages/apps) - Network accessline 142
- [Teams SDK v2 -- @microsoft/teams.common](https://github.com/microsoft/teams.ts/tree/main/packages/common) - Network accessline 142
- [Teams SDK v2 -- @microsoft/teams.common](https://github.com/microsoft/teams.ts/tree/main/packages/common) - Network accessline 143
- [Teams SDK v2 -- @microsoft/teams.dev (DevtoolsPlugin)](https://github.com/microsoft/teams.ts/tree/main/packages/dev) - Network accessline 143
- [Teams SDK v2 -- @microsoft/teams.dev (DevtoolsPlugin)](https://github.com/microsoft/teams.ts/tree/main/packages/dev) - Network accessline 144
- [Azure Bot Service documentation](https://learn.microsoft.com/en-us/azure/bot-service/) - Network accessline 144
- [Azure Bot Service documentation](https://learn.microsoft.com/en-us/azure/bot-service/) - Network accessline 145
- [Teams platform: Build bots](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots) - Network accessline 145
- [Teams platform: Build bots](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/runtime.manifest-ts.md
- Network accessline 9
1. Use schema version `1.20` with `"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json"` and `"manifestVersion": "1.20"`. This is the current stable schema for Teams SDK v2 projects. [learn.micros - Network accessline 9
1. Use schema version `1.20` with `"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json"` and `"manifestVersion": "1.20"`. This is the current stable schema for Teams SDK v2 projects. [learn.micros - Network accessline 9
1. Use schema version `1.20` with `"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json"` and `"manifestVersion": "1.20"`. This is the current stable schema for Teams SDK v2 projects. [learn.micros - Network accessline 10
2. Required top-level fields are: `$schema`, `version`, `manifestVersion`, `id`, `name` (with `short` max 30 chars and `full` max 100 chars), `description` (with `short` max 80 chars and `full` max 4000 chars), `developer` (with `name`, `we - Network accessline 10
2. Required top-level fields are: `$schema`, `version`, `manifestVersion`, `id`, `name` (with `short` max 30 chars and `full` max 100 chars), `description` (with `short` max 80 chars and `full` max 4000 chars), `developer` (with `name`, `we - Network accessline 10
2. Required top-level fields are: `$schema`, `version`, `manifestVersion`, `id`, `name` (with `short` max 30 chars and `full` max 100 chars), `description` (with `short` max 80 chars and `full` max 4000 chars), `developer` (with `name`, `we - Network accessline 11
3. The `bots` array defines bot registrations. Each entry requires `botId` (the Azure Bot ID, typically a placeholder like `${{BOT_ID}}`), `scopes` (array of `"personal"`, `"team"`, `"groupChat"`), and optional flags `isNotificationOnly`, ` - Network accessline 11
3. The `bots` array defines bot registrations. Each entry requires `botId` (the Azure Bot ID, typically a placeholder like `${{BOT_ID}}`), `scopes` (array of `"personal"`, `"team"`, `"groupChat"`), and optional flags `isNotificationOnly`, ` - Network accessline 11
3. The `bots` array defines bot registrations. Each entry requires `botId` (the Azure Bot ID, typically a placeholder like `${{BOT_ID}}`), `scopes` (array of `"personal"`, `"team"`, `"groupChat"`), and optional flags `isNotificationOnly`, ` - Network accessline 12
4. Add `composeExtensions` for message extensions. Each entry needs `botId`, `type` (`"query"` or `"action"`), and a `commands` array. Each command has `id`, `type`, `title`, and `parameters` for query commands or `fetchTask: true` for acti - Network accessline 12
4. Add `composeExtensions` for message extensions. Each entry needs `botId`, `type` (`"query"` or `"action"`), and a `commands` array. Each command has `id`, `type`, `title`, and `parameters` for query commands or `fetchTask: true` for acti - Network accessline 12
4. Add `composeExtensions` for message extensions. Each entry needs `botId`, `type` (`"query"` or `"action"`), and a `commands` array. Each command has `id`, `type`, `title`, and `parameters` for query commands or `fetchTask: true` for acti - Network accessline 13
5. The `validDomains` array lists domains the bot is allowed to open in web views and task modules. Always include `"*.botframework.com"` and your bot's domain. Omitting a domain causes blank task modules. [learn.microsoft.com -- Valid doma - Network accessline 13
5. The `validDomains` array lists domains the bot is allowed to open in web views and task modules. Always include `"*.botframework.com"` and your bot's domain. Omitting a domain causes blank task modules. [learn.microsoft.com -- Valid doma - Network accessline 13
5. The `validDomains` array lists domains the bot is allowed to open in web views and task modules. Always include `"*.botframework.com"` and your bot's domain. Omitting a domain causes blank task modules. [learn.microsoft.com -- Valid doma - Network accessline 14
6. The `webApplicationInfo` section provides SSO configuration with `id` (the bot/app ID) and `resource` (the application ID URI, typically `"api://botid-${{BOT_ID}}"`). Required for OAuth/SSO flows. [learn.microsoft.com -- webApplicationIn - Network accessline 14
6. The `webApplicationInfo` section provides SSO configuration with `id` (the bot/app ID) and `resource` (the application ID URI, typically `"api://botid-${{BOT_ID}}"`). Required for OAuth/SSO flows. [learn.microsoft.com -- webApplicationIn - Network accessline 14
6. The `webApplicationInfo` section provides SSO configuration with `id` (the bot/app ID) and `resource` (the application ID URI, typically `"api://botid-${{BOT_ID}}"`). Required for OAuth/SSO flows. [learn.microsoft.com -- webApplicationIn - Network accessline 15
7. Icons must be: `color.png` at exactly 192x192 pixels and `outline.png` at exactly 32x32 pixels with a transparent background. Both are PNG format. Place them in the `appPackage/` directory alongside `manifest.json`. [learn.microsoft.com - Network accessline 15
7. Icons must be: `color.png` at exactly 192x192 pixels and `outline.png` at exactly 32x32 pixels with a transparent background. Both are PNG format. Place them in the `appPackage/` directory alongside `manifest.json`. [learn.microsoft.com - Network accessline 15
7. Icons must be: `color.png` at exactly 192x192 pixels and `outline.png` at exactly 32x32 pixels with a transparent background. Both are PNG format. Place them in the `appPackage/` directory alongside `manifest.json`. [learn.microsoft.com - Network accessline 16
8. Package the app as a `.zip` file containing `manifest.json`, `color.png`, and `outline.png` from the `appPackage/` directory. The zip must contain these files at the root level (not nested in subdirectories). Use `atk package` to generat - Network accessline 16
8. Package the app as a `.zip` file containing `manifest.json`, `color.png`, and `outline.png` from the `appPackage/` directory. The zip must contain these files at the root level (not nested in subdirectories). Use `atk package` to generat - Network accessline 16
8. Package the app as a `.zip` file containing `manifest.json`, `color.png`, and `outline.png` from the `appPackage/` directory. The zip must contain these files at the root level (not nested in subdirectories). Use `atk package` to generat - Network accessline 17
9. Use placeholder variables like `${{TEAMS_APP_ID}}`, `${{BOT_ID}}`, and `${{BOT_DOMAIN}}` in the manifest for values that change between environments. The M365 Agents Toolkit resolves these during packaging. For manual deployment, replace - Network accessline 17
9. Use placeholder variables like `${{TEAMS_APP_ID}}`, `${{BOT_ID}}`, and `${{BOT_DOMAIN}}` in the manifest for values that change between environments. The M365 Agents Toolkit resolves these during packaging. For manual deployment, replace - Network accessline 17
9. Use placeholder variables like `${{TEAMS_APP_ID}}`, `${{BOT_ID}}`, and `${{BOT_DOMAIN}}` in the manifest for values that change between environments. The M365 Agents Toolkit resolves these during packaging. For manual deployment, replace - Network accessline 18
10. Add `staticTabs` for personal-scope tab experiences. The two default entries (`conversations` and `about`) are recommended for all bots. Add `commands` inside bot entries for slash-command discoverability in the Teams compose box. [lear - Network accessline 18
10. Add `staticTabs` for personal-scope tab experiences. The two default entries (`conversations` and `about`) are recommended for all bots. Add `commands` inside bot entries for slash-command discoverability in the Teams compose box. [lear - Network accessline 18
10. Add `staticTabs` for personal-scope tab experiences. The two default entries (`conversations` and `about`) are recommended for all bots. Add `commands` inside bot entries for slash-command discoverability in the Teams compose box. [lear - Network accessline 25
// appPackage/manifest.json const manifest = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 25
// appPackage/manifest.json const manifest = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 25
// appPackage/manifest.json const manifest = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 26
const manifest = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", "version": "1.0.0", - Network accessline 26
const manifest = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", "version": "1.0.0", - Network accessline 26
const manifest = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", "version": "1.0.0", - Network accessline 27
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 27
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 27
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 36
"name": "Contoso", "mpnId": "", "websiteUrl": "https://example.com", - Network accessline 36
"name": "Contoso", "mpnId": "", "websiteUrl": "https://example.com", - Network accessline 36
"name": "Contoso", "mpnId": "", "websiteUrl": "https://example.com", - Network accessline 37
"mpnId": "", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com/privacy", - Network accessline 37
"mpnId": "", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com/privacy", - Network accessline 37
"mpnId": "", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com/privacy", - Network accessline 38
"websiteUrl": "https://example.com", - Network accessline 38
"websiteUrl": "https://example.com", - Network accessline 38
"websiteUrl": "https://example.com", - Network accessline 39
"privacyUrl": "https://example.com/privacy", - Network accessline 39
"privacyUrl": "https://example.com/privacy", - Network accessline 39
"privacyUrl": "https://example.com/privacy", - Network accessline 40
"termsOfUseUrl": "https://example.com/terms" - Network accessline 40
"termsOfUseUrl": "https://example.com/terms" - Network accessline 40
"termsOfUseUrl": "https://example.com/terms" - Network accessline 76
// appPackage/manifest.json -- adding composeExtensions for a search command const manifestWithExtensions = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 76
// appPackage/manifest.json -- adding composeExtensions for a search command const manifestWithExtensions = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 76
// appPackage/manifest.json -- adding composeExtensions for a search command const manifestWithExtensions = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 77
const manifestWithExtensions = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", "version": "1.0.0", - Network accessline 77
const manifestWithExtensions = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", "version": "1.0.0", - Network accessline 77
const manifestWithExtensions = { "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", "version": "1.0.0", - Network accessline 78
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 78
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 78
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", - Network accessline 87
"name": "Contoso", "mpnId": "", "websiteUrl": "https://example.com", - Network accessline 87
"name": "Contoso", "mpnId": "", "websiteUrl": "https://example.com", - Network accessline 87
"name": "Contoso", "mpnId": "", "websiteUrl": "https://example.com", - Network accessline 88
"mpnId": "", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com/privacy", - Network accessline 88
"mpnId": "", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com/privacy", - Network accessline 88
"mpnId": "", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com/privacy", - Network accessline 89
"websiteUrl": "https://example.com", - Network accessline 89
"websiteUrl": "https://example.com", - Network accessline 89
"websiteUrl": "https://example.com", - Network accessline 90
"privacyUrl": "https://example.com/privacy", - Network accessline 90
"privacyUrl": "https://example.com/privacy", - Network accessline 90
"privacyUrl": "https://example.com/privacy", - Network accessline 91
"termsOfUseUrl": "https://example.com/terms" - Network accessline 91
"termsOfUseUrl": "https://example.com/terms" - Network accessline 91
"termsOfUseUrl": "https://example.com/terms" - Network accessline 182
- [Teams manifest schema reference](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema) - Network accessline 182
- [Teams manifest schema reference](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema) - Network accessline 182
- [Teams manifest schema reference](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema) - Network accessline 183
- [Teams app package structure](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package) - Network accessline 183
- [Teams app package structure](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package) - Network accessline 183
- [Teams app package structure](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package) - Network accessline 184
- [Teams: Bots in manifest](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#bots) - Network accessline 184
- [Teams: Bots in manifest](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#bots) - Network accessline 184
- [Teams: Bots in manifest](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#bots) - Network accessline 185
- [Teams: Compose extensions](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensions) - Network accessline 185
- [Teams: Compose extensions](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensions) - Network accessline 185
- [Teams: Compose extensions](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#composeextensions) - Network accessline 186
- [Teams: App icons guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package#app-icons) - Network accessline 186
- [Teams: App icons guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package#app-icons) - Network accessline 186
- [Teams: App icons guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/apps-package#app-icons) - Network accessline 187
- [Teams: Valid domains](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#validdomains) - Network accessline 187
- [Teams: Valid domains](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#validdomains) - Network accessline 187
- [Teams: Valid domains](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#validdomains)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/runtime.proactive-messaging-ts.md
- Network accessline 9
1. Proactive messaging requires a stored `conversationId`. Capture it during the `install.add` event from `activity.conversation.id` and associate it with a user identifier such as `activity.from.aadObjectId`. Without a stored conversation - Network accessline 9
1. Proactive messaging requires a stored `conversationId`. Capture it during the `install.add` event from `activity.conversation.id` and associate it with a user identifier such as `activity.from.aadObjectId`. Without a stored conversation - Network accessline 10
2. Send proactive messages with `app.send(conversationId, message)` where `message` is a string or activity object. This method is available on the `App` instance directly -- it does not require an active activity context. [github.com/micro - Network accessline 10
2. Send proactive messages with `app.send(conversationId, message)` where `message` is a string or activity object. This method is available on the `App` instance directly -- it does not require an active activity context. [github.com/micro - Network accessline 11
3. Store conversation IDs persistently for production use. In-memory maps (e.g., `new Map<string, string>()`) work for development but are lost on restart. Use the App's `storage` (IStorage) or an external database for production deployment - Network accessline 11
3. Store conversation IDs persistently for production use. In-memory maps (e.g., `new Map<string, string>()`) work for development but are lost on restart. Use the App's `storage` (IStorage) or an external database for production deployment - Network accessline 12
4. The `install.add` event fires when the bot is installed to a personal chat, team channel, or group chat. This is the canonical place to capture conversation IDs. Also consider capturing from any `activity.conversation.id` in message hand - Network accessline 12
4. The `install.add` event fires when the bot is installed to a personal chat, team channel, or group chat. This is the canonical place to capture conversation IDs. Also consider capturing from any `activity.conversation.id` in message hand - Network accessline 13
5. For channel-scoped proactive messages, the `conversationId` format differs from personal chat. Channel conversation IDs include the channel thread ID. Store them separately and send to the correct one based on context. [learn.microsoft.c - Network accessline 13
5. For channel-scoped proactive messages, the `conversationId` format differs from personal chat. Channel conversation IDs include the channel thread ID. Store them separately and send to the correct one based on context. [learn.microsoft.c - Network accessline 14
6. Proactive messages can be triggered by timers (`setTimeout`, `setInterval`, cron jobs), webhooks (Express routes), external events (queue messages, database triggers), or scheduled tasks. The trigger mechanism is independent of the Teams - Network accessline 14
6. Proactive messages can be triggered by timers (`setTimeout`, `setInterval`, cron jobs), webhooks (Express routes), external events (queue messages, database triggers), or scheduled tasks. The trigger mechanism is independent of the Teams - Network accessline 15
7. The `ctx.ref` property on any handler context contains a `ConversationReference` that can also be stored for proactive messaging. This provides richer context (serviceUrl, channelId, bot info) beyond just the conversation ID. [github.com - Network accessline 15
7. The `ctx.ref` property on any handler context contains a `ConversationReference` that can also be stored for proactive messaging. This provides richer context (serviceUrl, channelId, bot info) beyond just the conversation ID. [github.com - Network accessline 16
8. Proactive messages require valid bot credentials (`clientId`, `clientSecret`, `tenantId`) to authenticate with the Bot Framework. The `skipAuth: true` option works only with DevTools, not for proactive messages to real Teams clients. [le - Network accessline 16
8. Proactive messages require valid bot credentials (`clientId`, `clientSecret`, `tenantId`) to authenticate with the Bot Framework. The `skipAuth: true` option works only with DevTools, not for proactive messages to real Teams clients. [le - Network accessline 17
9. Rate limits apply to proactive messaging. Teams throttles bots that send too many messages too quickly. Implement exponential backoff and respect HTTP 429 responses. Batch notifications and add delays between sends for large user bases. - Network accessline 17
9. Rate limits apply to proactive messaging. Teams throttles bots that send too many messages too quickly. Implement exponential backoff and respect HTTP 429 responses. Batch notifications and add delays between sends for large user bases. - Network accessline 18
10. Handle the `install.remove` event to clean up stored conversation IDs. When a user uninstalls the bot, proactive messages to their conversation ID will fail. Remove stale entries to avoid unnecessary API calls and errors. [github.com/mi - Network accessline 18
10. Handle the `install.remove` event to clean up stored conversation IDs. When a user uninstalls the bot, proactive messages to their conversation ID will fail. Remove stale entries to avoid unnecessary API calls and errors. [github.com/mi - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 134
[Credential-related source omitted] - Access to secretsline 134
[Credential-related source omitted] - Network accessline 204
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 204
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 205
- [Teams: Send proactive messages](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages) - Network accessline 205
- [Teams: Send proactive messages](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages) - Network accessline 206
- [Teams: Bot rate limiting](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/rate-limit) - Network accessline 206
- [Teams: Bot rate limiting](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/rate-limit) - Network accessline 207
- [Bot Framework: Conversation reference](https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference) - Network accessline 207
- [Bot Framework: Conversation reference](https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference) - Network accessline 208
- [Teams: Conversation events (install)](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/subscribe-to-conversation-events) - Network accessline 208
- [Teams: Conversation events (install)](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/subscribe-to-conversation-events)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/runtime.routing-handlers-ts.md
- Network accessline 9
1. Use `app.on(routeName, handler)` for activity-based routes and invoke routes. The handler receives an activity context (`ctx`) with properties and methods for that activity type. Always destructure only what you need. [github.com/microso - Network accessline 9
1. Use `app.on(routeName, handler)` for activity-based routes and invoke routes. The handler receives an activity context (`ctx`) with properties and methods for that activity type. Always destructure only what you need. [github.com/microso - Network accessline 10
2. Use `app.message(pattern, handler)` for pattern-matched message handling. The `pattern` argument accepts a `string` (exact match) or `RegExp`. String patterns match the full message text; regex patterns test against `activity.text`. Mult - Network accessline 10
2. Use `app.message(pattern, handler)` for pattern-matched message handling. The `pattern` argument accepts a `string` (exact match) or `RegExp`. String patterns match the full message text; regex patterns test against `activity.text`. Mult - Network accessline 11
3. Register middleware with `app.use(handler)`. Middleware runs before all route handlers for every activity. Call `ctx.next()` inside middleware to pass control to the next middleware or the matched route handler. Omitting `ctx.next()` sho - Network accessline 11
3. Register middleware with `app.use(handler)`. Middleware runs before all route handlers for every activity. Call `ctx.next()` inside middleware to pass control to the next middleware or the matched route handler. Omitting `ctx.next()` sho - Network accessline 12
4. Activity routes include: `message`, `conversationUpdate`, `typing`, `messageUpdate`, `messageDelete`, `event`, `endOfConversation`, `contactRelationUpdate`, `mention`, and `activity` (catch-all fallback). The `activity` route fires only - Network accessline 12
4. Activity routes include: `message`, `conversationUpdate`, `typing`, `messageUpdate`, `messageDelete`, `event`, `endOfConversation`, `contactRelationUpdate`, `mention`, and `activity` (catch-all fallback). The `activity` route fires only - Network accessline 13
5. Install routes are `install.add` (bot installed to conversation/team) and `install.remove` (bot uninstalled). Use `install.add` to send welcome messages and store conversation IDs for proactive messaging. [github.com/microsoft/teams.ts]( - Network accessline 13
5. Install routes are `install.add` (bot installed to conversation/team) and `install.remove` (bot uninstalled). Use `install.add` to send welcome messages and store conversation IDs for proactive messaging. [github.com/microsoft/teams.ts]( - Network accessline 14
6. Invoke routes map to Teams invoke names: `dialog.open` (`task/fetch`), `dialog.submit` (`task/submit`), `card.action` (`adaptiveCard/action`), `message.ext.query` (`composeExtension/query`), `message.ext.select-item` (`composeExtension/s - Network accessline 14
6. Invoke routes map to Teams invoke names: `dialog.open` (`task/fetch`), `dialog.submit` (`task/submit`), `card.action` (`adaptiveCard/action`), `message.ext.query` (`composeExtension/query`), `message.ext.select-item` (`composeExtension/s - Network accessline 15
7. Additional invoke routes: `config.open` (`config/fetch`), `config.submit` (`config/submit`), `tab.open` (`tab/fetch`), `tab.submit` (`tab/submit`), `signin.token-exchange` (`signin/tokenExchange`), `signin.verify-state` (`signin/verifySt - Network accessline 15
7. Additional invoke routes: `config.open` (`config/fetch`), `config.submit` (`config/submit`), `tab.open` (`tab/fetch`), `tab.submit` (`tab/submit`), `signin.token-exchange` (`signin/tokenExchange`), `signin.verify-state` (`signin/verifySt - Network accessline 16
8. App-level events (registered with `app.event()`, not `app.on()`) include: `start` (server listening), `signin` (user completed OAuth), `error` (unhandled error), `activity` (every inbound activity), and `activity.sent` (every outbound ac - Network accessline 16
8. App-level events (registered with `app.event()`, not `app.on()`) include: `start` (server listening), `signin` (user completed OAuth), `error` (unhandled error), `activity` (every inbound activity), and `activity.sent` (every outbound ac - Network accessline 17
9. Feedback handling uses `app.on('message.submit.feedback', handler)` where `activity.value.actionValue.reaction` is `'like'` or `'dislike'` and `activity.value.actionValue.feedback` contains optional text. Return `{ status: 200 }` from th - Network accessline 17
9. Feedback handling uses `app.on('message.submit.feedback', handler)` where `activity.value.actionValue.reaction` is `'like'` or `'dislike'` and `activity.value.actionValue.feedback` contains optional text. Return `{ status: 200 }` from th - Network accessline 18
10. Register all handlers and middleware before calling `app.start()`. The route matching order is: middleware (in registration order) -> `app.message()` pattern matches (first match wins) -> `app.on()` specific routes -> `app.on('activity' - Network accessline 18
10. Register all handlers and middleware before calling `app.start()`. The route matching order is: middleware (in registration order) -> `app.message()` pattern matches (first match wins) -> `app.on()` specific routes -> `app.on('activity' - Access to secretsline 147
[Credential-related source omitted] - Access to secretsline 147
[Credential-related source omitted] - Network accessline 196
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 196
- [Teams SDK v2 GitHub repository](https://github.com/microsoft/teams.ts) - Network accessline 197
- [Teams SDK v2 -- @microsoft/teams.apps](https://github.com/microsoft/teams.ts/tree/main/packages/apps) - Network accessline 197
- [Teams SDK v2 -- @microsoft/teams.apps](https://github.com/microsoft/teams.ts/tree/main/packages/apps) - Network accessline 198
- [Teams platform: Bot activity handlers](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/bot-basics) - Network accessline 198
- [Teams platform: Bot activity handlers](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/bot-basics) - Network accessline 199
- [Teams platform: Task modules and cards](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/what-are-task-modules) - Network accessline 199
- [Teams platform: Task modules and cards](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/what-are-task-modules) - Network accessline 200
- [Teams platform: Message extensions](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions) - Network accessline 200
- [Teams platform: Message extensions](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions) - Network accessline 201
- [Teams platform: Conversation events](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/subscribe-to-conversation-events) - Network accessline 201
- [Teams platform: Conversation events](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/subscribe-to-conversation-events)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/state.storage-patterns-ts.md
- Network accessline 9
1. Use the `IStorage` interface (`get`/`set`/`delete`) for all state management. It supports both synchronous and async implementations, so custom backends (Redis, Cosmos DB) can return Promises. [github.com/microsoft/teams.ts](https://gith - Network accessline 9
1. Use the `IStorage` interface (`get`/`set`/`delete`) for all state management. It supports both synchronous and async implementations, so custom backends (Redis, Cosmos DB) can return Promises. [github.com/microsoft/teams.ts](https://gith - Network accessline 10
2. `LocalStorage` from `@microsoft/teams.common` is an in-memory store with optional LRU eviction. Pass `{ max: N }` to cap entries and prevent unbounded memory growth in long-running bots. [github.com/microsoft/teams.ts](https://github.com - Network accessline 10
2. `LocalStorage` from `@microsoft/teams.common` is an in-memory store with optional LRU eviction. Pass `{ max: N }` to cap entries and prevent unbounded memory growth in long-running bots. [github.com/microsoft/teams.ts](https://github.com - Network accessline 11
3. Pass storage to the `App` constructor via the `storage` option. The storage instance is then available as `ctx.storage` in all route handlers. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 11
3. Pass storage to the `App` constructor via the `storage` option. The storage instance is then available as `ctx.storage` in all route handlers. [github.com/microsoft/teams.ts](https://github.com/microsoft/teams.ts) - Network accessline 12
4. For per-user state, key on `activity.from.id` (or `activity.from.aadObjectId` for AAD-stable IDs). For per-conversation state, key on `activity.conversation.id`. Choose the right scope for your data. [learn.microsoft.com -- Bot state](ht - Network accessline 12
4. For per-user state, key on `activity.from.id` (or `activity.from.aadObjectId` for AAD-stable IDs). For per-conversation state, key on `activity.conversation.id`. Choose the right scope for your data. [learn.microsoft.com -- Bot state](ht - Network accessline 13
5. When combining state with `ChatPrompt`, pass the user's stored `messages` array to the prompt's `messages` option. This restores conversation history across handler invocations. [github.com/microsoft/teams.ts](https://github.com/microsof - Network accessline 13
5. When combining state with `ChatPrompt`, pass the user's stored `messages` array to the prompt's `messages` option. This restores conversation history across handler invocations. [github.com/microsoft/teams.ts](https://github.com/microsof - Network accessline 14
6. Initialize state lazily: check if state exists for the key, and if not, create a default state object and store it. This avoids null reference errors on first interaction. [github.com/microsoft/teams.ts](https://github.com/microsoft/team - Network accessline 14
6. Initialize state lazily: check if state exists for the key, and if not, create a default state object and store it. This avoids null reference errors on first interaction. [github.com/microsoft/teams.ts](https://github.com/microsoft/team - Network accessline 15
7. `LocalStorage` is volatile -- data is lost on process restart. For production bots, implement `IStorage` backed by a persistent store (Azure Cosmos DB, Redis, SQL). [learn.microsoft.com -- Bot state management](https://learn.microsoft.co - Network accessline 15
7. `LocalStorage` is volatile -- data is lost on process restart. For production bots, implement `IStorage` backed by a persistent store (Azure Cosmos DB, Redis, SQL). [learn.microsoft.com -- Bot state management](https://learn.microsoft.co - Network accessline 16
8. Keep state objects small. Store only what is needed (message history, preferences, session flags). Large state objects increase memory pressure and serialization cost for persistent backends. [github.com/microsoft/teams.ts](https://githu - Network accessline 16
8. Keep state objects small. Store only what is needed (message history, preferences, session flags). Large state objects increase memory pressure and serialization cost for persistent backends. [github.com/microsoft/teams.ts](https://githu - Network accessline 17
9. The `IStorage` generic signature is `IStorage<TKey, TValue>`. Type both the key and value for compile-time safety. For example, `new LocalStorage<IUserState>()` types the value while using string keys. [github.com/microsoft/teams.ts](htt - Network accessline 17
9. The `IStorage` generic signature is `IStorage<TKey, TValue>`. Type both the key and value for compile-time safety. For example, `new LocalStorage<IUserState>()` types the value while using string keys. [github.com/microsoft/teams.ts](htt - Network accessline 18
10. Do not rely on in-memory state in multi-instance deployments (e.g., Azure App Service with multiple instances or containers). Each instance has its own `LocalStorage`. Use a shared persistent store instead. [learn.microsoft.com -- Scale - Network accessline 18
10. Do not rely on in-memory state in multi-instance deployments (e.g., Azure App Service with multiple instances or containers). Each instance has its own `LocalStorage`. Use a shared persistent store instead. [learn.microsoft.com -- Scale - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Network accessline 172
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 172
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 173
- [Bot state management concepts](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-state) - Network accessline 173
- [Bot state management concepts](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-state) - Network accessline 174
- [Azure Cosmos DB for state storage](https://learn.microsoft.com/en-us/azure/cosmos-db/introduction) - Network accessline 174
- [Azure Cosmos DB for state storage](https://learn.microsoft.com/en-us/azure/cosmos-db/introduction) - Network accessline 175
- [Teams bot conversation context](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-context) - Network accessline 175
- [Teams bot conversation context](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-context)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/teams-python.md
- Network accessline 9
1. Install the Teams Python SDK packages: `pip install microsoft-teams-apps microsoft-teams-ai microsoft-teams-openai`. The SDK is modular — `microsoft_teams.apps` for the App framework, `microsoft_teams.ai` for AI/prompts, `microsoft_teams - Network accessline 9
1. Install the Teams Python SDK packages: `pip install microsoft-teams-apps microsoft-teams-ai microsoft-teams-openai`. The SDK is modular — `microsoft_teams.apps` for the App framework, `microsoft_teams.ai` for AI/prompts, `microsoft_teams - Network accessline 9
1. Install the Teams Python SDK packages: `pip install microsoft-teams-apps microsoft-teams-ai microsoft-teams-openai`. The SDK is modular — `microsoft_teams.apps` for the App framework, `microsoft_teams.ai` for AI/prompts, `microsoft_teams - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Network accessline 122
- https://github.com/nicekid1/Microsoft-Teams.ts (Python SDK repo) - Network accessline 122
- https://github.com/nicekid1/Microsoft-Teams.ts (Python SDK repo) - Network accessline 122
- https://github.com/nicekid1/Microsoft-Teams.ts (Python SDK repo) - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ui.adaptive-cards-ts.md
- Network accessline 9
1. Always set `"type": "AdaptiveCard"` and `"$schema": "http://adaptivecards.io/schemas/adaptive-card.json"` at the card root; Teams requires `"version": "1.5"` or lower (1.6+ features are silently ignored). [adaptivecards.io/designer](http - Network accessline 9
1. Always set `"type": "AdaptiveCard"` and `"$schema": "http://adaptivecards.io/schemas/adaptive-card.json"` at the card root; Teams requires `"version": "1.5"` or lower (1.6+ features are silently ignored). [adaptivecards.io/designer](http - Network accessline 10
2. Wrap every card in a `CardFactory.adaptiveCard(cardJson)` attachment -- never send raw JSON as message text. The attachment `contentType` is `"application/vnd.microsoft.card.adaptive"`. [learn.microsoft.com -- Cards reference](https://le - Network accessline 10
2. Wrap every card in a `CardFactory.adaptiveCard(cardJson)` attachment -- never send raw JSON as message text. The attachment `contentType` is `"application/vnd.microsoft.card.adaptive"`. [learn.microsoft.com -- Cards reference](https://le - Network accessline 11
3. Register card action handlers with `app.adaptiveCards.actionSubmit(actionVerb, handler)` where `actionVerb` matches the `data.verb` (or `data.action`) string you embed in the card's `Action.Submit`. The handler receives `(ctx, state, dat - Network accessline 11
3. Register card action handlers with `app.adaptiveCards.actionSubmit(actionVerb, handler)` where `actionVerb` matches the `data.verb` (or `data.action`) string you embed in the card's `Action.Submit`. The handler receives `(ctx, state, dat - Network accessline 13
5. Input element `id` values become keys in `activity.value`. For example, `Input.Text` with `"id": "comment"` yields `activity.value.comment`. Keep IDs short and unique within a card. 6. To update an existing message (e.g., replacing a car - Network accessline 13
5. Input element `id` values become keys in `activity.value`. For example, `Input.Text` with `"id": "comment"` yields `activity.value.comment`. Keep IDs short and unique within a card. 6. To update an existing message (e.g., replacing a car - Network accessline 14
6. To update an existing message (e.g., replacing a card after action), return an updated card from the handler or call `await ctx.updateActivity({ ...activity, attachments: [newCard] })`. To send a new message instead, call `await ctx.send - Network accessline 14
6. To update an existing message (e.g., replacing a card after action), return an updated card from the handler or call `await ctx.updateActivity({ ...activity, attachments: [newCard] })`. To send a new message instead, call `await ctx.send - Network accessline 15
7. Teams Adaptive Cards do NOT support `Action.Http`, `Action.ToggleVisibility` (partial -- works for simple show/hide but not nested), `backgroundImage` on mobile, `Media` element playback, or `hostConfig` overrides. Always test on desktop - Network accessline 15
7. Teams Adaptive Cards do NOT support `Action.Http`, `Action.ToggleVisibility` (partial -- works for simple show/hide but not nested), `backgroundImage` on mobile, `Media` element playback, or `hostConfig` overrides. Always test on desktop - Network accessline 16
8. Card payload size must be under 28 KB (after JSON serialization). Larger cards are rejected silently. [learn.microsoft.com -- Card size limit](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-r - Network accessline 16
8. Card payload size must be under 28 KB (after JSON serialization). Larger cards are rejected silently. [learn.microsoft.com -- Card size limit](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-r - Network accessline 17
9. For `Action.Execute` (Universal Actions), the handler is `app.adaptiveCards.actionExecute(verb, handler)` and the return must be an Adaptive Card (used for automatic card refresh / user-specific views). Prefer `Action.Submit` for standar - Network accessline 17
9. For `Action.Execute` (Universal Actions), the handler is `app.adaptiveCards.actionExecute(verb, handler)` and the return must be an Adaptive Card (used for automatic card refresh / user-specific views). Prefer `Action.Submit` for standar - Network accessline 29
const confirmCard = { type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 29
const confirmCard = { type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 30
type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 30
type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 31
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 31
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 103
const feedbackFormCard = { type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 103
const feedbackFormCard = { type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 104
type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 104
type: "AdaptiveCard", $schema: "http://adaptivecards.io/schemas/adaptive-card.json", version: "1.5", - Network accessline 105
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 105
$schema: "http://adaptivecards.io/schemas/adaptive-card.json", - Network accessline 254
- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/) - Network accessline 254
- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/) - Network accessline 255
- [Adaptive Cards Designer](https://adaptivecards.io/designer/) - Network accessline 255
- [Adaptive Cards Designer](https://adaptivecards.io/designer/) - Network accessline 256
- [Teams: Cards and card actions](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-actions) - Network accessline 256
- [Teams: Cards and card actions](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-actions) - Network accessline 257
- [Teams: Adaptive Card for bots](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference#adaptive-card) - Network accessline 257
- [Teams: Adaptive Card for bots](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference#adaptive-card) - Network accessline 258
- [Teams: Universal Actions for Adaptive Cards](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview) - Network accessline 258
- [Teams: Universal Actions for Adaptive Cards](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview) - Network accessline 259
- [Teams AI SDK GitHub -- samples](https://github.com/microsoft/teams-ai/tree/main/js/samples) - Network accessline 259
- [Teams AI SDK GitHub -- samples](https://github.com/microsoft/teams-ai/tree/main/js/samples) - Network accessline 260
- [Teams: Format cards](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format) - Network accessline 260
- [Teams: Format cards](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format) - Network accessline 261
- [Teams: Card size limits](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference#card-size-limit) - Network accessline 261
- [Teams: Card size limits](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference#card-size-limit)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ui.dialogs-task-modules-ts.md
- Network accessline 9
1. Handle dialog open requests with `app.on('dialog.open', handler)`. This fires when Teams invokes `task/fetch`. The handler must return a response with `task.type: 'continue'` containing a card, or `task.type: 'message'` containing text. - Network accessline 9
1. Handle dialog open requests with `app.on('dialog.open', handler)`. This fires when Teams invokes `task/fetch`. The handler must return a response with `task.type: 'continue'` containing a card, or `task.type: 'message'` containing text. - Network accessline 10
2. Handle dialog submissions with `app.on('dialog.submit', handler)`. This fires when the user submits the form inside the task module (`task/submit`). Form data is available in `activity.value.data`. [learn.microsoft.com -- Task modules](h - Network accessline 10
2. Handle dialog submissions with `app.on('dialog.submit', handler)`. This fires when the user submits the form inside the task module (`task/submit`). Form data is available in `activity.value.data`. [learn.microsoft.com -- Task modules](h - Network accessline 11
3. To open a dialog with an Adaptive Card, return `{ status: 200, body: { task: { type: 'continue', value: { title, card } } } }` where `card` is an object with `contentType: 'application/vnd.microsoft.card.adaptive'` and `content` containi - Network accessline 11
3. To open a dialog with an Adaptive Card, return `{ status: 200, body: { task: { type: 'continue', value: { title, card } } } }` where `card` is an object with `contentType: 'application/vnd.microsoft.card.adaptive'` and `content` containi - Network accessline 12
4. To close a dialog with a text message, return `{ status: 200, body: { task: { type: 'message', value: 'Success message' } } }` from the submit handler. This displays the message and closes the dialog. [learn.microsoft.com -- Task modules - Network accessline 12
4. To close a dialog with a text message, return `{ status: 200, body: { task: { type: 'message', value: 'Success message' } } }` from the submit handler. This displays the message and closes the dialog. [learn.microsoft.com -- Task modules - Network accessline 13
5. To chain dialogs (open a new dialog after submission), return a `continue` response from the submit handler with a new card. This replaces the current dialog content without closing it. [learn.microsoft.com -- Task modules](https://learn - Network accessline 13
5. To chain dialogs (open a new dialog after submission), return a `continue` response from the submit handler with a new card. This replaces the current dialog content without closing it. [learn.microsoft.com -- Task modules](https://learn - Network accessline 14
6. Control dialog dimensions with `width` and `height` properties in the `value` object. Accepted values are `'small'`, `'medium'`, `'large'`, or pixel values (e.g., `500`). Default is `'medium'`. [learn.microsoft.com -- Task module size](h - Network accessline 14
6. Control dialog dimensions with `width` and `height` properties in the `value` object. Accepted values are `'small'`, `'medium'`, `'large'`, or pixel values (e.g., `500`). Default is `'medium'`. [learn.microsoft.com -- Task module size](h - Network accessline 15
7. Trigger a dialog from a message by sending an Adaptive Card with `Action.Submit` containing `{ msteams: { type: 'task/fetch' } }` in its data, or by adding the bot to the manifest with `taskInfo` commands. [learn.microsoft.com -- Invoke - Network accessline 15
7. Trigger a dialog from a message by sending an Adaptive Card with `Action.Submit` containing `{ msteams: { type: 'task/fetch' } }` in its data, or by adding the bot to the manifest with `taskInfo` commands. [learn.microsoft.com -- Invoke - Network accessline 16
8. The `dialog.open` route maps to `task/fetch` and `dialog.submit` maps to `task/submit` in the Teams invoke system. Both are invoke routes that require a structured return value, not a simple `send()` call. [github.com/microsoft/teams.ts] - Network accessline 16
8. The `dialog.open` route maps to `task/fetch` and `dialog.submit` maps to `task/submit` in the Teams invoke system. Both are invoke routes that require a structured return value, not a simple `send()` call. [github.com/microsoft/teams.ts] - Network accessline 17
9. Form input IDs in the Adaptive Card become keys in `activity.value.data`. For example, `Input.Text` with `id: 'email'` appears as `activity.value.data.email` in the submit handler. [learn.microsoft.com -- Adaptive Card inputs](https://le - Network accessline 17
9. Form input IDs in the Adaptive Card become keys in `activity.value.data`. For example, `Input.Text` with `id: 'email'` appears as `activity.value.data.email` in the submit handler. [learn.microsoft.com -- Adaptive Card inputs](https://le - Network accessline 18
10. Always validate submitted data server-side. Users can tamper with the JSON payload sent by the dialog. Use schema validation before processing form data. [learn.microsoft.com -- Task modules security](https://learn.microsoft.com/en-us/m - Network accessline 18
10. Always validate submitted data server-side. Users can tamper with the JSON payload sent by the dialog. Use schema validation before processing form data. [learn.microsoft.com -- Task modules security](https://learn.microsoft.com/en-us/m - Network accessline 346
- [Task modules in Teams bots](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots) - Network accessline 346
- [Task modules in Teams bots](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots) - Network accessline 347
- [Task module invocation](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots#invoke-a-task-module-from-a-bot) - Network accessline 347
- [Task module invocation](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots#invoke-a-task-module-from-a-bot) - Network accessline 348
- [TaskInfo object](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots#the-taskinfo-object) - Network accessline 348
- [TaskInfo object](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/task-modules/task-modules-bots#the-taskinfo-object) - Network accessline 349
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 349
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 350
- [Adaptive Cards for task modules](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference) - Network accessline 350
- [Adaptive Cards for task modules](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/ui.message-extensions-ts.md
- Network accessline 9
1. Configure message extensions in `appPackage/manifest.json` under the `composeExtensions` array. Each extension has a `botId`, `commands` array, and each command specifies `type` (`query` for search, `action` for task module). [learn.micr - Network accessline 9
1. Configure message extensions in `appPackage/manifest.json` under the `composeExtensions` array. Each extension has a `botId`, `commands` array, and each command specifies `type` (`query` for search, `action` for task module). [learn.micr - Network accessline 10
2. Handle search queries with `app.on('message.ext.query', handler)`. The handler receives the query text in `activity.value.parameters[0].value` and must return a response with `composeExtension.type: 'result'` containing an attachments ar - Network accessline 10
2. Handle search queries with `app.on('message.ext.query', handler)`. The handler receives the query text in `activity.value.parameters[0].value` and must return a response with `composeExtension.type: 'result'` containing an attachments ar - Network accessline 11
3. Set `attachmentLayout` to `'list'` for vertical result layout or `'grid'` for a tile grid. Use `'list'` for text-heavy results and `'grid'` for image-heavy results. [learn.microsoft.com -- Respond to search](https://learn.microsoft.com/e - Network accessline 11
3. Set `attachmentLayout` to `'list'` for vertical result layout or `'grid'` for a tile grid. Use `'list'` for text-heavy results and `'grid'` for image-heavy results. [learn.microsoft.com -- Respond to search](https://learn.microsoft.com/e - Network accessline 12
4. Each attachment in the results array needs both a `content` (the full Adaptive Card inserted into the compose box) and a `preview` (a smaller Thumbnail Card shown in the search results list). The preview uses `contentType: 'application/v - Network accessline 12
4. Each attachment in the results array needs both a `content` (the full Adaptive Card inserted into the compose box) and a `preview` (a smaller Thumbnail Card shown in the search results list). The preview uses `contentType: 'application/v - Network accessline 13
5. Handle action-based extensions with two routes: `app.on('message.ext.open', handler)` for displaying the task module form (`composeExtension/fetchTask`) and `app.on('message.ext.submit', handler)` for processing the submitted data (`comp - Network accessline 13
5. Handle action-based extensions with two routes: `app.on('message.ext.open', handler)` for displaying the task module form (`composeExtension/fetchTask`) and `app.on('message.ext.submit', handler)` for processing the submitted data (`comp - Network accessline 14
6. The `message.ext.open` handler returns a task module response identical to `dialog.open`: `{ status: 200, body: { task: { type: 'continue', value: { title, card } } } }`. [learn.microsoft.com -- Action extensions](https://learn.microsoft - Network accessline 14
6. The `message.ext.open` handler returns a task module response identical to `dialog.open`: `{ status: 200, body: { task: { type: 'continue', value: { title, card } } } }`. [learn.microsoft.com -- Action extensions](https://learn.microsoft - Network accessline 15
7. The `message.ext.submit` handler receives form data in `activity.value.data` and can return a card to insert into the compose box or perform a server-side action. [learn.microsoft.com -- Action extensions](https://learn.microsoft.com/en- - Network accessline 15
7. The `message.ext.submit` handler receives form data in `activity.value.data` and can return a card to insert into the compose box or perform a server-side action. [learn.microsoft.com -- Action extensions](https://learn.microsoft.com/en- - Network accessline 16
8. Manifest command parameters define the search fields displayed in the Teams UI. Each parameter has `name`, `title`, and optionally `description` and `inputType`. The first parameter is the default search field. [learn.microsoft.com -- De - Network accessline 16
8. Manifest command parameters define the search fields displayed in the Teams UI. Each parameter has `name`, `title`, and optionally `description` and `inputType`. The first parameter is the default search field. [learn.microsoft.com -- De - Network accessline 17
9. Search result counts should be limited (10-15 items) because Teams truncates long result lists. Always handle empty query strings gracefully by returning popular or recent results. [learn.microsoft.com -- Search extensions](https://learn - Network accessline 17
9. Search result counts should be limited (10-15 items) because Teams truncates long result lists. Always handle empty query strings gracefully by returning popular or recent results. [learn.microsoft.com -- Search extensions](https://learn - Network accessline 18
10. Handle link unfurling with `app.on('message.ext.query-link', handler)`. This fires when a user pastes a URL matching a domain in the manifest's `messageHandlers`. Return a card attachment to preview the link. [learn.microsoft.com -- Lin - Network accessline 18
10. Handle link unfurling with `app.on('message.ext.query-link', handler)`. This fires when a user pastes a URL matching a domain in the manifest's `messageHandlers`. Return a card attachment to preview the link. [learn.microsoft.com -- Lin - Network accessline 51
// Replace with your actual search logic const products: Product[] = [ { id: '1', title: 'Widget Pro', description: 'A premium widget', price: 29.99, imageUrl: 'https://example.com/widget.png' }, - Network accessline 51
// Replace with your actual search logic const products: Product[] = [ { id: '1', title: 'Widget Pro', description: 'A premium widget', price: 29.99, imageUrl: 'https://example.com/widget.png' }, - Network accessline 52
const products: Product[] = [ { id: '1', title: 'Widget Pro', description: 'A premium widget', price: 29.99, imageUrl: 'https://example.com/widget.png' }, { id: '2', title: 'Gadget Plus', description: 'An advanced gadget', price: 49 - Network accessline 52
const products: Product[] = [ { id: '1', title: 'Widget Pro', description: 'A premium widget', price: 29.99, imageUrl: 'https://example.com/widget.png' }, { id: '2', title: 'Gadget Plus', description: 'An advanced gadget', price: 49 - Network accessline 53
{ id: '1', title: 'Widget Pro', description: 'A premium widget', price: 29.99, imageUrl: 'https://example.com/widget.png' }, - Network accessline 53
{ id: '1', title: 'Widget Pro', description: 'A premium widget', price: 29.99, imageUrl: 'https://example.com/widget.png' }, - Network accessline 54
{ id: '2', title: 'Gadget Plus', description: 'An advanced gadget', price: 49.99, imageUrl: 'https://example.com/gadget.png' }, - Network accessline 54
{ id: '2', title: 'Gadget Plus', description: 'An advanced gadget', price: 49.99, imageUrl: 'https://example.com/gadget.png' }, - Network accessline 323
- [Message extensions overview](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions) - Network accessline 323
- [Message extensions overview](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions) - Network accessline 324
- [Define search commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/search-commands/define-search-command) - Network accessline 324
- [Define search commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/search-commands/define-search-command) - Network accessline 325
- [Respond to search commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/search-commands/respond-to-search) - Network accessline 325
- [Respond to search commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/search-commands/respond-to-search) - Network accessline 326
- [Define action commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/define-action-command) - Network accessline 326
- [Define action commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/define-action-command) - Network accessline 327
- [Respond to action commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit) - Network accessline 327
- [Respond to action commands](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit) - Network accessline 328
- [Link unfurling](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/link-unfurling) - Network accessline 328
- [Link unfurling](https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/link-unfurling) - Network accessline 329
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts) - Network accessline 329
- [Teams AI Library v2 -- GitHub](https://github.com/microsoft/teams.ts)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/workflow.approvals-inline-ts.md
- Network accessline 282
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 282
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 283
- https://learn.microsoft.com/en-us/graph/api/user-list-manager - Network accessline 283
- https://learn.microsoft.com/en-us/graph/api/user-list-manager - Network accessline 284
- https://adaptivecards.io/explorer/Action.Execute.html - Network accessline 284
- https://adaptivecards.io/explorer/Action.Execute.html
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/workflow.message-native-records-ts.md
- Network accessline 9
1. **Every workflow record is an Adaptive Card backed by a store row.** The card is the visual representation; the list/dataverse row is the source of truth. Card actions read from and write to the store, then refresh the card to reflect cu - Network accessline 9
1. **Every workflow record is an Adaptive Card backed by a store row.** The card is the visual representation; the list/dataverse row is the source of truth. Card actions read from and write to the store, then refresh the card to reflect cu - Network accessline 10
2. **Use `Action.Execute` with `verb` for all record mutations.** `Action.Execute` triggers a server-side `adaptiveCard/action` invoke, allowing the bot to update the backing store and return a refreshed card in one round-trip. Never use `A - Network accessline 10
2. **Use `Action.Execute` with `verb` for all record mutations.** `Action.Execute` triggers a server-side `adaptiveCard/action` invoke, allowing the bot to update the backing store and return a refreshed card in one round-trip. Never use `A - Network accessline 12
4. **Store the record ID in `Action.Execute.data`.** Every action button must include the backing store record ID (e.g., `{ verb: "approve", recordId: "item-123" }`) so the handler can look up and mutate the correct row. 5. **Embed record m - Network accessline 12
4. **Store the record ID in `Action.Execute.data`.** Every action button must include the backing store record ID (e.g., `{ verb: "approve", recordId: "item-123" }`) so the handler can look up and mutate the correct row. 5. **Embed record m - Network accessline 13
5. **Embed record metadata in the card body.** Display the record's key fields (status, requester, timestamps) directly in the card using `TextBlock` and `FactSet`. Users should see the full record state without clicking or navigating. 6. * - Network accessline 13
5. **Embed record metadata in the card body.** Display the record's key fields (status, requester, timestamps) directly in the card using `TextBlock` and `FactSet`. Users should see the full record state without clicking or navigating. 6. * - Network accessline 14
6. **Use `refresh` property for user-specific views.** Adaptive Cards support a `refresh` block that triggers an automatic `adaptiveCard/action` invoke when specific users view the card. Use this to show role-specific actions (approver sees - Network accessline 14
6. **Use `refresh` property for user-specific views.** Adaptive Cards support a `refresh` block that triggers an automatic `adaptiveCard/action` invoke when specific users view the card. Use this to show role-specific actions (approver sees - Network accessline 220
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 220
- https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/overview - Network accessline 221
- https://adaptivecards.io/explorer/Action.Execute.html - Network accessline 221
- https://adaptivecards.io/explorer/Action.Execute.html - Network accessline 222
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/update-and-delete-bot-messages - Network accessline 222
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/update-and-delete-bot-messages - Network accessline 223
- https://learn.microsoft.com/en-us/adaptive-cards/authoring-cards/universal-action-model - Network accessline 223
- https://learn.microsoft.com/en-us/adaptive-cards/authoring-cards/universal-action-model
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/workflow.sharepoint-lists-ts.md
- Network accessline 9
1. **Use Microsoft Graph REST API for all List operations.** Access SharePoint Lists via `https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items`. Requires `Sites.ReadWrite.All` or `Sites.Manage.All` delegated/application pe - Network accessline 9
1. **Use Microsoft Graph REST API for all List operations.** Access SharePoint Lists via `https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items`. Requires `Sites.ReadWrite.All` or `Sites.Manage.All` delegated/application pe - Network accessline 10
2. **Prefer app-only tokens for bot-initiated List operations.** Bot workflows typically run without user context. Use client credentials flow (`ConfidentialClientApplication`) to get app-only tokens. This avoids per-user consent and works - Network accessline 10
2. **Prefer app-only tokens for bot-initiated List operations.** Bot workflows typically run without user context. Use client credentials flow (`ConfidentialClientApplication`) to get app-only tokens. This avoids per-user consent and works - Network accessline 11
3. **Create lists programmatically with column definitions.** Define list schemas in code for reproducible deployment. Use `POST /sites/{site-id}/lists` with `columns` array specifying `text`, `number`, `dateTime`, `choice`, `personOrGroup` - Network accessline 11
3. **Create lists programmatically with column definitions.** Define list schemas in code for reproducible deployment. Use `POST /sites/{site-id}/lists` with `columns` array specifying `text`, `number`, `dateTime`, `choice`, `personOrGroup` - Network accessline 12
4. **Map workflow fields to list columns explicitly.** Each workflow record type (PTO request, equipment booking, account status) should have a corresponding list with typed columns. Use `personOrGroup` for requester/approver, `dateTime` fo - Network accessline 12
4. **Map workflow fields to list columns explicitly.** Each workflow record type (PTO request, equipment booking, account status) should have a corresponding list with typed columns. Use `personOrGroup` for requester/approver, `dateTime` fo - Network accessline 13
5. **Store the thread activity ID on the list item.** Add a `ThreadActivityId` text column to every workflow list. When a workflow record is created from a message, store the originating `activity.id` and `conversation.id`. This enables bid - Network accessline 13
5. **Store the thread activity ID on the list item.** Add a `ThreadActivityId` text column to every workflow list. When a workflow record is created from a message, store the originating `activity.id` and `conversation.id`. This enables bid - Network accessline 14
6. **Use `$filter` and `$orderby` for querying.** Graph supports OData filtering on list items: `GET /sites/{site-id}/lists/{list-id}/items?$filter=fields/Status eq 'pending'&$orderby=fields/Created desc&$expand=fields`. Always `$expand=fie - Network accessline 14
6. **Use `$filter` and `$orderby` for querying.** Graph supports OData filtering on list items: `GET /sites/{site-id}/lists/{list-id}/items?$filter=fields/Status eq 'pending'&$orderby=fields/Created desc&$expand=fields`. Always `$expand=fie - Network accessline 15
7. **Batch multiple list operations with JSON batching.** When a workflow step creates/updates multiple records, use Graph JSON batching (`POST /$batch`) to send up to 20 requests in one call. Reduces latency and avoids per-request throttli - Network accessline 15
7. **Batch multiple list operations with JSON batching.** When a workflow step creates/updates multiple records, use Graph JSON batching (`POST /$batch`) to send up to 20 requests in one call. Reduces latency and avoids per-request throttli - Network accessline 16
8. **Subscribe to list changes via Graph webhooks.** Use `POST /subscriptions` with `changeType: "updated,created"` on `/sites/{site-id}/lists/{list-id}/items` to receive notifications when records change outside the bot (e.g., direct list - Network accessline 16
8. **Subscribe to list changes via Graph webhooks.** Use `POST /subscriptions` with `changeType: "updated,created"` on `/sites/{site-id}/lists/{list-id}/items` to receive notifications when records change outside the bot (e.g., direct list - Network accessline 17
9. **Handle throttling with retry-after headers.** Graph API returns 429 with `Retry-After` header when throttled. Implement exponential backoff. SharePoint-specific limits: 600 requests per minute per app per tenant for app-only; tighter p - Network accessline 17
9. **Handle throttling with retry-after headers.** Graph API returns 429 with `Retry-After` header when throttled. Implement exponential backoff. SharePoint-specific limits: 600 requests per minute per app per tenant for app-only; tighter p - Network accessline 122
- https://learn.microsoft.com/en-us/graph/api/resources/list - Network accessline 122
- https://learn.microsoft.com/en-us/graph/api/resources/list - Network accessline 123
- https://learn.microsoft.com/en-us/graph/api/listitem-list - Network accessline 123
- https://learn.microsoft.com/en-us/graph/api/listitem-list - Network accessline 124
- https://learn.microsoft.com/en-us/graph/api/list-create - Network accessline 124
- https://learn.microsoft.com/en-us/graph/api/list-create - Network accessline 125
- https://learn.microsoft.com/en-us/graph/json-batching - Network accessline 125
- https://learn.microsoft.com/en-us/graph/json-batching - Network accessline 126
- https://learn.microsoft.com/en-us/graph/webhooks - Network accessline 126
- https://learn.microsoft.com/en-us/graph/webhooks - Network accessline 127
- https://learn.microsoft.com/en-us/graph/throttling - Network accessline 127
- https://learn.microsoft.com/en-us/graph/throttling - Network accessline 128
- https://learn.microsoft.com/en-us/graph/auth-v2-service - Network accessline 128
- https://learn.microsoft.com/en-us/graph/auth-v2-service
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/workflow.state-driven-events-ts.md
- Network accessline 9
1. **Use Graph change notifications (webhooks) for all state-driven triggers.** Subscribe to resource changes via `POST /subscriptions`. The bot receives HTTP POST callbacks when subscribed resources change. This is the foundation for prese - Network accessline 9
1. **Use Graph change notifications (webhooks) for all state-driven triggers.** Subscribe to resource changes via `POST /subscriptions`. The bot receives HTTP POST callbacks when subscribed resources change. This is the foundation for prese - Network accessline 10
2. **Presence changes: subscribe to `/communications/presences/{userId}`.** Requires `Presence.Read.All` application permission. Notifications fire when a user's availability changes (Available, Away, Busy, DoNotDisturb, Offline). Use for b - Network accessline 10
2. **Presence changes: subscribe to `/communications/presences/{userId}`.** Requires `Presence.Read.All` application permission. Notifications fire when a user's availability changes (Available, Away, Busy, DoNotDisturb, Offline). Use for b - Network accessline 11
3. **Shifts events: subscribe to `/teams/{teamId}/schedule/shifts`.** Requires `Schedule.Read.All` or `Schedule.ReadWrite.All` application permission. Notifications fire when shifts are created, updated, or deleted. Use for schedule-based a - Network accessline 11
3. **Shifts events: subscribe to `/teams/{teamId}/schedule/shifts`.** Requires `Schedule.Read.All` or `Schedule.ReadWrite.All` application permission. Notifications fire when shifts are created, updated, or deleted. Use for schedule-based a - Network accessline 12
4. **Time-off requests: use `/teams/{teamId}/schedule/timeOffRequests`.** Subscribe to changes on time-off requests for automated approval workflows. Notifications include the request state (pending, approved, declined). [learn.microsoft.co - Network accessline 12
4. **Time-off requests: use `/teams/{teamId}/schedule/timeOffRequests`.** Subscribe to changes on time-off requests for automated approval workflows. Notifications include the request state (pending, approved, declined). [learn.microsoft.co - Network accessline 13
5. **Call queue membership: monitor via `/communications/callRecords`.** Direct call queue subscriptions are limited. Use call record notifications (`/communications/callRecords`) to detect when agents join/leave queues. Alternatively, poll - Network accessline 13
5. **Call queue membership: monitor via `/communications/callRecords`.** Direct call queue subscriptions are limited. Use call record notifications (`/communications/callRecords`) to detect when agents join/leave queues. Alternatively, poll - Network accessline 14
6. **Validate webhook endpoints with the validation token handshake.** Graph sends a validation request with a `validationToken` query parameter on subscription creation. The endpoint must return the token as `text/plain` within 10 seconds. - Network accessline 14
6. **Validate webhook endpoints with the validation token handshake.** Graph sends a validation request with a `validationToken` query parameter on subscription creation. The endpoint must return the token as `text/plain` within 10 seconds. - Network accessline 15
7. **Decrypt rich notifications for presence data.** Presence subscriptions require `includeResourceData: true` and encryption. Provide `encryptionCertificate` (public key) and `encryptionCertificateId` in the subscription. Decrypt notifica - Network accessline 15
7. **Decrypt rich notifications for presence data.** Presence subscriptions require `includeResourceData: true` and encryption. Provide `encryptionCertificate` (public key) and `encryptionCertificateId` in the subscription. Decrypt notifica - Network accessline 215
- https://learn.microsoft.com/en-us/graph/webhooks - Network accessline 215
- https://learn.microsoft.com/en-us/graph/webhooks - Network accessline 216
- https://learn.microsoft.com/en-us/graph/webhooks-with-resource-data - Network accessline 216
- https://learn.microsoft.com/en-us/graph/webhooks-with-resource-data - Network accessline 217
- https://learn.microsoft.com/en-us/graph/api/subscription-post-subscriptions - Network accessline 217
- https://learn.microsoft.com/en-us/graph/api/subscription-post-subscriptions - Network accessline 218
- https://learn.microsoft.com/en-us/graph/api/resources/shift - Network accessline 218
- https://learn.microsoft.com/en-us/graph/api/resources/shift - Network accessline 219
- https://learn.microsoft.com/en-us/graph/api/resources/timeoffrequest - Network accessline 219
- https://learn.microsoft.com/en-us/graph/api/resources/timeoffrequest - Network accessline 220
- https://learn.microsoft.com/en-us/graph/api/resources/callrecords-api-overview - Network accessline 220
- https://learn.microsoft.com/en-us/graph/api/resources/callrecords-api-overview - Network accessline 221
- https://learn.microsoft.com/en-us/graph/api/resources/presence - Network accessline 221
- https://learn.microsoft.com/en-us/graph/api/resources/presence
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/experts/teams/workflow.triggers-compose-ts.md
- Network accessline 9
1. **The compose box is the primary trigger surface.** Users should initiate workflows by typing commands, using message extension search, or submitting compose actions. Never require users to leave the channel to start a workflow. 2. **Use - Network accessline 9
1. **The compose box is the primary trigger surface.** Users should initiate workflows by typing commands, using message extension search, or submitting compose actions. Never require users to leave the channel to start a workflow. 2. **Use - Network accessline 10
2. **Use bot commands for direct workflow initiation.** Register keyword patterns (e.g., `/pto`, `/book`, `/standup`) via `app.message()` regex handlers. Commands capture inline parameters and immediately launch the workflow. This is the si - Network accessline 10
2. **Use bot commands for direct workflow initiation.** Register keyword patterns (e.g., `/pto`, `/book`, `/standup`) via `app.message()` regex handlers. Commands capture inline parameters and immediately launch the workflow. This is the si - Network accessline 11
3. **Use message extension action commands for form-based initiation.** Action commands open a task module (dialog) from the compose area or message context menu. The form collects structured input, and the submit handler creates the workfl - Network accessline 11
3. **Use message extension action commands for form-based initiation.** Action commands open a task module (dialog) from the compose area or message context menu. The form collects structured input, and the submit handler creates the workfl - Network accessline 12
4. **Use message extension search commands for record lookup.** Search commands let users type queries in the compose box extension and see matching records. Results insert as cards into the conversation. Use for "show customer ABC" or "loo - Network accessline 12
4. **Use message extension search commands for record lookup.** Search commands let users type queries in the compose box extension and see matching records. Results insert as cards into the conversation. Use for "show customer ABC" or "loo - Network accessline 13
5. **Use `Action.Execute` on existing cards to trigger follow-on workflows.** A record card's action buttons can initiate new workflow steps (escalate, reassign, clone). This chains workflows together from the message surface without additi - Network accessline 13
5. **Use `Action.Execute` on existing cards to trigger follow-on workflows.** A record card's action buttons can initiate new workflow steps (escalate, reassign, clone). This chains workflows together from the message surface without additi - Network accessline 14
6. **Use proactive messaging for scheduled triggers.** Timer-based workflows (daily standup, weekly status) use `setInterval` or a job scheduler (node-cron, Azure Functions timer trigger) to send proactive messages at cadence. Store convers - Network accessline 14
6. **Use proactive messaging for scheduled triggers.** Timer-based workflows (daily standup, weekly status) use `setInterval` or a job scheduler (node-cron, Azure Functions timer trigger) to send proactive messages at cadence. Store convers - Network accessline 15
7. **Use Graph change notifications for state-driven triggers.** Subscribe to presence changes, Shifts events, or list updates via Graph webhooks. When a notification fires, the bot sends a proactive message to the relevant channel. See `wo - Network accessline 15
7. **Use Graph change notifications for state-driven triggers.** Subscribe to presence changes, Shifts events, or list updates via Graph webhooks. When a notification fires, the bot sends a proactive message to the relevant channel. See `wo - Network accessline 16
8. **Manifest declares all trigger surfaces.** Bot commands go in `bots[].commandLists`. Message extension commands go in `composeExtensions[].commands`. Ensure the manifest declares every trigger the workflow uses. [learn.microsoft.com -- - Network accessline 16
8. **Manifest declares all trigger surfaces.** Bot commands go in `bots[].commandLists`. Message extension commands go in `composeExtensions[].commands`. Ensure the manifest declares every trigger the workflow uses. [learn.microsoft.com -- - Network accessline 203
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/define-action-command - Network accessline 203
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/action-commands/define-action-command - Network accessline 204
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/search-commands/define-search-command - Network accessline 204
- https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/how-to/search-commands/define-search-command - Network accessline 205
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 205
- https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages - Network accessline 206
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema - Network accessline 206
- https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/test-playground/playground-cli.md
- Network accessline 20
before(async () => { client = new TestClient({ botEndpoint: "http://localhost:3978/api/messages", - Network accessline 20
before(async () => { client = new TestClient({ botEndpoint: "http://localhost:3978/api/messages", - Network accessline 21
client = new TestClient({ botEndpoint: "http://localhost:3978/api/messages", timeout: 15000, - Network accessline 21
client = new TestClient({ botEndpoint: "http://localhost:3978/api/messages", timeout: 15000, - Network accessline 22
botEndpoint: "http://localhost:3978/api/messages", - Network accessline 22
botEndpoint: "http://localhost:3978/api/messages", - Network accessline 71
# Verify health curl http://localhost:9000/health - Network accessline 71
# Verify health curl http://localhost:9000/health - Network accessline 72
curl http://localhost:9000/health - Network accessline 72
curl http://localhost:9000/health - Network accessline 79
{ "config": { "botEndpoint": "http://localhost:3978/api/messages", - Network accessline 79
{ "config": { "botEndpoint": "http://localhost:3978/api/messages", - Network accessline 80
"config": { "botEndpoint": "http://localhost:3978/api/messages", "timeout": 30000, - Network accessline 80
"config": { "botEndpoint": "http://localhost:3978/api/messages", "timeout": 30000, - Network accessline 81
"botEndpoint": "http://localhost:3978/api/messages", - Network accessline 81
"botEndpoint": "http://localhost:3978/api/messages", - Network accessline 147
- Manual interactive testing → [playground.md](playground.md) - npm package → [`@microsoft/m365agentsplayground-cli`](https://www.npmjs.com/package/@microsoft/m365agentsplayground-cli) - Network accessline 147
- Manual interactive testing → [playground.md](playground.md) - npm package → [`@microsoft/m365agentsplayground-cli`](https://www.npmjs.com/package/@microsoft/m365agentsplayground-cli) - Network accessline 148
- npm package → [`@microsoft/m365agentsplayground-cli`](https://www.npmjs.com/package/@microsoft/m365agentsplayground-cli) - Network accessline 148
- npm package → [`@microsoft/m365agentsplayground-cli`](https://www.npmjs.com/package/@microsoft/m365agentsplayground-cli)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/test-playground/playground.md
- Network accessline 14
curl -LO https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/download/microsoft-365-agents-playground%400.2.23/agentsplayground-linux-x64.zip - Network accessline 14
curl -LO https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/download/microsoft-365-agents-playground%400.2.23/agentsplayground-linux-x64.zip - Dangerous shell operationline 17
sudo mv agentsplayground /usr/local/bin/ - Dangerous shell operationline 17
sudo mv agentsplayground /usr/local/bin/ - Network accessline 37
# 3. Use a NEW/separate terminal to start Agents Playground agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 37
# 3. Use a NEW/separate terminal to start Agents Playground agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 38
agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 38
agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 45
| Option | Short | Required | Description | |--------|-------|----------|-------------| | `--app-endpoint` | `-e` | Recommended | Bot endpoint URL (e.g., http://localhost:3978/api/messages) | - Network accessline 45
| Option | Short | Required | Description | |--------|-------|----------|-------------| | `--app-endpoint` | `-e` | Recommended | Bot endpoint URL (e.g., http://localhost:3978/api/messages) | - Network accessline 46
|--------|-------|----------|-------------| | `--app-endpoint` | `-e` | Recommended | Bot endpoint URL (e.g., http://localhost:3978/api/messages) | | `--channel-id` | `-c` | Optional | Channel to emulate: msteams, emulator, webchat, directl - Network accessline 46
|--------|-------|----------|-------------| | `--app-endpoint` | `-e` | Recommended | Bot endpoint URL (e.g., http://localhost:3978/api/messages) | | `--channel-id` | `-c` | Optional | Channel to emulate: msteams, emulator, webchat, directl - Network accessline 47
| `--app-endpoint` | `-e` | Recommended | Bot endpoint URL (e.g., http://localhost:3978/api/messages) | - Network accessline 47
| `--app-endpoint` | `-e` | Recommended | Bot endpoint URL (e.g., http://localhost:3978/api/messages) | - Network accessline 58
# Basic start with Teams channel agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 58
# Basic start with Teams channel agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 59
agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 59
agentsplayground -e http://localhost:3978/api/messages -c msteams - Network accessline 61
# With authentication agentsplayground -e http://localhost:3978/api/messages -c emulator \ - Network accessline 61
# With authentication agentsplayground -e http://localhost:3978/api/messages -c emulator \ - Network accessline 62
[Credential-related source omitted] - Network accessline 62
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 67
# Test different channels agentsplayground -e http://localhost:3978/api/messages -c webchat - Network accessline 67
# Test different channels agentsplayground -e http://localhost:3978/api/messages -c webchat - Network accessline 68
agentsplayground -e http://localhost:3978/api/messages -c webchat - Network accessline 68
agentsplayground -e http://localhost:3978/api/messages -c webchat - Network accessline 69
agentsplayground -e http://localhost:3978/api/messages -c emulator - Network accessline 69
agentsplayground -e http://localhost:3978/api/messages -c emulator - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted]
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/test-teams/test-teams.md
- Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Network accessline 45
# Use a NEW/separate terminal! # Get TEAMS_APP_ID and TENANT_ID from env/.env.local # Open: https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}} - Network accessline 45
# Use a NEW/separate terminal! # Get TEAMS_APP_ID and TENANT_ID from env/.env.local # Open: https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}} - Network accessline 45
# Use a NEW/separate terminal! # Get TEAMS_APP_ID and TENANT_ID from env/.env.local # Open: https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}} - Network accessline 47
# Open: https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}} - Network accessline 47
# Open: https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}} - Network accessline 47
# Open: https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}} - Network accessline 63
| Host | URL | |------|-----| | Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | - Network accessline 63
| Host | URL | |------|-----| | Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | - Network accessline 63
| Host | URL | |------|-----| | Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | - Network accessline 64
|------|-----| | Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | | Outlook web | `https://outlook.office.com/host/${{M365_APP_ID}} - Network accessline 64
|------|-----| | Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | | Outlook web | `https://outlook.office.com/host/${{M365_APP_ID}} - Network accessline 64
|------|-----| | Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | | Outlook web | `https://outlook.office.com/host/${{M365_APP_ID}} - Network accessline 65
| Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | - Network accessline 65
| Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | - Network accessline 65
| Teams web | `https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TENANT_ID}}&login_hint=${{USER_EMAIL}}` | - Network accessline 66
| Outlook web | `https://outlook.office.com/host/${{M365_APP_ID}}` | - Network accessline 66
| Outlook web | `https://outlook.office.com/host/${{M365_APP_ID}}` | - Network accessline 66
| Outlook web | `https://outlook.office.com/host/${{M365_APP_ID}}` | - Network accessline 67
| Office web | `https://www.office.com/m365apps/${{M365_APP_ID}}` | - Network accessline 67
| Office web | `https://www.office.com/m365apps/${{M365_APP_ID}}` | - Network accessline 67
| Office web | `https://www.office.com/m365apps/${{M365_APP_ID}}` | - Network accessline 75
https://m365.cloud.microsoft/chat/entity1-d870f6cd-4aa5-4d42-9626-ab690c041429/${agent-hint}?auth=2&developerMode=Basic - Network accessline 75
https://m365.cloud.microsoft/chat/entity1-d870f6cd-4aa5-4d42-9626-ab690c041429/${agent-hint}?auth=2&developerMode=Basic - Network accessline 75
https://m365.cloud.microsoft/chat/entity1-d870f6cd-4aa5-4d42-9626-ab690c041429/${agent-hint}?auth=2&developerMode=Basic - Network accessline 115
> **Applies to: code-based Teams bots/agents only.** > > For **declarative agents** and **API plugins**, the experts below do not apply — there is no bot endpoint, no devtunnel, no `App` constructor, and no SDK auth. Use the "Declarative Ag - Network accessline 115
> **Applies to: code-based Teams bots/agents only.** > > For **declarative agents** and **API plugins**, the experts below do not apply — there is no bot endpoint, no devtunnel, no `App` constructor, and no SDK auth. Use the "Declarative Ag - Network accessline 115
> **Applies to: code-based Teams bots/agents only.** > > For **declarative agents** and **API plugins**, the experts below do not apply — there is no bot endpoint, no devtunnel, no `App` constructor, and no SDK auth. Use the "Declarative Ag - Network accessline 117
> For **declarative agents** and **API plugins**, the experts below do not apply — there is no bot endpoint, no devtunnel, no `App` constructor, and no SDK auth. Use the "Declarative Agents in M365 Copilot" section above (sideloading via `M - Network accessline 117
> For **declarative agents** and **API plugins**, the experts below do not apply — there is no bot endpoint, no devtunnel, no `App` constructor, and no SDK auth. Use the "Declarative Agents in M365 Copilot" section above (sideloading via `M - Network accessline 117
> For **declarative agents** and **API plugins**, the experts below do not apply — there is no bot endpoint, no devtunnel, no `App` constructor, and no SDK auth. Use the "Declarative Agents in M365 Copilot" section above (sideloading via `M
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/toolkit/commands.md
- Network accessline 72
# Add API action from URL atk add action --api-plugin-type api-spec --openapi-spec-type enter-url-or-open-local-file -a https://example.com/openapi.yaml -i false - Network accessline 72
# Add API action from URL atk add action --api-plugin-type api-spec --openapi-spec-type enter-url-or-open-local-file -a https://example.com/openapi.yaml -i false - Network accessline 72
# Add API action from URL atk add action --api-plugin-type api-spec --openapi-spec-type enter-url-or-open-local-file -a https://example.com/openapi.yaml -i false - Network accessline 73
atk add action --api-plugin-type api-spec --openapi-spec-type enter-url-or-open-local-file -a https://example.com/openapi.yaml -i false - Network accessline 73
atk add action --api-plugin-type api-spec --openapi-spec-type enter-url-or-open-local-file -a https://example.com/openapi.yaml -i false - Network accessline 73
atk add action --api-plugin-type api-spec --openapi-spec-type enter-url-or-open-local-file -a https://example.com/openapi.yaml -i false
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/toolkit/environments.md
- Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Network accessline 45
BOT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx BOT_DOMAIN=mybot-dev.azurewebsites.net BOT_ENDPOINT=https://mybot-dev.azurewebsites.net/api/messages - Network accessline 45
BOT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx BOT_DOMAIN=mybot-dev.azurewebsites.net BOT_ENDPOINT=https://mybot-dev.azurewebsites.net/api/messages - Network accessline 46
BOT_DOMAIN=mybot-dev.azurewebsites.net BOT_ENDPOINT=https://mybot-dev.azurewebsites.net/api/messages AZURE_SUBSCRIPTION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Network accessline 46
BOT_DOMAIN=mybot-dev.azurewebsites.net BOT_ENDPOINT=https://mybot-dev.azurewebsites.net/api/messages AZURE_SUBSCRIPTION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Network accessline 47
BOT_ENDPOINT=https://mybot-dev.azurewebsites.net/api/messages - Network accessline 47
BOT_ENDPOINT=https://mybot-dev.azurewebsites.net/api/messages - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Network accessline 64
// appPackage/manifest.json — placeholders resolve from active env { "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 64
// appPackage/manifest.json — placeholders resolve from active env { "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 65
{ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", "manifestVersion": "1.26", - Network accessline 65
{ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", "manifestVersion": "1.26", - Network accessline 66
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 66
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 146
[Credential-related source omitted] - Access to secretsline 146
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 186
[Credential-related source omitted] - Access to secretsline 186
[Credential-related source omitted] - Network accessline 192
- [Manage environments in Agents Toolkit](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/teamsfx-multi-env-v4) - Network accessline 192
- [Manage environments in Agents Toolkit](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/teamsfx-multi-env-v4) - Network accessline 193
- [m365agents.yml environmentFolderPath](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/m365-agents-yml-file) - Network accessline 193
- [m365agents.yml environmentFolderPath](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/m365-agents-yml-file) - Network accessline 194
- [Provision cloud resources](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/provision) - Network accessline 194
- [Provision cloud resources](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/provision) - Network accessline 195
- [Teams app manifest placeholders](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/teamsfx-preview-and-customize-app-manifest-v4) - Network accessline 195
- [Teams app manifest placeholders](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/teamsfx-preview-and-customize-app-manifest-v4)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/toolkit/lifecycle-cli.md
- Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Network accessline 150
run: echo "::set-teamsfx-env BOT_DOMAIN=localhost"; echo "::set-teamsfx-env BOT_ENDPOINT=https://localhost:3978"; - Network accessline 150
run: echo "::set-teamsfx-env BOT_DOMAIN=localhost"; echo "::set-teamsfx-env BOT_ENDPOINT=https://localhost:3978"; - Network accessline 152
echo "::set-teamsfx-env BOT_ENDPOINT=https://localhost:3978"; - Network accessline 152
echo "::set-teamsfx-env BOT_ENDPOINT=https://localhost:3978"; - Access to secretsline 261
[Credential-related source omitted] - Access to secretsline 261
[Credential-related source omitted] - Network accessline 287
- [M365 Agents Toolkit overview](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals) - Network accessline 287
- [M365 Agents Toolkit overview](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals) - Network accessline 288
- [m365agents.yml schema](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/m365-agents-yml-file) - Network accessline 288
- [m365agents.yml schema](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/m365-agents-yml-file) - Network accessline 289
- [Provision cloud resources](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/provision) - Network accessline 289
- [Provision cloud resources](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/provision) - Network accessline 290
- [Deploy to Azure](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/deploy) - Network accessline 290
- [Deploy to Azure](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/deploy) - Network accessline 291
- [CI/CD with Agents Toolkit](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/use-cicd-template-v4) - Network accessline 291
- [CI/CD with Agents Toolkit](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-v4/use-cicd-template-v4) - Network accessline 292
- [ATK CLI reference](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-cli) - Network accessline 292
- [ATK CLI reference](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-cli)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/toolkit/manifest-and-yaml.md
- Network accessline 34
| File | Field | Value | |------|-------|-------| | `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | - Network accessline 34
| File | Field | Value | |------|-------|-------| | `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | - Network accessline 34
| File | Field | Value | |------|-------|-------| | `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | - Network accessline 35
|------|-------|-------| | `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | | `appPackage/manifest.json` | `manifestVersion` | `1.26` | - Network accessline 35
|------|-------|-------| | `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | | `appPackage/manifest.json` | `manifestVersion` | `1.26` | - Network accessline 35
|------|-------|-------| | `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | | `appPackage/manifest.json` | `manifestVersion` | `1.26` | - Network accessline 36
| `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | - Network accessline 36
| `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | - Network accessline 36
| `appPackage/manifest.json` | `$schema` | `https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json` | - Network accessline 37
| `appPackage/manifest.json` | `manifestVersion` | `1.26` | | `appPackage/declarativeAgent.json` | `$schema` | `https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json` | | `appPackage/declarativeAgent.json` - Network accessline 37
| `appPackage/manifest.json` | `manifestVersion` | `1.26` | | `appPackage/declarativeAgent.json` | `$schema` | `https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json` | | `appPackage/declarativeAgent.json` - Network accessline 37
| `appPackage/manifest.json` | `manifestVersion` | `1.26` | | `appPackage/declarativeAgent.json` | `$schema` | `https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json` | | `appPackage/declarativeAgent.json` - Network accessline 38
| `appPackage/declarativeAgent.json` | `$schema` | `https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json` | - Network accessline 38
| `appPackage/declarativeAgent.json` | `$schema` | `https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json` | - Network accessline 38
| `appPackage/declarativeAgent.json` | `$schema` | `https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json` | - Network accessline 48
// appPackage/declarativeAgent.json — minimal v1.7 example { "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", - Network accessline 48
// appPackage/declarativeAgent.json — minimal v1.7 example { "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", - Network accessline 48
// appPackage/declarativeAgent.json — minimal v1.7 example { "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", - Network accessline 49
{ "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", "version": "v1.7", - Network accessline 49
{ "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", "version": "v1.7", - Network accessline 49
{ "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", "version": "v1.7", - Network accessline 50
"$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", - Network accessline 50
"$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", - Network accessline 50
"$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.7/schema.json", - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Network accessline 100
[Credential-related source omitted] - Network accessline 100
[Credential-related source omitted] - Network accessline 100
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Network accessline 101
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/ - Network accessline 101
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/ - Network accessline 101
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/toolkit/playground.md
- Network accessline 9
1. **Agents Playground is a local web UI for testing.** It provides a browser-based chat interface that simulates a Teams conversation. No Teams client, sideloading, or M365 account required. Recommend Agents Playground first for testing — - Network accessline 9
1. **Agents Playground is a local web UI for testing.** It provides a browser-based chat interface that simulates a Teams conversation. No Teams client, sideloading, or M365 account required. Recommend Agents Playground first for testing — - Network accessline 10
2. **Use the `agentsplayground` CLI to start.** Install with `winget install agentsplayground` (Windows), or `npm install -g @microsoft/m365agentsplayground`. Start with `agentsplayground -e http://localhost:3978/api/messages -c msteams`. T - Network accessline 10
2. **Use the `agentsplayground` CLI to start.** Install with `winget install agentsplayground` (Windows), or `npm install -g @microsoft/m365agentsplayground`. Start with `agentsplayground -e http://localhost:3978/api/messages -c msteams`. T - Network accessline 11
3. **`.m365agentsplayground.yml` configures the playground.** This optional config file in the project root customizes playground behavior — bot endpoint URL, display settings, and test scenarios. 4. **The playground connects to your local - Network accessline 11
3. **`.m365agentsplayground.yml` configures the playground.** This optional config file in the project root customizes playground behavior — bot endpoint URL, display settings, and test scenarios. 4. **The playground connects to your local - Network accessline 12
4. **The playground connects to your local bot endpoint.** By default it connects to `http://localhost:3978/api/messages` (or whatever port your bot runs on). Ensure your bot server is running before or alongside the playground. - Network accessline 12
4. **The playground connects to your local bot endpoint.** By default it connects to `http://localhost:3978/api/messages` (or whatever port your bot runs on). Ensure your bot server is running before or alongside the playground. - Network accessline 25
# Option 1: agentsplayground CLI (recommended — no provisioning needed) npm run dev # Start bot in background agentsplayground -e http://localhost:3978/api/messages -c msteams # New termi - Network accessline 25
# Option 1: agentsplayground CLI (recommended — no provisioning needed) npm run dev # Start bot in background agentsplayground -e http://localhost:3978/api/messages -c msteams # New termi - Network accessline 27
agentsplayground -e http://localhost:3978/api/messages -c msteams # New terminal - Network accessline 27
agentsplayground -e http://localhost:3978/api/messages -c msteams # New terminal - Network accessline 29
# Option 2: With authentication credentials agentsplayground -e http://localhost:3978/api/messages -c msteams \ - Network accessline 29
# Option 2: With authentication credentials agentsplayground -e http://localhost:3978/api/messages -c msteams \ - Network accessline 30
[Credential-related source omitted] - Network accessline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 40
# Bot endpoint the playground connects to botEndpoint: http://localhost:3978/api/messages - Network accessline 40
# Bot endpoint the playground connects to botEndpoint: http://localhost:3978/api/messages - Network accessline 41
botEndpoint: http://localhost:3978/api/messages - Network accessline 41
botEndpoint: http://localhost:3978/api/messages - Network accessline 61
"scripts": { "dev": "tsx watch src/index.ts", "playground": "agentsplayground -e http://localhost:3978/api/messages -c msteams" - Network accessline 61
"scripts": { "dev": "tsx watch src/index.ts", "playground": "agentsplayground -e http://localhost:3978/api/messages -c msteams" - Network accessline 62
"dev": "tsx watch src/index.ts", "playground": "agentsplayground -e http://localhost:3978/api/messages -c msteams" } - Network accessline 62
"dev": "tsx watch src/index.ts", "playground": "agentsplayground -e http://localhost:3978/api/messages -c msteams" } - Network accessline 63
"playground": "agentsplayground -e http://localhost:3978/api/messages -c msteams" - Network accessline 63
"playground": "agentsplayground -e http://localhost:3978/api/messages -c msteams" - Network accessline 86
const port = process.env.PORT || 3978; app.listen(port, () => { console.log(`Bot running at http://localhost:${port}`); - Network accessline 86
const port = process.env.PORT || 3978; app.listen(port, () => { console.log(`Bot running at http://localhost:${port}`); - Network accessline 87
app.listen(port, () => { console.log(`Bot running at http://localhost:${port}`); }); - Network accessline 87
app.listen(port, () => { console.log(`Bot running at http://localhost:${port}`); }); - Network accessline 88
console.log(`Bot running at http://localhost:${port}`); - Network accessline 88
console.log(`Bot running at http://localhost:${port}`); - Network accessline 105
- [Test with Agents Playground](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/debug-overview) - Network accessline 105
- [Test with Agents Playground](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/debug-overview) - Network accessline 106
- [ATK preview command](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-cli) - Network accessline 106
- [ATK preview command](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-cli) - Network accessline 107
- [Local debug overview](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/debug-overview) - Network accessline 107
- [Local debug overview](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/debug-overview) - Network accessline 108
- [Agents Toolkit VS Code extension](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/install-teams-toolkit) - Network accessline 108
- [Agents Toolkit VS Code extension](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/install-teams-toolkit)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/toolkit/publish.md
- Network accessline 68
// appPackage/manifest.json — fields required for org catalog and Teams Store { "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 68
// appPackage/manifest.json — fields required for org catalog and Teams Store { "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 69
{ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", "manifestVersion": "1.26", - Network accessline 69
{ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", "manifestVersion": "1.26", - Network accessline 70
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 70
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.26/MicrosoftTeams.schema.json", - Network accessline 74
"developer": { "name": "Your Company", // Required "websiteUrl": "https://yourcompany.com", // Required — HTTPS - Network accessline 74
"developer": { "name": "Your Company", // Required "websiteUrl": "https://yourcompany.com", // Required — HTTPS - Network accessline 75
"name": "Your Company", // Required "websiteUrl": "https://yourcompany.com", // Required — HTTPS "privacyUrl": "https://yourcompany.com/privacy", // Required for Store - Network accessline 75
"name": "Your Company", // Required "websiteUrl": "https://yourcompany.com", // Required — HTTPS "privacyUrl": "https://yourcompany.com/privacy", // Required for Store - Network accessline 76
"websiteUrl": "https://yourcompany.com", // Required — HTTPS - Network accessline 76
"websiteUrl": "https://yourcompany.com", // Required — HTTPS - Network accessline 77
"privacyUrl": "https://yourcompany.com/privacy", // Required for Store - Network accessline 77
"privacyUrl": "https://yourcompany.com/privacy", // Required for Store - Network accessline 78
"termsOfUseUrl": "https://yourcompany.com/terms" // Required for Store - Network accessline 78
"termsOfUseUrl": "https://yourcompany.com/terms" // Required for Store - Network accessline 119
- **Forgetting admin approval step** — `atk publish` only submits. The app isn't available until an admin approves it in the Teams Admin Center. Plan for this delay. - **Testing only in playground before publishing** — The playground doesn' - Network accessline 119
- **Forgetting admin approval step** — `atk publish` only submits. The app isn't available until an admin approves it in the Teams Admin Center. Plan for this delay. - **Testing only in playground before publishing** — The playground doesn' - Network accessline 121
- **Partner Center submission without meeting all policies** — Microsoft's validation checks functionality, security, performance, and compliance. Read the [validation guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/co - Network accessline 121
- **Partner Center submission without meeting all policies** — Microsoft's validation checks functionality, security, performance, and compliance. Read the [validation guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/co - Network accessline 125
- [Publish Teams apps overview](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-publish-overview) - Network accessline 125
- [Publish Teams apps overview](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-publish-overview) - Network accessline 126
- [Publish to org catalog](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload) - Network accessline 126
- [Publish to org catalog](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload) - Network accessline 127
- [Submit to Teams Store](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/publish) - Network accessline 127
- [Submit to Teams Store](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/publish) - Network accessline 128
- [Teams Store validation guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines) - Network accessline 128
- [Teams Store validation guidelines](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines) - Network accessline 129
- [ATK publish command](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-cli) - Network accessline 129
- [ATK publish command](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/toolkit-cli) - Network accessline 130
- [App manifest schema](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema) - Network accessline 130
- [App manifest schema](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema)
plugins/microsoft-365-agents-toolkit/skills/teams-app-developer/troubleshoot/troubleshoot.md
- Network accessline 23
|---------|-------|-----| | YAML schema validation error during `atk provision` | Wrong field names in `m365agents.yml` or `m365agents.local.yml` | Check [field reference](../toolkit/manifest-and-yaml.md). Common: `outputJsonPath` → `output - Network accessline 23
|---------|-------|-----| | YAML schema validation error during `atk provision` | Wrong field names in `m365agents.yml` or `m365agents.local.yml` | Check [field reference](../toolkit/manifest-and-yaml.md). Common: `outputJsonPath` → `output - Network accessline 23
|---------|-------|-----| | YAML schema validation error during `atk provision` | Wrong field names in `m365agents.yml` or `m365agents.local.yml` | Check [field reference](../toolkit/manifest-and-yaml.md). Common: `outputJsonPath` → `output - Network accessline 24
| YAML schema validation error during `atk provision` | Wrong field names in `m365agents.yml` or `m365agents.local.yml` | Check [field reference](../toolkit/manifest-and-yaml.md). Common: `outputJsonPath` → `outputFolder`, missing `descript - Network accessline 24
| YAML schema validation error during `atk provision` | Wrong field names in `m365agents.yml` or `m365agents.local.yml` | Check [field reference](../toolkit/manifest-and-yaml.md). Common: `outputJsonPath` → `outputFolder`, missing `descript - Network accessline 24
| YAML schema validation error during `atk provision` | Wrong field names in `m365agents.yml` or `m365agents.local.yml` | Check [field reference](../toolkit/manifest-and-yaml.md). Common: `outputJsonPath` → `outputFolder`, missing `descript - Network accessline 25
| `teamsApp/validateManifest` fails with network error | Schema URL (`https://developer.microsoft.com/...`) unreachable | Remove `teamsApp/validateManifest` from local YAML, or retry with network access | - Network accessline 25
| `teamsApp/validateManifest` fails with network error | Schema URL (`https://developer.microsoft.com/...`) unreachable | Remove `teamsApp/validateManifest` from local YAML, or retry with network access | - Network accessline 25
| `teamsApp/validateManifest` fails with network error | Schema URL (`https://developer.microsoft.com/...`) unreachable | Remove `teamsApp/validateManifest` from local YAML, or retry with network access | - Network accessline 125
This ensures the SDK uses `https://login.microsoftonline.com/<your-tenant-id>` instead of `https://login.microsoftonline.com/botframework.com`. - Network accessline 125
This ensures the SDK uses `https://login.microsoftonline.com/<your-tenant-id>` instead of `https://login.microsoftonline.com/botframework.com`. - Network accessline 125
This ensures the SDK uses `https://login.microsoftonline.com/<your-tenant-id>` instead of `https://login.microsoftonline.com/botframework.com`. - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Network accessline 184
curl http://localhost:3978/api/messages - Network accessline 184
curl http://localhost:3978/api/messages - Network accessline 184
curl http://localhost:3978/api/messages - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Dangerous shell operationline 272
curl -s https://raw.githubusercontent.com/OfficeDev/microsoft-365-agents-toolkit/dev/.github/scripts/install-agentsplayground-linux.sh | bash - Dangerous shell operationline 272
curl -s https://raw.githubusercontent.com/OfficeDev/microsoft-365-agents-toolkit/dev/.github/scripts/install-agentsplayground-linux.sh | bash - Dangerous shell operationline 272
curl -s https://raw.githubusercontent.com/OfficeDev/microsoft-365-agents-toolkit/dev/.github/scripts/install-agentsplayground-linux.sh | bash - Network accessline 272
curl -s https://raw.githubusercontent.com/OfficeDev/microsoft-365-agents-toolkit/dev/.github/scripts/install-agentsplayground-linux.sh | bash - Network accessline 272
curl -s https://raw.githubusercontent.com/OfficeDev/microsoft-365-agents-toolkit/dev/.github/scripts/install-agentsplayground-linux.sh | bash - Network accessline 272
curl -s https://raw.githubusercontent.com/OfficeDev/microsoft-365-agents-toolkit/dev/.github/scripts/install-agentsplayground-linux.sh | bash - Dangerous shell operationline 281
rm -rf ~/.fx/bin/testTool - Dangerous shell operationline 281
rm -rf ~/.fx/bin/testTool - Dangerous shell operationline 281
rm -rf ~/.fx/bin/testTool - Dangerous shell operationline 282
rm -rf ~/.fx/bin/testToolBinary - Dangerous shell operationline 282
rm -rf ~/.fx/bin/testToolBinary - Dangerous shell operationline 282
rm -rf ~/.fx/bin/testToolBinary - Network accessline 308
To install manually, download the release from: `https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/tag/teams-app-test-tool%40<version>` - Network accessline 308
To install manually, download the release from: `https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/tag/teams-app-test-tool%40<version>` - Network accessline 308
To install manually, download the release from: `https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/tag/teams-app-test-tool%40<version>` - Network accessline 309
`https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/tag/teams-app-test-tool%40<version>` - Network accessline 309
`https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/tag/teams-app-test-tool%40<version>` - Network accessline 309
`https://github.com/OfficeDev/microsoft-365-agents-toolkit/releases/tag/teams-app-test-tool%40<version>` - Network accessline 366
If npm is not available, install it first (`npm` ships with Node.js). On Linux, the npm-based portable installation is not supported — install Azure Functions Core Tools via the system package manager instead (see [Azure docs](https://learn - Network accessline 366
If npm is not available, install it first (`npm` ships with Node.js). On Linux, the npm-based portable installation is not supported — install Azure Functions Core Tools via the system package manager instead (see [Azure docs](https://learn - Network accessline 366
If npm is not available, install it first (`npm` ships with Node.js). On Linux, the npm-based portable installation is not supported — install Azure Functions Core Tools via the system package manager instead (see [Azure docs](https://learn - Access to secretsline 390
[Credential-related source omitted] - Access to secretsline 390
[Credential-related source omitted] - Access to secretsline 390
[Credential-related source omitted] - Network accessline 427
set HTTPS_PROXY=http://proxy:port # Windows - Network accessline 427
set HTTPS_PROXY=http://proxy:port # Windows - Network accessline 427
set HTTPS_PROXY=http://proxy:port # Windows - Network accessline 428
export HTTPS_PROXY=http://proxy:port # macOS / Linux - Network accessline 428
export HTTPS_PROXY=http://proxy:port # macOS / Linux - Network accessline 428
export HTTPS_PROXY=http://proxy:port # macOS / Linux - Access to secretsline 449
[Credential-related source omitted] - Access to secretsline 449
[Credential-related source omitted] - Access to secretsline 449
[Credential-related source omitted] - Network accessline 458
> **Applicability per row**: lifecycle / environments rows apply to **all ATK projects**. The dev-debug, OAuth/SSO, and manifest rows apply only to **code-based Teams bots/agents**. Declarative-agent and API-plugin troubleshooting (Copilot - Network accessline 458
> **Applicability per row**: lifecycle / environments rows apply to **all ATK projects**. The dev-debug, OAuth/SSO, and manifest rows apply only to **code-based Teams bots/agents**. Declarative-agent and API-plugin troubleshooting (Copilot - Network accessline 458
> **Applicability per row**: lifecycle / environments rows apply to **all ATK projects**. The dev-debug, OAuth/SSO, and manifest rows apply only to **code-based Teams bots/agents**. Declarative-agent and API-plugin troubleshooting (Copilot
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/SKILL.md
- Network accessline 172
🧪 Test widgets locally: - http://localhost:3001/widgets/widget-name.html - Network accessline 172
🧪 Test widgets locally: - http://localhost:3001/widgets/widget-name.html - Network accessline 173
- http://localhost:3001/widgets/widget-name.html - Network accessline 173
- http://localhost:3001/widgets/widget-name.html - Network accessline 174
- http://localhost:3001/widgets/another-widget.html - Network accessline 174
- http://localhost:3001/widgets/another-widget.html - Network accessline 186
### Widgets - [widget-name.html](http://localhost:<PORT>/widgets/widget-name.html) - Network accessline 186
### Widgets - [widget-name.html](http://localhost:<PORT>/widgets/widget-name.html) - Network accessline 187
- [widget-name.html](http://localhost:<PORT>/widgets/widget-name.html) - Network accessline 187
- [widget-name.html](http://localhost:<PORT>/widgets/widget-name.html) - Network accessline 188
- [widget-name2.html](http://localhost:<PORT>/widgets/widget-name2.html) - Network accessline 188
- [widget-name2.html](http://localhost:<PORT>/widgets/widget-name2.html) - Network accessline 190
### Endpoints - MCP server: http://localhost:<PORT>/mcp - Network accessline 190
### Endpoints - MCP server: http://localhost:<PORT>/mcp - Network accessline 191
- MCP server: http://localhost:<PORT>/mcp - Network accessline 191
- MCP server: http://localhost:<PORT>/mcp - Network accessline 194
### Test in Copilot Local: https://m365.cloud.microsoft/chat/?titleId={M365_TITLE_ID from env/.env.local} - Network accessline 194
### Test in Copilot Local: https://m365.cloud.microsoft/chat/?titleId={M365_TITLE_ID from env/.env.local} - Network accessline 195
Local: https://m365.cloud.microsoft/chat/?titleId={M365_TITLE_ID from env/.env.local} - Network accessline 195
Local: https://m365.cloud.microsoft/chat/?titleId={M365_TITLE_ID from env/.env.local} - Network accessline 243
npx @modelcontextprotocol/inspector@0.20.0 --cli https://my-mcp-server.example.com --transport http --method tools/list - Network accessline 243
npx @modelcontextprotocol/inspector@0.20.0 --cli https://my-mcp-server.example.com --transport http --method tools/list
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/references/best-practices.md
- Network accessline 124
icon={<ChatRegular />} as="a" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 124
icon={<ChatRegular />} as="a" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 125
as="a" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} appearance="subtle" - Network accessline 125
as="a" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} appearance="subtle" - Network accessline 126
href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 126
href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 325
1. Kill old tunnels: `pkill -f "devtunnel host" 2>/dev/null` 2. Verify auth: `devtunnel user show` 3. Verify server: `curl -s http://localhost:3001/health` - Network accessline 325
1. Kill old tunnels: `pkill -f "devtunnel host" 2>/dev/null` 2. Verify auth: `devtunnel user show` 3. Verify server: `curl -s http://localhost:3001/health` - Network accessline 327
3. Verify server: `curl -s http://localhost:3001/health` - Network accessline 327
3. Verify server: `curl -s http://localhost:3001/health` - Network accessline 357
SERVER_BASE_URL=http://localhost:3001 - Network accessline 357
SERVER_BASE_URL=http://localhost:3001
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/references/copilot-widget-protocol.md
- Network accessline 120
"mimeType": "text/html+skybridge", "_meta": { "openai/widgetDomain": "https://your-server.example.com", - Network accessline 120
"mimeType": "text/html+skybridge", "_meta": { "openai/widgetDomain": "https://your-server.example.com", - Network accessline 121
"_meta": { "openai/widgetDomain": "https://your-server.example.com", "openai/widgetCSP": { - Network accessline 121
"_meta": { "openai/widgetDomain": "https://your-server.example.com", "openai/widgetCSP": { - Network accessline 122
"openai/widgetDomain": "https://your-server.example.com", - Network accessline 122
"openai/widgetDomain": "https://your-server.example.com", - Network accessline 123
"openai/widgetCSP": { "connect_domains": ["https://your-server.example.com"], "resource_domains": ["https://your-server.example.com"] - Network accessline 123
"openai/widgetCSP": { "connect_domains": ["https://your-server.example.com"], "resource_domains": ["https://your-server.example.com"] - Network accessline 124
"connect_domains": ["https://your-server.example.com"], - Network accessline 124
"connect_domains": ["https://your-server.example.com"], - Network accessline 125
"resource_domains": ["https://your-server.example.com"] - Network accessline 125
"resource_domains": ["https://your-server.example.com"] - Network accessline 140
"text": "<!DOCTYPE html><html>...widget shell HTML...</html>", "_meta": { "openai/widgetDomain": "https://your-server.example.com", - Network accessline 140
"text": "<!DOCTYPE html><html>...widget shell HTML...</html>", "_meta": { "openai/widgetDomain": "https://your-server.example.com", - Network accessline 141
"_meta": { "openai/widgetDomain": "https://your-server.example.com", "openai/widgetCSP": { - Network accessline 141
"_meta": { "openai/widgetDomain": "https://your-server.example.com", "openai/widgetCSP": { - Network accessline 142
"openai/widgetDomain": "https://your-server.example.com", - Network accessline 142
"openai/widgetDomain": "https://your-server.example.com", - Network accessline 143
"openai/widgetCSP": { "connect_domains": ["https://your-server.example.com"], "resource_domains": ["https://your-server.example.com"] - Network accessline 143
"openai/widgetCSP": { "connect_domains": ["https://your-server.example.com"], "resource_domains": ["https://your-server.example.com"] - Network accessline 144
"connect_domains": ["https://your-server.example.com"], - Network accessline 144
"connect_domains": ["https://your-server.example.com"], - Network accessline 145
"resource_domains": ["https://your-server.example.com"] - Network accessline 145
"resource_domains": ["https://your-server.example.com"] - Network accessline 231
| Variable | Example | Purpose | |----------|---------|---------| | `MCP_SERVER_URL` | `https://xxxxx-3001.usw2.devtunnels.ms` | Full server URL — used in resource `_meta` for CSP | - Network accessline 231
| Variable | Example | Purpose | |----------|---------|---------| | `MCP_SERVER_URL` | `https://xxxxx-3001.usw2.devtunnels.ms` | Full server URL — used in resource `_meta` for CSP | - Network accessline 232
|----------|---------|---------| | `MCP_SERVER_URL` | `https://xxxxx-3001.usw2.devtunnels.ms` | Full server URL — used in resource `_meta` for CSP | | `MCP_SERVER_DOMAIN` | `xxxxx-3001.usw2.devtunnels.ms` | Domain only — used in CSP `connec - Network accessline 232
|----------|---------|---------| | `MCP_SERVER_URL` | `https://xxxxx-3001.usw2.devtunnels.ms` | Full server URL — used in resource `_meta` for CSP | | `MCP_SERVER_DOMAIN` | `xxxxx-3001.usw2.devtunnels.ms` | Domain only — used in CSP `connec - Network accessline 233
| `MCP_SERVER_URL` | `https://xxxxx-3001.usw2.devtunnels.ms` | Full server URL — used in resource `_meta` for CSP | - Network accessline 233
| `MCP_SERVER_URL` | `https://xxxxx-3001.usw2.devtunnels.ms` | Full server URL — used in resource `_meta` for CSP | - Network accessline 243
"openai/widgetDomain": "${MCP_SERVER_URL}", "openai/widgetCSP": { "connect_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"], - Network accessline 243
"openai/widgetDomain": "${MCP_SERVER_URL}", "openai/widgetCSP": { "connect_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"], - Network accessline 244
"openai/widgetCSP": { "connect_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"], "resource_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"] - Network accessline 244
"openai/widgetCSP": { "connect_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"], "resource_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"] - Network accessline 245
"connect_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"], - Network accessline 245
"connect_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"], - Network accessline 246
"resource_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"] - Network accessline 246
"resource_domains": ["${MCP_SERVER_URL}", "https://${MCP_SERVER_DOMAIN}"]
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/references/devtunnels.md
- Network accessline 28
- [Azure DevTunnels CLI](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/get-started) installed - Network accessline 28
- [Azure DevTunnels CLI](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/get-started) installed - Network accessline 86
# Extract URL when it appears (only updates .env.local on first run or URL change) if [[ "$line" =~ (https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*) ]]; then - Network accessline 86
# Extract URL when it appears (only updates .env.local on first run or URL change) if [[ "$line" =~ (https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*) ]]; then - Network accessline 87
if [[ "$line" =~ (https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*) ]]; then - Network accessline 87
if [[ "$line" =~ (https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*) ]]; then - Network accessline 164
# Extract URL when it appears if ($_ -match "(https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*)") { - Network accessline 164
# Extract URL when it appears if ($_ -match "(https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*)") { - Network accessline 165
if ($_ -match "(https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*)") { - Network accessline 165
if ($_ -match "(https://[a-zA-Z0-9.-]+\.devtunnels\.ms[^ ]*)") { - Network accessline 240
const port = Number(process.env.DEVTUNNEL_PORT ?? process.env.PORT ?? 3001); const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 240
const port = Number(process.env.DEVTUNNEL_PORT ?? process.env.PORT ?? 3001); const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 241
const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 241
const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 252
function resourceMeta() { const domain = process.env.MCP_SERVER_DOMAIN ?? "localhost"; const url = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 252
function resourceMeta() { const domain = process.env.MCP_SERVER_DOMAIN ?? "localhost"; const url = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 254
const url = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 254
const url = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 257
"openai/widgetDomain": url, "openai/widgetCSP": { connect_domains: [url, `https://${domain}`], - Network accessline 257
"openai/widgetDomain": url, "openai/widgetCSP": { connect_domains: [url, `https://${domain}`], - Network accessline 258
"openai/widgetCSP": { connect_domains: [url, `https://${domain}`], resource_domains: [url, `https://${domain}`], - Network accessline 258
"openai/widgetCSP": { connect_domains: [url, `https://${domain}`], resource_domains: [url, `https://${domain}`], - Network accessline 259
connect_domains: [url, `https://${domain}`], - Network accessline 259
connect_domains: [url, `https://${domain}`], - Network accessline 260
resource_domains: [url, `https://${domain}`], - Network accessline 260
resource_domains: [url, `https://${domain}`],
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/references/mcp-server-pattern.md
- Network accessline 66
// Read from environment (populated by devtunnel script) const port = Number(process.env.DEVTUNNEL_PORT ?? process.env.PORT ?? 3001); const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 66
// Read from environment (populated by devtunnel script) const port = Number(process.env.DEVTUNNEL_PORT ?? process.env.PORT ?? 3001); const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 67
const port = Number(process.env.DEVTUNNEL_PORT ?? process.env.PORT ?? 3001); const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; const serverDomain = process.env.MCP_SERVER_DOMAIN ?? "localhost"; - Network accessline 67
const port = Number(process.env.DEVTUNNEL_PORT ?? process.env.PORT ?? 3001); const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; const serverDomain = process.env.MCP_SERVER_DOMAIN ?? "localhost"; - Network accessline 68
const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 68
const serverUrl = process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 87
"openai/widgetDomain": serverUrl, "openai/widgetCSP": { connect_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 87
"openai/widgetDomain": serverUrl, "openai/widgetCSP": { connect_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 88
"openai/widgetCSP": { connect_domains: [serverUrl, `https://${serverDomain}`], resource_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 88
"openai/widgetCSP": { connect_domains: [serverUrl, `https://${serverDomain}`], resource_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 89
connect_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 89
connect_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 90
resource_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 90
resource_domains: [serverUrl, `https://${serverDomain}`], - Network accessline 252
const httpServer = createServer(async (req, res) => { if (!req.url) { res.writeHead(400).end(); return; } const url = new URL(req.url, `http://${req.headers.host ?? "localhost"}`); - Network accessline 252
const httpServer = createServer(async (req, res) => { if (!req.url) { res.writeHead(400).end(); return; } const url = new URL(req.url, `http://${req.headers.host ?? "localhost"}`); - Network accessline 254
const url = new URL(req.url, `http://${req.headers.host ?? "localhost"}`); - Network accessline 254
const url = new URL(req.url, `http://${req.headers.host ?? "localhost"}`); - Network accessline 343
httpServer.listen(port, () => { console.log(`MCP Server running on http://localhost:${port}`); - Network accessline 343
httpServer.listen(port, () => { console.log(`MCP Server running on http://localhost:${port}`); - Network accessline 344
console.log(`MCP Server running on http://localhost:${port}`); - Network accessline 344
console.log(`MCP Server running on http://localhost:${port}`); - Network accessline 345
console.log(`MCP endpoint: http://localhost:${port}/mcp`); - Network accessline 345
console.log(`MCP endpoint: http://localhost:${port}/mcp`); - Network accessline 435
// Widget base URL: use tunnel URL in remote mode, localhost in local mode const widgetBaseUrl = process.env.WIDGET_BASE_URL ?? process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 435
// Widget base URL: use tunnel URL in remote mode, localhost in local mode const widgetBaseUrl = process.env.WIDGET_BASE_URL ?? process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 436
const widgetBaseUrl = process.env.WIDGET_BASE_URL ?? process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 436
const widgetBaseUrl = process.env.WIDGET_BASE_URL ?? process.env.MCP_SERVER_URL ?? `http://localhost:${port}`; - Network accessline 447
WIDGET_BASE_URL=https://xxxxx-3001.usw2.devtunnels.ms - Network accessline 447
WIDGET_BASE_URL=https://xxxxx-3001.usw2.devtunnels.ms
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/references/plugin-schema.md
- Network accessline 20
{ "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", - Network accessline 20
{ "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", - Network accessline 21
"$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", - Network accessline 21
"$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", - Network accessline 26
"contact_email": "support@example.com", "namespace": "myplugin", "legal_info_url": "https://example.com/legal", - Network accessline 26
"contact_email": "support@example.com", "namespace": "myplugin", "legal_info_url": "https://example.com/legal", - Network accessline 27
"namespace": "myplugin", "legal_info_url": "https://example.com/legal", "privacy_policy_url": "https://example.com/privacy", - Network accessline 27
"namespace": "myplugin", "legal_info_url": "https://example.com/legal", "privacy_policy_url": "https://example.com/privacy", - Network accessline 28
"legal_info_url": "https://example.com/legal", - Network accessline 28
"legal_info_url": "https://example.com/legal", - Network accessline 29
"privacy_policy_url": "https://example.com/privacy", - Network accessline 29
"privacy_policy_url": "https://example.com/privacy", - Network accessline 232
- `${{MCP_SERVER_URL}}` - Full server URL (e.g., `https://tunnel.devtunnels.ms`) - Network accessline 232
- `${{MCP_SERVER_URL}}` - Full server URL (e.g., `https://tunnel.devtunnels.ms`) - Network accessline 238
MCP_SERVER_URL=https://your-tunnel.devtunnels.ms - Network accessline 238
MCP_SERVER_URL=https://your-tunnel.devtunnels.ms
plugins/microsoft-365-agents-toolkit/skills/ui-widget-developer/references/widget-patterns.md
- Network accessline 255
as="a" target="_blank" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 255
as="a" target="_blank" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 256
target="_blank" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} > - Network accessline 256
target="_blank" href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} > - Network accessline 257
href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`} - Network accessline 257
href={`https://teams.microsoft.com/l/chat/0/0?users=${encodeURIComponent(email)}`}
plugins/workiq-preview/skills/workiq-preview/SKILL.md
- Network accessline 122
All entity URLs must start with `/`, without scheme, authority, or API version: `/me/messages`, not `https://graph.microsoft.com/v1.0/me/messages` or `/v1.0/me/messages`. - Network accessline 122
All entity URLs must start with `/`, without scheme, authority, or API version: `/me/messages`, not `https://graph.microsoft.com/v1.0/me/messages` or `/v1.0/me/messages`. - Network accessline 123
`/me/messages`, not `https://graph.microsoft.com/v1.0/me/messages` or `/v1.0/me/messages`. - Network accessline 123
`/me/messages`, not `https://graph.microsoft.com/v1.0/me/messages` or `/v1.0/me/messages`.
plugins/workiq-preview/skills/workiq-preview/references/search-paths-work-iq.md
- Network accessline 42
[Business Applications](business-applications.md). Use natural-language `search_paths` for unknown paths, but use direct `fetch("/businessapps/environments/")` for environment inventory. - Network accessline 42
[Business Applications](business-applications.md). Use natural-language `search_paths` for unknown paths, but use direct `fetch("/businessapps/environments/")` for environment inventory. - Network accessline 44
`fetch("/businessapps/environments/")` for environment inventory. - Network accessline 44
`fetch("/businessapps/environments/")` for environment inventory.
plugins/workiq-preview/skills/workiq-preview/references/workflows-work-iq.md
- Network accessline 52
The bundled `.mcp.json` points to the hosted endpoint `https://workiq.svc.cloud.microsoft/mcp`; MCP calls need no local runtime install. - Network accessline 52
The bundled `.mcp.json` points to the hosted endpoint `https://workiq.svc.cloud.microsoft/mcp`; MCP calls need no local runtime install. - Network accessline 53
`https://workiq.svc.cloud.microsoft/mcp`; MCP calls need no local runtime install. - Network accessline 53
`https://workiq.svc.cloud.microsoft/mcp`; MCP calls need no local runtime install.
plugins/workiq/skills/workiq/SKILL.md
- Network accessline 182
"workiq": { "type": "http", "url": "https://workiq.svc.cloud.microsoft/mcp", - Network accessline 182
"workiq": { "type": "http", "url": "https://workiq.svc.cloud.microsoft/mcp", - Network accessline 183
"type": "http", "url": "https://workiq.svc.cloud.microsoft/mcp", "oauthClientId": "ba081686-5d24-4bc6-a0d6-d034ecffed87", - Network accessline 183
"type": "http", "url": "https://workiq.svc.cloud.microsoft/mcp", "oauthClientId": "ba081686-5d24-4bc6-a0d6-d034ecffed87", - Network accessline 184
"url": "https://workiq.svc.cloud.microsoft/mcp", - Network accessline 184
"url": "https://workiq.svc.cloud.microsoft/mcp", - Network accessline 199
MCP tool calls go to the hosted WorkIQ prod endpoint (`https://workiq.svc.cloud.microsoft/mcp`) and authenticate with the connected user's credentials. - Network accessline 199
MCP tool calls go to the hosted WorkIQ prod endpoint (`https://workiq.svc.cloud.microsoft/mcp`) and authenticate with the connected user's credentials. - Network accessline 203
The hosted endpoint requires an authenticated Microsoft 365 user token. Your MCP host should acquire and attach that token before sending tool calls to `https://workiq.svc.cloud.microsoft/mcp`; do **not** put tokens in prompts, `.mcp.json`, - Network accessline 203
The hosted endpoint requires an authenticated Microsoft 365 user token. Your MCP host should acquire and attach that token before sending tool calls to `https://workiq.svc.cloud.microsoft/mcp`; do **not** put tokens in prompts, `.mcp.json`, - Network accessline 454
1. **Server-relative path only** — start with `/` and **omit** any scheme, authority, or API-version prefix. Valid path roots include `/me/...`, `/users/...`, `/teams/...`, `/groups/...`, `/sites/...`, `/drives/...`, `/planner/...`, and oth - Network accessline 454
1. **Server-relative path only** — start with `/` and **omit** any scheme, authority, or API-version prefix. Valid path roots include `/me/...`, `/users/...`, `/teams/...`, `/groups/...`, `/sites/...`, `/drives/...`, `/planner/...`, and oth - Network accessline 455
- ❌ `https://graph.microsoft.com/v1.0/me/messages` - Network accessline 455
- ❌ `https://graph.microsoft.com/v1.0/me/messages`
plugins/workiq/skills/workiq/references/call-function-work-iq.md
- Network accessline 9
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `functionUrl` | string | Yes | The function path including any required inline parameters (e.g., `/me/reminderView(startDateTime='...',endDateTime - Network accessline 9
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `functionUrl` | string | Yes | The function path including any required inline parameters (e.g., `/me/reminderView(startDateTime='...',endDateTime - Network accessline 11
| `functionUrl` | string | Yes | The function path including any required inline parameters (e.g., `/me/reminderView(startDateTime='...',endDateTime='...')`). Must be a server-relative path — start with `/`, no scheme or authority (`https:/ - Network accessline 11
| `functionUrl` | string | Yes | The function path including any required inline parameters (e.g., `/me/reminderView(startDateTime='...',endDateTime='...')`). Must be a server-relative path — start with `/`, no scheme or authority (`https:/
plugins/workiq/skills/workiq/references/fetch-work-iq.md
- Network accessline 61
Paths must: - Start with `/` (relative to the domain root) - **Not** include a scheme or authority — `https://graph.microsoft.com/v1.0/me/messages` ❌, `/me/messages` ✅ - Network accessline 61
Paths must: - Start with `/` (relative to the domain root) - **Not** include a scheme or authority — `https://graph.microsoft.com/v1.0/me/messages` ❌, `/me/messages` ✅ - Network accessline 62
- Start with `/` (relative to the domain root) - **Not** include a scheme or authority — `https://graph.microsoft.com/v1.0/me/messages` ❌, `/me/messages` ✅ - Have all query parameter values URL-encoded - Network accessline 62
- Start with `/` (relative to the domain root) - **Not** include a scheme or authority — `https://graph.microsoft.com/v1.0/me/messages` ❌, `/me/messages` ✅ - Have all query parameter values URL-encoded - Network accessline 63
- **Not** include a scheme or authority — `https://graph.microsoft.com/v1.0/me/messages` ❌, `/me/messages` ✅ - Network accessline 63
- **Not** include a scheme or authority — `https://graph.microsoft.com/v1.0/me/messages` ❌, `/me/messages` ✅
plugins/workiq/skills/workiq/references/sharepoint-library-metadata.md
plugins/workiq/skills/workiq/references/teams-work-iq.md
- Network accessline 96
"@odata.type": "#microsoft.graph.aadUserConversationMember", "roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{signedInUserId}')" - Network accessline 96
"@odata.type": "#microsoft.graph.aadUserConversationMember", "roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{signedInUserId}')" - Network accessline 97
"roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{signedInUserId}')" }, - Network accessline 97
"roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{signedInUserId}')" }, - Network accessline 98
"user@odata.bind": "https://graph.microsoft.com/v1.0/users('{signedInUserId}')" - Network accessline 98
"user@odata.bind": "https://graph.microsoft.com/v1.0/users('{signedInUserId}')" - Network accessline 101
"@odata.type": "#microsoft.graph.aadUserConversationMember", "roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{counterpartUserId}')" - Network accessline 101
"@odata.type": "#microsoft.graph.aadUserConversationMember", "roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{counterpartUserId}')" - Network accessline 102
"roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{counterpartUserId}')" } - Network accessline 102
"roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{counterpartUserId}')" } - Network accessline 103
"user@odata.bind": "https://graph.microsoft.com/v1.0/users('{counterpartUserId}')" - Network accessline 103
"user@odata.bind": "https://graph.microsoft.com/v1.0/users('{counterpartUserId}')"
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 1 fact
- Contacts myapp-tunnel-xyz.usw2.devtunnels.ms, which SKILL.md, the README and the plugin manifest do not mentionsetup-sso-ui-widget/scripts/resync-tunnel-url.ps1:16High confidence
Signal confidence: 499 facts
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/examples/not-atk-project.md:21Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuem365-agent-evaluator/examples/not-atk-project.md:21Low confidence
- Access to secrets in prose of documentationplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/azure-setup.md:48Low confidence
- Access to secrets in prose of documentationm365-agent-evaluator/references/azure-setup.md:48Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/azure-setup.md:71Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuem365-agent-evaluator/references/azure-setup.md:71Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/azure-setup.md:88Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuem365-agent-evaluator/references/azure-setup.md:88Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueplugins/microsoft-365-agents-toolkit/skills/m365-agent-evaluator/references/workflow.md:84Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuem365-agent-evaluator/references/workflow.md:84Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:156Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:156Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:157Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:157Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:166Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:166Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:167Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:167Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:168Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:168Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:173Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:173Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:174Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:174Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:175Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:175Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:190Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:190Low confidence
- Network access in prose of the SKILL.mdplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/SKILL.md:191Low confidence
- Network access in prose of the SKILL.mdsetup-sso-ui-widget/SKILL.md:191Low confidence
- Executable script in a comment of a file that runsplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/auth.ts:1Low confidence
- Executable script in a comment of a file that runssetup-sso-ui-widget/references/auth.ts:1Low confidence
- Network access in code of a file that runsplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/auth.ts:29High confidence
- Network access in code of a file that runssetup-sso-ui-widget/references/auth.ts:29High confidence
- Network access in code of a file that runsplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/auth.ts:31High confidence
- Network access in code of a file that runssetup-sso-ui-widget/references/auth.ts:31High confidence
- Network access in code of a file that runsplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/auth.ts:40High confidence
- Network access in code of a file that runssetup-sso-ui-widget/references/auth.ts:40High confidence
- Network access in prose of documentationplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/easy-auth.md:25Low confidence
- Network access in prose of documentationsetup-sso-ui-widget/references/easy-auth.md:25Low confidence
- Network access in prose of documentationplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/easy-auth.md:26Low confidence
- Network access in prose of documentationsetup-sso-ui-widget/references/easy-auth.md:26Low confidence
- Network access in prose of documentationplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/easy-auth.md:27Low confidence
- Network access in prose of documentationsetup-sso-ui-widget/references/easy-auth.md:27Low confidence
- Network access in prose of documentationplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/easy-auth.md:53Low confidence
- Network access in prose of documentationsetup-sso-ui-widget/references/easy-auth.md:53Low confidence
- Network access in prose of documentationplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/easy-auth.md:54Low confidence
- Network access in prose of documentationsetup-sso-ui-widget/references/easy-auth.md:54Low confidence
- Network access in prose of documentationplugins/microsoft-365-agents-toolkit/skills/setup-sso-ui-widget/references/sso-explained.md:106Low confidence
- Network access in prose of documentationsetup-sso-ui-widget/references/sso-explained.md:106Low confidence
and 449 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md plugins/microsoft-365-agents-toolkit/skills/declarative-agent-developer/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md plugins/microsoft-365-agents-toolkit/skills/declarative-agent-developer/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md plugins/microsoft-365-agents-toolkit/skills/declarative-agent-developer/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md plugins/microsoft-365-agents-toolkit/skills/declarative-agent-developer/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/microsoft-work-iq/)