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.
Wichtig
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.
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 Agent Skills open standard – das gleiche Format, das von Claude Code, Visual Studio Code Copilot, Gemini CLI, Cursor, JetBrains Junie und 30+ anderen KI-Tools unterstützt wird.
Startpunkt auswählen
| Ausgangspunkt | Pfad | Zeit bis zum ersten Paket |
|---|---|---|
| Ich habe ein vorhandenes Claude Code- oder Cursor-Plugin | Importieren | ~5 Minuten |
| Ich fange bei Null an | Von Grund auf neu erstellen | ~30 Minuten |
Vorhandenes Plug-In importieren
Wenn Sie bereits über ein Claude Code- oder Cursor-Plug-In mit Skills und MCP-Servern verfügen, wird es direkt von der Microsoft 365 Agents Toolkit CLI (atk) importiert. Die Befehlszeilenschnittstelle wird unter Windows, macOS und Linux ausgeführt.
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 das .claude-plugin/plugin.json Verzeichnis (oder .cursor-plugin/plugin.json), .mcp.jsonund skills/ des Plugins und erstellt dann ein Gerüst für ein Agents Toolkit-Projekt, das , Ihre Fähigkeiten und generierte Symbole enthält appPackage/manifest.json.
Sie müssen and --terms-url einschließen--privacy-url, da Plug-In-Manifeste keine entsprechenden Felder haben und das Microsoft 365-Manifest beides erfordert.
Hinweis
atk import openpluginSucht ein Plug-In-Manifest in einem Verzeichnis mit vorangestelltem Punkt –.claude-plugin/plugin.json.cursor-plugin/plugin.json oder .plugin/plugin.json– neben einem .mcp.json. Die Spezifikation der Agent Plugins 1.0.0 platziert das Manifest auf oberster Ebene und die MCP-Konfiguration auf mcp.json.plugin.json Um ein Plugin 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 eine hochladbare Datei .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 manifestVersion Sie und $schema im generierten appPackage/manifest.jsonund fügen Sie jedem Connector die mcpToolDescription Eigenschaft hinzu, wie unter Beschreiben der Tools Ihres Connectors beschrieben.
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 importieren |
agentConnectors[] Einträge |
URL und Authentifizierungstyp automatisch erkannt |
color.png / outline.png |
Symbole im Paket | Wird verwendet, falls vorhanden; Platzhalter, die bei fehlenden Platzhaltern generiert werden |
Wichtig
Für jeden aus importierten .mcp.jsonConnector ist der generierte authorization.referenceId Platzhalter ein Platzhalter, der vom Plug-In und dem Servernamen abgeleitet wird. Ersetzen Sie sie durch Ihre tatsächliche OAuth-Clientregistrierungs-ID, bevor Sie veröffentlichen. Weitere Informationen finden Sie unter Unterstützte Authentifizierungstypen.
Was nicht konvertiert wird
Die folgenden Features des Claude-Plug-Ins werden im Microsoft 365-Manifest noch nicht unterstützt:
| Claude Plug-In-Funktion | Status |
|---|---|
commands/ (Schrägstrichbefehle) |
Noch nicht unterstützt |
agents/ (Unter-Agents) |
Noch nicht unterstützt |
hooks/ (Ereignishandler) |
Noch nicht unterstützt |
settings.json |
Nicht zutreffend |
bin/ (ausführbare Dateien) |
Nicht zutreffend |
Importoptionen
| Option | Beschreibung |
|---|---|
--path, -p |
Erforderlich. Plug-In-Verzeichnis, das , .claude-plugin/plugin.json.cursor-plugin/plugin.jsonoder.plugin/plugin.json |
--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 der für das Manifest generierten deterministischen UUID v5 id |
--default-auth-type |
Auto (Standard), None, OAuthPluginVaultoder ApiKeyPluginVault |
Automatische Erkennung des Authentifizierungstyps:
| Quelle | Standardauthentifizierungstyp | 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 sie --default-auth-type , um sie außer Kraft zu setzen.
Exportieren zurück in ein Plug-In-Verzeichnis
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 | Beschreibung |
|---|---|
--path, -p |
Erforderlich. Der Agents Toolkit-Projektordner enthält appPackage/manifest.json |
--output, -o |
Plugin-Zielverzeichnis (Standard: ./<plugin-name>-openplugin) |
--manifest-kind |
open-plugin (Standard, Schreibvorgänge .plugin/plugin.json), claude-pluginoder 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äterer atk import openplugin Roundtrip erforderlich --privacy-url ist oder --terms-url erneut.
Hinweis
Der x-microsoft-365-agents-toolkit Block ist spezifisch für das Agents Toolkit, und die Standardart 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
Vor dem atk unterstützten Plug-In-Import 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 atk import openplugin stattdessen. Es ist plattformübergreifend, unterstützt sowohl Cursor- als auch Claude-Code-Quellen und kann zurück in ein Plugin-Verzeichnis exportiert werden.
Ein Plug-In von Grund auf neu erstellen
Führen Sie die folgenden Schritte aus, um ein Plugin-Paket von Grund auf zu erstellen. Beginnen Sie mit Ihrer ersten Fertigkeit und bauen Sie sich dann zu einem vollständigen, veröffentlichungsfähigen Paket auf.
Schritt 1: Erstellen Ihrer ersten Fähigkeit
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 Frontmateriefelder
Erforderliche Felder:
| Feld | Einschränkungen | Beschreibung |
|---|---|---|
name |
1-64 Zeichen, Döner-Kiste | Skill-ID – muss exakt mit dem Ordnernamen übereinstimmen |
description |
1–1024 Zeichen | Wann sollte dieser Skill verwendet werden? Triggerphrasen einschließen |
Wichtig
- Der Ordnername muss mit dem
nameFeld in der Frontmatter übereinstimmen. Diese Diskrepanz ist die häufigste Ursache für das Versagen von Fertigkeiten. - Die Felder der Plug-In-Auflistung
descriptionsollten keine Handlungsaufforderungen enthalten, die Benutzer zum Kauf von Abonnements an externe Marketplaces weiterleiten.
| Ordnerpfad |
name Feld |
Gültig? | Warum |
|---|---|---|---|
skills/contract-analysis/SKILL.md |
contract-analysis |
Ja | Ordner- und Namensübereinstimmung |
skills/contract-analysis/SKILL.md |
ContractAnalysis |
Nein | Name verwendet PascalCase anstelle eines übereinstimmenden Ordners |
skills/my-skill/SKILL.md |
contract-analysis |
Nein | Folder is my-skill but name is contract-analysis |
Benennungsregeln (Kebab-Fall): Verwenden Sie nur kleine alphanumerische Zeichen und Bindestriche. Verwenden Sie keine aufeinanderfolgenden Bindestriche und keine führenden oder nachfolgenden Bindestriche.
| Beispiel | Gültig? | Problem |
|---|---|---|
bond-relative-value |
Ja | Kleinbuchstaben mit Bindestrichen |
fx-carry-trade |
Ja | Kleinbuchstaben mit Bindestrichen |
email |
Ja | Ein Wort, keine Bindestriche erforderlich |
Bond_Relative_Value |
Nein | Unterstriche und Großbuchstaben |
--my-skill-- |
Nein | Bindestriche am Anfang und am Ende |
my--skill |
Nein | Aufeinanderfolgende Bindestriche |
Schritt 2: Referenzmaterialien hinzufügen (optional)
Bei komplexen Fähigkeiten sollten Sie den Hauptzugriff SKILL.md beibehalten und detaillierte Inhalte in Unterverzeichnisse verschieben. Bei diesen zusätzlichen Dateien handelt es sich um 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. Pro Skill gelten folgende Limits:
| Grenze | Wert |
|---|---|
| Maximale Anzahl von Begleitdateien | 20 |
| Maximale Größe pro Begleitdatei | 5 MB |
| Maximale Gesamtgröße des Begleiters | 10 MB |
| Downloadtimeout (alle Companions) | 15 Sekunden |
Regeln für Begleitdateien
Pfade von Begleitdateien müssen den folgenden Regeln entsprechen:
- Nur relative Pfade verwenden (keine absoluten Pfade)
- Keine Pfadverfolgung (
..Segmente) - Keine umgekehrten Schrägstriche oder Nullbytes in Dateinamen
- Keine versteckten Dateien (Namen beginnend mit
.) - Keine reservierten Windows-Namen (
CON,PRN,AUX,NULCOM1, –COM9, –LPT9)LPT1 - Die Datei
SKILL.mdselbst wird nicht als Begleitdatei betrachtet - Dateinamen müssen sichere Zeichen verwenden: alphanumerische Zeichen, Bindestriche, Unterstriche, Punkte, Leerzeichen und
!
Um das Kontextfenster effizient zu halten, lädt das System Fähigkeiten in drei Ebenen:
| Ebene | Beim Laden | Zielgröße |
|---|---|---|
Frontmatter (name + description) |
Immer – beim Start | ~100 Token |
SKILL.md Körper |
Wann die Fähigkeit ausgelöst wird | Weniger als 5.000 Token (1.500-2.000 Wörter) |
Referenzen (references/) |
Auf Anfrage des Agenten | Unbegrenzt |
Skripts (scripts/) |
Ausgeführt, nicht in den Kontext geladen | Nicht zutreffend |
Verweisen Sie explizit auf SKILL.md 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: Hinzufügen eines Connectors (optional)
Wenn Ihre Erweiterung Zugriff auf externe Daten benötigt, fügen Sie einen Remote-MCP-Server hinzu. Dieser Schritt ist optional. Reine Skill-Pakete eignen sich gut für Prompt-basierte Workflows.
Tipp
Wenn Ihr Server-Gate-Tool-Sichtbarkeit nach Client oder Attribut eingehender Datenverkehr ist, lesen Sie Identifizieren von Cowork-Datenverkehr zu Ihrem Server für die Clientidentität, die Cowork präsentiert.
Hinweis
Benutzerdefinierte Plug-Ins werden in Cowork auf Mobilgeräten nicht unterstützt.
Connectoranforderungen
| Anforderung | Details |
|---|---|
| Transport | Streamfähiges HTTP (HTTPS erforderlich, TLS 1.2+) |
| Protokoll | JSON-RPC 2.0-Nachrichtenformat |
| Toolermittlung | Unterstützung tools/list für dynamische Ermittlung (empfohlen) |
| Ausführung von Tools | Unterstützung tools/call für Aufrufe |
| Verfügbarkeit | SLA mit 99,9 % Betriebszeit für im Store veröffentlichte Apps |
| Antwortzeit | Weniger als 30 Sekunden pro Toolaufruf |
Richtlinien für den Werkzeugentwurf
-
Ein Tool pro Aktion für kleine APIs (weniger als 15 Vorgänge):
search_case_law,get_ruling,cite_precedent -
Suchen + 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 Benutzer formatieren kann
-
Dateieingaben: Um eine Datei aus dem Arbeitsbereich des Benutzers zu akzeptieren, deklarieren Sie den Parameter mit
contentEncoding: base64. Weitere Informationen finden Sie unter Akzeptieren von Dateien aus dem Cowork-Arbeitsbereich.
Beschreiben Sie die Tools Ihres Connectors (mcpToolDescription)
Jeder remoteMcpServer Verbinder muss ein mcpToolDescription Objekt enthalten. Die verschachtelte file Eigenschaft verweist auf eine JSON-Datei mit der Toolbeschreibung, die Sie in Ihrem .zip Paket packen und auf die Sie über einen relativen Pfad vom Paketstamm verweisen. Wenn Sie dies mcpToolDescriptionweglassen, lehnt der Paketdienst den Upload mit einem HTTP 400-Fehler ab:
Erforderliche Eigenschaften fehlen im Objekt: mcpToolDescription.
"remoteMcpServer": {
"mcpServerUrl": "https://api.contoso.com/legal/mcp",
"mcpToolDescription": {
"file": "./tools/contoso-legal-tools.json"
},
"authorization": {
"type": "OAuthPluginVault",
"referenceId": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
}
}
Die referenzierte Datei (z. B. ) beschreibt die Tools, tools/contoso-legal-tools.jsondie der Connector verfügbar macht und im ZIP-Paket vorhanden sein muss. Fügen Sie es zusammen mit Ihrem manifest.jsonskills/ und-Ordner ein, wenn Sie das Plug-In packen.
Unterstützte Authentifizierungstypen
| Authentifizierungstyp | Geeignet in folgender Situation | Verwendung durch den Benutzer |
|---|---|---|
None |
Öffentliche oder anonyme APIs, interne Dienste | Transparent – keine Authentifizierungsaufforderung |
OAuthPluginVault |
OAuth 2.0-APIs (empfohlen für die Produktion) | Benutzer schließt OAuth-Einwilligung einmal ab |
ApiKeyPluginVault |
API-Schlüssel-basierte Dienste | Benutzer gibt Schlüssel einmal an |
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
OAuthPluginVaultstattdessen die Dynamic Client Registration, oder machen Sie einen Endpunkt verfügbar, der akzeptiert.None
Für OAuthPluginVault und ApiKeyPluginVaultverweisen die referenceId Punkte 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.
Wichtig
Legen Sie beim Registrieren Ihres OAuth-Clients die Nutzung nach organization 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 Konfigurieren der Authentifizierung für MCP- und API-Plug-Ins in Agents in Microsoft 365 Copilot für Setup- und Konfigurationsdetails.
Dynamic Client Registration
Wenn Ihr MCP-Server die Dynamic Client Registration (DCR) unterstützt, können Sie eine authentication Konfiguration in Ihrer Connectordefinition weglassen, und Cowork erstellt automatisch einen OAuth-Client im Namen Ihres Plug-Ins.
Sie können das authorization Objekt weglassen, müssen aber trotzdem einfügen mcpToolDescription. Konfigurieren Sie die URL und die Toolbeschreibung Ihres MCP-Servers, und Cowork kümmert sich um den OAuth-Client:
"remoteMcpServer": {
"mcpServerUrl": "https://api.contoso.com/legal/mcp",
"mcpToolDescription": {
"file": "./tools/contoso-legal-tools.json"
}
}
Schritt 4: Erstellen des Manifests
Erstelle manifest.json in deinem Paketstamm:
{
"$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 Folgendes ein 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"
}
}
}
}
]
}
In der Connectorkonfiguration referenceId sollte die OAuth-Registrierungs-ID enthalten sein und mcpToolDescription.file auf eine JSON-Datei mit der Toolbeschreibung verweisen, die im ZIP-Paket enthalten ist.
Wichtig
Das Manifestschema von v1.28 ist streng: Es wird im Stammverzeichnis festgelegt additionalProperties: false , sodass jedes Feld, das nicht im Schema definiert ist, abgelehnt wird. Felder, die in Standard-Teams-App-Manifesten packageNamegültig sind, führen dazu, dass der Upload mit einem Fehler wie Property 'packageName' has not been defined and the schema does not allow additional properties. "Nur die hier gezeigten Felder einschließen" fehlschlägt.
Schritt 5: Hinzufügen von Symbolen
Erstelle zwei PNG-Symbole:
| Symbol | Size | Zweck |
|---|---|---|
color.png |
192×192 px | Vollfarbiges App-Symbol wird im Store und in der App-Liste angezeigt |
outline.png |
32×32 px | Einfarbiges Gliederungssymbol für kompakte Ansichten |
Wenn Sie noch keine Symbole haben, atk import openplugin werden einfarbige Platzhalter generiert. Ersetzen Sie sie vor der Übermittlung an den Shop.
Schritt 6: Verpacken
Erstellen Sie eine ZIP-Datei mit dem gesamten Inhalt auf der Stammebene:
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
Wenn Ihr Paket einen agentConnectors Eintrag enthält, fügen Sie die JSON-Datei mit der Tool-Beschreibung ein, auf die von verwiesen wird mcpToolDescription.file. Nur Skills-Pakete 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.
Laden Sie die App zum persönlichen Testen über die Befehlszeilenschnittstelle des Microsoft 365 Agents Toolkit quer:
Installieren
@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 Geschäftskonto an und installieren Sie das Agent-Paket. 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 für die spätere Verwendung beim Aktualisieren oder Deinstallieren.
Weitere Informationen finden Sie unter Befehlszeilenschnittstelle Microsoft 365 Agents Toolkit.
Schritt 8: Veröffentlichen in Ihrem Mandanten
- Öffnen des M365 Admin Centers>Verwalten von Apps>Benutzerdefinierte App hochladen.
- Wählen Sie die Schaltfläche mit den Auslassungspunkten (...)>Agent hinzufügen.
- Laden Sie Ihr
.zipPaket hoch. - Öffnen Sie Cowork>Sources &Skills-Plug-Ins>. Ihr Plug-In wird im Abschnitt "Entdecken" angezeigt.
Schritt 9: Für die Öffentlichkeit veröffentlichen
Für Plug-Ins, die für die öffentliche Verteilung vorgesehen sind, übermitteln Sie Ihr Plug-In über das Partner Center an den Microsoft 365 App Store. Weitere Informationen finden Sie unter Veröffentlichen von Agents für Microsoft 365 Copilot.
Testen eines Connectors mit einem lokalen MCP-Server
Connectors erfordern ein HTTPS-Token mcpServerUrl, daher müssen Sie ihn zum Testen eines auf Ihrem Computer ausgeführten Servers über eine öffentliche HTTPS-URL verfügbar machen.
Dev-Tunnel stellen ein Relay bereit, das TLS für Sie beendet.
devtunnel port create <tunnel> -p <port> --protocol http
Wichtig
Verwenden Sie --protocol http, nicht https. Das --protocol Flag beschreibt den lokalen Dienst, an den der Tunnel weiterleitet, nicht die öffentliche Tunnel-URL. Die meisten lokalen MCP-Server sprechen einfaches HTTP. Wenn Sie also festlegen --protocol https , während Ihr Server HTTP bedient, 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.
Problembehandlung
| Problembeschreibung | Ursache | Behebung |
|---|---|---|
Jede getunnelte Anforderung wird zurückgegeben 502 und der lokale Server spricht HTTP |
devtunnel port create was run with --protocol https |
Erstellen Sie den Port mit --protocol http |
Getunnelte Anforderungen kehren unter macOS zurück 502 , obwohl der lokale Server ausgeführt wird |
The server is bound to 0.0.0.0 (IPv4-only), but the tunnel dials localhost, which resolved to ::1 (IPv6) first |
Binden Sie den Server so ein :: , dass er sowohl IPv4- als auch IPv6-Verbindungen akzeptiert |
Hochladen schlägt fehl mit Required properties are missing from object: mcpToolDescription |
Der Connector fehlt mcpToolDescription |
Fügen Sie diese Datei mit einem file Verweis hinzu und verpacken Sie mcpToolDescription sie in der ZIP-Datei |
Hochladen schlägt fehl mit Property '<field>' has not been defined and the schema does not allow additional properties |
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 Skills (kein Connector)
Am besten geeignet für zeitnahe 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
│ └── 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 die integrierten Fähigkeiten von Cowork bereits verwenden können.
my-connector.zip
├── manifest.json # agentConnectors only, no agentSkills
├── color.png
├── outline.png
└── tools/ # Tool-description file(s) for mcpToolDescription
└── my-connector.json
Importierter Claude-Code oder Cursor-Plug-In
Verwenden Sie diese Option für vorhandene Plug-Ins von anderen KI-Tools, die auf Cowork ausgerichtet sind.
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 zur Erstellung von Fähigkeiten
Befolgen Sie diese Richtlinien, um Fähigkeiten zu erstellen, die zuverlässig aktiviert werden und konsistente Ergebnisse liefern.
Effektive Beschreibungen verfassen
Das description Feld bestimmt, wann der Agent Ihren Skill aktiviert. Seien Sie 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.
Schreiben effektiver Workflows
- Seien Sie in der Beschreibung genau. Triggerphrasen einschließen: "Verwenden, wenn Benutzer darum bittet..." Mit dieser Beschreibung entscheidet der Agent, welche Fertigkeit aktiviert werden soll.
- Struktur als Workflow. Nummerieren Sie die Schritte. 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.
-
Referenztools nach Namen. Wenn Ihre Fähigkeiten von Connectortools abhängen, benennen Sie diese explizit: "Verwenden Sie das
search_case_lawTool, um..." -
Halten Sie die Haupt 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. VerwendungagentConnectorsmit Auth für API-Anmeldeinformationen. - Duplizieren Sie integrierte Skills nicht. Überprüfen Sie vor dem Erstellen die integrierte Liste der Fähigkeiten .
- Machen Sie die Fähigkeiten nicht zu breit. "Alles mit Rechtsdokumenten machen" ist schlechter als spezifische Fähigkeiten 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 Text mehr als ~3.000 Wörter enthält, verschieben Sie detaillierte Inhalte in
references/.
Gültigkeitsprüfungsregeln
Wenn Sie Ihr Paket übermitteln, validiert die Plattform es auf mehreren Ebenen. Beheben Sie diese Fehler vor der Übermittlung, um Ablehnungen zu vermeiden.
Überprüfung auf Manifestebene
| Code | Regel | Severity |
|---|---|---|
| ASKILL-M001 |
folder ist für jeden agentSkills Eintrag erforderlich |
Fehler |
| ASKILL-M002 |
agentSkills Array kann bis zu 20 Elemente enthalten |
Fehler |
| ASKILL-M003 |
folder Pfad kann bis zu 256 Zeichen umfassen |
Fehler |
Überprüfung auf Paketebene
| Code | Regel | Gängige Korrektur | Severity |
|---|---|---|---|
| ASKILL-P001 | Der Ordner, auf den im Manifest verwiesen wird, ist in ZIP vorhanden | Überprüfen Sie Ihre ZIP-Struktur | Fehler |
| ASKILL-P002 | Ordner enthält eine SKILL.md Datei |
Fehlende hinzufügen SKILL.md |
Fehler |
| ASKILL-P003 |
SKILL.md hat eine gültige YAML-Frontmaterie zwischen --- Trennzeichen |
Korrigieren der YAML-Syntax | Fehler |
| ASKILL-P004 | Frontmatter enthält name Feld |
Zur Frontmatter hinzufügen name: |
Fehler |
| ASKILL-P005 | Frontmatter enthält description Feld |
Zur Frontmatter hinzufügen description: |
Fehler |
| ASKILL-P006 |
name Stimmt mit dem Ordnernamen überein (letztes Pfadsegment) |
Ordner umbenennen oder korrigieren name: |
Fehler |
| ASKILL-P007 |
name ist Kebab-Kiste |
Verwenden Sie my-skill nicht MySkill oder my_skill |
Fehler |
| ASKILL-P008 | Keine doppelten folder Werte im Array |
Duplikate entfernen | Fehler |
Connector-Validierung
| Regel | Severity |
|---|---|
Jeder Connector erfordert ein id und displayName |
Fehler |
Alle Connectorwerte id müssen innerhalb des Manifests eindeutig sein |
Fehler |
Genau einer von plugin oder remoteMcpServer |
Fehler |
mcpServerUrl muss eine gültige HTTPS-URL sein. |
Fehler |
mcpToolDescription erforderlich für jeden remoteMcpServer, mit einem file in der ZIP-Datei vorhandenen |
Fehler |
authorization.referenceId Erforderlich, es sei denn, Typ ist None |
Fehler |
authorization.referenceId Darf nicht vorhanden sein, wenn Typ None |
Fehler |
Überprüfung von Begleitdateien
Das Portal überprüft Begleitdateien (Referenzmaterialien, Skripte und andere Dateien nebeneinander SKILL.md) zum Zeitpunkt des Hochladens und Synchronisierens:
| Regel | Severity |
|---|---|
Maximal 20 Begleitdateien pro Skill (ausgenommen SKILL.md) |
Fehler |
| Jede Begleitdatei darf höchstens 5 MB groß sein | Fehler |
| Die Gesamtzahl der Begleitdateien darf maximal 10 MB groß sein und jeder Skill | Fehler |
| Dateipfade müssen relativ sein (keine absoluten Pfade) | Fehler |
Keine Pfaddurchlaufsegmente (..) |
Fehler |
| Keine umgekehrten Schrägstriche oder Nullbytes in Dateinamen | Fehler |
Keine versteckten Dateien (Namen beginnend mit .) |
Fehler |
Keine reservierten Windows-Namen (CON, PRN, AUX, NULCOM1, –COM9, –LPT9) LPT1 |
Fehler |
Dateinamen dürfen nur sichere Zeichen verwenden (alphanumerische Zeichen, Bindestriche, Unterstriche, Punkte, Leerzeichen, !) |
Fehler |
Plattformübergreifende Kompatibilität
Skills verwenden den offenen Standard Agent Skills. Dieselben SKILL.md Dateien funktionieren in mehreren KI-Tools:
| Plattform | Kompatibilität |
|---|---|
| Claude Code | Vollständiges gleiches SKILL.md Format |
| Claude.ai Projekte | Full-Skills können als Projektdateien hochgeladen werden |
| VS Code / GitHub Copilot | Full-Agent Im Agent-Modus unterstützte Qualifikationen |
| Gemini CLI | Full-Agent Unterstützte Qualifikationen |
| JetBrains Junie | Full-Agent Unterstützte Qualifikationen |
| OpenAI Codex | Full-Agent Unterstützte Qualifikationen |
| Cursor | Full-Agent Unterstützte Qualifikationen |
Wenn Sie Fähigkeiten für Claude Code und Cowork entwickeln, beginnen Sie mit der Claude Code-Plugin-Struktur - es ist die Obermenge:
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)
Importieren Sie es dann in ein M365-Projekt, wenn Sie bereit sind, es im Microsoft 365 App Store zu veröffentlichen:
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 auf Tools, von denen tools/listIhr Server zurückkehrt, und entscheidet damit, ob ein Toolaufruf vom Benutzer bestätigt werden muss und welche Bezeichnung in der Eingabeaufforderung angezeigt werden soll.
Verfügbare Felder
| Feld | Typ | Effekt |
|---|---|---|
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. Greift auf den Toolnamen zurück, wenn nicht vorhanden ist. |
Regeln für die Bestätigung
Eine 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 Lesewert, der automatisch ausgeführt wird:
{
"name": "search_docs",
"annotations": {
"title": "Search Documents",
"readOnlyHint": true
}
}
Was ist jetzt verfügbar?
- Microsoft-Tools (Graph, Dataverse und andere) werden unabhängig von Anmerkungen durch die integrierte Richtlinie von Cowork begrenzt.
- Für MCP-Server, die nicht von Microsoft stammen, erfolgt das schrittweise Rollout der anmerkungsgesteuerten Bestätigung. Das Festlegen der Hinweise ist jetzt vorwärtskompatibel, und Bestätigungsaufforderungen werden angezeigt, wenn das Rollout erweitert wird, ohne dass ein Entwicklerwechsel erforderlich ist.
Akzeptieren von Dateien aus dem Cowork-Arbeitsbereich
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 (keyword)contentEncoding: base64, und Cowork kümmert sich um den Rest. 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 base64-codiert, bevor Sie Ihren Server aufrufen, sodass Dateibytes nie in den Kontext des Agenten gelangen. Der Agent sieht und gibt immer nur Arbeitsbereichsdateipfade aus.
Hinweis
Weisen Sie den Agent nicht an, eine Datei selbst base64-codieren und das Blob in einen Toolaufruf einzufügen. Dabei wird die gesamte Datei in den Kontext des Modells geladen und hängt davon ab, ob das Modell den Blob genau wiedergibt. Es scheint bei kleinen Testdateien zu funktionieren und schlägt bei echten 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 für 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.propertiesdeklariert sind, ersetzt Cowork sie im modellseitigen Schema durch ein einzelnes direct_attachment_file_paths Array – denselben Parameter, den die integrierten Tools von Cowork verwenden, sodass der Agent bereits weiß, wie er aufgefü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 in diesem einen direct_attachment_file_paths Array reduziert. Zur Aufrufzeit fächert Cowork die aufgelösten Dateien wieder in Ihre ursprünglichen Parameternamen in Deklarationsreihenfolge auf.
Parameter geschachtelter Dateien
Ein Dateiparameter, der in einem Objekt oder einem Array von Objekten geschachtelt ist, wird ebenfalls unterstützt und anders behandelt: Anstatt reduziert zu werden, wird er an Ort und Stelle in eine Pfadzeichenfolge an seinem eigenen Speicherort neu geschrieben. Dadurch wird die Zuordnung zwischen einer Datei und ihren gleichgeordneten Feldern beibehalten, z. B. 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 Anruf weitergeleitet wird.
Das Nisten erfolgt bis zu einer Tiefe von vier Ebenen unterhalb der Spitze des .inputSchema
$ref Zeiger werden nicht befolgt – definieren Sie Dateiparameter inline und nicht hinter einer $ref.
Was Ihr Server empfängt
Ihr Server erhält eine gewöhnliche tools/call App, in der Ihre ursprünglichen Parameternamen mit Base64-codiertem Inhalt ausgefü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 Parameter nicht deklarieren contentEncoding: base64 , sind davon nicht betroffen.
Einschränkungen
| Grenze | Wert |
|---|---|
| Files 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 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.
Empfehlungen
- Beschreiben Sie den Parameter für einen menschlichen Leser. Der Agent entscheidet anhand der Beschreibung, welche Datei zu welchem Parameter gehört. Funktioniert
"The signed contract PDF to analyze"beispielsweise besser als"file". - Geben Sie die Formate, die Sie akzeptieren , in der Parameterbeschreibung an. Cowork durchläuft alles, was der Benutzer anfügt. Validiere den Inhaltstyp auf deiner Seite und gib einen klaren Toolfehler zurück, wenn er nicht verwendbar ist.
- Festlegen von Anmerkungen. Ein Tool, das eine Datei empfängt und entsprechend handelt, ist normalerweise nicht schreibgeschützt und fordert daher zur Bestätigung auf. Siehe MCP-Annotation und Bestätigungsverwaltung.
- Halten Sie Dateiparameter inline. Ein Parameter, der sich hinter einer
$refoder tiefer als vier Ebenen 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.
- Erwarten Sie eine genaue Anzahl von Tools, die nur skalare Komponenten verwenden. 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 es landet. Der contentEncoding: base64 hier beschriebene Vertrag gilt weiterhin.
Identifizieren des Cowork-Datenverkehrs zu Ihrem Server
Wenn Ihr MCP-Server die Werkzeugsichtbarkeit nach Client steuert oder Sie den empfangenen Datenverkehr zuordnen möchten, können Sie Anfragen erkennen, die von Cowork kommen. Cowork präsentiert eine stabile Softwareidentität auf zwei Kanälen:
| Kanal | Position in der Oberfläche | Wert |
|---|---|---|
User-Agent Anforderungsheader |
Jede ausgehende Anforderung, die Cowork an Ihren Server sendet | copilot-cowork/1.0 |
clientInfoim MCP-Handshake initialize |
Die initialize Anforderung lautet nur, |
{ "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 dein Gate über Versionsschwankungen hinweg funktioniert.
# Correct: case-insensitive prefix match
copilot-cowork
# Incorrect: exact match breaks when the version changes
copilot-cowork/1.0
Wählen Sie den richtigen Kanal für Ihr Tor
Die beiden Kanäle haben unterschiedliche Bereiche. Wählen Sie also denjenigen aus, der der Art und Weise entspricht, wie Ihr Server sein Gate erzwingt:
- Der
User-AgentHeader ist in jeder Anforderung vorhanden, einschließlichtools/listundtools/call. Wenn Sie Gate oder Attribut pro Anforderung verwenden, geben Sie diesen Header ein. -
clientInfowird nur beiminitializeHandshake gesendet. Wenn Sie ein Gate pro Sitzung zur Verbindungszeit verwenden, können Sie es dort lesen, aber es wird bei späteren Anforderungen 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 nicht |
|---|---|
Einen stabilen Softwarenamen (copilot-cowork) und eine Vertragsversion |
Alle Mandanten-, Benutzer-, Sitzungs- oder Unterhaltungsbezeichner |
| Derselbe Wert für jede Anforderung und jede Verbindung | Ein Qualifizierer pro Connector |
Da es keinen Grenzwert 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äufige Fragen
Kann ich Skills aus dem M365-Paket in Claude Code verwenden?
Ja. Die Skill-Ordner enthalten standardmäßige Agent-Skills. Kopieren Sie sie in .claude/skills/ ein beliebiges Claude Code-Projekt oder führen Sie sie ausatk export openplugin, um das gesamte Projekt wieder in ein Claude Code-Plugin zu konvertieren.
Benötige ich einen Remoteconnector?
Nein Reine Skill-Pakete eignen sich gut für Prompt-basierte Workflows. Connectors werden nur benötigt, wenn Ihr Skill Livedaten von einem externen System benötigt.
Wie unterscheiden sich Plugin-Skills von integrierten Skills?
Plugin-Fähigkeiten 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
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 Skills 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.
Wie viele Skills können pro Paket maximal verwendet werden?
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, und Cowork löst die Arbeitsbereichsdatei des Benutzers in base64-Inhalt auf, bevor Sie Ihren Server aufrufen. 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.
Gewusst wie eine deterministische GUID für mein Paket generieren?
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. Um ein eigenes zu erstellen, übergeben --app-idSie . Verwenden Sie für die manuelle Verpackung einen beliebigen GUID-Generator. Achten Sie darauf, dass sie versionsübergreifend stabil bleibt.