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
| Ferramenta | O que faz |
|---|---|
get_carbon_intensity | Intensidade publicada mais recente para uma zona, com seu timestamp e o quão desatualizado está |
get_intensity_history | Série horária em uma janela, além de mín / máx / média / mais limpa / mais suja |
list_zones | As 45 zonas cobertas, cada uma com sua fonte, resolução e comparabilidade |
compare_zones | Classifica 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
mcpNameempackage.jsonédev.gridcarbon/gridcarbon-mcp. Reivindicar esse namespace no registro oficial de MCP exige provar o controle degridcarbon.devcom um registro DNS TXT; faça isso antes de enviar, ou mude o namespace para uma formaio.github.<owner>/…e verifique via GitHub.package.jsondeliberadamente não tem camporepositoryainda — 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.