Skip to main content
Glama

EnriWeb

EnriWeb is a Model Context Protocol (MCP) server over stdio that exposes web search and URL fetching tools by delegating execution to EnriProxy.

If your MCP client can call MCP tools, it can do web search / fetch in a consistent way without implementing provider-specific scraping logic.

What this project is

  • An MCP server process your MCP host launches (OpenCode, Claude Code, Codex, etc.)

  • A thin client for EnriProxy (input validation + structured output)

Related MCP server: url-context-mcp

Requirements

  • Node.js >= 22 (recommended: Node 24 LTS)

  • A reachable EnriProxy server with:

    • POST /v1/tools/web_search

    • POST /v1/tools/web_fetch

  • An EnriProxy API key (configured on the EnriProxy side)

Install

# Global install
npm install -g @bedolla/enriweb

# Or run without installing
npx -y @bedolla/enriweb@latest --help

Build

npm install
npm run typecheck
npm run build

Usage

1) Configure your MCP host

EnriWeb runs as an MCP server over stdio. Your MCP host is responsible for launching the process.

Example: global install

{
  "EnriWeb": {
    "type": "stdio",
    "command": "enriweb",
    "args": [],
    "env": {
      "ENRIPROXY_URL": "http://127.0.0.1:8787",
      "ENRIPROXY_API_KEY": "YOUR_ENRIPROXY_API_KEY"
    }
  }
}

Example: no install (always uses whatever npm currently tags as latest)

{
  "EnriWeb": {
    "type": "stdio",
    "command": "npx",
    "args": ["-y", "@bedolla/enriweb@latest"],
    "env": {
      "ENRIPROXY_URL": "http://127.0.0.1:8787",
      "ENRIPROXY_API_KEY": "YOUR_ENRIPROXY_API_KEY"
    }
  }
}
{
  "EnriWeb": {
    "type": "stdio",
    "command": "node",
    "args": ["C:\\\\Users\\\\Administrator\\\\Projects\\\\EnriWeb\\\\dist\\\\index.js"],
    "env": {
      "ENRIPROXY_URL": "http://127.0.0.1:8787",
      "ENRIPROXY_API_KEY": "YOUR_ENRIPROXY_API_KEY"
    }
  }
}

Configuration

