Criar plug-ins para o Copilot Cowork

Microsoft Copilot Cowork dá suporte à extensibilidade por meio de pacotes de aplicativos do M365, o mesmo mecanismo de distribuição usado por aplicativos do Teams, agentes do Copilot e suplementos do Office. Você pode estender o Cowork com:

  • Habilidades: fluxos de trabalho baseados em prompts que ensinam ao Cowork novos conhecimentos de domínio, como análise financeira, pesquisa jurídica ou fluxos de trabalho de RH.
  • Conectores: servidores remotos que fornecem aos Cowork acesso a fontes de dados externas e APIs.

Ambos são empacotados juntos em um pacote de aplicativo padrão do Microsoft 365 e distribuídos pela Microsoft 365 App Store.

Importante

Atualmente, não há suporte para IBs (Barreiras de Informações do Microsoft Purview) para gerenciamento e compartilhamento de plug-ins ou habilidades. Nos locatários em que o IB está habilitado, os uploads de arquivo de conhecimento inserido são bloqueados no nível do locatário. Isso impede que plug-ins e habilidades afetados sejam carregados ou publicados.

O que você criará

Um plugin do Cowork é um .zip pacote que contém:

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

As habilidades usam o padrão aberto Agent Skills - o mesmo formato compatível com Claude Code, Visual Studio Code Copilot, Gemini CLI, Cursor, JetBrains Janie e 30+ outras ferramentas de IA.

Escolha seu ponto de partida

Ponto de partida Caminho Tempo até o primeiro pacote
Eu tenho um plug-in de cursor ou código Claude existente Importar ~5 minutos
Estou começando do zero Criar do zero ~ 30 minutos

Importar um plug-in existente

Se você já tiver um plug-in de Código Claude ou Cursor com habilidades e servidores MCP, a CLI do Kit de Ferramentas de Agentes do Microsoft 365 (atk) importará diretamente. A CLI é executada no Windows, macOS e Linux.

  1. Instale a CLI (requer a versão 1.1.12 ou posterior):

    npm install -g @microsoft/m365agentstoolkit-cli
    
  2. Verifique a versão:

    atk --version
    
  3. Importe seu plug-in:

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

O comando lê o .claude-plugin/plugin.json diretório (ou .cursor-plugin/plugin.json), .mcp.jsone skills/ do seu plug-in e, em seguida, cria um projeto do Agents Toolkit contendo appPackage/manifest.json, suas habilidades e ícones gerados.

Você deve incluir --privacy-url e --terms-url porque os manifestos de plug-in não têm campos equivalentes, e o manifesto do Microsoft 365 requer ambos.

Observação

atk import openplugin Localiza um manifesto de plug-in em um diretório com prefixo de ponto—.claude-plugin/plugin.json, .cursor-plugin/plugin.jsonou .plugin/plugin.json—ao lado de um .mcp.jsonarquivo . A especificação Agent Plugins 1.0.0 coloca o manifesto em um nível plugin.json superior e a configuração MCP em mcp.json. Para importar um plug-in que segue o layout 1.0.0, mova seu manifesto e .plugin/plugin.json renomeie mcp.json para .mcp.json.

Empacotar o resultado em um arquivo :.zip

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

Observação

atk import openplugin gera um manifesto devPreview . Os exemplos de manifesto em outras partes deste artigo têm como destino o esquema v1.28. Se você estiver publicando por meio de um canal que exija a v1.28, atualize manifestVersion e $schema no gerado appPackage/manifest.jsone adicione a mcpToolDescription propriedade a cada conector, conforme descrito em Descreva as ferramentas do conector.

O que é importado

