GridCarbon

Intensidad de carbono de la red (gCO2eq/kWh) para 45 zonas en Europa, Estados Unidos y Gran Bretaña, de ENTSO-E, EIA-930 y NESO. Cada respuesta incluye el intervalo que cubre y su antigüedad. Sin clave API, sin cuenta. Pre-alfa.

Documentación

gridcarbon-mcp

Un servidor MCP que proporciona a un agente de IA la intensidad de carbono de la red eléctrica — gCO2eq/kWh, cuanto más bajo, más limpio — para 45 zonas en Europa, Estados Unidos y Gran Bretaña.

Sin clave de API. Sin cuenta. Sin configuración.

npx gridcarbon-mcp

Respaldado por api.gridcarbon.dev. Datos de la Plataforma de Transparencia de ENTSO-E, la Administración de Información Energética de EE. UU. y NESO.


Instalación

Claude Code

claude mcp add gridcarbon -- npx -y gridcarbon-mcp

Añade -s user para que esté disponible en todos los proyectos en lugar de solo en el actual:

claude mcp add -s user gridcarbon -- npx -y gridcarbon-mcp

Claude Desktop

Edita claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json) y añade:

{
  "mcpServers": {
    "gridcarbon": {
      "command": "npx",
      "args": ["-y", "gridcarbon-mcp"]
    }
  }
}

Reinicia Claude Desktop.

Cualquier otra cosa que hable MCP sobre stdio

{ "command": "npx", "args": ["-y", "gridcarbon-mcp"] }

La única configuración opcional es GRIDCARBON_API_URL, que apunta el servidor a una URL base de API diferente (para desarrollo local contra un Worker en localhost:8787).


Herramientas

HerramientaQué hace
get_carbon_intensityIntensidad publicada más reciente para una zona, con su marca de tiempo y cuán desactualizada está
get_intensity_historySerie horaria en un intervalo, más mínimo / máximo / media / más limpio / más sucio
list_zonesLas 45 zonas cubiertas, cada una con su fuente, resolución y comparabilidad
compare_zonesClasifica las zonas de más limpia a más sucia, con Gran Bretaña manejada correctamente (ver más abajo)

Cada herramienta es de solo lectura. Cada valor regresa con su marca de tiempo de intervalo, su antigüedad en minutos y una antigüedad en lenguaje natural como "2h 57m ago" — porque la forma más probable de usar mal estos datos es informar un número de EE. UU. de hace 24 horas como "ahora mismo".


Ejemplos de indicaciones

Estos funcionan tal como están escritos una vez que el servidor está instalado:

  • "¿Cuál es la intensidad de carbono de la red francesa ahora mismo?"
  • "¿Es la red de Suecia más limpia que la de Polonia en este momento?"
  • "Clasifica las cinco redes eléctricas más limpias de las que tienes datos."
  • "Necesito ejecutar un trabajo de GPU de 6 horas. De Alemania, Francia e Irlanda, ¿qué red es la más limpia ahora mismo y qué antigüedad tiene ese número?"
  • "Muéstrame cómo se movió la intensidad de carbono de la red de Alemania en las últimas 24 horas."
  • "¿Cuál fue la hora más limpia en España ayer?"
  • "¿Qué red de EE. UU. es la más sucia hoy y cuánto está retrasado el dato de EIA?"
  • "¿Cubres Japón?" — te dirá que no, en lugar de adivinar.

Lo que realmente devuelve

Todo el resultado a continuación es el content[0].text literal de un tools/call, capturado del tarball publicado hablando con la API en vivo a las 2026-08-26 03:11 UTC. Nada aquí está inventado. Los números cambian cada hora; los nombres de campos y las formas no.

get_carbon_intensity{ "zone": "FR" }

## FR — France
**49 gCO2eq/kWh** (very clean)
- Interval start (UTC): `2026-08-26T01:00:00Z` (60-minute interval)
- Age: 2h 11m ago (131 min, normal)
- Method: `computed:v1` · source: entsoe

As of 2026-08-26 01:00 UTC — the most recent published interval, 2h 11m ago — the carbon intensity of FR (France) was 49 gCO2eq/kWh.

_Newest published value; the API caches /latest for 5 minutes. "Latest" means newest published, not "now"._

La misma llamada para US-ERCOT, un minuto después:

