Hoàn thành bài "Thiết kế Tools, Resources và Prompts cho MCP" trước để mở khoá bài này.Đến bài trước

Giới thiệu

Kết nối MCP với một tác nhân AI có nghĩa là cung cấp cho tác nhân một phương thức được kiểm soát để phát hiện và sử dụng các khả năng nằm bên ngoài mô hình. Mô hình không trực tiếp thực thi truy vấn cơ sở dữ liệu, đọc tệp riêng tư hoặc gọi API nghiệp vụ. Thay vào đó, một máy khách MCP bên trong tác nhân kết nối với máy chủ MCP, lấy các định nghĩa tool của máy chủ, gửi những định nghĩa đó cho mô hình dưới dạng các khả năng có sẵn và thực thi lệnh gọi tool do mô hình lựa chọn.

Sự phân tách này tạo ra một ranh giới quan trọng. Mô hình chịu trách nhiệm diễn giải yêu cầu của người dùng và đề xuất tên tool cùng các đối số có cấu trúc. Máy khách MCP chịu trách nhiệm duy trì phiên giao thức, gọi tool đã chọn, trả về kết quả và báo cáo lỗi. Vì vậy, một quy trình đáng tin cậy gồm ba giai đoạn riêng biệt: phát hiện, lựa chọn và gọi. Mẫu này hoạt động независимо mô hình được lưu trữ bởi API thương mại, mô hình tự lưu trữ hay framework tác nhân nội bộ.

MCP không loại bỏ nhu cầu về bảo mật ở cấp ứng dụng. Tác nhân chỉ nên kết nối với các máy chủ đáng tin cậy, áp dụng xác thực khi cần, xác minh quyền của người dùng và tránh tự động phê duyệt các thao tác nguy hiểm. Mô tả tool giúp mô hình lựa chọn một khả năng, nhưng không phải là chính sách bảo mật.

Quy trình tác nhân

Khi khởi động, máy khách MCP mở kết nối truyền tải đến máy chủ và khởi tạo một phiên MCP. Sau đó, máy khách gọi thao tác phát hiện tool của giao thức. Phản hồi chứa tên tool, mô tả và schema đầu vào. Các schema này mô tả những đối số mà một tool chấp nhận, nhờ đó tác nhân có thể cung cấp cho mô hình thông tin có cấu trúc thay vì một đoạn văn không chính thức.

Mô hình sử dụng các định nghĩa đã phát hiện cùng với yêu cầu của người dùng. Ví dụ, nếu máy chủ cung cấp tool search_documents và create_ticket, một yêu cầu tìm báo cáo sự cố thông thường phải tạo ra lệnh gọi đến search_documents, không phải create_ticket. Đầu ra của mô hình nên được xem là một lệnh gọi tool được đề xuất, bao gồm tên và các đối số. Ứng dụng máy chủ vẫn phải xác minh rằng tên đó đã được phát hiện và các đối số đáp ứng chính sách cục bộ trước khi gọi tool.

Sau khi xác thực, máy khách MCP gọi tool đã chọn và nhận nội dung có cấu trúc, văn bản hoặc lỗi. Ứng dụng máy chủ có thể trả kết quả đó về cho mô hình để tạo phản hồi cuối cùng bằng ngôn ngữ tự nhiên. Một tác nhân nhiều bước sẽ lặp lại chu kỳ này khi kết quả của tool đầu tiên cung cấp thông tin cần thiết cho tool thứ hai. Ứng dụng nên áp đặt giới hạn về số bước, thời gian thực thi và các thao tác nhạy cảm để ngăn vòng lặp không kiểm soát.

sơ đồ luồng cho thấy yêu cầu của người dùng được gửi đến một mô hình AI, sau đó đến bước lựa chọn tool và xác thực đối số, rồi đi qua máy khách MCP đến máy chủ MCP; thể hiện kết quả của tool quay trở lại mô hình và cuối cùng được gửi đến người dùng

Một MCP Client Tối giản

Chương trình Python sau đây minh họa việc khám phá, lựa chọn và gọi công cụ qua Streamable HTTP. Chương trình sử dụng các interface client Python chính thức của MCP cho phiên client và transport. Hãy cài đặt package MCP Python trong môi trường chạy agent, đồng thời thay URL bằng URL của một MCP server đang chạy và đã được cấu hình để chấp nhận transport này.

python
import argparse
import asyncio
import json
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
async def run(url: str, tool_name: str, arguments: dict) -> None:
async with streamable_http_client(url) as streams:
read_stream, write_stream, _ = streams
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
discovered = await session.list_tools()
print("Discovered tools:")
for tool in discovered.tools:
description = tool.description or "No description"
print(f"- {tool.name}: {description}")
selected = next(
(tool for tool in discovered.tools if tool.name == tool_name),
None,
)
if selected is None:
available = ", ".join(tool.name for tool in discovered.tools)
raise ValueError(
f"Unknown tool '{tool_name}'. Available tools: {available}"
)
print(f"Invoking {selected.name} with {json.dumps(arguments)}")
result = await session.call_tool(
selected.name,
arguments=arguments,
)
print("Tool result:")
if hasattr(result, "model_dump_json"):
print(result.model_dump_json(indent=2))
else:
print(result)
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("url", help="MCP Streamable HTTP endpoint")
parser.add_argument("tool", help="Discovered tool name to invoke")
parser.add_argument(
"--arguments",
default="{}",
help="JSON object containing tool arguments",
)
args = parser.parse_args()
try:
arguments = json.loads(args.arguments)
except json.JSONDecodeError as error:
raise SystemExit(f"Arguments must be valid JSON: {error}") from error
if not isinstance(arguments, dict):
raise SystemExit("Arguments must be a JSON object")
try:
asyncio.run(run(args.url, args.tool, arguments))
except Exception as error:
raise SystemExit(f"MCP request failed: {error}") from error
if __name__ == "__main__":
main()

