Cowork Plugin Customization
Customize a plugin for a specific organization — either by setting up a generic plugin template for the first time, or by tweaking and refining an already-configured plugin.
Finding the plugin: To find the plugin’s source files, run find mnt/.local-plugins mnt/.plugins -type d -name "*<plugin-name>*" to locate the plugin directory, then read its files to understand its structure before making changes. If you cannot find the plugin directory, the user is likely running this conversation in a remote container. Abort and let them know: “Customizing plugins is currently only available in the desktop app’s Cowork mode.”
Determining the Customization Mode
After locating the plugin, check for ~~-prefixed placeholders: grep -rn '~~\w' /path/to/plugin --include='*.md' --include='*.json'
Default rule: If ~~ placeholders exist, default to Generic plugin setup unless the user explicitly asks to customize a specific part of the plugin.
1. Generic plugin setup — The plugin contains ~~-prefixed placeholders. These are customization points in a template that need to be replaced with real values (e.g., ~~Jira → Asana, ~~your-team-channel → #engineering).
2. Scoped customization — No ~~ placeholders exist, and the user asked to customize a specific part of the plugin (e.g., “customize the connectors”, “update the standup skill”, “change the ticket tool”). Read the plugin files to find the relevant section(s) and focus only on those. Do not scan the entire plugin or present unrelated customization items.
Legacy commands/ directories: Some plugins include a commands/ directory. The Cowork UI now presents these alongside skills as a single “Skills” concept, so treat commands/*.md files the same way you would skills/*/SKILL.md files when customizing.
3. General customization — No ~~ placeholders exist, and the user wants to modify the plugin broadly. Read the plugin’s files to understand its current configuration, then ask the user what they’d like to change.
Important: Never change the name of the plugin or skill being customized. Do not rename directories, files, or the plugin/skill name fields.
Nontechnical output: All user-facing output (todo list items, questions, summaries) must be written in plain, nontechnical language. Never mention ~~ prefixes, placeholders, or customization points to the user. Frame everything in terms of the plugin’s capabilities and the organization’s tools.
Customization Workflow
Phase 0: Gather User Intent (scoped and general customization only)
For scoped customization and general customization (not generic plugin setup), check whether the user provided free-form context alongside their request (e.g., “customize the standup skill — we do async standups in #eng-updates every morning”).
-
If the user provided context: Record it and use it to pre-fill answers in Phase 3 — skip asking questions that the user already answered here.
-
If the user did not provide context: Ask a single open-ended question using AskUserQuestion before proceeding. Tailor the question to what they asked to customize — e.g., “What changes do you have in mind for the brief skill?” or “What would you like to change about how this plugin works?” Keep it short and specific to their request.
Use their response (if any) as additional context throughout the remaining phases.
Phase 1: Gather Context from Knowledge MCPs
Use company-internal knowledge MCPs to collect information relevant to the customization scope. See references/search-strategies.md for detailed query patterns by category.
What to gather (scope to what’s relevant):
- Tool names and services the organization uses
- Organizational processes and workflows
- Team conventions (naming, statuses, estimation scales)
- Configuration values (workspace IDs, project names, team identifiers)
Sources to search:
- Chat/Slack MCPs — tool mentions, integrations, workflow discussions
- Document MCPs — onboarding docs, tool guides, setup instructions
- Email MCPs — license notifications, admin emails, setup invitations
Record all findings for use in Phase 3.
Phase 2: Create Todo List
Build a todo list of changes to make, scoped appropriately:
- For scoped customization: Only include items related to the specific section the user asked about.
- For generic plugin setup: Run
grep -rn '~~\w' /path/to/plugin --include='*.md' --include='*.json' to find all placeholder customization points. Group them by theme.
- For general customization: Read the plugin files, understand the current config, and based on the user’s request, identify what needs to change.
Use user-friendly descriptions that focus on the plugin’s purpose:
- Good: “Learn how standup prep works at Company”
- Bad: “Replace placeholders in skills/standup-prep/SKILL.md”
Phase 3: Complete Todo Items
Work through each item using context from Phase 0 and Phase 1.
If the user’s free-form input (Phase 0) or knowledge MCPs (Phase 1) provided a clear answer: Apply directly without confirmation.
Otherwise: Use AskUserQuestion. Don’t assume “industry standard” defaults are correct — if neither the user’s input nor knowledge MCPs provided a specific answer, ask. Note: AskUserQuestion always includes a Skip button and a free-text input box for custom answers, so do not include None or Other as options.
Types of changes:
- Placeholder replacements (generic setup):
~~Jira → Asana, ~~your-org-channel → #engineering
- Content updates: Modifying instructions, skills, workflows, or references to match the organization
- URL pattern updates:
tickets.example.com/your-team/123 → app.asana.com/0/PROJECT_ID/TASK_ID
- Configuration values: Workspace IDs, project names, team identifiers
If user doesn’t know or skips, leave the value unchanged (or the ~~-prefixed placeholder, for generic setup).
Phase 4: Search for Useful MCPs
After customization items have been resolved, connect MCPs for any tools that were identified or changed. See references/mcp-servers.md for the full workflow, category-to-keywords mapping, and config file format.
For each tool identified during customization:
- Search the registry:
search_mcp_registry(keywords=[...]) using category keywords from references/mcp-servers.md, or search for the specific tool name if already known
- If unconnected:
suggest_connectors(directoryUuids=["chosen-uuid"]) — user completes auth
- Update the plugin’s MCP config file (check
plugin.json for custom location, otherwise .mcp.json at root)
Collect all MCP results and present them together in the summary output (see below) — don’t present MCPs one at a time during this phase.
Packaging the Plugin
After all customizations are applied, package the plugin as a .plugin file for the user:
- Zip the plugin directory (excluding
setup/ since it’s no longer needed):
cd /path/to/plugin && zip -r /tmp/plugin-name.plugin . -x "setup/*" && cp /tmp/plugin-name.plugin /path/to/outputs/plugin-name.plugin
- Present the file to the user with the
.plugin extension so they can install it directly. (Presenting the .plugin file will show to the user as a rich preview where they can look through the plugin files, and they can accept the customization by pressing a button.)
Important: Always create the zip in /tmp/ first, then copy to the outputs folder. Writing directly to the outputs folder may fail due to permissions and leave behind temporary files.
Naming: Use the original plugin directory name for the .plugin file (e.g., if the plugin directory is coder, the output file should be coder.plugin). Do not rename the plugin or its files during customization — only replace placeholder values and update content.
Summary Output
After customization, present the user with a summary of what was learned grouped by source. Always include the MCPs sections showing which MCPs were connected during setup and which ones the user should still connect:
## From searching Slack
- You use Asana for project management
- Sprint cycles are 2 weeks
## From searching documents
- Story points use T-shirt sizes
## From your answers
- Ticket statuses are: Backlog, In Progress, In Review, Done
Then present the MCPs that were connected during setup and any that the user should still connect, with instructions on how to connect them.
If no knowledge MCPs were available in Phase 1, and the user had to answer at least one question manually, include a note at the end:
By the way, connecting sources like Slack or Microsoft Teams would let me find answers automatically next time you customize a plugin.
Additional Resources
references/mcp-servers.md — MCP discovery workflow, category-to-keywords mapping, config file locations
references/search-strategies.md — Knowledge MCP query patterns for finding tool names and org values
examples/customized-mcp.json — Example fully configured .mcp.json
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/",
"headers": {
"Authorization": "Bearer ${GITHUB_TOKEN}"
}
},
"asana": {
"type": "sse",
"url": "https://mcp.asana.com/sse"
},
"slack": {
"type": "http",
"url": "https://slack.mcp.claude.com/mcp"
},
"figma": {
"type": "http",
"url": "https://mcp.figma.com/mcp"
},
"datadog": {
"type": "http",
"url": "https://api.datadoghq.com/mcp",
"headers": {
"DD-API-KEY": "${DATADOG_API_KEY}",
"DD-APPLICATION-KEY": "${DATADOG_APP_KEY}"
}
}
},
"recommendedCategories": [
"source-control",
"project-management",
"chat",
"documents",
"wiki-knowledge-base",
"design-graphics",
"analytics-bi"
]
}
MCP Discovery and Connection
How to find and connect MCPs during plugin customization.
Available Tools
search_mcp_registry
Search the MCP directory for available connectors.
Input: { "keywords": ["array", "of", "search", "terms"] }
Output: Up to 10 results, each with:
name: MCP display name
description: One-liner description
tools: List of tool names the MCP provides
url: MCP endpoint URL (use this in .mcp.json)
directoryUuid: UUID for use with suggest_connectors
connected: Boolean - whether user has this MCP connected
suggest_connectors
Display Connect buttons to let users install/connect MCPs.
Input: { "directoryUuids": ["uuid1", "uuid2"] }
Output: Renders UI with Connect buttons for each MCP
Category-to-Keywords Mapping
| Category |
Search Keywords |
project-management |
["asana", "jira", "linear", "monday", "tasks"] |
software-coding |
["github", "gitlab", "bitbucket", "code"] |
chat |
["slack", "teams", "discord"] |
documents |
["google docs", "notion", "confluence"] |
calendar |
["google calendar", "calendar"] |
email |
["gmail", "outlook", "email"] |
design-graphics |
["figma", "sketch", "design"] |
analytics-bi |
["datadog", "grafana", "analytics"] |
crm |
["salesforce", "hubspot", "crm"] |
wiki-knowledge-base |
["notion", "confluence", "outline", "wiki"] |
data-warehouse |
["bigquery", "snowflake", "redshift"] |
conversation-intelligence |
["gong", "chorus", "call recording"] |
Workflow
- Find customization point: Look for
~~-prefixed values (e.g., ~~Jira)
- Check earlier phase findings: Did you already learn which tool they use?
- Yes: Search for that specific tool to get its
url, skip to step 5
- No: Continue to step 3
- Search: Call
search_mcp_registry with mapped keywords
- Present choices and ask user: Show all results, ask which they use
- Connect if needed: If not connected, call
suggest_connectors
- Update MCP config: Add config using the
url from search results
Updating Plugin MCP Configuration
Finding the Config File
Check plugin.json for an mcpServers field:
{
"name": "my-plugin",
"mcpServers": "./config/servers.json"
}
If present, edit the file at that path.
If no mcpServers field, use .mcp.json at the plugin root (default).
If mcpServers points only to .mcpb files (bundled servers), create a new .mcp.json at the plugin root.
Config File Format
Both wrapped and unwrapped formats are supported:
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
}
}
}
Use the url field from search_mcp_registry results.
Directory Entries Without a URL
Some directory entries have no url because the endpoint is dynamic — the admin provides it when connecting the server. These servers can still be referenced in the plugin's MCP config by name: if the MCP server name in the config matches the directory entry name, it is treated the same as a URL match.
Knowledge MCP Search Strategies
Query patterns for gathering organizational context during plugin customization.
Finding Tool Names
Source control:
- Search: "GitHub" OR "GitLab" OR "Bitbucket"
- Search: "pull request" OR "merge request"
- Look for: repository links, CI/CD mentions
Project management:
- Search: "Asana" OR "Jira" OR "Linear" OR "Monday"
- Search: "sprint" AND "tickets"
- Look for: task links, project board mentions
Chat:
- Search: "Slack" OR "Teams" OR "Discord"
- Look for: channel mentions, integration discussions
Analytics:
- Search: "Datadog" OR "Grafana" OR "Mixpanel"
- Search: "monitoring" OR "observability"
- Look for: dashboard links, alert configurations
Design:
- Search: "Figma" OR "Sketch" OR "Adobe XD"
- Look for: design file links, handoff discussions
CRM:
- Search: "Salesforce" OR "HubSpot"
- Look for: deal mentions, customer record links
Finding Organization Values
Workspace/project IDs:
- Search for existing integrations or bookmarked links
- Look for admin/setup documentation
Team conventions:
- Search: "story points" OR "estimation"
- Search: "workflow" OR "ticket status"
- Look for engineering process docs
Channel/team names:
- Search: "standup" OR "engineering" OR "releases"
- Look for channel naming patterns
When Knowledge MCPs Are Unavailable
If no knowledge MCPs are configured, skip automatic discovery and proceed directly to AskUserQuestion for all categories. Note: AskUserQuestion always includes a Skip button and a free-text input box for custom answers, so do not include None or Other as options.