Skip to main content
Glama
the78mole

bayernwerk-mcp

by the78mole

bayernwerk-mcp

Tests License: MIT Renovate uv Ruff

MCP server for the Bayernwerk Netz Mein.Auftragsportal (MAP) and e-fix Installateur-Portal, exposing both via the Model Context Protocol.

Built on top of the bayernwerk-client library, which also ships a standalone CLI and can be used directly as a Python library. This repository only adds the MCP interface on top - it's an inoffizieller (unofficial) integration, reverse-engineered, not supported or authorized by Bayernwerk/E.ON. Use at your own risk, only with your own, authorized account.

Looking for the Python library or CLI? Head over to bayernwerk-client.

Authentication

Both portals sit behind a Cloudflare-JS-challenge and a Salesforce Aura login, so logging in always means a real, Playwright-driven browser - there's no way around that. This server just decides when that browser opens, in one of two modes:

Set MAP_EMAIL/MAP_PASSWORD as environment variables on the MCP server itself (in your MCP client's server config, e.g. claude_desktop_config.json or .vscode/mcp.json - see Configuration below). Whenever a tool call finds no cached token, or a cached token has expired, the server logs in for you automatically - a Chromium window briefly opens on the machine the server runs on (headed by default, so you can see and intervene if e.g. an unexpected MFA/consent prompt shows up), fills in the credentials, and closes again once the token is captured. MAP and e-fix share one Bayernwerk-Netz account, so one pair of env vars covers both.

Set BAYERNWERK_LOGIN_HEADLESS=true to suppress the visible window - only worth it on a host nobody is watching, and more likely to get stuck on the Cloudflare challenge (see the bayernwerk-client README for why headed is the default).

Access tokens last about an hour and there's no reliable silent refresh, so expect a browser flash roughly every hour during a long session - that's normal, not a bug.

Manual login (no credentials on the server)

Without MAP_EMAIL/MAP_PASSWORD configured, tool calls never open a browser themselves. Install bayernwerk-client with its login extra and run the CLI login once per service, outside of any MCP client, in a normal terminal:

uv tool install "bayernwerk-client[login]"
playwright install chromium
bayernwerk map login
bayernwerk efix login

This caches a token under ~/.cache/bayernwerk-client/{map,efix}-tokens.json, which this server's tools then read directly. If a tool call reports an authentication error (missing or expired token), re-run the matching login command and retry.

Related MCP server: vnbdigital-mcp

Tools

MAP - Mein.Auftragsportal

Tool

Description

map_list_orders

List all orders, optionally filtered to finished=True/False

map_get_order

Fetch a single order by ID

map_get_order_details

Additional detail data for an order

map_get_order_documents

List an order's documents (for download, see map_sync_order_documents)

map_get_order_notes

List an order's notes

map_get_order_instances

Raw "Anschluss" tree (meter → consumers/generators → inverters → storages/PV)

map_list_order_instance_items

Same tree, flattened into one deduplicated list

map_sync_order_documents

Download an order's missing documents into a local folder

map_get_installer

Own installer master data known to MAP

map_list_inverters

Inverter master data, filtered by primary_energy_forms

map_list_storages

Storage master data

map_list_product_orders

Product orders (separate from regular orders)

e-fix - Installateur-Portal

Tool

Description

efix_get_installer

Own installer master data known to e-fix (more extensive than map_get_installer)

efix_list_installer_antraege

Own "Anträge" (applications) with status/type/date

efix_get_user_status

Account status: role, notification counters, subscription

efix_list_my_registered_events

Registered events/training sessions

Installation

Prerequisites

  • Python ≥ 3.11

  • uv

  • A cached login token from bayernwerk-client (see Authentication)

Install dependencies

uv sync

bayernwerk-client isn't published on PyPI yet, so pyproject.toml currently pins it to a local editable checkout via [tool.uv.sources]. Once it's on PyPI, that override (and this note) go away.

Start the server (development)

uv run bayernwerk-mcp
# or
uv run python -m bayernwerk_mcp.server

Test with MCP Inspector

uv run mcp dev src/bayernwerk_mcp/server.py

Configuration in VS Code / Claude Desktop

Add the server to your MCP configuration (.vscode/mcp.json or claude_desktop_config.json). The env block is optional - add it to enable automatic login; leave it out for manual login via the CLI instead.

Local development (workspace checkout):

{
  "servers": {
    "bayernwerk": {
      "command": "bash",
      "args": [
        "-l",
        "-c",
        "uv --directory ${workspaceFolder} run bayernwerk-mcp"
      ],
      "env": {
        "MAP_EMAIL": "your@email.de",
        "MAP_PASSWORD": "your-password"
      }
    }
  }
}

Install from GitHub (latest unreleased):

{
  "servers": {
    "bayernwerk": {
      "command": "bash",
      "args": [
        "-l",
        "-c",
        "uvx --from git+https://github.com/the78mole/bayernwerk-mcp.git bayernwerk-mcp"
      ],
      "env": {
        "MAP_EMAIL": "your@email.de",
        "MAP_PASSWORD": "your-password"
      }
    }
  }
}

Once both bayernwerk-client and bayernwerk-mcp are published on PyPI, uvx bayernwerk-mcp will work directly without the git+ install.

Note: bash -l loads the login shell profile, which ensures uvx/uv are found in ~/.local/bin without any additional env configuration.

Credentials in plain text: MAP_EMAIL/MAP_PASSWORD end up unencrypted in your MCP client's config file (and in this process's environment) when set this way - treat that file like any other secret, and skip this if you'd rather keep credentials out of it entirely (use manual login instead).

Environment Variables

Variable

Default

Description

MAP_EMAIL

-

Bayernwerk-Netz account email. If set together with MAP_PASSWORD, enables automatic login for both MAP and e-fix.

MAP_PASSWORD

-

Bayernwerk-Netz account password.

BAYERNWERK_LOGIN_HEADLESS

false

Set to true to run the automatic login's browser headless instead of visibly.

Local Development

# Set up project environment
uv sync --extra dev

# Linting & formatting
uv run ruff format .
uv run ruff check --fix .

# Tests
uv run pytest

Project

Description

bayernwerk-client

Python client library (and CLI) this MCP server is built on

License

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    87+ specialized tools for German and European energy data. Direct AI access to Marktstammdatenregister (MaStR), ENTSO-E, Redispatch 2.0, and Grid Operations for utilities and datacenters.
    2
    GPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying German distribution grid operator data from vnbdigital.de and BDEW register, including lookup by ID, postcode, coordinates, and free-text search.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connects MCP clients such as OpenCode or Claude to Tauron eLicznik energy data, exposing tools to list metering points, retrieve consumption/generation/net energy metrics, and fetch cumulative meter readings.
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides MCP tools that let AI assistants query German road, parking, charging, rail, and fuel data, with attribution and licensing constraints included in results.
    21
    1,945 npm
    Apache 2.0