第 22 期:即插即用 — MCP Client Tool 实战连接 GitHub 与文件系统

⏱ 预计阅读 9 分钟 更新于 2026/4/9

本期目标

让 n8n Agent 通过 MCP 协议连接两个外部服务,实现:

  1. 搜索/创建 GitHub Issues
  2. 读写本地文件系统
graph TB
    CT[💬 Chat Trigger] --> Agent[🤖 AI Agent]
    
    subgraph "Agent 工具集"
        Agent --> Model[🧠 GPT-4o]
        Agent --> MCP1[🔌 MCP Client: GitHub]
        Agent --> MCP2[🔌 MCP Client: Filesystem]
    end
    
    MCP1 -->|"SSE 连接"| GHServer["🐙 GitHub MCP Server
(Docker 容器)"] MCP2 -->|"stdio 连接"| FSServer["📂 Filesystem MCP Server
(Docker 容器)"] style MCP1 fill:#3b82f6,stroke:#2563eb,color:#fff style MCP2 fill:#3b82f6,stroke:#2563eb,color:#fff

1. 部署 MCP Server (Docker)

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# docker-compose.yml 中添加 MCP Server 容器
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

services:
  # ── GitHub MCP Server ──────────────────────────
  mcp-github:
    image: ghcr.io/modelcontextprotocol/server-github:latest
    container_name: mcp_github
    restart: unless-stopped
    environment:
      - GITHUB_PERSONAL_ACCESS_TOKEN=${GITHUB_TOKEN}  # 从 .env 读取
    ports:
      - "3001:3001"                    # SSE 端口
    networks:
      - n8n_network

  # ── Filesystem MCP Server ──────────────────────
  mcp-filesystem:
    image: ghcr.io/modelcontextprotocol/server-filesystem:latest
    container_name: mcp_filesystem
    restart: unless-stopped
    volumes:
      - ./shared-data:/data            # 挂载共享目录
    command: /data                     # 指定可访问的根目录
    ports:
      - "3002:3002"
    networks:
      - n8n_network
# .env 中添加 GitHub Token
GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 启动 MCP Server
docker compose up -d mcp-github mcp-filesystem

# 验证 MCP Server 运行
curl http://localhost:3001/sse    # GitHub Server SSE 端点
curl http://localhost:3002/sse    # Filesystem Server SSE 端点

2. n8n 中配置 MCP Client Tool

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// MCP Client Tool 节点配置 (GitHub)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// Connection Type: SSE (Server-Sent Events)
// SSE URL: http://mcp-github:3001/sse
//   ↑ Docker 内部网络,使用容器名而非 localhost

// ⚠️ 连接后,n8n 自动从 MCP Server 获取可用工具列表:
// - search_repositories: 搜索仓库
// - search_issues: 搜索 Issues
// - create_issue: 创建 Issue
// - get_file_contents: 获取文件内容
// - list_commits: 列出提交历史
// ... (共 20+ 工具,全部自动发现!)

// 你不需要手写 Tool Description!
// MCP Server 的自描述能力让 Agent 自动理解每个工具的用途

3. 实战对话演示

sequenceDiagram
    participant User as 👤 用户
    participant Agent as 🤖 Agent
    participant LLM as 🧠 GPT-4o
    participant MCP as 🔌 MCP Client
    participant GH as 🐙 GitHub Server
    
    User->>Agent: "帮我查一下 n8n-io/n8n 仓库
最近有没有关于 MCP 的 Issue" Agent->>LLM: 分析意图 + MCP 工具列表 LLM-->>Agent: Tool Call: search_issues
{repo: "n8n-io/n8n", query: "MCP"} Agent->>MCP: 转发 Tool Call MCP->>GH: JSON-RPC: search_issues(...) GH-->>MCP: 返回 5 条匹配的 Issues MCP-->>Agent: 结果集 Agent->>LLM: 整合结果生成回复 LLM-->>Agent: 格式化的 Issue 列表 Agent-->>User: "找到 5 条相关 Issue:
1. #12345 MCP Server support
2. #12346 MCP Client improvements..."

4. 安全注意事项

graph TB
    subgraph "MCP 安全模型"
        Agent[🤖 Agent] --> MCP[🔌 MCP Client]
        
        MCP --> Auth["🔐 认证层
Token / API Key"] Auth --> Scope["📏 权限范围
只读 vs 读写"] Scope --> Audit["📋 审计日志
记录所有工具调用"] end style Auth fill:#ef4444,stroke:#dc2626,color:#fff
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// MCP 安全最佳实践
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 1. 最小权限: GitHub Token 只授予必要的 scope
//    - repo (读写仓库) → 只在需要创建 Issue 时授予
//    - read:org (只读组织) → 大多数场景足够

// 2. 文件系统隔离: 只挂载特定目录
//    volumes: - ./shared-data:/data
//    ❌ 千万不要挂载 / 或 /home

// 3. 网络隔离: MCP Server 只在 Docker 内部网络可访问
//    不暴露到公网 (不映射端口到 0.0.0.0)

下一步

Ep 23 将反转角色——把 n8n 工作流暴露为 MCP Server,让 Claude Desktop/Cursor 等外部 Agent 调用你的工作流。