Skip to main content
Glama
gridcarbon

gridcarbon-mcp

Official

Get latest grid carbon intensity for a zone

get_carbon_intensity
Read-onlyIdempotent

Retrieve the most recently published carbon intensity for any electricity zone, reported in gCO2eq/kWh with its timestamp and age, so you can decide when to run power-hungry workloads.

Instructions

Return the most recently published carbon intensity for ONE electricity zone.

Answers questions like "how clean is the German grid right now", "should I run this batch job in Ireland or leave it", "what is the CO2 per kWh in Texas".

Data contract (read this before you report any number to a user):

  • Unit is gCO2eq/kWh (grams of CO2-equivalent per kilowatt-hour of electricity consumed). LOWER IS CLEANER. There is no upper bound; roughly <100 is very clean, ~100-300 is moderate, >400 is fossil-heavy.

  • "ts" is the START of the reporting interval, in UTC (ISO-8601, "Z" suffix). A value with ts=2026-08-26T01:00:00Z and a 60-minute resolution covers 01:00-02:00 UTC.

  • "latest" means NEWEST PUBLISHED, NOT "now". European zones typically run 2-4 hours behind real time; US (EIA) zones run 11-28 hours behind. Every reading carries "age_minutes" and "age_human" -- state that age when you report the value. Saying "the current carbon intensity in Texas is X" about a 20-hour-old number is wrong.

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

  • Coverage starts 2026-08-21T00:00:00Z; there is no data before that date.

  • Attribution is a licence condition. If you surface these values to an end user, credit: ENTSO-E Transparency Platform / U.S. Energy Information Administration (EIA) / NESO Carbon Intensity API. EIA does not endorse this service or any use of it.

Args:

  • zone (string, required): Zone code such as "DE", "FR", "US-ERCOT", "IT-NORD", "GB". Case-insensitive; unambiguous names like "Texas" or "Portugal" also resolve. Unknown zones return an error listing near matches — do NOT fall back to a neighbouring country.

  • response_format ("markdown" | "json", default "markdown"): text rendering.

Returns (structured): { "reading": { "zone": "DE", "zone_name": "Germany-Luxembourg", "source": "entsoe", "resolution_min": 60, "ts": "2026-08-26T01:00:00Z", // START of the interval, UTC "gco2eq_kwh": 371.4, "unit": "gCO2eq/kWh", "method": "computed:v1", "age_minutes": 107, "age_human": "1h 47m ago", "freshness": "normal", // fresh | normal | stale | very_stale "operational_factors_only": false, "warning": "..." // present only when something could mislead }, "as_of_statement": "As of 2026-08-26 01:00 UTC ... was 371.4 gCO2eq/kWh.", "unit": "gCO2eq/kWh", "interpretation": "371.4 gCO2eq/kWh is fossil-heavy.", "warnings": [] }

How to report the answer: Quote or paraphrase "as_of_statement". Always include the timestamp or the age. Never say "currently" or "right now" about a reading whose freshness is "stale" or "very_stale", and never about any US zone without naming the time it refers to.

Examples:

  • "How clean is France's grid?" -> zone="FR"

  • "Carbon intensity in Texas" -> zone="US-ERCOT" (freshness will be ~1 day old; say so)

  • Don't use for: comparing several zones (use compare_zones), or for a time series (use get_intensity_history).

Errors:

  • Unknown zone -> "Unknown zone "XX". ... Call list_zones ..." with suggestions.

  • Network/timeout -> a message saying the API is unreachable. Do not invent a value.

  • A covered zone with no published data yet returns "No published data for yet."

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
zoneYesZone code, e.g. 'DE' (Germany-Luxembourg), 'FR' (France), 'US-ERCOT' (Texas), 'IT-NORD', 'GB'. Case-insensitive and '_' is accepted for '-'. An unambiguous country/region name such as 'Texas' or 'Portugal' also resolves. Call list_zones if you are unsure — never substitute a neighbouring zone that is not covered.
response_formatNoOutput format for the text content. 'markdown' is compact and human-readable; 'json' returns the full structured payload as text. Structured data is always returned alongside either way.markdown

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
unitYes
readingYes
warningsYes
interpretationNo
as_of_statementYesA ready-to-quote sentence that states the value with its as-of time.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.2

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool readOnly/idempotent and non-destructive, so the description's job was to add behavioral nuance — and it does extensively. It discloses that 'latest' means newest published, not 'now', that readings carry age_minutes/age_human, that GB uses different emission factors and must not be ranked against other zones, that coverage starts on a specific date, and that attribution is a licence condition. This is exactly the kind of context annotations cannot express.

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?

Though long, the description is organized into clearly labeled sections — scope, data contract, Args, Returns, reporting guidance, examples, and errors. Every section earns its place: the data contract prevents the agent from reporting stale or non-comparable numbers as if they were current, and the reporting rules are actionable. The critical 'ONE zone' scope and sibling exclusions are front-loaded, not buried.

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 live-data tool with real-world reporting hazards, this description is complete. It covers unit semantics, time semantics, freshness interpretation, regional factor differences, coverage start, attribution obligations, error behavior, output structure, and exactly how to phrase the answer. Combined with the rich output schema and annotations, an agent has everything needed to invoke the tool and present results safely.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents zone codes, case-insensitivity, natural-name resolution, the 'never substitute a neighbour' rule, and response_format's enum/default. The description's Args section largely restates this information rather than adding meaning beyond the schema. It does reinforce how errors behave, but the baseline of 3 is appropriate because the schema already carries the parameter documentation burden.

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 precise verb and resource: 'Return the most recently published carbon intensity for ONE electricity zone.' It clearly distinguishes this tool from siblings by explicitly saying it is not for comparing zones or getting time series, and it gives concrete example questions such as 'how clean is the German grid right now' that an agent can match against user intent.

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?

Usage context is explicit: it lists what questions this tool answers, provides example zone mappings, and states exclusions: 'Don't use for: comparing several zones (use compare_zones), or for a time series (use get_intensity_history).' It also tells the agent to call list_zones when unsure and never substitute an uncovered neighbouring zone, leaving no ambiguity about when to pick this tool.

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