---
document_type: "architecture_design"
service: "MOMENTRY_CORE"
title: "MCP 按需加載策略分析"
date: "2026-04-01"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "按需加載策略分析"
ai_query_hints:
  - "查詢 MCP 按需加載策略分析 的內容"
  - "MCP 按需加載策略分析 的主要目的是什麼？"
  - "如何操作或實施 MCP 按需加載策略分析？"
---

# MCP 按需加載策略分析

| 項目 | 內容 |
|------|------|
| 分析日期 | 2026-04-01 |
| 目標 | 節省 token，按需掛載 MCP 服務器 |

---

## 問題分析

### 當前困境

```
每次對話啟動時，所有 MCP 工具定義都會載入到 context:

例如，當前 session:
  ├─ Gitea MCP: ~80 個工具 → ~15,000 tokens
  ├─ N8N MCP: ~30 個工具 → ~6,000 tokens
  ├─ Playwright MCP: ~25 個工具 → ~5,000 tokens
  ├─ MongoDB MCP: ~25 個工具 → ~5,000 tokens
  ├─ Redis MCP: ~5 個工具 → ~1,000 tokens
  ├─ Postgres MCP: ~1 個工具 → ~200 tokens
  ├─ Sentry MCP: ~20 個工具 → ~4,000 tokens
  ├─ Qdrant MCP: ~2 個工具 → ~400 tokens
  ├─ Filesystem MCP: ~15 個工具 → ~3,000 tokens
  └─ Context7 MCP: ~2 個工具 → ~400 tokens

總計: ~205 個工具 → ~40,000 tokens ❌
```

**問題**：
- ❌ 每次對話都消耗 ~40k tokens（工具定義）
- ❌ 大部分工具用不到
- ❌ 浪費 context window
- ❌ 降低可用 token 數量

---

## 解決方案

### 方案 1：MCP 配置文件切換 ⭐（推薦）

**原理**：使用不同的配置文件，按需啟動

```bash
目錄結構:
~/.config/claude/
├── claude_desktop_config.json          # 預設（最小）
├── claude_desktop_config.dev.json      # 開發模式
├── claude_desktop_config.full.json     # 完整模式
└── claude_desktop_config.minimal.json  # 極簡模式
```

#### 實現方式

**1. 最小配置（日常使用）**

```json
// ~/.config/claude/claude_desktop_config.minimal.json
{
  "mcpServers": {
    "filesystem": {
      "command": "mcp-filesystem",
      "args": ["/Users/accusys/momentry_core_0.1"]
    },
    "redis": {
      "command": "mcp-redis"
    }
  }
}
```

**Token 消耗**: ~4,000 tokens ✅

**2. 開發配置（程式開發）**

```json
// ~/.config/claude/claude_desktop_config.dev.json
{
  "mcpServers": {
    "filesystem": {...},
    "redis": {...},
    "gitea": {
      "command": "gitea-mcp-server",
      "args": ["--config", "~/.gitea-mcp/config.json"]
    },
    "postgres": {...}
  }
}
```

**Token 消耗**: ~20,000 tokens ✅

**3. 完整配置（需要所有工具）**

```json
// ~/.config/claude/claude_desktop_config.full.json
{
  "mcpServers": {
    "filesystem": {...},
    "redis": {...},
    "postgres": {...},
    "mongodb": {...},
    "gitea": {...},
    "n8n": {...},
    "playwright": {...},
    "sentry": {...},
    "qdrant": {...},
    "context7": {...}
  }
}
```

**Token 消耗**: ~40,000 tokens ⚠️

#### 切換腳本

```bash
#!/bin/bash
# switch_mcp_config.sh

CONFIG_DIR="$HOME/.config/claude"
CURRENT_CONFIG="$CONFIG_DIR/claude_desktop_config.json"

case "$1" in
  minimal)
    cp "$CONFIG_DIR/claude_desktop_config.minimal.json" "$CURRENT_CONFIG"
    echo "✅ Switched to minimal config (~4k tokens)"
    ;;
  dev)
    cp "$CONFIG_DIR/claude_desktop_config.dev.json" "$CURRENT_CONFIG"
    echo "✅ Switched to dev config (~20k tokens)"
    ;;
  full)
    cp "$CONFIG_DIR/claude_desktop_config.full.json" "$CURRENT_CONFIG"
    echo "✅ Switched to full config (~40k tokens)"
    ;;
  *)
    echo "Usage: $0 {minimal|dev|full}"
    exit 1
    ;;
esac

# 重啟 Claude Desktop
osascript -e 'quit app "Claude"'
sleep 2
open -a "Claude"
```

**使用**：

