2.4 MCP Server Integration
Những gì cần nắm
Phần tiêu đề “Những gì cần nắm”MCP (Model Context Protocol) server mở rộng năng lực của Claude bằng cách nối nó với hệ thống bên ngoài — database, API, công cụ phát triển, hệ quản lý issue. Cấu hình đúng hay không quyết định team của bạn dùng chung một bộ tool nhất quán hay rơi vào mớ cấu hình hỗn loạn.
Phân cấp phạm vi cấu hình
Phần tiêu đề “Phân cấp phạm vi cấu hình”Cấu hình MCP server nằm ở hai cấp, và lẫn lộn hai cấp này là nguồn gốc của phần lớn rắc rối khi thiết lập.
Cấp project: .mcp.json Nằm ở thư mục gốc của repository. Được quản lý version. Chia sẻ với mọi thành viên clone hoặc pull repository. Dùng cho những server cả team cần — tích hợp Jira, bộ tool GitHub, các connector API nội bộ.
{ "mcpServers": { "github": { "type": "http", "url": "https://api.githubcopilot.com/mcp/" }, "atlassian": { "type": "http", "url": "https://mcp.atlassian.com/v1/mcp/authv2" }, "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "${WORKSPACE_ROOT:-.}"] } }}Để ý hai dạng entry. Server từ xa khai báo "type": "http" kèm url. Server cục bộ khai báo command và args, giao tiếp qua stdio. Một entry có url nhưng thiếu type là lỗi cấu hình — Claude Code đọc nó như server stdio, bỏ qua, và báo bạn thêm type vào. Cả GitHub lẫn Atlassian giờ đều có server remote chính thức, nên không cái nào là dòng npx.
Cấp user: ~/.claude.json Nằm trong thư mục home của người dùng. Mang tính cá nhân. KHÔNG được quản lý version. KHÔNG chia sẻ với đồng đội. Dùng cho server thử nghiệm, tích hợp cá nhân, hoặc server bạn đang thử trước khi đề xuất cho team.
Nguyên tắc chính: mọi tool từ mọi server đã cấu hình (cả cấp project lẫn cấp user) đều được khám phá lúc kết nối và sẵn dùng đồng thời. Không có bước kích hoạt thủ công nào — nếu một server đã cấu hình và kết nối được, tool của nó xuất hiện trong bộ tool của agent.
Mở rộng biến môi trường
Phần tiêu đề “Mở rộng biến môi trường”File .mcp.json hỗ trợ cú pháp ${VARIABLE_NAME} để mở rộng biến môi trường. Đây là cách giữ credential nằm ngoài version control mà vẫn chia sẻ được cấu hình server với cả team.
{ "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}", "DATABASE_URL": "${DATABASE_URL}" }}Mỗi developer tự đặt token của mình ở máy (trong shell profile, file .env, hay secrets manager). File .mcp.json chỉ tham chiếu tên biến, không chứa giá trị. Nghĩa là:
- File cấu hình an toàn để commit vào version control
- Mỗi developer xác thực bằng credential riêng
- Xoay vòng token không cần sửa file cấu hình
- Không có secret nào rò qua lịch sử repository
Có một dạng thứ hai đáng biết: ${VAR:-default} cho ra giá trị của VAR khi biến được đặt và rơi về default khi không. Dùng nó cho các đường dẫn phụ thuộc máy nhưng có giá trị mặc định hợp lý, như tham số ${WORKSPACE_ROOT:-.} ở trên. Tính đến 14/8/2026, một biến chưa đặt mà không có default không làm phần cấu hình còn lại ngừng nạp. Claude Code cảnh báo rồi đi tiếp, nên đừng trông chờ token thiếu sẽ báo lỗi ầm ĩ.
MCP resources
Phần tiêu đề “MCP resources”MCP resources phơi bày danh mục nội dung cho agent mà không cần agent phải gọi tool thăm dò. Thay vì gọi một tool để biết có dữ liệu gì, agent nhận được thông tin đó ngay từ đầu.
Đó là cách exam guide diễn đạt và cũng là đáp án được chấm. Một điểm chính xác hơn từ đặc tả MCP (tháng 9/2026): resources do phía ứng dụng kiểm soát. Server liệt kê chúng, nhưng client mới quyết định khi nào gắn một resource vào context của model, nên agent chỉ thấy resource khi host đưa ra. Claude Code làm chuyện đó qua cú nhắc @server:resource và một tool liệt kê resource.
Ví dụ những thứ nên phơi ra dạng resource:
- Tóm tắt issue — danh sách issue Jira hiện tại kèm tiêu đề và trạng thái
- Cây tài liệu — mục lục cho bộ tài liệu nội bộ
- Schema database — tên bảng, kiểu cột, và quan hệ
Cái lợi là bớt hẳn những lệnh gọi vô ích. Không có resources, agent có thể phải gọi list_tables, rồi describe_table cho từng bảng, đốt lệnh gọi tool chỉ để định vị. Có resource schema database, nó biết ngay.
Resources cho agent thấy có dữ liệu gì. Tools cho nó tác động lên dữ liệu đó.
Quyết định build hay dùng sẵn
Phần tiêu đề “Quyết định build hay dùng sẵn”Quyết định này xuất hiện liên tục, cả trong đề thi lẫn công việc thật. Team bạn cần tích hợp với một hệ thống bên ngoài: tự build MCP server hay dùng server community có sẵn?
Dùng server community cho các tích hợp tiêu chuẩn:
- Jira, GitHub, Slack, Linear, Notion — tất cả đều có MCP server community được bảo trì
- Chúng phủ các use case tiêu chuẩn, được cộng đồng kiểm chứng, và có cập nhật
- Dùng chúng tiết kiệm thời gian phát triển và gánh nặng bảo trì
Chỉ tự build khi:
- Team bạn có workflow đặc thù mà server community không kham nổi
- Bạn cần nhúng logic nghiệp vụ riêng vào tầng tool
- Bạn phải tích hợp với hệ thống nội bộ độc quyền, không có server community nào
Đề thi luôn nghiêng về lựa chọn thực dụng. “Đánh giá server community trước” luôn đúng khi đụng một tích hợp tiêu chuẩn. “Tự build” chỉ đúng khi tình huống nói rõ có yêu cầu đặc thù của team mà server community không đáp ứng.
Nâng chất lượng description cho MCP tool
Phần tiêu đề “Nâng chất lượng description cho MCP tool”Đây là điểm khá kín: khi một MCP tool có description sơ sài, agent có thể ưu tiên built-in tool (như Grep) ngay cả khi MCP tool mạnh hơn. Đơn giản vì model có nhiều ngữ cảnh hơn về built-in tool — description của chúng phong phú và chi tiết.
Cách sửa: viết lại description cho MCP tool để giải thích kỹ năng lực và output. Thay vì:
search_codebase: "Searches code"Hãy viết:
search_codebase: "Performs semantic code search across theentire repository using AST-aware indexing. Returns matchingfunctions, classes, and methods with full context includingfile path, line numbers, and surrounding code. More accuratethan text-based grep for finding code by intent rather thanexact string match. Use this instead of Grep when searchingfor code by what it does rather than what it contains."Description đã nâng cấp cho model đủ ngữ cảnh để ưu tiên MCP tool khi nó thực sự mạnh hơn phương án built-in.
Bẫy thi
Phần tiêu đề “Bẫy thi”Tình huống luyện tập
Phần tiêu đề “Tình huống luyện tập”Một team cần tích hợp với Jira để quản lý issue trong workflow Claude Code. Một developer đề xuất tự build MCP server. Bước đầu tiên đúng là gì?
- A. Tự build một MCP server phơi ra đúng những endpoint Jira API mà team cần, để tích hợp khớp chính xác workflow của họ
- B. Thêm tích hợp Jira vào ~/.claude.json để mỗi developer tự cấu hình kết nối Jira riêng
- C. Gọi thẳng Jira REST API từ lệnh Bash thay vì dùng MCP, khỏi phải dựng server và cấu hình cho nó
- D. Đánh giá các MCP server community sẵn có cho Jira, chỉ tự build nếu chúng không kham nổi workflow đặc thù của team
Đáp án & giải thích
Đúng: D
- A — Tự build là quá sớm. MCP server community cho Jira đã có và phủ các use case tiêu chuẩn. Tự build nên để dành cho workflow đặc thù của team mà server community không kham nổi.
- B — Tích hợp dùng chung cả team nên nằm trong .mcp.json ở cấp project để được quản lý version và chia sẻ cho mọi developer. ~/.claude.json dành cho server cá nhân.
- C — Gọi API trực tiếp bỏ qua MCP tool interface, mất luôn lợi ích của tool description, response có cấu trúc và tích hợp thuận với agent.
- D — Server community luôn nên là lựa chọn đầu tiên cho tích hợp tiêu chuẩn. Chúng được bảo trì, được kiểm chứng và phủ các use case phổ biến. Tự build chỉ chính đáng khi server community không đáp ứng được yêu cầu đặc thù của team.
Nguồn
Phần tiêu đề “Nguồn”- Claude Certified Architect Foundations Exam Guide — Domain 2, Task Statement 2.4 — Anthropic
- MCP Server Configuration — Claude Code Documentation — Anthropic
- Model Context Protocol — Resources — Model Context Protocol
Exam Simulator
Phần tiêu đề “Exam Simulator”Năm câu trắc nghiệm theo format đề thi về MCP Server Integration. Chọn đáp án trước, rồi mở phần giải thích.
Câu 1
Phần tiêu đề “Câu 1”Một team cần tích hợp với Jira để quản lý issue trong workflow Claude Code. Một developer đề xuất tự build MCP server. Bước đầu tiên đúng là gì?
- A. Đánh giá các MCP server community sẵn có cho Jira, và chỉ tự build nếu không cái nào phủ được workflow của team
- B. Tự build một MCP server với đúng các API endpoint mà team cần
- C. Gọi thẳng Jira REST API từ lệnh Bash thay vì đi qua MCP, khỏi cần server luôn
- D. Thêm tích hợp Jira vào ~/.claude.json để mỗi developer tự cấu hình riêng
Đáp án & giải thích
Đúng: A
- A đúng vì với một tích hợp tiêu chuẩn thì server community là thứ nên với tới trước. Chúng được bảo trì, được kiểm chứng và đã phủ các ca phổ biến, nên tự build chỉ chính đáng ở chỗ yêu cầu đặc thù của team thực sự không được đáp ứng.
- B sai vì tự build trước khi tìm hiểu là quá sớm. MCP server community cho Jira đã có và xử lý được các use case tiêu chuẩn.
- C sai vì gọi API trực tiếp bỏ qua MCP tool interface, đánh đổi mất tool description, response có cấu trúc và tích hợp thuận với agent.
- D sai vì một tích hợp dùng chung cả team thuộc về .mcp.json ở cấp project, nơi nó được quản lý version và chia sẻ. ~/.claude.json dành cho server cá nhân.
Câu 2
Phần tiêu đề “Câu 2”Một developer commit đoạn sau vào .mcp.json: {“env”: {“GITHUB_TOKEN”: “ghp_abc123xyz789”}}. Vấn đề bảo mật ở đây là gì?
- A. Định dạng token không hợp lệ với GitHub
- B. Token nên nằm trong ~/.claude.json chứ không phải .mcp.json
- C. Credential nguyên văn bị commit vào version control thay vì dùng mở rộng ${GITHUB_TOKEN}
- D. env không phải field hợp lệ trong .mcp.json, nên cấu hình sẽ bị bỏ qua trong im lặng lúc server khởi động
Đáp án & giải thích
Đúng: C
- C đúng vì một credential viết thẳng vào .mcp.json sẽ đi vào lịch sử repository và ai có quyền truy cập đều đọc được, kể cả sau khi nó bị xóa. Cú pháp ${GITHUB_TOKEN} giữ giá trị đó nằm trên máy từng developer.
- A sai vì token đúng cú pháp, tiền tố ghp_ và tất cả. Vấn đề là nó bị lộ, không phải nó dị dạng.
- B sai vì dời file không giúp gì khi giá trị vẫn hard-code. Cách sửa là mở rộng biến môi trường, không phải đổi chỗ đặt.
- D sai vì env là field hợp lệ. Chỗ sai nằm ở giá trị nó chứa, không nằm ở cái key.
Câu 3
Phần tiêu đề “Câu 3”Một agent gọi 5 lệnh tool chỉ để hiểu cấu trúc database: list_tables, rồi describe_table cho từng bảng trong 4 bảng. Tính năng MCP nào giảm được những lệnh gọi thăm dò này?
- A. Cache response của tool ở phía server để mọi yêu cầu schema sau đó trả về nhanh hơn
- B. Thêm một tool get_full_schema trả về mô tả mọi bảng trong một lệnh gọi ngay từ đầu
- C. Nhét schema vào system prompt để agent biết cấu trúc trước khi bắt tay vào việc
- D. Phơi schema database ra dạng MCP resource, để nó sẵn có mà không tốn lệnh gọi tool nào
Đáp án & giải thích
Đúng: D
- D đúng vì MCP resources phơi ra một danh mục nội dung, mà schema database là ca kinh điển, ngay lúc kết nối. Cấu trúc đơn giản là đã có sẵn, nên list_tables và describe_table không cần chạy.
- A sai vì cache làm nhanh các lệnh gọi lặp lại nhưng vẫn để nguyên năm lệnh đầu, mà năm lệnh đầu mới là thứ đang phải trả giá ở đây.
- B sai vì một lệnh gọi tốt hơn năm nhưng vẫn là một lệnh gọi. Một resource cung cấp cùng thông tin đó mà không tốn lệnh nào.
- C sai vì system prompt không phải chỗ cho dữ liệu có cấu trúc. Nó tốn context token ở mọi request và lỗi thời ngay khi schema đổi.
Câu 4
Phần tiêu đề “Câu 4”Một team có server cấp project trong .mcp.json và một developer có server cá nhân trong ~/.claude.json. Khi Claude Code kết nối, những tool nào sẵn dùng?
- A. Chỉ tool cấp project, vì .mcp.json được ưu tiên hơn cấu hình user
- B. Mọi tool từ cả hai cấp, được khám phá lúc kết nối và sẵn dùng cùng lúc
- C. Chỉ tool cấp user, vì cấu hình cá nhân đè hoàn toàn lên thiết lập project
- D. Không cái nào, cho tới khi developer kích hoạt tường minh một cấp server cho session hiện tại
Đáp án & giải thích
Đúng: B
- B đúng vì tool từ mọi server đã cấu hình, cấp project lẫn cấp user, đều được khám phá khi Claude Code kết nối và sau đó sẵn dùng cùng nhau. Không cấp nào đè cấp nào và không phải bật gì cả.
- A sai vì server cấp user không bị loại. Cả hai cấp đều đóng góp tool của mình.
- C sai vì server cấp project không bị đè. Cả hai cấp đều đóng góp tool của mình.
- D sai vì không có bước kích hoạt nào. Việc khám phá diễn ra tự động lúc kết nối.
Câu 5
Phần tiêu đề “Câu 5”Một MCP tool tên search_codebase có description “Searches code.” Agent liên tục ưu tiên built-in tool Grep. Vì sao, và sửa thế nào?
- A. MCP tool chậm hơn Grep, nên agent tối ưu theo tốc độ
- B. Description MCP sơ sài thua description chi tiết của Grep, nên hãy mở rộng nó để nói rõ năng lực và output
- C. Built-in tool luôn được ưu tiên hơn MCP tool, bất kể description viết gì
- D. Nên đổi tên tool thành grep_enhanced để báo hiệu nó thay thế Grep built-in
Đáp án & giải thích
Đúng: B
- B đúng vì model ưu tiên tool nó hiểu rõ nhất. Grep đến kèm một description built-in chi tiết, còn “Searches code” gần như chẳng nói gì, nên mở rộng nó để nêu tool trả về gì và khi nào nên ưu tiên nó hơn Grep mới là thứ làm cán cân đổi chiều.
- A sai vì agent không có dữ liệu hiệu năng nào. Nó chọn dựa trên description, không dựa trên tốc độ đo được.
- C sai vì built-in tool không mang mức ưu tiên cố hữu nào. Việc chọn xoay quanh chất lượng description và mức liên quan tới query.
- D sai vì đặt tên một MCP tool để giả làm built-in chỉ thêm rối chứ không bớt. Phần cần sửa là description.