Skip to main content
Glama
comparador-luz-gas

comparador-luz-gas

comparador-luz-gas

PyPI CI License: MIT comparador-luz-gas MCP server – quality and maintenance score on Glama

Built with claude-arsenal

El comparador oficial de tarifas de luz y gas de la CNMC, como librería, CLI y servidor MCP.

El comparador de la CNMC es la única comparativa oficial de ofertas de energía en España, pero solo se usa a través de un formulario web; su API pública pide 83 parámetros por consulta. Este proyecto la reduce a tres datos (código postal, consumo, potencia) o al QR de la factura, y devuelve las ofertas en JSON ordenadas por precio, con un análisis a varios años y el aviso de qué comercializadoras grandes no están en el comparador.

Inicio rápido

uvx comparador-luz-gas --cp 28013 --consumo 2600 --texto --top 5

O instalado: pip install comparador-luz-gas. Para leer el QR de un PDF o una imagen, pip install "comparador-luz-gas[facturas]" y sudo apt install libzbar0 poppler-utils.

Related MCP server: PVPC MCP Server

Ejemplo

Salida real (consulta del 2026-10-20; los precios cambian con el mercado):

$ comparador-luz-gas --cp 28013 --consumo 2600 --texto --top 5
  1er año    2º año  comercializadora                       oferta
----------------------------------------------------------------------------------------------------
   653.02      0.00  Comercializadora de referencia         PVPC Histórico 19/10/2025 - 19/10/2026
   655.15    655.15  ENERGIA NUFRI SL                       ENERGIA NUFRI - CON HORARIOS
   657.85    721.45  niba                                   niba Zen
   661.53    661.53  ENERGIA NUFRI SL                       ENERGIA NUFRI - UNIVERSAL CON HORARIOS
   662.80    713.51  CIDE HCENERGÍA S.A.U                   Plan Estrella Dúo

70 ofertas de 28 comercializadoras.
No están en el comparador: ENDESA, IBERDROLA, TOTALENERGIES, HOLALUZ, EDP, GALP.
[...]

A 3 años, lo más barato es ENERGIA NUFRI SL «ENERGIA NUFRI - CON HORARIOS»: 1965.45 €
(655.15 €/año en régimen). ¿Prefieres pagar lo mismo a cualquier hora o puedes concentrar
el consumo en las horas baratas? Con tu reparto actual gana la discriminación horaria por
41.79 €: [...]
- La mejor a 3 años es solo para nuevos clientes: [...]
- El PVPC sale 2.13 € más barato al año que la mejor fija (653.02 € frente a 655.15 €),
  pero es variable: [...]
- 13 de 70 ofertas tienen permanencia (penalización de 16.87 a 37.42 €).

Sin --texto imprime JSON con las claves modo, importes, consulta, cobertura, ofertas, alternativa_por_separado y analisis. Cada oferta:

{"comercializadora": "Comercializadora de referencia", "oferta": "PVPC Histórico 19/10/2025 - 19/10/2026",
 "importe_primer_anio": 653.02, "importe_segundo_anio": 0.0, "permanencia": false,
 "servicios_adicionales": false, "verde": false, "validez": "Válida para consumidores con derecho a PVPC",
 "precio_unico": false, "id_oferta": 180, "penalizacion_estimada": 0, "solo_nuevos_clientes": false}

Desde Python:

from comparador_luz_gas import Consulta, comparar, desde_fichero, interpretar

r = comparar(Consulta(codigo_postal="28013", consumo_anual_luz=2600, potencia=3.45))
r.ofertas[0]  # la más barata el primer año
r.to_dict()  # lo mismo que imprime el CLI
interpretar(r, anios=3)["resumen"]  # valoración a 3 años

r = comparar(desde_fichero("factura.pdf").consulta())  # todo desde el QR de la factura

Uso con agentes de IA

Servidor MCP

comparador-luz-gas mcp sirve el comparador por stdio, sin dependencias extra. Está en el registro oficial de MCP como io.github.nuncaeslupus/comparador-luz-gas.

