Volver al blog

LangGraph + Scrapeless: Conecta herramientas web en vivo a tu gráfico de agentes.

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

22-Jul-2026

Resumen:

  • LangGraph carga las herramientas del servidor Scrapeless MCP a través de langchain-mcp-adapters y entrega las 21 a un gráfico de agentes, desde scrape_markdown hasta un conjunto completo de navegador.
  • MultiServerMCPClient.get_tools ejecuta el apretón de manos y devuelve las herramientas; no se necesita una clave de proveedor de modelo para cargarlas o para llamar a una directamente.
  • langchain-mcp-adapters devuelve cada resultado de herramienta como una lista de bloques de contenido, por lo que lees result[0]["text"] en lugar de convertir la lista a cadena.
  • El agente en sí se construye con from langchain.agents import create_agent, el reemplazo actual del obsoleto create_react_agent.
  • Solo el gráfico create_agent y su ejecución ainvoke necesitan una clave de modelo; cargar y llamar a las herramientas no lo requieren.
  • Comienza con el plan gratuito de Scrapeless y proporciona a tu gráfico herramientas web reales.

LangGraph construye un agente como un grafo: una máquina de estados que se mueve entre el modelo y sus herramientas hasta que la tarea está completa. Ese diseño es tan útil como las herramientas en el gráfico, y un agente LangGraph desnudo no tiene ninguna que alcance la web en tiempo real. El Protocolo de Contexto del Modelo llena ese vacío. Apunta el adaptador MCP de LangGraph a un servidor y cada herramienta que expone se convierte en una herramienta de LangChain que tu gráfico puede llamar.

Esta guía conecta LangGraph al Servidor MCP de Scrapeless, carga sus 21 herramientas, llama a una de verdad y muestra exactamente dónde se vuelve necesaria una clave de proveedor de modelo. La carga de herramientas y la llamada directa se verifican contra el servidor en vivo; el paso de generación se marca como el único requisito previo que necesita.

Por qué Scrapeless MCP

El Servidor MCP de Scrapeless expone herramientas de raspado web y navegador que un agente puede llamar directamente, por lo que la capa de raspado no es algo que debas construir o alojar. Una conexión sirve 21 herramientas: scrape_markdown y scrape_html para contenido, google_search y google_trends para datos de búsqueda, scrape_screenshot para capturas y un conjunto completo de browser_* que impulsa un navegador en la nube. LangGraph ya tiene una fuerte historia MCP a través de langchain-mcp-adapters, que convierte esas herramientas en herramientas estándar de LangChain sin código de pegamento.

Las herramientas browser_* impulsan el navegador en la nube de Scrapeless, por lo que un agente puede navegar una página interactiva y leer lo que se renderiza, todo en la infraestructura de Scrapeless en lugar de un grupo de navegadores local. Si estás usando LangChain normal en lugar de LangGraph, la publicación LangChain + Scrapeless MCP cubre el mismo servidor desde ese lado.

Requisitos previos

  • Python 3.10 o posterior.
  • Una clave API de Scrapeless desde el panel, exportada como SCRAPELESS_API_KEY.
  • Una clave de proveedor de modelo (como OPENAI_API_KEY) solo para la ejecución del agente. Cargar y llamar a las herramientas no necesita una.

Instalación

Instala LangGraph, LangChain y el adaptador MCP.

bash Copy
pip install langgraph langchain langchain-mcp-adapters

Establece tu clave Scrapeless en la terminal. Usa la clave real en el tiempo de ejecución y mantén el marcador fuera de tu código fuente.

bash Copy
export SCRAPELESS_API_KEY="sk_tu_clave_aquí"

Cargar las herramientas

MultiServerMCPClient toma un mapeo de nombres de servidores a configuraciones de conexión. Cada configuración nombra el transporte, la URL y los encabezados; la clave Scrapeless se lleva en el encabezado x-api-token. get_tools ejecuta el apretón de manos y devuelve las herramientas como herramientas de LangChain.

python Copy
import asyncio
import os

from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "scrapeless": {
            "url": "https://api.scrapeless.com/mcp",
            "transport": "streamable_http",
            "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
        }
    }
)


async def main() -> None:
    tools = await client.get_tools()
    names = sorted(t.name for t in tools)
    print("cantidad de herramientas:", len(names))
    print("herramientas:", ", ".join(names))


asyncio.run(main())

El servidor en vivo devuelve 21 herramientas, cargadas solo con la clave de Scrapeless configurada.

text Copy
cantidad de herramientas: 21
herramientas: 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

El cliente se llama MultiServerMCPClient porque federó varios servidores MCP a la vez; aquí mantiene un servidor, y agregar otro es otra entrada en el mapeo, no un cambio en el agente. La capa de transporte y mensajes sigue la especificación del Protocolo de Contexto del Modelo, que se basa en la especificación JSON-RPC 2.0.

Llamar a una Herramienta

Llama a una herramienta manualmente antes de conectarla a un grafo. Cada herramienta cargada es una herramienta de LangChain con un método ainvoke, así que pasas los argumentos y lees el resultado. Un detalle importa: el adaptador devuelve una lista de bloques de contenido, no una cadena simple, así que toma el texto del primer bloque.

python Copy
import asyncio
import os

from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "scrapeless": {
            "url": "https://api.scrapeless.com/mcp",
            "transport": "streamable_http",
            "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
        }
    }
)


