Criar plugins para Copilot Cowork

Microsoft Copilot Cowork suporta a extensibilidade através dos Pacotes de Aplicações do M365, o mesmo mecanismo de distribuição utilizado pelas aplicações do Teams, agentes do Copilot e suplementos do Office. Pode prolongar Cowork com:

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

Ambos são empacotados em conjunto num pacote de aplicações padrão do Microsoft 365 e distribuídos através do Microsoft 365 App Store.

Importante

As Barreiras de Informação (IB) do Microsoft Purview não são atualmente suportadas para a gestão e partilha de plug-ins ou competências. Nos inquilinos onde o IB está ativado, os carregamentos de ficheiros de conhecimento incorporados são bloqueados ao nível do inquilino. Isto impede que plugins e competências afetados sejam carregados ou publicados.

O que irá construir

Um plugin 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 Capacidades utilizam o padrão aberto Agent Skills, o mesmo formato suportado pelo Claude Code, Visual Studio Code Copilot, Gemini CLI, Cursor, JetBrains Junie e 30+ outras ferramentas de IA.

Escolha o seu ponto de partida

Ponto de partida Caminho Tempo para o primeiro pacote
Tenho um plugin Claude Code ou Cursor existente Importe ~5 minutos
Estou a começar do zero Crie do zero ~30 minutos

Importar um plug-in existente

Se já tiver um plug-in Claude Code ou Cursor com competências e servidores MCP, a CLI do Microsoft 365 Agents Toolkit (atk) importa-o 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 o seu plugin:

    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 diretório e o diretório do .claude-plugin/plugin.json plug-in (ou .cursor-plugin/plugin.json) .mcp.jsone skills/ , em seguida, cria um projeto do Agents Toolkit contendo appPackage/manifest.jsonsuas habilidades e ícones gerados.

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

Nota

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

Compacte .zipo resultado em um :

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 gera um devPreview manifesto. Os exemplos de manifesto em outro lugar neste artigo visam o esquema v1.28. Se estiver a publicar através de um canal que necessite da v1.28, atualize manifestVersion e $schema no gerado appPackage/manifest.json, e adicione a propriedade a cada conector, mcpToolDescription conforme descrito em Descrever as ferramentas do conector.

O que é importado

