fix(mcp): drop root .mcp.json so plugin's mcp-search isn't duplicated (#2411)

The repo shipped both a root-level .mcp.json and plugin/.mcp.json with
identical mcp-search launchers — kept in sync by a build-time guard and
a test. The root file was a holdover from when devs working inside the
repo could load mem-search without installing the plugin. With the
plugin universally installed, every plugin user now sees `/doctor` warn:

    Plugin (claude-mem @ plugin:claude-mem:mcp-search): MCP server
    "mcp-search" skipped — same command/URL as already-configured
    "mcp-search"

…because Claude Code dedupes by command and skips the plugin's
namespaced registration. The duplicate is functionally harmless but
suppresses the canonical `plugin:claude-mem:mcp-search` entry.

This removes the root .mcp.json entirely and re-points everything that
referenced it at the bundled plugin copy:

- .mcp.json: deleted
- .codex-plugin/plugin.json: mcpServers → ./plugin/.mcp.json
- package.json: drop .mcp.json from files
- scripts/build-hooks.js: drop root-file requirement + sync check
- scripts/sync-marketplace.cjs: drop syncManagedFiles entry
- src/npx-cli/commands/install.ts: drop from allowedTopLevelEntries
- tests/infrastructure/plugin-distribution.test.ts: drop two tests
  enforcing the now-removed root file

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alex Newman
2026-05-21 01:48:50 -07:00
committed by GitHub
parent ea057feeec
commit e53d1530ff
7 changed files with 3 additions and 31 deletions
+1 -3
View File
@@ -34,9 +34,7 @@ function getGitignoreExcludes(basePath) {
const gitignorePath = path.join(basePath, '.gitignore');
if (!existsSync(gitignorePath)) return '';
const syncManagedFiles = new Set([
'.mcp.json',
]);
const syncManagedFiles = new Set();
const lines = readFileSync(gitignorePath, 'utf-8').split('\n');
return lines