```bash
# 日常使用（最小 token）
./switch_mcp_config.sh minimal

# 開發模式
./switch_mcp_config.sh dev

# 完整功能
./switch_mcp_config.sh full
```

---

### 方案 2：環境變數控制

**原理**：使用環境變數動態啟用 MCP

```json
// ~/.config/claude/claude_desktop_config.json
{
  "mcpServers": {
    "filesystem": {
      "command": "mcp-filesystem",
      "args": ["/Users/accusys/momentry_core_0.1"],
      "disabled": false
    },
    "gitea": {
      "command": "gitea-mcp-server",
      "disabled": "${GITEA_MCP_ENABLED:-true}" == "false"
    },
    "mongodb": {
      "command": "mcp-mongodb",
      "disabled": "${MONGODB_MCP_ENABLED:-true}" == "false"
    }
  }
}
```

**⚠️ 限制**：Claude Desktop 可能不支援環境變數

---

### 方案 3：輕量級 MCP 代理

**原理**：使用代理服務器按需轉發

```python
#!/usr/bin/env python3
"""
MCP Proxy Server - 按需載入 MCP 服務器
"""

import asyncio
import json
from typing import Dict, Any

class MCPProxy:
    """MCP 代理服務器"""
    
    def __init__(self):
        self.loaded_servers = {}
        self.available_servers = {
            "gitea": {"command": "gitea-mcp-server", "token_cost": 15000},
            "n8n": {"command": "mcp-n8n", "token_cost": 6000},
            "playwright": {"command": "mcp-playwright", "token_cost": 5000},
            "mongodb": {"command": "mcp-mongodb", "token_cost": 5000},
            "sentry": {"command": "mcp-sentry", "token_cost": 4000},
        }
    
    async def list_tools(self, only_loaded: bool = True):
        """列出可用工具"""
        if only_loaded:
            # 只返回已載入的工具（節省 token）
            tools = []
            for server_name, server in self.loaded_servers.items():
                tools.extend(await server.list_tools())
            return tools
        else:
            # 返回所有可用工具（包含未載入的）
            return [
                {
                    "name": f"load_{name}",
                    "description": f"Load {name} MCP server",
                    "token_cost": info["token_cost"]
                }
                for name, info in self.available_servers.items()
            ]
    
    async def call_tool(self, tool_name: str, arguments: Dict):
        """調用工具"""
        # 檢查是否需要先載入服務器
        server_name = self._get_server_name(tool_name)
        
        if server_name not in self.loaded_servers:
            print(f"[MCP Proxy] Loading {server_name} on demand...")
            await self.load_server(server_name)
        
        # 轉發調用
        server = self.loaded_servers[server_name]
        return await server.call_tool(tool_name, arguments)
    
    async def load_server(self, name: str):
        """按需載入 MCP 服務器"""
        if name in self.loaded_servers:
            return
        
        if name not in self.available_servers:
            raise ValueError(f"Unknown server: {name}")
        
        # 啟動服務器
        config = self.available_servers[name]
        # ... 啟動邏輯
        
        self.loaded_servers[name] = server
        print(f"[MCP Proxy] Loaded {name} ({config['token_cost']} tokens)")

# 啟動代理
if __name__ == "__main__":
    proxy = MCPProxy()
    # 啟動 MCP 服務器...
```

**優點**：
- ✅ 完全按需載入
- ✅ 只在調用時才消耗 token
- ✅ 透明代理

**缺點**：
- ⚠️ 需要自行實現代理邏輯
- ⚠️ 首次調用有延遲

---

### 方案 4：Claude Desktop 功能請求

**原理**：向 Anthropy 提交功能請求

```markdown
Feature Request: Lazy Loading MCP Servers

Problem:
  - All MCP tools loaded at startup
  - Consumes ~40k tokens per session
  - Most tools unused in typical sessions

Proposed Solution:
  1. Add "lazy": true flag to MCP config
  2. Only load tool definitions when first called
  3. Show "Load {server_name}" placeholder in tool list

Example:
  {
    "mcpServers": {
      "gitea": {
        "command": "gitea-mcp-server",
        "lazy": true  // Only load on demand
      }
    }
  }

Benefits:
  - Save ~30-35k tokens per session
  - Faster startup
  - Better UX
```

**提交位置**：
- GitHub Issues: https://github.com/anthropics/anthropic-cookbook/issues
- Discord: Anthropic Community

---

## 實際測試

### Token 消耗對比

| 配置 | 工具數 | Token 消耗 | 適用場景 |
|------|--------|-----------|---------|
| **最小** | 20 | ~4,000 | 日常對話 ⭐ |
| **開發** | 80 | ~20,000 | 程式開發 |
| **完整** | 205 | ~40,000 | 特殊需求 |