async def main() -> None:
    tools = await client.get_tools()
    scrape_markdown = next(t for t in tools if t.name == "scrape_markdown")
    result = await scrape_markdown.ainvoke({"url": "https://quotes.toscrape.com/"})
    # langchain-mcp-adapters devuelve una lista de bloques de contenido; toma el bloque de texto
    text = result[0]["text"] if isinstance(result, list) and result else str(result)
    print("caracteres de markdown:", len(text))
    print("contiene una cita:", "El mundo tal como lo hemos creado" in text)


asyncio.run(main())

La llamada devuelve la página en Markdown, y la verificación de contenido confirma que hay una cita real presente.

text Copy
caracteres de markdown: 4308
contiene una cita: True

Leer result[0]["text"] es la parte que el código ingenuo no comprende: convertir toda la lista en cadena te da un repr de Python con secuencias de escape, no el Markdown limpio. La guía del adaptador LangChain MCP documenta completamente el cliente y la forma del resultado.

Construir el Grafo del Agente

Con las herramientas cargadas, el agente es una llamada. create_agent construye un grafo estilo ReAct que gira entre el modelo y las herramientas, y es el reemplazo actual del obsoleto create_react_agent. Este es el paso que necesita una clave de proveedor de modelo: el grafo ejecuta el modelo, y el modelo decide cuándo llamar a scrape_markdown o a cualquier otra herramienta.

Nota: construir y ejecutar el grafo necesita una clave de proveedor de modelo como OPENAI_API_KEY, que no está establecida aquí. Cargar las 21 herramientas y la llamada directa a scrape_markdown anterior se ejecutan sin ella. Este bloque se muestra con su forma exacta; solo el viaje de ida y vuelta del modelo es una brecha de prerrequisitos.

python Copy
from langchain.agents import create_agent


async def run_graph(tools) -> None:
    agent = create_agent("openai:gpt-4o", tools)
    result = await agent.ainvoke(
        {"messages": [{"role": "user", "content": "Recupera https://quotes.toscrape.com/ con scrape_markdown y lista las primeras tres citas con autores."}]}
    )
    print(result["messages"][-1].content)

En tiempo de ejecución, el grafo pasa el mensaje al modelo, el modelo llama a scrape_markdown con la URL, la herramienta devuelve el Markdown que ya se demostró en la llamada directa, y el modelo escribe la respuesta. Las herramientas son los mismos objetos ya sea que las llame el modelo o tú.

Conclusión

LangGraph más el Servidor MCP Scrapeless es un camino corto desde un grafo vacío hasta uno que lee la web en vivo. MultiServerMCPClient carga las 21 herramientas, ainvoke prueba que una funciona y muestra cómo leer sus bloques de contenido, y create_agent convierte las herramientas en un grafo en ejecución. Solo ese último paso necesita una clave de modelo, así que puedes cargar y probar toda la superficie de herramientas primero. Comienza desde los scripts anteriores, acota las herramientas a lo que el grafo necesita y deja que el modelo dirija.

Crea una cuenta gratuita en Scrapeless para obtener una clave de API, y consulta los precios de Scrapeless cuando planees un agente recurrente.

FAQ

Q: ¿Necesita LangGraph una clave de modelo para cargar herramientas MCP?

No. MultiServerMCPClient.get_tools ejecuta el apretón de manos y devuelve las herramientas con solo la clave de API de Scrapeless establecida, y cada herramienta se puede llamar directamente con ainvoke. Una clave de proveedor de modelo solo es necesaria cuando construyes y ejecutas el grafo del agente con create_agent, porque es cuando el modelo mismo decide qué herramientas llamar.

Q: ¿Por qué el resultado de la herramienta vuelve como una lista en lugar de como una cadena?
langchain-mcp-adapters devuelve cada resultado de herramienta MCP como una lista de bloques de contenido, que es cómo MCP representa la salida de la herramienta. Lee el texto del primer bloque con result[0]["text"]; convertir toda la lista a una cadena te dará un repr con secuencias de escape en lugar del contenido limpio.

P: ¿Debería usar create_react_agent o create_agent?

Usa create_agent de langchain.agents. create_react_agent se trasladó de langgraph.prebuilt en LangGraph 1.0 y ahora emite una advertencia de desaprobación, así que el camino actual, sin advertencias, es from langchain.agents import create_agent con los mismos argumentos de modelo y herramientas.

P: ¿Para qué sirve MultiServerMCPClient si solo tengo un servidor?

El cliente está diseñado para federar varios servidores MCP a la vez, pero funciona con un solo servidor como un mapeo de una entrada. Usarlo ahora significa que agregar un segundo servidor más adelante es una entrada más en la configuración, sin cambios en cómo el agente consume las herramientas.

P: ¿Cómo doy al gráfico solo algunas de las herramientas?

get_tools devuelve una lista, así que filtra antes de pasarla a create_agent. Darle al gráfico solo scrape_markdown y google_search es más seguro que el conjunto completo de 21 herramientas cuando la tarea necesita solo contenido y búsqueda.

P: ¿Está el scraping a través de las herramientas limitado por las reglas del objetivo?

Sí. Las herramientas obtienen páginas públicas y tú sigues siendo responsable de respetar los términos de cada objetivo y sus directivas del Protocolo de Exclusión de Robots. Mantén el volumen limitado y los datos públicos, y delimita el gráfico a las herramientas que realmente necesita la tarea.

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.

Artículos más populares

Catalogar