# CC 2.1.128/129 Adoption — Group B: MCP hygiene

Five MCP-related upstream changes documented + one functional manifest restructure. Closes 8 cc-adoption issues (4 features × 2 dupe slugs each).

## Issues closed 8 / 19+ in the milestone

Pair | Feature | CC | Category
--- | --- | --- | ---
#1637 + #1653 | workspace_reserved_mcp_name | 2.1.128 | breaking
#1640 + #1656 | mcp_shell_prefix_arg_corruption_fix | 2.1.128 | breaking
#1648 + #1667 | denied_mcp_wildcard_case_fix | 2.1.129 | breaking
#1662 | plugin_manifest_experimental_block | 2.1.129 | breaking
(no GH issue, gap=5) | mcp_tool_count_display | 2.1.128 | new_field

## The one real code change: monitors → experimental.monitors

### Before — manifests/ork.json

    {
      "name": "ork",
      "skills": "all",
      "agents": "all",
      "hooks": "all",
      "monitors": "./monitors/monitors.json",
      "userConfig": { ... }
    }

### After — manifests/ork.json

    {
      "name": "ork",
      "skills": "all",
      "agents": "all",
      "hooks": "all",
      "experimental": {
        "monitors": "./monitors/monitors.json"
      },
      "userConfig": { ... }
    }

CC 2.1.129+ expects `monitors` and `themes` under `experimental`. Top-level still works but `claude plugin validate` warns. `scripts/build-plugins.sh` updated to emit the new shape; the built `plugins/ork/.claude-plugin/plugin.json` already verifies clean against `claude plugin validate`.

## Files changed

Path | Change
--- | ---
manifests/ork.json | Move `monitors` under `experimental`
scripts/build-plugins.sh | Emit `experimental.monitors` (line 314 of jq codegen)
src/skills/configure/references/mcp-config.md | New section "CC 2.1.128/129 changes" — covers all 5 features
tests/security/test-mcp-deny-case.sh | New regression: documentation contract for case-insensitive deny rules
tests/security/run-security-tests.sh | Wire the new test into the suite
plugins/ork/... | (mirrored by build) — verifies new shape lands

## The 5 features in one screen

Feature | What changes | Action
--- | --- | ---
`workspace_reserved_mcp_name` | Reserved name; existing servers named `workspace` silently skipped | Audit: confirmed no `workspace` server in our manifests; doc'd reserved-names rule
`mcp_shell_prefix_arg_corruption_fix` | `CLAUDE_CODE_SHELL_PREFIX` wrapping no longer corrupts MCP stdio argv | Doc-only — note in mcp-config.md
`denied_mcp_wildcard_case_fix` | `deniedMcpServers` matches hostnames case-insensitively (RFC-correct) | Doc + regression test asserting we don't recommend defensive case enumeration
`mcp_tool_count_display` | `/mcp` shows tool count and flags zero-tool servers | Doc the new format; doctor checklist will use it for diagnostics
`plugin_manifest_experimental_block` | `monitors` + `themes` belong under `experimental` | Manifest restructure + build script + doc for plugin authors

## Verification

- ✅ `npm run build` — built `plugin.json` has the new `experimental.monitors` shape
- ✅ `npm run test:security` — new `test-mcp-deny-case.sh` passes 2/2
- ✅ `npm run test:skills` — frontmatter + structure unchanged
- ✅ `npm run test:manifests` — manifest schema still valid (the experimental block is allowed)
- ✅ `npm run typecheck` — clean
- ✅ Skills 107, Agents 37, Hooks 188 — unchanged

Group C next: security-adjacent fixes — subprocess OTel isolation, OAuth scope tightening, bash glob allow-rule fix. Then D (config/permission), then E (new distribution surfaces).