ms-ai-architect/skills/ms-ai-advisor/references/copilot-extensibility/teams-copilot-message-extensions.md
Kjell Tore Guttormsen baa2d0220b feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command
Add /ultraresearch-local for structured research combining local codebase
analysis with external knowledge via parallel agent swarms. Produces research
briefs with triangulation, confidence ratings, and source quality assessment.

New command: /ultraresearch-local with modes --quick, --local, --external, --fg.
New agents: research-orchestrator (opus), docs-researcher, community-researcher,
security-researcher, contrarian-researcher, gemini-bridge (all sonnet).
New template: research-brief-template.md.

Integration: --research flag in /ultraplan-local accepts pre-built research
briefs (up to 3), enriches the interview and exploration phases. Planning
orchestrator cross-references brief findings during synthesis.

Design principle: Context Engineering — right information to right agent at
right time. Research briefs are structured artifacts in the pipeline:
ultraresearch → brief → ultraplan --research → plan → ultraexecute.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 08:58:35 +02:00

471 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Teams Copilot Message Extensions and Plugins
**Last updated:** 2026-02
**Status:** GA (Public Preview for agents)
**Category:** Copilot Extensibility & Integration
---
## Introduksjon
Message extensions er en kjernefunksjon i Microsoft Teams og Outlook som lar brukere interagere med eksterne tjenester direkte fra chat-grensesnittet. Med introduksjonen av Microsoft 365 Copilot har message extensions fått en ny rolle som **plugins** — brukere kan nå bruke naturlig språk for å utløse søk og handlinger, uten å måtte navigere spesifikke UI-kommandoer.
Message extensions som Copilot-plugins representerer et paradigmeskifte: i stedet for å klikke på knapper og fylle ut skjemaer, kan brukeren si "vis produkter på lager" eller "opprett en oppgave i vårt system", og Copilot orkestrerer kallet til riktig plugin basert på kontekst. Svaret leveres som Adaptive Cards, som kan være interaktive og inneholde handlinger.
**Arkitektonisk nøkkelegenskap:** Message extensions bygges med Bot Framework SDK, som håndterer både Teams-integrasjon og Copilot-orkestrering. Dette gir en konsistent utvikleropplevelse for både bot-baserte applikasjoner og Copilot-plugins.
---
## Kjernekomponenter
### Typer message extensions
| Type | Beskrivelse | Bruksområde | Copilot-støtte |
|------|-------------|-------------|----------------|
| **Search commands** | Søk i eksterne systemer og returner resultater | CRM-søk, dokumentsøk, produktkataloger | ✅ Ja (som agents) |
| **Action commands** | Utfør handlinger i eksterne systemer | Opprett oppgaver, send data, oppdater poster | ⚠️ Begrenset |
| **Link unfurling** | Utvid URLer til rike kort automatisk | Forhåndsvis Jira-issues, Figma-design | ❌ Ikke i Copilot |
### Arkitektur-komponenter
```
┌─────────────────────────┐
│ Microsoft 365 Copilot │ ← Bruker: "Vis produkter på lager"
└───────────┬─────────────┘
│ Natural language
┌─────────────────────────┐
│ Message Extension │ ← Plugin (bygget med Bot Framework)
│ (Bot-based) │
└───────────┬─────────────┘
│ Search query
┌─────────────────────────┐
│ Ekstern API │ ← CRM, ERP, Database, etc.
└─────────────────────────┘
↓ JSON response
┌─────────────────────────┐
│ Adaptive Card │ ← Resultat rendres i Copilot/Teams
└─────────────────────────┘
```
### Manifest-struktur (app manifest v1.17+)
```json
{
"manifestVersion": "1.17",
"composeExtensions": [
{
"botId": "bot-app-id-guid",
"commands": [
{
"id": "searchProducts",
"type": "query",
"title": "Search products",
"description": "Find products in inventory",
"semanticDescription": "This command searches the company product inventory based on product name, SKU, category, or stock status. Use it when the user wants to find product information or check availability.",
"parameters": [
{
"name": "productName",
"title": "Product name",
"description": "Name or SKU of the product",
"inputType": "text",
"semanticDescription": "The product name, SKU code, or partial match. Supports wildcards."
}
]
}
]
}
]
}
```
**Kritisk:** `semanticDescription` er obligatorisk for Copilot-integrasjon. Den brukes av LLM-en til å matche brukerintensjon mot riktig command.
### Adaptive Cards som response
Message extensions returnerer resultater som **Adaptive Cards**:
```typescript
// Eksempel: Search command handler (TypeScript)
app.on('message.ext.query', async ({ activity }) => {
const searchQuery = activity.value.parameters[0].value;
const results = await searchProductAPI(searchQuery);
const cards = results.map(product => ({
card: {
type: 'AdaptiveCard',
version: '1.5',
body: [
{ type: 'TextBlock', text: product.name, weight: 'Bolder', size: 'Large' },
{ type: 'TextBlock', text: `SKU: ${product.sku}` },
{ type: 'TextBlock', text: `In stock: ${product.stock}` }
],
actions: [
{ type: 'Action.OpenUrl', title: 'View details', url: product.url }
]
},
preview: {
type: 'ThumbnailCard',
title: product.name,
text: product.sku
}
}));
return {
composeExtension: {
type: 'result',
attachmentLayout: 'list',
attachments: cards.map(c => cardAttachment('adaptive', c.card))
}
};
});
```
---
## Arkitekturmønstre
### 1. Search-based plugin (anbefalt for Copilot)
**Fordeler:**
- Enkleste vei til Copilot-integrasjon
- Krever kun Bot Framework-kompetanse
- Fungerer både i Teams og M365 Copilot (Teams, Word, PowerPoint)
- Støtter SSO og Microsoft Entra-autentisering
**Ulemper:**
- Begrenset til søk — kan ikke utføre skrive-operasjoner
- Avhengig av god `semanticDescription` for intent matching
- Kan ikke legges til fra declarative agents (per feb 2026)
**Når bruke:**
- Readonly data fra eksterne systemer (CRM, ERP, dokumentarkiv)
- Integrasjon med eksisterende REST API
- Raskt proof-of-concept for Copilot-extensibility
### 2. Action-based plugin med task modules
**Fordeler:**
- Kan utføre skriveoperasjoner (opprett, oppdater, slett)
- Støtter multi-step forms i dialogs
- Rik UI med Adaptive Cards i task modules
**Ulemper:**
- Mer kompleks implementasjon
- Begrenset støtte i Copilot (kun som standalone Teams-app)
- Krever mer testing for UX-flyt
**Når bruke:**
- Opprett oppgaver/tickets i eksterne systemer
- Forms med validering og multi-step flows
- Teams-først, Copilot som nice-to-have
### 3. Hybrid (Graph Connector + Message Extension)
**Fordeler:**
- Graph Connector indekserer data til M365-søk
- Message Extension gir real-time data
- Copilot kan bruke begge kilder
**Ulemper:**
- Dobbel implementasjon (indexing + bot)
- Kostnadsoverhead for Graph Connector
**Når bruke:**
- Store datamengder som bør indekseres
- Kombinasjon av historiske data (Graph) og real-time (message extension)
- Compliance-krav om datakopier i M365
---
## Beslutningsveiledning
### Beslutningstabell: Message Extension vs. andre Copilot-extensibility-veier
| Kriterium | Message Extension | Graph Connector | Copilot Studio | API Plugin (declarative) |
|-----------|-------------------|-----------------|----------------|--------------------------|
| **Real-time data** | ✅ Ja | ❌ Nei (indeksert) | ✅ Ja | ✅ Ja |
| **Skrive-operasjoner** | ⚠️ Action commands | ❌ Nei | ✅ Ja (via flows) | ✅ Ja |
| **Krever Azure Bot Service** | ✅ Ja | ❌ Nei | ❌ Nei | ❌ Nei |
| **Low-code** | ❌ Nei (krever kode) | ⚠️ Delvis | ✅ Ja | ⚠️ Delvis |
| **SSO-støtte** | ✅ Ja (Entra ID) | ✅ Ja | ✅ Ja | ✅ Ja |
| **Kostnad (dev-tid)** | Middels (2-4 uker) | Lav (1-2 uker) | Lav (dager) | Lav-middels |
| **Kostnad (drift)** | Azure Bot Service | Graph API calls | Power Platform | Ingen (kun API-host) |
| **Tilgjengelig i M365 Copilot** | ✅ Ja (preview) | ✅ Ja | ✅ Ja | ✅ Ja |
| **Tilgjengelig i Teams** | ✅ Ja | ❌ Nei (kun søk) | ✅ Ja | ⚠️ Via agent |
### Vanlige feil
| Feil | Konsekvens | Løsning |
|------|------------|---------|
| Manglende `semanticDescription` | Copilot finner ikke plugin | Skriv detaljert beskrivelse av når command skal brukes |
| Hardkodet parameter-verdier | Plugin fungerer ikke i Copilot | Bruk dynamic parameters og parameter descriptions |
| For store Adaptive Cards | Rendering-feil i Word/PowerPoint | Bruk single-column layout, unngå fixed widths |
| Manglende SSO-config | Brukeren må logge inn manuelt | Konfigurer Bot SSO med Entra ID app registration |
| Action.Execute i Adaptive Cards | Fungerer ikke i Teams | Bruk Action.Submit i stedet (Action.Execute kun i webChat) |
### Røde flagg (når message extensions IKKE passer)
-**Høyfrekvent polling** — Graph Connector er bedre for indeksering
-**Komplekse AI-workflows** — Copilot Studio med flere actions er bedre
-**Kun intern M365-data** — Bruk Graph API direkte
-**Krav om zero-code** — Bruk Copilot Studio eller ferdig Graph Connector
---
## Integrasjon med Microsoft-stakken
### Bot Framework + Teams SDK
Message extensions bygges med **Bot Framework SDK** (v4.x) og **Teams SDK** (tidligere Teams Toolkit):
```typescript
// Dependencies
import { App } from '@microsoft/teams.apps';
import { cardAttachment } from '@microsoft/teams.api';
import { AdaptiveCard, TextBlock } from '@microsoft/teams.cards';
const app = new App();
app.on('message.ext.query', async ({ activity }) => {
// Håndter søk fra Copilot eller Teams
});
```
### Microsoft 365 Agents Toolkit (tidligere Teams Toolkit)
Utviklingsverktøy for VSCode/Visual Studio:
- Scaffolder message extension-prosjekter
- Automatisk provisjonering i Azure (Bot Service, App Registration)
- Debugging i Teams og Copilot side-by-side
- Publisering til Teams App Store
### Azure-infrastruktur
| Tjeneste | Formål | Kostnad |
|----------|--------|---------|
| Azure Bot Service | Hosting av bot-logikk | ~$0.50 per 1000 meldinger (Standard tier) |
| App Service / Functions | REST API for bot | Pay-as-you-go (F1 tier gratis for dev) |
| Application Insights | Telemetri og logging | Gratis tier (5 GB/måned) |
| Entra ID App Registration | SSO og autentisering | Gratis |
### Copilot-orkestrering
Når message extension er registrert som plugin i M365 Copilot:
1. Bruker sender prompt til Copilot: "Vis siste ordrer fra CRM"
2. Copilot analyserer intent og matcher mot plugin `semanticDescription`
3. Copilot ekstraher parametere fra prompt (eks: "siste" → dateFilter)
4. Copilot kaller message extension via Bot Framework
5. Message extension henter data fra CRM API
6. Adaptive Card returneres til Copilot
7. Copilot genererer naturlig språk-respons + viser kortet
**Viktig:** Copilot-orkestrering er **ikke-deterministisk**. Test med flere prompts for å verifisere plugin-matching.
---
## Offentlig sektor (Norge)
### GDPR og databehandling
Message extensions prosesserer data i **sanntid** — data lagres ikke i Microsoft 365 med mindre det returneres som Adaptive Card i chat-historikk.
**Implikasjoner:**
-**Mindre GDPR-risiko** enn Graph Connectors (som indekserer data)
- ⚠️ **Chat-historikk lagres** — Adaptive Cards med persondata lagres i Teams/Copilot-samtaler
-**Dataminimering** — kun data som returneres i Adaptive Card lagres
**Anbefaling:** Ikke returner sensitiv personinformasjon (personnummer, helseopplysninger) i Adaptive Cards med mindre det er eksplisitt nødvendig. Bruk Action.OpenUrl for å sende bruker til sikret portal.
### Schrems II og data residency
- Azure Bot Service kan provisioneres i **West Europe** (Amsterdam) for EU-residency
- Bot-kode kan kjøre i Norge (Azure Norway East/West) via App Service
- M365 Copilot-prosessering skjer i EU for europeiske tenants (per Microsoft Data Protection Addendum)
**Sjekkliste:**
- [ ] Azure Bot Service i West Europe region
- [ ] App Service i Norway East/West (hvis mulig)
- [ ] App Registration i norsk Entra ID tenant
- [ ] Verifiser Data Processing Agreement med Microsoft
### AI-loven (EU AI Act)
Message extensions som bruker Copilot klassifiseres som **AI-system med begrenset risiko** (limited risk):
- Krav om **transparens** — brukeren må kunne se når plugin brukes
- Krav om **logging** — spor hvilke data som sendes til/fra plugin
**Implementasjon:**
- Copilot viser automatisk hvilke plugins som brukes i svar (citations)
- Logg alle API-kall i Application Insights for audit trail
- Inkluder versjonsnummer i bot manifest for sporbarhet
### Forvaltningsloven og arkivering
Chat-historikk i Teams/Copilot er underlagt arkiveringskrav for offentlig sektor (Arkivlova §6).
**Anbefaling:**
- Konfigurer **retention policies** i Microsoft 365 Compliance Center
- Eksporter chat-historikk med eDiscovery ved behov
- Vurder å IKKE inkludere arkivpliktig informasjon i Adaptive Cards (bruk Action.OpenUrl i stedet)
---
## Kostnad og lisensiering
### Lisenskrav
| Komponent | Lisenskrav | Kostnad (ca. pris Norge, 2026) |
|-----------|------------|-------------------------------|
| **Teams** | Microsoft 365 E3/E5 | Inkludert i E3/E5 |
| **Microsoft 365 Copilot** | Copilot for M365 license | ~300 NOK/bruker/måned |
| **Azure Bot Service** | Azure-abonnement | ~0.50 USD per 1000 meldinger (Standard) |
| **App Service (F1/B1)** | Azure-abonnement | Gratis (F1) / ~70 NOK/måned (B1) |
### Total Cost of Ownership (TCO) estimat
**Scenario:** 100 brukere, 50 søk per bruker per måned
| Kostnadspost | Beregning | Kostnad (NOK/måned) |
|--------------|-----------|---------------------|
| M365 Copilot-lisenser | 100 × 300 NOK | 30 000 |
| Azure Bot Service | 5000 meldinger × 0.005 NOK | 25 |
| App Service (B1) | 1 instans | 70 |
| Application Insights | Under 5 GB/måned | 0 (gratis tier) |
| **Total** | | **30 095 NOK/måned** |
**Optimalisering:**
- Bruk **Free tier** for Bot Service i dev/test (10 000 meldinger gratis)
- Kombiner flere message extensions i samme bot (deler Bot Service-kostnad)
- Bruk Azure Functions Consumption Plan i stedet for App Service for sporadisk bruk
### ROI-faktorer
| Gevinst | Estimert tidsbesparelse | Verdi (100 brukere) |
|---------|-------------------------|---------------------|
| Raskere CRM-søk | 5 min/dag/bruker | ~400 timer/måned |
| Færre kontekstbytter | 10 min/dag/bruker | ~800 timer/måned |
| Self-service uten opplæring | 30 min engangsopplæring | 50 timer |
**Breakeven:** Hvis tidsbesparelse > 1200 timer/måned (verdi ~600 000 NOK ved 500 NOK/time), er ROI positiv første måned.
---
## For arkitekten (Cosmo)
### Spørsmål å stille kunden
1. **Datakilder og tilgang:**
- Hvilke eksterne systemer skal Copilot kunne søke i? (CRM, ERP, dokumentarkiv)
- Har disse systemene REST APIer? Krever de autentisering (OAuth, API-keys)?
- Er dataene sanntids-data, eller kan de indekseres (Graph Connector)?
2. **Bruksmønstre:**
- Skal brukerne bare **søke** (read-only), eller også **opprette/endre** data?
- Hvor mange brukere? Hvor ofte vil de bruke pluginen? (kostnad)
- Skal pluginen brukes i Teams, Copilot, eller begge?
3. **Sikkerhet og compliance:**
- Inneholder dataene personopplysninger? (GDPR)
- Er det krav om data residency i Norge/EU? (Schrems II)
- Må chat-historikk med plugin-resultater arkiveres? (Forvaltningsloven)
4. **Eksisterende infrastruktur:**
- Har dere Azure-abonnement? (Bot Service hosting)
- Har dere DevOps-pipeline for CI/CD?
- Hvem skal eie koden og driften? (IT-avdeling, utviklingsteam)
5. **Modenhet og kompetanse:**
- Har teamet erfaring med Bot Framework / Node.js / C#?
- Har dere tid til å vedlikeholde kode, eller bør dere vurdere Copilot Studio? (low-code)
6. **Forventninger til UX:**
- Skal resultater vises som rene lister, eller interaktive kort?
- Trenger dere multi-step forms? (task modules)
- Skal brukerne kunne handle direkte fra kortet (Action.OpenUrl)?
7. **Testing og utrulling:**
- Hvordan skal pluginen testes før produksjon? (pilotgruppe)
- Skal pluginen være tilgjengelig for alle, eller kun spesifikke teams?
8. **Fremtidig skalerbarhet:**
- Planlegger dere flere plugins? (kan dele samme bot)
- Skal pluginen kunne brukes i andre Copilot-kontekster (Word, PowerPoint)?
### Fallgruver å unngå
| Fallgruve | Problem | Løsning |
|-----------|---------|---------|
| **"Vi trenger AI i Copilot"** | Uklar use case | Start med konkret problem: "Saksbehandlere søker i CRM 50 ganger/dag" |
| **Overvurdere semanticDescription** | Plugin matcher ikke intent | Test med **minst 20 ulike prompts** før produksjon |
| **Ignore adaptive card best practices** | Kort renderes dårlig i Word/PowerPoint | Single-column layout, responsive design, test på smaleste viewport |
| **Hardkode secrets i bot-kode** | Sikkerhetshull | Bruk Azure Key Vault, ikke commit API-nøkler til Git |
| **Glemme SSO-konfigurasjon** | Brukeren må logge inn hver gang | Konfigurer Bot SSO med Entra ID App Registration fra starten |
| **Ikke loggføre API-kall** | Umulig å debugge feil i prod | Bruk Application Insights for strukturert logging |
| **Anta at Copilot alltid kaller riktig plugin** | Brukerfrustrasjon når det feiler | Gi tydelige feilmeldinger i Adaptive Card hvis feil parameter |
### Anbefalinger per modenhetsnivå
#### Nivå 1: "Vi har aldri bygget for Teams/Copilot"
- **Start med:** Search-based message extension (readonly)
- **Verktøy:** Microsoft 365 Agents Toolkit i VSCode (scaffolder alt)
- **Datakilde:** Enkel REST API med offentlig dokumentasjon (eks: produktkatalog)
- **Tidsramme:** 2-3 uker (inkludert læring)
- **Risiko:** Lav (ingen skrive-operasjoner)
#### Nivå 2: "Vi har Teams-apps, men ikke Copilot-plugins"
- **Start med:** Utvid eksisterende Teams bot til message extension
- **Verktøy:** Bot Framework SDK (du har allerede bot-logikk)
- **Datakilde:** Integrer mot eksisterende backend-API med SSO
- **Tidsramme:** 1-2 uker (gjenbruk av kode)
- **Risiko:** Middels (må teste Copilot-orkestrering)
#### Nivå 3: "Vi har Copilot-plugins og vil skalere"
- **Start med:** Multi-command message extension (flere søk i samme bot)
- **Verktøy:** Combo av Graph Connector (indeksering) + Message Extension (real-time)
- **Datakilde:** Flere eksterne systemer (CRM, ERP, dokumentarkiv)
- **Tidsramme:** 4-6 uker (kompleks orkestrering)
- **Risiko:** Høy (krever sterk DevOps og testing-pipeline)
---
## Kilder og verifisering
### Microsoft Learn (verifisert via MCP, februar 2026)
1. **Message extensions for Microsoft 365 Copilot** (Verified)
https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/overview-message-extension-bot
2. **Extend bot-based message extension as agent for Microsoft 365 Copilot** (Verified)
https://learn.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/build-bot-based-agent
3. **Adaptive Card response templates for API plugins** (Verified)
https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/api-plugin-adaptive-cards
4. **Connect Microsoft 365 Copilot to external data with message extension plugins** (Verified)
https://learn.microsoft.com/en-us/training/modules/copilot-message-extension-plugins/
5. **Adopt, extend and build Copilot experiences across the Microsoft Cloud** (Verified)
https://learn.microsoft.com/en-us/microsoft-cloud/dev/copilot/overview
6. **Teams AI Library - Message Extensions** (Verified)
https://learn.microsoft.com/en-us/microsoftteams/platform/teams-ai-library/in-depth-guides/message-extensions/
### Konfidensnivå per seksjon
| Seksjon | Konfidens | Kilde |
|---------|-----------|-------|
| Introduksjon | Verified | MCP microsoft_docs_fetch |
| Kjernekomponenter | Verified | MCP microsoft_docs_fetch + code samples |
| Arkitekturmønstre | Baseline | Modellkunnskap + MCP context |
| Beslutningsveiledning | Baseline | Modellkunnskap (praksis-orientert) |
| Integrasjon med Microsoft-stakken | Verified | MCP microsoft_docs_search |
| Offentlig sektor (Norge) | Baseline | Modellkunnskap (juridisk kontekst) |
| Kostnad og lisensiering | Baseline | Offentlige prislister + erfaring |
| For arkitekten (Cosmo) | Baseline | Best practices fra feltet |
**MCP-kall utført:** 6 (3 search, 2 fetch, 1 code sample search)
**Unike kilder:** 6 Microsoft Learn-artikler
**Dato verifisert:** 2026-02-04