Mình đã làm việc với AI model từ khá sớm, và vấn đề lớn nhất không phải là model thiếu thông minh — mà là model bị cô lập hoàn toàn khỏi dữ liệu thực tế của dự án. Mỗi khi muốn AI phân tích log server, đọc schema database hay kiểm tra file config, mình phải copy-paste thủ công. MCP ra đời để giải quyết đúng điểm đau đó.
Tại sao AI model cần MCP?
Hãy nghĩ về cách một developer junior làm việc trong ngày đầu tiên: họ có kiến thức nền tốt, nhưng chưa biết gì về codebase, database schema hay convention của team. Cần ai đó ngồi onboard, chỉ từng thứ từ đầu.
AI model ở tình trạng tương tự. Claude, GPT hay Gemini đều được train với kiến thức khổng lồ, nhưng chúng không biết:
- File system của máy bạn có gì
- Database production đang chứa schema như thế nào
- API nội bộ của công ty hoạt động ra sao
- GitHub repository hiện tại có những file nào
Trước MCP, mỗi team tự phát minh giải pháp riêng — plugin ad-hoc, custom API wrapper, hay đơn giản là copy-paste. Không có chuẩn nào cả. Mỗi ứng dụng AI có một cách tích hợp khác nhau, không tái sử dụng được.
Anthropic nhận ra vấn đề này. Cuối 2024, họ release MCP như một giao thức mở — chuẩn hóa để giải quyết tận gốc thay vì vá từng chỗ.
MCP là gì — giải thích đơn giản nhất
Về bản chất, MCP là giao thức chuẩn hóa cách AI model giao tiếp với các nguồn dữ liệu và công cụ bên ngoài. Nói ngắn hơn: MCP là “ngôn ngữ chung” — cái mà AI và tools dùng để hiểu nhau.
Nếu quen với kiến trúc web, hình dung MCP như REST API. Nhưng thay vì định nghĩa cách client-server giao tiếp qua HTTP, MCP định nghĩa cách AI model (client) giao tiếp với các data source (server).
Điểm mạnh của MCP là tính modular. Một MCP Server viết một lần, dùng được với mọi AI client hỗ trợ MCP. Bạn viết MCP Server cho database của mình, và cả Claude Desktop, Cursor, Zed đều có thể dùng ngay — không cần viết lại.
Kiến trúc MCP: 3 thành phần cần nắm
Trước khi cài đặt, cần hiểu 3 thành phần chính trong kiến trúc MCP:
MCP Host
Là ứng dụng chứa AI model và khởi tạo kết nối MCP. Ví dụ: Claude Desktop, Cursor IDE, hay ứng dụng bạn tự build. Host chịu trách nhiệm quản lý vòng đời của các MCP connection.
MCP Client
Component nằm trong Host, duy trì kết nối 1-1 với MCP Server. Client xử lý protocol negotiation, gửi request và nhận response theo chuẩn MCP.
MCP Server
Là “đầu nối” phía tools và data. Mỗi MCP Server expose một tập capabilities: Resources (dữ liệu đọc được), Tools (hành động thực thi được), và Prompts (template prompt có sẵn). Server có thể là process riêng chạy local hoặc kết nối qua network.
Luồng hoạt động cơ bản:
AI Model (Host) → MCP Client → [stdio / SSE] → MCP Server → Database / Files / API
Cài đặt môi trường MCP
Cách 1: Dùng Claude Desktop (nhanh nhất để thử nghiệm)
Claude Desktop là MCP Host phổ biến nhất hiện tại. Sau khi cài xong, thêm MCP Server vào file config:
# Mở file config của Claude Desktop
# macOS:
open ~/Library/Application\ Support/Claude/claude_desktop_config.json
# Windows:
# %APPDATA%\Claude\claude_desktop_config.json
File config JSON có cấu trúc:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/projects"
]
}
}
}
Restart Claude Desktop sau khi lưu. Kết nối thành công thì icon MCP xuất hiện ở góc dưới giao diện chat.
Cách 2: Dùng Python MCP SDK (cho developer)
Muốn tích hợp MCP vào ứng dụng Python của mình, cài SDK chính thức:
pip install mcp
# Hoặc dùng uv (khuyến khích)
uv add mcp
Kết nối và gọi tool từ Python:
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp/data"],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# Xem danh sách tools có sẵn
tools = await session.list_tools()
print("Available tools:", [t.name for t in tools.tools])
# Gọi tool đọc file
result = await session.call_tool(
"read_file",
arguments={"path": "/tmp/data/config.txt"}
)
print(result.content)
asyncio.run(main())
Cấu hình chi tiết — kết nối với dữ liệu thực tế
Kết nối PostgreSQL qua MCP
Mình đã áp dụng cách này trên môi trường production và chạy ổn — AI query được schema, xem explain plan, đề xuất index mà không cần mình mô tả thủ công từng table.
pip install mcp-server-postgres
Config trong claude_desktop_config.json:
{
"mcpServers": {
"postgres": {
"command": "python",
"args": ["-m", "mcp_server_postgres"],
"env": {
"POSTGRES_CONNECTION_STRING": "postgresql://user:pass@localhost:5432/mydb"
}
}
}
}
Bảo mật MCP — điều hay bị bỏ qua
MCP Server chạy với quyền của user đang login. Một vài điểm dễ miss:
- Filesystem: Chỉ expose thư mục cần thiết, KHÔNG expose
/hay toàn bộ~ - Database: Tạo user read-only riêng cho MCP, không dùng superuser
- Network MCP: Nếu dùng SSE transport qua network, bắt buộc dùng HTTPS và authentication
-- Tạo user read-only riêng cho MCP
CREATE USER mcp_readonly WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE mydb TO mcp_readonly;
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
Kiểm tra và debug MCP connection
Dùng MCP Inspector
Anthropic cung cấp tool debug chính thức — dùng cái này trước khi bắt đầu viết code:
npx @modelcontextprotocol/inspector npx @modelcontextprotocol/server-filesystem /tmp/test
Inspector mở giao diện web tại http://localhost:5173, cho phép bạn:
- Xem danh sách Resources, Tools, Prompts mà server expose
- Gọi tool trực tiếp và xem response raw
- Theo dõi protocol message theo từng bước
Xem log MCP trong Claude Desktop
# macOS — xem log real-time
tail -f ~/Library/Logs/Claude/mcp-server-filesystem.log
# Xem tất cả MCP logs
ls ~/Library/Logs/Claude/mcp-*.log
Script test kết nối nhanh
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def test_connection():
params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
)
try:
async with stdio_client(params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print(f"OK: {len(tools.tools)} tools available")
for tool in tools.tools:
print(f" - {tool.name}: {tool.description}")
except Exception as e:
print(f"FAIL: {e}")
asyncio.run(test_connection())
Tổng kết
Cái thực sự thuyết phục mình đầu tư thời gian vào MCP không phải bản thân protocol — mà là ecosystem bùng nổ xung quanh nó. Ngay sau khi Anthropic open-source, cộng đồng đã ship hàng trăm MCP Server chỉ trong vài tháng: Slack, GitHub, Google Drive, Notion, AWS, Jira — đủ loại.
Build AI app mà bỏ qua MCP, bạn sẽ tự reinvent bánh xe — theo cách riêng, không compatible với ai. Thay vì tự viết integration layer cho từng data source, cắm thẳng vào ecosystem đó là xong.
Thử ngay: deploy Filesystem MCP Server trỏ vào thư mục dự án, mở Claude Desktop, rồi hỏi “file nào xử lý authentication trong project này?” Câu trả lời sẽ khác hẳn so với khi bạn chat mà không có context.