### 節省效果

```
預設（最小配置）:
  每次對話節省: 40,000 - 4,000 = 36,000 tokens
  100 次對話節省: 3,600,000 tokens ≈ $36 USD

開發配置:
  每次對話節省: 40,000 - 20,000 = 20,000 tokens
  100 次對話節省: 2,000,000 tokens ≈ $20 USD
```

---

## 推薦策略

### 策略 1：配置文件分離（立即可用）⭐

```bash
# 1. 創建配置文件
~/.config/claude/
  ├─ claude_desktop_config.minimal.json  # 4k tokens
  ├─ claude_desktop_config.dev.json      # 20k tokens
  └─ claude_desktop_config.full.json     # 40k tokens

# 2. 使用腳本切換
./switch_mcp_config.sh minimal  # 節省 36k tokens
./switch_mcp_config.sh dev      # 節省 20k tokens
./switch_mcp_config.sh full     # 完整功能

# 3. 重啟 Claude Desktop
```

### 策略 2：預設最小配置

```json
// 預設只載入最常用的 MCP
{
  "mcpServers": {
    "filesystem": {...},  // 文件操作（必需）
    "redis": {...}        // 快取（常用）
  }
}

// 需要其他功能時，切換配置
```

### 策略 3：按項目配置

```bash
# 不同項目使用不同配置
momentry_core_0.1/
  └─ .claude_config.json  # 項目專用配置

# 啟動時自動載入項目配置
if [ -f ".claude_config.json" ]; then
  cp .claude_config.json ~/.config/claude/claude_desktop_config.json
fi
```

---

## 實施步驟

### Step 1：創建配置文件（立即）

```bash
# 創建配置目錄
mkdir -p ~/.config/claude

# 創建最小配置（推薦預設）
cat > ~/.config/claude/claude_desktop_config.minimal.json << 'EOF'
{
  "mcpServers": {
    "filesystem": {
      "command": "mcp-filesystem",
      "args": ["/Users/accusys"]
    },
    "redis": {
      "command": "mcp-redis"
    }
  }
}
EOF

# 創建開發配置
cat > ~/.config/claude/claude_desktop_config.dev.json << 'EOF'
{
  "mcpServers": {
    "filesystem": {...},
    "redis": {...},
    "gitea": {...},
    "postgres": {...}
  }
}
EOF

# 設定預設為最小配置
cp ~/.config/claude/claude_desktop_config.minimal.json \
   ~/.config/claude/claude_desktop_config.json
```

### Step 2：創建切換腳本

```bash
# 創建腳本
cat > ~/bin/switch_mcp << 'EOF'
#!/bin/bash
# MCP 配置切換器

CONFIG_DIR="$HOME/.config/claude"
CURRENT="$CONFIG_DIR/claude_desktop_config.json"

case "$1" in
  minimal|dev|full)
    cp "$CONFIG_DIR/claude_desktop_config.$1.json" "$CURRENT"
    echo "✅ Switched to $1 config"
    echo "🔄 Restarting Claude Desktop..."
    osascript -e 'quit app "Claude"'
    sleep 2
    open -a "Claude"
    ;;
  status)
    if [ -L "$CURRENT" ]; then
      echo "Current: $(readlink $CURRENT)"
    else
      echo "Current: standalone config"
    fi
    ;;
  *)
    echo "Usage: switch_mcp {minimal|dev|full|status}"
    ;;
esac
EOF

chmod +x ~/bin/switch_mcp
```

### Step 3：使用

```bash
# 日常使用（最小 token）
switch_mcp minimal

# 開發模式
switch_mcp dev

# 完整功能
switch_mcp full

# 查看當前配置
switch_mcp status
```

---

## 總結

### ✅ 推薦方案

**配置文件切換**（立即可用）：
- ✅ 節省 20-36k tokens per session
- ✅ 無需等待 Anthropy 實現
- ✅ 靈活可控
- ✅ 快速切換

### 📋 配置建議

```
預設（90% 場景）:
  ├─ filesystem
  └─ redis
  Token: ~4,000 ✅

開發（8% 場景）:
  ├─ filesystem
  ├─ redis
  ├─ gitea
  └─ postgres
  Token: ~20,000 ✅

完整（2% 場景）:
  └─ 所有 MCP
  Token: ~40,000 ⚠️
```

### 🎯 預期效果

```
每次對話節省:
  預設使用最小配置: 節省 36,000 tokens ≈ $0.036
  
每月節省（假設 500 次對話）:
  500 × 36,000 = 18,000,000 tokens ≈ $18 USD
  
年度節省:
  $216 USD ✅
```
