第 22 期:即插即用 — MCP Client Tool 实战连接 GitHub 与文件系统
本期目标
让 n8n Agent 通过 MCP 协议连接两个外部服务,实现:
- 搜索/创建 GitHub Issues
- 读写本地文件系统
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:#fff1. 部署 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 调用你的工作流。