Keenable Web Search
Búsqueda web en vivo y obtención de páginas en markdown limpio a través del índice web de Keenable, sin clave por defecto.
Documentación
MCP
Conecta las APIs de Keenable como herramientas a clientes que soporten MCP
Las herramientas de Keenable también están disponibles como un servidor del Protocolo de Contexto de Modelo, por lo que agentes como Claude Code, Claude Desktop, Cursor y Windsurf pueden llamarlas directamente. Pasa tu clave de API en el encabezado X-API-Key para eliminar el límite de solicitudes por hora y aumentar los límites de tasa — consulta Autenticación y Límites de tasa. Omite el encabezado y el servidor igualmente responde, en el nivel público compartido.
Instalación
Instalación con un clic
Añade Keenable a Cursor o VS Code con un solo clic:
Instalación mediante CLI
La forma más sencilla de configurar el servidor MCP de Keenable para agentes de codificación locales es a través de la CLI de Keenable. Una vez que hayas instalado la CLI, ejecuta lo siguiente para recibir orientación durante la configuración del servidor MCP.
keenable configure-mcp
Claude Code
Añade el servidor MCP de Keenable con la CLI de Claude Code:
claude mcp add keenable \
--transport http https://api.keenable.ai/mcp \
--scope user \
--header "X-API-Key: keen_<your_key>"
Omite la bandera --header para ejecutar en el nivel público.
Codex
Añade lo siguiente a ~/.codex/config.toml
[mcp_servers.keenable]
url = "https://api.keenable.ai/mcp"
http_headers = { "X-API-Key" = "keen_<your_key>" }
Omite la línea http_headers para ejecutar en el nivel público.
Nota
Codex necesita una línea más. Incluye su propia búsqueda web, habilitada por defecto, y sigue recurriendo a ella — por lo que las herramientas aparecen en
/mcppero nunca se llaman a menos que las solicites por nombre. Añadeweb_search = "disabled"al mismo archivo, encima de la línea[mcp_servers.keenable]— es una clave de nivel superior, y una clave simple escrita bajo un encabezado de tabla pertenece a esa tabla, donde Codex nunca la lee. Consulta Codex para ver el archivo terminado, los otros modos y un fragmento deAGENTS.md.
Otros clientes MCP
Para Cursor y otros clientes que aceptan una URL MCP remota en su archivo de configuración:
{
"mcpServers": {
"keenable": {
"url": "https://api.keenable.ai/mcp",
"headers": {
"X-API-Key": "keen_<your_key>"
}
}
}
}
Omite el bloque headers para ejecutar en el nivel público.
Advertencia
Claude Desktop no es uno de estos clientes. Su archivo de configuración solo acepta servidores
commandlocales, por lo que una entrada"url"se ignora sin error y las herramientas nunca aparecen. Usa un conector en su lugar, o el puente local si quieres que se aplique tu clave.
API de OpenAI (API de Respuestas)
Esto es para llamar al servidor MCP desde tu propio código contra la API de OpenAI — diferente de añadir Keenable dentro de la propia aplicación de ChatGPT, que es el listado del Directorio de Plugins. Pásalo como una herramienta mcp remota:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
input="What's new in retrieval-augmented generation this week?",
tools=[
{
"type": "mcp",
"server_label": "keenable",
"server_url": "https://api.keenable.ai/mcp",
"headers": {"X-API-Key": "keen_<your_key>"},
"require_approval": "never",
}
],
)
print(response.output_text)
Omite la entrada headers para ejecutar en el nivel público.
Nota
La búsqueda y recuperación de Keenable cubren el mismo terreno que las herramientas integradas de un cliente (
WebSearch,WebFetch,brave_search,tavily_search). Con ambos conjuntos activos, un agente elige entre ellos de manera inconsistente de una llamada a otra, por lo que la mayoría de las personas desactivan las integradas en la configuración del cliente una vez que Keenable está en su lugar.
Claude (conector remoto)
Claude (Desktop, claude.ai, móvil) se conecta al servidor MCP remoto a través de su interfaz de conector personalizado — no se necesita archivo de configuración. La conexión se realiza desde la nube de Anthropic, por lo que tu servidor solo necesita ser accesible en su URL pública.
Keenable es un conector listado en Claude, así que abre **Configuración → Conectores**, encuentra **Keenable**, y no hay nada que pegar.Nota
ChatGPT se instala desde el Directorio de Plugins — Keenable está publicado allí, por lo que viene del catálogo y te inicia sesión en tu cuenta de Keenable. Codex puede instalarse desde el mismo listado, pero tiene una ruta
config.tomlpropia.
De lo contrario, añádelo por URL — **Configuración → Conectores → Añadir conector personalizado** — dejando vacíos el ID de Cliente OAuth / Secreto:
```
https://api.keenable.ai/mcp
```
Un conector recién añadido no está activo hasta que lo conectes. Abre **Gestionar conectores**, encuentra **Keenable**, y haz clic en **Conectar** — las herramientas aparecen inmediatamente. La interfaz del conector no tiene campo para un encabezado de solicitud, por lo que se ejecuta en el nivel público; usa el [puente local](#local-bridge-with-an-api-key) si quieres que se aplique tu propia clave.
En el compositor, haz clic en **+ → Conectores** y activa **Keenable** para la conversación.
Puente local (con una clave de API)
Cualquier cliente que solo hable stdio local — el archivo de configuración de Claude Desktop es el caso común, ya que su interfaz de conector no tiene campo para un encabezado — necesita un puente para aplicar tu propia clave. @keenable/mcp-server se ejecuta como un subproceso y reenvía al mismo endpoint:
{
"mcpServers": {
"keenable": {
"command": "npx",
"args": ["-y", "@keenable/mcp-server"],
"env": {
"KEENABLE_API_KEY": "keen_<your_key>"
}
}
}
}
Requiere Node.js en la máquina, y el cliente debe reiniciarse después de editar su archivo de configuración (para Claude Desktop, claude_desktop_config.json). Omite el bloque env para ejecutarlo sin clave. El mismo bloque funciona tal cual en el archivo de configuración de cualquier otro cliente solo-stdio, no solo en el de Claude Desktop.
Herramientas disponibles
El servidor MCP expone dos herramientas.
search_web_pages
Busca en la web y devuelve resultados clasificados con URLs, títulos y descripciones.
La consulta de búsqueda. Restringe los resultados a un sitio específico (p. ej. `"techcrunch.com"`). Filtra a páginas adquiridas/indexadas en o después de este punto en el tiempo. Filtra a páginas adquiridas/indexadas en o antes de este punto en el tiempo. Filtra a páginas publicadas en o después de este punto en el tiempo. Filtra a páginas publicadas en o antes de este punto en el tiempo. Busca en el índice tal como estaba en este punto en el tiempo: las páginas adquiridas después quedan excluidas. Acepta una marca de tiempo o una fecha (una fecha se resuelve a `00:00:00` UTC, no al final del día). Consulta [Búsqueda en punto en el tiempo](#point-in-time-search). Longitud máxima, en caracteres, del fragmento devuelto por resultado. Debe estar entre 180 y 10000. Cuando se omite, se usa una longitud de fragmento predeterminada. Número máximo de resultados a devolver. Debe estar entre 1 y 50. Cuando se omite, se devuelven hasta 10 resultados.Filtros de fecha y hora
acquired_after, acquired_before, published_after y published_before aceptan cada uno una de los siguientes formatos:
- Fecha en forma RFC 3339
full-date(YYYY-MM-DD) — cubre todo ese día en UTC. En un límite_afterse resuelve a00:00:00en esa fecha; en un límite_beforese resuelve a23:59:59.999en esa fecha, por lo que las páginas del día nombrado se conservan en cualquier extremo. Pasa una marca de tiempo en su lugar para cortar en un instante exacto. - Marca de tiempo en forma ISO 8601 (
YYYY-MM-DDTHH:MM:SS[.sss][±HH:MM]). Cuando no se proporciona un desplazamiento de zona horaria, la zona horaria se interpreta como UTC. - Delta relativo (
<number><unit>, p. ej.7d,30min) — se resuelve al tiempo de solicitud menos el delta, truncado a precisión de minuto, o aquery_timemenos el delta cuando eso está establecido. Unidades admitidas:min(minutos),h(horas),d(días),mo(meses),y(años).
Valores de ejemplo:
| Valor | Se resuelve a |
|---|---|
2026-01-15 en acquired_after / published_after | 2026-01-15T00:00:00Z |
2026-01-15 en acquired_before / published_before | 2026-01-15T23:59:59.999Z |
2026-01-15T10:30:00 | 2026-01-15T10:30:00Z (sin desplazamiento → UTC) |
2026-01-15T10:30:00Z | 2026-01-15T10:30:00Z |
2026-01-15T10:30:00.500-05:00 | 2026-01-15T15:30:00.500Z |
7d | 7 días antes del tiempo de solicitud, truncado al minuto |
30min | 30 minutos antes del tiempo de solicitud, truncado al minuto |
Los deltas relativos pueden combinarse con valores absolutos en los dos límites de una ventana:
{
"query": "...",
"published_after": "1y",
"published_before": "6mo"
}
{
"query": "...",
"acquired_after": "2024-01-01",
"acquired_before": "30d"
}
Por ejemplo, en el tiempo de solicitud 2026-05-18T14:23:45Z, acquired_after: "2h" se resuelve a 2026-05-18T12:23:00Z — un documento adquirido en 12:22:59Z se descarta, uno adquirido en 12:23:00Z se conserva.
Ten en cuenta la diferencia entre una fecha y una marca de tiempo en un límite _before: acquired_before: "2026-05-01" conserva una página adquirida en 2026-05-01T14:31:13Z, mientras que acquired_before: "2026-05-01T00:00:00Z" la descarta. Usa la forma de fecha para significar "hasta ese día inclusive", y la forma de marca de tiempo para cortar a medianoche.
Búsqueda en punto en el tiempo
query_time mueve toda la búsqueda hacia atrás a un instante: una página adquirida después no es
un candidato en absoluto, por lo que la respuesta es la que el índice habría dado entonces
en lugar de la respuesta de hoy filtrada. Úsala para reproducir una ejecución de agente, para
construir un conjunto de evaluación que no se desvíe a medida que el índice crece, o para preguntar qué era
conocible antes de un evento.
También re-basa cada delta relativo en esta solicitud. Un delta se resuelve contra
el tiempo de solicitud solo cuando query_time está ausente; con él, published_after: "30d"
significa treinta días antes de query_time:
{
"query": "...",
"query_time": "2026-06-13T00:00:00Z",
"published_after": "30d"
}
se resuelve a páginas publicadas entre 2026-05-14 y 2026-06-13 — no a los últimos
treinta días. Los límites absolutos no se ven afectados.
Un query_time solo de fecha se resuelve a 00:00:00 UTC, que es el extremo opuesto del
día en comparación con un límite _before solo de fecha: query_time: "2026-06-13" corta al inicio del
13 de junio, mientras que acquired_before: "2026-06-13" conserva todo el día.
fetch_page_content
Recupera una URL y extrae el contenido como markdown limpio. Por defecto solo se admiten URLs del índice; esto no es un raspador web general. Pasa live=true para recuperar directamente de la fuente, incluyendo URLs que no están indexadas.
Devuelve url, title y content (markdown). Consulta la Referencia de Fetch para la forma de la respuesta.
Metadatos para integradores
Las plataformas que integran las herramientas MCP de Keenable pueden leer el uso de facturación y controlar el comportamiento de las herramientas a través del canal lateral _meta de MCP. _meta viaja junto con el resultado o la solicitud de la herramienta y no es parte del content de la herramienta visible para el modelo, por lo que nada de ello entra en el contexto del agente.
Metadatos de uso (_meta de respuesta)
Cada llamada de herramienta facturada (autenticada) devuelve uso bajo _meta["keenable/usage"], para que puedas atribuir el costo por llamada sin analizar la salida de texto de la herramienta. Las llamadas no autenticadas no se facturan y lo omiten.
SKU de facturación para la operación: search.realtime, search.pro, fetch o fetch.live.
Ejemplo de resultado de herramienta:
{
"content": [{ "type": "text", "text": "..." }],
"_meta": {
"keenable/usage": { "sku": "search.realtime", "amount": 1, "credits": 1, "paid": true }
}
}
Anulaciones del operador (solicitud _meta)
Para controlar el comportamiento de la herramienta tú mismo en lugar de dejar que el modelo decida, envía anulaciones bajo _meta["keenable/overrides"] en una solicitud tools/call. Tienen prioridad sobre los argumentos que generó el modelo.
Ejemplo de solicitud:
{
"method": "tools/call",
"params": {
"name": "search_web_pages",
"arguments": { "query": "..." },
"_meta": { "keenable/overrides": { "mode": "realtime", "skip_cache": true } }
}
}
Los valores de anulación no válidos o desconocidos se ignoran en lugar de generar un error en la llamada.