メインコンテンツへスキップ

MCP設定完全ガイド:Scope、継承、分離アーキテクチャ

MCP設定の3つのScope、継承動作、そしてClaude CodeでのContext使用を最適化するためのMCP分離の実装方法を徹底解説。

Claude Codeを使用する際、MCP(Model Context Protocol)は機能拡張の重要なメカニズムです。しかし、以下のような問題に遭遇したことはありませんか?

  • MCPツールが多すぎてContextを消費する
  • 不要なMCPを誤ってトリガーしてしまう
  • 特定のタスクでのみ特定のMCPをロードしたい

本記事では、MCP設定メカニズムを徹底解説し、「MCP分離アーキテクチャ」というソリューションを提供します。

2026年11月4日更新: 公式MCPドキュメントとClaude Code v2.1.318に照らして訂正しました。user scopeのサーバーは~/.claude/.mcp.jsonではなく~/.claude.jsonに保存されます。優先順位にプラグイン提供のサーバー、claude.ai connectors、組織が管理するサーバーを加え、~/.claude.jsonの例にprojectsキーを補いました。また、.claude/.mcp.jsonはバグではなく、そもそもサポートされていない場所です。以下の継承動作のテストはv2.1.9時点のもので、今回は再実行していません。

更新(2026年中頃):Claude Codeは現在、ツールスキーマの読み込みを遅延させ、ToolSearchによってMCPツールをオンデマンドでロードします。そのため、以下のContextコストに関する動機は、以前の一括ロード時代の動作を反映したものです。ただし、Scopeと継承の仕組みは、権限や設定の分離のために引き続き有用です。


1. MCP設定ソース

実際のテストにより、Claude Codeは以下の場所からMCP設定を読み取ります:

CLIコマンド保存場所説明
--scope project.mcp.jsonプロジェクトレベル、gitにコミット可能
--scope local~/.claude.json(プロジェクト別)個人用、プロジェクトパスごとに保存
--scope user~/.claude.json(トップレベルのmcpServers)グローバル、全プロジェクトでロード

読み取られない場所

以下の場所はClaude Codeによって読み取られません:

