Source profileQuality 91/100Review permissions

gobifrost/bifrost/.claude/skills/bifrost-copilot-cowork-package/SKILL.md

copilot-cowork-package

Use when the user wants to turn a Bifrost agent into a Microsoft 365 Copilot Cowork plugin (.zip with manifest.json + skills/SKILL.md + agentConnectors pointing at the agent's MCP server). Trigger phrases — "/copilot-cowork-package", "turn my <agent> into a Copilot skill", "package this agent for M365 Copilot", "make a Cowork plugin for <agent>", "convert agent to Copilot plugin".

Source repository stars
59
Declared platforms
0
Static risk flags
2
Last source update
2026-08-25
Source checked
2026-08-25

Decision brief

What it does: where it fits

Convert a Bifrost agent into a Microsoft 365 Copilot Cowork plugin package (devPreview M365 unified app manifest with agentSkills + agentConnectors).

Best for

  • /copilot-plugin-converter
  • "turn the agent into a Copilot skill / Cowork plugin"
  • "package for Microsoft 365 Copilot"

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/gobifrost/bifrost --skill ".claude/skills/bifrost-copilot-cowork-package"
Safe inspection promptEditorial

Inspect the Agent Skill "copilot-cowork-package" from https://github.com/gobifrost/bifrost/blob/3e53e2c53db6b1db1712cb62a013ffe8885dedbe/.claude/skills/bifrost-copilot-cowork-package/SKILL.md at commit 3e53e2c53db6b1db1712cb62a013ffe8885dedbe. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Workflow

    1. Identify the agent. Ask bifrost agents list --json if the name is fuzzy; pick the closest match. The script accepts either the agent name or UUID. 2. Reuse the shared Bifrost OAuth registration if available. All Bifrost agents share the same host, so ONE Teams Dev Portal OAut…

    Identify the agent. Ask bifrost agents list --json if the name is fuzzy; pick the closest match. The script accepts either the agent name or UUID.Reuse the shared Bifrost OAuth registration if available. All Bifrost agents share the same host, so ONE Teams Dev Portal OAuth client registration named "Bifrost" covers every agent. If you have a saved referenceId fro…Run the packager (path is relative to this skill directory):
  2. 02

    When to use

    User says any of: - /copilot-plugin-converter - "turn the agent into a Copilot skill / Cowork plugin" - "package for Microsoft 365 Copilot"

    /copilot-plugin-converter"turn the agent into a Copilot skill / Cowork plugin""package for Microsoft 365 Copilot"
  3. 03

    What the script produces

    The script's stdout is JSON: {zip, packagedir, appid, mcpurl, skillname, authtype, refid}. Surface the zip path and mcpurl to the user.

    The script's stdout is JSON: {zip, packagedir, appid, mcpurl, skillname, authtype, refid}. Surface the zip path and mcpurl to the user.
  4. 04

    Conventions

    Skill folder name = kebab(agent.name) and must match the name: field in SKILL.md (M365 validation rule ASKILL-P006).

    Skill folder name = kebab(agent.name) and must match the name: field in SKILL.md (M365 validation rule ASKILL-P006).appid is uuid5(coworknamespace, agent.id) — deterministic, so re-running on the same agent produces the same M365 app GUID.packageName is com.bifrost..
  5. 05

    Auth picker — what actually works in Cowork

    Per Microsoft's cowork-manage-plugins doc, Cowork's MCP runtime supports ONLY:

    None (anonymous)OAuthPluginVaultApiKeyPluginVault

Permission review

Static risk signals and limitations

Runs scripts

medium · line 25

The documentation asks the agent to run terminal commands or scripts.

python3 "${CLAUDE_PLUGIN_ROOT}/skills/copilot-cowork-package/pack.py" "<agent name or id>" --out ./out

Runs scripts

medium · line 102

The documentation asks the agent to run terminal commands or scripts.

$ python3 "${CLAUDE_PLUGIN_ROOT}/skills/copilot-cowork-package/pack.py" "Cyber Questionnaire Assistant" --out /tmp

Network access

medium · line 106

The documentation includes network, browsing, or remote request actions.

"mcp_url": "https://<resolved-host>/mcp/eb0e7492-...",

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score91/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars59SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
gobifrost/bifrost
Skill path
.claude/skills/bifrost-copilot-cowork-package/SKILL.md
Commit
3e53e2c53db6b1db1712cb62a013ffe8885dedbe
License
AGPL-3.0
Collected
2026-08-25
Default branch
main
View the original SKILL.md

copilot-cowork-package

Convert a Bifrost agent into a Microsoft 365 Copilot Cowork plugin package (devPreview M365 unified app manifest with agentSkills + agentConnectors).

The agent's system_prompt becomes the SKILL.md body, the agent's description becomes the skill description, and agentConnectors[0] points at the agent's MCP endpoint at https://<bifrost-host>/mcp/{agent_id}. The host is resolved from bifrost auth list (the "current" entry) unless --bifrost-host is passed.

When to use

User says any of:

  • /copilot-plugin-converter <agent name>
  • "turn the agent into a Copilot skill / Cowork plugin"
  • "package for Microsoft 365 Copilot"

Workflow

  1. Identify the agent. Ask bifrost agents list --json if the name is fuzzy; pick the closest match. The script accepts either the agent name or UUID.

  2. Reuse the shared Bifrost OAuth registration if available. All Bifrost agents share the same host, so ONE Teams Dev Portal OAuth client registration named "Bifrost" covers every agent. If you have a saved referenceId from a previous run, pass it to pack.py --ref-id <id> automatically. Otherwise walk the user through the one-time registration (see "Auth picker" below).

  3. Run the packager (path is relative to this skill directory):

    python3 "${CLAUDE_PLUGIN_ROOT}/skills/copilot-cowork-package/pack.py" "<agent name or id>" --out ./out
    

    If CLAUDE_PLUGIN_ROOT isn't set, fall back to the absolute path of the skill's pack.py (the file sitting next to this SKILL.md).

    Optional flags:

    • --auth None|OAuthPluginVault|ApiKeyPluginVault|DynamicClientRegistration
    • --ref-id <token-vault-id>
    • --bifrost-host <host> (override the host resolved from bifrost auth list)
    • --app-id <guid> (override the deterministic UUID v5)
  4. Surface the zip path AND the TL;DR. The script prints JSON on stdout, then a "Upload to Copilot Cowork (TL;DR)" block. Show both to the user — do NOT swallow the TL;DR.

  5. Flag the placeholders. The script writes solid-color 192×192 / 32×32 PNG icons — fine for sideloading, must be replaced before App Store submission.

What the script produces

<skill-name>-cowork/
├── manifest.json          # devPreview, agentSkills + agentConnectors
├── color.png              # 192×192 solid placeholder
├── outline.png            # 32×32 solid placeholder
└── skills/
    └── <skill-name>/
        └── SKILL.md       # frontmatter + agent system_prompt
<skill-name>-cowork.zip     # zipped, ready to sideload

The script's stdout is JSON: {zip, package_dir, app_id, mcp_url, skill_name, auth_type, ref_id}. Surface the zip path and mcp_url to the user.

Conventions

  • Skill folder name = kebab(agent.name) and must match the name: field in SKILL.md (M365 validation rule ASKILL-P006).
  • app_id is uuid5(cowork_namespace, agent.id) — deterministic, so re-running on the same agent produces the same M365 app GUID.
  • packageName is com.bifrost.<flattened-agent-name>.
  • Description in SKILL.md frontmatter is forced to start with "Use when:" if the agent description doesn't already (M365 best practice).
  • Long agent descriptions are truncated to 1000 chars for the frontmatter, full description goes into manifest.json description.full (4000 char cap).

Auth picker — what actually works in Cowork

Per Microsoft's cowork-manage-plugins doc, Cowork's MCP runtime supports ONLY:

  • None (anonymous)
  • OAuthPluginVault
  • ApiKeyPluginVault

DynamicClientRegistration is in the broader manifest schema but Cowork's MCP runtime does NOT support it today. Even though Bifrost MCP servers natively support RFC 7591 DCR (which is why Claude.ai's "add MCP" flow just works), don't use it for Cowork — the upload will be rejected with Invalid encoded OAuthConfigurationId.