## US-ERCOT — ERCOT (Texas)
**349.9 gCO2eq/kWh** (fossil-heavy)
- Interval start (UTC): `2026-08-25T03:00:00Z` (60-minute interval)
- Age: 24h 11m ago (1451 min, normal)
- Method: `computed:v1` · source: eia

As of 2026-08-25 03:00 UTC — the most recent published interval, 24h 11m ago — the carbon intensity of US-ERCOT — ERCOT (Texas) was 349.9 gCO2eq/kWh.

_Newest published value; the API caches /latest for 5 minutes. "Latest" means newest published, not "now"._

Ese número tiene más de un día de antigüedad, y la herramienta lo dice en tres lugares en lugar de dejar que un agente lo llame "actual". freshness sigue siendo normal, porque un día de retraso es normal para EIA — la desactualización se juzga según los hábitos propios de cada fuente.

compare_zones{ "zones": ["DE", "FR", "PL", "SE-3", "GB"] }

# Carbon intensity ranking (cleanest first, gCO2eq/kWh, lower is cleaner)

Basis: IPCC AR5 lifecycle factors (GB excluded: operational factors)

| # | Zone | Name | Value | Band | Interval start (UTC) | Age |
| -: | :--- | :--- | ----: | :--- | :------------------- | :-- |
| 1 | `SE-3` | Sweden SE3 | 33.2 | very clean | 2026-08-26T00:00:00Z | 3h 11m ago |
| 2 | `FR` | France | 49 | very clean | 2026-08-26T01:00:00Z | 2h 11m ago |
| 3 | `DE` | Germany-Luxembourg | 377.7 | fossil-heavy | 2026-08-26T02:00:00Z | 1h 11m ago |
| 4 | `PL` | Poland | 635 | very fossil-heavy | 2026-08-26T02:00:00Z | 1h 11m ago |

Of 4 zone(s) ranked, SE-3 (Sweden SE3) is cleanest at 33.2 gCO2eq/kWh (3h 11m ago) and PL (Poland) is highest at 635 gCO2eq/kWh (1h 11m ago). Each figure is that zone's newest published interval, not a common moment.

## Not ranked
- **GB** (Great Britain) — reported value **114 gCO2eq/kWh** at 2026-08-26 02:30 UTC (41m ago)
  - Not ranked: GB values come from NESO and use OPERATIONAL (combustion-only) emission factors, not the IPCC AR5 lifecycle factors used for the other 44 zones. GB numbers are systematically lower and MUST NOT be compared or ranked against other zones. Its value of 114 gCO2eq/kWh at 2026-08-26T02:30:00Z is reported here so it is not lost, but placing it in the same ranking would misrepresent it as cleaner than it is on a like-for-like basis.

> ⚠️ GB is in the requested set but is NOT in the ranking. Its value is in "excluded_from_ranking" — report it separately, with the reason.

Observa lo que no sucedió: GB no fue eliminada silenciosamente, y no se le permitió ganar la clasificación con 114 — un número que no está en la misma base que los otros cuatro.

compare_zones{ "limit": 5 } (clasifica cada zona, conserva las cinco más limpias)

# Carbon intensity ranking (cleanest first, gCO2eq/kWh, lower is cleaner)

Basis: IPCC AR5 lifecycle factors (GB excluded: operational factors)

| # | Zone | Name | Value | Band | Interval start (UTC) | Age |
| -: | :--- | :--- | ----: | :--- | :------------------- | :-- |
| 1 | `CH` | Switzerland | 18.7 | very clean | 2026-08-26T01:00:00Z | 2h 11m ago |
| 2 | `SE-1` | Sweden SE1 | 21.3 | very clean | 2026-08-26T01:00:00Z | 2h 11m ago |
| 3 | `NO-5` | Norway NO5 | 24.5 | very clean | 2026-08-26T00:00:00Z | 3h 11m ago |
| 4 | `NO-3` | Norway NO3 | 26.2 | very clean | 2026-08-26T00:00:00Z | 3h 11m ago |
| 5 | `NO-2` | Norway NO2 | 27.7 | very clean | 2026-08-26T00:00:00Z | 3h 11m ago |

Of 5 zone(s) ranked, CH (Switzerland) is cleanest at 18.7 gCO2eq/kWh (2h 11m ago) and NO-2 (Norway NO2) is highest at 27.7 gCO2eq/kWh (3h 11m ago). Each figure is that zone's newest published interval, not a common moment.

[… GB "Not ranked" block, as above …]

