GridCarbon

Intensidade de carbono da rede (gCO2eq/kWh) para 45 zonas na Europa, nos EUA e na Grã-Bretanha, a partir de ENTSO-E, EIA-930 e NESO. Cada resposta é carimbada com o intervalo que cobre e há quanto tempo é. Sem chave de API, sem conta. Pré-alfa.

Documentação

gridcarbon-mcp

Um servidor MCP que fornece a um agente de IA a intensidade de carbono da rede elétrica — gCO2eq/kWh, quanto menor, mais limpo — para 45 zonas na Europa, nos Estados Unidos e na Grã-Bretanha.

Sem chave de API. Sem conta. Sem configuração.

npx gridcarbon-mcp

Baseado em api.gridcarbon.dev. Dados da Plataforma de Transparência da ENTSO-E, da Administração de Informação de Energia dos EUA e da NESO.


Instalação

Claude Code

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

Adicione -s user para disponibilizá-lo em todos os projetos, em vez de apenas no atual:

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

Claude Desktop

Edite claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json) e adicione:

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

Reinicie o Claude Desktop.

Qualquer outra coisa que fale MCP via stdio

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

A única configuração opcional é GRIDCARBON_API_URL, que aponta o servidor para uma URL base de API diferente (para desenvolvimento local contra um Worker em localhost:8787).


Ferramentas

FerramentaO que faz
get_carbon_intensityIntensidade publicada mais recente para uma zona, com seu timestamp e o quão desatualizado está
get_intensity_historySérie horária em uma janela, além de mín / máx / média / mais limpa / mais suja
list_zonesAs 45 zonas cobertas, cada uma com sua fonte, resolução e comparabilidade
compare_zonesClassifica zonas da mais limpa para a mais suja, com a Grã-Bretanha tratada corretamente (veja abaixo)

Toda ferramenta é somente leitura. Todo valor retorna com seu timestamp de intervalo, sua idade em minutos e uma idade em linguagem natural como "2h 57m ago" — porque a forma mais provável de usar mal esses dados é relatar um número dos EUA com 24 horas de idade como "agora mesmo".


Exemplos de prompts

Estes funcionam como escritos assim que o servidor estiver instalado:

  • "Qual é a intensidade de carbono da rede francesa agora?"
  • "A rede da Suécia está mais limpa que a da Polônia no momento?"
  • "Classifique as cinco redes elétricas mais limpas para as quais você tem dados."
  • "Preciso executar um trabalho de GPU de 6 horas. Entre Alemanha, França e Irlanda, qual rede está mais limpa agora, e qual a idade desse número?"
  • "Mostre como a intensidade de carbono da rede da Alemanha variou nas últimas 24 horas."
  • "Qual foi a hora mais limpa na Espanha ontem?"
  • "Qual rede dos EUA está mais suja hoje, e quão atrasados estão os dados da EIA?"
  • "Você cobre o Japão?" — ele dirá que não, em vez de adivinhar.

O que ele realmente retorna

Toda a saída abaixo é o content[0].text literal de um tools/call, capturado do tarball publicado falando com a API ao vivo em 2026-08-26 03:11 UTC. Nada aqui é inventado. Os números mudam a cada hora; os nomes dos campos e as formas não mudam.

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"._

A mesma chamada para US-ERCOT, um minuto depois:

## 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"._

Esse número está com mais de um dia de idade, e a ferramenta diz isso em três lugares em vez de deixar um agente chamá-lo de "atual". freshness ainda é normal, porque um dia de atraso é normal para a EIA — a desatualização é avaliada em relação aos hábitos de cada fonte.

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.

Observe o que não aconteceu: a GB não foi silenciosamente descartada, e não foi permitido que vencesse a classificação com 114 — um número que não está na mesma base que os outros quatro.

compare_zones{ "limit": 5 } (classifica todas as zonas, mantém as cinco mais limpas)

# 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.

Todo superlativo nessa resposta — cleanest, dirtiest, spread_gco2eq_kwh, observation_times — está limitado às cinco linhas que você pode realmente ver, e omitted_by_limit diz quantas foram descartadas. A ferramenta nunca nomeia uma zona que não está em sua própria tabela.

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.

Ressalvas — por favor, leia

1. A Grã-Bretanha não é comparável com mais nada. A GB vem da própria API de Intensidade de Carbono da NESO, que usa fatores de emissão operacionais (somente combustão). As outras 44 zonas são calculadas aqui a partir do mix de geração publicado usando fatores de ciclo de vida AR5 do IPCC, que também contam a construção das usinas e a cadeia de suprimento de combustível. Os números da GB são, portanto, sistematicamente menores para a mesma rede física. compare_zones mantém a GB fora das classificações por padrão e a reporta separadamente com o motivo; include_gb_in_ranking: true a classifica mesmo assim, mas sinaliza cada linha afetada, a base de comparação e um aviso de nível superior. Esta é a forma mais provável de interpretar mal os dados.