{
  "mcpServers": {
    "comparador-luz-gas": { "command": "uvx", "args": ["comparador-luz-gas", "mcp"] }
  }
}

Para leer facturas del disco: "args": ["--from", "comparador-luz-gas[facturas]", "comparador-luz-gas", "mcp"]. También hay Dockerfile (docker run -i --rm comparador-luz-gas).

herramienta

qué hace

comparar_ofertas

ofertas + análisis a largo plazo, como el JSON del CLI. Basta qr, o cp + consumo (luz); para gas, suministro: "gas" con cp + consumo_gas; para ambas, suministro: "ambas" con cp, consumo y consumo_gas; max_ofertas (20 por defecto) recorta la lista

leer_factura_qr

los datos del QR de una factura, sin consultar la CNMC

leer_factura_archivo

lee el QR de un PDF o imagen del disco (necesita el extra facturas)

Los errores vuelven como {"ok": false, "error": "ArgumentoInvalido", "message": "..."}.

Desde el CLI

Un agente sin MCP puede llamar al CLI: por defecto escribe JSON en stdout. modo e importes dicen si los importes son anuales o de un periodo de factura, para que no se confunda un mes con un año. Un argumento inválido sale con código 2 y el mensaje en stderr.

Cómo funciona

  • Una petición a la API oficial de la CNMC (3-8 s, límite 90 s). No hay precios propios ni caché: solo cuentas sobre lo que responde la CNMC.

  • Lee el QR de la factura. Desde la Resolución de la CNMC de 24/06/2021 (BOE-A-2022-16989) toda factura de luz lleva un QR con código postal, potencias, consumo anual por franja, periodo e importe. El formato lo fija la CNMC, así que vale para cualquier comercializadora. desde_qr() no tiene dependencias: una app que ya escaneó el QR le pasa la cadena.

  • Dos modos. Por defecto, coste estimado de 12 meses. Con --mensual (f.consulta(mensual=True)), el coste del periodo concreto de la factura, comparable con el importe impreso.

  • Análisis a largo plazo (interpretar(), clave analisis): coste a N años (primer_anio + (N-1) × siguientes), porque el primer puesto suele ganarlo un descuento de bienvenida que se cobra una vez. Separa precio único frente a discriminación horaria, señala las ofertas solo para nuevos clientes, la permanencia y su penalización, y el PVPC frente a la mejor fija.

  • Cobertura. Cada respuesta lista las comercializadoras presentes y las grandes que faltan (cobertura.grandes_ausentes).

  • Anualizar. anualizar(facturas) extrapola el consumo de varias facturas recientes en vez de usar los 12 meses rodantes del QR.

CLI

comparador-luz-gas --cp 28013 --consumo 2600                      # JSON
comparador-luz-gas --cp 28013 --consumo 2600 --texto --top 5      # tabla
comparador-luz-gas --cp 28013 --consumo 2600 --sin-permanencia
comparador-luz-gas --cp 28013 --consumo 2600 --consumo-gas 6000 --suministro ambas
comparador-luz-gas --cp 28013 --consumo 2600 --franjas 600,700,1300 --anios 5
comparador-luz-gas --factura factura.pdf --texto                  # compara con los datos del QR
comparador-luz-gas --factura factura.pdf --mensual --texto        # coste de ese periodo
comparador-luz-gas --qr 'https://comparador.cnmc.gob.es/comparador/QRE?cp=...'
comparador-luz-gas --factura factura.pdf --solo-datos             # solo lee el QR

Otras opciones: --potencia (kW, 3,45 por defecto), --empresa (suministro que no es vivienda). comparador-luz-gas --help las lista todas.

Campos de Consulta: codigo_postal (obligatorio), consumo_anual_luz, consumo_anual_gas, potencia (3.45), suministro ("luz", "gas", "ambas"), franjas ((punta, llano, valle); si falta, perfil 2.0TD), vivienda (True), permanencia y servicios_adicionales (2; 1 = solo ofertas sin ellos).

