{"serverId":"mcp-registry/com.greencalculus/api","tools":[{"name":"calculate_activity","fixed":{"name":"calculate_activity","description":"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.","inputSchema":{"type":"object","required":["activity","factor_key"],"properties":{"activity":{"type":"object","description":"{ \"value\": <number>, \"unit\": \"<unit e.g. kWh, MWh, litres, tonne, km>\" }."},"factor_key":{"type":"string","description":"Canonical emission-factor key."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":190,"tokensAfter":190},{"name":"calculate_business_travel","fixed":{"name":"calculate_business_travel","description":"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\").","inputSchema":{"type":"object","required":["distance","factor_key"],"properties":{"distance":{"type":"object","description":"{ \"value\": <number>, \"unit\": \"km|mi\" }."},"factor_key":{"type":"string","description":"Per-passenger-km travel factor key."},"passengers":{"type":"number","description":"Optional, defaults to 1."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":171,"tokensAfter":171},{"name":"calculate_electricity","fixed":{"name":"calculate_electricity","description":"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\").","inputSchema":{"type":"object","required":["consumption","location_factor_key"],"properties":{"consumption":{"type":"object","description":"{ \"value\": <number>, \"unit\": \"kWh|MWh|GWh\" }."},"supplier_factor":{"type":"object","description":"Optional contractual factor { value, unit } (wins over market_factor_key)."},"market_factor_key":{"type":"string","description":"Optional: residual-mix / supplier grid factor key."},"location_factor_key":{"type":"string","description":"Grid-average factor key, e.g. grid.gbr.electricity.location_based."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":254,"tokensAfter":254},{"name":"calculate_embodied","fixed":{"name":"calculate_embodied","description":"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\").","inputSchema":{"type":"object","required":["materials"],"properties":{"materials":{"type":"array","items":{"type":"object"},"description":"Each: { material_key, quantity:{value,unit e.g. m3/kg/tonne/m2}, boundary? }."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":182,"tokensAfter":182},{"name":"calculate_freight","fixed":{"name":"calculate_freight","description":"Freight & logistics emissions (Scope 3 Cat 4 & 9), GLEC framework. THE FACTOR'S DENOMINATOR PICKS THE METHOD — check the factor's unit before choosing the input. Per tonne-km: emissions = tonnes × km × factor, send \"mass\". Per TEU-km (the sea-container family, e.g. freight_detailed.sea.container.trans_suez.dry): emissions = TEU × km × factor, send \"teu\" — a TEU is a twenty-foot container slot, not a mass, and a forty-foot box is 2 TEU. Sending mass against a per-TEU-km factor is refused (422), n","inputSchema":{"type":"object","required":["distance","factor_key"],"properties":{"teu":{"type":"object","description":"{ \"value\": <number> } — container slots. Required for a per-TEU-km factor; omit for a per-tonne-km one."},"mass":{"type":"object","description":"{ \"value\": <number>, \"unit\": \"tonne|kg|lb\" }. Required for a per-tonne-km factor; omit for a per-TEU-km one."},"distance":{"type":"object","description":"{ \"value\": <number>, \"unit\": \"km|mi|nmi\" }."},"factor_key":{"type":"string","description":"Freight factor key. Its unit says whether to send mass (per tonne-km) or teu (per TEU-km)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":325,"tokensAfter":325},{"name":"calculate_pcaf","fixed":{"name":"calculate_pcaf","description":"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).","inputSchema":{"type":"object","required":["holdings"],"properties":{"holdings":{"type":"array","items":{"type":"object"},"description":"Each: { outstanding_amount, denominator:{type:\"evic\"|\"equity_plus_debt\", value}, company_emissions:{value,unit?} OR estimate_from_spend:{amount_usd, sector_key}, data_quality_score? }."},"asset_class":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":177,"tokensAfter":177},{"name":"calculate_spend","fixed":{"name":"calculate_spend","description":"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.","inputSchema":{"type":"object","required":["spend","factor_key"],"properties":{"spend":{"type":"object","description":"{ \"value\": <number>, \"currency\": \"USD|GBP|EUR|SGD\" }."},"factor_key":{"type":"string","description":"Spend-based (EEIO) sector factor key."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"explain_absence","fixed":{"name":"explain_absence","description":"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 — ","inputSchema":{"type":"object","properties":{"family":{"type":"string","description":"Inventory family, e.g. \"water\", \"wtt\", \"travel\", \"spend\", \"heat\"."},"country":{"type":"string","description":"ISO-3166 alpha-3 code, e.g. \"can\"."},"classification":{"type":"string","description":"Filter: structural | not_yet_sourced | refused | held_not_counted | coupled."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":258,"tokensAfter":258},{"name":"lookup_factor","fixed":{"name":"lookup_factor","description":"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_","inputSchema":{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"Canonical factor key, e.g. \"grid.gbr.electricity.location_based\"."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":199,"tokensAfter":199},{"name":"lookup_factors","fixed":{"name":"lookup_factors","description":"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.","inputSchema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"string"},"description":"Canonical factor keys, e.g. [\"grid.gbr.electricity.location_based\", \"grid.fra.electricity.location_based\"]. Maximum 25 per call."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":204,"tokensAfter":204},{"name":"resolve_factor","fixed":{"name":"resolve_factor","description":"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 omit","inputSchema":{"type":"object","required":["description"],"properties":{"limit":{"type":"number","description":"Optional, default 5."},"section":{"type":"string","description":"Optional section filter, e.g. \"fuels\", \"grid\", \"freight\"."},"description":{"type":"string","description":"What you need a factor for, INCLUDING the country if it matters, e.g. \"UK grid electricity\", \"diesel per litre France\", \"hotel stay Japan\". Geography is parsed from this string."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":285,"tokensAfter":285},{"name":"search_factors","fixed":{"name":"search_factors","description":"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.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max results (default 20)."},"query":{"type":"string","description":"Free-text search over factor names/keys."},"section":{"type":"string","description":"Restrict to a section, e.g. \"grid\", \"fuels\", \"freight\"."},"key_prefix":{"type":"string","description":"Restrict to keys starting with this prefix."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":225,"tokensAfter":225}],"toolsChanged":12,"tokensSaved":0,"todo":[{"tool":"calculate_pcaf","params":["asset_class"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}