Đầu vào gồm một MCP endpoint, tên công cụ và một đối tượng JSON chứa các đối số. Trước tiên, chương trình in ra các công cụ nhận được từ quá trình khám phá, sau đó kiểm tra xem tên được yêu cầu có thực sự tồn tại hay không. Kiểm tra này rất quan trọng vì model có thể tự tạo ra một tên công cụ hoặc giữ lại tên đã cũ từ một phiên trước. Kết quả đầu ra bao gồm kết quả do server trả về, để agent bao quanh có thể chuyển kết quả đó cho model diễn giải.

Kết nối Khám phá với Lựa chọn của Model

Trong một agent production, một model adapter được đặt giữa quá trình khám phá và gọi công cụ. Sau khi list_tools trả về, host chuyển đổi tên, mô tả và input schema của từng công cụ sang định dạng tool-calling của nhà cung cấp model. Định dạng request chính xác phụ thuộc vào model API, vì vậy MCP client không nên giả định rằng mọi nhà cung cấp đều sử dụng cùng một cấu trúc message. Agent nhận phản hồi từ model, trích xuất tên và các đối số JSON được đề xuất, rồi thực hiện validation cục bộ trước khi gọi session.call_tool.

Host nên từ chối một tool call khi tên không có trong phản hồi khám phá hiện tại, các đối số không phải là một đối tượng, các trường bắt buộc bị thiếu hoặc một giá trị vi phạm chính sách của ứng dụng. Schema validation rất hữu ích, nhưng các bước kiểm tra quyền phải được thực hiện riêng. Ví dụ, một lệnh gọi delete_record hợp lệ vẫn có thể bị cấm đối với người dùng chỉ có quyền đọc. Cũng nên yêu cầu xác nhận đối với các hành động không thể hoàn tác, giao dịch tài chính, tin nhắn gửi ra bên ngoài hoặc các thay đổi đối với dữ liệu production.

Sau khi gọi công cụ, kết quả có thể được thêm vào cuộc hội thoại với model dưới dạng tool-result message. Khi đó, model có thể tóm tắt kết quả hoặc quyết định xem có cần một công cụ được phép khác hay không. Hãy giữ kết quả thô để ghi log, nhưng che hoặc loại bỏ thông tin xác thực, dữ liệu cá nhân và thông tin chẩn đoán nội bộ trước khi gửi nội dung đến model bên thứ ba.

Các Lỗi Thường gặp và Thực hành Đáng tin cậy

Lỗi kết nối thường có nghĩa là endpoint không đúng, server không khả dụng, transport không tương thích hoặc thiếu thông tin xác thực. Hãy xác nhận rằng server hỗ trợ transport đã chọn, đồng thời các thiết lập network, proxy và TLS cho phép kết nối. Không được âm thầm chuyển sang một protocol không xác định để xử lý vấn đề về transport; hãy nêu rõ transport đã cấu hình và báo cáo lỗi gốc.

Lỗi không xác định công cụ xảy ra khi agent gọi một tên không được trả về trong bước khám phá hiện tại. Hãy làm mới quá trình khám phá khi session hoặc capability của server có thể thay đổi, đồng thời luôn so sánh tên được yêu cầu với bộ công cụ hiện tại. Đối số không hợp lệ thường xuất phát từ việc thiếu property bắt buộc, sai kiểu dữ liệu hoặc model trả về JSON được mã hóa dưới dạng chuỗi thay vì một đối tượng. Hãy validation và chuẩn hóa các đối số trước khi gọi công cụ, sau đó giữ lại thông báo lỗi hữu ích của server để debug.

Một lỗi phổ biến khác là cung cấp công cụ của mọi server đã kết nối cho mọi người dùng. Tên và mô tả công cụ có thể trùng nhau, đồng thời một server độc hại hoặc được cấu hình kém có thể cung cấp một capability không an toàn. Hãy sử dụng allowlist server rõ ràng, cô lập thông tin xác thực, áp dụng phân quyền theo từng công cụ, thiết lập timeout, giới hạn số lần gọi lặp lại và ghi lại người dùng, quyết định của model, server và công cụ liên quan. Những biện pháp kiểm soát này giúp hành vi của agent có thể quan sát được và dễ review hơn.

Tóm tắt

Một agent hỗ trợ MCP được hiểu rõ nhất là một ứng dụng host gồm hai thành phần phối hợp với nhau. Model suy luận về ý định của người dùng và đề xuất một lời gọi có cấu trúc, trong khi MCP client khám phá các capability và thực thi tuân thủ giao thức. Client không bao giờ được giả định rằng một tool tồn tại chỉ vì model đã đề cập đến tool đó; client cần khám phá danh sách tool hiện tại, xác thực lựa chọn và các đối số, đồng thời thực thi chính sách cục bộ trước khi gọi tool.

Quy trình thực tế gồm: khởi tạo, liệt kê tool, cung cấp schema cho model, xác thực lời gọi do model đề xuất, gọi tool được chọn và trả về kết quả để model suy luận ở bước cuối. Khi vòng lặp này hoạt động với một server, có thể mở rộng sang nhiều server và các tác vụ gồm nhiều bước mà không cần thay đổi ranh giới cốt lõi. Những lựa chọn triển khai quan trọng nhất vẫn là cấu hình transport rõ ràng, xác thực nghiêm ngặt, phân quyền an toàn, thực thi có giới hạn và báo lỗi hữu ích.

Luyện tập sau buổi học

Bài kiểm tra cuối bài

Ôn lại kiến thức, thử sức và nhận góp ý cho bài làm.

0/1
Đã trả lời · 0/1