Limitaciones

  • No es un censo del mercado. La CNMC solo publica ofertas que las comercializadoras le remiten y valida. Comprobado el 2026-09-23 sobre 20 códigos postales: Endesa, TotalEnergies, Plenitude, Holaluz y EDP no tienen ofertas; Iberdrola, una de gas. Endesa e Iberdrola solo aparecen como Comercializadora de referencia (PVPC/TUR). El resultado es la mejor entre las verificadas por la CNMC.

  • Sin desglose de impuestos. Confirma con la comercializadora si el importe lleva IVA.

  • La factura incluye cosas que el comparador no cuenta: servicios adicionales, alquiler de equipos, bono social. El QR los desglosa (impSA, finBS); réstalos antes de comparar.

  • Las ofertas por tramos se valoran con tu reparto punta/llano/valle actual, con los tramos 2.0TD de la Circular 3/2020 (vigentes desde el 1/06/2021; Ceuta y Melilla usan otros). Si piensas mover consumo, repite con --franjas. Si vienes de una tarifa de discriminación horaria anterior, usa solo facturas posteriores a esa fecha.

  • Sin histórico. El catálogo no lleva fechas de alta ni caducidad, y la CNMC no publica el histórico, así que no se puede decir en qué mes conviene cambiar.

  • QR escaneado: 400 dpi aguanta JPEG, giro y desenfoque; 300 dpi va bien salvo desenfoque; 200 dpi solo si está limpio; 150 dpi no se lee.

Documentación

Desarrollo

make sync && make lint && make test
make test-live       # consulta la API real
make test-facturas   # lee el QR de los PDFs de data/facturas/, si los hay

data/har/ y data/facturas/ están en .gitignore (llevan CUPS, dirección y consumos reales); los tests versionados usan un QR inventado.

Proyectos relacionados

  • claude-arsenal — flujo de Claude Code guiado por especificaciones y cola de tareas con puertas de aceptación.

  • drawspec — especificación declarativa de diagramas a SVG/PNG/texto limpio, escribible por LLMs; incluye servidor MCP.

  • doc-control — permite a agentes de IA editar documentos Word como cambios controlados.

  • literary-critic — análisis de manuscritos con LLM al modo de un editor profesional.

  • integral-job-search — búsqueda de empleo centrada en el candidato, dentro de Claude Code.

Licencia

MIT

Available Tools

3 tools
comparar_ofertasA
Read-onlyIdempotent

Consulta el comparador oficial de la CNMC y devuelve las ofertas de luz y/o gas, de la más barata a la más cara, con un análisis a varios años (rotar de oferta, permanencias, fijo vs. tramos). Luz: qr, o cp + consumo; gas: suministro gas, cp + consumo_gas; ambas: lo de luz más consumo_gas. cp, consumo o potencia explícitos prevalecen sobre el qr; sin qr, 3,45 kW y reparto 2.0TD. Con el texto del QR no hace falta leer_factura_qr. Una petición HTTPS sin caché (segundos; límite 90 s); las ofertas cambian con el mercado. Euros, sin desglose de impuestos. Si falla, devuelve un error con texto JSON {"ok": false, "error": "ArgumentoInvalido", "message": "..."} (ArgumentoInvalido si falta cp o consumo; otro si falla la red).

NameRequiredDescriptionDefault
cpNocódigo postal, p. ej. 28013
qrNocontenido del QR de la factura de luz, ya decodificado: la URL de comparador.cnmc.gob.es que lleva impresa, p. ej. `https://comparador.cnmc.gob.es/comparador/QRE?cp=28013&pP1=4.6&caP1=740...`
aniosNohorizonte del análisis a largo plazo (por defecto 3)
consumoNoconsumo anual de luz en kWh
empresaNosuministro que no es vivienda
franjasNoconsumo anual punta, llano y valle en kWh; por defecto se reparte con el perfil 2.0TD
mensualNocon qr, coste de ese periodo de facturación en vez del anual
potenciaNopotencia contratada en kW (por defecto 3.45)
suministroNoqué comparar (por defecto luz); ambas añade las ofertas conjuntas y la alternativa de contratar por separado
consumo_gasNoconsumo anual de gas en kWh
max_ofertasNoofertas a devolver, las más baratas (por defecto 20)
sin_permanenciaNoexcluir ofertas con permanencia

