Skip to main content
Glama
boaviztapi-mcp

boaviztapi-mcp

boaviztapi-mcp

CI PyPI License: Apache-2.0 boaviztapi-mcp MCP server

An MCP server that lets AI assistants answer questions about the environmental footprint of IT hardware: cloud instances, servers, GPUs and other components, and end-user devices. It asks BoaviztAPI and reports the answer with units, uncertainty ranges and caveats.

Unofficial community project. Every number comes from BoaviztAPI, built by Boavizta. See their methodology documentation for how impacts are computed.

Quick start

You need uv. The server talks to the public BoaviztAPI instance by default; see Configuration to use your own.

Claude Desktop, Cursor and other clients with an mcpServers config:

{
  "mcpServers": {
    "boaviztapi": {
      "command": "uvx",
      "args": ["boaviztapi-mcp"]
    }
  }
}

To use your own BoaviztAPI instance, add "env": {"BOAVIZTAPI_URL": "http://localhost:5000"} next to args.

Claude Code:

claude mcp add boaviztapi -- uvx boaviztapi-mcp

Add -e BOAVIZTAPI_URL=http://localhost:5000 before -- to use your own instance.

Docker, from a clone of this repository:

docker build -t boaviztapi-mcp .
docker run -i --rm boaviztapi-mcp

Pass -e BOAVIZTAPI_URL=... to docker run to change the instance. Inside a container, localhost is the container itself; use host.docker.internal (Docker Desktop) to reach an instance on your machine.

From source, without installing a release:

uvx --from git+https://github.com/malikmalikayesha/boaviztapi-mcp boaviztapi-mcp

Try it without a client using the MCP Inspector:

npx @modelcontextprotocol/inspector uvx boaviztapi-mcp

Related MCP server: leadgreen-mcp

What you can ask

  • "What is the footprint of 4 H100 SXM GPUs running for a year in Germany?"

  • "Compare an AWS m5.xlarge in France and in the US over a month."

  • "What is the embedded carbon of a typical laptop?"

  • "Which is greener in eu-west-3 at 50% load: m5.xlarge or c5.2xlarge?"

  • "What would a server with 2x Xeon Gold 6134 and 384 GB RAM emit over 5 years in France?"

  • "What does adp mean and what unit is it in?"

The first question in Claude Desktop, with the server's tools doing the lookup and the estimate:

The same answer as the server returns it (the summary field of estimate_component):

4x NVIDIA H100 SXM 80GB, over 8760 h (1 year), in Germany (DEU)
Embedded = the share of manufacturing allocated to 8760 h of a 26280 h lifetime.
gwp, Total climate change (kgCO2eq):
  embedded: 766.8
  use: 7100 (range 1035 to 10350)
  total: 7867 (range 1802 to 11120)
adp, Use of minerals and fossil ressources (kgSbeq):
  embedded: 0.007776
  use: 0.0015 (range 0.0002155 to 0.002155)
  total: 0.009276 (range 0.007992 to 0.009931)
pe, Consumption of primary energy (MJ):
  embedded: 10550
  use: 270000 (range 39880 to 398800)
  total: 280600 (range 50430 to 409400)
Assumptions: units 4, TDP 700 W, average power 479.5 W (range 70 to 700), load 65 % (range 0 to 100), use time ratio 1, lifetime 26280 hours, grid carbon intensity 0.422 kg CO2eq/kWh.
Note: GPU 'h100 sxm' was read as NVIDIA H100 SXM 80GB.
Note: GPU only; the host server is not included. Use estimate_server with a gpu block for a whole system.
Source: BoaviztAPI 2.6.0 at https://api.boavizta.org

A comparison (compare_estimates, first criterion shown):

Comparison over 8760 h (1 year):
- m5.xlarge: aws m5.xlarge, over 8760 h (1 year), in eu-west-3 (FRA)
- c5.2xlarge: aws c5.2xlarge, over 8760 h (1 year), in eu-west-3 (FRA)
gwp (kgCO2eq):
  m5.xlarge: total 27.4 (range 22.14 to 36.68)
  c5.2xlarge: total 61 (range 51.06 to 77.16), +122.6% vs m5.xlarge
  Lowest: m5.xlarge (ranges do not overlap).

Tools

All tools are read-only and carry the matching annotations and a display title. Each returns structured content (with an output schema) plus a plain-text summary.

The server speaks the current MCP specification, 2026-07-28 (stateless, with server/discover), and still accepts the 2025-11-25 handshake used by older clients. It uses none of the features deprecated in 2026-07-28 (logging, sampling, roots).

Tool

What it does

Key inputs

list_impact_criteria

Explains impact criteria codes and units

query

search_catalog

Finds exact names before estimating