> ⚠️ GB is covered but is NOT in the ranking. Its value is in "excluded_from_ranking" — report it separately, with the reason.
> ⚠️ limit=5 kept only the 5 cleanest of 44 zones that have data; 39 further zone(s) were ranked but not returned. Every figure below — cleanest, dirtiest, spread, observation times — describes the returned rows only, not the full set.

Cada superlativo en esa respuesta — cleanest, dirtiest, spread_gco2eq_kwh, observation_times — está limitado a las cinco filas que realmente puedes ver, y omitted_by_limit dice cuántas fueron descartadas. La herramienta nunca nombra una zona que no esté en su propia tabla.

get_intensity_history{ "zone": "DE", "from": "2026-08-25T18:00:00Z", "to": "2026-08-26T00:00:00Z" }

# DE — Germany-Luxembourg: 2026-08-25 18:00 UTC → 2026-08-26 00:00 UTC

6 interval(s), unit gCO2eq/kWh, lower is cleaner.

- Mean **363.6**, min **356.5**, max **380.7**
- Cleanest interval: 2026-08-25 22:00 UTC at 356.5
- Dirtiest interval: 2026-08-25 18:00 UTC at 380.7
- First → last: 380.7 → 360.5 (-5.3%)

| Interval start (UTC) | gCO2eq/kWh | method |
| :------------------- | ------------: | :----- |
| 2026-08-25T18:00:00Z | 380.7 | computed:v1 |
| 2026-08-25T19:00:00Z | 365 | computed:v1 |
| 2026-08-25T20:00:00Z | 359.1 | computed:v1 |
| 2026-08-25T21:00:00Z | 359.6 | computed:v1 |
| 2026-08-25T22:00:00Z | 356.5 | computed:v1 |
| 2026-08-25T23:00:00Z | 360.5 | computed:v1 |

> ⚠️ The newest interval in this window starts 2026-08-25T23:00:00Z (4h 11m ago). That is the end of the published data, not the present moment.

list_zones{ "source": "uk-neso" }

# Covered zones (1 of 45)

| Zone | Name | Source | Res (min) | Factors | Typical lag |
| :--- | :--- | :----- | --------: | :------ | :---------- |
| `GB` | Great Britain | uk-neso | 30 | operational ⚠️ | ~2h |

- **uk-neso** — NESO Carbon Intensity API, passed through unchanged. OPERATIONAL (combustion-only) factors — NOT comparable with the other 44 zones. Typically 1-2 hours behind, and the newest interval may be a forecast.

> 44 of 45 zones use IPCC AR5 lifecycle emission factors. GB values come from NESO and use OPERATIONAL (combustion-only) emission factors, not the IPCC AR5 lifecycle factors used for the other 44 zones. GB numbers are systematically lower and MUST NOT be compared or ranked against other zones.
> typical_lag_hours is the usual publication delay, not a guarantee. Always read the ts and age returned by get_carbon_intensity before calling a value current.
> History is uneven by region: Great Britain from 2017-09, the 11 US zones from 2019-01, and the 33 European zones from 2024-08 (two years).
> Attribution required: ENTSO-E Transparency Platform / U.S. Energy Information Administration (EIA) / NESO Carbon Intensity API. EIA does not endorse this service.

Advertencias — por favor, léelas

1. Gran Bretaña no es comparable con nada más. GB proviene de la propia API de Intensidad de Carbono de NESO, que utiliza factores de emisión operativos (solo combustión). Las otras 44 zonas se calculan aquí a partir de la mezcla de generación publicada utilizando factores de ciclo de vida IPCC AR5, que también cuentan la construcción de plantas y la cadena de suministro de combustible. Por lo tanto, los números de GB son sistemáticamente más bajos para la misma red física. compare_zones mantiene a GB fuera de las clasificaciones por defecto y la informa por separado con el motivo; include_gb_in_ranking: true la clasifica de todos modos pero marca cada fila afectada, la base de comparación y una advertencia de nivel superior. Esta es la forma más probable de malinterpretar los datos.

2. "Más reciente" significa lo último publicado, no "ahora". Las zonas europeas (ENTSO-E) suelen ir de 2 a 4 horas por detrás del tiempo real. Las zonas de EE. UU. (EIA) van de 11 a 28 horas por detrás. Gran Bretaña va de 1 a 2 horas por detrás y su intervalo más reciente puede ser un pronóstico de NESO (method: "upstream:uk-neso:forecast") en lugar de un valor real liquidado. Cada lectura lleva ts, age_minutes, age_human y una clasificación freshness que es relativa a lo que es normal para esa fuente — un valor de EIA de 24 horas de antigüedad es "normal", no "stale".

