Byg plugins til Copilot Cowork

Microsoft Copilot Cowork understøtter udvidelse via M365-apppakker – den samme distributionsmekanisme, der bruges af Teams-apps, Copilot-agenter og Office-tilføjelsesprogrammer. Du kan udvide Cowork med:

  • Færdigheder: Promptbaserede arbejdsprocesser, der lærer Cowork ny domæneekspertise, f.eks. finansiel analyse, juridisk forskning eller HR-arbejdsprocesser.
  • Forbindelser: Fjernservere, der giver Cowork adgang til eksterne datakilder og API'er.

Begge er pakket sammen i en standard Microsoft 365 app-pakke og distribueret via Microsoft 365 App Store.

Vigtigt!

Microsoft Purview-informationsbarrierer (IB) understøttes i øjeblikket ikke til administration og deling af plugin eller færdigheder. I lejere, hvor IB er aktiveret, blokeres integrerede vidensfiloverførsler på lejerniveau. Dette forhindrer, at berørte plugins og færdigheder uploades eller publiceres.

Hvad du bygger

Et Cowork-plugin er en .zip pakke, der indeholder:

my-extension.zip
├── manifest.json          # M365 Unified App Manifest (v1.28)
├── color.png              # 192×192 full-color app icon
├── outline.png            # 32×32 outline icon
└── skills/                # Agent Skills (SKILL.md files)
    ├── skill-one/
    │   ├── SKILL.md
    │   └── references/    # Optional deep-dive docs
    └── skill-two/
        └── SKILL.md

Færdigheder bruger agentfærdighederne åben standard – det samme format, der understøttes af Claude Code, Visual Studio Code Copilot, Gemini CLI, Cursor, JetBrains Junie og 30+ andre værktøjer med kunstig intelligens.

Vælg dit udgangspunkt

Udgangspunkt Sti Tid til første pakke
Jeg har et eksisterende Claude Code eller Cursor plugin Importér det ~5 minutter
Jeg starter fra bunden Byg fra bunden ~30 minutter

Importér et eksisterende plugin

Hvis du allerede har et Claude Code- eller markør-plugin med færdigheder og MCP-servere, importerer Microsoft 365 Agents Toolkit CLI detatk () det direkte. CLI kører på Windows, macOS og Linux.

  1. Installér CLI (kræver version 1.1.12 eller nyere):

    npm install -g @microsoft/m365agentstoolkit-cli
    
  2. Kontrollér versionen:

    atk --version
    
  3. Importer dit plugin:

    atk import openplugin --path ./my-claude-plugin --output ./my-plugin-project \
      --privacy-url https://contoso.com/privacy \
      --terms-url https://contoso.com/terms
    

Kommandoen læser dit plugins .claude-plugin/plugin.json (eller .cursor-plugin/plugin.json), .mcp.jsonog skills/ mappe og stilladser derefter et Agents Toolkit-projekt, der indeholder appPackage/manifest.jsondine færdigheder og genererede ikoner.

Du skal medtage --privacy-url , og --terms-url fordi plugin-manifester ikke har tilsvarende felter, og Microsoft 365-manifestet kræver begge dele.

Bemærk!

atk import openpluginFinder et plug-in-manifest i mappen med prik-præfiks—.claude-plugin/plugin.json, , eller .plugin/plugin.json—ved siden af en .mcp.json.cursor-plugin/plugin.json. Agent Plugins 1.0.0-specifikationen placerer manifestet på et topniveau plugin.json og MCP-konfiguration på mcp.json. Hvis du vil importere et plug-in, der følger 1.0.0-layoutet, skal du flytte dets manifest til .plugin/plugin.json og omdøbe mcp.json det til .mcp.json.

Pak resultatet i et uploadbart .zip:

cd my-plugin-project
atk package --manifest-file ./appPackage/manifest.json \
  --output-package-file ./appPackage/build/appPackage.zip \
  --output-folder ./appPackage/build

Bemærk!

atk import openplugin genererer et devPreview manifest. Manifesteksemplerne andre steder i denne artikel målretter skema v1.28. Hvis du publicerer via en kanal, der kræver v1.28, skal du opdatere manifestVersion og $schema i den genererede appPackage/manifest.json, føje egenskaben mcpToolDescription til hver connector som beskrevet i Beskriv din forbindelses værktøjer.

Hvad der importeres?