Artefato de plug-in M365 equivalente Notas
.claude-plugin/plugin.json manifest.json Campos de nome, descrição e programador mapeados; GUID gerado automaticamente (UUID determinístico v5)
skills/*/SKILL.md agentSkills[] entradas + skills/ pasta Verbatim copiado - formato idêntico
.mcp.json servidores agentConnectors[] Inscrições URL e tipo de autenticação detetados automaticamente
color.png / outline.png Ícones no pacote Utilizado se estiver presente; marcadores de posição gerados se estiverem em falta

Importante

Para cada conector importado do , o gerado authorization.referenceId é um espaço reservado derivado do plug-in e do nome do .mcp.jsonservidor. Substitua-o pelo seu ID de registo de cliente OAuth real antes de o publicar. Consulte Tipos de autenticação suportados.

O que não foi convertido

As seguintes funcionalidades de plug-in do Claude ainda não são suportadas no manifesto do Microsoft 365:

Claude funcionalidade de plug-in Estado
commands/ (comandos de barra) Ainda não suportado
agents/ (subagentes) Ainda não suportado
hooks/ (manipuladores de eventos) Ainda não suportado
settings.json Não aplicável
bin/ (executáveis) Não aplicável

Importar opções

Opção Descrição
--path, -p Obrigatório. Diretório de plug-ins contendo .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. Cai novamente para homepage, então author.url
--app-id Substituir o UUID determinístico v5 gerado para o manifesto id
--default-auth-type Auto (predefinição), None, OAuthPluginVault, ou ApiKeyPluginVault

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

Source (Origem) Tipo de autenticação predefinido Motivo
URLs HTTPS externos OAuthPluginVault A maioria das APIs remotas precisa de autenticação
localhost e URLs não HTTPS None Servidores de desenvolvimento local

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

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

Para mover um projeto do Agents Toolkit de volta para um diretório de plug-ins — por exemplo, para manter um plug-in Claude Code e um pacote de Cowork sincronizados — useatk 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 de projeto do Agents Toolkit contendo appPackage/manifest.json
--output, -o Diretório de plug-in de destino (padrão: ./<plugin-name>-openplugin)
--manifest-kind open-plugin (predefinição, escritas .plugin/plugin.json), claude-pluginou cursor-plugin

Exportar grava um x-microsoft-365-agents-toolkit bloco no arquivo plugin.jsongerado . Esse bloco carrega o manifesto id, URLs do 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.

Nota

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

Legado: script de conversão do PowerShell

Antes atk da importação de plug-ins suportada, a conversão utilizava um script do PowerShell apenas para Windows, que permanece disponível como script de conversão:

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

Utilize atk import openplugin em vez disso. É multiplataforma, suporta Cursor e fontes de código Claude e pode exportar de volta para um diretório de plugins.

Crie um plugin do zero

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

Passo 1: Crie a sua primeira competência

Uma competência é uma pasta que contém um SKILL.md ficheiro. Crie a seguinte estrutura de pastas:

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

Escreva SKILL.md com a matéria frontal 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 Frontmatter

Campos obrigatórios:

Campo Constrangimentos Descrição
name 1-64 caracteres, kebab-case Identificador de habilidade - deve corresponder exatamente ao nome da pasta
description 1-1024 carateres 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 à ação direcionando os utilizadores para mercados externos para comprar subscrições.
Caminho da pasta name campo Válido? Porquê
skills/contract-analysis/SKILL.md contract-analysis Sim Correspondência entre 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 Pasta é my-skill mas o nome é contract-analysis

Regras de nomenclatura (kebab-case): Utilize apenas carateres alfanuméricos minúsculos e hífenes. Não utilize hífenes consecutivos nem hífenes à esquerda ou à direita.

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

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

Para habilidades complexas, mantenha a enxuta principal SKILL.md e mova o conteúdo detalhado para subdiretórios. Estes ficheiros adicionais são ficheiros 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 dos ficheiros complementares

Cada habilidade pode incluir até 20 arquivos complementares (qualquer arquivo diferente de SKILL.md). Aplicam-se os seguintes limites por competência:

Limite Valor
Número máximo de ficheiros complementares 20
Tamanho máximo por ficheiro complementar 5 MB
Tamanho total máximo do complemento 10 MB
Tempo limite da transferência (todos os complementos) 15 segundos

Regras de ficheiros complementares

Os caminhos de ficheiros complementares têm de seguir estas regras:

  • Utilizar apenas caminhos relativos (sem caminhos absolutos)
  • Sem caminho transversal (.. segmentos)
  • Sem barras invertidas ou bytes nulos em nomes de ficheiro
  • Sem ficheiros ocultos (nomes a começar por .)
  • Não existem nomes reservados do Windows (CON, PRN, AUX, NULCOM1, –COM9, –LPT9) LPT1
  • O ficheiro SKILL.md em si não conta como um ficheiro complementar
  • Os nomes de ficheiro têm de utilizar carateres seguros: alfanuméricos, hífenes, carateres de sublinhado, pontos, espaços e !

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

Camada Quando carregado Tamanho do destino
Frontmatter (name + description) Sempre - no arranque ~100 tokens
SKILL.md corpo Quando a habilidade é acionada Menos de 5.000 tokens (1.500-2.000 palavras)
Referências (references/) A pedido do agente Ilimitado
Scripts (scripts/) Executado, não carregado para o 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

Passo 3: adicionar um conector (opcional)

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

Sugestão

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

Nota

Os plug-ins personalizados não são suportados no Cowork em dispositivos móveis.

Requisitos do conector

Exigência Detalhes
Transportes HTTP Streamable (HTTPS necessário, TLS 1.2+)
Protocol Formato de mensagem JSON-RPC 2.0
Deteção de ferramentas Suporte tools/list para deteção dinâmica (recomendado)
Execução de ferramentas 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 pequenas APIs (menos de 15 operações): search_case_law, get_ruling, cite_precedent
  • Pesquisa + execução 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 que o agente lê
  • Saída estruturada: retorna JSON 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 ficheiros da área de trabalho do Cowork.

Descreva as ferramentas do conector (mcpToolDescription)

Cada remoteMcpServer conector deve incluir um mcpToolDescription objeto. Sua propriedade aninhada file aponta para um arquivo JSON de descrição de ferramenta que você empacota dentro do seu .zip e referencia por um caminho relativo da raiz do pacote. Se omitir mcpToolDescription, o serviço de pacote rejeita o carregamento 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 ficheiro referenciado (por exemplo, tools/contoso-legal-tools.json) descreve as ferramentas que o conector expõe e tem de estar presente no pacote ZIP. Inclua-o ao lado da sua manifest.json pasta e skills/ quando empacotar o plugin.

Tipos de autenticação suportados

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

Nota

  • O suporte para a autenticação por chave de API ainda não está disponível no Cowork.
  • Se o servidor MCP exigir uma chave API, use OAuthPluginVault ou Registo Dinâmico de Clientes em vez disso, ou exponha um ponto de extremidade que aceite None.

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

Importante

Ao registar o seu cliente OAuth, defina a utilização por organização para Qualquer Organização do Microsoft 365 para garantir que o plug-in funciona em vários inquilinos.

Autenticação MCP

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

Registo Dinâmico de Clientes

Se o seu servidor MCP suportar Registo Dinâmico de Clientes (DCR), pode omitir uma authentication configuração da sua definição de conector e Cowork cria automaticamente um cliente OAuth em nome do seu plug-in.

Pode omitir o authorization objeto, mas continua a precisar de incluir mcpToolDescription. Configure a URL do servidor MCP e a descrição da ferramenta e Cowork cuida do cliente OAuth:

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

Passo 4: Criar o manifesto

Crie manifest.json na raiz do seu 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 o ID de registro OAuth e mcpToolDescription.file deve apontar para um arquivo JSON de descrição da ferramenta que está incluído no pacote ZIP.

Importante

O esquema de manifesto v1.28 é estrito: é definido additionalProperties: false na raiz, portanto, qualquer campo que não esteja definido no esquema é rejeitado. Os campos que são válidos em manifestos padrão da aplicação Teams, como por exemplo packageName, fazem com que o carregamento falhe com um erro como Property 'packageName' has not been defined and the schema does not allow additional properties. Incluir apenas os campos aqui apresentados.

Passo 5: adicionar ícones

Crie dois ícones PNG:

Ícone Tamanho Finalidade
color.png 192×192 px Ícone de aplicação colorido apresentado na loja e na lista de aplicações
outline.png 32×32 px Ícone de contorno de cor única para vistas compactas

Se ainda não tiver ícones, atk import openplugin gera marcadores de posição de cor sólida. Substitua-os antes da submissão à loja.

Passo 6: Pacote

Crie um arquivo ZIP com todos os conteúdos 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 de descrição da ferramenta referenciado pelo mcpToolDescription.file. Os pacotes apenas de competências 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/

Utilizar o Toolkit de Agentes do Microsoft 365

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

Passo 7: Teste

Para testar a sua aplicação, carregue o pacote de aplicação para o Teams, conforme descrito em Carregar a sua aplicação para o Teams.

Para testes pessoais, faça o sideload da aplicação utilizando a interface da linha de comandos 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 a sua conta profissional do Microsoft 365:

    atk auth login
    
  4. Entre na sua conta profissional e instale o pacote do agente. Substitua o caminho do ficheiro pela localização do seu 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. Guarde estes IDs para utilização posterior quando atualizar ou desinstalar.

Saiba mais na interface da linha de comandos do Microsoft 365 Agents Toolkit.

Passo 8: publicar no seu inquilino

  1. Abrir o centro de administração do M365Gerir aplicações>Carregue a aplicação personalizada.>
  2. Selecionar o botão de reticências (...) >Adicionar agente.
  3. Carregue o seu .zip pacote.
  4. Abra Cowork>Sources & Skills>Plugins. Seu plug-in aparece na seção Descobrir .

Passo 9: Publicar junto do público

Para plug-ins destinados a distribuição pública, submeta o seu plug-in para a App Store do Microsoft 365 através do Centro de Parceiros. Saiba mais em Publicar agentes para Microsoft 365 Copilot.

Testar um conector em relação a um servidor MCP local

Os conectores requerem um HTTPS mcpServerUrl, portanto, para testar um servidor em execução na sua máquina, você precisa expô-lo em uma URL HTTPS pública. Os túneis de desenvolvimento fornecem um relé que termina o TLS para você.

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

Importante

Utilize --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 seu servidor serve HTTP, cada solicitação através do túnel retornará um 502 erro. O relé termina o TLS e serve o URL público por HTTPS, independentemente deste sinalizador.

Resolução de Problemas

Sintoma Causa Corrigir
Cada solicitação encapsulada retorna 502 e o servidor local fala HTTP devtunnel port create foi executado com --protocol https Recrie a porta com --protocol http
Os pedidos em túnel são devolvidos 502 no macOS mesmo que o servidor local esteja em execução O servidor está vinculado a 0.0.0.0 (somente IPv4), mas o túnel disca localhost, que resolve para ::1 (IPv6) primeiro Vincule o servidor para :: que ele aceite conexões IPv4 e IPv6
O carregamento falha com Required properties are missing from object: mcpToolDescription O conector está em falta mcpToolDescription Adicione mcpToolDescription com uma file referência e compacte esse ficheiro no ZIP
O carregamento 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) Remover o campo; O esquema v1.28 utiliza additionalProperties: false

Padrões de embalagem

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

Apenas competências (sem conexão)

Ideal para fluxos de trabalho baseados em pedidos, análise de documentos e assistência na escrita.

my-skills-pack.zip
├── manifest.json          # agentSkills only, no agentConnectors
├── color.png
├── outline.png
└── skills/
    ├── skill-one/SKILL.md
    └── skill-two/SKILL.md

Competências + 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

Apenas conector (sem competências personalizadas)

Utilize esta opção para origens de dados que as competências incorporadas do Cowork já podem utilizar.

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 ou plug-in Cursor

Utilize esta opção para plug-ins existentes de outras ferramentas de IA que visam Cowork.

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

Melhores práticas de criação de competências

Siga estas diretrizes para criar habilidades que sejam ativadas de forma confiável e produzam resultados consistentes.

Escrever descrições eficazes

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.

Escrever fluxos de trabalho eficazes

  • Seja específico na descrição. Inclua frases de acionamento: "Utilizar quando o utilizador pedir..." Esta descrição é como o agente decide qual habilidade ativar.
  • Estruturar como um fluxo de trabalho. Numere os passos. Cada etapa deve mapear para uma ação concreta (ler um arquivo, chamar uma ferramenta, gerar saída).
  • Definir formato de saída. Mostre a tabela, lista ou estrutura de documento exata que os utilizadores devem esperar. Esta definição melhora drasticamente a consistência.
  • Ferramentas de referência pelo nome. Se a sua competência depender das ferramentas de conexão, nomeie-as explicitamente: "Utilize a search_case_law ferramenta para..."
  • Mantenha o SKILL.md principal enxuto. Mova material de referência detalhado para o references/ subdiretório. O corpo de habilidades deve ser o fluxo de trabalho, não uma enciclopédia.

Evite erros comuns

  • Não incorpore segredos em SKILL.md ficheiros. Utilize agentConnectors com autenticação para credenciais de API.
  • Não duplique competências incorporadas. Verifique a lista de competências incorporadas antes de criar.
  • Não torne as competências demasiado 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 faça hardcode caminhos de arquivo ou comandos do sistema. As competências devem ser portáteis em todos os ambientes.
  • Não coloque tudo em SKILL.md. Se o seu corpo exceder ~3.000 palavras, mova o conteúdo detalhado para references/.

Regras de validação

Quando submete o seu pacote, a plataforma valida-o a vários níveis. Corrija estes erros antes da submissão para evitar a rejeição.

Validação ao nível do manifesto

Código Regra Severidade
ASKILL-M001 folder é obrigatória 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 ao nível do pacote

Código Regra Correção comum Severidade
ASKILL-P001 A pasta referenciada no manifesto existe no ZIP Verifique a estrutura do seu zip Erro
ASKILL-P002 A pasta contém um SKILL.md ficheiro Adicionar em falta SKILL.md Erro
ASKILL-P003 SKILL.md tem frontmatter YAML válido entre --- delimitadores Corrigir sintaxe YAML Erro
ASKILL-P004 Frontmatter inclui name campo Adicionar name: ao frontmatter Erro
ASKILL-P005 Frontmatter inclui description campo Adicionar description: ao frontmatter Erro
ASKILL-P006 name Corresponde ao nome da pasta (segmento do último caminho) Mudar o nome da pasta ou corrigir name: Erro
ASKILL-P007 name é kebab-caso MySkill Não utilize my-skill oumy_skill Erro
ASKILL-P008 Não existem valores duplicados folder na matriz Remover duplicados Erro

Validação do conector

Regra Severidade
Cada conector requer um id e displayName Erro
Todos os valores de conexão id devem ser exclusivos dentro do manifesto Erro
Exatamente um dos plugin ou remoteMcpServer Erro
mcpServerUrl tem de ser um URL HTTPS válido Erro
mcpToolDescription necessário em cada remoteMcpServerum , 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 o tipo é None Erro

Validação de ficheiros complementares

O portal valida ficheiros complementares (materiais de referência, scripts e outros ficheiros SKILL.md) no momento do carregamento e sincronização:

Regra Severidade
Máximo de 20 ficheiros complementares por competência (excluindo SKILL.md) Erro
Cada ficheiro complementar tem de ter 5 MB ou menos Erro
O total de ficheiros complementares tem de ter 10 MB ou menos por competência Erro
Os caminhos de arquivo devem ser relativos (sem caminhos absolutos) Erro
Sem segmentos de caminho transversal (..) Erro
Sem barras invertidas ou bytes nulos em nomes de ficheiro Erro
Sem ficheiros ocultos (nomes a começar por .) Erro
Não existem nomes reservados do Windows (CON, PRN, AUX, NULCOM1, –COM9, –LPT9) LPT1 Erro
Os nomes de ficheiro têm de utilizar apenas carateres seguros (alfanuméricos, hífenes, sublinhados, pontos, espaços, !) Erro

Compatibilidade entre plataformas

As habilidades usam o padrão aberto Habilidades do agente. Os mesmos SKILL.md ficheiros funcionam em várias ferramentas de IA:

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

Se você está desenvolvendo habilidades para Claude Code e Cowork, comece com a estrutura do plugin Claude Code - é o superset:

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 M365 quando estiver pronto para publicar no 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

Gestão de anotações e confirmações MCP

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

Campos disponíveis

Campo Tipo Efeito
readOnlyHint bool false: confirmação necessária antes da execução da ferramenta.
destructiveHint bool true: confirmação necessária antes da execução da ferramenta.
title cadeia Etiqueta legível apresentada na caixa de diálogo de confirmação. Retorna ao nome da ferramenta quando ausente.

Regras de confirmação

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

Todas as ferramentas têm de ter anotações de segurança especificadas. As ferramentas sem anotações são tratadas como destrutivas e requerem confirmação. Saiba mais na referência de 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) estão limitadas pela política incorporada do Cowork, independentemente das anotações.
  • Para servidores MCP que não sejam da Microsoft, a confirmação orientada por anotação está sendo implementada progressivamente. Definir as sugestões agora é compatível com o futuro e os avisos de confirmação surgem à medida que a implementação se expande, sem que seja necessária qualquer alteração do programador.

Aceitar ficheiros a partir da área de trabalho do Cowork

Uma ferramenta de conexão pode tomar um arquivo da sessão de Cowork do usuário como entrada: um documento anexado pelo usuário, um anexo de e-mail Cowork salvo ou um arquivo produzido por uma etapa anterior. Declare o parâmetro com a palavra-chave contentEncoding: base64 padrão JSON Schema e Cowork lida com o resto. Nenhuma extensão de esquema específica da Microsoft é necessária, e a superfície da API do seu servidor não muda.

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

Nota

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

Declarar um parâmetro de ficheiro

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 , Cowork os substitui no esquema voltado inputSchema.propertiespara 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 a 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, Cowork os arquivos resolvidos voltam para os nomes dos parâmetros originais na ordem da declaração.

Parâmetros de ficheiro aninhados

Um parâmetro de arquivo aninhado dentro de um objeto ou uma matriz de objetos também é suportado e é tratado de forma diferente: em vez de ser recolhido, ele é reescrito em uma cadeia de caracteres de caminho em seu próprio local. Isto preserva a associação entre um ficheiro e os campos subordinados associados, 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 Cowork troca cada caminho por conteúdo base64 no lugar antes de encaminhar a chamada.

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

O que o 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"
    }
  }
}

O servidor não precisa saber se 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 por chamada de ferramenta 8
Tamanho por ficheiro 150 MiB
Tamanho total por chamada de ferramenta 150 MiB
Parâmetros do ficheiro de matriz por ferramenta 1 (combine-o com qualquer número de parâmetros de arquivo escalar)
Profundidade máxima de nidificação 4 níveis abaixo do topo da inputSchema

Uma chamada que excede a contagem de ficheiros 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: o base64 infla a carga útil em aproximadamente um terço em relação ao 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 pelo que o usuário anexar. Valide o tipo de conteúdo do seu lado e devolva um erro de ferramenta claro se não for utilizável.
  • Definir anotações. Uma ferramenta que recebe um ficheiro e atua sobre o mesmo normalmente não é só de leitura, pelo que pede uma confirmação. Consulte Gestão de anotações e confirmações MCP.
  • Mantenha os parâmetros do ficheiro em linha. Um parâmetro atrás de um $ref, ou aninhado com profundidade superior a quatro níveis, não é reescrito. O servidor receberia uma cadeia de carateres de caminho onde espera conteúdo.
  • Declare no máximo um parâmetro de arquivo de matriz por ferramenta. Com dois ou mais, Cowork não consegue saber a que ficheiro pertence a que matriz e a chamada falha com um erro de ferramenta. Utilize uma matriz, vários parâmetros escalares ou uma combinação de escalares e uma única matriz.
  • Espere uma contagem exata de ferramentas apenas escalares. Se a ferramenta declarar apenas parâmetros de arquivo escalar, o número de arquivos que o agente passa deve 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 pouco ou em excesso.

Nota

Esse mecanismo é anterior ao trabalho de entrada de arquivos do Protocolo de Contexto do Modelo, que está sendo padronizado pelo Grupo de Trabalho de Uploads de Arquivos MCP. Cowork pode adicionar suporte para a forma padronizada de entradas de arquivo declarativas assim que ela chegar. O contentEncoding: base64 contrato aqui descrito continua a funcionar.

Identificar Cowork tráfego para o servidor

Se o servidor MCP gates a visibilidade da ferramenta por cliente ou se pretender atribuir o tráfego que recebe, pode reconhecer pedidos provenientes de Cowork. Cowork apresenta uma identidade de software estável em dois canais:

Canal Onde aparece Valor
User-Agent cabeçalho do pedido Todos os pedidos enviados Cowork envia ao servidor copilot-cowork/1.0
clientInfono aperto de mão MCP initialize Apenas o initialize pedido { "name": "copilot-cowork", "version": "<version>" }

Corresponder no prefixo copilot-cowork

Corresponda ao prefixo, não sensível às maiúsculas copilot-cowork e minúsculas, em qualquer um dos canais. Não correspondam à cadeia exata copilot-cowork/1.0 ou a um clientInfo.versionficheiro . A versão rastreia o contrato de identidade do cliente e espera-se que mude; Uma correspondência de prefixos mantém seu portão funcionando em todos os solavancos 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 âmbitos diferentes, por isso é fundamental naquele que corresponde à forma como o servidor impõe a sua porta:

  • O User-Agent cabeçalho está presente em todos os pedidos, incluindo tools/list e tools/call. Se você porta ou atributo por solicitação, chave neste cabeçalho.
  • clientInfo é enviado apenas no aperto de initialize mão. Se você cancelar por sessão no momento da conexão, você pode lê-lo lá, mas não será repetido em solicitações posteriores.

O que a identidade inclui e não inclui

A identidade apenas nomeia o software . É o mesmo para todos os Cowork usuários e conexão, e nunca carrega a identidade do usuário. A identidade do utilizador 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 identificador de inquilino, utilizador, sessão ou conversação
O mesmo valor em cada pedido e em cada ligação Um qualificador por conector

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

Perguntas comuns

Posso usar habilidades do pacote M365 no Claude Code?

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

Preciso de um conector remoto?

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

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

As habilidades de plug-in aparecem com o código-fonte "package" na API. Não podem substituir as competências incorporadas com o mesmo nome. Administração pacotes não implantados mostram isAdminDeployed: true.

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

Sim. Aplicam-se controlos de administrador padrão do M365: listas de permissões/bloqueios ao nível do inquilino, implementações geridas pelo administrador e políticas de conformidade.

O que acontece se um plug-in for revogado?

No ciclo de sincronização seguinte, as competências e os conectores desse pacote são removidos da sessão do utilizador. As conversações ativas não são interrompidas, mas as novas sessões não têm as funcionalidades 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 competências podem referenciar ferramentas de conexão do mesmo pacote?

Sim, e deveriam. Atribua um nome explícito às ferramentas no fluxo SKILL.md de trabalho (por exemplo, "Utilizar a search_case_law ferramenta para..."). O agente liga-os em tempo de execução.

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

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

Como devo proceder para gerar um GUID determinístico para o meu pacote?

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