kind (cloud_provider, cloud_instance, cloud_region, server_archetype, device_archetype, gpu, cpu, country), query, provider, device_type

describe_catalog_item

Shows what an instance, archetype, GPU or CPU contains

kind, name

estimate_cloud_instance

Footprint of one cloud VM

provider, instance_type, region or usage_location, load_percent

estimate_server

Footprint of an on-premise server, optionally with GPUs

archetype, cpu, ram, disks, gpu, usage fields

estimate_component

Footprint of one GPU, CPU, RAM module, SSD or HDD

component, name, units, capacity_gb

estimate_device

Footprint of a laptop, phone, monitor, IoT device and 9 other types

device_type, archetype

compare_estimates

Ranks 2 to 5 options over the same period

items, duration_hours

The estimate tools also take duration_hours, usage_location, criteria (default gwp, adp, pe) and detail (summary or breakdown). Every parameter, type and default is listed in the tool reference.

Names are matched carefully. "h100 sxm" finds "NVIDIA H100 SXM 80GB", and the result notes the interpretation. A name that could mean several items ("h100") or only partly matches one is refused with a list of candidates, so a missing item is never silently swapped for a similar one.

Reading the results

  • Embedded vs use. Embedded is manufacturing (and transport where modelled); use is the electricity consumed. They are always reported separately, with a total only when both are numbers.

  • Period. Without duration_hours, figures cover the whole hardware lifetime. With it, embedded is the share of manufacturing for that period and use is the energy for that period. If the period is longer than the lifetime, BoaviztAPI counts manufacturing once; the result says so.

  • Ranges. (range a to b) is BoaviztAPI's min and max. When two options' ranges overlap, compare_estimates says the ranking is not certain.

  • Location. Use-phase impacts depend on the electricity mix. Without a location BoaviztAPI uses a European default with a wide range, and the result suggests passing a country.

  • "not available from BoaviztAPI for this item" means there is no data for that criterion and phase. It is never a zero.

  • Warnings such as "End of life is not included in the calculation" stay next to the phase they belong to.

Configuration

Variable

Default

Meaning

BOAVIZTAPI_URL

https://api.boavizta.org

BoaviztAPI base URL

BOAVIZTAPI_TIMEOUT

20

Seconds per request

BOAVIZTAPI_DEFAULT_CRITERIA

gwp,adp,pe

Criteria used when a call names none

BOAVIZTAPI_CACHE_TTL

86400

Seconds to cache list and lookup responses; 0 disables caching

Self-host BoaviztAPI for regular use

The public instance is a demo. For anything beyond occasional questions, run your own:

docker run -p 5000:5000 ghcr.io/boavizta/boaviztapi:latest

then set BOAVIZTAPI_URL=http://localhost:5000 in the server's environment. The server is polite either way: it identifies itself in the User-Agent, caches lists and recent estimates, sends at most four requests at a time, and retries only transient failures.

Upstream behaviour this server works around