EnriWeb is configured via environment variables:

  • ENRIPROXY_URL (string, optional, default: http://127.0.0.1:8787)

  • ENRIPROXY_API_KEY (string, required)

  • ENRIWEB_TIMEOUT_MS (string, optional, default: 60000)

    • Parsed as an integer (milliseconds).

  • ENRIWEB_WEB_FETCH_DEFAULT_MAX_CHARS (string, optional, default: 200000)

    • Parsed as an integer.

  • ENRIWEB_GITHUB_TOKEN (string, optional)

    • Used for GitHub API enrichment to improve rate limits.

MCP tools

EnriWeb exposes these MCP tools:

  • web_search

  • web_fetch

General notes:

  • All tools accept a single JSON object as their input (the MCP arguments for that tool).

  • EnriWeb returns both:

    • a short human-readable preview (content)

    • the full result payload (structuredContent)


Search the web via EnriProxy.

Inputs:

  • query (string, required): search query string.

  • max_results (number, optional)

    • Must be >= 1.

    • If omitted, EnriProxy uses its configured default.

    • The upper limit is enforced server-side (EnriWeb does not hardcode a max).

  • recency (string, optional, default: noLimit)

    • One of: oneDay | oneWeek | oneMonth | oneYear | noLimit

  • allowed_domains (string[], optional): allowlist of domains to include.

  • blocked_domains (string[], optional): blocklist of domains to exclude.

  • search_prompt (string, optional): extra context to refine the search intent.

Example arguments object:

{
  "query": "qdrant docker compose autostart systemd",
  "max_results": 10,
  "recency": "oneMonth"
}

web_fetch

Fetch and read content from a URL via EnriProxy.

Inputs:

  • url (string, required unless cursor is provided): full URL (http:// or https://).

  • cursor (string, optional): opaque cursor returned by a previous web_fetch call.

  • offset_chars (number, optional, default: 0): cursor read offset in characters (offset is a legacy alias).

  • limit_chars (number, optional): cursor read limit in characters (default: max_chars; limit is a legacy alias).

  • prompt (string, optional): extraction hint (what to focus on).

  • max_chars (number, optional): maximum content length (default: ENRIWEB_WEB_FETCH_DEFAULT_MAX_CHARS).

  • format (string, optional): content flavor for HTML pages — "text" (default, lightweight structured text), "markdown" (full markdown with links, emphasis, code fences, images, and tables), or "html" (sanitized markup for DOM inspection — scripts/styles stripped, tags intact). Use markdown only when the exact page structure matters; text is cheaper for factual lookups.

  • content (string, optional): HTML scope — "full" (default, whole page) or "main" (article/main container only; drops nav, sidebars, cookie banners, and footers, typically saving 60-80% of tokens).

  • include_links (boolean, optional): append the ENLACES DE LA PÁGINA inventory with every unique link (label + URL, up to 200) — useful for informed crawling or handing image URLs to URL-capable media analysis tools.

  • include_metadata (boolean, optional): append the METADATOS DE LA PÁGINA block with language, author, published date, and og:image.

  • anchor (string, optional): section selector — element id (with or without #) or exact heading text; returns only that section up to the next same-or-higher heading. When the section is missing, the response says so and returns the full document.

Notes:

  • If the response includes a cursor, you can page through the captured content by calling web_fetch again with cursor + offset_chars + limit_chars.

Example arguments object:

{
  "url": "https://example.com/docs",
  "max_chars": 200000
}

Available Tools

2 tools
web_fetchA

Obtiene y lee el contenido de una URL mediante el servicio multi-nivel de EnriProxy.

Cuándo usarla:

  • Cuando necesite leer el contenido completo de una página web.

  • Cuando necesite acceder a documentación, artículos o archivos de código.

  • Cuando métodos de fetch más simples fallen por protección anti-bot.

Características:

  • Detección de APIs de registros de paquetes (npm, PyPI)

  • Fetch de archivos raw (GitHub raw, HuggingFace)

  • Fetch robusto para sitios estáticos, dinámicos y protegidos (best-effort)

  • Respaldo automático entre múltiples estrategias de recuperación (detalles omitidos intencionalmente)

  • Proyección controlable: format ('text' ligero por defecto, 'markdown' estructura completa, 'html' DOM saneado), content ('main' elimina navegación/banners y conserva el artículo), anchor (lee sólo una sección por id o título de encabezado), include_links (inventario de enlaces de la página) e include_metadata (idioma/autor/fecha/imagen destacada)

  • Decodificación de páginas con encoding legado (windows-1252/ISO-8859-1) sin mojibake

Notas:

  • Proporcione la URL completa incluyendo protocolo (https://).

  • El contenido se limita con el parámetro max_chars (por defecto: 200000).

  • Si el resultado viene truncado e incluye un cursor, vuelva a llamar web_fetch con cursor + offset_chars + limit_chars para leer más sin volver a descargar.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoURL completa a obtener (http:// o https://).
limitNoAlias legado de limit_chars. Límite de lectura por cursor en caracteres (por defecto: max_chars).
anchorNoSelector de sección: id de un elemento (con o sin '#', ej. 'installation') o texto exacto de un encabezado (ej. 'Instalación'). Devuelve sólo esa sección hasta el siguiente encabezado del mismo nivel o superior. Mucho más barato que paginar con offset_chars a ciegas en documentos largos. Si la sección no existe, la respuesta lo indica y devuelve el documento completo.
cursorNoCursor opaco devuelto por una llamada previa de `web_fetch` para paginación. Nunca invente este valor.
formatNoFormato del contenido para páginas HTML. 'text' (por defecto) devuelve texto estructurado ligero y gasta menos tokens. 'markdown' reproduce la estructura exacta de la página: enlaces con URL, énfasis, bloques de código, listas anidadas, imágenes y tablas. 'html' devuelve el marcado HTML saneado (sin scripts/estilos) para inspeccionar el DOM: formularios, atributos data-*, estructura de componentes. Para preguntas puntuales (versiones, precios, datos sueltos) deje el formato por defecto.
offsetNoAlias legado de offset_chars. Offset de lectura por cursor en caracteres (por defecto: 0).
promptNoPista opcional que describe qué desea extraer (la herramienta devuelve el contenido obtenido; no genera un resumen con IA).
contentNoAlcance del contenido HTML. 'full' (por defecto) devuelve toda la página, incluida navegación, encabezados y pie. Use 'main' para quedarse sólo con el contenido principal (contenedor article/main, sin menús, barras laterales, banners de cookies ni pies): ahorra típicamente 60-80% de tokens en artículos, documentación y blogs. Combine content='main' con format='markdown' para la lectura óptima de artículos largos.
max_charsNoLongitud máxima del contenido (por defecto: 200000).
limit_charsNoLímite de lectura por cursor en caracteres (por defecto: max_chars). Prefiera este nombre actual de campo de EnriProxy sobre limit.
offset_charsNoOffset de lectura por cursor en caracteres (por defecto: 0). Prefiera este nombre actual de campo de EnriProxy sobre offset.
include_linksNoSi es true, agrega al final un inventario ENLACES DE LA PÁGINA con todos los enlaces únicos (etiqueta y URL, hasta 200). Úselo para decidir a dónde navegar después (crawling informado), descargar documentos enlazados o pasar URLs de imágenes a una herramienta de análisis de media que acepte URLs http(s) directas.
include_metadataNoSi es true, agrega al final un bloque METADATOS DE LA PÁGINA con idioma, autor, fecha de publicación e imagen destacada (og:image). Útil para citar fuentes o decidir frescura del contenido antes de gastar tokens en el fetch completo.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure and does so thoroughly: it reveals best-effort fetching, automatic fallback across strategies, legacy encoding decoding, content limits via max_chars, and cursor-based pagination. It also clarifies that the prompt parameter does not generate an AI summary, preventing incorrect agent expectations.

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

Conciseness5/5

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

The description is well-organized with clear sections ("Cuándo usarla", "Características", "Notas"), front-loads the purpose and usage, and uses bullets for readability. For a tool with 13 parameters, the length is justified; each section and bullet adds operational or decision-making value without filler.

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

Completeness5/5

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

The description covers all essential operational aspects: full URL requirement, default max_chars, cursor-based pagination with offset_chars/limit_chars, and the output behavior for include_links and include_metadata. Even without an output schema, it explains truncation, cursor reuse, and section-not-found fallback, making it complete enough for correct invocation.

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

Parameters5/5

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

Even though the schema has 100% parameter coverage, the description adds significant value beyond the schema: it explains when to use 'main' versus 'full' content with token savings, how format options map to different use cases, the behavior of anchor selection, and how to combine content='main' with format='markdown' for optimal long-article reading. This is well above the baseline of 3 for fully-covered schemas.

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 a specific verb and resource: "Obtiene y lee el contenido de una URL" (obtains and reads content of a URL), which clearly defines the tool's function. The "Cuándo usarla" section lists concrete use cases—reading full page content, accessing documentation, articles, or code files—that distinguish it from the sibling web_search without requiring schema inspection.

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 "Cuándo usarla" section explicitly gives conditions: when full page content is needed, when accessing documentation or code files, and when simpler fetch methods fail due to anti-bot protection. However, it does not explicitly mention the alternative web_search or state when not to use this tool, leaving slight room for ambiguity in tool selection.

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 updatev0.1.5
    • Changedweb_search2 fields changed
      • addedInput schema / properties / queries
        Added value: +{
        +  "description": "Lote de 1 a 4 consultas no vacías; se ejecutan en paralelo y sus resultados se combinan y deduplican por URL. Ejemplo: [\"rust async tokio spawn\", \"tokio::spawn vs block_on\"]. No combine con `query`.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Consulta de búsqueda. Sea específico para obtener mejores resultados."New value: +"Consulta de búsqueda. Sea específico para obtener mejores resultados. Use `queries` en su lugar cuando convenga lanzar varias formulaciones a la vez."
  2. 1 tool updatev0.1.4
    • Changedweb_fetch6 fields changed
      • addedInput schema / properties / anchor
        Added value: +{
        +  "description": "Selector de sección: id de un elemento (con o sin '#', ej. 'installation') o texto exacto de un encabezado (ej. 'Instalación'). Devuelve sólo esa sección hasta el siguiente encabezado del mismo nivel o superior. Mucho más barato que paginar con offset_chars a ciegas en documentos largos. Si la sección no existe, la respuesta lo indica y devuelve el documento completo.",
        +  "type": "string"
        +}
      • addedInput schema / properties / content
        Added value: +{
        +  "description": "Alcance del contenido HTML. 'full' (por defecto) devuelve toda la página, incluida navegación, encabezados y pie. Use 'main' para quedarse sólo con el contenido principal (contenedor article/main, sin menús, barras laterales, banners de cookies ni pies): ahorra típicamente 60-80% de tokens en artículos, documentación y blogs. Combine content='main' con format='markdown' para la lectura óptima de artículos largos.",
        +  "enum": [
        +    "main",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / format / description
        Previous value: -"Formato del contenido para páginas HTML. 'text' (por defecto) devuelve texto estructurado ligero y gasta menos tokens. Use 'markdown' cuando necesite reproducir la estructura exacta de la página: enlaces con URL, énfasis, bloques de código, listas anidadas o imágenes. Para preguntas puntuales (versiones, precios, datos sueltos) deje el formato por defecto."New value: +"Formato del contenido para páginas HTML. 'text' (por defecto) devuelve texto estructurado ligero y gasta menos tokens. 'markdown' reproduce la estructura exacta de la página: enlaces con URL, énfasis, bloques de código, listas anidadas, imágenes y tablas. 'html' devuelve el marcado HTML saneado (sin scripts/estilos) para inspeccionar el DOM: formularios, atributos data-*, estructura de componentes. Para preguntas puntuales (versiones, precios, datos sueltos) deje el formato por defecto."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "text",
        -  "markdown"
        -]New value: +[
        +  "text",
        +  "markdown",
        +  "html"
        +]
      • addedInput schema / properties / include_links
        Added value: +{
        +  "description": "Si es true, agrega al final un inventario ENLACES DE LA PÁGINA con todos los enlaces únicos (etiqueta y URL, hasta 200). Úselo para decidir a dónde navegar después (crawling informado), descargar documentos enlazados o pasar URLs de imágenes a una herramienta de análisis de media que acepte URLs http(s) directas.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_metadata
        Added value: +{
        +  "description": "Si es true, agrega al final un bloque METADATOS DE LA PÁGINA con idioma, autor, fecha de publicación e imagen destacada (og:image). Útil para citar fuentes o decidir frescura del contenido antes de gastar tokens en el fetch completo.",
        +  "type": "boolean"
        +}
  3. 2 tool updatesv0.1.2
    • Changedweb_fetch9 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Opaque cursor returned by a previous `web_fetch` call for pagination."New value: +"Cursor opaco devuelto por una llamada previa de `web_fetch` para paginación. Nunca invente este valor."
      • addedInput schema / properties / format
        Added value: +{
        +  "description": "Formato del contenido para páginas HTML. 'text' (por defecto) devuelve texto estructurado ligero y gasta menos tokens. Use 'markdown' cuando necesite reproducir la estructura exacta de la página: enlaces con URL, énfasis, bloques de código, listas anidadas o imágenes. Para preguntas puntuales (versiones, precios, datos sueltos) deje el formato por defecto.",
        +  "enum": [
        +    "text",
        +    "markdown"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Legacy alias for limit_chars. Cursor read limit in characters (default: max_chars)."New value: +"Alias legado de limit_chars. Límite de lectura por cursor en caracteres (por defecto: max_chars)."
      • changedInput schema / properties / limit_chars / description
        Previous value: -"Cursor read limit in characters (default: max_chars). Prefer this current EnriProxy field name over limit."New value: +"Límite de lectura por cursor en caracteres (por defecto: max_chars). Prefiera este nombre actual de campo de EnriProxy sobre limit."
      • changedInput schema / properties / max_chars / description
        Previous value: -"Maximum content length (default: 200000)."New value: +"Longitud máxima del contenido (por defecto: 200000)."
      • changedInput schema / properties / offset / description
        Previous value: -"Legacy alias for offset_chars. Cursor read offset in characters (default: 0)."New value: +"Alias legado de offset_chars. Offset de lectura por cursor en caracteres (por defecto: 0)."
      • changedInput schema / properties / offset_chars / description
        Previous value: -"Cursor read offset in characters (default: 0). Prefer this current EnriProxy field name over offset."New value: +"Offset de lectura por cursor en caracteres (por defecto: 0). Prefiera este nombre actual de campo de EnriProxy sobre offset."
      • changedInput schema / properties / prompt / description
        Previous value: -"Optional hint describing what you want to extract (the tool returns fetched content; it does not generate an AI summary)."New value: +"Pista opcional que describe qué desea extraer (la herramienta devuelve el contenido obtenido; no genera un resumen con IA)."
      • changedInput schema / properties / url / description
        Previous value: -"Full URL to fetch (http:// or https://)."New value: +"URL completa a obtener (http:// o https://)."
    • Changedweb_search6 fields changed
      • changedInput schema / properties / allowed_domains / description
        Previous value: -"Only return results from these domains."New value: +"Devuelve sólo resultados de estos dominios."
      • changedInput schema / properties / blocked_domains / description
        Previous value: -"Exclude results from these domains."New value: +"Excluye resultados de estos dominios."
      • changedInput schema / properties / max_results / description
        Previous value: -"Maximum results (>= 1). If omitted, EnriProxy uses its configured default. The upper limit is enforced server-side."New value: +"Máximo de resultados (>= 1). Si se omite, EnriProxy usa su valor configurado por defecto. El límite superior se aplica en el servidor."
      • changedInput schema / properties / query / description
        Previous value: -"Search query. Be specific for better results."New value: +"Consulta de búsqueda. Sea específico para obtener mejores resultados."
      • changedInput schema / properties / recency / description
        Previous value: -"Filter by recency (default: noLimit)."New value: +"Filtra por recencia (por defecto: noLimit)."
      • changedInput schema / properties / search_prompt / description
        Previous value: -"Optional context to refine search intent."New value: +"Contexto opcional para refinar la intención de búsqueda."
  4. 1 tool updatev0.1.1
    • Changedweb_fetch4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Cursor read limit in characters (default: max_chars)."New value: +"Legacy alias for limit_chars. Cursor read limit in characters (default: max_chars)."
      • addedInput schema / properties / limit_chars
        Added value: +{
        +  "description": "Cursor read limit in characters (default: max_chars). Prefer this current EnriProxy field name over limit.",
        +  "type": "integer"
        +}
      • changedInput schema / properties / offset / description
        Previous value: -"Cursor read offset in characters (default: 0)."New value: +"Legacy alias for offset_chars. Cursor read offset in characters (default: 0)."
      • addedInput schema / properties / offset_chars
        Added value: +{
        +  "description": "Cursor read offset in characters (default: 0). Prefer this current EnriProxy field name over offset.",
        +  "type": "integer"
        +}
  5. 2 tool updatesv0.1.0
    • First observedweb_fetch
    • First observedweb_search

TDQS

A4.6/5.0
Disambiguation5/5

web_search and web_fetch have clearly distinct purposes: one discovers URLs and information from the web, the other retrieves content from a specific URL. There is no overlap or ambiguity in choosing between them.

Naming Consistency5/5

Both tools consistently follow the web_verb pattern (web_search, web_fetch), making the domain and action immediately clear and predictable.

Tool Count4/5

Two tools is minimal, but it fully covers the core need of a web access server: searching and fetching. It is slightly under the typical 3-15 range yet remains well-scoped and not bloated.

Completeness5/5

For the stated purpose of web search and retrieval, the pair forms a complete workflow: search returns candidate URLs and web_fetch reads the chosen page, including pagination and content-shaping options. There are no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that provides AI assistants with web search and intelligence capabilities via the ihyee API. It allows users to search the web, fetch extracted content from URLs, and perform full browser rendering for JavaScript-heavy websites.
    3
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that fetches web pages and extracts clean, AI-usable context from them, enabling tools for link discovery, content search, and integrated fetch-and-search operations.
    5
    15
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for multi-engine web search and web page fetching, supporting parallel search, content extraction, and optional LLM-powered search summarization and deep search.
    2
    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/Bedolla/EnriWeb'

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