Trong thời đại thông tin bùng nổ hiện nay, internet đóng vai trò trung tâm trong việc cung cấp kiến thức, dịch vụ và tương tác. Tuy nhiên, các mô hình ngôn ngữ lớn như DeepSeek thường chỉ tiếp cận dữ liệu internet dưới dạng "hình ảnh quá khứ" trong quá trình huấn luyện. Chúng có thể cung cấp thông tin về một trang web nhưng không thể truy cập hoặc tương tác trực tiếp với nó theo thời gian thực.
Để khắc phục hạn chế này, chúng ta có thể sử dụng dịch vụ MCP của Playwright để tạo khả năng tự động hóa trình duyệt. Dưới đây là một số ví dụ minh họa:
- Tra cứu thời tiết
- Kiểm tra giá cổ phiếu
- Tìm kiếm tin tức mới nhất
Tiếp theo, chúng ta sẽ tìm hiểu quy trình triển khai chi tiết.
- Dịch vụ Playwright MCP
Playwright là thư viện mã nguồn mở do Microsoft phát triển, hỗ trợ đa nền tảng (Node.js, Python, Java, .NET/C#) chuyên dụng cho tự động hóa web và kiểm thử end-to-end. Công cụ này cung cấp API thống nhất để điều khiển các trình duyệt hiện đại như Chromium, WebKit và Firefox mà không cần thay đổi nhiều mã nguồn.
Dịch vụ MCP của Playwright cho phép thực hiện các thao tác trình duyệt thông qua giao diện API. Trước khi cài đặt, cần đảm bảo đã cài đặt Node.js.
Chúng ta có thể chạy dịch vụ bằng lệnh sau:
npx @playwright/mcp@latest --port 8931
Lệnh này sẽ tự động tải và cài đặt dịch vụ nếu chưa tồn tại. Sau khi cài đặt thành công, kết quả hiển thị sẽ bao gồm:
Đang cài đặt các gói:
@playwright/mcp@0.0.10
Tiến hành? (y) y
Đang lắng nghe tại http://localhost:8931
Cấu hình client cần thêm:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/sse"
}
}
}
Sau khi chạy dịch vụ, cần tạo file cấu hình servers_config.json tại thư mục client với nội dung:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/sse"
}
}
}
2. Phần mềm khách hàng
Để kết nối với dịch vụ, chúng ta cần triển khai lớp khách hàng như sau:
async def connect_server(self, server_config):
async with self._lock: # Ngăn chặn gọi đồng thời
url = server_config["mcpServers"]["playwright"]["url"]
print(f"Đang kết nối đến: {url}")
self._exit_stack = AsyncExitStack()
# 1. Khởi tạo kết nối SSE
sse_cm = sse_client(url)
streams = await self._exit_stack.enter_async_context(sse_cm)
print("Kết nối SSE đã được thiết lập")
# 2. Tạo phiên làm việc
session_cm = ClientSession(streams[0], streams[1])
self.session = await self._exit_stack.enter_async_context(session_cm)
print("Phiên làm việc đã được tạo")
# 3. Khởi động phiên làm việc
await self.session.initialize()
print("Phiên làm việc đã được khởi động")
# 4. Lấy danh sách công cụ
response = await self.session.list_tools()
self.tools = {tool.name: tool for tool in response.tools}
print(f"Đã nhận được {len(self.tools)} công cụ:")
for name, tool in self.tools.items():
print(f" - {name}: {tool.description[:50]}...")
print("Kết nối hoàn tất")
Dịch vụ cung cấp 20 công cụ chính:
- đóng trình duyệt
- chờ thời gian xác định
- tải lên tệp
- cài đặt trình duyệt
- nhấn phím
- điều hướng URL
- quay lại trang trước
- tiến đến trang sau
- lưu thành PDF
- chụp bản đồ sự kiện
- click chuột
- kéo thả
- di chuột
- nhập văn bản
- chọn tùy chọn
- chụp ảnh màn hình
- liệt kê tab
- mở tab mới
- chọn tab
- đóng tab
Các công cụ này cho phép DeepSeek thực hiện đầy đủ các thao tác tương tác với trình duyệt.
Lưu ý về logic giao tiếp giữa client và DeepSeek:
async def chat_loop(self):
"""Vòng lặp tương tác"""
print("Khởi động client MCP")
print("Gõ /bye để thoát")
while True:
prompt = input(">>> ").strip()
if "/bye" in prompt.lower():
break
response = await self.chat(prompt)
self.messages.append({"role": "assistant", "content": response})
result = await self.execute_tool(response)
while result != response:
response = await self.chat(result, "system")
self.messages.append(
{"role": "assistant", "content": response}
)
result = await self.execute_tool(response)
print(response)
Trong quá trình tương tác, người dùng gửi yêu cầu đến DeepSeek, mô hình sẽ quyết định công cụ cần gọi. Quy trình "lệnh -> phân tích -> thực thi -> phản hồi" giúp AI có thể tương tác trực tiếp với thế giới mạng theo thời gian thực.