Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft Copilot Cowork unterstützt die Erweiterbarkeit durch M365-App-Pakete – derselbe Verteilungsmechanismus, der von Teams-Apps, Copilot-Agents und Office-Add-Ins verwendet wird. Sie können Cowork erweitern mit:
- Fähigkeiten: Prompt-basierte Workflows, die Cowork neue Fachkenntnisse vermitteln, z. B. Finanzanalyse, Rechtsrecherche oder HR-Workflows.
- Konnektoren: Remoteserver, die Cowork Zugriff auf externe Datenquellen und APIs gewähren.
Beide sind in einem Microsoft 365-Standard-App-Paket verpackt und werden über den Microsoft 365 App Store vertrieben.
Important
Microsoft Purview-Informationsbarrieren (IB) werden derzeit nicht für die Verwaltung und Freigabe von Plug-Ins oder Skills unterstützt. In Mandanten, in denen IB aktiviert ist, werden Uploads eingebetteter Wissensdateien auf Mandantenebene blockiert. Dadurch wird verhindert, dass betroffene Plugins und Skills hochgeladen oder veröffentlicht werden.
Microsoft erstellt oder pflegt weder einen persistenten Index, einen Wissensgraphen (einschließlich des Microsoft Graph) noch eine Datenbank, die ISV-Inhalte enthalten, sei es durch Crawlen, Scraping, Harvesting, Massenexport, Datenaufnahme oder jede andere Methode (über APIs, MCP-Server oder anderweitig). Microsoft kann ISV-Inhalte ggf. vorübergehend verarbeiten, um auf die Echtzeitabfrage eines Benutzers zu reagieren, aber ISV-Inhalte nicht über die Dauer dieser Sitzung hinaus aufbewahren. Auf schriftliche Aufforderung des ISV hin löscht Microsoft alle ISV-Inhalte, die sich in seinem Besitz oder unter seiner Kontrolle befinden, innerhalb von 10 Werktagen und bescheinigt diese Löschung schriftlich. Weitere Informationen finden Sie unter Unternehmensdatenschutz in Microsoft Copilot und Microsoft Copilot Chat.
Was Sie erstellen werden
Ein Cowork-Plugin ist ein .zip Paket, das Folgendes enthält:
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
Skills verwenden den offenen Standard "Agent Skills" – dasselbe Format, das von Claude Code, Visual Studio Code Copilot, Gemini CLI, Cursor, JetBrains Junie und mehr als 30 anderen KI-Tools unterstützt wird.
Auswählen des Startpunkts
Erstellen Sie Ihr Plug-In mit der wiqd-CLI. Die CLI legt die Paketstruktur an und hält manifest.json und Ihre Skill-Ordner synchron. Außerdem wendet sie die plattformeigenen Validierungsregeln an, bevor Sie das Paket hochladen, und stellt das Ergebnis anschließend bereit und gibt es frei. Die CLI befindet sich in der Vorschauversion, sodass sich die Befehle und die generierte Ausgabe vor der allgemeinen Verfügbarkeit ändern können. Alles, was es generiert, ist ein einfaches Microsoft 365-App-Paket, sodass Sie die Dateien weiterhin direkt öffnen, bearbeiten und versionieren können.
Stellen Sie das Paket nur manuell zusammen, wenn Sie keine Tools installieren können oder wenn Sie Ihre eigene Paketpipeline erstellen. In diesem Fall ist der Paketformatverweis in diesem Artikel genau das, was Sie brauchen. Er beschreibt genau, was wiqd erzeugt.
| Startpunkt | Mach das | Zeit bis zum ersten Paket |
|---|---|---|
| Ich fange bei Null an | Ein Plugin mit wiqd erstellen | ca. 10 Minuten |
| Ich habe ein vorhandenes Claude Code-Plugin | Plug-In konvertieren | ca. 5 Minuten |
| Ich kann die Tools nicht installieren, oder ich schreibe meine eigenen Pakete | Ein Paket von Hand zusammenstellen | ca. 30 Minuten |
Ein Plugin mit wiqd erstellen
Die wiqd-CLI durchläuft denselben Lebenszyklus, den Sie andernfalls manuell durchlaufen würden – erstellen, Fähigkeiten hinzufügen, validieren, bereitstellen, verpacken und teilen. Das erzeugte Paket erfüllt bereits die Validierungsregeln in diesem Artikel.
Schritt 1: wiqd installieren und anmelden
Installieren Sie die wiqd-CLI, indem Sie der wiqd-Installationsanleitung folgen, die Windows, macOS und Linux abdeckt. Melden Sie sich dann bei dem Microsoft 365-Mandanten an, für den Sie entwickeln, da sowohl die Bereitstellung als auch die Freigabe Ihren Mandanten berühren:
wiqd auth login --interactive
Das Installationsprogramm registriert auch ein GitHub Copilot CLI-Plugin, sodass Sie denselben Ablauf im Dialog steuern können. Sie könnten zum Beispiel sagen: Erstelle ein eigenständiges Plug-In namens Triage Helper oder Validiere mein Plug-In. Der Unterhaltungspfad führt die gleichen Befehle wie in diesem Abschnitt aus. Verwenden Sie die Befehle direkt, wenn Sie Skripts für eine Pipeline erstellen oder reproduzierbare, nicht interaktive Automatisierung wünschen.
Schritt 2: Gerüst für das Plug-In erstellen und Funktionen hinzufügen
Erstellen Sie den Plug-In-Container und fügen Sie dann die benötigten Funktionen in einer beliebigen Kombination hinzu:
wiqd plugin create --name my-plugin
wiqd plugin add skill --name "Contract Analysis"
wiqd plugin add connector --name "Contoso Legal" --description "Case law and statutes over MCP" --url https://api.contoso.com/legal/mcp
add skill erstellt das Gerüst appPackage/skills/contract-analysis/SKILL.md und registriert es in agentSkills[].
add connector schreibt den agentConnectors[] Eintrag. Beide Befehle erzwingen die Namensgebungs- und Größenbeschränkungen der Plattform vor dem Schreiben in die Manifestdatei, sodass eine Nichtübereinstimmung des Ordnernamens oder eine Überlänge von id niemals das Manifest erreicht.
Schreiben Sie Ihre Skilllogik in die generierte SKILL.md. Die Frontmatter-Felder, das Modell für progressives Laden und die Begleitdatei-Limits sind die gleichen, die unter Schritt 1: Erste Fertigkeit erstellen und Schritt 2: Referenzmaterialien hinzufügen (optional) beschrieben werden.
Important
wiqd plugin create heftet das Paket an manifestVersion: "1.29" an, während die manuell erstellten Beispiele in diesem Artikel 1.28 verwenden. Bei Connectors sind Unterschiede von Bedeutung. Bei 1.28 ist mcpToolDescription erforderlich, und die Datei, auf die es verweist, muss sich in der ZIP-Datei befinden. Bei 1.29 agentConnectors[] sind Einträge reine URLs und mcpToolDescription ist optional, sodass ein von wiqd generiertes Paket niemals auf diesen Uploadfehler stößt. wiqd unterstützt das Scaffolden der Connector-Authentifizierung noch nicht – konfigurieren Sie sie direkt wie unter Unterstützte Authentifizierungstypen beschrieben.
Schritt 3: Beim Erstellen validieren
Überprüfen Sie kontinuierlich, anstatt ein Paket zusammenzustellen und zu hoffen, dass der Upload erfolgreich ist:
wiqd plugin validate
wiqd plugin validate --mode deep
validate ist die statische Offlineüberprüfung der Oberfläche des deklarativen Agents. Ein Plug-In, das nur Fertigkeiten oder Connectors enthält, besteht die Prüfung, ohne dass etwas überprüft werden muss. Dies entspricht den Erwartungen – es ist eine Überprüfung für Ihre Buildschleife und nicht für vollständige Abdeckung vorgesehen.
validate --mode deep paketiert zuerst das Plug-In und validiert dann die erstellte .zip anhand derselben App-Validierungsbibliothek, die der Upload verwendet. Hier kommen die ASKILL-Codes und Konnektorregeln zum Vorschein.
Schritt 4: Bereitstellen, verpacken und freigeben
Führen Sie diese drei Befehle in der angegebenen Reihenfolge aus:
wiqd plugin provision
wiqd plugin package
wiqd plugin share --scope users --email you@contoso.com
Führen Sie zuerst provision aus, da die Umgebungsdatei geschrieben wird, von der sowohl package als auch share abhängen.
--scope users wird zur Freigabe für die Personen verwendet, die Sie auflisten, oder --scope tenant zum Freigeben für alle Personen in Ihrer Organisation. In beiden Fällen wird das Plug-In unter Für mich freigegeben under Cowork>Quellen und Fertigkeiten>Plug-Ins angezeigt. Um es stattdessen im Abschnitt "Entdecken " aufzulisten, lädt ein Administrator das Paket hoch. Weitere Informationen finden Sie in Schritt 8: Veröffentlichen in Ihrem Mandanten. Um das zu entfernen, was provision erstellt hat, führen Sie wiqd plugin delete --env local --yes aus.
Die Übermittlung an den öffentlichen Store ist im Partner Center immer noch ein manueller Prozess. Weitere Informationen finden Sie in Schritt 9: Veröffentlichen für die Öffentlichkeit.
Ein Plug-In auf einen anderen Host übertragen
Um Ihre Skills in Claude Code, Cursor oder einem anderen Agenten-Skills-Host zu nutzen, exportieren Sie das Projekt, anstatt Ordner manuell zu kopieren:
wiqd plugin export --format claude-plugin
export ist standardmäßig auf --format open-plugin gesetzt und akzeptiert auch cursor-plugin. Es schreibt ein unkomprimiertes Verzeichnis unter <path>/export/<format>.
Vorhandenes Plug-In importieren
Wenn Sie bereits ein Claude Code Plugin mit Skills und MCP-Servern haben, haben Sie zwei Konvertierungswege. Die Route, die Sie wählen, hängt davon ab, ob Sie das Plug-In weiterentwickeln oder nur das bereitstellen möchten, was Sie haben.
| Ziel | Verwenden |
|---|---|
| Das Plug-In weiterhin von Microsoft 365 aus entwickeln, überprüfen und bereitstellen | wiqd plugin import |
Sofort eine veröffentlichungsfähige .zip aus einem vorhandenen Claude-Plug-In erstellen |
Das Konvertierungsskript |
Importieren mit wiqd
wiqd plugin importerkennt eine Open-Plugin-, Claude-Plugin- oder Cursor-Plugin-Quelle und erzeugt daraus ein wiqd-Plugin-Projekt. Das importierte Plug-In gehört zum selben Lebenszyklus wie eines, das Sie mit wiqd plugin create erstellt haben:
wiqd plugin import --path ./my-claude-plugin --privacy-url https://contoso.com/privacy --terms-url https://contoso.com/terms
--privacy-url und --terms-url sind nur beim ersten Import eines Plug-Ins erforderlich. Wenn die Quelle aus einem früheren wiqd plugin exportstammt, sind sie bereits in den Roundtrip-Metadaten enthalten.
Important
Ein importiertes Projekt unterstützt nur den schreibgeschützten Teil des Lebenszyklus – wiqd plugin validate, show und list. Es kann noch nicht verpackt, bereitgestellt oder freigegeben werden, da der Import die für diese Schritte erforderlichen lokalen Bereitstellungsdateien nicht generiert. Dies ist eine nachverfolgte Lücke. Informationen zum aktuellen Status finden Sie in der WIQD-CLI-Referenz. Wenn Sie heute ein veröffentlichungsfähiges Paket benötigen, verwenden Sie das Konvertierungsskript.
Konvertieren mit dem Konvertierungsskript
Das Konvertierungsskript übersetzt ein Claude-Plugin direkt in ein veröffentlichungsfähiges M365-Paket:
Installieren Sie die CLI (erfordert Version 1.1.12 oder höher):
npm install -g @microsoft/m365agentstoolkit-cliÜberprüfen Sie die Version:
atk --versionImportiere dein Plugin:
atk import openplugin --path ./my-claude-plugin --output ./my-plugin-project \ --privacy-url https://contoso.com/privacy \ --terms-url https://contoso.com/terms
Der Befehl liest die Verzeichnisse .claude-plugin/plugin.json (oder .cursor-plugin/plugin.json), .mcp.json und skills/ des Plug-Ins und erstellt dann ein Gerüst für ein Agents-Toolkit-Projekt, das appPackage/manifest.json, Ihre Fertigkeiten und generierte Symbole enthält.
Sie müssen --privacy-url und --terms-url einschließen, da Plug-In-Manifeste keine entsprechenden Felder haben und das Microsoft 365-Manifest beides erfordert.
Hinweis
atk import openplugin sucht ein Plug-In-Manifest in einem Verzeichnis mit vorangestelltem Punkt – .claude-plugin/plugin.json.cursor-plugin/plugin.json oder .plugin/plugin.json – neben einer .mcp.json. Die Spezifikation Agent Plugins 1.0.0 platziert das Manifest auf einer obersten Ebene unter plugin.json und die MCP-Konfiguration unter mcp.json. Um ein Plug-In zu importieren, das dem Layout 1.0.0 folgt, verschieben Sie sein Manifest nach .plugin/plugin.json, und benennen mcp.json Sie es in .mcp.jsonum.
Verpacken Sie das Ergebnis in ein zum Hochladen geeignetes .zip:
cd my-plugin-project
atk package --manifest-file ./appPackage/manifest.json \
--output-package-file ./appPackage/build/appPackage.zip \
--output-folder ./appPackage/build
Hinweis
atk import openplugin generiert ein devPreview Manifest. Die Manifestbeispiele an anderer Stelle in diesem Artikel beziehen sich auf das Schema v1.28. Wenn Sie über einen Kanal veröffentlichen, der Version 1.28 erfordert, aktualisieren Sie manifestVersion und $schema in der generierten appPackage/manifest.json.
Was wird importiert?
| Plugin-Artefakt | M365-Äquivalent | Hinweise |
|---|---|---|
.claude-plugin/plugin.json |
manifest.json |
Namens-, Beschreibungs- und Entwicklerfelder zugeordnet; GUID automatisch generiert (deterministische UUID v5) |
skills/*/SKILL.md |
agentSkills[] Einträge + skills/ Ordner |
Wörtlich kopiert – identisches Format |
.mcp.json Server |
agentConnectors[] Einträge |
URL und Authentifizierungstyp automatisch erkannt |
color.png / outline.png |
Symbole im Paket | Wird verwendet, falls vorhanden; Platzhalter werden generiert, falls sie fehlen |
Important
Für jeden aus .mcp.json importierten Connector ist der generierte authorization.referenceId ein Platzhalter, der vom Plug-In und dem Servernamen abgeleitet wird. Ersetzen Sie diese ID durch Ihre tatsächliche OAuth-Clientregistrierungs-ID, bevor Sie veröffentlichen. Weitere Informationen finden Sie unter Unterstützte Authentifizierungstypen.
Nicht konvertiert wird
Die folgenden Features des Claude-Plug-Ins werden im Microsoft 365-Manifest noch nicht unterstützt:
| Claude Plugin-Funktion | Status |
|---|---|
commands/ (Schrägstrichbefehle) |
Noch nicht unterstützt |
agents/ (Unteragenten) |
Noch nicht unterstützt |
hooks/ (Ereignishandler) |
Noch nicht unterstützt |
settings.json |
Nicht anwendbar |
bin/ (ausführbare Dateien) |
Nicht anwendbar |
Importoptionen
| Option | Description |
|---|---|
--path, -p |
Required. Plug-In-Verzeichnis, das .claude-plugin/plugin.json, .cursor-plugin/plugin.json oder .plugin/plugin.json enthält |
--output, -o |
Zielprojektordner (Standard: ./<plugin-name>) |
--privacy-url |
developer.privacyUrl für das generierte Manifest |
--terms-url |
developer.termsOfUseUrl für das generierte Manifest |
--website-url |
developer.websiteUrl. Fällt zurück auf homepage, dann author.url |
--app-id |
Überschreiben Sie die für das Manifest id generierte deterministische UUID v5 |
--default-auth-type |
Auto (Standard), None, OAuthPluginVaultoder ApiKeyPluginVault |
Automatische Erkennung des Authentifizierungstyps:
| Source | Standard-Authentifizierungstyp | Grund |
|---|---|---|
| Externe HTTPS-URLs | OAuthPluginVault |
Die meisten Remote-APIs benötigen eine Authentifizierung |
localhost und Nicht-HTTPS-URLs |
None |
Lokale Entwicklungsserver |
Wenn die automatische Erkennung nicht zu Ihrem Setup passt, verwenden Sie --default-auth-type, um dies außer Kraft zu setzen.
Zurück in ein Plug-in-Verzeichnis exportieren
Um ein Agents Toolkit-Projekt zurück in ein Plug-In-Verzeichnis zu verschieben, z. B. um ein Claude Code-Plug-In und ein Cowork-Paket synchron zu halten, verwenden Sieatk export openplugin:
atk export openplugin --path ./my-plugin-project \
--output ./my-claude-plugin --manifest-kind claude-plugin
| Option | Description |
|---|---|
--path, -p |
Required. Der Agents Toolkit-Projektordner enthält appPackage/manifest.json |
--output, -o |
Plugin-Zielverzeichnis (Standard: ./<plugin-name>-openplugin) |
--manifest-kind |
open-plugin (Standard, schreibt .plugin/plugin.json), claude-plugin oder cursor-plugin |
Export schreibt einen x-microsoft-365-agents-toolkit Block in die generierte plugin.json. Dieser Block enthält das Manifest id, Entwickler-URLs und Connectoreinstellungen, sodass ein späteres atk import openplugin Roundtrips durchführt, ohne dass --privacy-url oder --terms-url erforderlich sind.
Hinweis
Der x-microsoft-365-agents-toolkit Block ist spezifisch für das Agents Toolkit, und der Standardtyp open-plugin schreibt das Manifest in .plugin/plugin.json.
Agent Plugins 1.0.0 verwendet eine oberste Ebene plugin.json und überträgt clientspezifische Daten unter einem extensions Schlüssel mit einem Reverse-Domain-Namespace, sodass andere Clients diesen Block ignorieren, anstatt darauf zu reagieren. Wenn Ihr Ziel Claude Code oder Cursor ist, verwenden Sie --manifest-kind claude-plugin or cursor-plugin.
Legacy: PowerShell-Konvertierungsskript
Bevor atk den Plug-In-Import unterstützte, wurde für die Konvertierung ein reines Windows-PowerShell-Skript verwendet, das als Konvertierungsskript verfügbar bleibt:
.\Convert-ClaudePluginToMOS3.ps1 -PluginPath ./my-claude-plugin -OutputPath ./output
Verwenden Sie stattdessen atk import openplugin. Es ist plattformübergreifend, unterstützt sowohl Cursor- als auch Claude-Code-Quellen und kann zurück in ein Plugin-Verzeichnis exportiert werden.
Ein Paket von Hand zusammenstellen
Dieser Abschnitt ist die Referenz zum Paketformat: sie beschreibt genau, was Build a plugin with wiqd generiert, Feld für Feld. Folgen Sie ihm von Anfang bis Ende, wenn Sie keine Tools installieren können oder Ihre eigene Verpackungspipeline erstellen. Verwenden Sie es als Referenz, wenn Sie ein generiertes Paket verstehen oder debuggen müssen.
Schritt 1: Erste Fertigkeit erstellen
Ein Skill ist ein Ordner, der eine SKILL.md Datei enthält. Erstelle die folgende Ordnerstruktur:
my-extension/
└── skills/
└── contract-analysis/
└── SKILL.md
Schreiben Sie SKILL.md mit YAML-Frontmatter und einem Markdown-Text:
---
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-Felder
Erforderliche Felder:
| Feld | Constraints | Description |
|---|---|---|
name |
1–64 Zeichen, Kebab-Case | Skill-ID – muss exakt mit dem Ordnernamen übereinstimmen |
description |
1–1024 Zeichen | Wann sollte dieser Skill verwendet werden? Triggerphrasen einschließen |
Important
- Der Ordnername muss mit dem
nameFeld in der Frontmatter übereinstimmen. Diese Diskrepanz ist die häufigste Ursache für das Versagen von Skills. - Die Felder der Plug-In-Auflistung
descriptionsollten keine Call-to-Actions enthalten, die Benutzer zum Kauf von Abonnements auf externe Marketplaces verweisen.
| Ordnerpfad |
name-Feld |
Gültig? | Warum? |
|---|---|---|---|
skills/contract-analysis/SKILL.md |
contract-analysis |
Yes | Ordner und Name stimmen überein |
skills/contract-analysis/SKILL.md |
ContractAnalysis |
No | Name verwendet PascalCase anstelle eines entsprechenden Ordners |
skills/my-skill/SKILL.md |
contract-analysis |
No | Ordner ist my-skill, aber Name ist contract-analysis |
Benennungsregeln (Kebab-Case): Verwenden Sie nur alphanumerische Kleinbuchstaben und Bindestriche. Verwenden Sie keine aufeinanderfolgenden Bindestriche und keine führenden oder nachfolgenden Bindestriche.
| Example | Gültig? | Issue |
|---|---|---|
bond-relative-value |
Yes | Kleinbuchstaben mit Bindestrichen |
fx-carry-trade |
Yes | Kleinbuchstaben mit Bindestrichen |
email |
Yes | Einzelnes Wort, ohne Bindestriche |
Bond_Relative_Value |
No | Unterstriche und Großbuchstaben |
--my-skill-- |
No | Bindestriche am Anfang und am Ende |
my--skill |
No | Aufeinanderfolgende Bindestriche |
Schritt 2: Referenzmaterialien hinzufügen (optional)
Bei komplexen Fertigkeiten sollten Sie die primäre SKILL.md schlank halten und detaillierte Inhalte in Unterverzeichnisse verschieben. Diese zusätzlichen Dateien sind Begleitdateien. Die Fertigkeit lädt sie bei Bedarf.
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
Beschränkungen für Begleitdateien
Jeder Skill kann bis zu 20 Begleitdateien (jede andere Datei als SKILL.md) enthalten. Folgende Grenzwerte gelten pro Fertigkeit:
| Begrenzung | Wert |
|---|---|
| Maximale Anzahl von Begleitdateien | 20 |
| Maximale Größe pro Begleitdatei | 5 Megabyte |
| Maximale Gesamtgröße von Begleitdateien | 10 MB |
| Downloadtimeout (alle Begleitdateien) | 15 Sekunden |
Regeln für Begleitdateien
Pfade von Begleitdateien müssen den folgenden Regeln entsprechen:
- Verwenden Sie nur relative Pfade (keine absoluten Pfade).
- Kein Pfaddurchlauf (
..Segmente). - Keine umgekehrten Schrägstriche oder Nullbytes in Dateinamen.
- Keine versteckten Dateien (Namen beginnend mit
.). - Keine reservierten Windows-Namen (
CON,PRN,AUX,NUL,COM1–COM9,LPT1–LPT9). - Die Datei
SKILL.mdselbst zählt nicht als Begleitdatei. - Dateinamen müssen sichere Zeichen verwenden: alphanumerische Zeichen, Bindestriche, Unterstriche, Punkte, Leerzeichen und
!.
Um das Kontextfenster effizient zu halten, lädt das System Skills in drei Ebenen:
| Ebene | Beim Laden | Zielgröße |
|---|---|---|
Frontmatter (name + description) |
Immer – beim Start | ~100 Token |
SKILL.md-Textkörper |
Wenn Fertigkeit ausgelöst wird | Weniger als 5.000 Token (1.500-2.000 Wörter) |
Verweise (references/) |
Auf Anfrage durch den Agent | Unbegrenzt |
Skripte (scripts/) |
Ausgeführt, nicht in den Kontext geladen | N/A |
Verweisen Sie in SKILL.md explizit auf die Unterverzeichnisse, damit der Agent weiß, dass sie existieren:
## 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
Schritt 3: Connector hinzufügen (optional)
Wenn Ihre Erweiterung Zugriff auf externe Daten benötigt, fügen Sie einen Remote-MCP-Server hinzu. Dieser Schritt ist optional. Reine Fertigkeitspakete eignen sich gut für promptbasierte Workflows.
Tip
Wenn Ihr Server die Sichtbarkeit von Tools nach Client filtert oder den eingehenden Datenverkehr nach Attributen sortiert, gehen Sie zu Cowork-Datenverkehr zu Ihrem Server identifizieren, um die Client-Identität zu sehen, die Cowork übermittelt.
Hinweis
Benutzerdefinierte Plug-Ins werden in Cowork auf Mobilgeräten nicht unterstützt.
Steckverbindungsanforderungen
| Requirement | Details |
|---|---|
| Transport | HTTP-Streaming (HTTPS erforderlich, TLS 1.2+) |
| Protocol | JSON-RPC 2.0-Nachrichtenformat |
| Werkzeugentdeckung | Unterstützung von tools/list für dynamische Ermittlung (empfohlen) |
| Werkzeugausführung | Unterstützung von tools/call für Aufrufe |
| Availability | Empfohlene SLA mit 99,9 % Verfügbarkeit für im Store veröffentlichte Apps |
| Antwortzeit | Weniger als 30 Sekunden pro Toolaufruf |
Tooldesignrichtlinien
-
Ein Tool pro Aktion für kleine APIs (weniger als 15 Vorgänge):
search_case_law,get_ruling,cite_precedent -
Suchen und ausführen für große APIs (50+ Operationen):
search_actions+execute_action -
Beschreibende Namen:
get_bond_pricenichtgetData - Umfangreiche Eingabeschemata: Fügen Sie für jeden Parameter eine Beschreibung hinzu – das liest der Agent
- Strukturierte Ausgabe: Geben Sie JSON zurück, das der Agent für den Nutzer formatieren kann
-
Datei-Eingaben: Um eine Datei aus dem Arbeitsbereich des Benutzers anzunehmen, deklarieren Sie den Parameter mit
contentEncoding: base64. Weitere Informationen finden Sie unter Dateien aus dem Cowork-Arbeitsbereich akzeptieren.
Tools Ihres Connectors beschreiben (mcpToolDescription)
Ein remoteMcpServer Verbinder kann optional ein mcpToolDescription Objekt enthalten. Wenn angegeben, verweist die verschachtelte file Eigenschaft auf eine JSON-Datei mit der Tool-Beschreibung, die Sie in Ihr .zip aufnehmen und von der Paketwurzel aus über einen relativen Pfad referenzieren. Cowork ermittelt die Tools dynamisch auf Ihrem MCP-Server und verwendet diese Datei auch dann nicht, wenn sie vorhanden ist.
"remoteMcpServer": {
"mcpServerUrl": "https://api.contoso.com/legal/mcp",
"mcpToolDescription": {
"file": "./tools/contoso-legal-tools.json"
},
"authorization": {
"type": "OAuthPluginVault",
"referenceId": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
}
}
Wenn Sie mcpToolDescription einschließen, beschreibt die referenzierte Datei (z. B. tools/contoso-legal-tools.json) die Tools, die der Connector verfügbar macht, und muss im ZIP-Paket vorhanden sein. Fügen Sie es zusammen mit Ihrem manifest.json- und skills/-Ordner ein, wenn Sie das Plug-In packen.
Tip
Diese Anforderung gilt für die Manifestversion 1.28. Pakete, die wiqd plugin create erzeugt, zielen auf 1.29 ab, wobei agentConnectors[]-Einträge nur aus URLs bestehen, mcpToolDescription optional ist und es keine Toolbeschreibungsdatei zum Vergessen gibt.
Unterstützte Auth-Typen
| Authentifizierungstyp | Wann verwenden? | Benutzerfreundlichkeit |
|---|---|---|
None |
Öffentliche oder anonyme APIs, interne Dienste | Transparent – keine Authentifizierungsaufforderung |
OAuthPluginVault |
OAuth 2.0-APIs (empfohlen für die Produktion) | Benutzer schließt OAuth-Zustimmung einmal ab |
ApiKeyPluginVault |
Dienste auf API-Schlüsselbasis | Benutzer gibt den Schlüssel einmal ein |
Hinweis
- Unterstützung für die API-Schlüsselauthentifizierung ist in Cowork noch nicht verfügbar.
- Wenn Ihr MCP-Server einen API-Schlüssel erfordert, verwenden Sie stattdessen
OAuthPluginVaultoder Dynamic Client Registration, oder machen Sie einen Endpunkt verfügbar, derNoneakzeptiert.
Für OAuthPluginVault und ApiKeyPluginVault verweist referenceId auf Anmeldeinformationen, die im Microsoft Enterprise Token Store gespeichert sind – Geheimnisse werden nie in den Manifest- oder Skill-Dateien angezeigt. Der referenceId-Wert ist die OAuth-Clientregistrierungs-ID, die Sie erstellen, wenn Sie einen OAuth-Client bei Agents-Toolkit registrieren.
Important
Legen Sie beim Registrieren Ihres OAuth-Clients die Nutzung nach Organisation auf Beliebige Microsoft 365-Organisation fest, um sicherzustellen, dass Ihr Plug-In mandantenübergreifend funktioniert.
MCP-Authentifizierung
Informationen zur Verwendung von OAuth oder ApiKey für die Authentifizierung finden Sie unter Authentifizierung für MCP- und API-Plug-Ins in Agents in Microsoft 365 Copilot konfigurieren (Setup- und Konfigurationsdetails).
Dynamische Clientregistrierung
Wenn Ihr MCP-Server die dynamische Client-Registrierung (DCR) unterstützt, können Sie in Ihrer Connectordefinition auf eine authentication-Konfiguration verzichten, und Cowork erstellt automatisch einen OAuth-Client für Ihr Plug-In.
Hinweis
Das Weglassen der authentication Konfiguration wird nur in Cowork unterstützt. Es wird in Copilot Chat nicht unterstützt. Wenn Ihr Plug-In auch in Copilot Chat funktionieren muss, konfigurieren Sie die OAuthPluginVault Authentifizierung wie unter Unterstützte Authentifizierungstypen beschrieben.
Sie können das authorization Objekt vollständig weglassen. Konfigurieren Sie Ihre MCP-Server-URL, und Cowork kümmert sich um den OAuth-Client:
"remoteMcpServer": {
"mcpServerUrl": "https://api.contoso.com/legal/mcp"
}
Schritt 4: Erstellen des Manifests
Erstelle manifest.json in deinem Paketstamm. Im Beispiel wird die Manifestversion 1.28 verwendet. wiqd plugin create heftet stattdessen 1.29 an, wobei Connector-Einträge nur URLs sind.
{
"$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" }
]
}
Um einen Connector hinzuzufügen, schließen Sie agentConnectors ein:
{
"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"
}
}
}
}
]
}
In der Connectorkonfiguration referenceId sollte dies die OAuth-Registrierungs-ID sein. Wenn Sie mcpToolDescription einschließen, muss dessen file auf eine JSON-Datei mit der Toolbeschreibung verweisen, die im ZIP-Paket enthalten ist.
Important
Das Schema der Manifestversion v1.28 ist streng: Es legt additionalProperties: false im Stammverzeichnis fest, sodass jedes Feld, das nicht im Schema definiert ist, abgelehnt wird. Felder, die in Teams-App-Standardmanifesten gültig sind, wie z. B. packageName, führen dazu, dass der Upload mit einem Fehler wie Property 'packageName' has not been defined and the schema does not allow additional properties. fehlschlägt. Schließen Sie nur die hier gezeigten Felder ein.
Schritt 5: Symbole hinzufügen
Erstelle zwei PNG-Symbole:
| Icon | Größe | Purpose |
|---|---|---|
color.png |
192×192 px | Vollfarbiges App-Symbol wird im Store und in der App-Liste angezeigt |
outline.png |
32×32 px | Einfarbiges Kontursymbol für kompakte Ansichten |
Wenn Sie noch keine Symbole haben, generiert atk import openplugin einfarbige Platzhalter. Ersetzen Sie sie vor der Store-Einreichung.
Schritt 6: Verpacken
Erstellen Sie eine ZIP-Datei mit dem gesamten Inhalt im Stammverzeichnis. (wiqd plugin package erzeugt die gleiche Struktur nach wiqd plugin provision.)
contoso-legal-tools.zip
├── manifest.json
├── color.png
├── outline.png
├── tools/
│ └── contoso-legal-tools.json # Referenced by mcpToolDescription (optional, connectors only)
└── skills/
└── contract-analysis/
├── SKILL.md
└── references/
└── clause-taxonomy.md
Wenn ein Connector mcpToolDescription enthält, schließen Sie die JSON-Datei mit der Toolbeschreibung ein, auf die er verweist. Pakete, die mcpToolDescription nicht verwenden, einschließlich Pakete, die nur Skills enthalten, benötigen keinen tools/-Ordner.
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/
Verwenden des Microsoft 365 Agents Toolkit
atk package --manifest-file ./appPackage/manifest.json \
--output-package-file ./appPackage/build/appPackage.zip \
--output-folder ./appPackage/build
Schritt 7: Testen
Um Ihre App zu testen, laden Sie Ihr App-Paket in Teams hoch, wie unter Hochladen Ihrer App in Teams beschrieben.
Wenn Sie das Plug-In mit wiqd erstellt haben, führen Sie es stattdessen wiqd plugin provision aus. Es registriert das Plug-In für Sie bei Ihrem Mandanten. Für persönliche Tests eines manuell zusammengestellten Pakets laden Sie die App quer, indem Sie die CLI des Microsoft 365 Agents Toolkit verwenden:
Installieren Sie
@microsoft/m365agentstoolkit-clivonnpm:npm install -g @microsoft/m365agentstoolkit-cliÜberprüfen Sie die Installation durch Ausführen:
atk --versionAuthentifizieren Sie sich mit Ihrem Microsoft 365-Geschäftskonto:
atk auth loginMelden Sie sich bei Ihrem Arbeitskonto an und installieren Sie das Agentpaket. Ersetzen Sie den Dateipfad durch den Speicherort Ihres ZIP-Pakets:
atk install --file-path "C:/Users/myuser/myPackage.zip" --scope PersonalEine erfolgreiche Installation gibt eine Ausgabe zurück, die ein
TitleIdundAppIdfür Ihr Konto enthält.Speichern Sie diese IDs zur späteren Verwendung beim Aktualisieren oder Deinstallieren.
Weitere Informationen finden Sie in Microsoft 365 Agents Toolkit-Befehlszeilenschnittstelle.
Schritt 8: In Ihrem Mandanten veröffentlichen
Laden Sie das Paket im Admin Center hoch, um Ihr Plug-In im Abschnitt Entdecken aufzulisten, wo alle in Ihrer Organisation es finden können:
- M365 Admin Center öffnen>Verwalten von Apps>Benutzerdefinierte App hochladen.
- Wählen Sie die Schaltfläche mit den Auslassungspunkten (...) >und dann Agent hinzufügen.
- Laden Sie Ihr
.zip-Paket hoch. - Öffnen Sie Cowork>Quellen und Fertigkeiten>Plug-Ins. Ihr Plug-In wird im Abschnitt Discover angezeigt.
wiqd plugin share platziert das Plug-In in Für mich freigegeben statt Ermitteln. Verwenden Sie es zum Testen und für einen gezielten Rollout an bestimmte Personen. Der Upload im Admin Center listet ein Plug-In zur Ermittlung auf.
Schritt 9: Für die Öffentlichkeit veröffentlichen
Für Plug-Ins, die für die öffentliche Bereitstellung vorgesehen sind, reichen Sie Ihr Plug-In über das Partner Center des Microsoft 365 App Store ein. Weitere Informationen finden Sie unter Veröffentlichen von Agents für Microsoft 365 Copilot.
Connector mit einem lokalen MCP-Server testen
Connectors erfordern eine HTTPS-mcpServerUrl. Um einen Server zu testen, der auf Ihrem Computer ausgeführt wird, müssen Sie ihn über eine öffentliche HTTPS-URL verfügbar machen.
Dev-Tunnel stellen ein Relay bereit, das die TLS-Verbindung für Sie beendet.
devtunnel port create <tunnel> -p <port> --protocol http
Important
Verwenden Sie --protocol http, nicht https. Das --protocol-Flag beschreibt den lokalen Dienst, zu dem der Tunnel weiterleitet, nicht die öffentliche Tunnel-URL. Die meisten lokalen MCP-Server sprechen einfaches HTTP. Wenn Sie also --protocol https festlegen, während Ihr Server HTTP bereitstellt, gibt jede Anfrage über den Tunnel einen 502-Fehler zurück. Das Relay beendet TLS und stellt die öffentliche URL unabhängig von diesem Flag über HTTPS bereit.
Troubleshooting
| Symptom | Ursache | Beheben |
|---|---|---|
Jede getunnelte Anfrage gibt 502 zurück und der lokale Server spricht HTTP |
devtunnel port create wurde mit --protocol https ausgeführt |
Erstellen Sie den Port neu mit --protocol http |
Weitergeleitete Anfragen geben unter macOS 502 zurück, obwohl der lokale Server ausgeführt wird |
Der Server ist an 0.0.0.0 gebunden (nur IPv4), aber der Tunnel wählt sich bei localhost ein, der zuerst zu ::1 (IPv6) aufgelöst wird |
Binden Sie den Server an ::, sodass er sowohl IPv4- als auch IPv6-Verbindungen akzeptiert |
Upload schlägt mit Property '<field>' has not been defined and the schema does not allow additional properties fehl |
Das Manifest enthält ein Feld, das das v1.28-Schema nicht zulässt (z. B. packageName) |
Entfernen Sie das Feld; Das v1.28-Schema verwendet additionalProperties: false |
Verpackungsmuster
Wählen Sie das Muster aus, das zu Ihrer Erweiterung passt:
Nur Fertigkeiten (kein Connector)
Am besten geeignet für promptbasierte Workflows, Dokumentenanalyse und Schreibunterstützung.
my-skills-pack.zip
├── manifest.json # agentSkills only, no agentConnectors
├── color.png
├── outline.png
└── skills/
├── skill-one/SKILL.md
└── skill-two/SKILL.md
Skills + Remote-Connector
Am besten geeignet für Datenanalysen, API-Integrationen und Unternehmenssysteme.
my-data-skills.zip
├── manifest.json # agentSkills + agentConnectors
├── color.png
├── outline.png
├── tools/ # Tool-description file(s) for mcpToolDescription (optional)
│ └── my-connector.json
└── skills/
├── analysis-workflow/SKILL.md
└── reporting-workflow/SKILL.md
Nur Connector (keine benutzerdefinierten Skills)
Verwenden Sie diese Option für Datenquellen, die von den integrierten Fähigkeiten von Cowork bereits verwendet werden können.
my-connector.zip
├── manifest.json # agentConnectors only, no agentSkills
├── color.png
├── outline.png
└── tools/ # Tool-description file(s) for mcpToolDescription (optional)
└── my-connector.json
Importierter Claude-Code oder Cursor-Plug-In
Verwenden Sie diese Option für vorhandene Claude-Ökosystem-Plug-Ins, die auf Cowork ausgerichtet sind. Um das Plug-In in Microsoft 365 weiterzuentwickeln, importieren Sie es:
wiqd plugin import --path ./claude-plugin --privacy-url https://contoso.com/privacy --terms-url https://contoso.com/terms
Um eine veröffentlichungsfähige .zip aus dem Plug-In in ihrer heutigen Form zu erstellen, verwenden Sie das Konvertierungsskript:
atk import openplugin --path ./claude-plugin --output ./my-plugin-project \
--privacy-url https://contoso.com/privacy \
--terms-url https://contoso.com/terms
Bewährte Methoden für die Fertigkeitserstellung
Befolgen Sie diese Richtlinien, um Fertigkeiten zu erstellen, die zuverlässig aktiviert werden und konsistente Ergebnisse liefern.
Effektive Beschreibungen verfassen
Das description Feld bestimmt, wann der Agent Ihren Skill aktiviert. Spezifisch:
# 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.
Effektive Workflows schreiben
- Seien Sie in der Beschreibung präzise. Schließen Sie Triggerphrasen ein: „Bitte verwenden, wenn der Benutzer darum bittet ...“ Anhand dieser Beschreibung entscheidet der Agent, welche Fertigkeit aktiviert werden soll.
- Als Workflow strukturieren. Versehen Sie die Schritte mit Nummern. Jeder Schritt sollte einer konkreten Aktion zugeordnet werden (Datei lesen, Tool aufrufen, Ausgabe generieren).
- Ausgabeformat definieren. Zeigen Sie genau die Tabellen-, Listen- oder Dokumentstruktur an, die Benutzer erwarten sollten. Diese Definition verbessert die Konsistenz erheblich.
-
Referenzieren Sie Tools nach Name. Wenn Ihre Fähigkeiten von Connectortools abhängen, benennen Sie diese explizit: "Verwenden Sie das
search_case_lawTool, um..." -
Halten Sie die primäre SKILL.md schlank. Detailliertes Referenzmaterial in das
references/Unterverzeichnis verschieben. Der Skill-Body sollte der Workflow sein, keine Enzyklopädie.
Vermeiden häufiger Fehler
-
Betten Sie keine Geheimnisse in
SKILL.mdDateien ein. Verwenden SieagentConnectorsmit Authentifizierung für API-Anmeldeinformationen. - Duplizieren Sie integrierte Fertigkeiten nicht. Überprüfen Sie vor dem Erstellen die Liste der integrierten Skills.
- Machen Sie die Fertigkeiten nicht zu umfassend. „Alles rund um Rechtsdokumente“ ist schlechter als spezifische Fertigkeiten für „Vertragsanalyse“, „Klauselextraktion“ und „Rechtsrecherche“.
- Codieren Sie keine Dateipfade oder Systembefehle hart. Fähigkeiten sollten über alle Umgebungen hinweg übertragbar sein.
-
Legen Sie nicht alles in SKILL.md. Wenn Ihr Textkörper mehr als ~3.000 Wörter enthält, verschieben Sie detaillierte Inhalte in
references/.
Validierungsregeln
Wenn Sie Ihr Paket übermitteln, validiert die Plattform es auf mehreren Ebenen. Beheben Sie diese Fehler vor der Übermittlung, um Ablehnungen zu vermeiden.
Um sie beim Erstellen statt zum Zeitpunkt des Uploads abzufangen, führen Sie wiqd plugin validate --mode deepaus. Dieser Befehl verpackt das Plug-In und führt dieselben Regeln lokal aus. Weitere Informationen finden Sie in Schritt 3: Validieren während des Erstellens.
Überprüfung auf Manifestebene
| Code | Regel | Severity |
|---|---|---|
| ASKILL-M001 |
folder ist für jeden agentSkills Eintrag erforderlich |
Error |
| ASKILL-M002 |
agentSkills Array kann bis zu 20 Elemente enthalten |
Error |
| ASKILL-M003 |
folder Pfad kann bis zu 256 Zeichen umfassen |
Error |
Überprüfung auf Paketebene
| Code | Regel | Allgemeine Fehlerbehebung | Severity |
|---|---|---|---|
| ASKILL-P001 | Der Ordner, auf den im Manifest verwiesen wird, ist in ZIP vorhanden | Überprüfen Sie Ihre ZIP-Struktur | Error |
| ASKILL-P002 | Ordner enthält eine SKILL.md Datei |
Fehlendes SKILL.md hinzufügen |
Error |
| ASKILL-P003 |
SKILL.md hat ein gültiges YAML-Frontmatter zwischen ----Trennzeichen |
YAML-Syntax korrigieren | Error |
| ASKILL-P004 | Frontmatter enthält name Feld |
name: zu Frontmatter hinzufügen |
Error |
| ASKILL-P005 | Frontmatter enthält description Feld |
description: zu Frontmatter hinzufügen |
Error |
| ASKILL-P006 |
name Stimmt mit dem Ordnernamen überein (letztes Pfadsegment) |
Ordner umbenennen oder name: beheben |
Error |
| ASKILL-P007 |
name ist Kebab-Case |
Verwenden Sie my-skill, nicht MySkill oder my_skill |
Error |
| ASKILL-P008 | Keine doppelten folder Werte im Array |
Entfernen von Duplikaten | Error |
Connector-Validierung
| Regel | Severity |
|---|---|
Jeder Connector erfordert ein id und ein displayName |
Error |
Alle Connectorwerte id müssen innerhalb des Manifests eindeutig sein |
Error |
Genau eines von plugin oder remoteMcpServer |
Error |
mcpServerUrl muss eine gültige HTTPS-URL sein. |
Error |
Wenn mcpToolDescription vorhanden ist, muss ihre file in der ZIP-Datei enthalten sein |
Error |
authorization.referenceId Erforderlich, es sei denn, Typ ist None |
Error |
authorization.referenceId darf nicht vorhanden sein, wenn der Typ None ist |
Error |
Validierung von Begleitdateien
Das Portal überprüft Begleitdateien (Referenzmaterialien, Skripte und andere Dateien neben SKILL.md) zum Zeitpunkt des Hochladens und Synchronisierens:
| Regel | Severity |
|---|---|
Höchstens 20 Begleitdateien pro Skill (ohne SKILL.md) |
Error |
| Jede Begleitdatei darf höchstens 5 MB groß sein | Error |
| Die Gesamtgröße aller Begleitdateien darf pro Skill maximal 10 MB betragen | Error |
| Dateipfade müssen relativ sein (keine absoluten Pfade) | Error |
Keine Pfadtraversierungssegmente (..) |
Error |
| Keine umgekehrten Schrägstriche oder Nullbytes in Dateinamen | Error |
Keine versteckten Dateien (Namen beginnend mit .) |
Error |
Keine reservierten Windows-Namen (CON, PRN, AUX, NUL, COM1–COM9, LPT9–LPT1) |
Error |
Dateinamen dürfen nur sichere Zeichen verwenden (alphanumerische Zeichen, Bindestriche, Unterstriche, Punkte, Leerzeichen, !) |
Error |
Plattformübergreifende Kompatibilität
Skills verwenden den offenen Standard Agent Skills. Dieselben SKILL.md Dateien funktionieren in mehreren KI-Tools:
| Platform | Compatibility |
|---|---|
| Claude Code | Vollständig gleiches SKILL.md-Format |
| Claude.ai Projekte | Full-Skills können als Projektdateien hochgeladen werden |
| VS Code / GitHub Copilot | Im Agent-Modus unterstützte Full-Agent-Fähigkeiten |
| Gemini CLI | Vollständige Agent-Fertigkeiten unterstützt |
| JetBrains Junie | Vollständige Agent-Fertigkeiten unterstützt |
| OpenAI-Codex | Vollständige Agent-Fertigkeiten unterstützt |
| Cursorfunctionen | Vollständige Agent-Fertigkeiten unterstützt |
Wenn Sie Fähigkeiten sowohl für Claude Code als auch für Copilot Cowork entwickeln, erstellen Sie das Plug-In mit wiqd. Führen Sie dann wiqd plugin export --format claude-plugin aus, um das Claude-Code-Layout zu erstellen. Wenn Sie lieber mit der Struktur des Claude Code-Plugins beginnen möchten – es ist die Obermenge – ist das Layout wie folgt:
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)
Bringen Sie es dann in Microsoft 365, wenn Sie bereit sind, es im Microsoft 365-App Store zu veröffentlichen, entweder mit wiqd plugin import oder mit dem Konvertierungsskript:
atk import openplugin --path ./my-plugin --output ./my-plugin-project \
--privacy-url https://contoso.com/privacy \
--terms-url https://contoso.com/terms
MCP-Annotations- und Bestätigungsverwaltung
Copilot Cowork liest das MCP-Standardobjekt annotations für Tools, die Ihr Server von tools/list zurückgibt, und entscheidet damit, ob ein Toolaufruf vom Benutzer bestätigt werden muss und welche Bezeichnung im Prompt angezeigt werden soll.
Verfügbare Felder
| Feld | Type | Effect |
|---|---|---|
readOnlyHint |
bool |
false: Bestätigung erforderlich, bevor das Tool ausgeführt wird. |
destructiveHint |
bool |
true: Bestätigung erforderlich, bevor das Tool ausgeführt wird. |
title |
string | Für Menschen lesbare Beschriftung im Bestätigungsdialogfeld. Verwendet den Namen des Tools, wenn er nicht vorhanden ist. |
Bestätigungsregeln
Bestätigung ist erforderlich, wenn readOnlyHint == false oder destructiveHint == true.
Für alle Tools müssen Sicherheitsanmerkungen angegeben sein. Tools ohne Anmerkungen werden als destruktiv behandelt und müssen bestätigt werden. Weitere Informationen finden Sie in der MCP-Schemareferenz.
MCP-Beispiele
Eine destruktive Aktion mit einer freundlichen Bezeichnung:
{
"name": "send_email",
"description": "Send an email message.",
"annotations": {
"title": "Send Email",
"destructiveHint": true
},
"inputSchema": { ... }
}
Ein sicherer Lesezugriff mit automatischer Ausführung:
{
"name": "search_docs",
"annotations": {
"title": "Search Documents",
"readOnlyHint": true
}
}
Was jetzt verfügbar ist
- Microsoft-Tools (Graph, Dataverse und andere) unterliegen unabhängig von Anmerkungen den integrierten Zugriffsrichtlinien von Cowork.
- Für MCP-Server, die nicht von Microsoft stammen, wird die annotationsgesteuerte Bestätigung schrittweise eingeführt. Das Festlegen der Hinweise ist jetzt zukunftssicher. Es werden Bestätigungsaufforderungen angezeigt, wenn das Rollout erweitert wird, ohne dass Entwickler Änderungen vornehmen müssen.
Dateien aus dem Cowork-Arbeitsbereich akzeptieren
Ein Konnektor-Tool kann eine Datei aus der Cowork-Sitzung des Benutzers als Eingabe verwenden – ein vom Benutzer angefügtes Dokument, eine E-Mail-Anlage, die Cowork gespeichert hat, oder eine Datei, die ein früherer Schritt erstellt hat. Deklarieren Sie den Parameter mit dem standardmäßigen JSON-Schema-Schlüsselwort contentEncoding: base64 und den Rest übernimmt Cowork. Es ist keine Microsoft-spezifische Schemaerweiterung erforderlich, und die API-Oberfläche Ihres Servers ändert sich nicht.
Cowork löst die Arbeitsbereichsdatei auf und codiert sie mit base64, bevor Cowork Ihren Server aufruft, sodass Dateibytes nie in den Kontext des Agents gelangen. Der Agent sieht und gibt immer nur Arbeitsbereichsdateipfade aus.
Hinweis
Weisen Sie den Agenten nicht an, eine Datei selbst base64 zu codieren und das Blob in einen Toolaufruf einzufügen. Bei dieser Vorgehensweise wird die gesamte Datei in den Kontext des Modells geladen und es hängt davon ab, ob das Modell den BLOB exakt wiedergibt. Es scheint bei kleinen Testdateien zu funktionieren und schlägt bei echten Dateien fehl.
Dateiparameter deklarieren
Eine string-Eigenschaft mit contentEncoding: base64 wird als Dateieingabe erkannt:
{
"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"]
}
}
Ein Array solcher Zeichenfolgen wird auch von Tools erkannt, die mehrere Dateien akzeptieren:
"attachments": {
"type": "array",
"items": { "type": "string", "contentEncoding": "base64" },
"description": "Receipt images to attach to the expense line."
}
Was der Agent sieht
Für Dateiparameter, die auf der obersten Ebene von inputSchema.properties deklariert sind, werden von Cowork im modellseitigen Schema durch ein einzelnes direct_attachment_file_paths-Array ersetzt – denselben Parameter, den die integrierten Tools von Cowork verwenden, sodass der Agent bereits weiß, wie er gefüllt wird. Das obige Schema wird dem Agent wie folgt dargestellt:
{
"type": "object",
"properties": {
"direct_attachment_file_paths": {
"type": "array",
"items": { "type": "string" },
"description": "Workspace file paths to attach."
},
"jurisdiction": { "type": "string" }
}
}
Wenn Ihr Tool mehrere Dateiparameter der obersten Ebene deklariert, werden alle zu diesem einen direct_attachment_file_paths-Array zusammengefasst. Beim Aufruf ordnet Cowork die aufgelösten Dateien wieder ihren ursprünglichen Parameternamen entsprechend der Deklarationsreihenfolge zu.
Verschachtelte Dateiparameter
Der Agent unterstützt einen Dateiparameter, der in einem Objekt oder einem Array von Objekten geschachtelt ist. Der Agent behandelt diesen Parameter anders: Anstatt ihn zu reduzieren, schreibt der Agent ihn an Ort und Stelle in eine Pfadzeichenfolge an derselben Stelle um. Bei diesem Ansatz wird die Zuordnung zwischen einer Datei und ihren zugehörigen Feldern beibehalten. Beispielsweise erhalten Sie eine Quittung pro Ausgabenzeile:
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"amount": { "type": "number" },
"receipt": { "type": "string", "contentEncoding": "base64" }
}
}
}
Der Agent füllt line_items[].receipt mit einem Arbeitsbereichspfad auf, und Cowork tauscht jeden Pfad für Base64-Inhalte aus, bevor der Aufruf weitergeleitet wird.
Die Verschachtelung wird bis zu einer Tiefe von vier Ebenen unterhalb von inputSchema durchlaufen.
$ref-Verweise werden nicht verfolgt – definieren Sie Dateiparameter inline, anstatt hinter einem $ref.
Was Ihr Server empfängt
Ihr Server empfängt einen gewöhnlichen tools/call, in dem Ihre ursprünglichen Parameternamen mit Base64-codiertem Inhalt gefüllt sind:
{
"method": "tools/call",
"params": {
"name": "analyze_contract",
"arguments": {
"document": "JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5...",
"jurisdiction": "US"
}
}
}
Ihr Server muss nicht wissen, dass der Agent eine pfadbasierte Schnittstelle verwendet hat, und Tools, die keine Parameter vom Typ contentEncoding: base64 deklarieren, sind davon nicht betroffen.
Limits
| Begrenzung | Wert |
|---|---|
| Dateien pro Toolaufruf | 8 |
| Größe pro Datei | 150 MiB |
| Gesamtgröße pro Toolaufruf | 150 MiB |
| Parameter für Arraydateien pro Tool | 1 (mit einer beliebigen Anzahl von Skalardateiparametern kombinieren) |
| Maximale Schachtelungstiefe | 4 Ebenen unterhalb des oberen Bereichs von inputSchema |
Ein Aufruf, der die Dateianzahl oder eine Größenobergrenze überschreitet, schlägt mit einem Toolfehler fehl und erreicht nie Ihren Server. Dimensionierung der API und ihrer Timeouts unter Berücksichtigung der Obergrenze von 150 MiB: base64 bläht die Nutzlast um etwa ein Drittel gegenüber der Größe der Rohdatei auf, und der codierte Inhalt wird im JSON-RPC-Anforderungstext gesendet.
Recommendations
- Beschreiben Sie den Parameter für einen menschlichen Leser. Der Agent entscheidet anhand der Beschreibung, welche Datei zu welchem Parameter gehört. Beispielsweise funktioniert
"The signed contract PDF to analyze"besser als"file". - Geben Sie die Formate, die Sie akzeptieren , in der Parameterbeschreibung an. Cowork leitet alles weiter, was der Benutzer anhängt. Validiere den Inhaltstyp auf deiner Seite und gib einen klaren Toolfehler zurück, wenn er nicht verwendbar ist.
- Legen Sie Anmerkungen fest. Ein Tool, das eine Datei empfängt und entsprechend handelt, ist normalerweise nicht schreibgeschützt und fordert daher zur Bestätigung auf. Erfahren Sie mehr unter MCP-Annotation und Bestätigungsmanagement.
- Halten Sie Dateiparameter inline. Ein Parameter, der sich hinter einer
$refoder mehr als vier Ebenen tief verschachtelt befindet, wird nicht umgeschrieben. Ihr Server erhält eine Pfadzeichenfolge an der Stelle, an der er Inhalte erwartet. - Deklarieren Sie höchstens einen Arraydateiparameter pro Tool. Bei zwei oder mehr kann Cowork nicht erkennen, welche Datei in welches Array gehört, und der Aufruf schlägt mit einem Toolfehler fehl. Verwenden Sie ein Array oder mehrere Skalarparameter oder eine Mischung aus Skalaren und einem einzelnen Array.
- Bei Tools, die ausschließlich Skalare verarbeiten, ist mit einer exakten Anzahl zu rechnen. Wenn Ihr Tool nur skalare Dateiparameter deklariert, muss die Anzahl der Dateien, die der Agent übergibt, mit der deklarierten Anzahl übereinstimmen. Markieren Sie optionale Dateiparameter deutlich in ihren Beschreibungen, damit der Agent nicht zu wenig oder zu viel liefert.
Hinweis
Dieser Mechanismus ist älter als die eigene Dateieingabe des Model Context Protocol, die von der MCP File Uploads Working Group standardisiert wird. Cowork kann Unterstützung für die standardisierte Form deklarativer Dateieingaben hinzufügen, sobald verfügbar. Der contentEncoding: base64 hier beschriebene Vertrag gilt weiterhin.
Cowork-Datenverkehr zu Ihrem Server identifizieren
Wenn Ihr MCP-Server die Toolsichtbarkeit nach Client steuert oder Sie den eingehenden Datenverkehr zuordnen möchten, können Sie Anfragen erkennen, die von Cowork stammen. Cowork präsentiert eine stabile Softwareidentität auf zwei Kanälen:
| Channel | Wo sie angezeigt wird | Wert |
|---|---|---|
User-Agent Anforderungsheader |
Jede ausgehende Anfrage, die Cowork an Ihren Server sendet | copilot-cowork/1.0 |
clientInfoim MCP-Handshake initialize |
Nur die initialize-Anforderung |
{ "name": "copilot-cowork", "version": "<version>" } |
Übereinstimmung mit dem copilot-cowork Präfix
Stimmen Sie mit dem copilot-coworkPräfix ab, wobei die Groß-/Kleinschreibung für beide Kanäle nicht beachtet wird. Nicht mit der exakten copilot-cowork/1.0 Zeichenfolge oder einem bestimmten clientInfo.version. Die Version verfolgt den Client-Identitätsvertrag und wird sich voraussichtlich ändern. Eine Präfixübereinstimmung sorgt dafür, dass Ihr Gate über Versionsschwankungen hinweg funktioniert.
# Correct: case-insensitive prefix match
copilot-cowork
# Incorrect: exact match breaks when the version changes
copilot-cowork/1.0
Den richtigen Kanal für Ihre Vorgabe auswählen
Die beiden Kanäle haben unterschiedliche Bereiche. Wählen Sie also denjenigen aus, der der Art und Weise entspricht, wie Ihr Server seine Vorgaben erzwingt:
- Der
User-Agent-Header ist in jeder Anfrage vorhanden, einschließlichtools/listundtools/call. Wenn Sie Vorgaben oder Attribute pro Anforderung verwenden, geben Sie diesen Header ein. -
clientInfowird nur beiminitializeHandshake gesendet. Wenn Sie beim Verbindungsaufbau pro Sitzung prüfen, können Sie es dort auslesen, aber bei späteren Anfragen wird es nicht wiederholt.
Was die Identität beinhaltet und was nicht
Die Identität benennt nur die Software. Es ist für jeden Cowork-Benutzer und jede Verbindung gleich und trägt niemals eine Benutzeridentität. Die Benutzeridentität bleibt im Autorisierungsfluss, den die Authentifizierungskonfiguration Ihres Connectors definiert.
| Die Identität umfasst | Die Identität enthält Folgendes nicht |
|---|---|
Ein stabiler Softwarename (copilot-cowork) und eine Vertragsversion |
Beliebige Mandanten-, Benutzer-, Sitzungs- oder Unterhaltungsbezeichner |
| Derselbe Wert für jede Anfrage und jede Verbindung | Ein Bezeichner pro Connector |
Da es keinen Bezeichner pro Connector gibt, können Sie diese Identität derzeit nicht verwenden, um zu bestimmen, welcher Connector einen Aufruf getätigt hat, oder um ein veröffentlichtes Microsoft-Plug-In von einem quergeladenen Server zu trennen, der auf dieselbe URL verweist. Wenn Sie diese Unterscheidung benötigen, erzwingen Sie sie durch die Autorisierungskonfiguration Ihres Connectors und nicht über die Clientidentität.
Häufig gestellte Fragen
Kann ich Skills aus dem M365-Paket in Claude Code verwenden?
Ja. Die Skill-Ordner enthalten standardmäßige Agent-Skills. Führen Sie wiqd plugin export --format claude-plugin aus, um das Claude Code-Layout zu erstellen, oder kopieren Sie die Fertigkeitsordner in .claude/skills/ eines beliebigen Claude Code-Projekts.
Benötige ich einen Remoteconnector?
No. Reine Fertigkeitspakete eignen sich gut für promptbasierte Workflows. Connectors sind nur erforderlich, wenn Ihre Fertigkeit Livedaten aus einem externen System benötigt.
Wie unterscheiden sich Plugin-Skills von integrierten Skills?
Plug-In-Fertigkeiten werden mit der Quelle "package" in der API angezeigt. Sie können integrierte Skills gleichen Namens nicht außer Kraft setzen. Vom Admin bereitgestellte Pakete zeigen isAdminDeployed: true an.
Können IT-Administratoren steuern, welche Plug-Ins verfügbar sind?
Ja. Es gelten die standardmäßigen M365-Administratorsteuerelemente: Zulassungs-/Sperrlisten auf Mandantenebene, vom Administrator verwaltete Bereitstellungen und Konformitätsrichtlinien.
Was geschieht, wenn ein Plug-In widerrufen wird?
Beim nächsten Synchronisierungszyklus werden die Fähigkeiten und Connectors aus diesem Paket aus der Sitzung des Benutzers entfernt. Aktive Unterhaltungen werden nicht unterbrochen, aber neue Sitzungen verfügen nicht über die Funktionen des Pakets.
Was ist die maximale Anzahl an Skills pro Paket?
Zwanzig (20) Fertigkeiten (pro ASKILL-M002). Für Connectors beträgt das Limit 10 pro Paket.
Können Fähigkeiten auf Konnektortools aus demselben Paket verweisen?
Ja, und das sollten sie. Benennen Sie die Tools explizit in Ihrem SKILL.md Workflow (z. B. "Verwenden Sie das search_case_law Tool, um ..."). Der Agent verbindet sie zur Laufzeit.
Können die Tools meines Plugins Dateien aus dem Cowork-Arbeitsbereich akzeptieren?
Ja. Deklarieren Sie den Toolparameter mit contentEncoding: base64; Cowork wandelt die Workspace-Datei des Benutzers in Base64-Inhalt um, bevor Ihr Server aufgerufen wird. Das Modell übergibt Dateipfade, nicht Dateiinhalte, sodass große Dateien nicht den Kontext des Modells beanspruchen. Deklarationsdetails und Limits finden Sie unter Akzeptieren von Dateien aus dem Cowork-Arbeitsbereich.
Wie generiere ich eine deterministische GUID für mein Paket?
wiqd plugin create generiert die App-ID für Sie und heftet sie an. Das Konvertierungsskript verwendet UUID v5 (SHA-1-basiert) aus Ihrem Plug-In-Namen, sodass bei zweimaliger Ausführung der Konvertierung dieselbe GUID erzeugt wird. Verwenden Sie für die manuelle Verpackung einen beliebigen GUID-Generator. Achten Sie darauf, dass er versionsübergreifend stabil bleibt.
Auf welche Manifestversion sollte ich abzielen?
Verwenden Sie 1.29, wenn Sie mit wiqd arbeiten, da diese für Sie angeheftet wird. Bei 1.29 sind agentConnectors[]-Einträge nur URLs und mcpToolDescription ist optional. Die handgeschriebenen Beispiele in diesem Artikel verwenden 1.28, wobei mcpToolDescription erforderlich ist und die Dateinamen in der ZIP-Datei enthalten sein müssen.
atk import openplugin verwendet UUID v5 (SHA-1-basiert) aus deinem Plug-In-Namen. Wenn der Import zweimal ausgeführt wird, wird dieselbe GUID erzeugt. Übergeben Sie zum Festlegen Ihrer eigenen --app-id. Verwenden Sie für die manuelle Verpackung einen beliebigen GUID-Generator. Achten Sie darauf, dass er versionsübergreifend stabil bleibt.