You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Improve plugin customizer for scoped and general customization (#54)
* Improve plugin customizer to support scoped and general customization
- Add three customization modes: scoped (specific section), generic
(template setup with ~~ placeholders), and general (tweaking existing)
- Add Phase 0 for gathering user intent before diving into customization
- Clarify MCP server type descriptions (SSE/HTTP transport labels)
- Document directory entries without URLs (name-based matching)
- Update component-schemas.md with consistent MCP terminology
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* remove note about 1p connectors
* Address PR review: keyword-style "use when" and default to placeholder track
Rewrite skill description's "use when" guidance as keyword phrases instead
of logical clauses for better matching. Default to generic plugin setup mode
when ~~placeholders exist, even if user requested scoped customization, to
prevent incomplete plugin configuration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove server type selection guide from component schemas
MCP server type details are unnecessary for plugin authors and add noise
to the reference doc.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Soften placeholder default rule to respect explicit user intent
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Bump cowork-plugin-management version to 0.2.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: cowork-plugin-management/.claude-plugin/plugin.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "cowork-plugin-management",
3
-
"version": "0.2.1",
3
+
"version": "0.2.2",
4
4
"description": "Create, customize, and manage plugins tailored to your organization's tools and workflows. Configure MCP servers, adjust plugin behavior, and adapt templates to match how your team works.",
compatibility: Requires Cowork desktop app environment with access to mounted plugin directories (mnt/.local-plugins, mnt/.plugins).
8
8
---
9
9
10
10
# Cowork Plugin Customization
11
11
12
-
Adapt a generic plugin template to a specific organization by replacing customization points with actual tool names, configuring MCP servers, and applying organization-specific customizations.
12
+
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.
13
13
14
14
> **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."
15
15
16
-
## Overview
16
+
## Determining the Customization Mode
17
17
18
-
Generic plugins mark customization points with a `~~` prefix. Any line or value starting with `~~` is a placeholder that should be replaced during customization (e.g., `~~Jira` → `Asana`, `~~your-team-channel` → `#engineering`). To find all customization points in a plugin, use:
18
+
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.
21
+
22
+
**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`).
23
23
24
-
> **Important**: Never change the name of the plugin or skill being customized. Only replace `~~`-prefixed placeholder values and update content — do not rename directories, files, or the plugin/skill name fields.
24
+
**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 command", "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.
25
25
26
-
> **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 learning about the organization and its tools.
26
+
**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.
27
27
28
-
The process:
29
-
1.**Gather context** — use knowledge MCPs to learn what tools and processes the organization uses
30
-
2.**Create todo list** — grep for `~~\w` to find all customization points and build a todo list
31
-
3.**Complete todo items** — apply gathered context, falling back to user questions when unclear
32
-
4.**Search for useful MCPs** — find and connect MCPs for identified tools
28
+
> **Important**: Never change the name of the plugin or skill being customized. Do not rename directories, files, or the plugin/skill name fields.
33
29
34
-
If an answer cannot be found via knowledge MCPs or user input, leave the customization point unchanged for a future customization cycle.
30
+
> **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.
35
31
36
32
## Customization Workflow
37
33
34
+
### Phase 0: Gather User Intent (scoped and general customization only)
35
+
36
+
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 command — we do async standups in #eng-updates every morning").
37
+
38
+
-**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.
39
+
-**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 command?" or "What would you like to change about how this plugin works?" Keep it short and specific to their request.
40
+
41
+
Use their response (if any) as additional context throughout the remaining phases.
42
+
38
43
### Phase 1: Gather Context from Knowledge MCPs
39
44
40
-
Use company-internal knowledge MCPs to collect information. See `references/search-strategies.md` for detailed query patterns by category.
45
+
Use company-internal knowledge MCPs to collect information relevant to the customization scope. See `references/search-strategies.md` for detailed query patterns by category.
41
46
42
-
**What to gather:**
43
-
- Tool names for each `~~`-prefixed placeholder
47
+
**What to gather** (scope to what's relevant):
48
+
- Tool names and services the organization uses
44
49
- Organizational processes and workflows
45
50
- Team conventions (naming, statuses, estimation scales)
46
51
- Configuration values (workspace IDs, project names, team identifiers)
@@ -52,42 +57,47 @@ Use company-internal knowledge MCPs to collect information. See `references/sear
52
57
53
58
Record all findings for use in Phase 3.
54
59
55
-
### Phase 2: Create Todo List from Customization Points
60
+
### Phase 2: Create Todo List
61
+
62
+
Build a todo list of changes to make, scoped appropriately:
56
63
57
-
Run `grep -rn '~~\w' /path/to/plugin --include='*.md' --include='*.json'` to find all customization points. Group them by theme and create a todo list with user-friendly descriptions that focus on learning about the organization:
64
+
-**For scoped customization**: Only include items related to the specific section the user asked about.
65
+
-**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.
66
+
-**For general customization**: Read the plugin files, understand the current config, and based on the user's request, identify what needs to change.
67
+
68
+
Use user-friendly descriptions that focus on the plugin's purpose:
58
69
59
70
-**Good**: "Learn how standup prep works at Company"
60
71
-**Bad**: "Replace placeholders in commands/standup-prep.md"
61
72
62
73
### Phase 3: Complete Todo Items
63
74
64
-
Work through each item using Phase 1 context.
75
+
Work through each item using context from Phase 0 and Phase 1.
65
76
66
-
**If knowledge MCPs provided a clear answer**: Apply directly without confirmation.
77
+
**If the user's free-form input (Phase 0) or knowledge MCPs (Phase 1) provided a clear answer**: Apply directly without confirmation.
67
78
68
-
**Otherwise**: Use AskUserQuestion. Don't assume "industry standard" defaults are correct — if knowledge MCPs didn't provide 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.
79
+
**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.
69
80
70
81
**Types of changes:**
71
82
72
-
1.**Customization point replacements**: `~~Jira` → `Asana`, `~~your-org-channel` → `#engineering`
4.**Configuration values**: Workspace IDs, project names, team identifiers
75
87
76
-
If user doesn't know or skips, leave the `~~`-prefixed value unchanged.
88
+
If user doesn't know or skips, leave the value unchanged (or the `~~`-prefixed placeholder, for generic setup).
77
89
78
90
### Phase 4: Search for Useful MCPs
79
91
80
-
After all customization points have been resolved, connect MCPs for the tools that were identified. See `references/mcp-servers.md` for the full workflow, category-to-keywords mapping, and config file format.
92
+
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.
81
93
82
94
For each tool identified during customization:
83
95
1. 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
84
-
2. If unconnected: `suggest_connectors(directoryUuids=["chosen-uuid"])` — user completes OAuth
96
+
2. If unconnected: `suggest_connectors(directoryUuids=["chosen-uuid"])` — user completes auth
85
97
3. Update the plugin's MCP config file (check `plugin.json` for custom location, otherwise `.mcp.json` at root)
86
98
87
99
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.
88
100
89
-
**Note:** First-party integrations (Gmail, Google Calendar, Google Drive) are connected at the user level and don't need plugin `.mcp.json` entries.
90
-
91
101
## Packaging the Plugin
92
102
93
103
After all customizations are applied, package the plugin as a `.plugin` file for the user:
Copy file name to clipboardExpand all lines: cowork-plugin-management/skills/cowork-plugin-customizer/references/mcp-servers.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -86,4 +86,6 @@ Both wrapped and unwrapped formats are supported:
86
86
87
87
Use the `url` field from `search_mcp_registry` results.
88
88
89
-
**Note:** First-party integrations (Gmail, Google Calendar, Google Drive) are connected at the user level and don't need plugin `.mcp.json` entries.
89
+
### Directory Entries Without a URL
90
+
91
+
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.
All MCP configs support `${VAR_NAME}` substitution:
@@ -337,6 +329,10 @@ All MCP configs support `${VAR_NAME}` substitution:
337
329
338
330
Document all required environment variables in the plugin README.
339
331
332
+
### Directory Servers Without a URL
333
+
334
+
Some MCP directory entries have no `url` because the endpoint is dynamic. Plugins can reference these servers by **name** instead — if the server name in the plugin's MCP config matches the directory entry name, it is treated the same as a URL match.
0 commit comments