Model Context Protocol (MCP) của Anthropic đang cách mạng hóa cách chúng ta kết nối các Mô hình Ngôn ngữ Lớn (LLM) với các dịch vụ bên ngoài. Mặc dù các MCP server hiện có cung cấp khả năng tích hợp dễ dàng, điều gì sẽ xảy ra khi bạn cần các tương tác tùy chỉnh hoặc một dịch vụ không được hỗ trợ? Câu trả lời là tự xây dựng MCP server của riêng bạn. Hướng dẫn này dành cho các nhà phát triển và những người đam mê AI muốn có toàn quyền kiểm soát việc tích hợp LLM của họ. Bạn sẽ tìm hiểu 'tại sao' và 'làm thế nào' để xây dựng các MCP server tùy chỉnh, khám phá các tài nguyên thiết yếu và nhận một template Python sẵn sàng sử dụng được thiết kế theo các phương pháp hay nhất để khởi động quá trình phát triển của bạn.
Sức Mạnh của MCP: Vượt Ngoài Các Công Cụ Có Sẵn
Mọi người đang bắt đầu nhận ra tầm quan trọng của Model Context Protocol (MCP) của Anthropic. Đây là tiêu chuẩn thực sự đầu tiên để kết nối các Mô hình Ngôn ngữ Lớn (LLM) với các dịch vụ của bạn như Gmail, Slack, GitHub, tìm kiếm web—danh sách này còn kéo dài. Bạn có thể sử dụng nó để cung cấp các khả năng ở cấp độ cao hơn cho LLM của mình, như bộ nhớ dài hạn, như chúng ta sẽ thấy ngay sau đây.
Nhiều MCP server đã có sẵn, cho phép chúng ta dễ dàng kết nối LLM với các dịch vụ khác nhau. Ví dụ: thêm Brave Search MCP server cho phép LLM truy cập thông tin web cập nhật, khắc phục giới hạn về kiến thức. Bạn chỉ cần thêm cấu hình của nó vào một MCP client (như Windsurf Cursor, N8N, Claude Desktop, hoặc agent tùy chỉnh của riêng bạn) và cấp quyền.
Đây là một ví dụ về cấu hình đơn giản trong Claude Desktop:
// Ví dụ Cấu hình Claude Desktop với Brave Search
{
"servers": [
{
"name": "brave-search",
"type": "sse", // hoặc "stdio"
"url": "http://localhost:8000", // nếu sử dụng sse
// hoặc "command": ["python", "path/to/brave_server.py"] // nếu sử dụng stdio
"config": {
"api_key": "YOUR_BRAVE_API_KEY"
}
}
// ... các server khác ...
]
}
Sau khi thêm server và API key, Claude Desktop giờ đây có thể sử dụng Brave Search khi cần thiết.
Vấn đề là: Điều gì sẽ xảy ra nếu server hiện có không tương tác với dịch vụ chính xác theo cách bạn cần? Hoặc nếu khả năng bạn muốn không có sẵn MCP server được xây dựng trước?
Đó là nơi sức mạnh thực sự nằm ở: tự xây dựng các MCP server của riêng bạn. Điều này mang lại cho bạn khả năng tùy chỉnh và kiểm soát hoàn toàn để tích hợp bất kỳ dịch vụ nào, điều chỉnh chính xác các khả năng của agent AI của bạn.
Tài Nguyên Thiết Yếu Để Xây Dựng MCP Server
Trước khi bắt đầu, hãy làm quen với MCP. Những tài nguyên này vô cùng quý giá cho việc học hỏi và xây dựng:
- Tài liệu MCP Chính thức: Nguồn chính để hiểu các khái niệm MCP, bao gồm hướng dẫn xây dựng server và client.
- Danh sách các MCP Server Hiện Có trên GitHub: Các điểm tham khảo và ví dụ tuyệt vời để xây dựng server của riêng bạn.
- Repo GitHub của MCP Python SDK: Hướng dẫn cụ thể để xây dựng server bằng ngôn ngữ phổ biến nhất, Python.
Demo: Một Server Tùy Chỉnh Cho Bộ Nhớ Dài Hạn
Để minh họa, hãy xem xét một MCP server tùy chỉnh được xây dựng bằng template được cung cấp sau trong hướng dẫn này. Server này tích hợp với Mem0, một thư viện để thêm bộ nhớ dài hạn cho các agent AI.
Đây là cách nó trông như thế nào trong cấu hình Claude Desktop:
// Ví dụ Cấu hình Claude Desktop với Server Mem0 Tùy Chỉnh
{
"servers": [
// ... các server khác như Brave Search ...
{
"name": "mem0-mcp-server",
"type": "sse",
"url": "http://localhost:8070", // Ví dụ host/port
"config": {}
}
]
}
Khi server này đang chạy và được cấu hình, bạn có thể hỏi Claude Desktop, "Ký ức của tôi là gì?" Nó sẽ sử dụng tool getAllMemories
tùy chỉnh do server của bạn cung cấp để truy xuất thông tin (ví dụ: "Bạn hiện có một ký ức: Bạn thích gà.").
Server tùy chỉnh duy nhất này có thể được sử dụng bởi nhiều MCP client cùng một lúc – Claude Desktop, một agent Pydantic AI, một quy trình N8N – tất cả đều truy cập cùng một khả năng tùy chỉnh mà bạn đã xây dựng.
Điểm Khởi Đầu Của Bạn: Template Python MCP Server
Việc xây dựng server đúng cách đòi hỏi sự hiểu biết về các sắc thái của MCP. Để giúp bạn tiết kiệm công sức và đảm bảo bạn tuân theo các phương pháp hay nhất thường bị bỏ qua ngay cả trong các ví dụ chính thức, tôi đã tạo một template Python MCP server:
➡️ Template MCP Server (Mem0 MCP)
Template này sử dụng tích hợp Mem0 làm ví dụ cụ thể, nhưng nó được cấu trúc để bạn có thể dễ dàng loại bỏ các phần Mem0 và triển khai các tool của riêng mình. Nó cung cấp một nền tảng vững chắc hỗ trợ các giao thức truyền tải MCP khác nhau.
💡 Mẹo Chuyên nghiệp: Các trợ lý lập trình AI rất hữu ích nhưng có thể gặp khó khăn với các chi tiết cụ thể của MCP. Cung cấp mã template này làm ví dụ trong prompt của bạn (cùng với tài liệu chính thức) để có kết quả tốt hơn đáng kể khi yêu cầu AI tạo ra một server tùy chỉnh cho bạn.
Các Khái Niệm Cốt Lõi: Xây Dựng Với Python SDK
Việc xây dựng một MCP server bằng Python rất đơn giản với gói mcp
.
- Cài đặt:
pip install mcp
-
Khởi tạo: Sử dụng
FastMCP
để nhanh chóng thiết lập server của bạn.from mcp import FastMCP mcp = FastMCP(name="my-server", description="My custom MCP server.")
- Thêm Tools: Trang trí (decorate) các hàm Python của bạn bằng
@mcp.tool
.@mcp.tool def calculate_bmi(weight: float, height: float) -> float: """Calculates Body Mass Index (BMI). Provide weight in kg and height in meters.""" if height <= 0: return "Height must be positive." bmi = weight / (height * height) return round(bmi, 2)
- Hàm trở thành một tool có thể được LLM gọi thông qua MCP client.
- LLM sử dụng chữ ký hàm (function signature) và docstring để hiểu cách thức và thời điểm sử dụng tool. Hãy viết docstring rõ ràng, mô tả chi tiết!
Trong khi MCP cũng hỗ trợ thêm prompt, hình ảnh và tài nguyên, tools là cách chính để thêm các khả năng cho agent.
Tận Dụng Hiệu Quả Các Trợ Lý AI
Tài liệu MCP chính thức bao gồm một trang LLM-L.ext tiện dụng với toàn bộ tài liệu ở định dạng Markdown, hoàn hảo để dán vào prompt của LLM. Kết hợp điều này với mã template để có kết quả tốt nhất:
Sử dụng tài liệu MCP được đính kèm ở đây.
Đồng thời, sử dụng MCP server Python này làm ví dụ cho MCP server mà bạn sắp xây dựng:
```python
# [Dán nội dung script Python chính của template vào đây]
Bây giờ tôi muốn xây dựng MCP server của riêng mình để tích hợp với [Dịch vụ/Tool Mục tiêu Của Bạn, ví dụ: API nội bộ, cơ sở dữ liệu cụ thể, v.v.].
## Tìm Hiểu Sâu Về Template: Phân Tích Code
Hãy xem xét các phần chính của [mã template][8] và các phương pháp hay nhất mà nó triển khai:
### 1. Quản lý Vòng đời (Lifespan Management)
Điều này rất quan trọng để quản lý các tài nguyên như kết nối cơ sở dữ liệu hoặc các client API.
```python
import contextlib
from mcp import MCPContext
from mem0 import Memory # Ví dụ import
@contextlib.asynccontextmanager
async def lifespan(context: MCPContext):
# Khởi tạo (các) client MỘT LẦN khi server khởi động
print("Initializing resources...")
mem_client = Memory() # Ví dụ: Khởi tạo client Mem0
context["mem_client"] = mem_client # Lưu trữ trong context cho các tool
print("Mem0 client initialized.")
try:
yield # Server chạy ở đây
finally:
# Các hành động dọn dẹp khi server tắt
print("Closing resources...")
# Ví dụ: await mem_client.close() nếu cần
@contextlib.asynccontextmanager
định nghĩa logic thiết lập và dọn dẹp.- Các client được khởi tạo một lần và lưu trữ trong từ điển
context
. - Các tool truy cập các client được chia sẻ này thông qua đối tượng
context
, tránh việc khởi tạo lại mỗi lần gọi (mô hình singleton).
2. Khởi Tạo Server
Khởi tạo FastMCP
, truyền vào hàm lifespan
và các cấu hình transport (host/port thường được đặt qua biến môi trường).
import os
mcp = FastMCP(
name="mem0-mcp-server",
description="MCP server for Mem0 long-term memory.",
lifespan=lifespan,
host=os.getenv("MCP_HOST", "0.0.0.0"),
port=int(os.getenv("MCP_PORT", 8070))
)
3. Định Nghĩa Tool
Định nghĩa các hàm bất đồng bộ (asynchronous) được trang trí bằng @mcp.tool
.
@mcp.tool
async def save_memory(context: MCPContext, text: str) -> str:
"""Saves a piece of text as a memory."""
try:
mem_client = context["mem_client"] # Truy cập client từ context
response = await mem_client.add(text, user_id="mcp_user")
return f"Memory saved successfully: {response}"
except Exception as e:
return f"Error saving memory: {str(e)}" # Trả về lỗi có thông tin
# ... (các tool khác như get_all_memories, search_memories) ...
- Đối số đầu tiên phải là
context: MCPContext
để truy cập các tài nguyên được chia sẻ. - Các đối số tiếp theo được LLM xác định dựa trên chữ ký hàm và docstring.
- Triển khai xử lý lỗi mạnh mẽ và trả về các thông báo có ý nghĩa cho LLM.
4. Hàm Chính & Xử Lý Transport
Phần này chạy server và quan trọng là hỗ trợ cả hai giao thức truyền tải MCP chính:
- Standard I/O (stdio): Client khởi động server như một tiến trình con (subprocess). Tốt cho các thiết lập chỉ chạy cục bộ.
- Server-Sent Events (SSE): Server chạy độc lập thông qua HTTP. Cần thiết cho việc truy cập qua mạng hoặc các client như N8N.
import os
import uvicorn
if __name__ == "__main__":
transport = os.getenv("MCP_TRANSPORT", "sse").lower()
if transport == "stdio":
print("Running MCP server with Standard I/O transport...")
mcp.run_stdio()
elif transport == "sse":
print(f"Running MCP server with SSE transport on {mcp.host}:{mcp.port}...")
uvicorn.run(mcp, host=mcp.host, port=mcp.port)
else:
print(f"Error: Unknown transport type '{transport}'. Use 'stdio' or 'sse'.")
- Script kiểm tra biến môi trường
MCP_TRANSPORT
(mặc định làsse
). - Nó gọi phương thức chạy thích hợp (
mcp.run_stdio()
hoặcuvicorn.run(mcp, ...)
). - Hỗ trợ cả hai làm cho server của bạn linh hoạt hơn nhiều.
Thiết Lập và Chạy Template
File README của template cung cấp hướng dẫn chi tiết để thiết lập:
- Cài đặt: Thiết lập môi trường Python hoặc sử dụng Dockerfile được cung cấp (khuyến nghị để đảm bảo tính nhất quán).
- Biến Môi trường: Cấu hình file
.env
choMCP_TRANSPORT
,MCP_HOST
,MCP_PORT
, và bất kỳ API key nào mà các tool của bạn yêu cầu. - Chạy: Các lệnh được cung cấp cho cả việc thực thi Python trực tiếp và Docker, bao gồm các transport
stdio
vàsse
.
Ví dụ: Chạy với Docker (SSE trên cổng 8070)
# 1. Build image
docker build -t mcp-mem0-server .
# 2. Chạy container (đảm bảo .env đặt MCP_TRANSPORT=sse, MCP_PORT=8070)
docker run -p 8070:8070 --env-file .env mcp-mem0-server
Server của bạn hiện đang chạy và có thể truy cập tại http://localhost:8070
(hoặc host/port bạn đã cấu hình).
Kết Nối Các Client Của Bạn
Sau khi chạy, hãy cấu hình các MCP client của bạn (Claude Desktop, N8N, các agent tùy chỉnh) để trỏ đến địa chỉ của server (lệnh stdio
hoặc url
SSE). Bạn có thể kiểm tra bằng cách đặt câu hỏi mà sẽ kích hoạt các tool tùy chỉnh của bạn, chẳng hạn như hỏi server Mem0 về ký ức hoặc yêu cầu nó lưu ký ức mới.
Kết Luận
Việc xây dựng MCP server của riêng bạn mở ra vô số khả năng để tùy chỉnh và nâng cao các agent AI của bạn. Bằng cách tận dụng Python SDK và tuân theo các phương pháp hay nhất (như trong template được cung cấp), bạn có thể kết nối LLM của mình với hầu như bất kỳ dịch vụ hoặc khả năng nào bạn cần. Hãy thoải mái sử dụng và điều chỉnh template – nó được thiết kế để trở thành điểm khởi đầu hoàn hảo cho hành trình phát triển MCP của bạn.