GPT Investigador + MCP Sin Scrap: Dale a Tu Agente de Investigación una Capa de Obtención Real
Senior Web Scraping Engineer
TL;DR:
- GPT Researcher lee la web a través de recuperadores, y el
mcprecuperador convierte cualquier servidor MCP en una fuente de investigación, por lo que el Servidor MCP Scrapeless se convierte en la capa que realmente obtiene páginas. - Configurar
RETRIEVER=mcpes obligatorio. Pasarmcp_configssin ello deja el recuperador MCP apagado, y la ejecución vuelve a lo que esté configurado. - El transporte stdio es el camino que funciona hoy:
npx -y scrapeless-mcp-server@0.4.9conSCRAPELESS_KEYenenvcarga todas las 21 herramientas. - La ruta remota
connection_urlno se autentica en el cliente lanzado.connection_tokenllega al transporte como un argumentotokenno soportado, yconnection_headersnunca llega en absoluto. - Fija tus versiones.
gpt-researcher==0.16.0elevaNameErroren la importación, ymcplanzamientos desde 1.28 en adelante desactivan el soporte MCP dentro delangchain-mcp-adapterssin un mensaje de error. scrape_markdownenhttps://quotes.toscrape.com/devuelve 4308 caracteres de contenido de página a través del recuperador, y puedes llamarlo antes de que se involucre cualquier modelo.- Solo la ejecución de investigación en sí necesita una clave de proveedor de modelo; cargar y llamar a herramientas no necesita nada más que tu clave Scrapeless.
- Comienza con el plan gratuito de Scrapeless y dale a tu agente de investigación una verdadera capa de obtención.
GPT Researcher planea una consulta, busca, lee lo que encuentra y escribe un informe citado. La parte de búsqueda está bien servida: envía recuperadores para Google, Bing, Brave, arXiv, PubMed y más. La parte de lectura es donde la investigación autónoma se degrada silenciosamente: un recuperador devuelve una lista de URLs, y algo todavía tiene que convertir esas URLs en texto. Cuando esa obtención devuelve una página de desafío o un caparazón vacío, el informe se escribe de todos modos, a partir de cualquier contenido delgado que regresó.
El mcp recuperador cambia lo que se encuentra en ese espacio. Señala a GPT Researcher hacia un servidor MCP y las herramientas del servidor se convierten en la superficie de investigación, por lo que la obtención de páginas se ejecuta a través de una infraestructura construida para ello en lugar de un simple HTTP get. Esta guía conecta GPT Researcher al Servidor MCP Scrapeless, lista las herramientas que expone, llama a una de verdad y marca exactamente qué paso es el primero que necesita una clave de proveedor de modelo.
Lo que el Servidor MCP Scrapeless da a un Agente de Investigación
El Servidor MCP Scrapeless expone herramientas de raspado y navegador a través del Protocolo de Contexto del Modelo, por lo que la capa de obtención es algo que tu agente llama en lugar de algo que tú construyes. Una conexión sirve 21 herramientas: scrape_markdown y scrape_html para contenido de página, google_search y google_trends para datos de búsqueda, scrape_screenshot para capturas, y un conjunto de 16 herramientas browser_* que impulsa un navegador en la nube a través de navegación, clics, escritura, desplazamiento y espera.
Para un agente de investigación, la importante es scrape_markdown. La calidad del informe de GPT Researcher depende del texto que recolecta, y el markdown ya es la forma que su contexto quiere. Las herramientas browser_* son relevantes cuando una fuente solo se renderiza después de la interacción: funcionan en el navegador en la nube de Scrapeless, por lo que un agente puede alcanzar una página renderizada sin un navegador en la máquina de investigación.
La capa del protocolo sigue la especificación del Protocolo de Contexto del Modelo, que transmite sus mensajes a través de la especificación JSON-RPC 2.0. Si deseas que el protocolo se explique en sus propios términos primero, ¿Qué es MCP? lo cubre, y LangChain + Scrapeless MCP muestra el mismo servidor conectado a una pila diferente.
Requisitos Previos
- Python 3.10 o posterior.
- Node.js en la máquina que ejecuta la investigación, porque el transporte stdio lanza el servidor con
npx. - Una clave API de Scrapeless del panel, exportada como
SCRAPELESS_KEY. - Una clave de proveedor de modelo como
OPENAI_API_KEY. GPT Researcher construye un cliente de embeddings mientras construye el objeto investigador, por lo que esta variable debe ser configurada antes de ese paso: todo hasta e incluyendo la llamada a herramientas MCP funciona sin ello.
Instalar
La fijación de versiones no es opcional aquí, y dos pines específicos están haciendo un trabajo real.
bash
pip install "gpt-researcher==0.15.1" "langchain-mcp-adapters==0.3.1" "mcp==1.27.2"
gpt-researcher==0.16.0 no se puede importar. Su actions/query_processing.py define un helper cuya firma anota Any y List varias líneas por encima del from typing import Any, List, Dict que las definiría, y debido a que las anotaciones en un def simple se evalúan cuando se construye el objeto de la función — el comportamiento la propuesta de anotación pospuesta fue escrita para cambiar — la importación genera NameError: name 'Any' is not defined antes de que se ejecute cualquier otra cosa. La versión 0.15.1 no tiene ese problema de orden.
El mcp pin es más sutil. langchain-mcp-adapters declara su requisito como mcp>=1.9.2, un piso no acotado en el sentido descrito por la especificación del especificador de dependencia de Python, por lo que una instalación fresca extrae lo que mcp sea más nuevo. Las versiones desde 1.28 en adelante ya no exportan RequestContext desde mcp.shared.context, que el adaptador importa al cargar el módulo. GPT Researcher captura ese ImportError y establece una bandera de disponibilidad interna en falso, por lo que MCP no falla de manera ruidosa — simplemente deja de existir, y su investigación se ejecuta sin tocar nunca el servidor.
Configure su clave en la terminal en lugar de en el código fuente.
bash
export SCRAPELESS_KEY="your_api_key_here"
Conectar a través de stdio y listar las herramientas
La capa MCP de GPT Researcher toma una lista de diccionarios de configuración del servidor. Para un servidor stdio, le da un nombre, el comando, sus argumentos y cualquier entorno que el servidor necesite. MCPClientManager convierte eso en la configuración de transporte y ejecuta el apretón de manos.
python
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())
Incluya PATH en env. El proceso del servidor se inicia con exactamente el entorno que usted proporciona, por lo que dejar PATH fuera significa que npx no se puede encontrar.
El servidor en vivo devuelve 21 herramientas con solo la clave Scrapeless configurada.
text
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
Por qué la ruta de URL remota aún no funciona
La tabla de configuración en la documentación de GPT Researcher lista connection_url y connection_token para servidores remotos, que se lee como la adaptación natural para un punto final alojado. En el cliente liberado, ninguna clave le proporciona una conexión autenticada, y vale la pena ver por qué antes de que pase una tarde en ello.
Ambos fallos son visibles sin una llamada de red, porque convert_configs_to_langchain_format es la función que decide qué recibe el transporte.
python
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
connection_token -> ['token', 'transport', 'url']
connection_headers -> ['transport', 'url']
connection_token se convierte en una clave token, que la fábrica de sesión HTTP transmisible no acepta — el intento de conexión termina en _create_streamable_http_session() got an unexpected keyword argument 'token', y la lista de herramientas regresa vacía.
connection_headers no sobrevive a la conversión en absoluto. La rama que copiaría esto prueba server_config.get("connection_type"), pero la conversión solo escribe una clave transport, por lo que la prueba nunca coincide y los encabezados se descartaron. Debido a que el punto final Scrapeless se autentica en un encabezado x-api-token, la solicitud llega sin autenticar. La lista de herramientas está vacía por esa razón también, lo que explica por qué los dos síntomas parecen idénticos desde el exterior.
Utilice stdio hasta que una versión complete copie los encabezados en el transporte. Llega al mismo servidor y a las mismas 21 herramientas.
Llamar a una herramienta antes de que exista el agente
Las herramientas cargadas a través del cliente MCP son llamadas ordinarias, por lo que puede ejercitar la capa de recuperación por su cuenta. Esta es la forma más económica de confirmar que su clave y transporte son correctos, y no necesita una clave de proveedor de modelos.
python
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())
La llamada devuelve la página como markdown, envuelta en el sobre de bloque de contenido que define el protocolo. as_text aplana ese sobre, lo cual es importante porque la devolución en bruto es una lista de bloques en lugar de una cadena.
text
characters: 4308
first line: Response:
Entregar la configuración al investigador
Con el transporte probado, el mismo diccionario va a GPTResearcher. Dos cosas deben alinearse: RETRIEVER debe nombrar mcp, y mcp_configs debe llevar el servidor. Si se pierde la variable de entorno, el recuperador de MCP nunca se construye, que es la forma más común en que esta integración parece no hacer nada.
Nota: este bloque es una brecha de requisitos previos.
GPTResearcherconstruye un cliente de embeddings durante__init__, por lo que necesita queOPENAI_API_KEYesté presente antes de que el objeto exista, yconduct_researchgasta créditos reales de modelo. El entorno de verificación para este artículo no tenía clave de proveedor de modelos, por lo que el cableado a continuación se confirmó hasta e incluyendo la resolución del recuperador, y la llamada de investigación en sí no se ejecutó.
python
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())
La asignación debe completarse antes de que GPTResearcher se construya, porque el investigador lee el entorno mientras construye su objeto de configuración. Colocarlo por encima de la importación, como aquí, es simplemente el orden que es más difícil de cometer errores.
RETRIEVER=mcp hace que Scrapeless sea la única fuente de investigación, que se adapta a preguntas sobre páginas específicas. RETRIEVER=tavily,mcp y combinaciones similares mantienen un motor de búsqueda junto a él, de modo que el agente encuentra fuentes candidatas de una manera y las lee de la otra. También está MCP_STRATEGY, que se configura por defecto en fast y ejecuta el paso de MCP una vez contra la consulta principal; deep lo ejecuta para cada subconsulta generada y cuesta proporcionalmente más.
¿Listo para darle a tu agente de investigación una capa de búsqueda que se mantenga en fuentes reales? Crea una cuenta gratuita en Scrapeless y conéctalo en unas pocas líneas.
Conclusión
El cableado es breve una vez que se fijan las versiones y la elección del transporte: instala gpt-researcher==0.15.1 contra mcp==1.27.2, configura RETRIEVER=mcp y pasa una entrada stdio mcp_configs apuntando a scrapeless-mcp-server. Eso produce 21 herramientas, y scrape_markdown devuelve contenido de página real antes de que un modelo esté involucrado, lo que hace que la capa de búsqueda sea comprobable por sí sola en lugar de ser algo que depuras a través de un informe terminado.
Las dos trampas son dignas de recordar porque ninguna se anuncia a sí misma. Una mcp no fijada apaga el soporte MCP silenciosamente, y el camino remoto connection_url deja tus credenciales en el suelo. Ambas producen el mismo síntoma de un agente que investiga sin nunca llamar a tu servidor. Verifica primero el conteo de herramientas; si no son 21, nada a continuación funcionará.
Compara planes en la página de precios de Scrapeless, y la referencia completa de herramientas se encuentra en la documentación de Scrapeless.
Preguntas Frecuentes
P: ¿Necesito una clave de proveedor de modelo solo para probar la conexión MCP?
No. Cargar herramientas y llamarlas se ejecuta completamente a través del cliente MCP, por lo que una clave de Scrapeless es suficiente para confirmar que el transporte funciona y para llamar a scrape_markdown en una URL real. La clave del modelo se vuelve necesaria en el momento en que construyes GPTResearcher, porque un cliente de embeddings se construye durante la inicialización.
P: ¿Por qué mi ejecución ignora el servidor MCP aunque pasé mcp_configs?
La variable de entorno RETRIEVER es casi siempre la causa. mcp_configs por sí solo no habilita el recuperador MCP; RETRIEVER debe nombrar mcp, ya sea solo o en una lista como tavily,mcp. Configúralo antes de construir GPTResearcher, ya que el valor se lee mientras el investigador construye su configuración.
P: ¿Puedo conectarme al endpoint de Scrapeless alojado en vez de ejecutar el servidor localmente?
No a través de mcp_configs en el cliente liberado. connection_token se pasa a la sesión HTTP transmitible como un argumento que no acepta, y connection_headers se elimina durante la conversión de configuración antes de que llegue al transporte. El transporte stdio se conecta al mismo servidor y expone las mismas 21 herramientas, por lo que es el camino operativo hoy.
P: ¿Cuál es la diferencia entre las estrategias MCP rápida y profunda?
fast, el predeterminado, ejecuta el paso de MCP una vez usando la consulta principal. deep lo ejecuta para cada subconsulta que genera el agente, lo que amplía la cobertura y multiplica tanto las llamadas a herramientas como el gasto del modelo. Comienza con fast y pasa a deep solo cuando un informe específico está volviendo delgado.
P: ¿Debería usar RETRIEVER=mcp por sí solo o combinarlo con un recuperador de búsqueda?
Usa mcp solo cuando ya sepas qué páginas importan, porque el agente salta la generación de subconsultas y trabaja con las fuentes que le indiques. Combínalo, como en tavily,mcp, cuando el descubrimiento sea parte del trabajo: el recuperador de búsqueda encuentra candidatos y las herramientas de MCP los leen.
P: ¿Por qué fijar mcp en lugar de tomar la versión más nueva?
langchain-mcp-adapters requiere mcp>=1.9.2 sin límite superior, por lo que un entorno nuevo instala la versión más reciente. Desde la 1.28 en adelante RequestContext ya no se exporta desde mcp.shared.context, la importación del adaptador falla, y GPT Researcher registra MCP como no disponible en lugar de elevar. Fijar mcp==1.27.2 mantiene la importación del adaptador.
P: ¿Es el conteo de herramientas algo que debería verificar en mi propia configuración?
Sí, y es el diagnóstico más rápido disponible. Un conteo de 21 significa que el transporte, la clave y el adaptador están funcionando. Cero significa que la conexión nunca se autenticó, y cualquier excepción durante get_all_tools se registra en lugar de elevarse, así que una lista vacía es lo que parece ser una conexión fallida desde tu código.
P: ¿Qué devuelve realmente scrape_markdown?
Una lista de bloques de contenido de protocolo en lugar de una cadena plana, con el markdown de la página en el bloque de texto. Simplifícalo antes de medir o almacenarlo, tratando el valor de retorno como una cadena da como resultado la representación de Python de la lista en lugar de la página.
En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.



