Trung cấpHướng dẫnClaude APINguồn: Anthropic

MCP vs Custom Tool Use — Khi nào dùng gì? Hướng dẫn quyết định

Nghe bài viết
00:00

Điểm nổi bật

Nhấn để đến mục tương ứng

  1. 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. 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. 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. 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. 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.
a blue button with a white arrow on it

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 (content array với typetext)

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.

Tính năng liên quan:MCPCustom ToolsArchitecture DecisionMigration

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ẻ.

Bình luận (0)
Ảnh đại diện
Đăng nhập để bình luận...
Đăng nhập để bình luận
  • Đang tải bình luận...

Đăng ký nhận bản tin

Nhận bài viết hay nhất về sản phẩm và vận hành, gửi thẳng vào hộp thư của bạn.

Bảo mật thông tin. Hủy đăng ký bất cứ lúc nào. Chính sách bảo mật.