🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Nghiên cứu viên GPT + MCP không lãng phí: Cung cấp cho đại lý nghiên cứu của bạn một lớp lấy dữ liệu thực sự

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

07-Aug-2026

TL;DR:

  • GPT Researcher đọc web thông qua những bộ lấy thông tin, và bộ lấy thông tin mcp biến bất kỳ máy chủ MCP nào thành một nguồn nghiên cứu — vì vậy, Máy Chủ MCP Không Rác trở thành lớp thực sự lấy trang.
  • Cài đặt RETRIEVER=mcp là bắt buộc. Truyền mcp_configs mà không có nó sẽ để bộ lấy thông tin MCP tắt, và chạy sẽ quay trở lại bất cứ điều gì khác đã được cấu hình.
  • Giao thức stdio là cách hoạt động hôm nay: npx -y scrapeless-mcp-server@0.4.9 với SCRAPELESS_KEY trong env tải tất cả 21 công cụ.
  • Đường dẫn từ xa connection_url không xác thực trong khách hàng phát hành. connection_token tiếp cận giao thức như một tham số token không được hỗ trợ, và connection_headers hoàn toàn không tới được.
  • Ghim phiên bản của bạn. gpt-researcher==0.16.0 nâng NameError khi nhập, và mcp phát hành từ 1.28 trở đi vô hiệu hóa hỗ trợ MCP bên trong langchain-mcp-adapters mà không có thông báo lỗi.
  • scrape_markdown trên https://quotes.toscrape.com/ trả về 4308 ký tự nội dung trang qua bộ lấy thông tin, và bạn có thể gọi nó trước khi bất kỳ mô hình nào được tham gia.
  • Chỉ cần chạy nghiên cứu cần một khóa nhà cung cấp mô hình; tải và gọi công cụ không cần gì ngoài khóa Scrapeless của bạn.
  • Bắt đầu trên kế hoạch Scrapeless miễn phí và cung cấp cho đại lý nghiên cứu của bạn một lớp lấy dữ liệu thực sự.

GPT Researcher lập kế hoạch cho một truy vấn, tìm kiếm, đọc những gì nó tìm thấy và viết một báo cáo được trích dẫn. Phần tìm kiếm được phục vụ tốt — nó cung cấp các bộ lấy thông tin cho Google, Bing, Brave, arXiv, PubMed, và nhiều hơn nữa. Phần đọc là nơi nghiên cứu tự động lặng lẽ giảm chất lượng: một bộ lấy thông tin trả lại một danh sách các URL, và điều gì đó vẫn phải biến những URL đó thành văn bản. Khi việc lấy đó trả về một trang thách thức hoặc một vỏ rỗng, báo cáo vẫn được viết, từ bất kỳ nội dung mỏng manh nào đã trở lại.

Bộ lấy thông tin mcp thay đổi những gì đặt trong đó. Chỉ định GPT Researcher đến một máy chủ MCP và các công cụ của máy chủ trở thành bề mặt nghiên cứu, vì vậy việc lấy trang chạy qua hạ tầng được xây dựng cho nó thay vì một HTTP get đơn giản. Hướng dẫn này kết nối GPT Researcher với Máy Chủ MCP Không Rác, liệt kê các công cụ mà nó mở ra, gọi một cái thực sự, và đánh dấu chính xác bước nào là bước đầu tiên cần có khóa nhà cung cấp mô hình.

Những gì Máy Chủ MCP Không Rác Cung Cấp cho Một Đại Lý Nghiên Cứu

Máy Chủ MCP Không Rác mở ra các công cụ thu thập thông tin và trình duyệt qua Giao thức Ngữ cảnh Mô hình, vì vậy lớp lấy dữ liệu là điều mà đại lý của bạn gọi thay vì điều gì đó bạn xây dựng. Một kết nối phục vụ 21 công cụ: scrape_markdownscrape_html cho nội dung trang, google_searchgoogle_trends cho dữ liệu tìm kiếm, scrape_screenshot cho các bản chụp, và một bộ browser_* 16 công cụ điều khiển một trình duyệt đám mây qua điều hướng, nhấp chuột, gõ, cuộn, và chờ đợi.

