Skip to content

Commit 3449eba

Browse files
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>
1 parent e6a84db commit 3449eba

File tree

4 files changed

+53
-45
lines changed

4 files changed

+53
-45
lines changed

cowork-plugin-management/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cowork-plugin-management",
3-
"version": "0.2.1",
3+
"version": "0.2.2",
44
"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.",
55
"author": {
66
"name": "Anthropic"

cowork-plugin-management/skills/cowork-plugin-customizer/SKILL.md

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,51 @@
11
---
22
name: cowork-plugin-customizer
33
description: >
4-
Customize or personalize a Claude Code plugin for a specific organization's tools and workflows.
5-
Use when users want to customize a plugin, replace tool placeholders, or configure MCP servers for a plugin.
6-
This skill requires Cowork mode with mounted plugin directories and will not work in remote or standard CLI sessions.
4+
Customize a Claude Code plugin for a specific organization's tools and workflows.
5+
Use when: customize plugin, set up plugin, configure plugin, tailor plugin, adjust plugin settings,
6+
customize plugin connectors, customize plugin skill, customize plugin command, tweak plugin, modify plugin configuration.
77
compatibility: Requires Cowork desktop app environment with access to mounted plugin directories (mnt/.local-plugins, mnt/.plugins).
88
---
99

1010
# Cowork Plugin Customization
1111

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.
1313

1414
> **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."
1515
16-
## Overview
16+
## Determining the Customization Mode
1717

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'`
1919

20-
```bash
21-
grep -rn '~~\w' /path/to/plugin --include='*.md' --include='*.json'
22-
```
20+
> **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`).
2323

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.
2525

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.
2727

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.
3329
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.
3531
3632
## Customization Workflow
3733

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+
3843
### Phase 1: Gather Context from Knowledge MCPs
3944

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.
4146

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
4449
- Organizational processes and workflows
4550
- Team conventions (naming, statuses, estimation scales)
4651
- Configuration values (workspace IDs, project names, team identifiers)
@@ -52,42 +57,47 @@ Use company-internal knowledge MCPs to collect information. See `references/sear
5257

5358
Record all findings for use in Phase 3.
5459

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:
5663

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:
5869

5970
- **Good**: "Learn how standup prep works at Company"
6071
- **Bad**: "Replace placeholders in commands/standup-prep.md"
6172

6273
### Phase 3: Complete Todo Items
6374

64-
Work through each item using Phase 1 context.
75+
Work through each item using context from Phase 0 and Phase 1.
6576

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.
6778

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.
6980

7081
**Types of changes:**
7182

72-
1. **Customization point replacements**: `~~Jira``Asana`, `~~your-org-channel``#engineering`
73-
2. **URL pattern updates**: `tickets.example.com/your-team/123``app.asana.com/0/PROJECT_ID/TASK_ID`
74-
3. **Organization-specific values**: Workspace IDs, project names, team identifiers
83+
1. **Placeholder replacements** (generic setup): `~~Jira``Asana`, `~~your-org-channel``#engineering`
84+
2. **Content updates**: Modifying instructions, commands, workflows, or references to match the organization
85+
3. **URL pattern updates**: `tickets.example.com/your-team/123``app.asana.com/0/PROJECT_ID/TASK_ID`
86+
4. **Configuration values**: Workspace IDs, project names, team identifiers
7587

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).
7789

7890
### Phase 4: Search for Useful MCPs
7991

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.
8193

8294
For each tool identified during customization:
8395
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
8597
3. Update the plugin's MCP config file (check `plugin.json` for custom location, otherwise `.mcp.json` at root)
8698

8799
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.
88100

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-
91101
## Packaging the Plugin
92102

93103
After all customizations are applied, package the plugin as a `.plugin` file for the user:

cowork-plugin-management/skills/cowork-plugin-customizer/references/mcp-servers.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,6 @@ Both wrapped and unwrapped formats are supported:
8686

8787
Use the `url` field from `search_mcp_registry` results.
8888

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.

cowork-plugin-management/skills/create-cowork-plugin/references/component-schemas.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ Decisions: `approve`, `block`, `ask_user` (ask for confirmation).
294294
}
295295
```
296296

297-
**SSE** (hosted with OAuth):
297+
**SSE** (remote server, server-sent events transport):
298298
```json
299299
{
300300
"mcpServers": {
@@ -306,7 +306,7 @@ Decisions: `approve`, `block`, `ask_user` (ask for confirmation).
306306
}
307307
```
308308

309-
**HTTP** (REST API):
309+
**HTTP** (remote server, streamable HTTP transport):
310310
```json
311311
{
312312
"mcpServers": {
@@ -321,14 +321,6 @@ Decisions: `approve`, `block`, `ask_user` (ask for confirmation).
321321
}
322322
```
323323

324-
### Server Type Selection Guide
325-
326-
| Type | Best for | Auth method |
327-
|------|----------|-------------|
328-
| stdio | Local tools, custom servers | Environment variables |
329-
| SSE | Hosted cloud services | OAuth (automatic) |
330-
| HTTP | REST API backends | Token headers |
331-
332324
### Environment Variable Expansion
333325

334326
All MCP configs support `${VAR_NAME}` substitution:
@@ -337,6 +329,10 @@ All MCP configs support `${VAR_NAME}` substitution:
337329

338330
Document all required environment variables in the plugin README.
339331

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.
335+
340336
## CONNECTORS.md
341337

342338
**Location**: Plugin root

0 commit comments

Comments
 (0)