Nhìn Nhanh
Nếu yêu cầu web của đại lý của bạn liên tục bị chặn hoặc được phục vụ một shell JavaScript thay vì nội dung thực, Nstdata Crawl sẽ hiển thị trang trong một trình duyệt thực và chuyển nó qua mạng proxy của Nstdata trước khi trả về cho máy chủ MCP của bạn dưới dạng Markdown sạch.
Yêu cầu tiên quyết
Bạn cần Python 3.10 hoặc phiên bản mới hơn - gói mcp chính thức yêu cầu nó - một máy chủ tương thích với MCP như Claude Desktop hoặc Claude Code, và một tài khoản Nstdata với token API Crawl, có sẵn từ trang sản phẩm Nstdata Crawl sau khi đăng ký. Tài liệu đầy đủ về endpoint và tham số cho API cơ sở nằm trong tài liệu Crawl của Nstdata, hữu ích nếu bạn muốn thêm các tùy chọn như chụp màn hình hoặc đầu ra PDF ngoài những gì ví dụ này sử dụng. Bạn không cần một khóa API công cụ tìm kiếm riêng cho bản build này: công cụ web_search dưới đây sẽ lấy trang kết quả của chính công cụ tìm kiếm thông qua Nstdata Crawl thay vì gọi một API tìm kiếm chuyên dụng.
Cài đặt
Tạo một môi trường ảo và cài đặt hai gói mà máy chủ này cần: SDK Python MCP chính thức với các tiện ích CLI, và SDK Crawl của Nstdata.
python3 -m venv .venv
source .venv/bin/activate
pip install "mcp[cli]" nstdata-ai-crawl
Chạy lệnh này trong quá trình viết bài viết đã cài đặt mcp phiên bản 1.27.0 và nstdata-ai-crawl phiên bản 0.1.1, là các phiên bản hiện tại của mỗi gói tại thời điểm viết; pip install luôn chỉ tới phiên bản mới nhất khi bạn chạy nó. Không cần bất kỳ phụ thuộc nào khác - SDK Crawl tự cung cấp client HTTP bên trong.
Cấu hình
Lưu đoạn mã sau dưới dạng mcp_server.py. Nó định nghĩa hai công cụ: web_search, công cụ này lấy trang kết quả của công cụ tìm kiếm và trả về các liên kết trên đó, và read_page, công cụ này lấy bất kỳ URL nào và trả về nội dung Markdown đã được làm sạch.
import os
from mcp.server.fastmcp import FastMCP
from nstdata_ai_crawl import Format, NstDataClient, ScrapeRequestDto
NSTDATA_API_TOKEN = os.environ["NSTDATA_API_TOKEN"]
client = NstDataClient(NSTDATA_API_TOKEN)
mcp = FastMCP("nstdata-web-search"
Hãy thử Nstdata miễn phí →
`NstDataClient.submit_scrape_task_sync` sẽ chặn cho đến khi quá trình lấy dữ liệu hoàn tất, đó là lý do tại sao cả hai hàm công cụ đều là `def` đơn thuần thay vì `async def` -- FastMCP hỗ trợ cả hai. `Format.LINKS` và `Format.MARKDOWN` cho Nstdata Crawl biết các đại diện của trang cần trả về; yêu cầu chỉ những gì mỗi công cụ cần giúp giữ cho phản hồi nhỏ hơn và bước giải quyết tham chiếu lưu trữ rẻ hơn.
Bắt Tay Thật
Trước khi kết nối điều này với một máy chủ trực tiếp, hãy xác minh rằng máy chủ thực sự giao tiếp MCP một cách chính xác, theo cùng mẫu với hướng dẫn xây dựng máy chủ MCP chính thức. Khách hàng trong SDK chính thức có thể trò chuyện với một máy chủ qua cùng một giao thức stdio mà máy chủ sử dụng, vì vậy bạn có thể kiểm tra tay bắt mà không cần Claude Desktop hoặc Claude Code trong quy trình:
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="python3",
args=[
Chạy điều này với máy chủ trên sẽ tạo ra:
=== Chuyến đi về stdio thực tế: tools.list ===
- web_search: required=['query']
- read_page: required=['url']
Đầu ra đó là một chuyến đi thực tế giữa khách hàng và máy chủ: khách hàng đã khởi động máy chủ như một quy trình con, hoàn thành tay bắt MCP initialize, và nhận lại cả hai sơ đồ tự động được tạo ra của các công cụ qua tools/list -- không cần gọi API Nstdata cho bước này, vì việc liệt kê công cụ không chạm vào mạng.
Đính Kèm Khả Năng
Claude Desktop đọc các định nghĩa máy chủ từ claude_desktop_config.json (~/Library/Application Support/Claude/claude_desktop_config.json trên macOS, %AppData%\Claude\claude_desktop_config.json trên Windows). Thêm máy chủ dưới mcpServers:
{
"mcpServers": {
"nstdata-web-search": {
"command": "python3",
"args": ["/absolute/path/to/mcp_server.py"],
"env": {
"NSTDATA_API_TOKEN": "your-nstdata-crawl-token"
Claude Code, được đề cập chi tiết hơn trong so sánh Claude Code vs. Codex của Nstdata, đăng ký cùng một máy chủ stdio từ dòng lệnh thay vì tệp JSON -- xem tài liệu tham khảo MCP chính thức của Claude Code để biết đầy đủ tập hợp tùy chọn claude mcp add:
claude mcp add --env NSTDATA_API_TOKEN=your-nstdata-crawl-token --transport stdio nstdata-web-search -- python3 /absolute/path/to/mcp_server.py
Chạy lệnh chính xác này trong quá trình viết bài báo này, sau đó kiểm tra claude mcp list, đã trả về:
nstdata-web-search-test: python3 /path/to/mcp_server.py - ✔ Kết nối
Trạng thái ✔ Kết nối có nghĩa là Claude Code đã tạo thành công quy trình máy chủ và hoàn thành tay bắt MCP với nó -- nó không xác nhận mã thông báo Nstdata Crawl có hợp lệ hay không, vì cuộc gọi đó chỉ xảy ra khi một công cụ thực sự được gọi. Nếu một cuộc gọi công cụ sau đó thất bại với lỗi xác thực, mã thông báo chính là điều đầu tiên cần kiểm tra, không phải việc kết nối MCP.
Ví Dụ Đã Hoàn Thành
Khi máy chủ đã được đính kèm, một yêu cầu như "có gì thay đổi trong đặc tả MCP gần đây, và tóm tắt kết quả hàng đầu" sẽ diễn ra như sau: Claude gọi web_search với truy vấn về sự thay đổi trong đặc tả MCP, nhận lại một vài URL ứng cử viên, chọn một cái trông có uy tín, và gọi read_page trên nó để kéo nội dung trang thực vào cuộc trò chuyện trước khi trả lời. Hình thức minh họa của giá trị trả về của cuộc gọi thứ hai trông như thế này:
{
"content": [
{
"type": "text",
"text": "# Model Context Protocol Changelog\n\n## 2026-07-28\n\n- ..."
}
]
}
Claude sau đó đọc văn bản Markdown đó theo cách tương tự như nó sẽ đọc bất kỳ thứ gì khác trong cuộc trò chuyện, và có thể trích dẫn URL nguồn mà nó đến từ vì URL đó là đối số cho read_page ngay từ đầu.
Giới Hạn
web_search ở đây lấy trang kết quả của một công cụ tìm kiếm và trả về các liên kết thô; nó không xếp hạng kết quả, không hiểu ý định truy vấn hoặc phân trang như cách mà một API tìm kiếm được thiết kế cụ thể sẽ làm. Bộ lọc "duckduckgo.com" not in link là một phương pháp ngu ngốc để loại trừ các liên kết điều hướng của chính công cụ tìm kiếm, chứ không phải là một bộ phân tích kết quả mạnh mẽ - một phiên bản sản xuất nên lọc chính xác hơn hoặc chuyển sang một nhà cung cấp tìm kiếm được thiết kế cho việc sử dụng lập trình nếu chất lượng xếp hạng quan trọng. Thanh toán theo mô hình theo mỗi lần lấy dữ liệu của Nstdata Crawl: mỗi lần gọi web_search và mỗi lần gọi read_page là một lần lấy dữ liệu có thể tính phí riêng biệt, vì vậy một câu hỏi đơn lẻ từ người dùng kích hoạt một tìm kiếm và ba lần đọc trang sẽ tốn bốn lần lấy dữ liệu, và mã ở trên không lưu trữ các tìm kiếm lặp lại. Nstdata Crawl cũng giới hạn mỗi yêu cầu ở thời gian chờ 60 giây và trả về mã HTTP 429 với tiêu đề Retry-After khi một caller vượt quá giới hạn tần suất của nó; ví dụ tối thiểu này không triển khai lại hoặc giảm tốc, vì vậy một phiên bản sản xuất nên thêm cả hai. Cuối cùng, hãy coi đây như một công cụ cho một tác nhân thực hiện các tìm kiếm có giới hạn, theo yêu cầu thay vì thu thập dữ liệu hàng loạt - tôn trọng các điều khoản dịch vụ và robots.txt của các trang web mục tiêu, và giữ khối lượng yêu cầu tương xứng với một câu hỏi của người dùng thực sự thay vì chạy các lần thu thập tự động qua cùng một thông tin xác thực.
Kết luận
Một máy chủ web search MCP hoạt động đến từ hai công cụ - một công cụ phát hiện các URL ứng viên và một công cụ lấy nội dung sạch từ một URL cụ thể - được kết nối với một lớp lấy dữ liệu có thể thực sự vượt qua những gì các trang web hiện đại làm để chặn việc thu thập dữ liệu HTTP thông thường. Việc xử lý JavaScript và truy cập qua proxy của Nstdata Crawl bao gồm lớp lấy dữ liệu đó, SDK Python MCP chính thức xử lý các quy trình giao thức, và cùng một máy chủ gắn vào cả Claude Desktop và Claude Code qua cùng một giao thức stdio. Xác minh quá trình bắt tay với một client thực tế trước khi kết nối nó với một host, theo dõi mô hình thanh toán theo từng lần lấy dữ liệu nếu tác nhân của bạn tìm kiếm và đọc trên mỗi câu hỏi, và coi việc lọc liên kết ngốc nghếch trong ví dụ này như một điểm khởi đầu hơn là một backend tìm kiếm hoàn thiện.
Thử Nstdata miễn phí →
Câu hỏi thường gặp
H: Máy chủ MCP là gì, trong một câu?
Máy chủ MCP là một chương trình cung cấp các công cụ, dữ liệu hoặc mẫu lệnh có thể gọi được cho một ứng dụng AI thông qua Giao thức Ngữ cảnh Mô hình, để AI có thể gọi các chức năng thực tế thay vì chỉ tạo ra văn bản.
H: Tôi có cần sử dụng Nstdata Crawl cụ thể không, hay tôi có thể lấy trang bằng các yêu cầu HTTP thông thường?
Bạn có thể lấy trang bằng bất kỳ client HTTP nào, nhưng các yêu cầu thông thường thường thất bại khi gặp các trang được xử lý bằng JavaScript và bị chặn bởi các trang có phát hiện bot; Nstdata Crawl xử lý cả hai bằng cách tạo render trang trong một trình duyệt thực và định tuyến các yêu cầu qua mạng proxy của nó.
H: Điều này có cho phép Claude tìm kiếm cả web như một công cụ tìm kiếm không?
Không. Công cụ web_search trong ví dụ này lấy một trang kết quả của một công cụ tìm kiếm và trả về các liên kết trên đó; nó không lập chỉ mục web hoặc xếp hạng kết quả như cách mà một công cụ tìm kiếm chuyên dụng làm.
H: Chi phí để vận hành điều này là bao nhiêu?
Chi phí phụ thuộc vào mức giá hiện tại theo lần lấy dữ liệu của Nstdata Crawl, được công bố trên trang sản phẩm Crawl, nhân với số lượng tìm kiếm và đọc trang mà tác nhân của bạn thực hiện - mỗi cái là một lần lấy dữ liệu có thể tính phí riêng.
H: Tôi có thể sử dụng máy chủ này với cả Claude Code và Claude Desktop không?
Có. Cả hai đều kết nối với cùng một máy chủ stdio; Claude Desktop đọc định nghĩa máy chủ từ claude_desktop_config.json trong khi Claude Code đăng ký với claude mcp add.
H: Mã thông báo Nstdata API của tôi có bị lộ cho LLM không?
Không. Mã thông báo sống trong các biến môi trường của tiến trình máy chủ và chỉ được sử dụng bên trong mcp_server.py để xác thực với Nstdata Crawl; LLM chỉ thấy các giá trị trả về của công cụ, không bao giờ thấy mã thông báo đó.
H: Điều gì xảy ra nếu công cụ tìm kiếm mục tiêu chặn hoặc giới hạn tần suất yêu cầu?
Nstdata Crawl trả về một kết quả không thành công với mã lỗi mà hàm web_search lấy ra dưới dạng thông điệp thất bại văn bản thuần; ví dụ tối thiểu này không tự động thử lại, vì vậy một phiên bản sản xuất nên thêm chiến lược giảm tốc và dự phòng cho truy vấn.
H: Tôi có cần triển khai máy chủ này ở đâu đó hay có thể chạy nó cục bộ không?
Nó có thể chạy hoàn toàn trên máy của bạn như một tiến trình con địa phương mà Claude Desktop hoặc Claude Code khởi động qua stdio; bạn chỉ cần một triển khai công khai nếu bạn đang cung cấp máy chủ cho một host từ xa qua HTTP.