---
name: mcp-release-prep
description: Prepare an MCP server and plugin release by bumping versions across all files and updating changelog
disable-model-invocation: true
---

# MCP Server & Plugin Release Preparation

Prepare an MCP server and plugin release by updating version numbers across all required files and generating a changelog entry. The MCP server version advances **independently** of the qsv binary version.

## Arguments

- `version` (required): The new MCP server version number (e.g., "16.2.0")
- `minimum_qsv_version` (optional): New minimum qsv binary version, if changing

All paths below are relative to `.claude/skills/`.

## Version Bump Checklist

### Core (must always update)

1. **`package.json`**: find `"version":` field — source of truth; `version.ts` reads this at runtime
2. **`manifest.json`**: find `"version":` field near top — must match package.json
3. **`.claude-plugin/plugin.json`**: find `"version":` field
4. **`../../.claude-plugin/marketplace.json`** (repo root): find `"version":` in both `metadata` and `plugins[0]` — must match package.json
5. **`agents/data-analyst.md`**: `version:` in YAML frontmatter
6. **`agents/data-wrangler.md`**: `version:` in YAML frontmatter
7. **`agents/policy-analyst.md`**: `version:` in YAML frontmatter

After bumping `package.json`, run `npm install --package-lock-only` to sync `package-lock.json`.

### Conditional (only if minimum qsv binary version changes)

8. **`src/config.ts`**: find `MINIMUM_QSV_VERSION` constant — primary runtime enforcement point
9. **`manifest.json`**: find `"minimum_qsv_version":` field — must match config.ts
10. **`scripts/cowork-setup.cjs`**: find `MINIMUM_QSV_VERSION` constant — must match config.ts and manifest.json

### Documentation (hardcoded versions to update)

11. **`README-MCP.md`**: search for `**Version**: X.Y.Z` near the bottom
12. **`docs/desktop/README-MCPB.md`**: search for download URLs and version badge (multiple occurrences)
13. **`docs/guides/START_HERE.md`**: check for any hardcoded version references

### Command count verification

Verify the skill-based command count matches actual files:

```bash
ls qsv/qsv-*.json | wc -l
```

Then check descriptions in these files for stale counts:
- `.claude-plugin/plugin.json` description
- `../../.claude-plugin/marketplace.json` — both `metadata.description` and `plugins[0].description`
- `cowork-CLAUDE.md` — Tool Discovery section
- `skills/csv-wrangling/SKILL.md` — Tool Discovery section
- `manifest.json` — `_meta.com.dathere.qsv.features` array

## Changelog Entry

Add a new section at the top of `CHANGELOG.md` (in `.claude/skills/`) following this format:

```markdown
## [X.Y.Z] - YYYY-MM-DD

### Added
- (new features)

### Changed
- (changes to existing features)

### Fixed
- (bug fixes)
```

Find the last qsv release tag and use it to populate the changelog:

```bash
# Find the most recent qsv release tag
LAST_TAG=$(git describe --tags --match '[0-9]*.[0-9]*.[0-9]*' --abbrev=0 2>/dev/null || echo "")

# List relevant commits since that tag (or all commits from repo root if no tag exists)
git log --oneline --no-merges --grep="(mcp)" "${LAST_TAG:-$(git rev-list --max-parents=0 HEAD)}"..HEAD
```

Only commits with `(mcp)` or `(plugin)` in the title are relevant to MCP server releases.

## Verification Steps

After version bumps:

1. `npm run build` — TypeScript compilation succeeds
2. `npm test` — all tests pass
3. `npm run mcpb:package` — generates `qsv-mcp-server-X.Y.Z.mcpb`
4. `npm run plugin:package` — generates `qsv-data-wrangling-X.Y.Z.plugin`

## Cowork Plugin

The Cowork plugin (`.plugin` file) is a separate distribution artifact from the Desktop Extension (`.mcpb`). It provides the workflow layer (skills, agents, hooks) without the MCP server itself.

### Plugin components (all relative to `.claude/skills/`)

- **`.claude-plugin/plugin.json`** — plugin manifest (version already bumped in Core step 3)
- **`scripts/cowork-setup.cjs`** — SessionStart hook that deploys `cowork-CLAUDE.md` to the working directory and validates the qsv binary
- **`cowork-CLAUDE.md`** — workflow template deployed by the hook
- **`skills/`** — 15 SKILL.md files: 9 user-invocable (csv-query, data-clean, data-convert, data-describe, data-join, data-profile, data-validate, data-viz, infer-ontology) + 6 model-invoked (bls-query, csv-wrangling, data-quality, genai-disclaimer, qsv-performance, reproducible-analysis)
- **`agents/`** — subagents (data-analyst, data-wrangler, policy-analyst)

### Plugin-specific review

When preparing a release, also review:

- **`cowork-CLAUDE.md`**: check that tool names, workflow steps, and limits are still accurate
- **`scripts/cowork-setup.cjs`**: if `minimum_qsv_version` changed, update the `MINIMUM_QSV_VERSION` constant (listed in Conditional step 10)
- **`skills/`**, **`agents/`**: check for any hardcoded version references or stale tool names

## Important Notes

- MCP server version advances **independently** of qsv binary version
- `minimum_qsv_version` tracks binary compatibility, not server version — enforced in 3 places: `src/config.ts`, `manifest.json`, and `scripts/cowork-setup.cjs` (all must stay in sync)
- Skill JSON files (`qsv/*.json`) are auto-generated by the **qsv binary** (`qsv --update-mcp-skills`), not by this skill — only bump those via `/release-prep`
- `version.ts` reads version from `package.json` at runtime — no need to edit `version.ts` directly
- The `.plugin` package reads its version from `package.json` (same source of truth as the `.mcpb`)
