MCP server không hề "chết". Tuy nhiên, việc kích hoạt chúng một cách mù quáng sẽ làm phình đại ngữ cảnh (context), dẫn đến chi phí cao hơn và hiệu suất kém đi. Khác với "Agent Skills", các MCP server không tự động cung cấp tính năng "tiết lộ lũy tiến" (progressive disclosure). Trách nhiệm của bạn là phải chọn lọc các công cụ cần thiết cho tác vụ hiện tại.
Dưới đây là hai mô hình đã được chứng minh giúp bạn sử dụng MCP server đúng cách và tránh tình trạng dư thừa dữ liệu.
1. Explicit MCP Servers: Chèn công cụ trực tiếp (Inline Tool Injection)
Các MCP server sẽ ở trạng thái opt-in (chỉ tham gia khi được chọn). Server được tham chiếu trong câu lệnh (prompt) của bạn bằng ký hiệu
@mention; agent sẽ phân giải, lấy dữ liệu và chèn các công cụ đó vào trước khi gửi yêu cầu đến mô hình.
Việc viết
@github hoặc @slack trong prompt sẽ kích hoạt agent thực hiện:- Phân giải (Resolve)
@mentionthành một URL của MCP server đã đăng ký. - Truy xuất (Fetch) các lược đồ công cụ (tool schemas) từ server đó.
- Chèn (Inject) chúng vào mảng tools[] của yêu cầu API.
- Chuyển tiếp toàn bộ cho mô hình, nơi sẽ quyết định nên gọi công cụ nào.
Không có gì được tải trừ khi được yêu cầu. Phạm vi công cụ luôn được giữ ở mức tối thiểu.
// Mã giả (Pseudo-code)
async function handlePrompt(prompt: string) {
// Phát hiện các @mention trong prompt
const mentions = parseMentions(prompt); // ["@github", "@slack"]
// Phân giải mỗi mention thành một MCP server
const servers = mentions.map(m => mcpServers.resolve(m));
// Truy xuất các tool schema từ mỗi server
const mcpTools = await Promise.all(
servers.map(s => s.listTools())
);
// Chèn vào API request cùng với các công cụ gốc (native tools)
const response = await llmCall({
prompt,
tools: [...nativeTools, ...mcpTools],
});
// Xử lý phản hồi, gọi công cụ, v.v...
}
Khi nào nên dùng: Khi việc sử dụng MCP là không thường xuyên và do người dùng quyết định. Khi ai đó đặt câu hỏi cần dữ liệu từ Slack hoặc GitHub, họ sẽ @mention server đó và nó chỉ được kéo vào cho duy nhất yêu cầu đó. Cách này giúp giữ chi phí thấp và tránh "nhiễu" công cụ cho các tác vụ không cần tích hợp bên ngoài.
2. Subagent MCP Servers (MCP Server cho Agent phụ)
Các MCP server được khai báo trong định nghĩa của subagent và tự động có sẵn khi chạy, song song với các công cụ gốc như
read_file hoặc run_command.Mỗi subagent có cấu hình riêng để khai báo mô hình, công cụ... và các MCP server tùy chọn. Bạn có thể giới hạn MCP server cho các công cụ cụ thể bằng cách sử dụng
allowed_tools.
# Mã giả: code_reviewer.md
---
name: code-reviewer
model: gemini-3-flash
mcp_servers:
- url: https://github-mcp.example
allowed_tools:
- list_pulls
- list_reviews
- get_diff
---
Bạn là một người kiểm duyệt mã (code reviewer). Hãy xem xét các PR đang mở...
Agent chính (main agent) sẽ đăng ký các subagent. Khi được gọi, mỗi subagent sẽ kết nối với các MCP server đã khai báo và hợp nhất các công cụ đó với các công cụ gốc.
// Mã giả // Đăng ký các subagent như là công cụ cho bộ điều phối (orchestrator) const codeReviewer = createSubagent("./agents/code_reviewer.md"); const slackMonitor = createSubagent("./agents/slack_monitor.md"); async function handlePrompt(prompt: string) { // Tiền xử lý ... const response = await llmCall({ prompt, tools: [...nativeTools, codeReviewer, slackMonitor], }); // Xử lý phản hồi, gọi công cụ, v.v... }
allowed_tools cung cấp cho bạn khả năng phân quyền ở mức tối thiểu (least-privilege scoping) mà không cần phải phân nhánh (fork) MCP server.Khi nào nên dùng: Khi trường hợp sử dụng quy định sẵn các công cụ cần thiết. Một agent review code luôn cần GitHub, một agent hỗ trợ khách hàng luôn cần Zendesk. Các MCP server lúc này là một phần bản chất của agent, không phải là thứ mà người dùng chọn tham gia theo từng yêu cầu. allowed_tools giúp giữ cho mỗi agent chỉ tập trung vào những gì nó thực sự cần.
Nguồn bài viết từ Tác giả Phil Schmid