Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Microsoft Copilot Cowork admite la extensibilidad a través de paquetes de aplicaciones M365, el mismo mecanismo de distribución que usan las aplicaciones de Teams, los agentes de Copilot y los complementos de Office. Puedes ampliar Cowork con:
- Habilidades: flujos de trabajo basados en indicaciones que enseñan a Cowork experiencia en nuevos dominios, como análisis financiero, investigación legal o flujos de trabajo de recursos humanos.
- Conectores: servidores remotos que dan a Cowork acceso a fuentes de datos externas y APIs.
Ambos se empaquetan juntos en un paquete de aplicaciones estándar de Microsoft 365 y se distribuyen a través de Microsoft 365 App Store.
Importante
Las barreras de información (IB) de Microsoft Purview no se admiten actualmente para la administración y el uso compartido de complementos o aptitudes. En los espacios empresariales donde IB está habilitado, las cargas de archivos de conocimiento incrustados se bloquean en el nivel de espacio empresarial. Esto evita que se carguen o publiquen complementos y habilidades afectados.
Qué compilará
Un complemento de Cowork es un .zip paquete que contiene:
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
Las habilidades utilizan el estándar abierto de habilidades de agente, el mismo formato compatible con Claude Code, Visual Studio Code Copilot, Gemini CLI, Cursor, JetBrains Junie y otras 30+ herramientas de IA.
Elige tu punto de partida
| Punto de inicio | Ruta de acceso | Tiempo hasta el primer paquete |
|---|---|---|
| Tengo un complemento de código o cursor de Claude existente | Importarlo | ~5 minutos |
| Empiezo desde cero | Compilar desde cero | ~30 minutos |
Importar un complemento existente
Si ya tiene un complemento de código o cursor de Claude con aptitudes y servidores MCP, la CLIatk () del Kit de herramientas de agentes de Microsoft 365 lo importa directamente. La CLI se ejecuta en Windows, macOS y Linux.
Instale la CLI (requiere la versión 1.1.12 o posterior):
npm install -g @microsoft/m365agentstoolkit-cliCompruebe la versión:
atk --versionImporta tu complemento:
atk import openplugin --path ./my-claude-plugin --output ./my-plugin-project \ --privacy-url https://contoso.com/privacy \ --terms-url https://contoso.com/terms
El comando lee el directorio de su complemento (o.cursor-plugin/plugin.json), .mcp.jsony skills/ luego aplica andamiaje .claude-plugin/plugin.json a un proyecto de Agents Toolkit que contiene appPackage/manifest.json, sus habilidades e íconos generados.
Debe incluir --privacy-url y --terms-url porque los manifiestos de complemento no tienen campos equivalentes y el manifiesto de Microsoft 365 requiere ambos.
Nota:
atk import openplugin Localiza un manifiesto de complemento en un directorio con prefijo de punto—.claude-plugin/plugin.json, .cursor-plugin/plugin.json, o .plugin/plugin.json—junto a un .mcp.jsonarchivo . La especificación de complementos de agente 1.0.0 coloca el manifiesto en un nivel plugin.json superior y la configuración de MCP en mcp.json. Para importar un complemento que sigue el diseño 1.0.0, mueva su .plugin/plugin.json manifiesto y cámbiele el nombre mcp.json a .mcp.json.
Empaquetar el resultado en un archivo cargable .zip:
cd my-plugin-project
atk package --manifest-file ./appPackage/manifest.json \
--output-package-file ./appPackage/build/appPackage.zip \
--output-folder ./appPackage/build
Nota:
atk import openplugin Genera un devPreview manifiesto. Los ejemplos de manifiesto en otra parte de este artículo se dirigen al esquema v1.28. Si va a publicar a través de un canal que requiere v1.28, actualice manifestVersion y $schema en el generador appPackage/manifest.jsony agregue la mcpToolDescription propiedad a cada conector como se describe en Describa las herramientas del conector.
Qué se importa
| Artefacto de complemento | Equivalente de M365 | Notas |
|---|---|---|
.claude-plugin/plugin.json |
manifest.json |
Campos de nombre, descripción y desarrollador asignados; GUID generado automáticamente (UUID determinista v5) |
skills/*/SKILL.md |
agentSkills[] Entradas + skills/ carpeta |
Copiado textualmente - formato idéntico |
.mcp.json de aplicaciones SAP |
agentConnectors[] Entradas |
Detección automática de URL y tipo de autenticación |
color.png / outline.png |
Iconos en el paquete | Se usa si está presente; marcadores de posición generados si faltan |
Importante
Para cada conector importado desde .mcp.json, el generado authorization.referenceId es un marcador de posición derivado del complemento y el nombre del servidor. Reemplácelo por el identificador de registro de cliente de OAuth real antes de publicar. Consulte Tipos de autenticación admitidos.
Qué no se ha convertido
Las siguientes características del complemento de Claude aún no se admiten en el manifiesto de Microsoft 365:
| Característica del complemento Claude | Estado |
|---|---|
commands/ (comandos de barra diagonal) |
No compatible aún |
agents/ (subagentes) |
No compatible aún |
hooks/ (controladores de eventos) |
No compatible aún |
settings.json |
No aplicable |
bin/ (ejecutables) |
No aplicable |
Opciones de importación
| Opción | Description |
|---|---|
--path, -p |
Obligatorio. Directorio del complemento que contiene .claude-plugin/plugin.json, .cursor-plugin/plugin.json, o .plugin/plugin.json |
--output, -o |
Carpeta del proyecto de destino (predeterminado: ./<plugin-name>) |
--privacy-url |
developer.privacyUrl para el manifiesto generado |
--terms-url |
developer.termsOfUseUrl para el manifiesto generado |
--website-url |
developer.websiteUrl. Vuelve a y, a homepagecontinuación, author.url |
--app-id |
Invalidar el UUID determinista v5 generado para el manifiesto id |
--default-auth-type |
Auto (predeterminado), None, OAuthPluginVault, o ApiKeyPluginVault |
Detección automática de tipo de autenticación:
| Origen | Tipo de autenticación predeterminado | Reason |
|---|---|---|
| Direcciones URL externas de HTTPS | OAuthPluginVault |
La mayoría de las API remotas necesitan autenticación |
localhost y direcciones URL no HTTPS |
None |
Servidores de desarrollo local |
Si la detección automática no coincide con su configuración, utilícela --default-auth-type para invalidarla.
Volver a exportar a un directorio de complementos
Para volver a mover un proyecto de Agents Toolkit a un directorio de complementos, por ejemplo, para mantener sincronizados un complemento de Claude Code y un paquete de Cowork, use atk export openplugin:
atk export openplugin --path ./my-plugin-project \
--output ./my-claude-plugin --manifest-kind claude-plugin
| Opción | Description |
|---|---|
--path, -p |
Obligatorio. Kit de herramientas de agentes de la carpeta del proyecto que contiene appPackage/manifest.json |
--output, -o |
Directorio del complemento de destino (predeterminado: ./<plugin-name>-openplugin) |
--manifest-kind |
open-plugin (valor predeterminado, escrituras .plugin/plugin.json) claude-plugino cursor-plugin |
La exportación escribe un x-microsoft-365-agents-toolkit bloque en el plugin.jsonarchivo . Ese bloque lleva el manifiesto id, las direcciones URL del desarrollador y la configuración del conector, por lo que se realizan viajes de ida y vuelta posteriores atk import openplugin sin necesidad --privacy-url de otra --terms-url vez.
Nota:
El x-microsoft-365-agents-toolkit bloque es específico de Agents Toolkit y el tipo predeterminado open-plugin escribe el manifiesto en .plugin/plugin.json.
Agent Plugins 1.0.0 utiliza un nivel plugin.json superior y transporta datos específicos del cliente bajo una extensions clave con un espacio de nombres de dominio inverso, por lo que otros clientes ignoran este bloque en lugar de actuar sobre él. Cuando el destino sea Código o cursor de Claude, use --manifest-kind claude-plugin o cursor-plugin.
Heredado: script de conversión de PowerShell
Antes de atk admitir la importación de complementos, la conversión utilizaba un script de PowerShell solo para Windows, que sigue estando disponible como script de conversión:
.\Convert-ClaudePluginToMOS3.ps1 -PluginPath ./my-claude-plugin -OutputPath ./output
Úselo atk import openplugin en su lugar. Es multiplataforma, admite fuentes de Cursor y Claude Code, y puede exportar a un directorio de complementos.
Crear un complemento desde cero
Sigue estos pasos para crear un paquete de complementos desde cero, comenzando con tu primera habilidad y construyendo hasta un paquete completo que se pueda publicar.
Paso 1: Crear la primera aptitud
Una aptitud es una carpeta que contiene un SKILL.md archivo. Cree la estructura de carpetas siguiente:
my-extension/
└── skills/
└── contract-analysis/
└── SKILL.md
Escriba SKILL.md con frontmatter YAML y un cuerpo de Markdown:
---
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 campos de frontmatter
Campos obligatorios:
| Campo | Restricciones | Description |
|---|---|---|
name |
1-64 caracteres, kebab-case | Identificador de aptitud: debe coincidir exactamente con el nombre de la carpeta |
description |
De 1 a 1024 caracteres | Cuándo usar esta habilidad: incluir frases desencadenantes |
Importante
- El nombre de la carpeta debe coincidir con el
namecampo del frontmatter. Esta falta de coincidencia es la causa más común de fallas de habilidades. - Los campos de lista
descriptionde complementos no deben incluir llamadas a la acción que dirijan a los usuarios a mercados externos para comprar suscripciones.
| Ruta de acceso a la carpeta |
name campo |
¿Válido? | ¿Por qué? |
|---|---|---|---|
skills/contract-analysis/SKILL.md |
contract-analysis |
Sí | Coincidencia de carpeta y nombre |
skills/contract-analysis/SKILL.md |
ContractAnalysis |
No | El nombre usa PascalCase en lugar de carpetas coincidentes |
skills/my-skill/SKILL.md |
contract-analysis |
No | La carpeta es pero el my-skill nombre es contract-analysis |
Reglas de nomenclatura (kebab-case): Use solo caracteres alfanuméricos en minúsculas y guiones. No use guiones consecutivos ni guiones iniciales o finales.
| Ejemplo | ¿Válido? | Incidencia |
|---|---|---|
bond-relative-value |
Sí | Minúsculas con guiones |
fx-carry-trade |
Sí | Minúsculas con guiones |
email |
Sí | Una sola palabra, no se necesitan guiones |
Bond_Relative_Value |
No | Guiones bajos y letras mayúsculas |
--my-skill-- |
No | Guiones iniciales y finales |
my--skill |
No | Guiones consecutivos |
Paso 2: Agregar materiales de referencia (opcional)
Para las aptitudes complejas, mantenga la estructura principal SKILL.md y mueva el contenido detallado a los subdirectorios. Estos archivos adicionales son archivos complementarios. La habilidad los carga cuando es necesario.
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
Límites de archivos complementarios
Cada habilidad puede incluir hasta 20 archivos complementarios (cualquier archivo que no SKILL.mdsea ). Se aplican los siguientes límites por habilidad:
| Límite | Valor |
|---|---|
| Número máximo de archivos complementarios | 20 |
| Tamaño máximo por archivo complementario | 5 MB |
| Tamaño total máximo del acompañante | 10 MB |
| Tiempo de espera de descarga (todos los compañeros) | 15 segundos |
Reglas de archivos complementarios
Las rutas de acceso de archivos complementarios deben seguir estas reglas:
- Usar solo rutas de acceso relativas (sin rutas de acceso absolutas)
- Sin recorrido de ruta (
..segmentos) - No hay barras diagonales inversas ni bytes nulos en los nombres de archivo
- No hay archivos ocultos (nombres que comiencen por
.) - No hay nombres reservados de Windows (
CON,PRN,AUX,NULCOM1, -COM9, -LPT9)LPT1 - El archivo
SKILL.mden sí no cuenta como archivo complementario - Los nombres de archivo deben usar caracteres seguros: alfanuméricos, guiones, guiones bajos, puntos, espacios y
!
Para mantener la ventana de contexto eficiente, el sistema carga habilidades en tres capas:
| Layer | Cuando está cargado | Tamaño de destino |
|---|---|---|
Frontmatter (name + description) |
Siempre - en el inicio | ~100 tokens |
SKILL.md Cuerpo |
Cuando se activa la habilidad | Menos de 5000 tokens (1500-2000 palabras) |
Referencias (references/) |
A petición del agente | Ilimitado |
Scripts (scripts/) |
Ejecutado, no cargado en contexto | N/D |
Haga referencia a los subdirectorios explícitamente en SKILL.md para que el agente sepa que existen:
## 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
Paso 3: Agregar un conector (opcional)
Si su extensión necesita acceso a datos externos, agregue un servidor MCP remoto. Este paso es opcional. Los paquetes de solo aptitudes funcionan bien para flujos de trabajo basados en indicaciones.
Sugerencia
Si su servidor controla la visibilidad de la herramienta por cliente o atribuye el tráfico entrante, consulte Identificar el tráfico de Cowork a su servidor para la identidad del cliente que presenta Cowork.
Nota:
Los complementos personalizados no son compatibles con Cowork en dispositivos móviles.
Requisitos del conector
| Requisito | Detalles |
|---|---|
| Transport | HTTP transmitible (se requiere HTTPS, TLS 1.2+) |
| Protocolo | Formato de mensaje JSON-RPC 2.0 |
| Detección de herramientas | Compatibilidad con tools/list la detección dinámica (recomendado) |
| Ejecución de herramientas | Soporte tools/call para invocación |
| Disponibilidad | Tiempo de actividad del 99,9 % recomendado para aplicaciones publicadas en Store |
| Tiempo respuesta | Menos de 30 segundos por llamada de herramienta |
Directrices de diseño de herramientas
-
Una herramienta por acción para API pequeñas (menos de 15 operaciones):
search_case_law,get_ruling,cite_precedent -
Buscar + ejecutar para API grandes (50+ operaciones):
search_actions+execute_action -
Nombres descriptivos:
get_bond_pricenogetData - Esquemas de entrada enriquecidos: incluye una descripción para cada parámetro: esto es lo que lee el agente
- Salida estructurada: devuelve JSON que el agente puede formatear para el usuario
-
Entradas de archivo: Para aceptar un archivo del espacio de trabajo del usuario, declare el parámetro con
contentEncoding: base64. Obtenga más información en Aceptar archivos del área de trabajo de Cowork.
Describa las herramientas del conector (mcpToolDescription)
Cada remoteMcpServer conector debe incluir un mcpToolDescription objeto. Su propiedad anidada file apunta a un archivo JSON de descripción de herramienta que empaquetas dentro de tu .zip y al que hace referencia mediante una ruta de acceso relativa desde la raíz del paquete. Si omites mcpToolDescription, el servicio de paquetes rechaza la carga con un error HTTP 400:
Faltan las propiedades necesarias en el objeto: mcpToolDescription.
"remoteMcpServer": {
"mcpServerUrl": "https://api.contoso.com/legal/mcp",
"mcpToolDescription": {
"file": "./tools/contoso-legal-tools.json"
},
"authorization": {
"type": "OAuthPluginVault",
"referenceId": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
}
}
El archivo al que se hace referencia (por ejemplo, tools/contoso-legal-tools.json) describe las herramientas que expone el conector y debe estar presente en el paquete ZIP. Inclúyelo junto a tu manifest.json carpeta and skills/ cuando empaquetes el plugin.
Tipos de autenticación admitidos
| Tipo de autenticación | Cuándo usarlo | Experiencia del usuario |
|---|---|---|
None |
API públicas o anónimas, servicios internos | Transparente: sin solicitud de autenticación |
OAuthPluginVault |
API de OAuth 2.0 (recomendado para producción) | El usuario completa el consentimiento de OAuth una vez |
ApiKeyPluginVault |
Servicios basados en claves de API | El usuario proporciona la clave una vez |
Nota:
- La compatibilidad con la autenticación de claves API aún no está disponible en Cowork.
- Si el servidor MCP requiere una clave de API, use
OAuthPluginVaultel Registro dinámico de clientes en su lugar, o exponga un punto de conexión que acepteNone.
Para OAuthPluginVault y ApiKeyPluginVault, los puntos a las referenceId credenciales almacenadas en el almacén de tokens de Microsoft Enterprise - secretos nunca aparecen en los archivos de manifiesto o de aptitudes. El referenceId valor es el identificador de registro del cliente OAuth que se crea al registrar un cliente OAuth con el Kit de herramientas de agentes.
Importante
Al registrar el cliente OAuth, establezca el uso por organización en Cualquier organización de Microsoft 365 para asegurarse de que el complemento funciona en todos los inquilinos.
Autenticación MCP
Para usar OAuth o ApiKey para la autenticación, consulte Configurar la autenticación para complementos MCP y API en agentes en Microsoft 365 Copilot para obtener detalles de instalación y configuración.
Registro dinámico de clientes
Si su servidor MCP admite el Registro dinámico de clientes (DCR), puede omitir una authentication configuración de la definición del conector, y Cowork creará automáticamente un cliente OAuth en nombre del complemento.
Puede omitir el authorization objeto, pero aún debe incluir mcpToolDescription. Configure la URL del servidor MCP y la descripción de la herramienta, y Cowork se encargará del cliente OAuth:
"remoteMcpServer": {
"mcpServerUrl": "https://api.contoso.com/legal/mcp",
"mcpToolDescription": {
"file": "./tools/contoso-legal-tools.json"
}
}
Paso 4: Crear el manifiesto
Cree manifest.json en la raíz del paquete:
{
"$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" }
]
}
Para agregar un conector, incluya lo siguiente 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"
}
}
}
}
]
}
En la configuración del conector, referenceId debe ser el id. de registro de OAuth y mcpToolDescription.file debe apuntar a un archivo JSON de descripción de herramienta que se incluye en el paquete ZIP.
Importante
El esquema del manifiesto v1.28 es estricto: se establece additionalProperties: false en la raíz, por lo que se rechaza cualquier campo que no esté definido en el esquema. Los campos que son válidos en los manifiestos estándar de la aplicación Teams, como packageNamepor ejemplo, hacen que la carga falle y se produzca un error, como Property 'packageName' has not been defined and the schema does not allow additional properties. Incluir solo los campos que se muestran aquí.
Paso 5: Agregar iconos
Crea dos iconos PNG:
| Icono | Size | Objetivo |
|---|---|---|
color.png |
192×192 px | Icono de aplicación a todo color que se muestra en la tienda y la lista de aplicaciones |
outline.png |
32×32 px | Icono de esquema de un solo color para vistas compactas |
Si aún no tiene iconos, atk import openplugin genera marcadores de posición de color sólido. Reemplácelos antes del envío de la tienda.
Paso 6: Empaquetar
Cree un archivo ZIP con todo el contenido en el nivel raíz:
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
Si el paquete incluye una agentConnectors entrada, incluye el archivo JSON tool-description al que hace referencia .mcpToolDescription.file Los paquetes de solo aptitudes no necesitan una tools/ carpeta.
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/
Uso del Kit de herramientas de agentes de Microsoft 365
atk package --manifest-file ./appPackage/manifest.json \
--output-package-file ./appPackage/build/appPackage.zip \
--output-folder ./appPackage/build
Paso 7: Probar
Para probar la aplicación, cargue el paquete de la aplicación en Teams como se describe en Cargar la aplicación en Teams.
Para realizar pruebas personales, transfiera localmente la aplicación mediante la interfaz de línea de comandos del Kit de herramientas de agentes de Microsoft 365:
Instalar
@microsoft/m365agentstoolkit-clidesdenpm:npm install -g @microsoft/m365agentstoolkit-cliCompruebe la instalación ejecutando:
atk --versionAutentique con su cuenta profesional de Microsoft 365:
atk auth loginInicie sesión en su cuenta profesional e instale el paquete de agente. Reemplaza la ruta del archivo por la ubicación del paquete zip:
atk install --file-path "C:/Users/myuser/myPackage.zip" --scope PersonalUna instalación correcta devuelve un resultado que incluye un
TitleIdyAppIdpara su cuenta.Guarde estos identificadores para usarlos más adelante cuando los actualice o desinstale.
Obtenga más información en la interfaz de línea de comandos del Kit de herramientas de agentes de Microsoft 365.
Paso 8: Publicar en el inquilino
- Abrir el centro de administración de M365Administrar aplicaciones>Cargar aplicación personalizada.>
- Selecciona el botón de puntos suspensivos (...) >Agregar agente.
- Carga el
.zippaquete. - Open Cowork Sources &>>Skills Plugins. El complemento aparece en la sección Descubrir .
Paso 9: Publicar para el público
Para complementos destinados a la distribución pública, envía el complemento a Microsoft 365 App Store a través del Centro de partners. Obtenga más información en Publicar agentes para Microsoft 365 Copilot.
Probar un conector con un servidor MCP local
Los conectores requieren un HTTPS mcpServerUrl, por lo que para probar un servidor que se ejecuta en su máquina, debe exponerlo a través de una dirección URL HTTPS pública.
Los túneles de desarrollo proporcionan una retransmisión que termina TLS por usted.
devtunnel port create <tunnel> -p <port> --protocol http
Importante
Use --protocol http, no https. La --protocol marca describe el servicio local al que reenvía el túnel, no la dirección URL del túnel público. La mayoría de los servidores MCP locales hablan HTTP simple, por lo que si establece --protocol https mientras su servidor sirve HTTP, cada solicitud a través del túnel devuelve un 502 error. La retransmisión finaliza TLS y sirve la dirección URL pública a través de HTTPS, independientemente de esta marca.
Solución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
Cada solicitud tunelizada se devuelve 502 y el servidor local habla HTTP |
devtunnel port create se ha ejecutado con --protocol https |
Volver a crear el puerto con --protocol http |
Las solicitudes tunelizadas vuelven a macOS 502 aunque el servidor local se esté ejecutando |
El servidor está enlazado a 0.0.0.0 (solo IPv4), pero el túnel marca localhost, que se resuelve primero en ::1 (IPv6) |
Enlazar el servidor para :: que acepte conexiones IPv4 e IPv6 |
Error en la carga con Required properties are missing from object: mcpToolDescription |
Falta el conector mcpToolDescription |
Agregue mcpToolDescription con una file referencia y empaquete ese archivo en el archivo ZIP |
Error en la carga con Property '<field>' has not been defined and the schema does not allow additional properties |
El manifiesto incluye un campo que el esquema v1.28 no permite (por ejemplo, packageName) |
Elimine el campo; El esquema v1.28 utiliza additionalProperties: false |
Patrones de empaque
Elija el patrón que se adapte a su extensión:
Solo aptitudes (sin conector)
Recomendado para flujos de trabajo basados en indicaciones, análisis de documentos y ayuda para la escritura.
my-skills-pack.zip
├── manifest.json # agentSkills only, no agentConnectors
├── color.png
├── outline.png
└── skills/
├── skill-one/SKILL.md
└── skill-two/SKILL.md
Habilidades + conector remoto
Recomendado para análisis de datos, integraciones de API y sistemas empresariales.
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
Solo conector (sin aptitudes personalizadas)
Use esta opción para las fuentes de datos que ya pueden usar las aptitudes integradas de Cowork.
my-connector.zip
├── manifest.json # agentConnectors only, no agentSkills
├── color.png
├── outline.png
└── tools/ # Tool-description file(s) for mcpToolDescription
└── my-connector.json
Código de Claude importado o complemento de cursor
Usa esta opción para los complementos existentes de otras herramientas de IA destinados a Cowork.
atk import openplugin --path ./claude-plugin --output ./my-plugin-project \
--privacy-url https://contoso.com/privacy \
--terms-url https://contoso.com/terms
Procedimientos recomendados de creación de aptitudes
Siga estas instrucciones para crear habilidades que se activen de forma confiable y produzcan resultados consistentes.
Escribir descripciones efectivas
El description campo determina cuándo el agente activa tu habilidad. Sé específico:
# 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.
Escribir flujos de trabajo efectivos
- Sé específico en la descripción. Incluya frases desencadenantes: "Usar cuando el usuario pide..." Esta descripción es cómo el agente decide qué habilidad activar.
- La estructura como un flujo de trabajo. Numere los pasos. Cada paso debe asignarse a una acción concreta (leer un archivo, llamar a una herramienta, generar resultados).
- Definir el formato de salida. Mostrar la tabla, lista o estructura de documento exacta que los usuarios deben esperar. Esta definición mejora drásticamente la coherencia.
-
Haga referencia a las herramientas por su nombre. Si su habilidad depende de herramientas de conectores, asígneles un nombre explícito: "Use la
search_case_lawherramienta para..." -
Mantén el SKILL.md principal reducido. Mueva el
references/material de referencia detallado al subdirectorio. El cuerpo de habilidades debe ser el flujo de trabajo, no una enciclopedia.
Evitar errores comunes
-
No incruste secretos en
SKILL.mdarchivos. UsaragentConnectorscon autenticación para credenciales de API. - No duplique las aptitudes integradas. Compruebe la lista de aptitudes integradas antes de crear.
- No hagas que las habilidades sean demasiado amplias. "Hacer todo con documentos legales" es peor que las habilidades específicas para el "análisis de contratos", la "extracción de cláusulas" y la "investigación legal".
- No codifiques de forma rígida rutas de archivo ni comandos del sistema. Las aptitudes deben ser portátiles entre entornos.
-
No pongas todo en SKILL.md. Si su cuerpo supera las ~3000 palabras, mueva el contenido detallado a
references/.
Reglas de validación
Cuando envías tu paquete, la plataforma lo valida en múltiples niveles. Corrige estos errores antes del envío para evitar el rechazo.
Validación de nivel de manifiesto
| Código | Rule | Severity |
|---|---|---|
| ASKILL-M001 |
folder es obligatorio en cada agentSkills entrada |
Error |
| ASKILL-M002 |
agentSkills La matriz puede tener hasta 20 elementos |
Error |
| ASKILL-M003 |
folder La ruta de acceso puede tener hasta 256 caracteres |
Error |
Validación a nivel de paquete
| Código | Rule | Solución común | Severity |
|---|---|---|---|
| ASKILL-P001 | La carpeta a la que se hace referencia en el manifiesto existe en un archivo ZIP | Comprobar la estructura del código postal | Error |
| ASKILL-P002 | La carpeta contiene un SKILL.md archivo |
Agregar falta SKILL.md |
Error |
| ASKILL-P003 |
SKILL.md tiene un frontmatter YAML válido entre --- los delimitadores |
Corregir la sintaxis de YAML | Error |
| ASKILL-P004 | Frontmatter incluye name el campo |
Agregar name: al frontmatter |
Error |
| ASKILL-P005 | Frontmatter incluye description el campo |
Agregar description: al frontmatter |
Error |
| ASKILL-P006 |
name Coincide con el nombre de la carpeta (último segmento de ruta de acceso) |
Cambiar el nombre de la carpeta o corregir name: |
Error |
| ASKILL-P007 |
name es kebab-case |
Use my-skill not MySkill or my_skill |
Error |
| ASKILL-P008 | No hay valores duplicados folder en la matriz |
Quitar duplicados | Error |
Validación del conector
| Rule | Severity |
|---|---|
Cada conector requiere un id y displayName |
Error |
Todos los valores del conector id deben ser únicos en el manifiesto |
Error |
Exactamente uno de plugin o remoteMcpServer |
Error |
mcpServerUrl debe ser una dirección URL HTTPS válida |
Error |
mcpToolDescription obligatorio en cada , remoteMcpServercon un file that exists in the ZIP |
Error |
authorization.referenceId Requerido a menos que el tipo sea None |
Error |
authorization.referenceId no debe estar presente cuando el tipo es None |
Error |
Validación de archivos complementarios
El portal valida los archivos complementarios (materiales de referencia, scripts y otros archivos SKILL.md) en el momento de la carga y la sincronización:
| Rule | Severity |
|---|---|
Máximo 20 archivos de complemento por habilidad (excluyendo SKILL.md) |
Error |
| Cada archivo complementario debe ser de 5 MB o menos | Error |
| El total de archivos complementarios debe ser de 10 MB o menos por habilidad | Error |
| Las rutas de acceso de archivo deben ser relativas (sin rutas de acceso absolutas) | Error |
Sin segmentos transversales de ruta (..) |
Error |
| No hay barras diagonales inversas ni bytes nulos en los nombres de archivo | Error |
No hay archivos ocultos (nombres que comiencen por .) |
Error |
No hay nombres reservados de Windows (CON, PRN, AUX, NULCOM1, -COM9, -LPT9) LPT1 |
Error |
Los nombres de archivo solo deben usar caracteres seguros (alfanuméricos, guiones, guiones bajos, puntos, espacios, !etc.) |
Error |
Compatibilidad entre plataformas
Las habilidades utilizan el estándar abierto de habilidades de agente. Los mismos SKILL.md archivos funcionan en varias herramientas de IA:
| Plataforma | Compatibilidad |
|---|---|
| Código Claude | Formato completo del mismo SKILL.md |
| Proyectos de Claude.ai | Las aptitudes completas se pueden cargar como archivos de proyecto |
| VS Code, GitHub Copilot | Full-Agent Aptitudes admitidas en modo agente |
| CLI de Gemini | Full-Agent Aptitudes admitidas |
| JetBrains Junie | Full-Agent Aptitudes admitidas |
| OpenAI Codex | Full-Agent Aptitudes admitidas |
| Cursor | Full-Agent Aptitudes admitidas |
Si está desarrollando habilidades tanto para Claude Code como para Cowork, comience con la estructura del complemento Claude Code: es el superconjunto:
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)
A continuación, impórtelo en un proyecto de M365 cuando esté listo para publicarlo en Microsoft 365 App Store:
atk import openplugin --path ./my-plugin --output ./my-plugin-project \
--privacy-url https://contoso.com/privacy \
--terms-url https://contoso.com/terms
Administración de anotaciones y confirmaciones MCP
Copilot Cowork lee el objeto MCP annotations estándar en las herramientas desde las que regresa el servidor y tools/listlo usa para decidir si una llamada a la herramienta necesita confirmación del usuario y qué etiqueta mostrar en el mensaje.
Campos disponibles
| Campo | Tipo | Efecto |
|---|---|---|
readOnlyHint |
bool |
false: se requiere confirmación antes de que se ejecute la herramienta. |
destructiveHint |
bool |
true: se requiere confirmación antes de que se ejecute la herramienta. |
title |
string | Etiqueta legible por humanos que se muestra en el cuadro de diálogo de confirmación. Vuelve al nombre de la herramienta cuando está ausente. |
Reglas de confirmación
Se requiere confirmación si readOnlyHint == false o destructiveHint == true.
Todas las herramientas deben tener especificadas las anotaciones de seguridad. Las herramientas sin anotaciones se tratan como destructivas y requieren confirmación. Obtenga más información en la referencia de esquema de MCP.
Ejemplos de MCP
Una acción destructiva con una etiqueta amigable:
{
"name": "send_email",
"description": "Send an email message.",
"annotations": {
"title": "Send Email",
"destructiveHint": true
},
"inputSchema": { ... }
}
Una lectura segura que se ejecuta automáticamente:
{
"name": "search_docs",
"annotations": {
"title": "Search Documents",
"readOnlyHint": true
}
}
¿Qué está disponible ahora?
- Las herramientas de Microsoft (Graph, Dataverse y otras) están controladas por la directiva integrada de Cowork, independientemente de las anotaciones.
- En los servidores MCP que no son de Microsoft, la confirmación basada en anotaciones se está implementando progresivamente. La configuración de las sugerencias ahora es compatible con versiones posteriores y las solicitudes de confirmación aparecen a medida que se expande el lanzamiento sin necesidad de cambios por parte del desarrollador.
Aceptar archivos del área de trabajo de Cowork
Una herramienta de conector puede tomar un archivo de la sesión de Cowork del usuario como entrada: un documento que el usuario adjuntó, un archivo adjunto de correo electrónico que Cowork guardó o un archivo producido por un paso anterior. Declare el parámetro con la palabra clave contentEncoding: base64 estándar JSON Schema y Cowork se encargará del resto. No se requiere ninguna extensión de esquema específica de Microsoft y la superficie de API del servidor no cambia.
Cowork resuelve el archivo del área de trabajo y lo codifica en base64 antes de llamar al servidor, por lo que los bytes de archivo nunca entran en el contexto del agente. El agente solo ve y emite rutas de acceso de archivos del área de trabajo.
Nota:
No indique al agente que codifique en base64 un archivo y pegue el blob en una llamada a una herramienta. Eso carga todo el archivo en el contexto del modelo y depende del modelo que reproduce el blob exactamente. Parece funcionar en pequeños archivos de prueba y falla en los reales.
Declare a file parameter
Una propiedad de cadena con contentEncoding: base64 se reconoce como una entrada de archivo:
{
"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"]
}
}
También se reconoce una matriz de estas cadenas, para las herramientas que aceptan varios archivos:
"attachments": {
"type": "array",
"items": { "type": "string", "contentEncoding": "base64" },
"description": "Receipt images to attach to the expense line."
}
Lo que ve el agente
Para los parámetros de archivo declarados en el nivel superior de inputSchema.properties, Cowork los reemplaza en el esquema orientado al modelo con una sola direct_attachment_file_paths matriz, el mismo parámetro que usan las herramientas integradas de Cowork, por lo que el agente ya sabe cómo rellenarlo. El esquema anterior se presenta al agente como:
{
"type": "object",
"properties": {
"direct_attachment_file_paths": {
"type": "array",
"items": { "type": "string" },
"description": "Workspace file paths to attach."
},
"jurisdiction": { "type": "string" }
}
}
Si la herramienta declara más de un parámetro de archivo de nivel superior, todos se contraen en esa única direct_attachment_file_paths matriz. A la hora de la llamada, Cowork ventila los archivos resueltos en los nombres de parámetros originales en orden de declaración.
Parámetros de archivo anidado
También se admite un parámetro de archivo anidado dentro de un objeto o una matriz de objetos, y se controla de forma diferente: en lugar de contraerse, se reescribe en su lugar en una cadena de ruta de acceso en su propia ubicación. Esto conserva la asociación entre un archivo y sus campos relacionados, por ejemplo, un recibo por línea de gastos:
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"amount": { "type": "number" },
"receipt": { "type": "string", "contentEncoding": "base64" }
}
}
}
El agente rellena con una ruta de acceso al line_items[].receipt área de trabajo, y Cowork cambia cada ruta por el contenido base64 en su lugar antes de reenviar la llamada.
El anidamiento se atraviesa a una profundidad de cuatro niveles por debajo de la parte superior de inputSchema.
$ref No se siguen los punteros: defina los parámetros de archivo en línea en lugar de detrás de un $refarchivo
Lo que recibe su servidor
Su servidor recibe un ordinario tools/call con sus nombres de parámetros originales rellenados con contenido codificado en base64:
{
"method": "tools/call",
"params": {
"name": "analyze_contract",
"arguments": {
"document": "JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5...",
"jurisdiction": "US"
}
}
}
El servidor no necesita saber que el agente usó una interfaz basada en ruta de acceso, y las herramientas que no declaran contentEncoding: base64 parámetros no se ven afectadas.
Límites
| Límite | Valor |
|---|---|
| Files por llamada de herramienta | 8 |
| Tamaño por archivo | 150 MiB |
| Tamaño total por llamada de herramienta | 150 MiB |
| Parámetros del archivo de matriz por herramienta | 1 (combínelo con cualquier número de parámetros de archivo escalar) |
| Profundidad máxima de anidamiento | 4 niveles por debajo de la parte superior de inputSchema |
Una llamada que excede el número de archivos o un límite de tamaño falla con un error de herramienta y nunca llega a su servidor. Ajuste el tamaño de la API y sus tiempos de espera teniendo en cuenta el límite máximo de 150 MiB: base64 infla la carga en aproximadamente un tercio sobre el tamaño del archivo sin procesar y el contenido codificado se envía en el cuerpo de la solicitud JSON-RPC.
Recomendaciones
- Describa el parámetro para un lector humano. El agente utiliza la descripción para decidir qué archivo pertenece a qué parámetro. Por ejemplo,
"The signed contract PDF to analyze"funciona mejor que"file". - Indique los formatos aceptados en la descripción del parámetro. Cowork pasa a través de lo que el usuario adjunta. Valide el tipo de contenido de su lado y devuelva un error de herramienta Borrar si no se puede usar.
- Establecer anotaciones. Una herramienta que recibe un archivo y actúa sobre él normalmente no es de solo lectura, por lo que solicita confirmación. Consulte Gestión de anotaciones y confirmaciones de MCP.
- Mantener los parámetros de archivo en línea. Un parámetro detrás de un
$ref, o anidado por una profundidad superior a cuatro niveles, no se vuelve a escribir. El servidor recibirá una cadena de ruta de acceso donde espera contenido. - Declare como máximo un parámetro de archivo de matriz por herramienta. Con dos o más, Cowork no puede determinar qué archivo pertenece a qué matriz y se produce un error de herramienta en la llamada. Use una matriz, o varios parámetros escalares, o una combinación de escalares y una sola matriz.
- Espere un recuento exacto de herramientas solo escalares. Si la herramienta declara solo parámetros de archivo escalares, el número de archivos que pasa el agente debe coincidir con el número declarado. Marque parámetros de archivo opcionales claramente en sus descripciones para que el agente no proporcione un suministro insuficiente o excesivo.
Nota:
Este mecanismo es anterior al propio trabajo de entrada de archivos del Protocolo de contexto del modelo, que está siendo estandarizado por el Grupo de trabajo de cargas de archivos de MCP. Cowork podría agregar soporte para la forma estandarizada de entradas de archivos declarativos una vez que aterrice. El contentEncoding: base64 contrato descrito aquí continúa funcionando.
Identificar el tráfico de Cowork a su servidor
Si su servidor MCP cancela la visibilidad de la herramienta por cliente, o desea atribuir el tráfico que recibe, puede reconocer las solicitudes que provienen de Cowork. Cowork presenta una identidad de software estable en dos canales:
| Canal | Dónde aparece | Valor |
|---|---|---|
User-Agent encabezado de solicitud |
Cada solicitud saliente que Cowork envía a tu servidor | copilot-cowork/1.0 |
clientInfoen el protocolo de enlace de MCP initialize |
Solo la initialize solicitud |
{ "name": "copilot-cowork", "version": "<version>" } |
Coincidir con el copilot-cowork prefijo
Haga coincidir el prefijo (sin distinguir mayúsculas de minúsculas) en cualquiera de los copilot-cowork canales. No coincidan con la cadena exacta copilot-cowork/1.0 o con un clientInfo.versionarchivo . La versión realiza un seguimiento del contrato cliente-identidad y se espera que cambie; Una coincidencia de prefijo mantiene su puerta funcionando a través de los baches de versión.
# Correct: case-insensitive prefix match
copilot-cowork
# Incorrect: exact match breaks when the version changes
copilot-cowork/1.0
Elija el canal adecuado para su puerta
Los dos canales tienen ámbitos diferentes, por lo que elija el que coincida con la forma en que su servidor aplica su puerta:
- El
User-Agentencabezado está presente en todas las solicitudes, incluidastools/listytools/call. Si se atribuye la puerta o el atributo por solicitud, escriba en este encabezado. -
clientInfosolo se envía en el protocolo deinitializeenlace. Si establece la puerta por sesión en el momento de la conexión, puede leerlo allí, pero no se repetirá en solicitudes posteriores.
Qué incluye y qué no incluye la identidad
La identidad solo nombra el software . Es lo mismo para todos los usuarios y conexiones de Cowork, y nunca conlleva la identidad del usuario. La identidad del usuario permanece en el flujo de autorización que define la configuración de autenticación del conector.
| La identidad incluye | La identidad no incluye |
|---|---|
Un nombre de software estable (copilot-cowork) y una versión de contrato |
Cualquier identificador de inquilino, usuario, sesión o conversación |
| El mismo valor en cada solicitud y en cada conexión | Un calificador por conector |
Dado que no hay ningún calificador por conector, actualmente no puede usar esta identidad para saber qué conector realizó una llamada o para separar un complemento de Microsoft publicado de un servidor de instalación de prueba que apunta a la misma dirección URL. Si necesita esa distinción, aplicársela mediante la configuración de autorización del conector en lugar de la identidad del cliente.
Preguntas comunes
¿Puedo usar las habilidades del paquete M365 en Claude Code?
Sí. Las carpetas de habilidades contienen habilidades de agente estándar. Cópielos en .claude/skills/ cualquier proyecto de Claude Code, o ejecútelos atk export openplugin para convertir todo el proyecto en un complemento de Claude Code.
¿Necesito un conector remoto?
No. Los paquetes de solo aptitudes funcionan bien para flujos de trabajo basados en indicaciones. Los conectores solo son necesarios cuando su habilidad requiere datos activos de un sistema externo.
¿En qué se diferencian las aptitudes de complemento de las aptitudes integradas?
Las aptitudes de complemento aparecen con el origen "package" en la API. No pueden invalidar las aptitudes integradas con el mismo nombre. Los paquetes implementados por el administrador muestran isAdminDeployed: true.
¿Pueden los administradores de TI controlar qué complementos están disponibles?
Sí. Se aplican los controles de administración de M365 Standard: listas de permitidos o bloqueados a nivel de inquilino, implementaciones administradas por el administrador y directivas de cumplimiento.
¿Qué sucede si se revoca un complemento?
En el siguiente ciclo de sincronización, las aptitudes y conectores de ese paquete se quitan de la sesión del usuario. Las conversaciones activas no se interrumpen, pero las nuevas sesiones no tienen las funcionalidades del paquete.
¿Cuál es el número máximo de habilidades por paquete?
Veinte (20) habilidades (según ASKILL-M002). Para los conectores, el límite es de 10 por paquete.
¿Pueden las habilidades hacer referencia a las herramientas del conector del mismo paquete?
Sí, y deberían hacerlo. Asigne un nombre explícitamente a las herramientas en SKILL.md el flujo de trabajo (por ejemplo, "Usar la search_case_law herramienta para..."). El agente los conecta en tiempo de ejecución.
¿Pueden las herramientas de mi plugin aceptar archivos del espacio de trabajo de Cowork?
Sí. Declare el parámetro de herramienta con contentEncoding: base64, y Cowork resolverá el archivo de área de trabajo del usuario a contenido base64 antes de llamar a su servidor. El modelo pasa rutas de acceso de archivo, no contenido de archivo, por lo que los archivos grandes no consumen el contexto del modelo. Para obtener detalles y límites de declaración, obtenga más información en Aceptar archivos desde el área de trabajo de Cowork.
¿Cómo generar un GUID determinista para mi paquete?
atk import openplugin usa UUID v5 (basado en SHA-1) del nombre del complemento. La ejecución de la importación dos veces produce el mismo GUID. Para establecer el tuyo, pasa --app-id. Para el empaquetado manual, use cualquier generador GUID. Asegúrese de mantenerlo estable entre versiones.