Found while building this against BoaviztAPI 2.6.0. Each one has a live test that will start failing (on purpose) when upstream changes it.

  • Unknown criteria and criteria=all return HTTP 500, so criteria are checked locally and all is refused.

  • Unknown locations and cloud regions are accepted without an error and give generic results, so both are checked against the API's own lists.

  • name_to_gpu silently picks one GPU for an ambiguous name and returns 200 with a plain string when nothing matches, so names are resolved here and ambiguous ones are refused.

  • An iot_device without an archetype reports 0 for manufacturing, so an archetype is required.

  • The GPU endpoint returns 500 for some criteria on the public instance (fixed upstream in Boavizta/boaviztapi#621, not yet deployed). A failing multi-criteria request is retried one criterion at a time, and only the failing criteria are marked as errors.

Privacy

The server sends BoaviztAPI only what the tool call contains: hardware names and specifications, locations, durations and criteria. Requests go to BOAVIZTAPI_URL and nowhere else, with a User-Agent naming this package. There is no telemetry and nothing is written to disk; caches live in memory and end with the process. Logs go to stderr.

Limitations

  • Figures are BoaviztAPI's model estimates, with ranges that can be wide. Treat them as orders of magnitude for comparing options, not as measurements.

  • A cloud instance's footprint is its share of the host server; networking, storage services and data centre overheads beyond BoaviztAPI's model are not included.

  • Not exposed yet: custom electricity factors, workload time series, standalone motherboards, power supplies and cases, IoT functional blocks, and CPU consumption profiles.

  • The public BoaviztAPI instance is a demo without guaranteed availability. Self-host for anything regular.

Troubleshooting

Symptom

What to do

"BoaviztAPI ... did not respond"

The instance is down or slow. Raise BOAVIZTAPI_TIMEOUT, or self-host and set BOAVIZTAPI_URL.

"Unknown GPU / CPU / instance type / location ..."

The message lists close matches. Use search_catalog to find the exact name.

"... matches N names"

The name is ambiguous; pick one of the listed exact names.

"BoaviztAPI failed (HTTP 500) for: ..."

Upstream cannot compute that criterion for this item. Other criteria are still returned.

Numbers differ from another BoaviztAPI front end

Check the BoaviztAPI version in the result's last line; methods and data change between releases.

The client shows no tools

Run uvx boaviztapi-mcp --version in a terminal to check it starts, then look at the client's MCP log.

Development

uv sync
uv run pytest                 # unit and tool tests, replaying recorded responses
uv run ruff check . && uv run ruff format --check . && uv run pyright
  • Recorded responses live in tests/fixtures/. Re-record them after a BoaviztAPI release with uv run python scripts/record_fixtures.py --clean and review the diff.

  • Summaries are checked against tests/golden/; regenerate them with UPDATE_GOLDEN=1 uv run pytest tests/unit/test_formatting.py.

  • Live tests run against a real instance: start the Docker image above, then BOAVIZTAPI_URL=http://localhost:5000 uv run pytest -m live -rxX.

  • Tool reference: docs/tools.md is generated from the tool schemas with uv run python scripts/gen_tool_docs.py; a test fails if it is out of date.

See CONTRIBUTING.md. Security issues: see SECURITY.md.

License

Apache-2.0. BoaviztAPI itself is AGPL-3.0 and is not bundled; see NOTICE.

Available Tools

8 tools
compare_estimatesCompare estimatesA
Read-onlyIdempotent

Compare 2 to 5 options (cloud instances, servers, components or devices) over one common period and rank them per criterion, with each total, the difference from the first option, and whether the uncertainty ranges overlap.

Use it whenever the question is which option is greener or how options differ; use the single estimate tools for one item. Each item has a label, a kind, and params holding the matching estimate tool's inputs (without duration_hours, criteria or detail). duration_hours is required so items with different lifetimes compare on equal terms. Every item is checked before any estimate runs, and an invalid item fails the call with its label named. Read-only: one BoaviztAPI request per item.

Inputs: items (required), duration_hours (required), criteria. Returns: results, summary, comparison

describe_catalog_itemDescribe a catalog itemA
Read-onlyIdempotent

Show what a named catalog item contains: a cloud instance's vCPUs, memory and host platform; a server or device archetype's default parts and usage; or a GPU's or CPU's specifications.

Use it to explain or check the assumptions behind an estimate, or to choose between similar items; it does not estimate impacts. name is resolved to the exact upstream name, and an ambiguous name returns the candidates (use search_catalog to find names). provider is required for cloud_instance and device_type for device_archetype. Read-only; cached for a day.

Inputs: kind (required), name (required), provider, device_type. Returns: kind, name, details, summary

estimate_cloud_instanceEstimate a cloud instanceA
Read-onlyIdempotent

Estimate the environmental footprint of one cloud VM: its share of the host server's manufacturing (embedded) and the electricity it uses (use), per impact criterion, with units, min-max ranges and warnings.

Use it for a single instance; use compare_estimates to rank several and estimate_server for physical servers. Give either region (the provider's region, which fixes the electricity mix) or usage_location (a country), not both; with neither, a wide European default is used. duration_hours sets the period (8760 = one year); omit it for the whole hardware lifetime. Read-only: one BoaviztAPI request, cached for an hour; if one criterion fails upstream the others are still returned. Use search_catalog(kind='cloud_instance', provider=...) if unsure of a name.

Inputs: provider (required), instance_type (required), detail, region, +4 more. Returns: api, notes, impacts, subject, +5 more

estimate_componentEstimate a componentA
Read-onlyIdempotent

Estimate the environmental footprint of one kind of component (gpu, cpu, ram, ssd or hdd), units of it: manufacturing (embedded) and electricity (use) impacts per criterion, with units, ranges and warnings.

Use it for parts on their own, such as eight H100 GPUs. A GPU alone excludes its host server: for a whole machine use estimate_server with a gpu block. name and tdp_w apply to gpu and cpu, capacity_gb to ram, ssd and hdd; other combinations are an error. Names are resolved to BoaviztAPI's model names and an ambiguous one (such as 'h100') returns the candidates. Read-only: one BoaviztAPI request, cached for an hour.

Inputs: component (required), name, tdp_w, units, +8 more. Returns: api, notes, impacts, subject, +5 more

estimate_deviceEstimate an end-user deviceA
Read-onlyIdempotent

Estimate the environmental footprint of an end-user device: laptop, desktop, smartphone, tablet, television, box, vr_headset, vr_controller, monitor, usb_stick, external_ssd, external_hdd or iot_device. Returns manufacturing (embedded) and electricity (use) impacts per criterion, with units, ranges and warnings.

Use it for devices people use, not servers or cloud (see estimate_server and estimate_cloud_instance). Without archetype the device type's default profile is used, except for iot_device, which needs one; list them with search_catalog(kind='device_archetype', device_type=...). use_time_ratio is the share of time the device is on (0 to 1). Criteria without data are reported as not available, never as 0. Read-only: one BoaviztAPI request, cached for an hour.

Inputs: device_type (required), detail, criteria, archetype, +5 more. Returns: api, notes, impacts, subject, +5 more

estimate_serverEstimate a serverA
Read-onlyIdempotent

Estimate the environmental footprint of an on-premise server, optionally with GPUs: manufacturing (embedded) and electricity (use) impacts per criterion, with units, ranges and warnings.

Use it for physical servers; use estimate_cloud_instance for cloud VMs and estimate_component for one part on its own. Any part you leave out (CPU, RAM, disks, GPU, power supply, case) comes from archetype (default 'platform_compute_medium'), and the result lists which ones. The default lifetime is 4 years (35040 h); a duration_hours longer than the lifetime counts manufacturing once and says so. Set usage_location for a country's electricity mix and detail='breakdown' for per-component impacts. Read-only: one BoaviztAPI request, cached for an hour.

Inputs: cpu, gpu, ram, disks, +11 more. Returns: api, notes, impacts, subject, +5 more

list_impact_criteriaList impact criteriaA
Read-onlyIdempotent

List BoaviztAPI's impact criteria with their code, unit and meaning, e.g. gwp (climate change, kgCO2eq), adp (abiotic resources, kgSbeq) or pe (primary energy, MJ).

Use it to explain a code that appears in a result, or to choose criteria for the estimate tools; it estimates nothing. query filters on code, unit or description words such as 'water'. Read-only; the list comes from BoaviztAPI and is cached for a day.

Inputs: query. Returns: summary, criteria

search_catalogSearch the BoaviztAPI catalogA
Read-onlyIdempotent

Find the exact names BoaviztAPI knows, before estimating.

Use it whenever an estimate needs a name you are unsure of: a GPU or CPU model, a cloud instance type (needs provider), a cloud region, a server or device archetype (needs device_type), or a country. Results are exact upstream strings, including upstream typos such as 'platfom_gpucompute_high', best matches first and capped by limit; total_matches says how many exist. To see what one item contains, use describe_catalog_item instead. Read-only; lists are cached for a day.

Inputs: kind (required), limit, query, provider, +1 more. Returns: kind, names, query, summary, +1 more

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.5/5.0

    Scored across 8 tools

    Disambiguation5/5

    Each tool targets a clearly distinct step or domain: reference lookups (list_impact_criteria, search_catalog, describe_catalog_item), single-item estimates split by resource type (cloud_instance, server, component, device), and cross-option comparison. The descriptions explicitly state the boundary between neighbours ('use compare_estimates to rank several', 'search_catalog to find names'), leaving no realistic chance of misselection.

    Naming Consistency5/5

    All eight tools follow a strict verb_noun snake_case pattern, with the estimate_* family forming a predictable, parallel series (estimate_cloud_instance, estimate_server, estimate_component, estimate_device). Catalog tools also pair consistently (search_catalog / describe_catalog_item).

    Tool Count5/5

    Eight tools is well within the sweet spot and each one earns its place: three reference/lookup helpers, four estimation entry points mapping to distinct physical scopes, and one aggregation tool. Nothing appears redundant or padded.

    Completeness4/5

    Coverage of the domain is strong: name resolution, item introspection, criterion glossary, per-scope estimates, and multi-option comparison form a coherent end-to-end workflow with no dead ends for typical questions. Minor gaps remain — there is no direct 'list supported kinds/archetypes' or filter/search over prior results, so agents must probe via search_catalog and per-kind arguments.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      A
      quality
      D
      maintenance
      Estimates the environmental footprint of your AI use — energy (kWh), miles driven, water used for cooling, and CO₂ — plus a prompt-efficiency score, working with any AI client by measuring token usage.
      9
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables querying measured GPU energy per million output tokens by model and GPU, estimating energy and CO2e for token counts and grid regions, comparing GPUs, exploring concurrency curves, and retrieving hardware and source metadata.
      329 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Bridges to the hosted GreenCalculus corpus so clients can look up sourced greenhouse-gas emission factors with full audit envelopes, search or resolve factor keys from plain-language descriptions, and run deterministic calculations for activity data, embodied carbon, PCAF financed emissions, Scope 2 electricity, GLEC freight, spend-based EEIO screening, and business travel.
      MIT