GreenCalculus
GreenCalculus is an MCP server that returns sourced, audit-traced greenhouse-gas emission factors and carbon calculations an agent can cite and reproduce.
Look up factors —
lookup_factorfor one key with full audit envelope (publisher, source cell, retrieval date, licence, verification),lookup_factorsfor up to 25 in one batch.Search the corpus —
search_factorsby free text, section, or key prefix returns key/name/section/value/unit/gas per match.Resolve messy descriptions —
resolve_factormaps plain language (country included) to ranked candidate keys with confidence and accept/review labels.Explain gaps —
explain_absencesays why a factor is missing (structural, not_yet_sourced, refused, held_not_counted, coupled).Calculate emissions —
calculate_activity(activity × factor with unit conversion and GHG scope),calculate_electricity(Scope 2 location- and market-based),calculate_embodied(EN 15978 whole-life carbon),calculate_pcaf(financed emissions with data-quality score),calculate_freight(GLEC tonne-km),calculate_spend(EEIO screening),calculate_business_travel(Scope 3 Cat 6).Integrate — remote MCP over HTTP with a bearer key, or a thin local stdio bridge via
npx/Docker; discovery,search_factors, andexplain_absencework without a key.
GreenCalculus MCP server
Sourced greenhouse-gas emission factors and audit-traced carbon calculations, as an MCP server. Every value comes back with its exact source reference and a pinned data version — so an agent hands back a number a person can cite and a machine can reproduce, instead of a guess.
Do you need this package?
Probably not. The server is remote, and if your client speaks remote MCP you should point it straight at the URL — nothing to install, nothing to update:
{
"mcpServers": {
"greencalculus": {
"url": "https://mcp.greencalculus.com",
"headers": { "Authorization": "Bearer YOUR_KEY" }
}
}
}This package exists for the clients that can only spawn a local stdio process, and for docker run installs. It is a thin bridge: it forwards each JSON-RPC message to the remote server and returns the reply verbatim. No method is special-cased, so new tools appear here without a release.
Related MCP server: Carbon Intensity MCP
Use it over stdio
{
"mcpServers": {
"greencalculus": {
"command": "npx",
"args": ["-y", "greencalculus-mcp"],
"env": { "GREENCALCULUS_API_KEY": "YOUR_KEY" }
}
}
}Or with Docker — the image is published to GitHub Container Registry as ghcr.io/greencalculus/greencalculus-mcp (linux/amd64 and arm64, tags latest and each version). -i is required and -t must be omitted, because the container's stdin/stdout are the transport and a TTY corrupts the stream:
{
"mcpServers": {
"greencalculus": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "GREENCALCULUS_API_KEY", "ghcr.io/greencalculus/greencalculus-mcp"],
"env": { "GREENCALCULUS_API_KEY": "YOUR_KEY" }
}
}
}Get a free key at https://greencalculus.com/developers — no card. Discovery (initialize, tools/list) works without one, and so do search_factors and explain_absence; every other tool needs a key.
Tools
Tool | What it does |
| Fetch one emission factor by key, with its source and version |
| Fetch many factors by key in one call — a portfolio is one request, not one per factor |
| Search the corpus by free text |
| Map a messy real-world description to the best-matching factor |
| Say why a factor does not exist, rather than returning nothing |
| Activity → emissions, with unit conversion and GHG Protocol scope |
| Location-based and market-based electricity |
| Embodied carbon (EN 15978), explicit about missing lifecycle stages |
| PCAF financed emissions, with the audit trail |
| Freight by mode, distance and load |
| Spend-based EEIO |
| Business travel across modes |
Configuration
Variable | Default | Meaning |
| — | Your API key. |
|
| Override the endpoint. |
|
| Per-request timeout. |
Diagnostics go to stderr. Nothing but JSON-RPC is ever written to stdout — a stray byte there corrupts the session.
Develop
npm test # unit tests, no network
node bin/greencalculus-mcp.js # reads JSON-RPC on stdin
docker build -t greencalculus-mcp . # local image; CI publishes ghcr.io/greencalculus/greencalculus-mcpReleasing
Bump version in package.json, merge to main. That's the whole procedure — npm, the MCP registry and the container image all follow from it.
release.yml asks npm and the MCP registry
whether they already have that version and publishes only where they don't, so
a merge that bumps ships it and a merge that doesn't is a no-op. It also runs
weekly, so a publish that failed is retried without a new commit.
server.json is the registry manifest, and the workflow rewrites its version
from package.json before publishing — one source of truth, three places that
have to agree.
npm authenticates by trusted publishing,
so there is no npm token here. The registry needs one secret, and the reason is
worth knowing: we publish as com.greencalculus/api, a DNS namespace, and GitHub
OIDC only ever grants io.github.<org>/*. So the registry step signs with the key
matching the v=MCPv1 TXT record on greencalculus.com, held as MCP_PRIVATE_KEY.
scripts/rotate-registry-key.sh generates a
fresh pair and installs it without ever printing the private half; it prints the
TXT record to publish. Without the secret the registry step skips and says so —
npm still publishes.
Also available
REST API and docs — https://greencalculus.com/developers
Client SDKs (Python, JS/TS) — https://github.com/greencalculus/greencalculus-sdk
Official MCP registry —
com.greencalculus/api
Licence
MIT — see LICENSE. The licence covers this bridge. Emission-factor data returned by the API carries the licence of its underlying source, which is named in every response.
Available Tools
12 toolscalculate_activityA
Turn activity data into greenhouse-gas emissions: emissions = activity × factor. Give an amount + unit and a factor key; the unit engine converts to the factor basis (MWh→kWh, tonne→kg, gallon→litre, mile→km) and returns the emissions with the working, the GHG Protocol scope, and the source. Use search_factors / lookup_factor to find the factor key.
Inputs: activity (required), factor_key (required).
calculate_business_travelA
Business travel emissions (Scope 3 Cat 6), distance method: emissions = km × passengers × factor. Air factors come in with_rf / without_rf (radiative forcing) variants. Find factors via search_factors (section "business_travel").
Inputs: distance (required), factor_key (required), passengers.
calculate_electricityA
GHG Protocol Scope 2 for purchased electricity, both methods. Always returns location-based (grid-average) emissions; also returns market-based when you supply a contractual supplier_factor (e.g. a green tariff / REC = 0) or a market_factor_key (residual mix). Find grid keys via search_factors (section "grid").
Inputs: consumption (required), location_factor_key (required), supplier_factor, market_factor_key.
calculate_embodiedA
Whole-life embodied carbon for materials, per EN 15978. Give a material key + quantity (+ optional boundary A1-A3 / A1-A4 / A1-A5 / A1-C); it assembles the declared lifecycle modules (A1-A3, B, C1-C4, D) into stages, totals the boundary, reports module D separately, and flags any missing stage as not-assessed (never zero). Find material keys via search_factors (section "materials").
Inputs: materials (required).
calculate_freightA
Freight & logistics emissions (Scope 3 Cat 4 & 9), GLEC tonne-km method: emissions = tonnes × km × factor. Find mode factors via search_factors (section "freight" or "freight_detailed"), e.g. freight.road_hgv.tonne_km.
Inputs: mass (required), distance (required), factor_key (required).
calculate_pcafB
Compute PCAF Part A financed emissions for a portfolio. Returns each holding's attribution factor and financed emissions, the portfolio total, the outstanding-weighted data-quality score, and the audit trail (formula + PCAF source).
Inputs: holdings (required), asset_class.
calculate_spendA
Spend-based (EEIO) Scope 3 screening: emissions = spend × economic-intensity factor. Spend must be in the factor's own currency/year (no FX). Find sector factors via search_factors (section "spend_based"), e.g. spend_based.us.naics6.541511.custom_computer_programming_services.
Inputs: spend (required), factor_key (required).
explain_absenceA
Ask why a factor is NOT in the corpus. The reasoned counterpart to coverage: where a country reports zero rows for an inventory family, this says whether that is the world's limit or our backlog. Five classifications: "structural" (no publisher issues this anywhere — stop looking, and do not silently substitute another country), "not_yet_sourced" (a publisher exists and is named; it is our backlog), "refused" (we found it and declined — the reason is stated), "held_not_counted" (we DO hold it — see we_hold for the key), "coupled" (empty only because another family is empty). Each record names the publisher checked, the route tried, a confidence and a review date, and reports stale:true once past review. These are authored judgements about what the world publishes, not values derived from our data. Call this before concluding that a gap is permanent, and before telling a user to look elsewhere.
Inputs: family, country, classification.
lookup_factorA
Look up a single greenhouse-gas emission factor by its canonical key. Returns the value plus an audit envelope: provenance (publisher, exact source reference, retrieval date, LICENCE and whether it may be redistributed, with the attribution the licence requires) and verification (whether the per-gas components sum to the headline, the GWP set, and the source note stating what the publisher did NOT provide). If the key does not exist you get candidate keys back rather than a dead end. Use search_factors first if you do not know the key.
Inputs: key (required).
lookup_factorsA
Look up SEVERAL emission factors by key in one call, each with the same audit envelope lookup_factor returns — provenance (publisher, exact source reference, retrieval date, licence, redistribution) and verification. Use this instead of calling lookup_factor in a loop: a portfolio or a multi-country comparison is one call, not one per factor. Keys that do not exist come back in not_found rather than failing the batch.
Inputs: keys (required).
resolve_factorA
Find the best emission-factor key(s) for a plain-language description — the hardest step is picking the right key out of ~16,000. Returns ranked matches, each carrying the key, value, unit and a confidence score; feed the chosen key to a calculate_* tool or lookup_factor. Prefer this over guessing a key. PUT THE COUNTRY IN THE DESCRIPTION. Geography is read from the description text itself, not from a separate field — "diesel per litre" and "diesel per litre France" resolve differently, and omitting the country will quietly return a factor from somewhere else marked "geo_match":"proxy". ACT ON THE LABEL. Every candidate carries label: "accept" or "review", plus "why". "accept" means confidence >= 0.85 and no demotion applied — right about nine times in ten. "review" means the answer may be usable but something is off (low confidence, only one term matched, a proxy country, or a gate demoted it); confirm it before adopting the number rather than using it silently. Roughly half of CORRECT answers are also flagged "review" — that is the intended trade, so treat "review" as "check this", not "discard this". A MISS MAY EXPLAIN ITSELF. When nothing matches, or the only matches are from the wrong country, the response may carry an "absence" object saying WHY. classification "structural" means no publisher issues this anywhere — STOP, do not retry with reworded queries and do not substitute a different country without saying so. "not_yet_sourced" means a publisher exists and we have not ingested it (the publisher is named). "refused" means we found the data and declined it, with the reason. "coupled" means this reads empty only because a related family is empty. Use explain_absence to ask the same question directly.
Inputs: description (required), limit, section.
search_factorsA
Find emission factors by section, key prefix, or free text. Returns each match with its key, name, section, VALUE, unit and gas — enough to choose between them or read a few numbers without a second call. For one factor's full audit envelope (publisher, exact source reference, retrieval date, licence, verification) call lookup_factor; for several, call lookup_factors.
Inputs: limit, query, section, key_prefix.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
The find/lookup tools are mostly separable: search_factors and resolve_factor both find factors but one is structured search and the other natural-language best-key; lookup_factor/lookup_factors differ by batch. The calculate_* tools are cleanly distinguished by method/scope, though calculate_activity is generic enough to overlap conceptually with the sector-specific calculators.
Every tool follows a consistent verb_noun snake_case pattern: search_factors, lookup_factor(s), resolve_factor, explain_absence, and calculate_<domain>. Pluralization is used deliberately for batch lookup. No mixed conventions or vague verbs.
Twelve tools is well within the sweet spot for a domain server. Each tool earns its place: three discovery/lookup tools, one absence explainer, one resolver, and seven calculation methods. The count reflects the breadth of GHG calculation methods without redundant duplicates.
The server covers the full read/lookup/calculate lifecycle for emission factors: discovery, resolution, provenance audit, absence explanation, and multiple calculation methods. Minor gaps exist (no dedicated employee-commuting/waste calculators, no factor management), but generic calculate_activity and broad factor search mitigate them.
Maintenance
Related MCP Connectors
Sourced carbon emission factors + audit-traced calculations an AI can cite.
Your carbon footprint, VSME and CSRD reports and climate plan, with the source of every figure.
Verified CO2e for any transaction, activity, flight, shipment or CBAM import. 200+ countries.
Deterministic Scope 1/2/3 GHG inventories with bundled factors and audit hashes.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables carbon accounting by matching activities to emission factors via semantic search and AI ranking, supporting ELCD and ecoinvent databases.64 npm57 PyPI1-
- FlicenseNot gradedqualityDmaintenanceProvides access to the UK Carbon Intensity API, enabling users to retrieve current, historical, and forecast carbon intensity data, regional data by postcode, and generation mix information.-
- AlicenseBqualityCmaintenanceSchema-aware, read-only access to European climate data from the EEA Discodata service, supporting GHG inventory and policies and measures databases.18MIT
- AlicenseNot gradedqualityBmaintenanceWraps the EPA Envirofacts REST API to provide access to emissions data without authentication.139 npmMIT