Đối với một đại lý nghiên cứu, cái quan trọng là scrape_markdown. Chất lượng báo cáo của GPT Researcher phụ thuộc vào văn bản mà nó thu thập, và markdown đã là hình dạng mà ngữ cảnh của nó muốn. Các công cụ browser_* quan trọng khi một nguồn chỉ hiển thị sau khi tương tác — chúng hoạt động trên trình duyệt đám mây Scrapeless, vì vậy một đại lý có thể tiếp cận một trang đã được hiển thị mà không cần trình duyệt trên máy nghiên cứu.

Lớp giao thức tuân theo đặc tả Giao thức Ngữ cảnh Mô hình, mà truyền tải các thông điệp của nó qua đặc tả JSON-RPC 2.0. Nếu bạn muốn giao thức được giải thích theo cách của nó trước tiên, MCP là gì đề cập đến điều đó, và LangChain + Scrapeless MCP cho thấy cùng một máy chủ được kết nối vào một ngăn xếp khác.

Các yêu cầu tiên quyết

  • Python 3.10 trở lên.
  • Node.js trên máy chạy nghiên cứu, vì giao thức stdio khởi động máy chủ với npx.
  • Một khóa API Scrapeless từ bảng điều khiển, được xuất ra dưới dạng SCRAPELESS_KEY.
  • Một khóa nhà cung cấp mô hình như OPENAI_API_KEY. GPT Researcher xây dựng một khách hàng nhúng trong khi tạo đối tượng nhà nghiên cứu, vì vậy biến này phải được đặt trước bước đó — mọi thứ cho đến và bao gồm gọi các công cụ MCP đều hoạt động mà không cần nó.

Cài đặt

Việc cố định phiên bản không phải là tùy chọn ở đây, và hai cái ghim cụ thể đang làm việc thực sự.

bash Copy
pip install "gpt-researcher==0.15.1" "langchain-mcp-adapters==0.3.1" "mcp==1.27.2"

gpt-researcher==0.16.0 không thể được nhập. actions/query_processing.py định nghĩa một trình trợ giúp mà chữ ký của nó chú thích AnyList vài dòng trên from typing import Any, List, Dict sẽ định nghĩa chúng, và vì các chú thích trên một def đơn giản được đánh giá khi đối tượng hàm được xây dựng — hành vi đề xuất chú thích hoãn lại được viết để thay đổi — việc nhập liệu phát sinh NameError: name 'Any' is not defined trước khi bất cứ điều gì khác chạy. Phiên bản 0.15.1 không gặp phải vấn đề sắp xếp đó.

Cái mcp pin tinh tế hơn. langchain-mcp-adapters tuyên bố yêu cầu của nó là mcp>=1.9.2, một sàn không giới hạn theo nghĩa được mô tả bởi đặc tả các chỉ định phụ thuộc của Python, vì vậy một cài đặt mới kéo bất kỳ mcp nào là mới nhất. Các phiên bản từ 1.28 trở đi không còn xuất RequestContext từ mcp.shared.context, mà bộ chuyển đổi nhập khẩu khi tải mô-đun. GPT Researcher bắt được ImportError đó và thiết lập một cờ nội bộ về khả năng sẵn có thành false, vì vậy MCP không bị lỗi một cách ồn ào — nó đơn giản là không còn tồn tại, và nghiên cứu của bạn chạy mà không bao giờ chạm vào máy chủ.

Đặt khóa của bạn trong shell thay vì trong nguồn.

bash Copy
export SCRAPELESS_KEY="your_api_key_here"

Kết nối thông qua stdio và liệt kê các công cụ

Lớp MCP của GPT Researcher nhận một danh sách các từ điển cấu hình máy chủ. Đối với một máy chủ stdio, bạn cung cấp cho nó một tên, lệnh, các tham số của nó, và bất kỳ môi trường nào mà máy chủ cần. MCPClientManager chuyển đổi điều đó thành cấu hình vận chuyển và chạy quá trình bắt tay.

python Copy
import asyncio
import os

from gpt_researcher.mcp.client import MCPClientManager

SCRAPELESS = {
    "name": "scrapeless",
    "command": "npx",
    "args": ["-y", "scrapeless-mcp-server@0.4.9"],
    "env": {"SCRAPELESS_KEY": os.environ["SCRAPELESS_KEY"], "PATH": os.environ["PATH"]},
}


async def main() -> None:
    manager = MCPClientManager([SCRAPELESS])
    tools = await manager.get_all_tools()
    print("tool count:", len(tools))
    print("tools:", ", ".join(sorted(tool.name for tool in tools)))


asyncio.run(main())

