MCP — kết nối công cụ ngoài

Bài 10 — MCP — kết nối công cụ ngoài

#Vấn đề: Claude Code bị giới hạn trong terminal

Bạn đang dùng Claude Code để refactor code, chạy test, tạo commit. Năng suất tăng rõ rệt. Nhưng rồi bạn nhận ra một giới hạn lớn:

  • Muốn đọc issue trên GitHub → phải mở browser, copy nội dung, paste vào Claude.
  • Muốn query database để kiểm tra data → phải mở terminal khác, chạy SQL, copy kết quả.
  • Muốn gửi Slack notification khi CI fail → phải tự chạy curl.

Mỗi lần context-switch là một lần mất flow. Claude Code giỏi thao tác với file và terminal, nhưng nó không biết gì về GitHub, database, Slack — trừ khi bạn tự paste dữ liệu vào.

Bạn cần một cách để kéo thế giới bên ngoài vào Claude Code mà không cần copy-paste.

#MCP là gì?

Model Context Protocol (MCP) là một chuẩn mở, được phát triển bởi Anthropic, để kết nối AI tools với các nguồn dữ liệu và dịch vụ bên ngoài.

Hiểu đơn giản: MCP là cổng giao tiếp chuẩn hóa giữa Claude Code và bất kỳ công cụ nào. Thay vì mỗi tool có một cách tích hợp riêng, tất cả đều nói cùng một ngôn ngữ qua MCP.

Claude Code  ←→  MCP Protocol  ←→  MCP Server  ←→  Service bên ngoài

MCP Server là một chương trình chạy cục bộ hoặc từ xa, đóng vai trò trung gian. Nó expose các tools mà Claude Code có thể gọi — giống như API nhưng dành riêng cho AI agent.

Khi bạn kết nối một MCP Server, các tools của nó xuất hiện trong Claude Code với prefix mcp__<server>__<tool>. Ví dụ: kết nối server github sẽ tạo ra các tool như mcp__github__list_issues, mcp__github__create_pr, v.v.

#Tại sao cần MCP?

Không có MCP:

  1. Mở GitHub → tìm issue → copy nội dung
  2. Paste vào Claude Code → "Hãy fix issue này"
  3. Claude sửa code → bạn tự tạo PR trên GitHub
  4. Mở Slack → paste link PR → gửi cho teammate

Có MCP:

  1. "Tìm issue #142 trên GitHub và fix nó"
  2. Claude gọi mcp__github__get_issue → đọc issue → sửa code
  3. Claude gọi mcp__github__create_pr → tạo PR
  4. Claude gọi mcp__slack__send_message → thông báo PR cho team

Bạn ngồi một chỗ, không context-switch. Toàn bộ workflow nằm trong một conversation.

#Cấu hình MCP Server

MCP servers được cấu hình trong settings.json (cùng file với hooks). Cấu trúc cơ bản:

{
  "mcpServers": {
    "server-name": {
      "command": "npx",
      "args": ["-y", "@anthropic/mcp-server-name"],
      "env": {
        "API_KEY": "your-api-key"
      }
    }
  }
}

Các trường chính:

TrườngÝ nghĩa
commandLệnh để khởi động MCP server
argsTham số cho lệnh
envEnvironment variables (API keys, tokens)

Giống hooks, bạn có thể cấu hình ở 3 cấp:

  • ~/.claude/settings.json — toàn cục
  • .claude/settings.json — dự án, commit được
  • .claude/settings.local.json — dự án, chỉ local

#Các MCP server phổ biến

#1. GitHub MCP Server

Kết nối với GitHub: đọc issues, tạo PR, quản lý repos.

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxx"
      }
    }
  }
}

Sau khi cấu hình, bạn có thể nói:

> Liệt kê 5 issue mới nhất trong repo này và tóm tắt nội dung mỗi issue.

Claude sẽ gọi mcp__github__list_issues tự động. Không cần mở browser.

#2. Filesystem MCP Server

Cho phép Claude truy cập các thư mục ngoài project hiện tại:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/path/to/shared-docs",
        "/path/to/another-project"
      ]
    }
  }
}

Hữu ích khi bạn cần Claude đọc docs hoặc code từ project khác mà không cần copy.

#3. PostgreSQL MCP Server