Output Schema

NameRequiredDescription
ofertasYes
analisisYes
consultaYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds material context beyond them: an uncached HTTPS call taking seconds with a 90s limit, offers that shift with the market, euro amounts excluding tax breakdown, and a concrete failure contract (`{"ok": false, "error": "ArgumentoInvalido", ...}` with the distinction between missing-argument and network failures).

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?

Purpose is front-loaded in the first clause, followed by parameter routing and then behavioral/error notes. It is dense and semicolon-heavy rather than bloated, but the packed clauses make it slightly harder to scan than a cleanly separated structure would be.

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?

For a 12-parameter, zero-required tool with an output schema, the description covers the selection matrix, defaults, precedence, cost model (euros, no tax breakdown), latency, and the failure format. An agent can call it correctly and interpret failures without opening anything else.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter interaction logic the schema cannot express: explicit `cp`, `consumo` or `potencia` override the `qr`, and without a `qr` the defaults are 3.45 kW and a 2.0TD split. That precedence rule is genuinely additive, though per-parameter meaning largely lives in the schema.

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?

States a specific verb (consulta/compara) and resource (ofertas de luz y gas del comparador oficial de la CNMC), plus the ordering (de la más barata a la más cara) and the multi-year analysis scope. It also explicitly distinguishes itself from the sibling `leer_factura_qr` by noting the QR text is unnecessary here.

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

Usage Guidelines5/5

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

Gives explicit routing rules: luz needs `qr` or `cp`+`consumo`; gas needs `suministro`=gas plus `cp`+`consumo_gas`; ambas combines them. It names the alternative tool (`leer_factura_qr`) and the condition under which it is not needed, which is exactly the when/when-not guidance an agent needs.

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

leer_factura_archivoA
Read-onlyIdempotent

Busca el QR del comparador en una factura de luz del disco del servidor y devuelve los mismos datos que leer_factura_qr. ruta: si termina en .pdf (sin distinguir mayúsculas) se rasteriza con pdftoppm y se recorren las páginas hasta dar con el QR, y se usa el primero; con cualquier otra extensión se abre como imagen (PNG, JPG...). Úsala cuando tengas el archivo y no el texto del QR. Necesita el extra facturas. Sin red; segundos por PDF, más con un escaneo malo. Si falla, devuelve un error con texto JSON {"ok": false, "error": "ArgumentoInvalido", "message": "..."}: FileNotFoundError, RuntimeError (falta el extra o pdftoppm) o SinQR.

NameRequiredDescriptionDefault
rutaYesruta al PDF o imagen de la factura en el disco del servidor; mejor absoluta (una relativa se resuelve desde el directorio de trabajo del proceso MCP), p. ej. `/home/ana/facturas/2025-03.pdf`

Output Schema

NameRequiredDescription
importeNo
potencia_p1No
potencia_p2No
codigo_postalYes
consumo_anualYes
consumo_facturaNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive/closed-world, yet the description adds substantial context beyond them: pdftoppm rasterization with page traversal and first-QR-wins, no network use, per-PDF latency (worse with bad scans), a missing-extra dependency, and the exact JSON error shapes for FileNotFoundError, RuntimeError and SinQR.

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?

Purpose and the key file-type branching are front-loaded, and nearly every clause carries information. It is dense and slightly run-on in the middle, but no sentence is padding.

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?

With an output schema present, return values need no explanation, and the description still covers prerequisites, error taxonomy, performance expectations and parameter interpretation. Nothing needed to invoke the tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: the `.ruta` value is interpreted by extension (`.pdf` case-insensitive rasterized; anything else opened as an image). This extension-branching behavior is not present in the schema.

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?

