MCP vs Custom Tool Use — Khi nào dùng gì? Hướng dẫn quyết định
Điểm nổi bật
Nhấn để đến mục tương ứng
- 1 Thời gian setup: 2-4 giờ cho server đầu tiên, nhanh hơn cho các server tiếp theo Chi phí vận hành Custom Tools: Chi phí nằm trong ứng dụng chính, không có thêm infrastructure MCP: Cần quản lý thêm process, monitoring, logging cho mỗi server.
- 2 Claude sẽ trả về tool call khi cần, và ứng dụng của bạn thực thi tool đó rồi gửi kết quả lại cho Claude.
- 3 Khi xây dựng ứng dụng AI với Claude, bạn có hai lựa chọn chính để mở rộng khả năng của model: MCP (Model Context Protocol) và Custom Tool Use thông qua API.
- 4 MCP thêm một lớp abstraction giữa Claude và logic xử lý, trong khi Custom Tools cho phép ứng dụng trực tiếp điều phối mọi thứ.
- 5 Với Custom Tools, luồng xử lý: Claude trả về tool_use trong response, ứng dụng của bạn parse response, thực thi logic, rồi gửi tool_result trong request tiếp theo.
Khi xây dựng ứng dụng AI với Claude, bạn có hai lựa chọn chính để mở rộng khả năng của model: MCP (Model Context Protocol) và Custom Tool Use thông qua API. Cả hai đều cho phép Claude tương tác với hệ thống bên ngoài, nhưng kiến trúc, trải nghiệm phát triển và trường hợp sử dụng tối ưu khác nhau đáng kể. Bài viết này giúp bạn đưa ra quyết định đúng đắn cho từng tình huống cụ thể.
Tổng quan hai cách tiếp cận
MCP (Model Context Protocol)
MCP là giao thức chuẩn hóa cho phép Claude kết nối với các server bên ngoài thông qua một lớp abstraction. MCP server chạy như một process riêng biệt, cung cấp tools, resources và prompts cho Claude thông qua giao thức JSON-RPC.
Đặc điểm chính:
- Server chạy độc lập, giao tiếp qua stdio hoặc HTTP
- Một server có thể phục vụ nhiều client (Claude Code, Claude Desktop, IDE extensions)
- Hệ sinh thái mở với hàng trăm server có sẵn
- Hỗ trợ tools, resources (dữ liệu tĩnh) và prompts (template)
- Cần cài đặt và cấu hình server riêng
Custom Tool Use (API)
Custom Tool Use là tính năng built-in của Claude API, cho phép bạn định nghĩa tools trực tiếp trong API request. Claude sẽ trả về tool call khi cần, và ứng dụng của bạn thực thi tool đó rồi gửi kết quả lại cho Claude.
Đặc điểm chính:
- Định nghĩa tool ngay trong API request dưới dạng JSON Schema
- Ứng dụng của bạn chịu trách nhiệm thực thi tool
- Không cần server riêng, logic nằm trong ứng dụng chính
- Kiểm soát hoàn toàn luồng xử lý
- Tích hợp trực tiếp với business logic hiện có
So sánh chi tiết
Kiến trúc
Sự khác biệt cốt lõi nằm ở kiến trúc. MCP thêm một lớp abstraction giữa Claude và logic xử lý, trong khi Custom Tools cho phép ứng dụng trực tiếp điều phối mọi thứ.
// MCP Architecture
Claude --[JSON-RPC]--> MCP Server --[Business Logic]--> External Service
// Custom Tool Use Architecture
Claude --[API Response]--> Your App --[Business Logic]--> External Service
Với MCP, luồng xử lý: Claude gọi tool qua MCP protocol, MCP server nhận request, thực thi logic và trả kết quả. Ứng dụng của bạn không can thiệp vào quá trình này.
Với Custom Tools, luồng xử lý: Claude trả về tool_use trong response, ứng dụng của bạn parse response, thực thi logic, rồi gửi tool_result trong request tiếp theo. Bạn kiểm soát hoàn toàn từng bước.
Trải nghiệm phát triển
Hai cách tiếp cận mang lại trải nghiệm phát triển rất khác nhau:
MCP - Ví dụ tạo tool đọc database:
// mcp-server/src/index.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { Pool } from "pg";
const server = new McpServer({
name: "database-reader",
version: "1.0.0",
});
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
server.tool(
"query_users",
"Truy van danh sach nguoi dung theo dieu kien",
{
status: z.enum(["active", "inactive"]).optional(),
limit: z.number().default(10),
},
async ({ status, limit }) => {
let query = "SELECT id, name, email, status FROM users";
const params: any[] = [];
if (status) {
query += " WHERE status = $1";
params.push(status);
}
query += " LIMIT $" + (params.length + 1);
params.push(limit);
const result = await pool.query(query, params);
return {
content: [{ type: "text", text: JSON.stringify(result.rows) }],
};
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
Custom Tool Use - Cùng chức năng:
// app.ts - Custom Tool Use
import Anthropic from "@anthropic-ai/sdk";
import { Pool } from "pg";
const client = new Anthropic();
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
// Dinh nghia tool
const tools = [{
name: "query_users",
description: "Truy van danh sach nguoi dung theo dieu kien",
input_schema: {
type: "object",
properties: {
status: {
type: "string",
enum: ["active", "inactive"],
description: "Trang thai nguoi dung"
},
limit: {
type: "number",
description: "So luong toi da",
default: 10
}
}
}
}];
// Xu ly tool call
async function handleToolCall(name: string, input: any) {
if (name === "query_users") {
let query = "SELECT id, name, email, status FROM users";
const params: any[] = [];
if (input.status) {
query += " WHERE status = $1";
params.push(input.status);
}
query += " LIMIT $" + (params.length + 1);
params.push(input.limit || 10);
const result = await pool.query(query, params);
return JSON.stringify(result.rows);
}
throw new Error("Unknown tool: " + name);
}
// Agentic loop
async function chat(userMessage: string) {
const messages: any[] = [{ role: "user", content: userMessage }];
while (true) {
const response = await client.messages.create({
model: "claude-sonnet-4-20250514",
max_tokens: 4096,
tools: tools,
messages: messages,
});
if (response.stop_reason === "end_turn") {
return response.content;
}
// Xu ly tool calls
messages.push({ role: "assistant", content: response.content });
const toolResults = [];
for (const block of response.content) {
if (block.type === "tool_use") {
const result = await handleToolCall(block.name, block.input);
toolResults.push({
type: "tool_result",
tool_use_id: block.id,
content: result,
});
}
}
messages.push({ role: "user", content: toolResults });
}
}
Ma trận quyết định
Dựa trên các tiêu chí quan trọng, dưới đây là ma trận giúp bạn chọn đúng cách tiếp cận:
Chọn MCP khi:
- Cần tái sử dụng tool trên nhiều ứng dụng hoặc nhiều client (Claude Code, Claude Desktop, IDE)
- Muốn chia sẻ tool với cộng đồng hoặc team khác
- Tool có logic phức tạp, cần chạy như service riêng
- Cần cả tools, resources và prompts trong cùng một package
- Đang xây dựng developer platform hoặc integration marketplace
Chọn Custom Tool Use khi:
- Xây dựng ứng dụng sản phẩm cụ thể (chatbot, assistant)
- Cần kiểm soát hoàn toàn luồng xử lý tool
- Tool đơn giản, logic ít, không cần tái sử dụng
- Muốn giảm thiểu infrastructure (không cần server riêng)
- Cần tích hợp chặt chẽ với business logic hiện có
- Quan tâm đến latency tối thiểu
Hybrid Approach — Kết hợp cả hai
Trong thực tế, nhiều dự án sử dụng kết hợp cả MCP và Custom Tools. Đây không phải quyết định either/or mà thường là both/and.
Khi nào dùng hybrid
- MCP cho các integration chuẩn (database, file system, API phổ biến)
- Custom Tools cho business logic riêng biệt của ứng dụng
// Hybrid approach
// 1. MCP servers cho cac integration chuan
// .mcp.json
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"]
},
"filesystem": {
"command": "npx",
"args": ["@modelcontextprotocol/server-filesystem", "/data"]
}
}
}
// 2. Custom tools cho business logic rieng
const businessTools = [
{
name: "calculate_shipping",
description: "Tinh phi van chuyen theo dia chi va trong luong",
input_schema: {
type: "object",
properties: {
from_province: { type: "string" },
to_province: { type: "string" },
weight_kg: { type: "number" },
service_type: {
type: "string",
enum: ["standard", "express", "same_day"]
}
},
required: ["from_province", "to_province", "weight_kg"]
}
},
{
name: "check_inventory",
description: "Kiem tra ton kho san pham",
input_schema: {
type: "object",
properties: {
sku: { type: "string" },
warehouse_id: { type: "string" }
},
required: ["sku"]
}
}
];
Migration: Từ Custom Tools sang MCP
Nếu bạn đang sử dụng Custom Tools và muốn chuyển sang MCP để tái sử dụng hoặc chia sẻ, quy trình migration khá straightforward:
Bước 1: Xác định tools cần migrate
Không phải tất cả custom tools đều nên chuyển sang MCP. Ưu tiên migrate các tool có đặc điểm sau:
- Được sử dụng ở nhiều nơi trong codebase
- Có tiềm năng chia sẻ với team khác
- Logic độc lập, không phụ thuộc vào business state cụ thể
Bước 2: Chuyển đổi tool definition
// TRUOC: Custom Tool definition
const tool = {
name: "search_products",
description: "Tim kiem san pham theo tu khoa",
input_schema: {
type: "object",
properties: {
query: { type: "string" },
category: { type: "string" },
max_price: { type: "number" }
},
required: ["query"]
}
};
// SAU: MCP Tool definition
server.tool(
"search_products",
"Tim kiem san pham theo tu khoa",
{
query: z.string().describe("Tu khoa tim kiem"),
category: z.string().optional().describe("Danh muc san pham"),
max_price: z.number().optional().describe("Gia toi da"),
},
async ({ query, category, max_price }) => {
// Logic giu nguyen, chi thay doi cach wrap result
const results = await searchProducts(query, category, max_price);
return {
content: [{ type: "text", text: JSON.stringify(results) }],
};
}
);
Bước 3: Kiểm tra tương thích
Sau khi migrate, cần kiểm tra kỹ:
- Schema validation hoạt động đúng (MCP dùng Zod, Custom Tools dùng JSON Schema)
- Error handling phù hợp với MCP protocol
- Kết quả trả về format đúng (
contentarray vớitypevàtext)
So sánh hiệu suất
Hiệu suất là yếu tố quan trọng khi chọn giữa hai cách tiếp cận. Dưới đây là phân tích chi tiết:
Latency
- Custom Tools: Thấp hơn vì không có overhead giao tiếp giữa các process. Tool execution xảy ra trong cùng process với ứng dụng
- MCP (stdio): Thêm overhead nhỏ do serialization/deserialization JSON-RPC và IPC. Thường khoảng 5-20ms thêm
- MCP (HTTP/SSE): Thêm overhead network, phụ thuộc vào latency mạng. Khoảng 20-100ms thêm cho local, cao hơn cho remote
Memory
- Custom Tools: Mọi thứ trong cùng process, chia sẻ memory
- MCP: Mỗi server là process riêng, tiêu tốn thêm memory. Một MCP server nhỏ thường dùng 30-80MB RAM
Scalability
- Custom Tools: Scale cùng ứng dụng, phù hợp cho monolithic architecture
- MCP: Mỗi server scale độc lập, phù hợp cho microservices architecture
So sánh chi phí
Ngoài hiệu suất, chi phí cũng là yếu tố quan trọng:
Chi phí phát triển
- Custom Tools: Nhanh hơn cho prototype và MVP. Không cần setup server riêng, không cần học MCP protocol. Thời gian setup: 30 phút - 2 giờ
- MCP: Tốn thời gian ban đầu nhiều hơn nhưng tiết kiệm về lâu dài nhờ tái sử dụng. Thời gian setup: 2-4 giờ cho server đầu tiên, nhanh hơn cho các server tiếp theo
Chi phí vận hành
- Custom Tools: Chi phí nằm trong ứng dụng chính, không có thêm infrastructure
- MCP: Cần quản lý thêm process, monitoring, logging cho mỗi server. Nếu dùng remote MCP, cần server hoặc container riêng
Chi phí API
Cả hai cách tiếp cận đều tiêu tốn tokens tương đương khi giao tiếp với Claude API. Tool definitions (dù MCP hay Custom) đều được gửi trong context và tính vào input tokens.
5 Kịch bản thực tế với đề xuất
Kịch bản 1: Chatbot hỗ trợ khách hàng cho e-commerce
Yêu cầu: Tra cứu đơn hàng, kiểm tra tồn kho, tính phí vận chuyển, tạo yêu cầu đổi trả.
Đề xuất: Custom Tool Use
Lý do: Logic gắn chặt với business domain cụ thể, không cần tái sử dụng cho ứng dụng khác, cần kiểm soát chặt luồng xử lý (ví dụ xác thực khách hàng trước khi cho phép tra cứu đơn hàng). Latency thấp quan trọng vì đây là ứng dụng real-time.
Kịch bản 2: Developer tool tích hợp database cho team
Yêu cầu: Query database, xem schema, chạy migrations, tạo seed data.
Đề xuất: MCP
Lý do: Nhiều developer trong team sẽ dùng, mỗi người qua Claude Code hoặc IDE khác nhau. MCP server chạy một lần, phục vụ tất cả. Đã có sẵn MCP server cho PostgreSQL, MySQL, MongoDB trong ecosystem.
Kịch bản 3: Ứng dụng phân tích dữ liệu nội bộ
Yêu cầu: Đọc dữ liệu từ Google Sheets, query BigQuery, tạo biểu đồ, gửi báo cáo qua Slack.
Đề xuất: Hybrid
Lý do: Sử dụng MCP server có sẵn cho Google Sheets, BigQuery, Slack. Custom tools cho logic phân tích và tạo báo cáo riêng biệt. Đây là trường hợp điển hình cho hybrid approach.
Kịch bản 4: MVP chatbot cho startup
Yêu cầu: Trả lời FAQ, đặt lịch hẹn, gửi email xác nhận. Team nhỏ, cần ship nhanh.
Đề xuất: Custom Tool Use
Lý do: Đơn giản, nhanh triển khai, không cần infrastructure thêm. Khi sản phẩm trưởng thành và phức tạp hơn, có thể migrate dần sang MCP cho các tool được dùng lại.
Kịch bản 5: Platform AI cho doanh nghiệp lớn
Yêu cầu: Nhiều ứng dụng AI nội bộ, mỗi ứng dụng cần truy cập các hệ thống khác nhau (SAP, Salesforce, JIRA, nội bộ). 50+ developer sử dụng.
Đề xuất: MCP
Lý do: Tái sử dụng tool trên nhiều ứng dụng, chuẩn hóa cách tích hợp, dễ quản lý quyền truy cập. MCP server cho mỗi hệ thống, maintained bởi team phụ trách hệ thống đó. Đầu tư ban đầu lớn nhưng ROI cao theo thời gian.
Checklist quyết định nhanh
Khi cần quyết định nhanh, hãy trả lời các câu hỏi sau:
1. Tool co duoc su dung boi nhieu ung dung khac nhau khong?
Co -> MCP | Khong -> Custom Tools
2. Ban can kiem soat chinh xac luong xu ly tool khong?
Co -> Custom Tools | Khong -> MCP cung duoc
3. Co MCP server co san trong ecosystem khong?
Co -> Dung MCP server co san | Khong -> Tiep tuc cau hoi 4
4. Team co nhieu hon 5 developer dung cung tool khong?
Co -> MCP | Khong -> Custom Tools
5. Day la MVP hay san pham truong thanh?
MVP -> Custom Tools | Truong thanh -> Can nhac MCP
6. Latency co quan trong khong (real-time app)?
Co -> Custom Tools | Khong -> MCP cung duoc
Anti-patterns cần tránh
Dưới đây là những sai lầm phổ biến khi chọn giữa MCP và Custom Tools:
- Over-engineering: Tạo MCP server cho tool chỉ dùng trong 1 ứng dụng, logic 20 dòng code. Custom Tool đơn giản hơn nhiều trong trường hợp này
- Reinventing the wheel: Tự viết Custom Tool cho database query trong khi đã có MCP server PostgreSQL chất lượng cao
- Mixing concerns: Đặt business logic phức tạp trong MCP server. MCP server nên focus vào integration, business logic nên ở ứng dụng chính
- Ignoring latency: Dùng remote MCP server cho ứng dụng real-time mà không đo latency trước
- Premature migration: Chuyển tất cả custom tools sang MCP khi chưa có nhu cầu tái sử dụng thực sự
Bước tiếp theo
Quyết định giữa MCP và Custom Tool Use không phải là quyết định một lần cho toàn bộ dự án. Mỗi tool trong hệ thống có thể dùng cách tiếp cận khác nhau dựa trên nhu cầu cụ thể. Bắt đầu với Custom Tools cho MVP, migrate sang MCP khi cần tái sử dụng, và sử dụng hybrid approach cho hệ thống phức tạp. Khám phá thêm chi tiết về MCP và Tool Use tại Thư viện Nâng cao Claude.
Bai viet co huu ich khong?
Bản quyền thuộc về tác giả. Vui lòng dẫn nguồn khi chia sẻ.






