Best for
- /copilot-plugin-converter
- "turn the agent into a Copilot skill / Cowork plugin"
- "package for Microsoft 365 Copilot"
gobifrost/bifrost/.claude/skills/bifrost-copilot-cowork-package/SKILL.md
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".
Decision brief
Convert a Bifrost agent into a Microsoft 365 Copilot Cowork plugin package (devPreview M365 unified app manifest with agentSkills + agentConnectors).
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/gobifrost/bifrost --skill ".claude/skills/bifrost-copilot-cowork-package"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
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…
User says any of: - /copilot-plugin-converter - "turn the agent into a Copilot skill / Cowork plugin" - "package for Microsoft 365 Copilot"
The script's stdout is JSON: {zip, packagedir, appid, mcpurl, skillname, authtype, refid}. Surface the zip path and mcpurl to the user.
Skill folder name = kebab(agent.name) and must match the name: field in SKILL.md (M365 validation rule ASKILL-P006).
Per Microsoft's cowork-manage-plugins doc, Cowork's MCP runtime supports ONLY:
Permission review
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 ./outThe documentation asks the agent to run terminal commands or scripts.
$ python3 "${CLAUDE_PLUGIN_ROOT}/skills/copilot-cowork-package/pack.py" "Cyber Questionnaire Assistant" --out /tmpThe documentation includes network, browsing, or remote request actions.
"mcp_url": "https://<resolved-host>/mcp/eb0e7492-...",Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 59 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
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.
User says any of:
/copilot-plugin-converter <agent name>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 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).
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)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.
Flag the placeholders. The script writes solid-color 192×192 / 32×32 PNG icons — fine for sideloading, must be replaced before App Store submission.
<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.
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>.SKILL.md frontmatter is forced to start with "Use when:" if the agent description doesn't already (M365 best practice).manifest.json description.full (4000 char cap).Per Microsoft's cowork-manage-plugins doc, Cowork's MCP runtime supports ONLY:
None (anonymous)OAuthPluginVaultApiKeyPluginVaultDynamicClientRegistration 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:
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:
https://<bifrost-host>/authorizehttps://<bifrost-host>/tokenhttps://<bifrost-host>/tokenmcp:accessSave → copy the generated OAuth client registration ID → pass to pack.py --ref-id <id>.
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.
ApiKeyPluginVault — viable if Bifrost adds static-bearer support on MCP endpoints. Not currently supported by Bifrost; recommend only if Entra SSO is blocked.
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.
referenceId for any auth type other than None, AND forbids referenceId when auth is None. The script enforces this.bifrost auth list resolves to an internal host, pass --bifrost-host pointing at a public Bifrost instance..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.$ 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:
mcp_url in M365 Enterprise Token Store and note the reference id.manifest.json authorization.referenceId to that id (or re-runs with --ref-id <id>).Frequently asked questions
Convert a Bifrost agent into a Microsoft 365 Copilot Cowork plugin package (devPreview M365 unified app manifest with agentSkills + agentConnectors).
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.
Static rules flagged exec-script, network in the source; the page lists the matching lines and excerpts.
Alternatives
garrytan/gbrain
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.
alirezarezvani/claude-skills
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
wanshuiyin/Auto-claude-code-research-in-sleep
Use it for operations and research tasks; the detail page covers purpose, installation, and practical steps.
prowler-cloud/prowler
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