Query database trực tiếp từ Claude Code:

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://user:password@localhost:5432/mydb"
      ]
    }
  }
}

Sau đó:

> Cho tôi biết cấu trúc bảng users và 5 bản ghi gần nhất.

Claude gọi mcp__postgres__query với SQL phù hợp. Kết quả nằm ngay trong context.

#4. Slack MCP Server

Gửi/nhận tin nhắn Slack:

{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-slack"],
      "env": {
        "SLACK_BOT_TOKEN": "xoxb-xxxxxxxxxxxx",
        "SLACK_TEAM_ID": "T0XXXXXXX"
      }
    }
  }
}

#Tools xuất hiện như thế nào?

Khi MCP server chạy thành công, các tools của nó được inject vào tool list của Claude Code. Bạn thấy chúng với format:

mcp__<server-name>__<tool-name>

Ví dụ cụ thể:

  • mcp__github__list_issues — từ server github
  • mcp__postgres__query — từ server postgres
  • mcp__slack__send_message — từ server slack

Agent tự biết khi nào nên gọi tool nào dựa trên context của cuộc trò chuyện. Bạn không cần chỉ định rõ — chỉ cần nói điều bạn muốn, agent sẽ chọn tool phù hợp.

Để kiểm tra server đã kết nối chưa, hỏi Claude:

> Liệt kê tất cả MCP tools hiện có.

⚠️ Cẩn thận: token và credentials

Không bao giờ commit API tokens vào .claude/settings.json trong repo. Sử dụng .claude/settings.local.json (thêm vào .gitignore) hoặc environment variables bên ngoài. Một token GitHub bị leak = toàn bộ repo của bạn bị compromise. Đây không phải lý thuyết — nó xảy ra hàng ngày trên thực tế.

⚠️ Cẩn thận: quyền truy cập quá rộng

Khi cấu hình MCP server, bạn đang cho phép Claude Code truy cập một dịch vụ bên ngoài. Hãy áp dụng nguyên tắc least privilege: chỉ cấp quyền tối thiểu cần thiết. Ví dụ, GitHub token chỉ cần scope repo:read nếu bạn chỉ đọc issues — không cần repo:full hay admin:org. PostgreSQL connection nên dùng user readonly nếu bạn chỉ query data.

#Anti-pattern: cấp quyền quá rộng cho MCP server

Một pattern nguy hiểm phổ biến:

// ĐỪNG làm thế này
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx_with_admin_scope"
      }
    }
  }
}

Token có quyền admin nghĩa là agent có thể: xóa repo, thay đổi settings team, xóa collaborators. Nếu prompt bị injection hoặc agent hiểu sai intent, hậu quả rất lớn.

Giải pháp: tạo token với scope tối thiểu, dùng environment variable thay vì hardcode, và xem xét thêm PreToolUse hook (Bài 9) để chặn các MCP tool call nguy hiểm.

#MCP + Hooks = kiểm soát hoàn chỉnh

Kết hợp hai kiến thức từ Bài 9 và Bài 10:

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "mcp__github__.*",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$CLAUDE_TOOL_NAME\" | grep -qE '(delete_repo|remove_collaborator)' && exit 2 || exit 0"
          }
        ]
      }
    ]
  }
}

MCP mở rộng khả năng, hooks kiểm soát an toàn. Hai thứ này bổ trợ cho nhau.

#Tổng kết

MCP là chuẩn mở để kết nối Claude Code với thế giới bên ngoài — GitHub, database, Slack, và bất kỳ dịch vụ nào có MCP server. Cấu hình trong settings.json với mcpServers. Tools xuất hiện dưới dạng mcp__<server>__<tool> và agent tự chọn khi cần.

Điểm mấu chốt: MCP biến Claude Code từ "công cụ code" thành trung tâm điều khiển workflow. Nhưng quyền lực đi kèm trách nhiệm — luôn áp dụng least privilege và bảo vệ credentials.


Bài tiếp theo: Chúng ta sẽ tổng hợp mọi thứ đã học — từ CLAUDE.md, sub-agents, hooks đến MCP — thành một workflow hoàn chỉnh cho dự án thực tế. Bạn sẽ thấy tất cả piece ghép lại với nhau như thế nào.