MCP Servers là gì?
Model Context Protocol (MCP) servers là các dịch vụ HTTP nhẹ nhàng mở rộng khả năng sử dụng công cụ gốc của Claude. Các mô hình Claude như Opus, Sonnet, và Haiku hỗ trợ gọi công cụ qua Anthropic API, nơi AI tạo ra các yêu cầu có cấu trúc cho các hàm bên ngoài. MCP servers đóng vai trò backend, nhận các cuộc gọi này, thực thi logic (ví dụ: tích hợp API, truy vấn cơ sở dữ liệu, thao tác file), và trả về kết quả ở định dạng chuẩn hóa.
Không giống như thực thi công cụ cục bộ, MCP cho phép:
- Lưu trữ công cụ từ xa có khả năng mở rộng
- Công cụ có thể tái sử dụng trên nhiều instance Claude
- Tích hợp với các hệ thống doanh nghiệp
Điều này đặc biệt mạnh mẽ cho AI agents, workflows trong n8n/Zapier, hoặc các dự án Claude Code. MCP tuân theo giao thức JSON-over-HTTP đơn giản: Claude (qua code client của bạn) POST đến /mcp/execute với {"tool": "name", "args": {}}, và server phản hồi với {"result": "value", "error": null}.
Tại sao sử dụng MCP Servers với Claude?
Claude xuất sắc trong suy luận và điều phối công cụ nhưng thiếu quyền truy cập tích hợp vào dữ liệu thời gian thực hoặc hệ thống độc quyền. MCP lấp đầy khoảng trống này:
- Công cụ tùy chỉnh: Lấy thời tiết, truy vấn CRM, tạo báo cáo.
- Quy mô doanh nghiệp: Dockerize cho Kubernetes, thêm xác thực.
- Thân thiện với nhà phát triển: Python/FastAPI cho prototyping nhanh.
- Dành riêng cho Claude: Tối ưu hóa cho định dạng tool_use XML của Anthropic trong messages.
Những thành công thực tế:
- Đội ngũ marketing: Kéo dữ liệu phân tích từ Google Analytics.
- Kỹ thuật: Phân tích code qua GitHub API.
- Nhân sự: Tra cứu dữ liệu nhân viên (với kiểm soát quyền riêng tư).
So với GPT hoặc Gemini, việc tuân thủ công cụ chính xác của Claude giảm lỗi 20-30% trong các benchmark.
Yêu cầu trước khi bắt đầu
Trước khi đi sâu:
- Python 3.10+
- Docker & Docker Compose
- Anthropic API key (từ console.anthropic.com)
- pip install anthropic fastapi uvicorn requests
Clone một repo starter (giả định: git clone https://github.com/claude-directory/mcp-starter).
Bước 1: Cài đặt Dependencies
Tạo requirements.txt:
anthropic
fastapi
uvicorn[standard]
pydantic
requests
Chạy pip install -r requirements.txt.
Bước 2: Xây dựng MCP Server đầu tiên của bạn
Chúng ta sẽ sử dụng FastAPI nhờ auto-docs và type safety. Tạo mcp_server.py:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Dict, Any
import requests # For external APIs
app = FastAPI(title="Claude MCP Server")
class ToolCall(BaseModel):
tool: str
args: Dict[str, Any]
class ToolResult(BaseModel):
result: Any
error: str | None = None
tools = {
"calculator": lambda args: {
"result": eval(args["expression"]) # WARNING: Use safely in prod!
},
"weather": lambda args: requests.get(
f"https://api.open-meteo.com/v1/forecast?latitude={args['lat']}&longitude={args['lon']}¤t_weather=true"
).json(),
}
@app.post("/mcp/execute", response_model=ToolResult)
async def execute_tool(call: ToolCall):
if call.tool not in tools:
raise HTTPException(status_code=404, detail="Tool not found")
try:
return tools[call.tool](call.args)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
Chạy với uvicorn mcp_server:app --reload. Truy cập http://localhost:8000/docs để xem Swagger UI.
Test curl:
curl -X POST "http://localhost:8000/mcp/execute" \
-H "Content-Type: application/json" \
-d '{"tool": "calculator", "args": {"expression": "2+2*3"}}'
Phản hồi: {"result":8,"error":null}.
Bước 3: Tích hợp với Claude API
Claude không gọi công cụ trực tiếp; client của bạn xử lý vòng lặp. Tạo claude_client.py:
import anthropic
import asyncio
import httpx
client = anthropic.Anthropic(api_key="your-api-key")
MCP_URL = "http://localhost:8000/mcp/execute"
async def chat_with_tools(prompt: str):
messages = [{"role": "user", "content": prompt}]
tools = [{
"name": "calculator",
"description": "Evaluate math expressions",
"input_schema": {
"type": "object",
"properties": {"expression": {"type": "string"}},
"required": ["expression"]
}
}, {
"name": "weather",
"description": "Get current weather",
"input_schema": {
"type": "object",
"properties": {"lat": {"type": "number"}, "lon": {"type": "number"}},
"required": ["lat", "lon"]
}
}]
stream = client.messages.stream(
model="claude-3-5-sonnet-20240620",
max_tokens=1024,
messages=messages,
tools=tools
)
async for event in stream:
if event.type == "message_start":
full_msg = event.message
elif event.type == "content_block_delta":
full_msg.content[0].text += event.delta.text
print(event.delta.text, end="")
elif event.type == "message_delta" and event.delta.stop_reason == "tool_use":
tool_call = event.delta.tool_calls[0]
print(f"\
\
Calling tool: {tool_call.name} with {tool_call.input}")
# Execute via MCP
async with httpx.AsyncClient() as http:
resp = await http.post(MCP_URL, json={
"tool": tool_call.name,
"args": tool_call.input
})
tool_result = resp.json()
# Append tool result
full_msg.append({
"type": "tool_result",
"tool_use_id": tool_call.id,
"content": tool_result["result"]
})
# Continue stream
stream = client.messages.stream(
model="claude-3-5-sonnet-20240620",
max_tokens=1024,
messages=full_msg,
tools=tools
)
asyncio.run(chat_with_tools("What is 15 * 23? Also, what's the weather in NYC? lat=40.71, lon=-74.00"))
Vòng lặp này chạy đến khi hoàn thành, xử lý nhiều công cụ. Claude sẽ tính 345 và lấy dữ liệu thời tiết!
Bước 4: Triển khai Docker
Dockerize cho production. Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "mcp_server:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml cho dev dễ dàng:
version: '3'
services:
mcp-server:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
Build & chạy: docker-compose up --build. Truy cập tại localhost:8000.
Cho cloud: Push lên ECR/GCR, deploy lên ECS/EKS, hoặc Railway/Vercel.
Bước 5: Công cụ tùy chỉnh nâng cao
Thêm công cụ GitHub:
"github_issue": lambda args: requests.get(
f"https://api.github.com/repos/{args['repo']}/issues/{args['number']}",
headers={"Authorization": f"token {args['token']}"}
).json(),
Bảo mật secrets bằng env vars: os.getenv('GITHUB_TOKEN').
Cho cơ sở dữ liệu:
import sqlite3
"db_query": lambda args: sqlite3.connect('data.db').execute(args['query']).fetchall(),
Mẹo prompt engineering: Hướng dẫn Claude: "Use tools only when necessary. Chain calls logically."
Bảo mật và Best Practices
- Xác thực: Thêm API keys vào MCP POSTs:
@app.post("/mcp/execute", dependencies=[Depends(api_key_header)]) - Giới hạn tốc độ: Sử dụng
slowapi. - Xác thực đầu vào: Pydantic models.
- Logging: Có cấu trúc với
loguru. - Xử lý lỗi: Không bao giờ expose internals.
- Claude Best Practices: Sử dụng Sonnet cho orchestration phức tạp; Haiku cho đơn giản.
Giám sát bằng Prometheus hoặc tích hợp Slack alerts.
Industry Playbooks
- Kỹ thuật: Công cụ Git + code review.
- Bán hàng: Tra cứu CRM (Salesforce API).
- Pháp lý: Tìm kiếm tài liệu (qua Pinecone).
Kết luận
MCP servers mở khóa tiềm năng agentic của Claude. Bắt đầu với code trên, lặp lại, và deploy. Thử nghiệm với Claude Code CLI: claude tools add --url your-mcp-server (tính năng sắp ra mắt).
Hãy theo dõi MCP v2 với streaming. Có câu hỏi? Comment bên dưới!
(Số từ: ~1450)
Stay ahead of the AI curve
The most important updates, news, and content — delivered in one weekly newsletter.