Bao gồm PATH trong env. Quy trình máy chủ được khởi tạo với chính xác môi trường mà bạn cung cấp, vì vậy việc bỏ PATH có nghĩa là npx không thể được định vị.

Máy chủ trực tiếp trả về 21 công cụ với chỉ khóa Scrapeless được thiết lập.

text Copy
tool count: 21
tools: browser_click, browser_close, browser_create, browser_get_html, browser_get_text, browser_go_back, browser_go_forward, browser_goto, browser_press_key, browser_screenshot, browser_scroll, browser_scroll_to, browser_snapshot, browser_type, browser_wait, browser_wait_for, google_search, google_trends, scrape_html, scrape_markdown, scrape_screenshot

Tại sao đường dẫn URL từ xa chưa hoạt động

Bảng cấu hình trong tài liệu của GPT Researcher liệt kê connection_urlconnection_token cho các máy chủ từ xa, điều này đọc như một khớp tự nhiên cho một điểm cuối được lưu trữ. Trong khách hàng phát hành, không có khóa nào giúp bạn có được kết nối xác thực, và đáng để xem tại sao trước khi bạn dành một buổi chiều cho nó.

Cả hai lỗi đều có thể nhìn thấy mà không cần gọi mạng, vì convert_configs_to_langchain_format là hàm quyết định điều gì mà vận chuyển nhận.

python Copy
from gpt_researcher.mcp.client import MCPClientManager

URL = "https://api.scrapeless.com/mcp"

with_token = MCPClientManager([
    {"name": "s", "connection_url": URL, "connection_token": "PLACEHOLDER"},
]).convert_configs_to_langchain_format()["s"]

with_headers = MCPClientManager([
    {"name": "s", "connection_url": URL, "connection_headers": {"x-api-token": "PLACEHOLDER"}},
]).convert_configs_to_langchain_format()["s"]

print("connection_token   ->", sorted(with_token))
print("connection_headers ->", sorted(with_headers))
text Copy
connection_token   -> ['token', 'transport', 'url']
connection_headers -> ['transport', 'url']

connection_token trở thành một khóa token, mà nhà máy phiên se HTTP có thể không chấp nhận — nỗ lực kết nối kết thúc trong _create_streamable_http_session() got an unexpected keyword argument 'token', và danh sách công cụ trở lại rỗng.

connection_headers hoàn toàn không tồn tại qua quá trình chuyển đổi. Nhánh sẽ sao chép nó kiểm tra server_config.get("connection_type"), nhưng quá trình chuyển đổi chỉ bao giờ ghi một khóa transport, vì vậy bài kiểm tra không bao giờ khớp và các tiêu đề bị loại bỏ. Bởi vì điểm cuối Scrapeless xác thực trên một tiêu đề x-api-token, yêu cầu sau đó đến mà không được xác thực. Danh sách công cụ cũng rỗng vì lý do đó, đó là lý do tại sao hai triệu chứng trông giống nhau từ bên ngoài.

Sử dụng stdio cho đến khi một phiên bản được phát hành sao chép tiêu đề vào vận chuyển. Nó đến cùng một máy chủ và cùng 21 công cụ.

Gọi một công cụ trước khi đại lý tồn tại

Các công cụ được tải thông qua khách hàng MCP là callable thông thường, vì vậy bạn có thể sử dụng lớp lấy dữ liệu một mình. Đây là cách rẻ nhất để xác nhận khóa và vận chuyển của bạn là đúng, và nó không cần khóa nhà cung cấp mô hình.

python Copy
import asyncio
import os

from gpt_researcher.mcp.client import MCPClientManager

SCRAPELESS = {
    "name": "scrapeless",
    "command": "npx",
    "args": ["-y", "scrapeless-mcp-server@0.4.9"],
    "env": {"SCRAPELESS_KEY": os.environ["SCRAPELESS_KEY"], "PATH": os.environ["PATH"]},
}


def as_text(result) -> str:
    if isinstance(result, str):
        return result
    if isinstance(result, (list, tuple)):
        parts = [b["text"] for b in result if isinstance(b, dict) and "text" in b]
        if parts:
            return "\n".join(parts)
    return str(result)


async def main() -> None:
    manager = MCPClientManager([SCRAPELESS])
    tools = await manager.get_all_tools()
    scrape = next(tool for tool in tools if tool.name == "scrape_markdown")
    text = as_text(await scrape.ainvoke({"url": "https://quotes.toscrape.com/"}))
    print("characters:", len(text))
    print("first line:", text.split("\n")[0])


