Skip to main content
Glama
HasData

DuckDuckGo MCP Server

DuckDuckGo MCP Server

Un servidor de Model Context Protocol (MCP) alojado que ofrece a Claude, Cursor, Windsurf y cualquier otro cliente MCP los resultados de búsqueda de DuckDuckGo como JSON estructurado. Resultados orgánicos clasificados con posiciones, anuncios en su propio array, la respuesta de IA propia de DuckDuckGo y 37 regiones a las que dirigirse. Diseñado para volumen y para parseo, sin navegador local y sin cadena de respaldo que configurar.

https://mcp.hasdata.com/api/mcp?apis=duckduckgo

Glama score tool contract MCP Regions npm PyPI License

Contenido

Related MCP server: duckduckgo-mcp

Qué necesitas

Un cliente MCP que hable HTTP transmisible con cabeceras personalizadas. Una clave de API de HasData desde el panel de control, gratis de crear. Nada más. Este es un servidor remoto, así que la vía más sencilla es una URL y una cabecera, sin paquete de navegador que añadir y sin proceso local que mantener. Un cliente solo stdio puede usar el lanzador @hasdata/duckduckgo-mcp (npm) o hasdata-duckduckgo-mcp (PyPI) en su lugar.

Inicio rápido

La URL del servidor es la misma para todos los clientes. Lo probamos directamente en Claude Code y Claude Desktop. Los demás bloques siguen el formato documentado de cada cliente para un servidor remoto.

Campo

Valor

URL

https://mcp.hasdata.com/api/mcp?apis=duckduckgo

Transporte

HTTP, transmisible

Cabecera de autenticación

x-api-key: HASDATA_API_KEY

Los clientes con soporte de OAuth pueden añadir la misma URL como conector e iniciar sesión sin poner una clave en un archivo de configuración.

claude mcp add --transport http duckduckgo "https://mcp.hasdata.com/api/mcp?apis=duckduckgo" \
  --header "x-api-key: HASDATA_API_KEY"

Ajustes, luego Conectores, luego Añadir conector personalizado, y luego pega https://mcp.hasdata.com/api/mcp?apis=duckduckgo e inicia sesión.

Para la vía del archivo de configuración, Claude Desktop solo carga servidores locales (stdio), así que llega a un servidor remoto a través de un lanzador stdio. El paquete @hasdata/duckduckgo-mcp es ese lanzador y lee la clave del entorno. Añade esto a claude_desktop_config.json:

{
  "mcpServers": {
    "duckduckgo": {
      "command": "npx",
      "args": ["-y", "@hasdata/duckduckgo-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

¿Python en lugar de Node? Sustituye el lanzador por el paquete de PyPI, que uvx ejecuta sin instalación manual:

{
  "mcpServers": {
    "duckduckgo": {
      "command": "uvx",
      "args": ["hasdata-duckduckgo-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

~/.cursor/mcp.json para todos los proyectos, o .cursor/mcp.json para uno solo:

{
  "mcpServers": {
    "duckduckgo": {
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

~/.codeium/windsurf/mcp_config.json. Windsurf llama al campo serverUrl, no url:

{
  "mcpServers": {
    "duckduckgo": {
      "serverUrl": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}
{
  "mcpServers": {
    "duckduckgo": {
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "type": "streamableHttp",
      "headers": { "x-api-key": "HASDATA_API_KEY" },
      "disabled": false
    }
  }
}

.vscode/mcp.json en el espacio de trabajo:

{
  "servers": {
    "duckduckgo": {
      "type": "http",
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

~/.codex/config.toml:

[mcp_servers.duckduckgo]
url = "https://mcp.hasdata.com/api/mcp?apis=duckduckgo"

[mcp_servers.duckduckgo.headers]
"x-api-key" = "HASDATA_API_KEY"

~/.gemini/settings.json:

{
  "mcpServers": {
    "duckduckgo": {
      "httpUrl": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Ejemplos de prompts

Prompts, no código. Pega uno y el agente llama a la herramienta por su cuenta. Cada uno está anotado con las llamadas que requiere, porque en MCP el modelo decide cuántas llamadas hacer y cada llamada con éxito cuesta 10 créditos.

Busca en DuckDuckGo "model context protocol" y dame los diez primeros resultados con sus posiciones y dominios.

Una llamada, 10 créditos.

Ejecuta la consulta "reseña de VPN" en la región de Alemania y de nuevo en la región de EE. UU., y luego dime qué dominios aparecen en una y no en la otra.

Dos llamadas, 20 créditos. La región es un parámetro. La misma consulta en dos mercados son dos llamadas.

Busca "mejor software de CRM" y enumera solo los emplazamientos de pago, con el dominio del anunciante de cada uno.

Una llamada, 10 créditos. Los anuncios llegan en su propio array y no necesitan heurísticas de filtrado.

Toma la consulta "model context protocol" y recorre las tres primeras páginas, y luego dime qué dominios ocupan más de una posición.

Tres llamadas, 30 créditos. Cada página después de la primera es una llamada nueva con el cursor, y elimina q de los argumentos una vez que tengas uno.

Busca "quién inventó el transistor" y muéstrame la respuesta de IA propia de DuckDuckGo junto a los resultados orgánicos en los que se basó.

Una llamada, 10 créditos.

Dos de ellos son la razón de que exista este servidor. La segmentación por región es un parámetro de primera clase en 37 mercados. Comparar una consulta entre países es un bucle y no una configuración de proxy. Y los emplazamientos de pago vuelven por separado de los orgánicos, lo que evita que el seguimiento de posiciones dependa de adivinar qué resultado era un anuncio.

Cada paginación cuesta una llamada. Un prompt que recorra diez páginas son diez llamadas y 100 créditos.

Herramientas

Una sola herramienta. Las muestras siguientes están recortadas de llamadas reales, y los resultados que contienen cambian a medida que cambia la web. Léelas como formas.

Las muestras son la carga útil, no la respuesta completa. Un resultado de tools/call lleva un bloque de texto, y ese texto es a su vez JSON que contiene url, status, text y json, con los datos extraídos bajo json. Desde una respuesta JSON-RPC cruda, la ruta es result.content[0].text, parseado, y después .json. Un cliente de chat te lo desenvuelve, y el código que habla directamente con el endpoint no.

Obtener resultados de búsqueda de DuckDuckGo

hasdata_duckduckgo_serp_getSearchResults

Obtiene una página de resultados de DuckDuckGo y la devuelve parseada.

Parámetro

Tipo

Notas

q

string

El término de búsqueda. Tiene que estar presente q o nextPageToken

nextPageToken

string

Cursor de pagination.nextPageToken en la respuesta anterior. Gana si envías ambos, y el q que enviaste junto a él se ignora sin previo aviso

kl

string

Región como <country>-<language>, 37 valores desde us-en y de-de hasta jp-jp y wt-wt para cuando no hay región

cc

string

País de dos letras, 36 valores. Una alternativa a kl cuando se combina con setLang

setLang

string

Idioma de la interfaz y de los resultados, 33 valores

safeSearch

string

off, moderate o strict

deviceType

string

desktop, mobile o tablet

Envía q o nextPageToken. No enviar ninguno devuelve 422 nombrando ambos campos, porque el requisito es condicional y el esquema no puede expresarlo como una lista simple de obligatorios. Enviar ambos tampoco es un error: el cursor gana y la consulta no va a ninguna parte, así que un agente que mantenga q en los argumentos mientras pagina lee silenciosamente el conjunto de resultados equivocado.

position cuenta dentro de la página de la que proviene, no en todo el conjunto de resultados. La página dos vuelve con posiciones que empiezan en 1 otra vez, y el tamaño de página tampoco es fijo, así que aparecen páginas de 10, 15 y 14 resultados. Por tanto, la posición absoluta es el número de resultados orgánicos que ya has recopilado más position, no algo que puedas deducir del número de página. Construye un conjunto de datos de posiciones sin eso y cada página aportará su propio número uno.

Devuelve organicResults, ads, searchAssist y pagination. Las entradas orgánicas incluyen position, title, link, displayedLink, source y snippet, además de una fecha, sitelinks y metadatos de vídeo donde DuckDuckGo los muestra. searchAssist contiene la respuesta de IA propia de DuckDuckGo para la consulta.

ads y searchAssist están ausentes cuando la página no tiene ninguno, así que comprueba la clave antes de leerla. organicResults también puede estar ausente, así que léela con un valor por defecto en lugar de dar por hecha su presencia. Una consulta sin coincidencias reales sigue devolviendo una página completa de entradas vagamente relacionadas, que no es el aspecto habitual de "no se ha encontrado nada".

{
  "organicResults": [
    {
      "position": 1,
      "title": "What is the Model Context Protocol (MCP)?",
      "link": "https://modelcontextprotocol.io/docs/getting-started/intro",
      "displayedLink": "modelcontextprotocol.io › docs › getting-started › intro",
      "source": "modelcontextprotocol.io",
      "snippet": "MCP is an open-source standard for connecting AI applications to external systems."
    }
  ],
  "ads": [
    { "position": 1, "title": "Make Agents Accountable", "link": "https://www.gravitee.io/platform/ai-agent-management" }
  ],
  "searchAssist": {
    "answer": "Model Context Protocol (MCP) is an open standard from Anthropic that lets LLMs connect to external tools, systems, and data sources using a shared interface."
  },
  "pagination": { "nextPageToken": "eyJ1cmwiOiJodHRwczovL2xpbmtzLmR1Y2tkdWNrZ28uY29t…" }
}

Errores y rutas de fallo

Tu cliente casi nunca ve un código de error HTTP de una llamada a herramienta. La capa MCP responde 200 y coloca el fallo dentro del resultado, con isError establecido en true y el motivo como texto. El agente lee un mensaje donde podrías esperar una línea de estado.

Una clave incorrecta aparece como salida de la herramienta, no como una conexión fallida. Enumerar las herramientas acepta cualquier clave no vacía, así que el cliente completa su handshake y se muestra en verde. La primera llamada a herramienta vuelve entonces con isError: true y el texto HasData API error: 401 Unauthorized. Vigila esa cadena, porque nada antes en el flujo informa del problema.

Una clave ausente es el único error HTTP real. La autorización se ejecuta antes de cualquier herramienta, y la conexión en sí falla con 401.

Un argumento que rompe el esquema se rechaza antes de convertirse en una búsqueda. El servidor responde con isError: true y el texto MCP error -32602: Input validation error, nombrando el campo. No se obtiene nada y no se cobra nada.

Ni q ni nextPageToken devuelve 422 con un array errors que nombra ambos campos y la regla requiredIfNotExists que los vincula.

Una consulta sin nada detrás sigue devolviendo resultados. DuckDuckGo decide la relevancia, así que una cadena sin sentido vuelve como una página normal de diez entradas vagamente relacionadas, con ads y searchAssist ausentes. Nada la marca como un fallo, lo cual importa si estás creando una alerta sobre "sin cobertura para esta marca".

Los resultados que contienen datos también llevan un requestMetadata.id que conviene citar en soporte.

Precios, plan gratuito y límites

Cada llamada cuesta 10 créditos. El número de resultados no cambia el precio. Una página completa cuesta lo mismo que una página con una sola entrada.

La prueba gratuita es de 1.000 créditos durante 30 días sin tarjeta, lo que equivale a 100 búsquedas. Después, una cuenta activa sigue recibiendo una recarga de 100 créditos cada día siempre que su saldo baje de 100, así que un agente de bajo volumen funciona con el plan gratuito indefinidamente.

Los planes de pago empiezan en $49 al mes por 200.000 créditos, lo que equivale a 20.000 búsquedas. El precio unitario baja con el volumen, desde $2,45 por cada 1.000 búsquedas en el plan de entrada hasta $0,99 en Business, $0,83 en Growth y $0,75 en los planes de gran volumen más grandes. Las cifras actuales están en la página de precios.

Tu plan también fija la concurrencia. La prueba gratuita permite 1 solicitud a la vez, Startup 15, Business 30, Growth 50, y los planes de gran volumen van de 200 a 1.500. Gestiona el desbordamiento de forma defensiva en cualquier proceso desatendido, porque un agente que lance muchas solicitudes alcanzará el límite antes que tú.

Una solicitud que devuelve un código distinto de 200 no se factura. Una llamada correcta que no encuentra nada sigue siendo una llamada.

Selección de herramientas

El parámetro de consulta apis decide qué herramientas ve tu agente. Menos herramientas significa menos contexto dedicado a las definiciones de herramientas y menos oportunidades de que el modelo elija la incorrecta.

?apis=duckduckgo                        the one tool in this repo
?apis=duckduckgo,google_serp            add Google search
?apis=duckduckgo,bing_serp,google_serp  three engines side by side

El parámetro acepta nombres de proveedores como duckduckgo y nombres de API individuales como google_maps_search. Los nombres mal escritos se ignoran. Si todos los nombres son incorrectos, la solicitud falla con un 400, y el cuerpo enumera tanto lo que no reconoció como todos los valores válidos. Si omites el parámetro, el mismo endpoint expone las 57 herramientas de HasData.

Tener tres motores en un mismo agente es el motivo habitual para ampliar la lista aquí, porque comparar la misma consulta en DuckDuckGo, Google y Bing es una sola indicación una vez que los tres están expuestos.

Cómo se compara

La alternativa realista es un servidor autoalojado. Los más populares son paquetes de Python que ejecutas localmente, acceden a DuckDuckGo desde tu propia máquina y le entregan al modelo un bloque de texto con formato. Eso funciona bien para un asistente de investigación que responde una pregunta a la vez. Deja de funcionar cuando quieres volumen y una forma estable.

Servidor autoalojado

Este servidor

Lo que devuelve una búsqueda

Una cadena de texto con formato pensada para que la lea el modelo

JSON con position, title, link, displayedLink, source, snippet, fechas y sitelinks

Resultados de pago

Eliminados junto con el resto del ruido

Conservados en un array ads aparte

Paginación

Un límite de max_results en una sola página

Cursor en cada respuesta

Regiones

Un código region

37 códigos de región, o país e idioma configurados por separado

SafeSearch

Fijado cuando el servidor se inicia, deliberadamente no invocable por el agente

Por llamada

Quién obtiene la página

Tu máquina, mediante httpx, con un backend opcional curl_cffi y una opción de reserva que configurar

La nuestra

Rendimiento

Autolimitado a 30 búsquedas por minuto

Concurrencia del plan, de 1 en la prueba a 1.500

Qué ejecutas

Un entorno Python, un extra opcional y ajustes de contenedor o proxy cuando no está en localhost

Una URL y una cabecera

Extracción de contenido de la página

Una herramienta fetch_content

No se ofrece

Coste

Gratis

10 créditos por llamada

Dos filas son las que más pesan en la decisión. Un bloque de texto es la salida correcta para una respuesta de chat y la incorrecta para un conjunto de datos de posiciones, porque reconstruir position a partir de prosa es un trabajo que no deberías estar haciendo. Y que la descarga sea nuestra elimina la cuestión del backend, junto con elegir entre httpx y un cliente que imita al navegador, instalar el extra del que depende la opción de reserva y leer una traza de pila cuando un cliente HTTP normal deja de obtener la página.

Todo lo demás en esa lista supone una disyuntiva real. Un servidor autoalojado es gratis, no requiere cuenta, mantiene tus consultas en tu propia máquina y descarga el contenido de las páginas, cosa que este servidor no hace. Si ejecutas unas pocas búsquedas al día dentro de un asistente, es la opción que mejor se ajusta. Este es para el caso en que el número de búsquedas, el número de regiones o la forma de la salida empiezan a importar.

Frente a la API propia de DuckDuckGo. api.duckduckgo.com es la API de Instant Answer, que devuelve un resumen enciclopédico cuando lo hay, en lugar de una página de resultados. No hay ningún endpoint oficial que te proporcione resultados web clasificados, por lo que todas las opciones aquí analizan la página.

Lo que este servidor no hace. No descarga páginas ni extrae contenido, no tiene verticales de imágenes ni de noticias, ni autocompletado. Devuelve la página de resultados, parseada.

Preguntas frecuentes

¿Existe un servidor MCP oficial de DuckDuckGo?

No. DuckDuckGo no publica ningún servidor MCP. Todas las opciones las crea otra persona. La mayoría son proyectos de código abierto que se ejecutan localmente, y este es un servidor alojado mantenido por HasData.

¿Qué es un servidor MCP de DuckDuckGo?

Un servidor que expone la búsqueda de DuckDuckGo como una herramienta que un cliente de IA puede llamar. El cliente envía una llamada a la herramienta mediante el Model Context Protocol, el servidor realiza la búsqueda y devuelve JSON estructurado, y el modelo trabaja con el resultado sin ver nunca una página HTML.

¿Necesito una cuenta o una clave de API de DuckDuckGo?

No. La única credencial es tu clave de HasData. DuckDuckGo no tiene ningún programa para desarrolladores en el que registrarse, y la API de Instant Answer que publica no devuelve resultados de búsqueda.

¿Necesito alojar o ejecutar algo?

No. Este es un servidor MCP remoto sobre streamable HTTP. Nada que instalar, sin entorno de Python, sin paquete de navegador, sin proceso que reiniciar.

¿Los datos son en directo o están en caché?

En directo. Cada llamada obtiene la página de resultados en el momento de la solicitud y lleva su propio requestMetadata.id. Dos llamadas idénticas son dos descargas independientes, no una reproducción de una copia almacenada.

¿Puedo comparar la misma consulta en distintas regiones?

Sí, y esa es la razón principal para usar un parámetro en lugar de un proxy. kl acepta 37 códigos de región, y cc con setLang separa el país y el idioma cuando necesitas distinguirlos. Cada región es una llamada propia.

¿Qué ocurre cuando DuckDuckGo cambia su diseño?

Nada por tu parte. Nosotros seguimos los cambios y mantenemos estable el esquema de respuesta, por lo que los nombres y tipos de los campos permanecen igual. Un bloque sin nada que notificar no aparece en la respuesta, así que lee ads y searchAssist con un valor por defecto.

¿Puedo usar esto junto con otras API de HasData?

Sí. El parámetro apis acepta una lista, y ?apis=duckduckgo,google_serp,bing_serp le da a tu agente tres motores de búsqueda a la vez.

¿Puedo iniciar sesión con OAuth en lugar de pegar una clave?

Sí, en los clientes que lo admiten. Claude Desktop y Cursor pueden añadir el endpoint como conector e iniciar sesión. Los agentes y scripts desatendidos usan la cabecera x-api-key.

Cumplimiento normativo y datos personales

HasData solo accede a datos disponibles públicamente. Los términos de una plataforma pueden restringir el acceso automatizado, y tú eres responsable de tu propio cumplimiento. Si los datos que recopilas incluyen información personal, asegúrate de tener una base legal para ello según el GDPR, la CCPA o las normas equivalentes de tu jurisdicción.

Enlaces de HasData

Página del producto y generador de solicitudes

DuckDuckGo SERP API

Documentación del servidor

documentación del servidor MCP

Las 57 herramientas en un solo servidor

HasData/hasdata-mcp

Tutoriales de clientes

clientes MCP e integraciones

Los otros motores de búsqueda que analizamos

Google, Bing y 53 API más

Planes y costes de créditos

Planes y costes de créditos

Claves y uso

panel de control de HasData

Lanzador de Node en npm

@hasdata/duckduckgo-mcp

Lanzador de Python en PyPI

hasdata-duckduckgo-mcp

Desarrollo

Este repositorio es configuración y documentación para un servidor remoto. No hay paso de compilación ni nada que contenerizar.

Las pruebas en test/ verifican el contrato de la herramienta, la parte que puede romperse sin que haya un commit aquí. Comprueban que ?apis=duckduckgo devuelve exactamente una herramienta, que su nombre no ha cambiado, que los parámetros que documenta este README siguen existiendo con los enums que cita, y que la clave en uso es realmente aceptada. Esa última comprobación ejecuta una búsqueda real y cuesta 10 créditos, que es el precio de un canario que puede fallar por la razón correcta.

# macOS and Linux
HASDATA_API_KEY=your_key_here npm test

# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test

La misma suite se ejecuta en CI en cada push y una vez a la semana de forma programada, porque la lista de herramientas upstream puede cambiar sin que nadie toque este repositorio. Un fallo significa que la lista de herramientas se ha movido, que la clave ha dejado de funcionar o que el endpoint era inalcanzable, y el mensaje de la aserción indica cuál de ellos.

Contribuciones

Las correcciones de la tabla de parámetros y de la muestra de respuesta son la contribución más útil, porque esas son las partes que se desactualizan. Incluye la llamada que hiciste y la respuesta que obtuviste. Las pull requests desde forks ejecutan la suite sin clave, y las comprobaciones en vivo se omiten en lugar de ponerse en rojo.

Licencia

MIT. Consulta LICENSE.

Available Tools

1 tool
hasdata_duckduckgo_serp_getSearchResultsduckduckgo_serp: GET /AInspect

Get DuckDuckGo Search Results

Fetches DuckDuckGo SERPs for a query with region targeting (kl, or cc+setLang), safesearch (off/moderate/strict), device type, and page-based pagination. Returns organic results (title, url, snippet, displayed url, position, date, sitelinks, video metadata), ads, and the Search Assist AI answer. Use for SEO rank tracking, SERP feature monitoring, DuckDuckGo-specific visibility audits, and training/eval data for search agents.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSpecify the search term for which you want to scrape the SERP. Required unless `nextPageToken` is provided (which carries the query of the page it continues).
ccNoThe two-letter country code for the country to search from. Combined with `setLang` to form the DuckDuckGo region. Ignored if `kl` is set.
klNoDuckDuckGo region code in `<country>-<language>` form (e.g. `us-en`, `de-de`). Sets country and interface language at once; takes precedence over `cc`/`setLang`. Use `wt-wt` for no region.
setLangNoThe preferred result/interface language code — usually two letters (e.g. `en`, `de`), with script-tag variants for some languages (e.g. `zh-hans`, `zh-hant`). Combined with `cc` to form the DuckDuckGo region. Ignored if `kl` is set.
deviceTypeNoSpecify the device type for the search.
safeSearchNoAdult Content Filtering option.
nextPageTokenNoOpaque token returned in each response as `nextPageToken`. Pass it back (in place of `q`) to fetch the next page of results. It carries a pre-signed page URL bound to the original request's session, so it must be used as-is and cannot be constructed manually. Absent when there are no further pages.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It discloses the nature of the operation ('Fetches ... SERPs'), the return payload (organic results, ads, Search Assist AI answer), and critical pagination behavior (nextPageToken is pre-signed, session-bound, must be used as-is, cannot be constructed). This goes beyond a basic GET. However, it does not mention rate limits, cost, or auth requirements, which are common for SERP APIs, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured. The first sentence nails the purpose, the next expands on functionality and return types, and the final sentence lists use cases. It is slightly longer than necessary but every sentence adds value. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with no output schema and no annotations, the description provides enough for an agent to call it correctly: it explains the parameter combinations (kl vs cc+setLang, precedence), pagination mechanics, and what the response includes. It lacks error-handling details and rate-limit guidance, but these are not essential for a basic call. Completeness is above average.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with detailed descriptions, including the precedence rule ('Ignored if kl is set') and the required/exclusive nature of q vs nextPageToken. The description repeats some of this (region targeting with kl or cc+setLang, pagination) but does not add substantive new meaning beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get DuckDuckGo Search Results' — a specific verb and resource — and then elaborates on fetching SERPs with region targeting, safesearch, device type, and pagination. It also lists the return content (organic results, ads, Search Assist AI) and explicit use cases (SEO rank tracking, SERP monitoring, visibility audits), making the tool's purpose unambiguous and differentiating it from generic search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Use for SEO rank tracking, SERP feature monitoring, DuckDuckGo-specific visibility audits, and training/eval data for search agents.' It provides clear contexts but does not mention when NOT to use it or any alternative tools (though there are no siblings). This is adequate guidance for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev1.0.0
    • First observedhasdata_duckduckgo_serp_getSearchResults

TDQS

A4.2/5.0
Disambiguation5/5

With only a single tool, there is no possibility of ambiguity or misselection. The tool's purpose is clearly defined as fetching DuckDuckGo search results, making it trivially distinct.

Naming Consistency5/5

The single tool name follows a consistent pattern using underscores and includes a clear verb (getSearchResults) and resource hierarchy (duckduckgo_serp). While not a classic verb_noun structure, it is internally consistent and descriptive within its own scope.

Tool Count3/5

The server exposes only one tool, which is below the typical 3-15 tool range for a fully featured server. However, given the focused purpose of a DuckDuckGo SERP API, a single comprehensive endpoint is arguably sufficient, earning a borderline score.

Completeness4/5

The tool covers the core search lifecycle: querying with pagination, region targeting, safesearch, and device options, plus returning organic results, ads, and AI answers. Minor gaps exist (e.g., no dedicated news or image search), but the primary search functionality is complete for typical use cases.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    This MCP server utilizes DuckDuckGo for web searches, providing structured search results with metadata and features like smart content classification and language detection, facilitating easy integration with AI clients supporting the MCP protocol.
    1
    40
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A MCP server for DuckDuckGo HTML search. Unlike other DuckDuckGo MCP servers, this one isn't just AI slop.
    ISC
  • A
    license
    Not graded
    quality
    D
    maintenance
    DuckDuckGo Search MCP Server. Scrapes DuckDuckGo Lite directly — no API key required, no rate limits, robust anti-bot protection.
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for internet search via direct Google and DuckDuckGo HTML scraping with AI-powered result normalization and optional summarization, requiring no API keys for search.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/HasData/duckduckgo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server