Teams App Developer
MicrosoftOfficialPublished by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The teams-app-developer skill provides a structured framework for managing the lifecycle of Microsoft 365 agents and Teams applications. It leverages the ATK CLI to handle project scaffolding, local testing via the Agents Playground, cloud provisioning on Azure, and troubleshooting. The skill includes specialized guidance for migrating Slack bots to Teams, including converting Block Kit UI to Adaptive Cards, and provides access to an extensive library of micro-expert documentation for cross-platform development.
What it does
- Scaffolds new Microsoft 365 agents and Teams applications from templates.
- Facilitates local testing using the Agents Playground or Teams-specific environments.
- Automates Azure resource provisioning and cloud deployment workflows.
- Provides diagnostic procedures for common authentication and configuration errors.
- Supports migration of Slack bots to the Teams platform.
- Manages project configuration and environment variables for ATK-based projects.
When to use it
- When starting a new Teams app, bot, or Declarative Agent project.
- When you need to test an agent locally before deploying to the cloud.
- When migrating existing Slack bots to the Microsoft Teams ecosystem.
- When troubleshooting deployment or authentication issues in a Teams project.
- When you need to provision Azure infrastructure for a Teams application.
Advantages
- Streamlines the development lifecycle with standardized CLI commands.
- Reduces development time by offering a local testing playground.
- Provides expert-level guidance for complex cross-platform migrations.
- Ensures consistent configuration management across development environments.
- Includes robust error-handling protocols for common platform-specific pitfalls.
Usage examples
- “Create a new Teams bot project using the default template.”
- The agent will initialize a new project folder, configure the necessary YAML files, and guide you through the initial setup using the ATK CLI.
- “How do I migrate my Slack bot to Microsoft Teams?”
- The agent will initiate the slack-to-teams workflow, providing access to cross-platform bridging experts and guidance on converting UI components.
- “My Teams bot is returning a 401 error, how do I fix it?”
- The agent will trigger the troubleshooting workflow, checking your environment variables, tunnel status, and authentication configuration.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/teams-app-developer/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip teams-app-developer.zip -d .agents/skills
Documentation by Microsoft
Microsoft 365 Agents Toolkit Skill
Build Microsoft 365 agents and Teams apps using the ATK CLI.
AI Behavior Guidelines
Testing Strategy: Recommend Agents Playground first (faster, no M365 needed). Use Teams workflow only if user explicitly requests it.
Environment Variables: NEVER hardcode secrets or make up placeholder values. Always ask users for real values.
Error Handling: Read error messages carefully. Check
env/.env.local,.localConfigs, andatk auth list. Common pitfalls:AADSTS7000229→aadApp/createmissinggenerateServicePrincipal: truein YAML — add it and re-provisionMissing
TENANT_IDin.localConfigs→ SDK uses wrong token authority → 401 from Bot Connector401 persists after auth fix → devtunnel URL may be blacklisted — create a fresh tunnel
See troubleshoot/troubleshoot.md for full diagnostic steps
Long-Running Commands — WAIT for completion:
atk new,atk provision,atk deploycan take several minutesAlways wait for completion before running the next step (timeout 120000ms+)
Local Service Startup — Hangs terminal (expected):
npm run dev,npm start,python app.py,devtunnel host, etc. will hang — the process keeps running indefinitelyALWAYS run as a background process (
isBackground=true) — NEVER useisBackground=falsefor these commandsDo NOT wait for it to "finish" — verify startup by checking output for "listening on port" or tunnel URL
If errors appear, read logs, diagnose, fix, restart
Use a NEW terminal to launch Agents Playground or open Teams sideloading URL
Monitor App Logs: Periodically check background terminal output for runtime errors. If the app crashes, read the error, fix the root cause, and restart.
Telemetry Tagging: Before running any
atkCLI commands, set the session environment variable so all CLI invocations are tagged as skill-initiated:export ATK_CLI_SKILL=trueRun this once at the start of the session. All subsequent
atkcommands in the same terminal will inherit it.
ATK CLI Setup
atk --version # Must be > 1.1.5-betaIf ATK is not found or version is too old:
npm i -g @microsoft/m365agentstoolkit-cli@betaCLI Global Options
| Option | Meaning | Recommendation |
|---|---|---|
-i | Interactive mode | Always use -i false in automation to avoid hanging |
-f | Project folder | Default to be current directory, used when specifying a custom folder. When scaffolding a new project, this is the parent folder where the project folder will be created under. |
-h | Command help | Use atk <command> -h for quick syntax checks |
Sub-Skills
| Sub-Skill | When to Use | Reference |
|---|---|---|
| create-project | Scaffold new project from template, choose template, atk new | create-project/create-project.md |
| test-playground | Test locally with Agents Playground, agentsplayground, quick testing | test-playground/test-playground.md |
| test-teams | Run on Teams, devtunnel, sideload, Teams testing, test in Copilot | test-teams/test-teams.md |
| provision-deploy | Provision Azure resources, deploy to cloud, atk provision, atk deploy | provision-deploy/provision-deploy.md |
| troubleshoot | Fix errors, 401, port conflicts, YAML errors, stale bots | troubleshoot/troubleshoot.md |
| slack-to-teams | Migrate Slack bot to Teams, cross-platform bridging, Block Kit to Adaptive Cards | slack-to-teams/SKILL.md |
MANDATORY: Before executing any workflow, read the corresponding sub-skill document.
Shared References
manifest-and-yaml.md — Project files, YAML config, env vars, .localConfigs flow
commands.md — ATK CLI commands: package, validate, share, collaborate
templates.md — Complete template catalog with language support
experts/ — 100+ micro-expert files: Teams SDK, Slack SDK, cross-platform bridging, deploy, AI models, security, language conversion
docs/ — Platform comparison guides: UI, messaging, identity, infrastructure, feature gaps
Workflow Chains
Match user intent to the smallest valid workflow.
| User Intent | Workflow (read in order) |
|---|---|
| Build new app from scratch | create-project → test-playground |
| Test existing project locally | test-playground (recommended) or test-teams |
| Deploy to Azure | provision-deploy |
| Fix broken bot | troubleshoot → re-test |
| Migrate Slack bot to Teams | slack-to-teams |
MANDATORY: Before executing any slack-to-teams workflow, read slack-to-teams/SKILL.md first. The sub-skill contains a routed expert system with 100+ micro-expert files for cross-platform bot development.
ATK Project Context Resolution
Resolve config values only when missing. If a value is already known in the session, reuse it.
Step 1: Detect ATK Project
If m365agentstoolkit*.yml exists in the current folder, treat it as an ATK project and parse configuration.
Step 2: Resolve Common Configuration
Resolve variables referenced in m365agentstoolkit*.yml. Common variables:
AZURE_OPENAI_API_KEY
AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_DEPLOYMENT_NAME
Step 3: Collect Missing Values
If required values are missing, ask the user for only the missing ones.
Refer to manifest-and-yaml.md for full config-file details.
Files
- ATTRIBUTION.mdAdded by AutoGineer906 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md7.6 KiB
- create-project/create-project.md8.1 KiB
- docs/README.md2.8 KiB
- docs/advanced-features.md7.0 KiB
- docs/feature-gaps.md46.3 KiB
- docs/files-and-links.md4.2 KiB
- docs/identity-and-auth.md4.3 KiB
- docs/infrastructure.md6.7 KiB
- docs/interactive-responses.md4.4 KiB
- docs/messaging-and-commands.md4.5 KiB
- docs/middleware-and-handlers.md4.4 KiB
- docs/ui-components.md6.9 KiB
- docs/workflows.md14.4 KiB
- experts/README.md8.6 KiB
- experts/_expert-ts.md2.2 KiB
- experts/analyzer.md14.0 KiB
- experts/bridge/app-distribution-packaging-ts.md14.2 KiB
- experts/bridge/channel-ops-graph-ts.md15.4 KiB
- experts/bridge/commands-slash-text-ts.md18.5 KiB
- experts/bridge/cross-platform-advisor-ts.md36.4 KiB
- experts/bridge/cross-platform-architecture-ts.md8.3 KiB
- experts/bridge/events-activities-ts.md22.4 KiB
- experts/bridge/files-upload-download-ts.md17.2 KiB
- experts/bridge/identity-oauth-bridge-ts.md19.8 KiB
- experts/bridge/index.md13.0 KiB
- experts/bridge/infra-compute-ts.md14.6 KiB
- experts/bridge/infra-observability-ts.md14.0 KiB
- experts/bridge/infra-secrets-config-ts.md13.2 KiB
- experts/bridge/infra-storage-ts.md14.3 KiB
- experts/bridge/interactive-responses-ts.md19.6 KiB
- experts/bridge/link-unfurl-preview-ts.md17.1 KiB
- experts/bridge/middleware-handlers-ts.md15.4 KiB
- experts/bridge/python-cross-platform.md9.3 KiB
- experts/bridge/rate-limiting-resilience-ts.md17.6 KiB
- experts/bridge/rest-only-integration-ts.md8.4 KiB
- experts/bridge/scheduling-deferred-send-ts.md17.8 KiB
- experts/bridge/shortcuts-extensions-ts.md17.5 KiB
- experts/bridge/transport-socketmode-https-ts.md14.3 KiB
- experts/bridge/ui-app-home-personal-tab-ts.md14.5 KiB
- experts/bridge/ui-block-kit-adaptive-cards-ts.md21.5 KiB
- experts/bridge/ui-legacy-attachments-cards-ts.md11.2 KiB
- experts/bridge/ui-modals-dialogs-ts.md21.4 KiB
- experts/bridge/workflow.composable-platform-ts.md13.7 KiB
- experts/bridge/workflows-automation-ts.md14.3 KiB
- experts/builder.md11.1 KiB
- experts/convert/bulk-conversion-strategy-ts.md12.8 KiB
- experts/convert/dependency-mapping-ts.md8.3 KiB
- experts/convert/index.md3.5 KiB
- experts/convert/java-to-ts-ts.md20.6 KiB
- experts/convert/js-to-ts-ts.md6.2 KiB
- experts/convert/json-serialization-ts.md11.0 KiB
- experts/convert/kotlin-to-ts-ts.md11.2 KiB
- experts/convert/ruby-to-ts-ts.md9.7 KiB
- experts/convert/type-mapping-ts.md10.1 KiB
- experts/deploy/aws-bot-deploy-ts.md14.6 KiB
- experts/deploy/aws-cli-reference-ts.md52.4 KiB
- experts/deploy/azure-bot-deploy-ts.md15.4 KiB
- experts/deploy/azure-cli-reference-ts.md16.9 KiB
- experts/deploy/index.md4.6 KiB
- experts/fallback.md2.1 KiB
- experts/index.md18.9 KiB
- experts/models/anthropic-ts.md7.8 KiB
- experts/models/bedrock-ts.md9.9 KiB
- experts/models/foundry-cloud-ts.md8.1 KiB
- experts/models/foundry-local-ts.md10.6 KiB
- experts/models/index.md5.8 KiB
- experts/models/openai-azure-openai-ts.md8.3 KiB
- experts/models/oss-openai-compatible-ts.md10.7 KiB
- experts/models/transformers-js-ts.md11.6 KiB
- experts/prompt-engineer.md14.7 KiB
- experts/researcher.md2.8 KiB
- experts/security/index.md1.2 KiB
- experts/security/input-validation-ts.md13.8 KiB
- experts/security/secrets-ts.md13.9 KiB
- experts/slack/bolt-assistant-ts.md9.9 KiB
- experts/slack/bolt-events-ts.md9.3 KiB
- experts/slack/bolt-java.md8.9 KiB
- experts/slack/bolt-oauth-distribution-ts.md10.9 KiB
- experts/slack/bolt-python.md9.5 KiB
- experts/slack/cli.app-management.md7.9 KiB
- experts/slack/cli.datastore-env.md8.6 KiB
- experts/slack/cli.getting-started.md8.0 KiB
- experts/slack/cli.local-dev-deploy.md8.4 KiB
- experts/slack/cli.manifest-triggers.md9.9 KiB
- experts/slack/index.md8.9 KiB
- experts/slack/runtime.ack-rules-ts.md9.8 KiB
- experts/slack/runtime.bolt-foundations-ts.md10.7 KiB
- experts/slack/runtime.shortcuts-ts.md11.0 KiB
- experts/slack/runtime.slash-commands-ts.md11.6 KiB
- experts/slack/runtime.socket-mode-ts.md9.5 KiB
- experts/slack/ui.block-kit-ts.md11.5 KiB
- experts/slack/ui.modals-lifecycle-ts.md13.3 KiB
- experts/slack/web-api-proactive-ts.md11.0 KiB
- experts/slack/workflow.slack-automations-ts.md10.2 KiB
- experts/teams/a2a.client-basics-ts.md9.7 KiB
- experts/teams/a2a.orchestrator-patterns-ts.md12.7 KiB
- experts/teams/a2a.server-basics-ts.md11.4 KiB
- experts/teams/ai.chatprompt-basics-ts.md8.1 KiB
- experts/teams/ai.citations-feedback-ts.md6.9 KiB
- experts/teams/ai.conversational-query-ts.md14.2 KiB
- experts/teams/ai.function-calling-design-ts.md9.0 KiB
- experts/teams/ai.function-calling-implementation-ts.md7.7 KiB
- experts/teams/ai.memory-localmemory-ts.md7.3 KiB
- experts/teams/ai.model-setup-ts.md6.6 KiB
- experts/teams/ai.rag-retrieval-ts.md7.4 KiB
- experts/teams/ai.rag-vectorstores-ts.md8.5 KiB
- experts/teams/ai.streaming-ts.md6.9 KiB
- experts/teams/auth.oauth-sso-ts.md10.1 KiB
- experts/teams/compat.botbuilder-interop-ts.md14.6 KiB
- experts/teams/dev.debug-test-ts.md14.1 KiB
- experts/teams/graph.usergraph-appgraph-ts.md9.0 KiB
- experts/teams/index.md9.8 KiB
- experts/teams/mcp.client-basics-ts.md9.5 KiB
- experts/teams/mcp.expose-chatprompt-tools-ts.md9.5 KiB
- experts/teams/mcp.security-ts.md10.4 KiB
- experts/teams/mcp.server-basics-ts.md9.9 KiB
- experts/teams/project.scaffold-files-ts.md12.2 KiB
- experts/teams/runtime.app-init-ts.md10.9 KiB
- experts/teams/runtime.manifest-ts.md12.3 KiB
- experts/teams/runtime.proactive-messaging-ts.md12.6 KiB
- experts/teams/runtime.routing-handlers-ts.md12.3 KiB
- experts/teams/state.storage-patterns-ts.md9.4 KiB
- experts/teams/teams-dotnet.md8.2 KiB
- experts/teams/teams-python.md8.3 KiB
- experts/teams/ui.adaptive-cards-ts.md12.9 KiB
- experts/teams/ui.dialogs-task-modules-ts.md15.1 KiB
- experts/teams/ui.message-extensions-ts.md15.6 KiB
- experts/teams/workflow.approvals-inline-ts.md12.4 KiB
- experts/teams/workflow.message-native-records-ts.md10.6 KiB
- experts/teams/workflow.sharepoint-lists-ts.md9.0 KiB
- experts/teams/workflow.state-driven-events-ts.md12.2 KiB
- experts/teams/workflow.triggers-compose-ts.md10.3 KiB
- experts/update-experts.md10.0 KiB
- provision-deploy/provision-deploy.md4.3 KiB
- test-playground/playground-cli.md4.6 KiB
- test-playground/playground.md4.5 KiB
- test-playground/test-playground.md1.1 KiB
- test-teams/test-teams.md4.9 KiB
- toolkit/README.md4.2 KiB
- toolkit/commands.md2.6 KiB
- toolkit/environments.md12.6 KiB
- toolkit/lifecycle-cli.md17.6 KiB
- toolkit/manifest-and-yaml.md6.0 KiB
- toolkit/playground.md7.6 KiB
- toolkit/publish.md9.3 KiB
- toolkit/templates.md6.7 KiB
- troubleshoot/troubleshoot.md20.2 KiB
experts/prompt-engineer.md
prompt-engineer
purpose
Design prompts as information architecture over a 1D token stream — reducing semantic distance, compressing before reasoning, and constraining expansion during writing.
rules
Treat prompting as a distance design problem. LLMs see a flat token stream, not tables, headers, or sections. Every prompt decision is about reducing token traversal distance between a question and its relevant data, a field name and its value, an instruction and its constraint, an example and its expected output.
Reformat structured data into records, not tables. Tables look organized to humans but scatter related values across distant token positions. Convert tabular data into per-record blocks where each label sits immediately next to its value. The model retrieves fields by proximity, not by column headers.
Compress before reasoning. Reasoning is collapsing many possible interpretations into one. Before asking the model to reason, reduce irrelevant tokens, remove noise, surface only task-relevant facts, and force discrete decisions (Yes/No, choose one, rank). Every token of noise increases entropy and degrades the compression.
Use compression mechanisms deliberately. RAG retrieval, summarization, scratchpads, chain-of-thought, entity extraction, and tool calls are all compression mechanisms. Choose the one that matches the bottleneck: retrieval for finding, summarization for condensing, chain-of-thought for multi-step inference, tool calls for grounding.
Constrain decompression explicitly. Writing is controlled expansion from a compressed representation. Unconstrained expansion drifts toward generic filler. Always specify: target audience, tone, length, format, required elements, and output schema. Each constraint reduces degrees of freedom and increases output quality.
Diagnose the failure mode before redesigning. Three distinct failure categories require different fixes. If the model can't find information → distance problem (move things closer). If the model draws wrong conclusions → compression problem (improve intermediate structure). If the output reads poorly → decompression problem (add constraints). Never redesign the whole prompt when only one layer is broken.
Design for positional attention. Attention is strongest at the edges of context (beginning and end) and weakest in the middle. Put critical instructions at the top. Put the user's question at the bottom. Inject retrieved data near the query. Never bury high-signal content in the middle of long context.
Prefer structure over volume. More tokens do not mean better performance. Intentional compression, proximity engineering, context rewriting, and selective retrieval outperform longer prompts with more raw content. If adding context doesn't reduce distance or improve compression, it adds noise.
Place labels adjacent to values. Any time the model must associate a name with a piece of data (field/value, question/answer, instruction/example), put them directly next to each other in the token stream. Separation creates retrieval failures the model cannot recover from.
Force discrete outputs for reasoning steps. Open-ended intermediate steps increase entropy. When chaining reasoning, constrain each step to a discrete decision — a classification, a yes/no, a selection from enumerated options. Each forced decision compresses the possibility space for the next step.
Scope retrieved context to the task. RAG and context injection should deliver only what the current query needs. Retrieving "everything related" adds noise tokens the model must traverse. Filter, re-rank, and truncate retrieved content before injecting it into the prompt.
Write prompts as systems, not sentences. Prompting is information architecture — pipelines, latent plans, context transformations, compression→latent→decompression flows. Design token flow the way you'd design a data pipeline: each stage transforms the representation toward the output.
Use open-only
<SECTION>tags to structure prompts. Delineate prompt regions with<SECTION_NAME>tags — no closing</SECTION_NAME>tag. The open tag acts as a label that the model pattern-matches against. Closing tags add tokens without adding signal. Each distinct data type gets its own named section (<DOCUMENT>,<USER_PROFILE>,<SEARCH_RESULTS>, etc.).Put all data sections at the top,
<INSTRUCTIONS>at the bottom. Data sections occupy the top of the prompt where they're loaded into context. The<INSTRUCTIONS>block goes at the bottom — the high-attention end of the token stream. This separates what the model knows from what the model should do.Reference section names inside
<INSTRUCTIONS>using the same tag format. When a rule in<INSTRUCTIONS>refers to data, use the exact<SECTION_NAME>tag from the data section. Writing "Use the information in<DOCUMENT>to..." reinforces the pattern match between the instruction and the data it targets. The repeated tag acts as a semantic anchor — the model doesn't search for meaning, it matches the token pattern.Move
<INSTRUCTIONS>to user messages for multi-turn flows. In multi-turn conversations where each turn needs different instructions, place the data sections in the system prompt (stable across turns) and the<INSTRUCTIONS>block in the user message (changes per turn). This lets you re-instruct the model at each step without duplicating context.Place persona declarations above the first section tag, if used at all. Persona framing ("You are an expert at...") is rarely necessary — constraints and instructions are more effective. When persona is needed, place it at the very top of the prompt before the first
<SECTION>tag so it colors everything that follows.
interview
Q1 — Task type
question: "What kind of prompting task are you working on?"
header: "Task type"
options:
- label: "You decide everything"
description: "Use your best judgment for all decisions — skip remaining questions."
- label: "Data extraction / retrieval"
description: "Getting the model to find and return specific information from context."
- label: "Reasoning / analysis"
description: "Getting the model to draw conclusions, classify, or make decisions."
- label: "Content generation"
description: "Getting the model to produce structured text, code, or creative output."
multiSelect: falseQ2 — Failure mode
question: "What's going wrong with your current prompt (if anything)?"
header: "Diagnosis"
options:
- label: "You decide everything else"
description: "No specific failure — I want a prompt designed from scratch."
- label: "Can't find the right info"
description: "The model misses or ignores relevant data in the context. (Distance problem)"
- label: "Wrong conclusions"
description: "The model finds the data but reasons incorrectly. (Compression problem)"
- label: "Bad output quality"
description: "The reasoning is fine but the output format/style/tone is wrong. (Decompression problem)"
multiSelect: falsedefaults table
| Question | Default |
|---|---|
| Q1 | Content generation |
| Q2 | No specific failure — design from scratch |
patterns
Converting a table to proximity-optimized records
# BAD — table scatters related values across token positions
| Name | Role | Department | Start Date |
|---------|-----------|------------|------------|
| Alice | Engineer | Platform | 2023-01-15 |
| Bob | Designer | Product | 2022-06-01 |
# GOOD — record format keeps each entity's fields adjacent
## Employee: Alice
- Role: Engineer
- Department: Platform
- Start Date: 2023-01-15
## Employee: Bob
- Role: Designer
- Department: Product
- Start Date: 2022-06-01Section-tag prompt layout (single turn)
<USER_PROFILE>
Name: Alice
Role: Engineering Manager
Team: Platform
Preferences: concise answers, no jargon
<DOCUMENT>
[retrieved documentation chunks, pre-filtered and re-ranked]
<INSTRUCTIONS>
Using the information in <DOCUMENT>, answer the user's question.
Tailor your response to the reader described in <USER_PROFILE>.
Keep the answer to 2-3 sentences. Cite the document section by name.
If the answer is not in <DOCUMENT>, say "I don't have that information."Section-tag prompt layout (multi-turn)
# --- System prompt (stable across turns) ---
<USER_PROFILE>
Name: Alice
Role: Engineering Manager
Team: Platform
<DOCUMENT>
[retrieved documentation — stays in context across turns]
# --- User message turn 1 ---
<INSTRUCTIONS>
Summarize the key points in <DOCUMENT> relevant to the
reader in <USER_PROFILE>. Use bullet points, max 5 bullets.
# --- User message turn 2 (new instructions, same data) ---
<INSTRUCTIONS>
Based on <DOCUMENT>, draft a 2-sentence Slack message from
the person in <USER_PROFILE> announcing the most important
change to their team. Tone: direct and positive.Compression chain: open-ended question → constrained reasoning
# --- Turn 1: Extract (compression) ---
<BUG_REPORT>
{raw bug report text}
<INSTRUCTIONS>
From the report in <BUG_REPORT>, extract:
- Component affected: (one of: auth, api, ui, database)
- Severity: (critical / high / medium / low)
- Reproducible: (yes / no / unknown)
# --- Turn 2: Reason over compressed representation ---
<TRIAGE>
Component: {extracted_component}
Severity: {extracted_severity}
Reproducible: {extracted_reproducible}
<INSTRUCTIONS>
Using the fields in <TRIAGE>, select the response action:
- If critical + reproducible → "hotfix: page on-call"
- If critical + not reproducible → "investigate: assign senior engineer"
- If high + reproducible → "prioritize: next sprint"
- Otherwise → "triage: add to backlog"
# --- Turn 3: Expand with constraints (decompression) ---
<TRIAGE>
Component: {extracted_component}
Severity: {extracted_severity}
Action: {selected_action}
<INSTRUCTIONS>
Using the fields in <TRIAGE>, write a 2-sentence Slack message
to the engineering channel. Tone: urgent but calm.
Include: component, severity, chosen action.Diagnostic checklist prompt
# When a prompt fails, run through this diagnostic:
## 1. Distance check
- Is the relevant data within ~500 tokens of the question?
- Are labels directly adjacent to their values?
- Is anything critical buried in the middle of a long context?
→ Fix: restructure data, move fields closer, trim irrelevant context.
## 2. Compression check
- Is the model asked to reason over raw, unstructured input?
- Are intermediate steps unconstrained (free-text instead of discrete)?
- Is there more context than the task actually requires?
→ Fix: pre-extract, force classifications, reduce to task-relevant facts.
## 3. Decompression check
- Did you specify: audience, tone, length, format, required elements?
- Is there an output schema or example?
- Could two equally skilled people interpret the prompt differently?
→ Fix: add constraints, provide a concrete output example.pitfalls
Assuming the model "sees" your formatting. Markdown headers, table borders, and indentation carry weak signal at best. The model processes tokens sequentially — visual structure doesn't create semantic structure. Always design for the token stream, not the rendered view.
Adding more context to fix retrieval failures. When the model can't find information, the instinct is to add more. This usually makes it worse — more tokens means greater traversal distance. Instead, remove irrelevant content and move the relevant data closer to the query.
Using free-text intermediate steps. Asking the model to "think through" a problem in free text generates unconstrained tokens that expand rather than compress the possibility space. Force intermediate outputs into discrete categories, structured fields, or enumerated options.
Placing instructions in the middle of context. The "Lost in the Middle" effect is well-documented. Instructions, constraints, and critical data placed in the middle of a long context are reliably degraded. Use the top and bottom of the prompt for high-signal content.
Treating all prompt failures the same. Rewriting an entire prompt because the output is wrong wastes effort and obscures the root cause. A distance failure, a compression failure, and a decompression failure require different fixes. Diagnose first.
Over-engineering with chain-of-thought. Chain-of-thought is a compression mechanism for multi-step reasoning. Applying it to simple retrieval or generation tasks adds unnecessary tokens without improving quality. Match the mechanism to the bottleneck.
Adding closing
</SECTION>tags. Closing tags waste tokens without adding signal. The next open<SECTION>tag implicitly ends the previous section. The model pattern-matches on the open tag — the closing tag is noise.Not referencing
<SECTION>names in instructions. If<INSTRUCTIONS>says "use the document" instead of "use <DOCUMENT>", the model must infer which section you mean. The repeated tag pattern creates a direct token-level link between the rule and the data it operates on. Always use the exact tag name.
instructions
Use this expert when the developer is designing, debugging, or optimizing prompts for LLMs — whether for application prompts, system prompts, RAG pipelines, agent instructions, or any task involving prompt architecture.
Trigger phrases: "write a prompt," "prompt engineering," "prompt design," "fix my prompt," "prompt not working," "LLM prompt," "system prompt," "improve prompt," "prompt template," "RAG prompt," "optimize prompt," "prompt debugging."
Pair with: any language expert from ../languages/ when implementing prompt pipelines in code. Pair with: json-yaml.md when working with structured prompt templates or output schemas.
research
Deep Research prompt:
"Write a micro-expert for LLM prompt engineering based on an information-architecture mental model. Core framework: prompting is a distance design problem over a 1D token stream. Cover: token proximity as the fundamental retrieval mechanism (not visual structure), table-to-record reformatting for distance reduction, compression before reasoning (RAG retrieval, summarization, chain-of-thought, entity extraction, tool calls as compression mechanisms), constrained decompression for writing (audience, tone, length, format, schema), the three-category diagnostic framework (distance problems, compression problems, decompression problems), positional attention design (Lost in the Middle effect, edge placement), structure vs. volume tradeoffs, discrete vs. free-text intermediate steps, and prompt-as-system-design rather than wordsmithing. Include patterns for RAG prompt layout, table-to-record conversion, compression chains, and diagnostic checklists."
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python, Needs Node.js
Security
What our scanner noticed· Medium risk
- Possible data-exfiltration endpoints
- Instructions that use the network
- Downloads piped into a shell
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/microsoft-365-agents-toolkit/skills/teams-app-developer · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download teams-app-developer.zip