Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
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.
Installér CLI (kræver version 1.1.12 eller nyere):
npm install -g @microsoft/m365agentstoolkit-cliKontrollér versionen:
atk --versionImporter 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
namemed feltet på forsiden. Denne uoverensstemmelse er den mest almindelige årsag til kompetencefejl. - Plugin-listefelter
descriptionbø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.mdtæ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_priceikkegetData - 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
OAuthPluginVaulteller Dynamisk klientregistrering i stedet eller eksponere et slutpunkt, der acceptererNone.
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:
Installér
@microsoft/m365agentstoolkit-clifranpm:npm install -g @microsoft/m365agentstoolkit-cliKontrollér installationen ved at køre:
atk --versionGodkend med din Microsoft 365-arbejdskonto:
atk auth loginLog på din arbejdskonto, og installér agentpakken. Erstat filstien med ZIP-pakkens placering:
atk install --file-path "C:/Users/myuser/myPackage.zip" --scope PersonalEn vellykket installation returnerer output, der indeholder et
TitleIdogAppIdfor din konto.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
- Åbn M365 Administration>Administrer apps>Upload brugerdefineret app.
- Vælg ellipseknappen (...) >Tilføj agent.
- Upload din
.zippakke. - Å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_lawtil 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.mdfiler. BrugagentConnectorsmed 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-Agenter til stede på alle anmodninger, herundertools/listogtools/call. Hvis du gate eller attribut pr. anmodning, skal du trykke på dette hoved. -
clientInfoder kun sendes via håndtrykketinitialize. 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.