Plugin-artefakt Tilsvarende i M365 Bemærkninger
.claude-plugin/plugin.json manifest.json Navn, beskrivelse og udviklerfelter tilknyttet. GUID automatisk genereret (deterministisk UUID v5)
skills/*/SKILL.md agentSkills[] Poster + skills/ mappe Kopieret ordret - identisk format
.mcp.json servere agentConnectors[] Indlæg URL- og godkendelsestype registreres automatisk
color.png / outline.png Ikoner i pakke Bruges, hvis den findes. Pladsholdere oprettes, hvis de mangler

Vigtigt!

For hver forbindelse, der importeres fra .mcp.json, er den genererede authorization.referenceId en pladsholder, der er afledt af plug-in'et og servernavnet. Erstat det med dit faktiske OAuth-klientregistrerings-id, før du udgiver. Se Understøttede godkendelsestyper.

Hvad konverteres ikke

Følgende Claude-plug-in-funktioner understøttes endnu ikke i Microsoft 365-manifestet:

Claude plugin-funktion Status
commands/ (skråstreg-kommandoer) Understøttes endnu ikke
agents/ (underagenter) Understøttes endnu ikke
hooks/ (hændelseshandlere) Understøttes endnu ikke
settings.json Ikke relevant
bin/ (eksekverbare filer) Ikke relevant

Indstillinger for import

Indstilling Beskrivelse
--path, -p Påkrævet. Plug-in-mappe, der indeholder .claude-plugin/plugin.json, .cursor-plugin/plugin.jsoneller .plugin/plugin.json
--output, -o Destinationsprojektmappe (standard: ./<plugin-name>)
--privacy-url developer.privacyUrl for det genererede manifest
--terms-url developer.termsOfUseUrl for det genererede manifest
--website-url developer.websiteUrl. Falder tilbage til homepage, og derefter author.url
--app-id Tilsidesætte det deterministiske UUID v5, der genereres for manifestet id
--default-auth-type Auto (standard), None, OAuthPluginVault, eller ApiKeyPluginVault

Automatisk registrering af godkendelsestype:

Kilde Standardgodkendelsestype Begrundelse
Eksterne HTTPS-webadresser OAuthPluginVault De fleste fjern-API'er kræver godkendelse
localhost og ikke-HTTPS URL-adresser None Lokale udviklingsservere

Hvis den automatiske registrering ikke svarer til din konfiguration, kan du tilsidesætte --default-auth-type den.

Eksportere tilbage til en plugin-mappe

Hvis du vil flytte et Agents Toolkit-projekt tilbage til en plug-in-mappe – for eksempel for at holde et Claude Code-plugin og en Cowork-pakke synkroniseret – skal du brugeatk export openplugin:

atk export openplugin --path ./my-plugin-project \
  --output ./my-claude-plugin --manifest-kind claude-plugin
Indstilling Beskrivelse
--path, -p Påkrævet. Agents Toolkit-projektmappe, der indeholder appPackage/manifest.json
--output, -o Destinations-plug-in-mappe (standard: ./<plugin-name>-openplugin)
--manifest-kind open-plugin (standard, skriver .plugin/plugin.json), claude-plugineller cursor-plugin

Eksportér skriver en x-microsoft-365-agents-toolkit blok til det genererede plugin.json. Denne blok indeholder manifestet id, udvikler-URL-adresser og forbindelsesindstillinger, så en senere atk import openplugin rundkørsel uden behov --privacy-url--terms-url eller igen.

Bemærk!

Blokken x-microsoft-365-agents-toolkit er specifik for Agents Toolkit, og standardtypen open-plugin skriver manifestet til .plugin/plugin.json. Agent Plugins 1.0.0 bruger et topniveau plugin.json og bærer klientspecifikke data under en extensions nøgle med et omvendt domænenavneområde, så andre klienter ignorerer denne blokering i stedet for at handle på den. Når dit mål er Claude-kode eller markør, skal du bruge --manifest-kind claude-plugin eller cursor-plugin.

Ældre: PowerShell-konverteringsscript

Før atk den understøttede plug-in-import, brugte konvertering et PowerShell-script, der kun er tilgængeligt som konverteringsscript:

.\Convert-ClaudePluginToMOS3.ps1 -PluginPath ./my-claude-plugin -OutputPath ./output

Brug atk import openplugin i stedet. Det er på tværs af platforme, understøtter markører såvel som Claude Code-kilder og kan eksportere tilbage til en plugin-mappe.

Byg et plugin fra bunden

Følg disse trin for at oprette en plugin-pakke fra bunden, startende med din første færdighed og opbygning til en komplet, publicerbar pakke.

Trin 1: Opret din første færdighed

En færdighed er en mappe, der indeholder en SKILL.md fil. Opret følgende mappestruktur:

my-extension/
└── skills/
    └── contract-analysis/
        └── SKILL.md

Skriv SKILL.md med YAML-frontsag og en Markdown-brødtekst:

---
name: contract-analysis
description: |
  Analyzes contracts for key terms, risks, and obligations.
  Use when user asks to "review this contract", "find the liability clause",
  "summarize the key terms", or "compare these two agreements".
license: MIT
metadata:
  author: Contoso Legal Tech
  version: "1.0"
---

# Contract Analysis

## What This Skill Does

Guides Cowork through systematic contract review, identifying:
- Key commercial terms (pricing, payment, renewal)
- Risk clauses (indemnification, limitation of liability, IP)
- Obligations and deadlines
- Non-standard or unusual provisions

## Workflow

1. Read the uploaded contract document
2. Extract and categorize all clauses
3. Flag risk areas with severity ratings
4. Generate a structured summary with recommendations

## Output Format

Present findings in a structured table:

| Clause | Category | Risk Level | Summary |
|--------|----------|------------|---------|
| Section 4.2-Indemnification | Risk | High | Unlimited indemnification for IP claims |
| Section 7.1-Term | Commercial | Low | 12-month auto-renewal with 30-day notice |

SKILL.md frontmatter-felter

Obligatoriske felter:

Felt Begrænsninger Beskrivelse
name 1-64 tegn, store og små bogstaver i kebab Færdigheds-id – skal svare nøjagtigt til mappenavnet
description 1-1024 tegn Hvornår skal du bruge denne færdighed – medtag udløserudtryk

Vigtigt!

  • Mappenavnet skal stemme overens name med feltet på forsiden. Denne uoverensstemmelse er den mest almindelige årsag til kompetencefejl.
  • Plugin-listefelter description bør ikke indeholde opfordringer til handling, der dirigerer brugerne til eksterne markedspladser for at købe abonnementer.
Mappesti name felt Gyldig? Hvorfor
skills/contract-analysis/SKILL.md contract-analysis Ja Mappe og navn matcher
skills/contract-analysis/SKILL.md ContractAnalysis Nej Navnet bruger PascalCase i stedet for en matchende mappe
skills/my-skill/SKILL.md contract-analysis Nej Mappe er my-skill , men navnet er contract-analysis

Navngivningsregler (kebab-kasus): Brug kun små alfanumeriske tegn og bindestreger. Brug ikke fortløbende bindestreger, og brug ikke foranstillede eller efterstillede bindestreger.

Eksempel Gyldig? Problem
bond-relative-value Ja Små bogstaver med bindestreger
fx-carry-trade Ja Små bogstaver med bindestreger
email Ja Enkelt ord, ingen bindestreger påkrævet
Bond_Relative_Value Nej Understregningstegn og store bogstaver
--my-skill-- Nej Foranstillede og efterstillede bindestreger
my--skill Nej Fortløbende bindestreger

Trin 2: Tilføje referencematerialer (valgfrit)

For komplekse færdigheder skal du sørge for, at hovedfilen SKILL.md er slank, og flytte detaljeret indhold til undermapper. Disse ekstra filer er ledsagerfiler. Færdigheden indlæser dem, når det er nødvendigt.

skills/
└── contract-analysis/
    ├── SKILL.md               # Core workflow (~1,500-2,000 words ideal)
    ├── references/            # Deep-dive docs loaded on demand
    │   ├── clause-taxonomy.md
    │   └── risk-scoring.md
    └── scripts/               # Executable utilities
        └── extract-clauses.py

Begrænsninger for ledsagende filer

Hver færdighed kan indeholde op til 20 ledsagende filer (alle andre filer end SKILL.md). Der gælder følgende begrænsninger pr. færdighed:

Begræns Værdi
Maks. antal ledsagerfiler 20
Maksimumstørrelse pr. ledsagerfil 5 MB
Maksimal samlet størrelse på ledsagere 10 MB
Timeout for download (alle ledsagere) 15 sekunder

Regler for ledsagende filer

Ledsagende filstier skal følge disse regler:

  • Brug kun relative stier (ingen absolutte stier)
  • Ingen stigennemgang (.. segmenter)
  • Ingen omvendte skråstreger eller null bytes i filnavne
  • Ingen skjulte filer (navne, der begynder med .)
  • Ingen reserverede Windows-navne (CON, PRN, AUX, COM1NUL, –COM9, –LPT9) LPT1
  • Selve filen SKILL.md tæller ikke som en ledsagerfil
  • Filnavne skal bruge sikre tegn: alfanumerisk, bindestreger, understregningstegn, prikker, mellemrum og !

For at holde kontekstvinduet effektivt indlæser systemet færdigheder i tre lag:

Lag Når indlæsning Destination – størrelse
Frontmatter (name + description) Altid – ved start ~100 tokens
SKILL.md brødtekst Når færdighed udløses Mindre end 5.000 tokens (1.500-2.000 ord)
Referencer (references/) På anmodning af helpdesk-medarbejderen Ubegrænset
Scripts (scripts/) Udført, ikke indlæst i kontekst I/T

Referer eksplicit til undermapperne, SKILL.md så agenten ved, at de findes:

## Additional Resources

- **`references/clause-taxonomy.md`**-Full taxonomy of contract clause types
- **`references/risk-scoring.md`**-Risk scoring methodology and thresholds
- **`scripts/extract-clauses.py`**-Automated clause extraction utility

Trin 3: Tilføj en forbindelse (valgfrit)

Hvis din udvidelse skal have adgang til eksterne data, skal du tilføje en ekstern MCP-server. Dette trin er valgfrit. Pakker kun med færdigheder fungerer godt til promptbaserede arbejdsprocesser.

Tip

Hvis dit serverportværktøj er synligt efter klient eller attributter for indgående trafik, skal du se Identificer Cowork-trafik til din server for den klientidentitet, Cowork præsenterer.

Bemærk!

Brugerdefinerede plugins understøttes ikke i Cowork på mobil.

Krav til forbindelse

Krav Detaljer
Transport HTTP streambar (HTTPS påkrævet, TLS 1.2+)
Protokol JSON-RPC 2.0-meddelelsesformat
Værktøjsregistrering Understøttelse tools/list af dynamisk registrering (anbefales)
Værktøjsudførelse Understøttelse tools/call af aktivering
Tilgængelighed Serviceaftale for 99,9 % oppetid anbefales til store-udgivne apps
Svartid Mindre end 30 sekunder pr. værktøjsopkald

Retningslinjer for værktøjsdesign

  • Ét værktøj pr. handling til små API'er (færre end 15 handlinger): search_case_law, get_ruling, cite_precedent
  • Søg + udfør for store API'er (50+ handlinger): search_actions + execute_action
  • Beskrivende navne: get_bond_price ikke getData
  • Omfattende inputskemaer: Medtag en beskrivelse af hver parameter – det er, hvad agenten læser
  • Struktureret output: Returner JSON, som agenten kan formatere for brugeren
  • Filinput: Hvis du vil acceptere en fil fra brugerens arbejdsområde, skal du erklære parameteren med contentEncoding: base64. Få mere at vide i Acceptér filer fra Cowork-arbejdsområdet.

Beskriv din forbindelses værktøjer (mcpToolDescription)

Hver remoteMcpServer forbindelse skal indeholde et mcpToolDescription objekt. Dens indlejrede file egenskab peger på en værktøjsbeskrivelses-JSON-fil, som du pakker i din .zip og refererer til ved en relativ sti fra pakkeroden. Hvis du udelader mcpToolDescription, afviser pakketjenesten uploadet med en HTTP 400-fejl:

Påkrævede egenskaber mangler for objektet: mcpToolDescription.

"remoteMcpServer": {
  "mcpServerUrl": "https://api.contoso.com/legal/mcp",
  "mcpToolDescription": {
    "file": "./tools/contoso-legal-tools.json"
  },
  "authorization": {
    "type": "OAuthPluginVault",
    "referenceId": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
  }
}

Den fil, der refereres til (for eksempel, ) beskriver de værktøjer, som forbindelseskomponenten fremviser, tools/contoso-legal-tools.jsonog som skal være til stede i ZIP-pakken. Medtag det sammen med din manifest.json og-mappe skills/ , når du pakker plugin'et.

Understøttede godkendelsestyper

Godkendelsestype Anvendelse Brugeroplevelse
None Offentlige eller anonyme API'er, interne tjenester Gennemsigtig – ingen godkendelsesprompt
OAuthPluginVault OAuth 2.0 API'er (anbefales til produktion) Brugeren afslutter OAuth-samtykke én gang
ApiKeyPluginVault API-nøglebaserede tjenester Bruger angiver nøgle én gang

Bemærk!

  • Understøttelse af API-nøglegodkendelse er ikke tilgængelig i Cowork endnu.
  • Hvis din MCP-server kræver en API-nøgle, skal du bruge OAuthPluginVault eller Dynamisk klientregistrering i stedet eller eksponere et slutpunkt, der accepterer None.

For OAuthPluginVault og ApiKeyPluginVault, peger referenceId på legitimationsoplysninger, der er gemt i Microsoft Enterprise Token Store – hemmeligheder vises aldrig i manifest- eller færdighedsfilerne. Værdien referenceId er registrerings-id'et for OAuth-klienten, som du opretter, når du registrerer en OAuth-klient med Agents Toolkit.

Vigtigt!

Når du registrerer din OAuth-klient, skal du angive brugen efter organisation til Enhver Microsoft 365-organisation for at sikre, at din plug-in fungerer på tværs af lejere.

MCP-godkendelse

Hvis du vil bruge OAuth eller ApiKey til godkendelse, skal du se Konfigurer godkendelse for MCP- og API-plug-ins i agenter i Microsoft 365 Copilot for at få oplysninger om konfiguration og konfiguration.

Dynamisk klientregistrering

Hvis din MCP-server understøtter Dynamisk klientregistrering (DCR), kan du udelade en authentication konfiguration fra din forbindelsesdefinition, og Cowork opretter automatisk en OAuth-klient på dit plug-ins vegne.

Du kan udelade objektet authorization , men du skal stadig medtage mcpToolDescriptiondet. Konfigurer din MCP-server-URL og værktøjsbeskrivelse, så tager Cowork sig af OAuth-klienten:

"remoteMcpServer": {
  "mcpServerUrl": "https://api.contoso.com/legal/mcp",
  "mcpToolDescription": {
    "file": "./tools/contoso-legal-tools.json"
  }
}

Trin 4: Opret manifestet

Opret manifest.json i din pakkerod:

{
  "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.28/MicrosoftTeams.schema.json",
  "manifestVersion": "1.28",
  "version": "1.0.0",
  "id": "YOUR-GUID-HERE",
  "developer": {
    "name": "Contoso Legal Tech",
    "websiteUrl": "https://contoso.com",
    "privacyUrl": "https://contoso.com/privacy",
    "termsOfUseUrl": "https://contoso.com/terms"
  },
  "name": {
    "short": "Contoso Legal Tools",
    "full": "Contoso Legal Tools for Copilot Cowork"
  },
  "description": {
    "short": "Contract analysis, clause extraction, and legal research",
    "full": "Comprehensive legal tools for Copilot Cowork including contract analysis, clause extraction, risk assessment, and legal research capabilities."
  },
  "icons": {
    "color": "color.png",
    "outline": "outline.png"
  },
  "accentColor": "#2B579A",
  "agentSkills": [
    { "folder": "./skills/contract-analysis" }
  ]
}

Hvis du vil tilføje en forbindelse, skal du inkludere agentConnectors:

{
  "agentConnectors": [
    {
      "id": "contoso-legal-api",
      "displayName": "Contoso Legal Database",
      "description": "Access to case law, statutes, and regulatory databases",
      "toolSource": {
        "remoteMcpServer": {
          "mcpServerUrl": "https://api.contoso.com/legal/mcp",
          "mcpToolDescription": {
            "file": "./tools/contoso-legal-tools.json"
          },
          "authorization": {
            "type": "OAuthPluginVault",
            "referenceId": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
          }
        }
      }
    }
  ]
}

I forbindelseskonfigurationen referenceId skal det være OAuth-registrerings-id'et, og mcpToolDescription.file skal pege på en JSON-fil med beskrivelsen af værktøjet, som er inkluderet i ZIP-pakken.

Vigtigt!

Skemaet til v1.28-manifestet er strengt: det indstilles additionalProperties: false til roden, så alle felter, der ikke er defineret i skemaet, afvises. Felter, der er gyldige i standardmanifester for Teams-appen – som f.eks packageName. – får overførslen til at mislykkes med en fejl som f.eks Property 'packageName' has not been defined and the schema does not allow additional properties. . Medtag kun de felter, der er vist her.

Trin 5: Tilføj ikoner

Opret to PNG-ikoner:

Ikon Størrelse Formål
color.png 192×192 px Appikon i fuld farve, der vises i Store og på applisten
outline.png 32×32 px Ikon med enkeltfarvet kontur til kompakte visninger

Hvis du endnu ikke har ikoner, atk import openplugin genereres pladsholdere i dækkende farver. Udskift dem før indsendelse af Store.

Trin 6: Pakke

Opret en ZIP-fil med alt indhold på rodniveau:

contoso-legal-tools.zip
├── manifest.json
├── color.png
├── outline.png
├── tools/
│   └── contoso-legal-tools.json   # Referenced by mcpToolDescription (connectors only)
└── skills/
    └── contract-analysis/
        ├── SKILL.md
        └── references/
            └── clause-taxonomy.md

Hvis pakken indeholder en agentConnectors post, skal du medtage JSON-filen med værktøjsbeskrivelsen, som refereres til af mcpToolDescription.file. Pakker, der kun gælder færdigheder, behøver ikke en tools/ mappe.

Windows (PowerShell):

Compress-Archive -Path manifest.json, color.png, outline.png, tools, skills -DestinationPath contoso-legal-tools.zip

macOS/Linux:

zip -r contoso-legal-tools.zip manifest.json color.png outline.png tools/ skills/

Brug af Microsoft 365 Agents Toolkit

 atk package --manifest-file ./appPackage/manifest.json \
       --output-package-file ./appPackage/build/appPackage.zip \
       --output-folder ./appPackage/build

Trin 7: Test

Hvis du vil teste din app, skal du uploade din app-pakke til Teams, som beskrevet i Upload din app til Teams.

Til personlig test skal du indlæse appen ved hjælp af Microsoft 365 Agents Toolkit-kommandolinjegrænsefladen:

  1. Installér @microsoft/m365agentstoolkit-cli fra npm:

    npm install -g @microsoft/m365agentstoolkit-cli
    
  2. Kontrollér installationen ved at køre:

    atk --version
    
  3. Godkend med din Microsoft 365-arbejdskonto:

    atk auth login
    
  4. Log på din arbejdskonto, og installér agentpakken. Erstat filstien med ZIP-pakkens placering:

    atk install --file-path "C:/Users/myuser/myPackage.zip" --scope Personal
    

    En vellykket installation returnerer output, der indeholder et TitleId og AppId for din konto.

  5. Gem disse id'er til senere brug, når du opdaterer eller fjerner.

Få mere at vide i Microsoft 365 Agents Toolkit-kommandolinjegrænsefladen.

Trin 8: Publicer til din lejer

  1. Åbn M365 Administration>Administrer apps>Upload brugerdefineret app.
  2. Vælg ellipseknappen (...) >Tilføj agent.
  3. Upload din .zip pakke.
  4. ÅbnpluginsCowork>kilder & færdigheder>. Dit plugin vises i sektionen Opdag .

Trin 9: Publicere til offentligheden

For plug-ins, der er beregnet til offentlig distribution, skal du sende dit plug-in til Microsoft 365 App Store via Partnercenter. Få mere at vide i Publicer agenter til Microsoft 365 Copilot.

Test en forbindelse mod en lokal MCP-server

Forbindelser kræver en HTTPS, mcpServerUrlså hvis du vil teste en server, der kører på din computer, skal du eksponere den over en offentlig HTTPS URL-adresse. Udviklingstunneller leverer et relæ, der afslutter TLS for dig.

devtunnel port create <tunnel> -p <port> --protocol http

Vigtigt!

Brug --protocol http, ikke https. Flaget --protocol beskriver den lokale tjeneste, som tunnelen videresender til, ikke den offentlige tunnellens URL-adresse. De fleste lokale MCP-servere taler almindelig HTTP, så hvis du indstiller --protocol https , mens din server serverer HTTP, returnerer hver anmodning gennem tunnelen en 502 fejl. Relæet afslutter TLS og leverer den offentlige URL-adresse via HTTPS uanset dette flag.

Fejlfinding

Symptom Årsag Rettelse
Hver tunnelbaseret anmodning vender tilbage, 502 og den lokale server læser HTTP devtunnel port create blev kørt med --protocol https Genskab porten med --protocol http
Tunnelerede anmodninger returneres 502 på macOS, selvom den lokale server kører Serveren er bundet til 0.0.0.0 (kun IPv4), men tunnelopkaldene localhost, som først løses til ::1 (IPv6) Tilknyt serveren til :: en sådan, at den accepterer både IPv4- og IPv6-forbindelser
Overførslen mislykkes med Required properties are missing from object: mcpToolDescription Forbindelsen mangler mcpToolDescription Tilføj mcpToolDescription filen med en file reference og pak filen i ZIP-filen
Overførslen mislykkes med Property '<field>' has not been defined and the schema does not allow additional properties Manifestet indeholder et felt, som v1.28-skemaet ikke tillader (f.eks. packageName) Fjern feltet; V1.28-skemaet bruger additionalProperties: false

Emballagemønstre

Vælg det mønster, der passer til din udvidelse:

Kun færdigheder (ingen forbindelse)

Bedst til promptbaserede arbejdsprocesser, dokumentanalyse og skrivehjælp.

my-skills-pack.zip
├── manifest.json          # agentSkills only, no agentConnectors
├── color.png
├── outline.png
└── skills/
    ├── skill-one/SKILL.md
    └── skill-two/SKILL.md

Færdigheder + fjernforbindelse

Bedst til dataanalyse, API-integrationer og virksomhedssystemer.

my-data-skills.zip
├── manifest.json          # agentSkills + agentConnectors
├── color.png
├── outline.png
├── tools/                 # Tool-description file(s) for mcpToolDescription
│   └── my-connector.json
└── skills/
    ├── analysis-workflow/SKILL.md
    └── reporting-workflow/SKILL.md

Kun forbindelse (ingen brugerdefinerede færdigheder)

Brug denne indstilling til datakilder, som Cowork indbyggede færdigheder allerede kan bruge.

my-connector.zip
├── manifest.json          # agentConnectors only, no agentSkills
├── color.png
├── outline.png
└── tools/                 # Tool-description file(s) for mcpToolDescription
    └── my-connector.json

Importeret Claude-kode eller markør-plugin

Brug denne indstilling til eksisterende plugins fra andre værktøjer med kunstig intelligens, der er målrettet Cowork.

atk import openplugin --path ./claude-plugin --output ./my-plugin-project \
  --privacy-url https://contoso.com/privacy \
  --terms-url https://contoso.com/terms

Bedste praksis for oprettelse af færdigheder

Følg disse retningslinjer for at oprette færdigheder, der aktiveres pålideligt og giver ensartede resultater.

Skriv effektive beskrivelser

Feltet description bestemmer, hvornår agenten aktiverer din færdighed. Vær specifik:

# Good-specific trigger phrases, concrete scenarios
description: |
  Analyzes bond relative value using Z-spreads, ASW spreads, and butterfly analysis.
  Use when user asks to "analyze bond spreads", "compare bonds",
  "rich-cheap analysis", "relative value", or "Z-spread calculation".

# Bad-vague, no trigger phrases
description: Provides bond analytics capabilities.

Skriv effektive arbejdsprocesser

  • Vær specifik i beskrivelsen. Medtag udløserudtryk: "Brug når brugeren beder om..." Denne beskrivelse er, hvordan agenten beslutter, hvilken færdighed der skal aktiveres.
  • Struktur som en arbejdsproces. Nummerering af trin. Hvert trin skal knyttes til en konkret handling (læse en fil, kalde et værktøj, generere output).
  • Definer outputformat. Vis den nøjagtige tabel-, liste- eller dokumentstruktur, som brugerne kan forvente. Denne definition forbedrer konsistensen markant.
  • Referenceværktøjer efter navn. Hvis dine færdigheder afhænger af forbindelsesværktøjer, skal du navngive dem eksplicit: "Brug værktøjet search_case_law til at..."
  • Hold de vigtigste SKILL.md slanke. Flyt detaljeret referencemateriale til references/ undermappen. Færdighedskroppen bør være arbejdsgangen, ikke en encyklopædi.

Undgå almindelige fejl

  • Integrer ikke hemmeligheder i SKILL.md filer. Brug agentConnectors med godkendelse til API-legitimationsoplysninger.
  • Dupliker ikke indbyggede færdigheder. Tjek den indbyggede færdighedsliste, før du bygger.
  • Gør ikke færdighederne for brede. "Gør alt med juridiske dokumenter" er værre end specifikke færdigheder til "kontraktanalyse", "klausuludtrækning" og "juridisk forskning".
  • Undlad at uddybe filstier eller systemkommandoer. Færdigheder skal være bærbare på tværs af miljøer.
  • Læg ikke alt i SKILL.md. Hvis din krop overstiger ~3.000 ord, kan du flytte detaljeret indhold til references/.

Valideringsregler

Når du indsender din pakke, validerer platformen den på flere niveauer. Ret disse fejl før indsendelse for at undgå afvisning.

Validering på manifestniveau

Kode Regel Alvorsgrad
ASKILL-M001 folder er påkrævet ved hver agentSkills post Error
ASKILL-M002 agentSkills matrix kan have op til 20 elementer Error
ASKILL-M003 folder Sti kan bestå af op til 256 tegn Error

Validering på pakkeniveau

Kode Regel Almindelig løsning Alvorsgrad
ASKILL-P001 Mappe, der refereres til i manifestet, findes i ZIP Tjek din ZIP-struktur Error
ASKILL-P002 Mappen indeholder en SKILL.md fil Tilføj manglende SKILL.md Error
ASKILL-P003 SKILL.md har gyldig YAML-frontmatter mellem --- afgrænsere Ret YAML-syntaks Error
ASKILL-P004 Frontmatter inkluderer name felt Føj name: til frontmateriale Error
ASKILL-P005 Frontmatter inkluderer description felt Føj description: til frontmateriale Error
ASKILL-P006 name Svarer til mappenavnet (sidste stisegment) Omdøb mappe eller ret name: Error
ASKILL-P007 name is kebab-case Brug my-skill not MySkill eller my_skill Error
ASKILL-P008 Ingen dublerede folder værdier i matrixen Fjerne dubletter Error

Validering af forbindelse

Regel Alvorsgrad
Hver forbindelse kræver et id og displayName Error
Alle forbindelsesværdier id skal være entydige i manifestet Error
Præcis en af plugin eller remoteMcpServer Error
mcpServerUrl skal være en gyldig HTTPS-URL-adresse Error
mcpToolDescription påkrævet på hver remoteMcpServer, med en file , der findes i postnummeret. Error
authorization.referenceId Påkrævet, medmindre type er None Error
authorization.referenceId må ikke være til stede, når typen er None Error

Validering af ledsagende fil

Portalen validerer ledsagende filer (referencematerialer, scripts og andre filer sammen med SKILL.mdhinanden) på upload- og synkroniseringstidspunktet:

Regel Alvorsgrad
Maksimalt 20 ledsagende filer pr. færdighed (udefra SKILL.md) Error
Hver ledsagerfil skal være 5 MB eller mindre Error
Det samlede antal ledsagende filer skal være 10 MB eller mindre pr. færdighed Error
Filstier skal være relative (ingen absolutte stier) Error
Ingen stigennemgangssegmenter (..) Error
Ingen omvendte skråstreger eller null bytes i filnavne Error
Ingen skjulte filer (navne, der begynder med .) Error
Ingen reserverede Windows-navne (CON, PRN, AUX, COM1NUL, –COM9, –LPT9) LPT1 Error
Filnavne må kun bruge sikre tegn (alfanumeriske, bindestreger, understregningstegn, prikker, mellemrum, !) Error

Kompatibilitet på tværs af platforme

Færdigheder bruger den åbne standard Agentfærdigheder. De samme SKILL.md filer fungerer på tværs af flere værktøjer med kunstig intelligens:

Platform Kompatibilitet
Claude Code Fuldt samme SKILL.md format
Claude.ai-projekter Fulde færdigheder kan uploades som projektfiler
VS Code/GitHub Copilot Full-Agent færdigheder, der understøttes i agenttilstand
Gemini CLI Full-Agent Understøttede færdigheder
JetBrains Junie Full-Agent Understøttede færdigheder
OpenAI Codex Full-Agent Understøttede færdigheder
Markør Full-Agent Understøttede færdigheder

Hvis du udvikler færdigheder til både Claude Code og Cowork, skal du starte med Claude Code-plugin-strukturen - det er supersættet:

my-plugin/
├── .claude-plugin/
│   └── plugin.json        # Claude plugin manifest
├── skills/
│   ├── skill-one/
│   │   ├── SKILL.md       # Works in both Claude Code AND M365
│   │   └── references/
│   └── skill-two/
│       └── SKILL.md
└── .mcp.json              # MCP server config (optional)

Importér den derefter til et M365-projekt, når du er klar til at publicere til Microsoft 365 App Store:

atk import openplugin --path ./my-plugin --output ./my-plugin-project \
  --privacy-url https://contoso.com/privacy \
  --terms-url https://contoso.com/terms

Administration af MCP-anmærkninger og bekræftelser

Copilot Cowork læser standard MCP-objektet annotations på værktøjer, som din server returnerer fratools/list, og bruger det til at beslutte, om et værktøjskald har brug for brugerbekræftelse, og hvilken etiket der skal vises på prompten.

Tilgængelige felter

Felt Type Effekt
readOnlyHint Bool false: Bekræftelse kræves, før værktøjet kører.
destructiveHint Bool true: Bekræftelse kræves, før værktøjet kører.
title streng Etiket, der kan læses af mennesker, der vises i bekræftelsesdialogboksen. Går tilbage til værktøjsnavnet, når det ikke er til stede.

Bekræftelsesregler

Bekræftelse er påkrævet, hvis readOnlyHint == false eller destructiveHint == true.

Alle værktøjer skal have sikkerhedsanmærkninger angivet. Værktøjer uden anmærkninger behandles som destruktive og kræver bekræftelse. Få mere at vide i MCP-skemareferencen.

Eksempler på MCP

En destruktiv handling med et brugervenligt mærkat:

{
  "name": "send_email",
  "description": "Send an email message.",
  "annotations": {
    "title": "Send Email",
    "destructiveHint": true
  },
  "inputSchema": { ... }
}

En sikker læsning, der kører automatisk:

{
  "name": "search_docs",
  "annotations": {
    "title": "Search Documents",
    "readOnlyHint": true
  }
}

Hvad er tilgængeligt nu

  • Microsoft-værktøjer (Graph, Dataverse og andre) er afgrænset af Cowork's indbyggede politik uanset anmærkninger.
  • For MCP-servere, der ikke er fra Microsoft, udrulles annotationsdrevet bekræftelse gradvist. Angivelse af tip nu er fremadkompatibel, og en bekræftelse vises, når udrulningen udvides, uden at der kræves nogen udviklerændringer.

Acceptér filer fra Cowork-arbejdsområdet

Et forbindelsesværktøj kan tage en fil fra brugerens Cowork-session som input – et dokument, som brugeren har vedhæftet, en vedhæftet fil i en mail, som Cowork har gemt, eller en fil, som et tidligere trin har produceret. Deklarer parameteren med standardnøgleordet contentEncoding: base64 JSON Schema, og Cowork håndterer resten. Der kræves ingen Microsoft-specifik skemaudvidelse, og serverens API-overflade ændres ikke.

Cowork løser arbejdsområdefilen og base64-koder den, før du kalder din server, så filbytes aldrig kommer ind i agentens kontekst. Agenten kan kun se og udsende filstier til arbejdsområdet.

Bemærk!

Instruer ikke agenten om at base64-kode en fil selv og indsætte blob'en i et værktøjskald. Det indlæser hele filen i modellens kontekst og afhænger af, hvilken model der reproducerer blob'en nøjagtigt. Det ser ud til at fungere på små testfiler og fejler på rigtige.

Definer en filparameter

En strengegenskab, der contentEncoding: base64 genkendes som et filinput:

{
  "name": "analyze_contract",
  "description": "Extract key terms from a contract document.",
  "annotations": {
    "title": "Analyze Contract",
    "readOnlyHint": true
  },
  "inputSchema": {
    "type": "object",
    "properties": {
      "document": {
        "type": "string",
        "contentEncoding": "base64",
        "description": "The contract file to analyze."
      },
      "jurisdiction": {
        "type": "string",
        "description": "Two-letter country code governing the contract."
      }
    },
    "required": ["document"]
  }
}

En matrix af sådanne strenge genkendes også for værktøjer, der accepterer flere filer:

"attachments": {
  "type": "array",
  "items": { "type": "string", "contentEncoding": "base64" },
  "description": "Receipt images to attach to the expense line."
}

Hvad mægleren ser

For filparametre, der er deklareret på det øverste niveau af inputSchema.properties, erstatter Cowork dem i det modelviste skema med en enkelt direct_attachment_file_paths matrix – den samme parameter, som Cowork indbyggede værktøjer bruger, så agenten ved allerede, hvordan den skal udfyldes. Skemaet ovenfor præsenteres for agenten som:

{
  "type": "object",
  "properties": {
    "direct_attachment_file_paths": {
      "type": "array",
      "items": { "type": "string" },
      "description": "Workspace file paths to attach."
    },
    "jurisdiction": { "type": "string" }
  }
}

Hvis værktøjet erklærer mere end én filparameter på øverste niveau, kollapses de alle sammen i denne enkelt direct_attachment_file_paths matrix. På kaldstidspunktet blæser Cowork de løste filer tilbage til dine oprindelige parameternavne i erklæringsrækkefølgen.

Parametre for indlejrede filer

En filparameter, der er indlejret i et objekt eller en række objekter, understøttes også, og den håndteres anderledes: I stedet for at blive skjult omskrives den til en stistreng på sin egen placering. Dette bevarer tilknytningen mellem en fil og dens sidestillede felter – f.eks. én kvittering pr. udgiftslinje:

"line_items": {
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "amount": { "type": "number" },
      "receipt": { "type": "string", "contentEncoding": "base64" }
    }
  }
}

Agenten udfyldes line_items[].receipt med en arbejdsområdesti, og Cowork bytter hver sti for base64-indhold på stedet, før opkaldet viderestilles.

Indlejringen gennemskæres til en dybde på fire niveauer under toppen af inputSchema. $ref Markører følges ikke – definer filparametre indbygget i stedet for bag en $ref.

Hvad din server modtager

Din server modtager en ordinær tools/call med dine oprindelige parameternavne udfyldt med base64-kodet indhold:

{
  "method": "tools/call",
  "params": {
    "name": "analyze_contract",
    "arguments": {
      "document": "JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5...",
      "jurisdiction": "US"
    }
  }
}

Din server behøver ikke at vide, at agenten brugte en stibaseret grænseflade, og værktøjer, der ikke erklærer contentEncoding: base64 parametre, påvirkes ikke.

Grænser

Begræns Værdi
Files pr. værktøjskald. 8
Størrelse pr. fil 150 MiB
Samlet størrelse pr. værktøjskald. 150 MiB
Matrixfilparametre pr. værktøj 1 (kombiner det med et vilkårligt antal skalarfilparametre)
Maksimal indlejringsdybde 4 niveauer under toppen af inputSchema

Et kald, der overstiger filantallet, eller et størrelsesloft mislykkes med en værktøjsfejl og når aldrig frem til serveren. Tilpas størrelsen på din API og dens timeouts med loftet på 150 MB i tankerne: base64 puster nyttedataene op med ca. en tredjedel i forhold til den rå filstørrelse, og det kodede indhold sendes i JSON-RPC-anmodningens brødtekst.

Anbefalinger

  • Beskriv parameteren for en menneskelig læser. Agenten bruger beskrivelsen til at afgøre, hvilken fil der hører til i hvilket parameter. Fungerer f.eks. "The signed contract PDF to analyze" bedre end "file".
  • Angiv de formater, du accepterer , i parameterbeskrivelsen. Cowork passerer gennem det, som brugeren vedhæfter. Valider indholdstypen på din side, og returner en tydelig værktøjsfejl, hvis den ikke kan bruges.
  • Angive anmærkninger. Et værktøj, der modtager en fil og reagerer på den, er normalt ikke skrivebeskyttet, så beder om bekræftelse. Se MCP-anmærknings- og bekræftelsesadministration.
  • Hold filparametrene indbygget. En parameter bag en $ref, eller indlejret dybere end fire niveauer, omskrives ikke. Serveren modtager en stistreng, når den forventer indhold.
  • Definer højst én matrixfilparameter pr. værktøj. Med to eller flere kan Cowork ikke se, hvilken fil der hører til i hvilken matrix, og kaldet mislykkes med en værktøjsfejl. Brug én matrix eller flere skalarparametre eller en blanding af skalarer og en enkelt matrix.
  • Forvent en nøjagtig optælling af skalarværktøjer. Hvis dit værktøj kun erklærer skalarfilparametre, skal antallet af filer, som agenten passerer, svare til det deklarerede antal. Markér valgfrie filparametre tydeligt i deres beskrivelser, så agenten ikke under- eller overforsyning.

Bemærk!

Denne mekanisme går forud for Model Context Protocol's eget filinputarbejde, som standardiseres af MCP File Uploads Working Group. Cowork kan tilføje understøttelse af den standardiserede form for deklarative filinput, når det lander. Den contentEncoding: base64 kontrakt, der er beskrevet her, fungerer fortsat.

Identificer Cowork-trafik til din server

Hvis din MCP-server porter værktøjets synlighed efter klient, eller du vil tilskrive den trafik, den modtager, kan du genkende anmodninger, der kommer fra Cowork. Cowork præsenterer en stabil softwareidentitet på to kanaler:

Kanal Hvor den vises Værdi
User-Agent Anmodningshoved Hver udgående anmodning Cowork sender til din server copilot-cowork/1.0
clientInfoi MCP-handshake initialize Kun anmodning initialize { "name": "copilot-cowork", "version": "<version>" }

Forskel på præfikset copilot-cowork

Match præfiksetcopilot-cowork, hvor der ikke skelnes mellem store og små bogstaver, på en af kanalerne. Match ikke den nøjagtige copilot-cowork/1.0 streng eller en bestemt clientInfo.version. Versionen sporer klient-identitetskontrakten og forventes at blive ændret. Et præfiksmatch får din port til at fungere på tværs af versionsbump.

# Correct: case-insensitive prefix match
copilot-cowork

# Incorrect: exact match breaks when the version changes
copilot-cowork/1.0

Vælg den rigtige kanal til din gate

De to kanaler har forskellige områder, så vælg det, der passer til, hvordan serveren gennemtvinger sin gate:

  • Sidehovedet User-Agent er til stede på alle anmodninger, herunder tools/list og tools/call. Hvis du gate eller attribut pr. anmodning, skal du trykke på dette hoved.
  • clientInfo der kun sendes via håndtrykket initialize . Hvis du porterer pr. session på forbindelsestidspunktet, kan du læse det der, men det gentages ikke ved senere anmodninger.

Hvad identiteten omfatter, og hvad den ikke omfatter

Identiteten navngiver kun softwaren . Det er ens for alle Cowork-brugere og -forbindelser, og det bærer aldrig brugeridentitet. Brugeridentiteten forbliver i det godkendelsesflow, som din forbindelses godkendelseskonfiguration definerer.

Identiteten omfatter Identiteten omfatter ikke
Et stabilt softwarenavn (copilot-cowork) og en kontraktversion Enhver lejer-, bruger-, sessions- eller samtaleidentifikator
Den samme værdi på alle anmodninger og forbindelser En kvalifikator pr. forbindelse

Da der ikke er nogen kvalifikator pr. forbindelse, kan du i øjeblikket ikke bruge denne identitet til at se, hvilken forbindelse der har foretaget et kald, eller til at adskille et udgivet Microsoft-plug-in fra en sideloadet server, der peger på den samme URL-adresse. Hvis du har brug for denne sondring, skal du gennemtvinge den via din forbindelses godkendelseskonfiguration i stedet for klientidentiteten.

Almindelige spørgsmål

Kan jeg bruge færdigheder fra M365-pakken i Claude Code?

Ja. Færdighedsmapperne indeholder standardagentfærdigheder. Kopier dem til .claude/skills/ et hvilket som helst Claude Code-projekt, eller kør atk export openplugin for at konvertere hele projektet tilbage til et Claude Code-plugin.

Har jeg brug for et fjernstik?

Nej. Pakker kun med færdigheder fungerer godt til promptbaserede arbejdsprocesser. Forbindelser er kun nødvendige, når dine færdigheder kræver live-data fra et eksternt system.

Hvordan adskiller plugin-færdigheder sig fra indbyggede færdigheder?

Plug-in-færdigheder vises med kilden "package" i API'en. De kan ikke tilsidesætte indbyggede færdigheder med samme navn. Administrer-installerede pakker viser isAdminDeployed: true.

Kan it-administratorer styre, hvilke plug-ins der er tilgængelige?

Ja. Standard M365-administratorkontrolelementer gælder: tilladelses-/blokeringslister på lejerniveau, administratoradministrerede udrulninger og overholdelsespolitikker.

Hvad sker der, hvis et plugin tilbagekaldes?

I den næste synkroniseringscyklus fjernes færdigheder og forbindelser fra den pågældende pakke fra brugerens session. Aktive samtaler bliver ikke afbrudt, men nye sessioner har ikke pakkens egenskaber.

Hvad er det maksimale antal færdigheder pr. pakke?

Tyve (20) færdigheder (ifølge ASKILL-M002). For forbindelser er grænsen 10 pr. pakke.

Kan færdigheder henvise til forbindelsesværktøjer fra den samme pakke?

Ja, og det bør de. Navngiv værktøjerne eksplicit i SKILL.md arbejdsprocessen (f.eks. "Brug værktøjet search_case_law til at..."). Agenten forbinder dem på kørselstidspunktet.

Kan værktøjerne i mit plugin acceptere filer fra Cowork-arbejdsområdet?

Ja. Deklarer værktøjsparameteren med contentEncoding: base64, så løser Cowork brugerens arbejdsområdefil til base64-indhold, før serveren kaldes. Modellen overfører filstier, ikke filindhold, så store filer forbruger ikke modellens kontekst. Du kan finde oplysninger om og begrænsninger for erklæringer ved at læse mere i Acceptér filer fra Cowork-arbejdsområdet.

Hvordan genererer jeg et deterministisk GUID for min pakke?

atk import openplugin bruger UUID v5 (SHA-1-baseret) fra dit plug-in-navn. Hvis du kører importen to gange, returneres det samme GUID. Hvis du vil angive dine egne, skal du bestå --app-id. Brug en GUID-generator til manuel emballering. Sørg for at holde den stabil på tværs af versioner.