2. "Mais recente" significa o mais novo publicado, não "agora". As zonas europeias (ENTSO-E) normalmente ficam 2–4 horas atrás do tempo real. As zonas dos EUA (EIA) ficam 11–28 horas atrás. A Grã-Bretanha fica 1–2 horas atrás e seu intervalo mais novo pode ser uma previsão da NESO (method: "upstream:uk-neso:forecast") em vez de um valor real consolidado. Toda leitura carrega ts, age_minutes, age_human e uma classificação freshness que é relativa ao que é normal para aquela fonte — um valor da EIA com 24 horas de idade é "normal", não "stale".

3. A cobertura é apenas Europa, EUA e Grã-Bretanha. 45 zonas. Sem Canadá, Austrália, Japão, China, Índia, América Latina ou África. Códigos de zona desconhecidos retornam um erro com correspondências aproximadas, em vez de um substituto com aparência plausível.

4. O histórico começa em 2026-08-21. Nada existe antes disso. Intervalos ausentes são lacunas, não zeros — não os interpole.

5. Pré-alfa. A API é recente. Ela tem limite de 60 requisições por minuto por IP — de forma flexível, já que o limitador da Cloudflare é permissivo por design — e /latest carrega Cache-Control: max-age=300 enquanto os dados em si só mudam a cada hora, então não há nada a ganhar consultando mais rápido que isso. O endpoint /v1/intensity limita uma resposta a 5000 pontos; quando isso acontece, a ferramenta define server_truncated: true e diz claramente que a série está incompleta.


Atribuição

Usar esses dados implica uma obrigação de atribuição. Se você exibir esses valores a um usuário final, credite:

  • Plataforma de Transparência da ENTSO-E — mix de geração europeu
  • Administração de Informação de Energia dos EUA (EIA) — mix de geração dos EUA (EIA-930)
  • API de Intensidade de Carbono da NESO — Grã-Bretanha

A EIA não endossa este pacote, o serviço gridcarbon, nem qualquer uso feito dos dados.

Os fatores de emissão de ciclo de vida são medianas do AR5 do IPCC. Metodologia: https://gridcarbon.dev.

Licença

  • Código-fonte: MIT — veja LICENSE.
  • Valores de dados: CC BY 4.0 — veja DATA-LICENSE.md para o aviso de atribuição, as fontes upstream e suas declarações de não endosso.

Desenvolvimento

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 inicia node dist/index.js e fala JSON-RPC bruto delimitado por nova linha com ele exatamente como um cliente MCP faria — initialize, notifications/initialized, tools/list, depois tools/call para cada ferramenta, incluindo os caminhos de falha (zona desconhecida, janela invertida, janela anterior à cobertura). Também verifica que nada além de JSON-RPC chega ao stdout.

A maior parte roda contra a API ao vivo. A única coisa que a API ao vivo não consegue produzir atualmente é uma resposta truncada — ainda não há histórico suficiente para atingir o limite de 5000 pontos — então essa verificação inicia um segundo servidor contra um stub HTTP local descartável em uma porta efêmera e verifica que truncated: true aparece como server_truncated mais um aviso INCOMPLETE SERIES carregando a própria nota da API.

As dependências diretas de runtime são @modelcontextprotocol/sdk e zod (que o SDK exige para esquemas de ferramentas). Esteja ciente de que o SDK arrasta sua própria árvore transitiva — uma instalação limpa de npm install deste pacote puxa aproximadamente 95 pacotes, incluindo express e cors, que este servidor nunca usa porque só fala stdio. Todo HTTP que este pacote executa usa o fetch embutido do Node; Node 18+ é necessário.

Antes da primeira publicação

  • mcpName em package.json é dev.gridcarbon/gridcarbon-mcp. Reivindicar esse namespace no registro oficial de MCP exige provar o controle de gridcarbon.dev com um registro DNS TXT; faça isso antes de enviar, ou mude o namespace para uma forma io.github.<owner>/… e verifique via GitHub.
  • package.json deliberadamente não tem campo repository ainda — não há repositório público de código-fonte. Adicione-o quando um existir, em vez de enviar uma URL que retorna 404.

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

Citação

Snapshot de dados com DOI: doi:10.5281/zenodo.22299989 (CC BY 4.0). Metadados de citação: CITATION.cff.