場所ステータス
.mcp.local.json❌ この設定は存在しない
.claude/.mcp.json❌ サポートされていない場所。プロジェクトのサーバーはプロジェクトルートの.mcp.jsonに置く(Issue #5037)
.claude/settings.json内のmcpServers❌ 読み取られない

2. Scope優先順位

同名のMCPが複数のScopeに存在する場合、優先順位は:

Local > Project > User > Plugin-provided servers > claude.ai connectors

例えば、database MCPがlocalとproject scopeの両方に存在する場合、localの設定が使用されます。Claude Codeは最も優先度の高いソースのエントリ全体を使い、Scopeをまたいでフィールドをマージすることはありません。組織がmanaged setting managedMcpServersで提供するサーバーは、これらすべてより優先されます(Claude Code v2.1.259以降)。


3. 継承動作(重要!)

これが最も重要な部分です。異なる設定ソースには異なる継承動作があります:

.mcp.jsonの継承動作

すべての親ディレクトリを上方向に検索し、すべてをマージしてロードします。

project/
├── .mcp.json              ← MCP-A, MCP-B
└── sub-folder/
    └── .mcp.json          ← MCP-C

sub-folder/でClaude Codeを実行すると、ロードされるのは:A + B + C

重要:この動作はgitとは無関係です! サブディレクトリに独自の.gitがあっても、親ディレクトリの.mcp.jsonを継承します。

~/.claude.jsonの継承動作

git rootが一致するプロジェクトにのみ有効です。

~/.claude.jsonの構造はプロジェクトパスごとに保存されます:

{
  "projects": {
    "/Users/xxx/my-project": {
      "mcpServers": {
        "discord-mcp": { "command": "node", "args": [...] }
      }
    }
  }
}
状況~/.claude.jsonのMCPをロードするか
.gitのないサブディレクトリ✅ ロード(git rootはメインプロジェクト)
.gitのあるサブディレクトリ❌ ロードしない(git rootはサブディレクトリ自身)

4. テスト検証

テスト環境

project/                         ← git root
├── .mcp.json                    ← filesystem, memory
├── ~/.claude.json               ← discord-mcp(プロジェクト別)
│
├── sub-no-git/
│   └── .mcp.json                ← unique-no-git
│
└── sub-with-git/
    ├── .git/
    └── .mcp.json                ← unique-with-git

テスト結果

ディレクトリロードされたMCP
project/filesystem, memory, discord-mcp
sub-no-git/filesystem, memory, discord-mcp, unique-no-git
sub-with-git/filesystem, memory, unique-with-git

観察結果:

  • sub-no-gitはメインプロジェクトのすべてのMCPを継承(~/.claude.jsonを含む)
  • sub-with-gitは.mcp.jsonのMCPを継承したが、~/.claude.jsonのMCPは継承しなかった

5. MCP分離アーキテクチャ

これらの発見に基づき、「MCP分離アーキテクチャ」を設計できます:

アーキテクチャ設計

project/
├── .mcp.json                    ← 空または共有MCPのみ
│
└── .mcp-workspaces/
    ├── .git/                    ← このレベルで一度だけgit init!
    ├── .mcp.json                ← 空のまま
    │
    ├── discord/
    │   ├── .mcp.json            ← discord MCPのみ
    │   └── CLAUDE.md            ← Discord専用ルール
    │
    └── memory/
        ├── .mcp.json            ← memory MCPのみ
        └── CLAUDE.md            ← Memory専用ルール

最適化:.mcp-workspaces/レベルで一度だけgit initを実行すればOKです。すべてのサブディレクトリがこのgit rootを共有し、メインプロジェクトの~/.claude.jsonのMCPから分離されます。

セットアップ手順

1. メインプロジェクトのMCPに--scope localを使用

cd my-project
claude mcp add --scope local discord-mcp -- node /path/to/discord-mcp

これによりMCP設定は.mcp.jsonではなく~/.claude.jsonに保存されます。

2. 分離されたMCP Workspaceを作成

mkdir -p .mcp-workspaces/discord
cd .mcp-workspaces/discord

# gitを初期化(重要!)
git init

# 専用MCPを追加
claude mcp add --scope project discord-mcp -- node /path/to/discord-mcp

3. 専用CLAUDE.mdを作成

# Discord MCP Workspace

## 利用可能なツール
- `mcp__discord-mcp__send-message` - メッセージ送信
- `mcp__discord-mcp__read-messages` - メッセージ読み取り

## 操作ルール
1. 送信前にチャンネルを確認
2. メッセージはプロフェッショナルに

## 戻り値形式
[OK] #generalにメッセージを送信しました
[ERROR] チャンネルが見つかりません

呼び出し方法

Skillを通じて分離されたMCP Workspaceを呼び出します:

cd .mcp-workspaces/discord && claude --print --model haiku -p "#generalにメッセージを送信: Hello"

6. アーキテクチャの利点

利点説明
Context節約メインセッションは不要なMCPツール説明をロードしない
正確なトリガー必要な時にのみ対応するMCPをロード、誤動作を防止
専用ルール各workspaceは独自のCLAUDE.mdを持てる
コスト最適化サブセッションは--model haikuを使用可能
権限分離機密MCP(DBなど)により厳格なルールを設定可能

7. 代替案:--strict-mcp-config

git initを使用したくない場合は、--strict-mcp-configを使用できます:

claude --strict-mcp-config --mcp-config .mcp-workspaces/discord/.mcp.json -p "..."

これは他のMCP設定を完全に無視し、指定された設定ファイルのみを使用します。


8. よくある質問

Q: なぜ.mcp.local.jsonは読み取られないのですか?

このファイル名はClaude Codeでサポートされている設定ファイルではありません。公式には.mcp.jsonのみがサポートされています。

Q: なぜ.claude/.mcp.jsonは読み取られないのですか?

Claude CodeがMCP設定を読み取る場所ではないからです。プロジェクトスコープのサーバーは、プロジェクトルートの.mcp.json(claude mcp add --scope projectが書き込むファイル)に置きます。これをバグとして報告したIssue #5037は、2026年8月にこの説明とともにクローズされました。

Q: サブディレクトリには必ずgit initが必要ですか?

~/.claude.jsonのMCPを分離したい場合は、はい。ただし、メインプロジェクトのMCPがすべて.mcp.jsonにある場合、git initしても継承されます。


9. まとめ

設定ソース継承動作分離方法
.mcp.json上方向に検索、すべて継承完全な分離は不可
~/.claude.jsongit rootのみ一致サブディレクトリでgit init

ベストプラクティス:

  1. よく使うMCP → --scope local(~/.claude.jsonに保存)
  2. 共有MCP → .mcp.json(サブディレクトリに継承される)
  3. 分離MCP → サブディレクトリgit init + .mcp.json

参考資料


本記事の継承動作のテストはClaude Code v2.1.9で実施したものです。設定の保存場所と優先順位は、2026年11月4日にv2.1.318と公式ドキュメントで再確認しました。設定動作はバージョン更新により変更される可能性があります。