For Bifrost agents specifically, recommend in this order:

  1. OAuthPluginVault against Bifrost's native OAuth (default, works today, no Bifrost-side changes). Bifrost's MCP server exposes an OAuth 2.1 authorization server at https://<bifrost-host>/authorize + /token (RFC 8414 discoverable). Critically, Bifrost is permissive about client identity: _authorize accepts any client_id, _token uses token_endpoint_auth_method: "none" (no client_secret check), and _authorize accepts any redirect_uri. So you can register in Teams Dev Portal → OAuth client registration with:

    • Authorization endpoint: https://<bifrost-host>/authorize
    • Token endpoint: https://<bifrost-host>/token
    • Refresh endpoint: https://<bifrost-host>/token
    • Client ID: any string (Bifrost doesn't validate)
    • Client secret: any string (Bifrost ignores it; Dev Portal requires the field)
    • Scope: mcp:access
    • Enable PKCE: ON (required — Bifrost only accepts S256)

    Save → copy the generated OAuth client registration ID → pass to pack.py --ref-id <id>.

  2. OAuthPluginVault with Entra SSO registration — proper long-term path for M365-native tenants. Register the Bifrost MCP as an Entra-protected API, register a Microsoft Entra SSO client in Teams Dev Portal, add ab3be6b7-f5df-413d-ac2d-abf1e3fd9c0b (Microsoft's enterprise token store client ID) as an authorized client in the Entra app registration. Requires Bifrost-side work: MCP must accept Entra-issued JWTs audience-validated.

  3. ApiKeyPluginVault — viable if Bifrost adds static-bearer support on MCP endpoints. Not currently supported by Bifrost; recommend only if Entra SSO is blocked.

  4. None — sideload smoke tests only. Bifrost MCP itself will reject unauthenticated calls.

referenceId is always the opaque base64 token the Teams Developer Portal generates — never a friendly string. M365 returns Invalid encoded OAuthConfigurationId if it's not a valid Dev Portal–issued ID.

Gotchas

  • M365 requires referenceId for any auth type other than None, AND forbids referenceId when auth is None. The script enforces this.
  • The agent's MCP server must be reachable from Microsoft's cloud — Netbird-fronted or private hosts will NOT work. If bifrost auth list resolves to an internal host, pass --bifrost-host pointing at a public Bifrost instance.
  • Skills-folder limit is 20 entries; companion files limit is 20 per skill, 5 MB each, 10 MB total. This script only emits one skill so those limits aren't a concern.
  • The official Microsoft conversion script is PowerShell and converts Claude-Code-plugin directories. This skill does NOT depend on it — it talks to Bifrost directly via the CLI and builds the package in Python.
  • Junk files (.DS_Store, Thumbs.db, desktop.ini, AppleDouble ._*) are stripped from both the staged package dir and the zip. Sync clients (iCloud, Dropbox, Syncthing) drop these in shared folders constantly — the filter prevents them from ending up in the uploaded manifest.

Real-world example

$ python3 "${CLAUDE_PLUGIN_ROOT}/skills/copilot-cowork-package/pack.py" "Cyber Questionnaire Assistant" --out /tmp
{
  "zip": "/tmp/cyber-questionnaire-assistant-cowork.zip",
  "app_id": "...",
  "mcp_url": "https://<resolved-host>/mcp/eb0e7492-...",
  "skill_name": "cyber-questionnaire-assistant",
  "auth_type": "OAuthPluginVault",
  "ref_id": null
}

User then:

  1. Has tenant admin register an OAuth client for the printed mcp_url in M365 Enterprise Token Store and note the reference id.
  2. Edits manifest.json authorization.referenceId to that id (or re-runs with --ref-id <id>).
  3. Re-zips and uploads.

Frequently asked questions

What to verify before installation and use

What does the copilot-cowork-package source document cover?

Convert a Bifrost agent into a Microsoft 365 Copilot Cowork plugin package (devPreview M365 unified app manifest with agentSkills + agentConnectors).

How do I install copilot-cowork-package?

The source record exposes this install command: npx skills add https://github.com/gobifrost/bifrost --skill ".claude/skills/bifrost-copilot-cowork-package". Inspect the command and pinned source before running it.

Which permission-related actions were detected?

Static rules flagged exec-script, network in the source; the page lists the matching lines and excerpts.

Alternatives

Compare before choosing

Computed 10029,034

garrytan/gbrain

bulk-ingestion

End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.

Computed 10024,921

alirezarezvani/claude-skills

app-store-optimization

App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

Computed 10015,122

wanshuiyin/Auto-claude-code-research-in-sleep

citation-audit

Use it for operations and research tasks; the detail page covers purpose, installation, and practical steps.

Computed 10014,671

prowler-cloud/prowler

postgresql-indexing

PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance