How-to

How to ship your SharePoint AI Skill as a Cowork plugin in 30 minutes

A step-by-step walkthrough from an existing SKILL.md file to a Cowork plugin sideloaded in your tenant. Manifest, icons, packaging, testing, and the conversion shortcut.

Daniel Anderson9 min read

This article is the practical companion to Cowork plugins explained for SharePoint AI Skills practitioners. That article covers what Cowork plugins are. This article covers how to build one.

The starting assumption: you already have a working SharePoint AI Skill in a SKILL.md file. If you do not, start with how to write your first SharePoint AI Skill, then come back here. The packaging steps below assume the content is already written.

What you will build

A .zip archive containing:

my-plugin.zip
├── manifest.json          # Plugin metadata: name, version, declared skills
├── color.png              # 192x192 colour icon for the M365 App Store
├── outline.png            # 32x32 outline icon for inline UI
└── skills/
    └── my-skill/
        └── SKILL.md       # Your existing SharePoint AI Skill, copied verbatim

That is the minimum. The result is a sideloadable Cowork plugin you can upload to your tenant in minutes.

The build steps below take ~30 minutes the first time. Subsequent plugins take 5 to 10 minutes because the manifest pattern is reusable.

Step 1: Set up the folder structure

Create a working folder for the plugin. Inside it, create a skills/ subfolder, then a folder for your specific skill (named in kebab-case). Drop your existing SKILL.md inside.

my-plugin/
└── skills/
    └── meeting-prep/
        └── SKILL.md

The folder name (meeting-prep) must match the name field in the SKILL.md frontmatter exactly. This is the most common cause of plugin failures. If your SharePoint AI Skill is called MeetingPrep or meeting_prep, rename both the folder and the frontmatter to kebab-case (meeting-prep).

Naming rules:

Examples: meeting-prep, contract-review, email, quarterly-report. Invalid: MeetingPrep, meeting_prep, --meeting-prep--, meeting--prep.

Step 2: Verify the SKILL.md frontmatter

Open the SKILL.md and confirm the YAML frontmatter has the required fields.

---
name: meeting-prep
description: Use when user asks to prepare for an upcoming meeting. Pulls calendar context, recent email threads, and relevant documents into a briefing document.
---

Required:

Optional but useful:

The description is what Cowork uses to decide when to load the skill. Write it as a trigger description, not a marketing blurb. "Use when user asks to..." is the pattern that works.

Step 3: Add reference materials (optional)

For longer skills, keep the main SKILL.md focused on the workflow and move detailed reference material to a references/ subfolder inside the skill folder.

skills/
└── meeting-prep/
    ├── SKILL.md               # ~1,500-2,000 words, the core workflow
    ├── references/
    │   ├── briefing-template.md
    │   └── meeting-types.md
    └── scripts/
        └── extract-attendees.py

Limits per skill:

Skip this step for your first plugin. Add references later when you find the SKILL.md getting too long to read in one pass.

Step 4: Add the icons

Two PNG files at the root of the plugin folder.

You can use placeholder squares for testing. The official documentation accepts placeholders during sideload but the App Store submission requires real icons.

Step 5: Write the manifest

Create manifest.json at the root of the plugin folder. This is the M365 App Package descriptor.

{
  "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.19/MicrosoftTeams.schema.json",
  "manifestVersion": "1.19",
  "version": "1.0.0",
  "id": "00000000-0000-0000-0000-000000000000",
  "packageName": "com.yourorg.meeting-prep-plugin",
  "developer": {
    "name": "Your Organisation",
    "websiteUrl": "https://yourorg.com",
    "privacyUrl": "https://yourorg.com/privacy",
    "termsOfUseUrl": "https://yourorg.com/terms"
  },
  "icons": {
    "color": "color.png",
    "outline": "outline.png"
  },
  "name": {
    "short": "Meeting Prep",
    "full": "Meeting Prep Plugin for Cowork"
  },
  "description": {
    "short": "Prepares briefing documents for upcoming meetings.",
    "full": "Pulls calendar context, recent email threads, and relevant documents into a briefing document for any meeting on your schedule."
  },
  "accentColor": "#0066CC",
  "agentSkills": [
    {
      "id": "meeting-prep",
      "skillFile": "skills/meeting-prep/SKILL.md"
    }
  ]
}

Generate the id GUID using PowerShell ([guid]::NewGuid()) or any UUID generator. The id should be unique per plugin and stable across versions.

The agentSkills array points at each SKILL.md inside the plugin. For multiple skills, add multiple entries. The id in each entry should match the skill's folder name and SKILL.md frontmatter name.

Step 6: Package as .zip

From the plugin folder root, create a .zip with all files at the root level (not inside a parent folder).

PowerShell:

Compress-Archive -Path manifest.json,color.png,outline.png,skills -DestinationPath meeting-prep-plugin.zip

macOS or Linux:

zip -r meeting-prep-plugin.zip manifest.json color.png outline.png skills/

Open the .zip and confirm the structure. manifest.json should be at the root, not inside a folder. This is the second most common cause of plugin install failures.

Step 7: Sideload to test

Sign in to Microsoft 365 Admin Centre.

  1. Manage Apps → Upload custom app
  2. Upload your meeting-prep-plugin.zip
  3. Wait for the upload to complete (usually under a minute)
  4. Open Cowork in m365.cloud.microsoft
  5. Sources & Skills → your plugin's skills should appear
  6. Start a new conversation that triggers the skill (use a prompt that matches the description)

If the skill does not appear, common causes:

For automated deployment via API:

POST /users/titles
Content-Type: application/zip
Body: <your-package.zip>
From the tenant

Test the skill end to end with a real Cowork conversation before publishing or distributing internally. The skill description (in SKILL.md frontmatter) determines when Cowork loads the skill. If Cowork is not picking up your skill on a relevant prompt, the description is usually too vague. Add specific trigger phrases like "Use when the user asks for a meeting briefing".

The shortcut: convert an existing Claude Code plugin

If you already have a Claude Code plugin (with skills and optional MCP servers), Microsoft ships a PowerShell script that converts it to an M365 package automatically.

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

The script reads:

Conversion takes about 5 minutes. The output is a valid M365 .zip ready to sideload or publish.

What does not convert (yet):

The script is at aka.ms/copilot-cowork-plugin-conversion-script.

Publish to the Microsoft 365 App Store

For public distribution, submit through Partner Center.

The submission flow is the same as for Teams apps and Office add-ins. You upload the .zip, complete the listing metadata (description, screenshots, support URLs, privacy policy, terms of use), and submit for Microsoft review. Approval typically takes 5 to 10 business days.

For internal use only, skip the App Store and stick with sideload via the Admin Centre. The .zip is the same; the distribution channel is different.

What good looks like for your first plugin

Three patterns I have seen work and three I have seen fail.

Works: A single SharePoint AI Skill, packaged as Skills-only, sideloaded for one team to use, iterated on for two weeks based on real usage. By week three the plugin is stable and ready for tenant-wide deployment.

Works: A Claude Code plugin that the team is already using locally, converted with the script, sideloaded into Cowork, available to non-developers in the team for the first time.

Works: Three small, focused plugins each doing one workflow well, distributed separately, rather than one large plugin doing everything. Smaller plugins are easier to update, test, and explain.

Fails: A plugin built before the underlying skill was tested in a real workflow. The packaging works but the skill produces vague output because the SKILL.md was written for the manifest, not for the user.

Fails: A plugin with connector AND custom skills AND new authentication, all built simultaneously. Too many moving parts. Build the connector separately first, then add skills on top.

Fails: Skipping the sideload test loop. Some teams package, submit to the App Store, then find out the skill description does not match how users actually phrase their requests. Sideload first, gather usage signals, then publish.

The companion explainer is Cowork plugins explained for the conceptual context. The strategic landscape is in the Agent Skills standard. For the broader Skills surface comparison, Cowork Skills and SharePoint AI Skills is the foundational read.

Get the first wave of Skills when the directory opens.

Production-ready Skill Markdown files, tested in real client tenants. Free for the first wave of subscribers.

Frequently asked questions

Answers to the questions we hear most

What do I need to build a Cowork plugin?

A SKILL.md file in the Agent Skills format, two PNG icons (color and outline), a manifest.json declaring the plugin metadata, and a tool to create a .zip archive. No SDK install required for Skills-only plugins. For plugins with connectors you also need a remote MCP server hosted somewhere reachable on the public internet.

How long does it take to build a Cowork plugin from an existing SKILL.md?

About 30 minutes the first time. After that, packaging an additional skill takes 5 to 10 minutes because you reuse the manifest pattern and icons. The longest part is writing a clean manifest.json and getting the naming rules right.

Can I convert a Claude Code plugin into a Cowork plugin?

Yes. Microsoft ships a PowerShell script (Convert-ClaudePluginToMOS3.ps1) that reads a Claude Code plugin's .claude-plugin/plugin.json, .mcp.json, and skills/ directory, then produces a valid M365 .zip package with a generated manifest. Conversion takes about 5 minutes. The script is at aka.ms/copilot-cowork-plugin-conversion-script.

What is the folder structure for a Cowork plugin?

my-plugin.zip contains manifest.json at the root, color.png and outline.png for icons, and a skills/ folder with one subfolder per skill containing a SKILL.md file. Optional: references/ and scripts/ subfolders inside each skill for companion files.

What naming rules apply to skills inside a plugin?

Skill names use kebab-case (lowercase letters, numbers, hyphens). The folder name must match the name field in the SKILL.md YAML frontmatter exactly. No leading or trailing hyphens, no consecutive hyphens. contract-analysis is valid; ContractAnalysis or contract--analysis are not.

How do I sideload a Cowork plugin to test it?

Sign in to Microsoft 365 Admin Centre. Go to Manage Apps → Upload custom app. Upload your .zip package. Open Cowork in the M365 app, then go to Sources & Skills. Your plugin's skills should appear and be available in new conversations.

What are the limits on companion files in a skill?

Each skill can include up to 20 companion files (anything other than SKILL.md), each up to 5 MB, with a total companion size of 10 MB per skill. The download timeout for all companions in a skill is 15 seconds. Keep the SKILL.md lean and put detailed reference content in references/ subfolders.

Do I need to publish to the Microsoft 365 App Store?

Only if you want public distribution. For internal use, sideload through the Admin Centre is enough and faster. Publish to the App Store via Partner Center when the plugin is ready for use outside your organisation. Both paths use the same .zip package format.

Can I use the same plugin file in Claude Code and in Cowork?

Not the same package format, but the SKILL.md files inside are interchangeable. Microsoft recommends starting with the Claude Code plugin structure (which has more component types like commands, agents, hooks), then converting to an M365 package when you publish to Cowork. The conversion script handles the format translation.

What licence does the user need to run my plugin?

Microsoft 365 Copilot. Plugins are part of Cowork, which is part of the Copilot offering. There is no separate plugin licence to buy. The tenant administrator must also opt into the Microsoft 365 Frontier program during preview.

Daniel Anderson

Founder, ShiftF5.ai · Microsoft Partner

Microsoft 365 consultant with twenty years in SharePoint, Copilot, and M365 AI enablement. Publisher of sharepointaiskills.com. I write about what actually ships in client tenants.

Connect on LinkedIn →