# Servidor MCP de búsqueda web para Claude Code, Claude Desktop, Cursor y otros clientes MCP

> Servidor MCP de búsqueda web para Claude Code, Claude Desktop y Cursor: un archivo Python con search_web y read_urls, registrado con un solo comando. Sin KYC.

- URL: https://llmwebsearch.com/es/docs/mcp/
- Última actualización: 2026-10-22
- Editor: LLMWebSearch (https://llmwebsearch.com)

Dale a cualquier cliente MCP dos herramientas: `search_web`, que devuelve fuentes clasificadas con las páginas principales ya leídas, y `read_urls`, que lee enlaces que el modelo ya tiene. El servidor es un archivo Python que se ejecuta en tu máquina, con tu clave en su entorno.

**Respuesta rápida — ¿Cómo añado un servidor MCP de búsqueda web a Claude Code o Claude Desktop?**

Guarda el breve servidor Python de esta página, que expone las herramientas `search_web` y `read_urls` que llaman a **LLMWebSearch**, y luego regístralo con `claude mcp add` o en `claude_desktop_config.json`, con tu clave en `env`. El modelo puede entonces buscar en la web en vivo y leer las páginas principales como Markdown. Una búsqueda cuesta 1 crédito, desde 1,20 US$/1K búsquedas a fecha de octubre de 2026. Sin KYC; paga con criptomonedas.

## El servidor MCP de un vistazo

| Atributo | Valor |
| --- | --- |
| Lenguaje | Python 3.10+, con los paquetes `mcp` y `httpx` |
| Transporte | stdio: el cliente inicia el servidor como un proceso local |
| Herramienta 1 | `search_web(query, max_results=5, read=3)` → fuentes numeradas con URLs y texto de la página |
| Herramienta 2 | `read_urls(urls)` → el contenido principal de 1 a 20 páginas conocidas |
| Nombres | No `web_search` ni `web_fetch`: Claude Code y OpenClaw ya incluyen herramientas con esos nombres |
| Clave | Lee de `LLMWEBSEARCH_API_KEY` en el entorno del servidor |
| Facturación | Un crédito paga una búsqueda: hasta 20 resultados clasificados, con las páginas de los 3 primeros leídas y devueltas como Markdown. Leer de 4 a 10 páginas pasa a 2 créditos. Una llamada que termina en error no cuesta nada. Leer páginas cuyas URL ya tienes cuesta 1 crédito por cada grupo iniciado de 3 páginas devueltas con contenido, hasta 20 URL por llamada; las URL rechazadas o fallidas no se cuentan |

## ¿Por qué las herramientas se llaman search_web y read_urls?

Porque dos herramientas con el mismo nombre confunden al cliente y al modelo. Claude Code y OpenClaw incluyen cada uno herramientas integradas llamadas `web_search` y `web_fetch`. Nombres distintos, con descripciones claras, permiten al modelo elegir las nuestras a propósito y a ti distinguir las llamadas en los logs.

Ambas herramientas devuelven texto, no JSON en bruto. Cada fuente empieza con un número, un título y su URL, así el modelo puede citar `[1]` o `[2]` y el lector puede comprobar la página.

*llmwebsearch_mcp.py*

```python
import os

import httpx
from mcp.server.fastmcp import FastMCP

BASE = "https://llmwebsearch.com/api/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]}
mcp = FastMCP("llmwebsearch")


def _call(path: str, body: dict) -> dict:
    resp = httpx.post(BASE + path, json=body, headers=HEADERS, timeout=90)
    data = resp.json()
    if resp.status_code != 200:
        err = data.get("error", {})
        raise RuntimeError(err.get("code", str(resp.status_code)) + ": " + err.get("message", ""))
    return data


def _page(n: int, item: dict) -> str:
    head = f"[{n}] {item.get('title') or item['url']}\n{item['url']}\n"
    if item.get("content_status") == "ok":
        return head + item["content"]
    return head + "(not read: " + item.get("content_status", "unknown") + ") " + item.get("snippet", "")


@mcp.tool()
def search_web(query: str, max_results: int = 5, read: int = 3) -> str:
    """Search the live web and return numbered sources; the first `read` pages include their text.

    Use it for current facts, documentation and news. Cite sources by their number.
    """
    body = {"q": query, "max_results": max(1, min(max_results, 20)), "read": max(0, min(read, 10)), "max_chars": 5000}
    data = _call("/search", body)
    return "\n\n".join(_page(i, r) for i, r in enumerate(data["results"], start=1))


@mcp.tool()
def read_urls(urls: list[str]) -> str:
    """Read 1 to 20 public web pages whose URLs you already have and return their main text."""
    data = _call("/extract", {"urls": urls[:20], "max_chars": 12000})
    return "\n\n".join(_page(i, r) for i, r in enumerate(data["results"], start=1))


if __name__ == "__main__":
    mcp.run()

```

## ¿Cómo instalo y pruebo el servidor?

Crea un entorno virtual, instala `mcp` y `httpx`, y guarda el archivo de arriba. `mcp` es el SDK oficial de Python del Model Context Protocol; su clase `FastMCP` convierte funciones Python tipadas en herramientas y usa cada docstring como descripción de la herramienta.

Inicia el archivo una vez desde un terminal con tu clave configurada. Luego espera en silencio a un cliente por la entrada estándar, lo que significa que funciona; deténlo con Ctrl+C. Los errores de la API se lanzan como errores de herramienta con su código, así el modelo ve `rate_limited` o `insufficient_credits` en palabras claras.

*Instalar e iniciar una vez*

```bash
python -m venv .venv
. .venv/bin/activate
pip install "mcp[cli]" httpx
LLMWEBSEARCH_API_KEY="your-key" python llmwebsearch_mcp.py
```

## ¿Cómo lo añado a Claude Code?

Usa `claude mcp add`. La documentación de Claude Code da la forma `claude mcp add [options] <name> -- <command> [args...]`: primero sus propias opciones, luego un doble guion, y después el comando que inicia el servidor. Las variables de entorno van en `--env KEY=value`, y al menos otra opción, como `--transport stdio`, debe ir entre `--env` y el nombre del servidor.

Añade `--scope user` para que el servidor esté disponible en todos tus proyectos; el ámbito predeterminado, `local`, cubre solo el proyecto actual. Usa rutas absolutas para el Python de tu entorno virtual y para el archivo del servidor.

*Registrar el servidor en Claude Code*

```bash
claude mcp add --env LLMWEBSEARCH_API_KEY=your-key --transport stdio --scope user llmwebsearch \
  -- /home/you/llmwebsearch/.venv/bin/python /home/you/llmwebsearch/llmwebsearch_mcp.py
```

## ¿Cómo lo añado a Claude Desktop y a otros clientes?

Claude Desktop lee los servidores desde `claude_desktop_config.json`, en `mcpServers`. Dale un nombre al servidor, el comando, sus argumentos y un objeto `env` que contenga la clave, y luego reinicia la aplicación; `search_web` y `read_urls` aparecen en la lista de herramientas.

Otros clientes MCP, como Cursor, piden esas mismas tres cosas en sus propios ajustes MCP: un comando, sus argumentos y variables de entorno. La clave nunca aparece en un argumento de herramienta ni en la conversación.

*claude_desktop_config.json*

```json
{
  "mcpServers": {
    "llmwebsearch": {
      "command": "/home/you/llmwebsearch/.venv/bin/python",
      "args": ["/home/you/llmwebsearch/llmwebsearch_mcp.py"],
      "env": { "LLMWEBSEARCH_API_KEY": "your-key" }
    }
  }
}
```

## ¿Cómo mantengo las búsquedas económicas y breves?

Dile al modelo cómo buscar en tus instrucciones: una o dos búsquedas por pregunta y luego lee más solo si las fuentes no coinciden. El servidor ya limita cada página a 5.000 caracteres en `search_web` y 12.000 en `read_urls`; baja esos números para modelos pequeños.

Cada llamada a `search_web` con `read` hasta 3 es un crédito. Un asistente que hace 40 búsquedas al día usa unos 1.200 créditos al mes, así que 5.000 búsquedas (9,25 US$) dura alrededor de cuatro meses. Los créditos de búsqueda no caducan: lo que no uses este mes seguirá ahí el año que viene.

## ¿Qué ve el modelo cuando no se puede leer una página?

La fuente sigue apareciendo, con su número, título y URL, seguida del motivo entre corchetes y el fragmento de la búsqueda. Nuestro lector respeta robots.txt: se identifica como LLMWebSearch, sigue las reglas que un sitio escribe para él o para todos los robots, y deja fuera el contenido de cualquier página que no tenga permitido leer. Cuando un sitio rechaza a nuestro lector, el resultado vuelve sin contenido y con el estado del sitio: nunca resolvemos CAPTCHAs, iniciamos sesión en cuentas ni sorteamos un bloqueo o un paywall. El modelo puede entonces apoyarse en las otras fuentes o decir que una página no estaba disponible.

## Servidor MCP: preguntas frecuentes

### ¿Existe un paquete MCP oficial de LLMWebSearch o un endpoint alojado?

No. El archivo de esta página es la integración: unas 50 líneas que puedes leer y modificar. Se ejecuta en tu máquina y tu clave solo viaja a nuestra API.

### ¿Debo desactivar la búsqueda web integrada de Claude Code?

No hace falta. Pueden convivir ambas; las descripciones le dicen al modelo qué hace cada una. Mantén la nuestra cuando quieras el texto de la página en los resultados, un precio fijo por búsqueda o un único lugar para tus registros de búsqueda.

### ¿Puedo usarlo con OpenClaw?

Sí, como un servidor MCP registrado con `openclaw mcp add`. La [página de OpenClaw](https://llmwebsearch.com/es/docs/openclaw/) da el comando y explica cómo convive con los proveedores de búsqueda integrados de OpenClaw.

### ¿El servidor guarda mis búsquedas?

No. No conserva nada entre llamadas. Por nuestra parte, No entrenamos ningún modelo con tus consultas ni con lo que devuelve la API, y no añadimos ninguna regla propia contra almacenar resultados; los derechos de los sitios cuyas páginas lees siguen aplicándose.

## Fuentes

1. [Conectar Claude Code a herramientas mediante MCP](https://code.claude.com/docs/en/mcp) — Claude Code docs (read 2026-10-22)

---

LLMWebSearch: LLMWebSearch es una API de búsqueda web para agentes de IA que devuelve resultados clasificados con el contenido de las mejores páginas en Markdown, se paga con criptomonedas y sin subir documentos de identidad. Los créditos prepago desde 1,20 US$/1K búsquedas nunca caducan. Sin KYC: sin ID, sin selfie, sin documentos. Paga con criptomonedas.