3. La cobertura es solo Europa, EE. UU. y Gran Bretaña. 45 zonas. Sin Canadá, Australia, Japón, China, India, América Latina o África. Los códigos de zona desconocidos devuelven un error con coincidencias cercanas en lugar de un sustituto de apariencia plausible.

4. El historial comienza el 2026-08-21. No existe nada antes de eso. Los intervalos faltantes son vacíos, no ceros — no los interpoles.

5. Pre-alfa. La API es joven. Está limitada a 60 solicitudes por minuto por IP — de forma flexible, ya que el limitador de Cloudflare es permisivo por diseño — y /latest lleva Cache-Control: max-age=300 mientras que los datos solo cambian cada hora, por lo que no hay nada que ganar consultando más rápido que eso. El endpoint /v1/intensity limita una respuesta a 5000 puntos; cuando eso sucede, la herramienta establece server_truncated: true y dice en voz alta que la serie está incompleta.


Atribución

El uso de estos datos conlleva una obligación de atribución. Si muestras estos valores a un usuario final, acredita:

  • Plataforma de Transparencia de ENTSO-E — mezcla de generación europea
  • Administración de Información Energética de EE. UU. (EIA) — mezcla de generación de EE. UU. (EIA-930)
  • API de Intensidad de Carbono de NESO — Gran Bretaña

La EIA no respalda este paquete, el servicio gridcarbon ni ningún uso que se haga de los datos.

Los factores de emisión de ciclo de vida son medianas del IPCC AR5. Metodología: https://gridcarbon.dev.

Licencia

  • Código fuente: MIT — ver LICENSE.
  • Valores de datos: CC BY 4.0 — ver DATA-LICENSE.md para el aviso de atribución, las fuentes upstream y sus declaraciones de no respaldo.

Desarrollo

npm install
npm run build          # tsc -> dist/, chmod +x dist/index.js
npm test               # end-to-end stdio smoke test against the live API
npm test -- --raw      # also dumps the literal tools/list response

scripts/smoke-test.mjs genera node dist/index.js y le habla en JSON-RPC crudo delimitado por nuevas líneas exactamente como lo haría un cliente MCP — initialize, notifications/initialized, tools/list, luego tools/call para cada herramienta, incluidos los caminos de fallo (zona desconocida, ventana invertida, ventana anterior a la cobertura). También verifica que nada más que JSON-RPC llegue a stdout.

La mayor parte se ejecuta contra la API en vivo. Lo único que la API en vivo no puede producir actualmente es una respuesta truncada — aún no hay suficiente historial para alcanzar el límite de 5000 puntos — por lo que esa verificación genera un segundo servidor contra un stub HTTP local desechable en un puerto efímero y verifica que truncated: true se manifieste como server_truncated más una advertencia INCOMPLETE SERIES que lleva la propia nota de la API.

Las dependencias directas en tiempo de ejecución son @modelcontextprotocol/sdk y zod (que el SDK requiere para los esquemas de herramientas). Ten en cuenta que el SDK arrastra su propio árbol transitivo — una instalación limpia de npm install de este paquete extrae aproximadamente 95 paquetes, incluidos express y cors, que este servidor nunca usa porque solo habla stdio. Todo el HTTP que este paquete realiza usa el fetch integrado de Node; se requiere Node 18+.

Antes de la primera publicación

  • mcpName en package.json es dev.gridcarbon/gridcarbon-mcp. Reclamar ese espacio de nombres en el registro oficial de MCP requiere probar el control de gridcarbon.dev con un registro DNS TXT; hazlo antes de enviar, o cambia el espacio de nombres a una forma io.github.<owner>/… y verifica a través de GitHub en su lugar.
  • package.json deliberadamente no tiene campo repository todavía — no hay un repositorio fuente público. Añádelo cuando exista uno en lugar de enviar una URL que devuelva 404.

Autor: hello@gridcarbon.dev · Página principal: https://gridcarbon.dev

Cita

Instantánea de datos con un DOI: doi:10.5281/zenodo.22299989 (CC BY 4.0). Metadatos de cita: CITATION.cff.