States a concrete verb and resource (extract the comparator QR from a utility-bill file on the server disk) and explicitly scopes the output as identical to `leer_factura_qr`. The extension-based handling makes it immediately distinguishable from its sibling.

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

Usage Guidelines5/5

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

Gives an explicit selection condition: 'Úsala cuando tengas el archivo y no el texto del QR', which routes the agent away from `leer_factura_qr` (QR text) toward this tool (file). It also states the prerequisite extra `facturas`.

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

leer_factura_qrA
Read-onlyIdempotent

Interpreta el texto ya decodificado del QR de una factura de luz y devuelve sus datos. qr es la URL de comparador.cnmc.gob.es impresa en la factura; de su query se leen cp (código postal, obligatorio), pP1/pP2 (potencias, kW), caP1-caP3 (consumo anual punta/llano/valle, kWh), cfP1-cfP3 (consumo del periodo facturado) e imp (importe, euros); un campo numérico ausente o ilegible vale 0. Úsala para ver los datos; para comparar, pasa el QR a comparar_ofertas; con el archivo, leer_factura_archivo. Local e instantánea: sin red ni disco. Si falla, devuelve un error con texto JSON {"ok": false, "error": "ArgumentoInvalido", "message": "..."}: SinQR si no es un QR del comparador o falta cp (p. ej. QR de gas o de pago).

NameRequiredDescriptionDefault
qrYescontenido del QR de la factura de luz, ya decodificado: la URL de comparador.cnmc.gob.es que lleva impresa, p. ej. `https://comparador.cnmc.gob.es/comparador/QRE?cp=28013&pP1=4.6&caP1=740...`

Output Schema

NameRequiredDescription
importeNo
potencia_p1No
potencia_p2No
codigo_postalYes
consumo_anualYes
consumo_facturaNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so safety is covered. The description adds genuine behavioral context beyond them: execution is local and instantaneous with no network or disk, and failures return an in-band JSON envelope with concrete codes (ArgumentoInvalido, SinQR) including the case of gas/payment QRs lacking cp. It does not describe the shape of the success payload, but an output schema exists.

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?

Front-loaded with purpose, then parameter semantics, alternatives, and error behavior in a tight sequence with zero filler. The single long paragraph with run-on clauses is dense in places, which slightly hurts scannability, but every sentence carries information.

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 output schema carries return values, so the description need not explain them. It covers the input contract, the required cp prerequisite, the sibling routing, and the exact error envelope and codes an agent must handle — complete for a single-parameter, offline parser.

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

Parameters4/5

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

Schema coverage is 100% and the schema example already shows the query string, so baseline is 3. The description adds real meaning beyond it: the field-by-field mapping of the CNMC query (cp obligatorio, pP1/pP2 in kW, caP1-caP3 annual kWh, cfP1-cfP3 billed-period consumption, imp in euros) and the rule that an absent or unreadable numeric field is treated as 0.

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?