asyncio.run(main())

Cuộc gọi trả về trang dưới dạng markdown, được bọc trong phong bì khối nội dung mà giao thức định nghĩa. as_text làm phẳng phong bì đó, điều này quan trọng vì trả về thô là một danh sách các khối thay vì một chuỗi.

text Copy
characters: 4308
first line: Response:

Đưa cấu hình cho nhà nghiên cứu

Với vận chuyển đã được chứng minh, cùng một từ điển sẽ đưa vào GPTResearcher. Hai điều cần phải khớp: RETRIEVER phải gọi mcp, và mcp_configs phải chứa máy chủ. Bỏ qua biến môi trường và bộ thu MCP sẽ không bao giờ được xây dựng, điều này là cách phổ biến nhất mà sự tích hợp này dường như không làm gì cả.

Lưu ý: khối này là một khoảng trống điều kiện tiên quyết. GPTResearcher xây dựng một khách hàng nhúng trong __init__, vì vậy nó cần OPENAI_API_KEY có mặt trước khi đối tượng tồn tại, và conduct_research tiêu tốn tín dụng mô hình thực. Môi trường xác minh cho bài viết này không có khóa nhà cung cấp mô hình, vì vậy các dây chuyền bên dưới đã được xác nhận cho đến và bao gồm cả việc giải quyết bộ thu, và cuộc gọi nghiên cứu tự thân không được thực hiện.

python Copy
import asyncio
import os

os.environ["RETRIEVER"] = "mcp"

from gpt_researcher import GPTResearcher

SCRAPELESS = {
    "name": "scrapeless",
    "command": "npx",
    "args": ["-y", "scrapeless-mcp-server@0.4.9"],
    "env": {"SCRAPELESS_KEY": os.environ["SCRAPELESS_KEY"], "PATH": os.environ["PATH"]},
}


async def main() -> None:
    researcher = GPTResearcher(
        query="Which quotes and authors appear on quotes.toscrape.com?",
        mcp_configs=[SCRAPELESS],
    )
    await researcher.conduct_research()
    report = await researcher.write_report()
    print(report)


asyncio.run(main())

Việc gán phải được thực hiện trước khi GPTResearcher được xây dựng, vì nhà nghiên cứu đọc môi trường khi xây dựng đối tượng cấu hình của nó. Đặt nó trên trên nhập khẩu, như ở đây, là chính xác thứ tự khó nhất để sai.
RETRIEVER=mcp khiến Scrapeless trở thành nguồn nghiên cứu duy nhất, phù hợp cho các câu hỏi về các trang cụ thể. RETRIEVER=tavily,mcp và các kết hợp tương tự giữ một công cụ tìm kiếm bên cạnh nó, để đại lý tìm thấy các nguồn ứng viên theo một cách và đọc chúng theo cách khác. Cũng có MCP_STRATEGY, mặc định là fast và chạy bước MCP một lần trên truy vấn chính; deep chạy cho mọi truy vấn con được tạo ra và tốn nhiều chi phí hơn tỉ lệ thuận.

Sẵn sàng để cung cấp cho đại lý nghiên cứu của bạn một lớp lấy thông tin giữ vững trên các nguồn thực? Tạo một tài khoản Scrapeless miễn phí và kết nối nó trong vài dòng.

Kết luận

Việc kết nối rất đơn giản khi các phiên bản đã được cố định và lựa chọn phương tiện được xác định: cài đặt gpt-researcher==0.15.1 trên mcp==1.27.2, đặt RETRIEVER=mcp, và truyền một mcp_configs stdio đầu vào chỉ vào scrapeless-mcp-server. Điều đó tạo ra 21 công cụ, và scrape_markdown trả về nội dung trang thực tế trước khi mô hình được tham gia — điều này khiến lớp lấy thông tin có thể kiểm tra độc lập thay vì là thứ bạn phải gỡ lỗi qua một báo cáo đã hoàn thành.

Hai cạm bẫy thì cần ghi nhớ vì không cái nào tự công bố bản thân. Một mcp không được cố định sẽ im lặng tắt tính năng hỗ trợ MCP, và đường dẫn connection_url từ xa sẽ làm rơi thông tin xác thực của bạn xuống sàn. Cả hai đều tạo ra triệu chứng giống nhau của một đại lý nghiên cứu mà không bao giờ gọi máy chủ của bạn. Kiểm tra số lượng công cụ trước; nếu không phải là 21, thì không có gì phía dưới sẽ hoạt động.