Artefato de plug-in Equivalente do M365 Observações
.claude-plugin/plugin.json manifest.json Campos Nome, descrição e desenvolvedor mapeados; GUID gerado automaticamente (UUID determinístico v5)
skills/*/SKILL.md agentSkills[] Entradas + skills/ Pasta Copiado literalmente - formato idêntico
.mcp.json servidores agentConnectors[] entradas URL e tipo de autenticação detectados automaticamente
color.png / outline.png Ícones no pacote Usado se presente; Espaços reservados gerados se ausentes

Importante

Para cada conector importado do .mcp.json, o gerado authorization.referenceId é um espaço reservado derivado do plug-in e do nome do servidor. Substitua-a pela ID de registro do cliente OAuth real antes de publicar. Consulte Tipos de autenticação com suporte.

O que não é convertido

Os seguintes recursos do plug-in de Claude ainda não têm suporte no manifesto do Microsoft 365:

Recurso do plug-in Claude Status
commands/ (comandos de barra) Ainda não tem suporte
agents/ (subagentes) Ainda não tem suporte
hooks/ (manipuladores de eventos) Ainda não tem suporte
settings.json Não aplicável
bin/ (executáveis) Não aplicável

Opções de importação

Opção Descrição
--path, -p Obrigatório. Diretório de plug-in que contém .claude-plugin/plugin.json, .cursor-plugin/plugin.json, ou .plugin/plugin.json
--output, -o Pasta do projeto de destino (padrão: ./<plugin-name>)
--privacy-url developer.privacyUrl para o manifesto gerado
--terms-url developer.termsOfUseUrl para o manifesto gerado
--website-url developer.websiteUrl. Volta para homepage, depois author.url
--app-id Substitua o UUID determinístico v5 gerado para o manifesto id
--default-auth-type Auto (padrão), None, OAuthPluginVault, ou ApiKeyPluginVault

Detecção automática do tipo de autenticação:

Origem Tipo de autenticação padrão Reason
URLs HTTPS externas OAuthPluginVault A maioria das APIs remotas precisa de autenticação
localhost e URLs não HTTPS None Servidores de desenvolvimento local

Se a detecção automática não corresponder à sua configuração, use --default-auth-type para substituí-la.

Exportar de volta para um diretório de plug-in

Para mover um projeto do Agents Toolkit de volta para um diretório de plug-ins - por exemplo, para manter um plug-in do Claude Code e um pacote do Cowork em sincronia, use atk export openplugin:

atk export openplugin --path ./my-plugin-project \
  --output ./my-claude-plugin --manifest-kind claude-plugin
Opção Descrição
--path, -p Obrigatório. pasta do projeto Agents Toolkit que contém appPackage/manifest.json
--output, -o Diretório de plug-in de destino (padrão: ./<plugin-name>-openplugin)
--manifest-kind open-plugin (default, writes .plugin/plugin.json), claude-plugin, ou cursor-plugin

A exportação grava um x-microsoft-365-agents-toolkit bloco no arquivo .plugin.json Esse bloco carrega o manifesto id, URLs de desenvolvedor e configurações de conector, portanto, uma viagem de ida e volta posterior atk import openplugin sem precisar --privacy-url ou --terms-url novamente.

Observação

O x-microsoft-365-agents-toolkit bloco é específico do Agents Toolkit, e o tipo padrão open-plugin grava o manifesto no .plugin/plugin.jsonformato . O Agent Plugins 1.0.0 usa um nível plugin.json superior e transporta dados específicos do cliente sob uma extensions chave com um namespace de domínio reverso, portanto, outros clientes ignoram esse bloco em vez de agir sobre ele. Quando seu destino for Código Claude ou Cursor, use --manifest-kind claude-plugin ou cursor-plugin.

Herdado: script de conversão do PowerShell

Antes da atk importação de plug-in com suporte, a conversão usava um script do PowerShell somente Windows, que permanece disponível como o script de conversão:

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

Use atk import openplugin em vez disso. É multiplataforma, oferece suporte a fontes Cursor e Claude Code e pode exportar de volta para um diretório de plug-ins.

Criar um plug-in do zero

Siga estas etapas para criar um pacote de plug-ins do zero, começando com sua primeira habilidade e criando um pacote completo e publicável.

Etapa 1: Criar sua primeira habilidade

Uma habilidade é uma pasta que contém um SKILL.md arquivo. Crie a seguinte estrutura de pastas:

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

Escreva SKILL.md com frontmatter YAML e um corpo 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 obrigatórios:

Campo Restrições Descrição
name 1-64 caracteres, caixa de kebab Identificador de habilidade - deve corresponder exatamente ao nome da pasta
description 1-1024 caracteres Quando usar essa habilidade – inclua frases de gatilho

Importante

  • O nome da pasta deve corresponder ao name campo no frontmatter. Essa incompatibilidade é a causa mais comum de falhas de habilidade.
  • Os campos de listagem description de plug-ins não devem incluir chamadas para ação direcionando os usuários a marketplaces externos para comprar assinaturas.
Caminho da pasta name campo Válido? Por quê?
skills/contract-analysis/SKILL.md contract-analysis Sim Correspondência de pasta e nome
skills/contract-analysis/SKILL.md ContractAnalysis Não O nome usa PascalCase em vez da pasta correspondente
skills/my-skill/SKILL.md contract-analysis Não A pasta é my-skill , mas o nome é contract-analysis

Regras de nomenclatura (kebab-case): Use apenas caracteres alfanuméricos minúsculos e hifens. Não use hifens consecutivos e não use hifens à esquerda ou à direita.

Exemplo Válido? Problema
bond-relative-value Sim Minúsculas com hifens
fx-carry-trade Sim Minúsculas com hifens
email Sim Palavra única, sem necessidade de hífens
Bond_Relative_Value Não Sublinhados e letras maiúsculas
--my-skill-- Não Hífens à esquerda e à direita
my--skill Não Hifens consecutivos

Etapa 2: Adicionar materiais de referência (opcional)

Para habilidades complexas, mantenha o lean principal SKILL.md e mova o conteúdo detalhado para subdiretórios. Esses arquivos adicionais são arquivos complementares. A habilidade os carrega quando necessário.

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

Limites de arquivos complementares

Cada habilidade pode incluir até 20 arquivos complementares (qualquer arquivo diferente de SKILL.md). Os seguintes limites se aplicam por habilidade:

Limite Valor
Máximo de arquivos complementares 20
Tamanho máximo por arquivo complementar 5 MB
Tamanho total máximo do complemento O tamanho máximo de uma pasta de trabalho que pode ser aberta no Serviços do Excel é 10 megabytes.
Tempo limite de download (todos os complementos) 15 segundos

Regras de arquivos complementares

Os caminhos de arquivo complementares devem seguir estas regras:

  • Use apenas caminhos relativos (sem caminhos absolutos)
  • Nenhuma travessia de caminho (.. segmentos)
  • Nenhuma barra invertida ou bytes nulos em nomes de arquivo
  • Não há arquivos ocultos (nomes iniciados com .)
  • Nenhum nome reservado do Windows (CON, PRN, COM1AUXNUL, , –COM9, –) LPT1LPT9
  • O arquivo SKILL.md em si não conta como um arquivo complementar
  • Os nomes de arquivo devem usar caracteres seguros: alfanuméricos, hifens, sublinhados, pontos, espaços e !

Para manter a janela de contexto eficiente, o sistema carrega habilidades em três camadas:

Camada Quando carregado Tamanho de destino
Frontmatter (name + description) Sempre - na inicialização ~100 tokens
SKILL.md corpo Quando a habilidade é disparada Menos de 5.000 tokens (1.500 a 2.000 palavras)
Referências (references/) Sob demanda pelo agente Ilimitado
Scripts (scripts/) Executado, não carregado no contexto N/D

Faça referência aos subdiretórios explicitamente para SKILL.md que o agente saiba que eles existem:

## 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

Etapa 3: Adicionar um conector (opcional)

Se sua extensão precisar de acesso a dados externos, adicione um servidor MCP remoto. Essa etapa é opcional. Os pacotes somente de habilidades funcionam bem para fluxos de trabalho baseados em prompt.

Dica

Se o seu servidor bloqueia a visibilidade da ferramenta por cliente ou atributos de tráfego de entrada, consulte Identificar o tráfego do Cowork para o seu servidor para a identidade do cliente que o Cowork apresenta.

Observação

Plugins personalizados não são suportados no Cowork em dispositivos móveis.

Requisitos do conector

Requisito Detalhes
Transport HTTP Transmitido (HTTPS necessário, TLS 1.2+)
Protocolo Formato de mensagem JSON-RPC 2.0
Descoberta de ferramentas Suporte tools/list para descoberta dinâmica (recomendado)
Execução da ferramenta Suporte tools/call para invocação
Disponibilidade SLA de 99,9% de tempo de atividade recomendado para aplicativos publicados na loja
Tempo de resposta Menos de 30 segundos por chamada de ferramenta

Diretrizes de design de ferramentas

  • Uma ferramenta por ação para APIs pequenas (menos de 15 operações): search_case_law, get_ruling, cite_precedent
  • Pesquisar + executar para APIs grandes (50+ operações): search_actions + execute_action
  • Nomes descritivos: get_bond_price não getData
  • Esquemas de entrada avançados: inclua uma descrição para cada parâmetro - isso é o que o agente lê
  • Saída estruturada: JSON de retorno que o agente pode formatar para o usuário
  • Entradas de arquivo: Para aceitar um arquivo do espaço de trabalho do usuário, declare o parâmetro com contentEncoding: base64. Saiba mais em Aceitar arquivos do espaço de trabalho do Cowork.

Descreva as ferramentas do conector (mcpToolDescription)

Cada remoteMcpServer conector deve incluir um mcpToolDescription objeto. Sua propriedade aninhada aponta para um arquivo JSON tool-description que você empacota dentro de seu .zip e referencia file por um caminho relativo da raiz do pacote. Se você omitir mcpToolDescription, o serviço de pacote rejeitará o upload com um erro HTTP 400:

As propriedades necessárias estão ausentes do objeto: mcpToolDescription.

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

O arquivo referenciado (por exemplo, tools/contoso-legal-tools.json) descreve as ferramentas que o conector expõe e devem estar presentes no pacote ZIP. Inclua-o junto com sua manifest.json pasta and skills/ ao empacotar o plug-in.

Tipos de autenticação com suporte

Tipo de autenticação Quando usar Experiência do usuário
None APIs públicas ou anônimas, serviços internos Transparente - sem prompt de autenticação
OAuthPluginVault APIs do OAuth 2.0 (recomendadas para produção) O usuário conclui o consentimento do OAuth uma vez
ApiKeyPluginVault Serviços baseados em chave de API O usuário fornece a chave uma vez

Observação

  • O suporte para autenticação de chave de API ainda não está disponível no Cowork.
  • Se o servidor MCP exigir uma chave de API, use OAuthPluginVault ou Registro dinâmico de clientes ou exponha um ponto de extremidade que aceite None.

Para OAuthPluginVault e ApiKeyPluginVault, os referenceId pontos para as credenciais armazenadas no Microsoft Enterprise Token Store - os segredos nunca aparecem nos arquivos de manifesto ou de habilidade. O referenceId valor é a ID de registro do cliente OAuth que você cria ao registrar um cliente OAuth com o Agents Toolkit.

Importante

Ao registrar seu cliente OAuth, defina o uso por organização como Qualquer organização do Microsoft 365 para garantir que seu plug-in funcione entre locatários.

Autenticação MCP

Para usar OAuth ou ApiKey para autenticação, consulte Configurar a autenticação para plug-ins MCP e API em agentes no Microsoft 365 Copilot para obter detalhes de instalação e configuração.

Registro dinâmico de clientes

Se o servidor MCP der suporte a Registro dinâmico de clientes (DCR), você poderá omitir uma authentication configuração da definição do conector e Cowork criará automaticamente um cliente OAuth em nome do plug-in.

Você pode omitir o authorization objeto, mas ainda precisa incluir mcpToolDescription. Configure a URL do servidor MCP e a descrição da ferramenta, e o Cowork cuida do cliente OAuth:

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

Etapa 4: criar o manifesto

Criar manifest.json na raiz do pacote:

{
  "$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 adicionar um conector, inclua 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"
          }
        }
      }
    }
  ]
}

Na configuração do conector, referenceId deve ser a ID de registro do OAuth e mcpToolDescription.file deve apontar para um arquivo JSON de descrição da ferramenta incluído no pacote ZIP.

Importante

O esquema de manifesto v1.28 é estrito: ele é definido additionalProperties: false na raiz, portanto, qualquer campo que não esteja definido no esquema é rejeitado. Campos válidos em manifestos padrão do aplicativo do Teams, como packageName—, fazem com que o upload falhe com um erro como Property 'packageName' has not been defined and the schema does not allow additional properties. Incluir somente os campos mostrados aqui.

Etapa 5: adicionar ícones

Crie dois ícones PNG:

Ícone Tamanho Objetivo
color.png 192×192 px Ícone de aplicativo colorido mostrado na loja e na lista de aplicativos
outline.png 32×32 px Ícone de contorno de cor única para modos de exibição compactos

Se você ainda não tiver ícones, atk import openplugin gera espaços reservados de cor sólida. Substitua-os antes do envio à loja.

Etapa 6: Pacote

Crie um arquivo ZIP com todo o conteúdo no nível raiz:

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

Se o pacote incluir uma agentConnectors entrada, inclua o arquivo JSON tool-description referenciado por mcpToolDescription.file. Os pacotes somente de habilidades não precisam de uma tools/ pasta.

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/

Usando o Kit de Ferramentas de Agentes do Microsoft 365

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

Etapa 7: teste

Para testar seu aplicativo, carregue seu pacote de aplicativos no Teams conforme descrito em Carregue seu aplicativo no Teams.

Para testes pessoais, faça o sideload do aplicativo usando a interface de linha de comando do Microsoft 365 Agents Toolkit:

  1. Instalar @microsoft/m365agentstoolkit-cli a partir de npm:

    npm install -g @microsoft/m365agentstoolkit-cli
    
  2. Verifique a instalação executando:

    atk --version
    
  3. Autentique-se com sua conta corporativa do Microsoft 365:

    atk auth login
    
  4. Entre em sua conta corporativa e instale o pacote do agente. Substitua o caminho do arquivo pelo local do pacote ZIP:

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

    Uma instalação bem-sucedida retorna uma saída que inclui um TitleId e AppId para sua conta.

  5. Salve essas IDs para uso posterior ao atualizar ou desinstalar.

Saiba mais na interface de linha de comando do Kit de Ferramentas de Agentes do Microsoft 365.

Etapa 8: Publicar em seu locatário

  1. Abra o centro >de administração do M365Gerenciar aplicativosCarregar aplicativo> personalizado.
  2. Selecione o botão de reticências (...) >Adicionar agente.
  3. Carregue seu .zip pacote.
  4. Abra Cowork>Fontes & Plug-ins de habilidades>. Seu plug-in aparece na seção Descobrir .

Etapa 9: Publicar para o público

Para plug-ins destinados à distribuição pública, envie seu plug-in para a Microsoft 365 App Store por meio do Partner Center. Saiba mais em Publicar agentes para o Microsoft 365 Copilot.

Testar um conector em um servidor MCP local

Os conectores exigem um HTTPS mcpServerUrl, portanto, para testar um servidor em execução em seu computador, você precisa expô-lo por meio de uma URL HTTPS pública. Os túneis de desenvolvimento fornecem uma retransmissão que encerra o TLS para você.

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

Importante

Use --protocol http, não https. O --protocol sinalizador descreve o serviço local para o qual o túnel encaminha, não a URL do túnel público. A maioria dos servidores MCP locais fala HTTP simples, portanto, se você definir --protocol https enquanto o servidor serve HTTP, cada solicitação através do túnel retornará um 502 erro. A retransmissão encerra o TLS e serve a URL pública sobre HTTPS, independentemente desse sinalizador.

Solução de problemas

Sintoma Motivo Correção
Cada solicitação em túnel retorna 502 e o servidor local fala HTTP devtunnel port create foi executado com --protocol https Recrie a porta com --protocol http
As solicitações encapsuladas retornam 502 no macOS mesmo que o servidor local esteja em execução O servidor está associado a 0.0.0.0 (somente IPv4), mas o túnel disca localhost, que resolve primeiro como ::1 (IPv6) Associe o servidor para :: que aceite conexões IPv4 e IPv6
O upload falha com Required properties are missing from object: mcpToolDescription O conector está ausente mcpToolDescription Adicione mcpToolDescription com uma file referência e empacote esse arquivo no ZIP
O upload falha com Property '<field>' has not been defined and the schema does not allow additional properties O manifesto inclui um campo que o esquema v1.28 não permite (por exemplo, packageName) Remova o campo; O esquema v1.28 usa additionalProperties: false

Padrões de embalagem

Escolha o padrão que se ajusta à sua extensão:

Somente habilidades (sem conector)

Ideal para fluxos de trabalho baseados em prompts, análise de documentos e assistência de redação.

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

Ideal para análise de dados, integrações de API e sistemas empresariais.

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

Somente conector (sem habilidades personalizadas)

Use esta opção para fontes de dados que as habilidades internas do Cowork já podem usar.

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 Claude importado ou plug-in de cursor

Use essa opção para plug-ins existentes de outras ferramentas de IA direcionadas ao Cowork.

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

Práticas recomendadas de criação de habilidades

Siga estas diretrizes para criar habilidades que são ativadas de forma confiável e produzem resultados consistentes.

Escreva descrições efetivas

O description campo determina quando o agente ativa sua habilidade. Seja 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.

Escreva fluxos de trabalho eficazes

  • Seja específico na descrição. Inclua frases de gatilho: "Use quando o usuário pedir..." Essa descrição é como o agente decide qual habilidade ativar.
  • Estrutura como um fluxo de trabalho. Numere as etapas. Cada etapa deve mapear para uma ação concreta (ler um arquivo, chamar uma ferramenta, gerar saída).
  • Defina o formato de saída. Mostre a estrutura exata de tabela, lista ou documento que os usuários devem esperar. Essa definição melhora drasticamente a consistência.
  • Ferramentas de referência por nome. Se sua habilidade depender de ferramentas de conector, nomeie-as explicitamente: "Use a search_case_law ferramenta para..."
  • Mantenha o SKILL.md principal enxuto. Mova o material de referência detalhada para o references/ subdiretório. O corpo da habilidade deve ser o fluxo de trabalho, não uma enciclopédia.

Evite erros comuns

  • Não insira segredos em SKILL.md arquivos. Use agentConnectors com autenticação para credenciais de API.
  • Não duplique habilidades internas. Verifique a lista de habilidades internas antes de criar.
  • Não torne as habilidades muito amplas. "Fazer tudo com documentos legais" é pior do que habilidades específicas para "análise de contratos", "extração de cláusulas" e "pesquisa jurídica".
  • Não codifique caminhos de arquivo ou comandos do sistema. As habilidades devem ser portáteis entre ambientes.
  • Não coloque tudo no SKILL.md. Se o corpo exceder ~3.000 palavras, mova o conteúdo detalhado para references/.

Regras de validação

Quando você envia seu pacote, a plataforma o valida em vários níveis. Corrija esses erros antes do envio para evitar a rejeição.

Validação no nível do manifesto

Código Regra Severity
ASKILL-M001 folder é obrigatório em cada agentSkills entrada Erro
ASKILL-M002 agentSkills A matriz pode ter até 20 itens Erro
ASKILL-M003 folder O caminho pode ter até 256 caracteres Erro

Validação no nível do pacote

Código Regra Correção comum Severity
ASKILL-P001 A pasta referenciada no manifesto existe no ZIP Verifique sua estrutura ZIP Erro
ASKILL-P002 A pasta contém um SKILL.md arquivo Adicionar ausentes SKILL.md Erro
ASKILL-P003 SKILL.md tem frontmatter YAML válido entre --- delimitadores Corrigir a sintaxe YAML Erro
ASKILL-P004 O frontmatter inclui name o campo Adicionar name: ao frontmatter Erro
ASKILL-P005 O frontmatter inclui description o campo Adicionar description: ao frontmatter Erro
ASKILL-P006 name Corresponde ao nome da pasta (último segmento do caminho) Renomear pasta ou corrigir name: Erro
ASKILL-P007 name é kebab-case Não use my-skill nem MySkillmy_skill Erro
ASKILL-P008 Nenhum valor duplicado folder na matriz Remover duplicatas Erro

Validação do conector

Regra Severity
Cada conector requer um id e displayName Erro
Todos os valores do conector id devem ser exclusivos dentro do manifesto Erro
Exatamente um de plugin ou remoteMcpServer Erro
mcpServerUrl deve ser uma URL HTTPS válida Erro
mcpToolDescription necessário em cada remoteMcpServer, com um file que existe no ZIP Erro
authorization.referenceId Obrigatório, a menos que o tipo seja None Erro
authorization.referenceId não deve estar presente quando type é None Erro

Validação de arquivo complementar

O portal valida arquivos complementares (materiais de referência, scripts e outros arquivos ao lado SKILL.md) no momento do upload e da sincronização:

Regra Severity
Máximo de 20 arquivos complementares por habilidade (excluindo SKILL.md) Erro
Cada arquivo complementar deve ter 5 MB ou menos Erro
O total de arquivos complementares deve ter 10 MB ou menos por habilidade Erro
Os caminhos de arquivo devem ser relativos (sem caminhos absolutos) Erro
Nenhum segmento de passagem de caminho (..) Erro
Nenhuma barra invertida ou bytes nulos em nomes de arquivo Erro
Não há arquivos ocultos (nomes iniciados com .) Erro
Nenhum nome reservado do Windows (CON, PRN, COM1AUXNUL, , –COM9, –) LPT1LPT9 Erro
Os nomes de arquivo devem usar apenas caracteres seguros (alfanuméricos, hífens, sublinhados, pontos, espaços, !) Erro

Compatibilidade entre plataformas

As habilidades usam o padrão aberto Agent Skills. Os mesmos SKILL.md arquivos funcionam em várias ferramentas de IA:

Plataforma Compatibilidade
Código Claude O mesmo SKILL.md formato
Projetos Claude.ai Habilidades completas podem ser carregadas como arquivos de projeto
VS Code / GitHub Copilot Full-Agent Habilidades suportadas no modo de agente
CLI do Gemini Full-Agent Habilidades suportadas
JetBrains Junie Full-Agent Habilidades suportadas
OpenAI Codex Full-Agent Habilidades suportadas
Cursor Full-Agent Habilidades suportadas

Se você está desenvolvendo habilidades para o Claude Code e o Cowork, comece com a estrutura do plugin Claude Code - é o 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)

Em seguida, importe-o para um projeto do M365 quando estiver pronto para publicar na 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

Gerenciamento de anotação e confirmação de MCP

O Copilot Cowork lê o objeto MCP annotations padrão nas ferramentas das quais seu servidor retorna e o usa para decidir se uma chamada de ferramenta precisa de tools/listconfirmação do usuário e qual rótulo mostrar no prompt.

Campos disponíveis

Campo Tipo Effect
readOnlyHint bool false: a confirmação é necessária antes da execução da ferramenta.
destructiveHint bool true: a confirmação é necessária antes da execução da ferramenta.
title string Rótulo legível mostrado na caixa de diálogo de confirmação. Retorna ao nome da ferramenta quando ausente.

Regras de confirmação

A confirmação é necessária se readOnlyHint == false ou destructiveHint == true.

Todas as ferramentas devem ter as anotações de segurança especificadas. Ferramentas sem anotações são tratadas como destrutivas e exigem confirmação. Saiba mais na referência do esquema MCP.

Exemplos de MCP

Uma ação destrutiva com um rótulo amigável:

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

Uma leitura segura que é executada automaticamente:

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

O que está disponível agora

  • As ferramentas da Microsoft (Graph, Dataverse e outras) são controladas pela política interna do Cowork, independentemente das anotações.
  • Para servidores MCP que não são da Microsoft, a confirmação controlada por anotação está sendo implementada progressivamente. A definição das dicas agora é compatível com versões anteriores, e os prompts de confirmação são exibidos à medida que a distribuição se expande sem a necessidade de alteração de desenvolvedor.

Aceitar arquivos do espaço de trabalho do Cowork

Uma ferramenta de conector pode usar um arquivo da sessão do Cowork do usuário como entrada - um documento que o usuário anexou, um anexo de email que o Cowork salvou ou um arquivo produzido por uma etapa anterior. Declare o parâmetro com o palavra-chave contentEncoding: base64 de esquema JSON padrão e Cowork lida com o resto. Nenhuma extensão de esquema específica da Microsoft é necessária, e a superfície de API do servidor não é alterada.

Cowork resolve o arquivo do espaço de trabalho e codifica-o em base64 antes de chamar o servidor, para que os bytes do arquivo nunca entrem no contexto do agente. O agente só vê e emite caminhos de arquivo do espaço de trabalho.

Observação

Não instrua o agente a codificar um arquivo em base64 e colar o blob em uma chamada de ferramenta. Isso carrega todo o arquivo no contexto do modelo e depende do modelo reproduzir o blob exatamente. Parece funcionar em pequenos arquivos de teste e falha nos reais.

Declarar um parâmetro de arquivo

Uma propriedade de cadeia de caracteres com contentEncoding: base64 é reconhecida como uma entrada de arquivo:

{
  "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"]
  }
}

Uma matriz dessas cadeias de caracteres também é reconhecida, para ferramentas que aceitam vários arquivos:

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

O que o agente vê

Para parâmetros de arquivo declarados no nível superior do inputSchema.properties, o Cowork os substitui no esquema voltado para o modelo por uma única direct_attachment_file_paths matriz, o mesmo parâmetro que as ferramentas internas do Cowork usam, para que o agente já saiba como preenchê-lo. O esquema acima é apresentado ao agente como:

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

Se sua ferramenta declarar mais de um parâmetro de arquivo de nível superior, todos eles serão recolhidos nessa única direct_attachment_file_paths matriz. No momento da chamada, o Cowork ventila os arquivos resolvidos de volta para seus nomes de parâmetros originais na ordem da declaração.

Parâmetros de arquivo aninhados

Um parâmetro de arquivo aninhado dentro de um objeto ou de uma matriz de objetos também tem suporte e é tratado de forma diferente: em vez de ser recolhido, ele é reescrito em um lugar em uma cadeia de caracteres de caminho em seu próprio local. Isso preserva a associação entre um arquivo e seus campos irmãos, por exemplo, um recibo por linha de despesa:

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

O agente preenche line_items[].receipt com um caminho de espaço de trabalho e o Cowork troca cada caminho por conteúdo base64 no local antes de encaminhar a chamada.

O aninhamento é percorrido a uma profundidade de quatro níveis abaixo do topo de inputSchema. $ref Os ponteiros não são seguidos - defina os parâmetros do arquivo embutidos em vez de atrás de um $ref.

O que seu servidor recebe

Seu servidor recebe um ordinário tools/call com seus nomes de parâmetros originais preenchidos com conteúdo codificado em base64:

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

Seu servidor não precisa saber que o agente usou uma interface baseada em caminho e as ferramentas que não declaram contentEncoding: base64 parâmetros não são afetadas.

Limites

Limite Valor
Files per tool call 8
Tamanho por arquivo 150 miB
Tamanho total por chamada de ferramenta 150 miB
Parâmetros de arquivo de matriz por ferramenta 1 (combine-o com qualquer número de parâmetros de arquivo escalar)
Profundidade máxima de aninhamento 4 níveis abaixo do topo de inputSchema

Uma chamada que excede a contagem de arquivos ou um limite de tamanho falha com um erro de ferramenta e nunca chega ao servidor. Dimensione sua API e seus tempos limite com o teto de 150 MiB em mente: base64 aumenta a carga em aproximadamente um terço sobre o tamanho do arquivo bruto e o conteúdo codificado é enviado no corpo da solicitação JSON-RPC.

Recomendações

  • Descreva o parâmetro para um leitor humano. O agente usa a descrição para decidir qual arquivo pertence a qual parâmetro. Por exemplo, "The signed contract PDF to analyze" funciona melhor do que "file".
  • Indique os formatos aceitos na descrição do parâmetro. Cowork passa por tudo o que o usuário anexa. Valide o tipo de conteúdo do seu lado e retorne um erro de ferramenta claro se ele não for utilizável.
  • Definir anotações. Uma ferramenta que recebe um arquivo e age sobre ele normalmente não é somente leitura, portanto, solicita confirmação. Consulte o gerenciamento de anotações e confirmações de MCP.
  • Mantenha os parâmetros do arquivo embutidos. Um parâmetro por trás de um $ref, ou aninhado em mais de quatro níveis, não é reescrito. Seu servidor receberia uma cadeia de caracteres de caminho onde espera conteúdo.
  • Declare no máximo um parâmetro de arquivo de matriz por ferramenta. Com dois ou mais, o Cowork não consegue dizer qual arquivo pertence a qual matriz e a chamada falha com um erro de ferramenta. Use uma matriz, ou vários parâmetros escalares, ou uma combinação de escalares e uma única matriz.
  • Espere uma contagem exata em ferramentas apenas escalares. Se a ferramenta declarar apenas parâmetros de arquivo escalares, o número de arquivos que o agente passa deverá corresponder ao número declarado. Marque os parâmetros de arquivo opcionais claramente em suas descrições para que o agente não forneça excesso ou excesso de oferta.

Observação

Esse mecanismo é anterior ao próprio trabalho de entrada de arquivo do Model Context Protocol, que está sendo padronizado pelo Grupo de Trabalho de Uploads de Arquivos MCP. O Cowork pode adicionar suporte para a forma padronizada de entradas de arquivos declarativos assim que chegar. O contentEncoding: base64 contrato descrito aqui continua funcionando.

Identificar o tráfego do Cowork para o seu servidor

Se o seu servidor MCP tem visibilidade da ferramenta por cliente, ou você deseja atribuir o tráfego que ele recebe, você pode reconhecer as solicitações que vêm do Cowork. O Cowork apresenta uma identidade de software estável em dois canais:

Canal Onde ele aparece Valor
User-Agent cabeçalho da solicitação Cada solicitação de saída que o Cowork envia ao seu servidor copilot-cowork/1.0
clientInfono handshake do MCP initialize Somente a initialize solicitação { "name": "copilot-cowork", "version": "<version>" }

Corresponder no prefixo copilot-cowork

Corresponda ao prefixocopilot-cowork, sem diferenciar maiúsculas de minúsculas, em qualquer canal. Não correspondam à cadeia de caracteres exata copilot-cowork/1.0 ou a um .clientInfo.version A versão rastreia o contrato de identidade do cliente e espera-se que mude; Uma correspondência de prefixo mantém seu portão funcionando em colisões de versão.

# Correct: case-insensitive prefix match
copilot-cowork

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

Escolha o canal certo para o seu portão

Os dois canais têm escopos diferentes, portanto, escolha aquele que corresponde à forma como seu servidor impõe seu portão:

  • O User-Agent cabeçalho está presente em todas as solicitações, incluindo tools/list e tools/call. Se você bloquear ou atribuir por solicitação, digite esse cabeçalho.
  • clientInfo é enviada somente no initialize handshake. Se você fizer o gate por sessão no momento da conexão, poderá lê-lo lá, mas não será repetido em solicitações posteriores.

O que a identidade inclui e o que não inclui

A identidade nomeia apenas o software . É o mesmo para todos os usuários e conexões do Cowork, e nunca carrega a identidade do usuário. A identidade do usuário permanece no fluxo de autorização definido pela configuração de autenticação do conector.

A identidade inclui A identidade não inclui:
Um nome de software estável (copilot-cowork) e uma versão de contrato Qualquer locatário, usuário, sessão ou identificador de conversa
O mesmo valor em cada solicitação e cada conexão Um qualificador por conector

Como não há qualificador por conector, não é possível usar essa identidade no momento para saber qual conector fez uma chamada ou para separar um plug-in publicado da Microsoft de um servidor de sideload apontado para a mesma URL. Se você precisar dessa distinção, aplique-a por meio da configuração de autorização do conector, em vez da identidade do cliente.

Perguntas comuns

Posso usar as habilidades do pacote M365 no Claude Code?

Sim. As pastas de habilidades contêm habilidades padrão do agente. Copie-os para .claude/skills/ qualquer projeto do Claude Code ou execute atk export openplugin para converter todo o projeto de volta para um plug-in do Claude Code.

Preciso de um conector remoto?

Não. Os pacotes somente de habilidades funcionam bem para fluxos de trabalho baseados em prompt. Os conectores só são necessários quando sua habilidade requer dados dinâmicos de um sistema externo.

Como as habilidades de plug-in são diferentes das habilidades internas?

As habilidades de plug-in são exibidas com a fonte "package" na API. Elas não podem substituir as habilidades internas de mesmo nome. Administração pacotes implantados mostram isAdminDeployed: true.

Os administradores de TI podem controlar quais plug-ins estão disponíveis?

Sim. Os controles de administrador do M365 Standard se aplicam: listas de permissões/bloqueios em nível de locatário, implantações gerenciadas pelo administrador e políticas de conformidade.

O que acontece se um plug-in for revogado?

No próximo ciclo de sincronização, as habilidades e conectores desse pacote são removidos da sessão do usuário. As conversas ativas não são interrompidas, mas as novas sessões não têm os recursos do pacote.

Qual é o número máximo de habilidades por pacote?

Vinte (20) habilidades (por ASKILL-M002). Para conectores, o limite é de 10 por pacote.

As habilidades podem fazer referência a ferramentas do conector do mesmo pacote?

Sim, e deveriam. Nomeie as ferramentas explicitamente em seu SKILL.md fluxo de trabalho (por exemplo, "Use a search_case_law ferramenta para..."). O agente os conecta em tempo de execução.

As ferramentas do meu plugin podem aceitar arquivos do espaço de trabalho do Cowork?

Sim. Declare o parâmetro tool com contentEncoding: base64e Cowork resolve o arquivo do espaço de trabalho do usuário para conteúdo base64 antes de chamar o servidor. O modelo passa caminhos de arquivo, não conteúdo de arquivo, para que arquivos grandes não consumam o contexto do modelo. Para detalhes e limites da declaração, saiba mais em Aceitar arquivos do espaço de trabalho do Cowork.

Como fazer gerar um GUID determinístico para meu pacote?

atk import openplugin usa UUID v5 (baseado em SHA-1) do nome do plug-in. Executar a importação duas vezes produz o mesmo GUID. Para definir o seu próprio, passe --app-id. Para empacotamento manual, use qualquer gerador de GUID. Certifique-se de mantê-lo estável em todas as versões.