States a specific verb (interpreta) and resource (texto ya decodificado del QR de una factura de luz) plus the returned outcome, and explicitly names both siblings (comparar_ofertas for comparison, leer_factura_archivo for files). An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('Úsala para ver los datos') and names the alternative plus the selecting condition for each sibling: pass the QR to comparar_ofertas to compare, use leer_factura_archivo when you have the file. Nothing is left to inference.

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.

  1. 3 tool updatesv0.2.4
    • Changedcomparar_ofertas1 field changed
      • changedInput schema / properties / qr / description
        Previous value: -"contenido del QR de la factura de luz, ya decodificado (la URL de comparador.cnmc.gob.es que lleva impresa)"New value: +"contenido del QR de la factura de luz, ya decodificado: la URL de comparador.cnmc.gob.es que lleva impresa, p. ej. `https://comparador.cnmc.gob.es/comparador/QRE?cp=28013&pP1=4.6&caP1=740...`"
    • Changedleer_factura_archivo1 field changed
      • changedInput schema / properties / ruta / description
        Previous value: -"ruta al PDF o imagen de la factura"New value: +"ruta al PDF o imagen de la factura en el disco del servidor; mejor absoluta (una relativa se resuelve desde el directorio de trabajo del proceso MCP), p. ej. `/home/ana/facturas/2025-03.pdf`"
    • Changedleer_factura_qr1 field changed
      • changedInput schema / properties / qr / description
        Previous value: -"contenido del QR de la factura de luz, ya decodificado (la URL de comparador.cnmc.gob.es que lleva impresa)"New value: +"contenido del QR de la factura de luz, ya decodificado: la URL de comparador.cnmc.gob.es que lleva impresa, p. ej. `https://comparador.cnmc.gob.es/comparador/QRE?cp=28013&pP1=4.6&caP1=740...`"
  2. 4 tool updatesv0.2.3
    • Changedcomparar_ofertas2 fields changed
      • addedInput schema / properties / suministro / description
        Added value: +"qué comparar (por defecto luz); ambas añade las ofertas conjuntas y la alternativa de contratar por separado"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "analisis": {
        +      "type": "object"
        +    },
        +    "consulta": {
        +      "type": "object"
        +    },
        +    "ofertas": {
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "consulta",
        +    "ofertas",
        +    "analisis"
        +  ],
        +  "type": "object"
        +}
    • Removedleer_factura
    • Addedleer_factura_archivo
    • Changedleer_factura_qr1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "codigo_postal": {
        +      "type": "string"
        +    },
        +    "consumo_anual": {
        +      "items": {
        +        "type": "number"
        +      },
        +      "type": "array"
        +    },
        +    "consumo_factura": {
        +      "items": {
        +        "type": "number"
        +      },
        +      "type": "array"
        +    },
        +    "importe": {
        +      "type": "number"
        +    },
        +    "potencia_p1": {
        +      "type": "number"
        +    },
        +    "potencia_p2": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "codigo_postal",
        +    "consumo_anual"
        +  ],
        +  "type": "object"
        +}
  3. 3 tool updatesv0.1.0
    • First observedcomparar_ofertas
    • First observedleer_factura
    • First observedleer_factura_qr

TDQS

A4.6/5.0

Scored across 3 tools

Disambiguation4/5

comparar_ofertas is clearly the action tool, while the two leer_factura_* tools are split by input source (QR text vs. file path) and the descriptions explicitly state which to use in each case. The two read tools share the same output purpose, so there is slight conceptual overlap, but the input distinction is documented well enough to avoid misselection.

Naming Consistency5/5

All three names follow a consistent Spanish verb_noun snake_case pattern (comparar_ofertas, leer_factura_qr, leer_factura_archivo). The two leer_factura_* variants differ only by a meaningful suffix, so the convention is predictable throughout.

Tool Count4/5

Three tools is on the lean side but fits the narrow scope of comparing offers and reading bill QR data. Each tool earns its place; the set is not padded, though it leaves little room for adjacent needs like gas bill parsing.

Completeness4/5

The core lifecycle is covered: compare light/gas offers, extract QR data from text, and extract it from a file. Minor gaps remain (e.g., no gas-bill QR reading, only electricity), but these are edge cases an agent can work around since comparison also accepts explicit cp/consumo arguments.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables natural language conversations with Spain's electrical grid data through Claude, providing real-time access to electricity demand, generation, prices, and emissions data from Red Eléctrica de España (REE).
    18
    11
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Fetches Spanish electricity prices (PVPC) from Red Eléctrica de España's API, providing hourly tariff data for different geographical areas and customizable date ranges.
    1
    80 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI-powered analysis and prediction of household energy consumption through machine learning models, providing historical consumption breakdowns, price queries from Spanish electricity markets, and personalized energy optimization recommendations.
    -
  • A
    license
    A
    quality
    C
    maintenance
    AI agent for Italian energy tariff comparison. Analyzes electricity and gas bills, compares 44+ offers from 13 providers, estimates savings with full ARERA regulated cost breakdown
    7
    MIT