So sánh các kế hoạch trên trang giá Scrapeless, và tài liệu tham khảo đầy đủ về công cụ sống trong tài liệu Scrapeless.

Câu hỏi thường gặp

H: Tôi có cần một khóa nhà cung cấp mô hình chỉ để kiểm tra kết nối MCP không?

Không. Tải công cụ và gọi chúng hoàn toàn chạy qua khách hàng MCP, vì vậy một khóa Scrapeless là đủ để xác nhận rằng phương tiện hoạt động và để gọi scrape_markdown trên một URL thực. Khóa mô hình trở nên cần thiết ngay khi bạn tạo GPTResearcher, vì một khách hàng nhúng được xây dựng trong quá trình khởi tạo.

H: Tại sao chạy của tôi lại bỏ qua máy chủ MCP ngay cả khi tôi đã truyền mcp_configs?

Biến môi trường RETRIEVER gần như luôn là nguyên nhân. mcp_configs chỉ không đủ để kích hoạt bộ thu MCP; RETRIEVER phải chỉ định mcp, hoặc là một mình hoặc trong một danh sách như tavily,mcp. Đặt nó trước khi bạn tạo GPTResearcher, vì giá trị sẽ được đọc trong khi người nghiên cứu xây dựng cấu hình của nó.

H: Tôi có thể kết nối với điểm cuối Scrapeless được lưu trữ thay vì chạy máy chủ cục bộ không?

Không qua mcp_configs trong khách hàng đã phát hành. connection_token được truyền đến phiên làm việc HTTP có thể stream như một tham số mà nó không chấp nhận, và connection_headers bị bỏ qua trong quá trình chuyển đổi cấu hình trước khi đến được phương tiện. Phương tiện stdio kết nối với cùng một máy chủ và tiếp xúc với cùng 21 công cụ, vì vậy đó là con đường làm việc ngày hôm nay.

H: Sự khác biệt giữa các chiến lược MCP nhanh và sâu là gì?

fast, mặc định, chạy bước MCP một lần sử dụng truy vấn chính. deep chạy cho mỗi truy vấn con mà đại lý tạo ra, điều này mở rộng phạm vi và nhân đôi cả số lần gọi công cụ và chi phí mô hình. Bắt đầu với fast và chuyển sang deep chỉ khi một báo cáo cụ thể trả về mỏng.

H: Tôi nên sử dụng RETRIEVER=mcp một mình hay kết hợp với bộ thu tìm kiếm?

Sử dụng mcp một mình khi bạn đã biết các trang nào quan trọng, vì vậy đại lý sẽ bỏ qua việc tạo ra truy vấn con và làm việc với các nguồn mà bạn chỉ định. Kết hợp nó, như trong tavily,mcp, khi khám phá là một phần của công việc — bộ thu tìm kiếm tìm kiếm các ứng viên và các công cụ MCP đọc chúng.

H: Tại sao phải cố định mcp thay vì lấy phiên bản mới nhất?

langchain-mcp-adapters yêu cầu mcp>=1.9.2 mà không có giới hạn trên, vì vậy một môi trường mới sẽ cài đặt phiên bản mới nhất. Từ 1.28 trở đi RequestContext không còn được xuất từ mcp.shared.context, nhập của bộ chuyển đổi sẽ thất bại, và GPT Researcher ghi nhận MCP là không khả dụng thay vì nâng cao. Cố định mcp==1.27.2 giữ cho bộ chuyển đổi có thể nhập được.

H: Số lượng công cụ có phải là điều tôi nên kiểm tra trong thiết lập của mình không?

Có, và đó là chẩn đoán nhanh nhất có sẵn. Một số lượng 21 nghĩa là phương tiện, khóa, và bộ chuyển đổi đều hoạt động. Số không có nghĩa là kết nối chưa bao giờ xác thực, và bất kỳ ngoại lệ nào trong get_all_tools đều được ghi lại thay vì nâng cao, vì vậy một danh sách trống là hình dạng của một kết nối thất bại từ mã của bạn.

H: scrape_markdown thực sự trả về cái gì?
Một danh sách các khối nội dung giao thức thay vì một chuỗi đơn giản, với markdown trang trên khối văn bản. Làm phẳng nó trước khi đo hoặc lưu trữ — coi giá trị trả về như một chuỗi sẽ cho ra đại diện Python của danh sách thay vì trang.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục